# Directory Structure
```
├── .github
│ └── workflows
│ └── release.yaml
├── .gitignore
├── index.ts
├── jest.config.js
├── LICENSE.md
├── package-lock.json
├── package.json
├── README.md
├── src
│ ├── models
│ │ ├── config.model.ts
│ │ └── prompt.model.ts
│ ├── prompts
│ │ ├── blog-post.ts
│ │ └── confluence-page.ts
│ ├── services
│ │ └── confluence.service.ts
│ ├── tests
│ │ ├── services
│ │ │ └── confluence.service.spec.ts
│ │ └── utils
│ │ └── utils.spec.ts
│ └── utils
│ └── index.ts
├── tsconfig.json
└── tsconfig.test.json
```
# Files
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
```
1 | node_modules/
2 | dist/
3 | .env
4 |
```
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
```markdown
1 | # Mcp-Confluence
2 | > [!Important]
3 | > This repository is still in early development stages, more prompts, resources and tools will be added in the future.
4 |
5 | This repository contains the source code for a confluence context server.
6 | For now, the server only contains prompts aimed to be used as slash commands by Zed.
7 |
8 | <a href="https://glama.ai/mcp/servers/qkapsouyfx"><img width="380" height="200" src="https://glama.ai/mcp/servers/qkapsouyfx/badge" alt="mcp-confluence MCP server" /></a>
9 |
10 | # Installation
11 | ```bash
12 | npm install -g mcp-confluence
13 | ```
14 | # Usage
15 | The following environment variables must be set:
16 | - `API_KEY`: The API key to authenticate your confluence account.
17 | - `DOMAIN_NAME`: The domain name of your confluence account. `example.atlassian.net`
18 | - `EMAIL`: The email of your confluence account.
19 |
20 | ```json
21 | "confluence-context-server": {
22 | "command": "node",
23 | "args": [
24 | "node_modules/mcp-confluence/dist/index.js"
25 | ],
26 | "env": {
27 | "API_TOKEN": "",
28 | "DOMAIN_NAME": "",
29 | "EMAIL": ""
30 | }
31 | }
32 | ```
33 | ## Zed
34 |
35 | Install the [confluence-context-server extension](https://github.com/mouhamadalmounayar/confluence-context-server).
36 | Then, add these settings to your zed settings.
37 | ```json
38 |
39 | "context_servers": {
40 | "confluence-context-server": {
41 | "settings": {
42 | "api_token": ,
43 | "domain_name": ,
44 | "email":
45 | }
46 | }
47 | }
48 | ```
49 | 
50 |
51 | ## MCP Inspector
52 | You can also use the MCP Inspector to interact with the server.
53 | ```bash
54 | npm install @modelcontextprotocol/sdk
55 |
56 | npx -y @modelcontextprotocol/inspector npx mcp-confluence
57 | ```
58 |
59 | # Prompts
60 | ## Confluence Page
61 | - name: `confluence-page`
62 | - description: Get a confluence page by its id
63 | - arguments:
64 | - `pageId`: The id of the confluence page
65 |
66 | ## Blog Post
67 | - name: `blog-post`
68 | - description: Get a blog post by its id
69 | - arguments:
70 | - `blogId`: The id of the blog post
71 |
```
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
```markdown
1 | MIT License
2 |
3 | Copyright (c) 2025 Al Mounayar Mouhamad
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
```
--------------------------------------------------------------------------------
/src/models/ config.model.ts:
--------------------------------------------------------------------------------
```typescript
1 | export interface Config {
2 | "domain-name": string | undefined;
3 | "api-token": string | undefined;
4 | email: string | undefined;
5 | }
6 |
```
--------------------------------------------------------------------------------
/src/utils/index.ts:
--------------------------------------------------------------------------------
```typescript
1 | export const getTextContent = (doc: any) => {
2 | if (doc.type === "text") {
3 | return doc.text;
4 | } else if (doc.content) {
5 | return doc.content.map(getTextContent).join(" ");
6 | }
7 | return "";
8 | };
9 |
```
--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------
```javascript
1 | /** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */
2 | module.exports = {
3 | preset: "ts-jest",
4 | testEnvironment: "node",
5 | transform: {
6 | "^.+\\.ts?$": [
7 | "ts-jest",
8 | {
9 | tsconfig: "tsconfig.test.json",
10 | },
11 | ],
12 | },
13 | testPathIgnorePatterns: ["/node_modules/", "/dist/"],
14 | };
15 |
```
--------------------------------------------------------------------------------
/src/models/prompt.model.ts:
--------------------------------------------------------------------------------
```typescript
1 | export interface Argument {
2 | name: string;
3 | description: string;
4 | required: boolean;
5 | }
6 |
7 | export interface PromptObject {
8 | name: string;
9 | description: string;
10 | arguments: Argument[];
11 | }
12 |
13 | export interface Response {
14 | description: string;
15 | messages: {
16 | role: string;
17 | content: {
18 | type: string;
19 | text: string;
20 | };
21 | }[];
22 | }
23 |
```
--------------------------------------------------------------------------------
/.github/workflows/release.yaml:
--------------------------------------------------------------------------------
```yaml
1 | name: Release
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 |
8 | permissions:
9 | contents: write
10 | issues: write
11 | pull-requests: write
12 |
13 | jobs:
14 | release:
15 | runs-on: ubuntu-latest
16 | steps:
17 | - uses: actions/checkout@v4
18 | - uses: actions/setup-node@v4
19 | with:
20 | node-version: "lts/*"
21 | - run: npm ci
22 | - run: npm run build
23 | - run: npm audit signatures
24 | - name: release
25 | env:
26 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
27 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
28 | run: npx semantic-release
29 |
```
--------------------------------------------------------------------------------
/src/tests/utils/utils.spec.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { getTextContent } from "../../utils";
2 | describe("getTextContent", () => {
3 | it("should return the inline text of a document", () => {
4 | const doc = {
5 | type: "mock_type",
6 | content: [
7 | {
8 | type: "text",
9 | text: "Hello",
10 | },
11 | {
12 | type: "mock_type",
13 | content: [
14 | {
15 | type: "text",
16 | text: "World",
17 | },
18 | ],
19 | },
20 | ],
21 | };
22 | const result = getTextContent(doc);
23 | expect(result).toEqual("Hello World");
24 | });
25 | });
26 |
```
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "name": "mcp-confluence",
3 | "version": "0.0.0-development",
4 | "main": "index.js",
5 | "scripts": {
6 | "build": "tsc",
7 | "start": "npx tsc && node ./dist/index.js",
8 | "test": "jest"
9 | },
10 | "keywords": [
11 | "confluence",
12 | "mcp",
13 | "mcp-confluence",
14 | "model context protocol"
15 | ],
16 | "author": "Al Mounayar Mouhamad",
17 | "license": "ISC",
18 | "type": "commonjs",
19 | "description": "A model context server for confluence",
20 | "devDependencies": {
21 | "@jest/globals": "^29.7.0",
22 | "@types/jest": "^29.5.14",
23 | "jest": "^29.7.0",
24 | "semantic-release": "^24.2.1",
25 | "ts-jest": "^29.2.5",
26 | "typescript": "^5.7.3"
27 | },
28 | "dependencies": {
29 | "@modelcontextprotocol/sdk": "^1.1.1",
30 | "@types/node": "^22.10.5",
31 | "dotenv": "^16.4.7"
32 | },
33 | "files": [
34 | "dist",
35 | "README.md"
36 | ]
37 | }
38 |
```
--------------------------------------------------------------------------------
/tsconfig.test.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "compilerOptions": {
3 | "rootDir": "./src",
4 | "declarationMap": false,
5 | "inlineSourceMap": true,
6 | "inlineSources": true,
7 | "alwaysStrict": true,
8 | "declaration": true,
9 | "experimentalDecorators": true,
10 | "incremental": true,
11 | "lib": ["ES2021"],
12 | "module": "CommonJS",
13 | "noEmitOnError": true,
14 | "noFallthroughCasesInSwitch": true,
15 | "noImplicitAny": true,
16 | "noImplicitReturns": true,
17 | "noImplicitThis": true,
18 | "noUnusedLocals": true,
19 | "noUnusedParameters": true,
20 | "resolveJsonModule": true,
21 | "skipLibCheck": true,
22 | "strict": true,
23 | "strictNullChecks": true,
24 | "strictPropertyInitialization": true,
25 | "stripInternal": false,
26 | "target": "ES2020",
27 | "composite": false,
28 | "tsBuildInfoFile": "tsconfig.tsbuildinfo"
29 | },
30 | "include": ["src/**/*.ts"],
31 | "exclude": ["node_modules", ".types-compat"]
32 | }
33 |
```
--------------------------------------------------------------------------------
/src/prompts/blog-post.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { PromptObject } from "../models/prompt.model";
2 | import { ConfluenceService } from "../services/confluence.service";
3 | import { getTextContent } from "../utils";
4 |
5 | export class BlogPostPrompt {
6 | promptObject: PromptObject = {
7 | name: "blog-post",
8 | description: "Retrieve blog post content",
9 | arguments: [
10 | {
11 | name: "blogId",
12 | description: "The id of the blog post to fetch",
13 | required: true,
14 | },
15 | ],
16 | };
17 | _confluenceService: ConfluenceService = new ConfluenceService();
18 | async handler(blogId: any) {
19 | const document = await this._confluenceService.requestBlogPost(blogId);
20 | return {
21 | description: `Blog post id ${blogId}`,
22 | messages: [
23 | {
24 | role: "user",
25 | content: {
26 | type: "text",
27 | text: getTextContent(
28 | JSON.parse(document.body.atlas_doc_format.value),
29 | ),
30 | },
31 | },
32 | ],
33 | };
34 | }
35 | }
36 |
```
--------------------------------------------------------------------------------
/src/prompts/confluence-page.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { Argument, PromptObject, Response } from "../models/prompt.model";
2 | import { ConfluenceService } from "../services/confluence.service";
3 | import { getTextContent } from "../utils";
4 |
5 | export class ConfluencePagePrompt {
6 | promptObject: PromptObject = {
7 | name: "confluence-page",
8 | description: "Retrieve confluence page content",
9 | arguments: [
10 | {
11 | name: "pageId",
12 | description: "The id of the page to fetch",
13 | required: true,
14 | },
15 | ],
16 | };
17 | _confluenceService: ConfluenceService = new ConfluenceService();
18 | async handler(pageId: any) {
19 | const document = await this._confluenceService.requestPage(pageId);
20 | return {
21 | description: `Confluence page id ${pageId}`,
22 | messages: [
23 | {
24 | role: "user",
25 | content: {
26 | type: "text",
27 | text: getTextContent(
28 | JSON.parse(document.body.atlas_doc_format.value),
29 | ),
30 | },
31 | },
32 | ],
33 | };
34 | }
35 | }
36 |
```
--------------------------------------------------------------------------------
/src/services/confluence.service.ts:
--------------------------------------------------------------------------------
```typescript
1 | import * as dotenv from "dotenv";
2 | import { Config } from "../models/ config.model";
3 | dotenv.config();
4 |
5 | export class ConfluenceService {
6 | config?: Config;
7 | constructor() {
8 | this.config = {
9 | "domain-name": process.env.DOMAIN_NAME,
10 | "api-token": process.env.API_TOKEN,
11 | email: process.env.EMAIL,
12 | };
13 | }
14 |
15 | pageIdUrl(id: number): string {
16 | return `https://${this.config?.["domain-name"]}/wiki/api/v2/pages/${id}/?body-format=atlas_doc_format`;
17 | }
18 |
19 | blogIdUrl(id: number): string {
20 | return `https://${this.config?.["domain-name"]}/wiki/api/v2/blogposts/${id}/?body-format=atlas_doc_format`;
21 | }
22 |
23 | requestPage = async (pageId: number) => {
24 | const response = await fetch(this.pageIdUrl(pageId), {
25 | method: "GET",
26 | headers: {
27 | Authorization: `Basic ${Buffer.from(
28 | `${this.config?.email}:${this.config?.["api-token"]}`,
29 | ).toString("base64")}`,
30 | Accept: "application/json",
31 | },
32 | });
33 | if (!response.ok) {
34 | throw new Error(`Failed http request: ${response.status}`);
35 | }
36 | const jsonDocument = await response.json();
37 | return jsonDocument;
38 | };
39 | requestBlogPost = async (blogId: number) => {
40 | const response = await fetch(this.blogIdUrl(blogId), {
41 | method: "GET",
42 | headers: {
43 | Authorization: `Basic ${Buffer.from(
44 | `${this.config?.email}:${this.config?.["api-token"]}`,
45 | ).toString("base64")}`,
46 | Accept: "application/json",
47 | },
48 | });
49 | if (!response.ok) {
50 | throw new Error(`Failed http request: ${response.status}`);
51 | }
52 | const jsonDocument = await response.json();
53 | console.log("JSON DOCUMENT", jsonDocument);
54 | return jsonDocument;
55 | };
56 | }
57 |
```
--------------------------------------------------------------------------------
/index.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { getTextContent } from "./src/utils";
2 | import {
3 | GetPromptRequestSchema,
4 | ListPromptsRequestSchema,
5 | } from "@modelcontextprotocol/sdk/types.js";
6 | import { Server } from "@modelcontextprotocol/sdk/server/index.js";
7 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
8 | import { ConfluencePagePrompt } from "./src/prompts/confluence-page";
9 | import { BlogPostPrompt } from "./src/prompts/blog-post";
10 | const server = new Server(
11 | {
12 | name: "confluence mcp",
13 | version: "0.1.0",
14 | },
15 | {
16 | capabilities: {
17 | resources: {},
18 | tools: {},
19 | prompts: {},
20 | },
21 | },
22 | );
23 | const _confluencePagePrompt = new ConfluencePagePrompt();
24 | const _blogPostPrompt = new BlogPostPrompt();
25 | server.setRequestHandler(ListPromptsRequestSchema, () => {
26 | return {
27 | prompts: [_confluencePagePrompt.promptObject, _blogPostPrompt.promptObject],
28 | };
29 | });
30 |
31 | server.setRequestHandler(GetPromptRequestSchema, async (request) => {
32 | switch (request.params.name) {
33 | case _confluencePagePrompt.promptObject.name:
34 | if (request.params.arguments) {
35 | const { pageId } = request.params.arguments;
36 | const response = await _confluencePagePrompt.handler(pageId);
37 | return response;
38 | }
39 | case _blogPostPrompt.promptObject.name:
40 | if (request.params.arguments) {
41 | const { blogId } = request.params.arguments;
42 | const response = await _blogPostPrompt.handler(blogId);
43 | return response;
44 | }
45 | default:
46 | throw new Error(`Unknown prompt name: ${request.params.name}`);
47 | }
48 | });
49 |
50 | const run_server = async () => {
51 | const transport = new StdioServerTransport();
52 | await server.connect(transport);
53 | };
54 |
55 | run_server().catch((error) => {
56 | console.error(error);
57 | process.exit(1);
58 | });
59 |
```
--------------------------------------------------------------------------------
/src/tests/services/confluence.service.spec.ts:
--------------------------------------------------------------------------------
```typescript
1 | import { ConfluenceService } from "../../services/confluence.service";
2 |
3 | describe("ConfluenceService", () => {
4 | let confluenceService: ConfluenceService;
5 | let fetchMock: jest.Mock;
6 | beforeEach(() => {
7 | process.env.DOMAIN_NAME = "example.atlassian.net";
8 | process.env.API_TOKEN = "mock-api-token";
9 | process.env.EMAIL = "[email protected]";
10 | confluenceService = new ConfluenceService();
11 | fetchMock = jest.fn();
12 | global.fetch = fetchMock;
13 | });
14 | afterEach(() => {
15 | jest.clearAllMocks();
16 | });
17 | it("should make a successful request to fetch a page", async () => {
18 | fetchMock.mockResolvedValueOnce({
19 | ok: true,
20 | json: jest.fn().mockReturnValueOnce({}),
21 | });
22 | await confluenceService.requestPage(123);
23 | expect(fetchMock).toHaveBeenCalledWith(
24 | "https://example.atlassian.net/wiki/api/v2/pages/123/?body-format=atlas_doc_format",
25 | {
26 | method: "GET",
27 | headers: {
28 | Authorization: `Basic ${Buffer.from("[email protected]:mock-api-token").toString("base64")}`,
29 | Accept: "application/json",
30 | },
31 | },
32 | );
33 | });
34 | it("should throw an error when the request is not successful", async () => {
35 | fetchMock.mockResolvedValueOnce({ ok: false, status: 404 });
36 | await expect(confluenceService.requestPage(123)).rejects.toThrow(
37 | "Failed http request: 404",
38 | );
39 | });
40 | it("should make a successful request to fetch a blog post", async () => {
41 | fetchMock.mockResolvedValueOnce({
42 | ok: true,
43 | json: jest.fn().mockReturnValueOnce({}),
44 | });
45 | await confluenceService.requestBlogPost(123);
46 | expect(fetchMock).toHaveBeenCalledWith(
47 | "https://example.atlassian.net/wiki/api/v2/blogposts/123/?body-format=atlas_doc_format",
48 | {
49 | method: "GET",
50 | headers: {
51 | Accept: "application/json",
52 | Authorization: `Basic ${Buffer.from("[email protected]:mock-api-token").toString("base64")}`,
53 | },
54 | },
55 | );
56 | });
57 | it("should throw an error if the request fails", async () => {
58 | fetchMock.mockResolvedValueOnce({ ok: false, status: 404 });
59 | await expect(confluenceService.requestBlogPost(123)).rejects.toThrow(
60 | "Failed http request: 404",
61 | );
62 | });
63 | });
64 |
```
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "compilerOptions": {
3 | /* Visit https://aka.ms/tsconfig to read more about this file */
4 |
5 | /* Projects */
6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
12 |
13 | /* Language and Environment */
14 | "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
16 | // "jsx": "preserve", /* Specify what JSX code is generated. */
17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
26 |
27 | /* Modules */
28 | "module": "commonjs" /* Specify what module code is generated. */,
29 | // "rootDir": "./", /* Specify the root folder within your source files. */
30 | // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */
36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
39 | // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */
40 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
41 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
42 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
43 | // "noUncheckedSideEffectImports": true, /* Check side effect imports. */
44 | // "resolveJsonModule": true, /* Enable importing .json files. */
45 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
46 | // "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
47 |
48 | /* JavaScript Support */
49 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
50 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
51 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
52 |
53 | /* Emit */
54 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
55 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */
56 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
57 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
58 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
59 | // "noEmit": true, /* Disable emitting files from a compilation. */
60 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
61 | "outDir": "./dist" /* Specify an output folder for all emitted files. */,
62 | // "removeComments": true, /* Disable emitting comments. */
63 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
64 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
65 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
66 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
67 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
68 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
69 | // "newLine": "crlf", /* Set the newline character for emitting files. */
70 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
71 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
72 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
73 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
74 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
75 |
76 | /* Interop Constraints */
77 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
78 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
79 | // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
80 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
81 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
82 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
83 | "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
84 |
85 | /* Type Checking */
86 | "strict": true /* Enable all strict type-checking options. */,
87 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
88 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
89 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
90 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
91 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
92 | // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
93 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
94 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
95 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
96 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
97 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
98 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
99 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
100 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
101 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
102 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
103 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
104 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
105 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
106 |
107 | /* Completeness */
108 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
109 | "skipLibCheck": true /* Skip type checking all .d.ts files. */
110 | }
111 | }
112 |
```