#
tokens: 7146/50000 11/11 files
lines: on (toggle) GitHub
raw markdown copy reset
# Directory Structure

```
├── .gitignore
├── Dockerfile
├── LICENSE
├── package-lock.json
├── package.json
├── README.md
├── smithery.yaml
├── src
│   ├── github-service.ts
│   ├── mcp.d.ts
│   ├── server.ts
│   ├── test-client.ts
│   └── types.ts
└── tsconfig.json
```

# Files

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
 1 | # Dependencies
 2 | node_modules/
 3 | 
 4 | # Build output
 5 | dist/
 6 | 
 7 | # Environment variables
 8 | .env
 9 | 
10 | # Logs
11 | *.log
12 | npm-debug.log*
13 | 
14 | # Editor directories and files
15 | .idea/
16 | .vscode/
17 | *.swp
18 | *.swo
19 | 
20 | # OS files
21 | .DS_Store
22 | Thumbs.db 
```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
  1 | # GitHub PR Comments MCP Server
  2 | 
  3 | [![smithery badge](https://smithery.ai/badge/github-pr-mcp)](https://smithery.ai/server/github-pr-mcp)
  4 | 
  5 | This is a Model Context Protocol (MCP) server that fetches GitHub Pull Request comments using a GitHub personal access token.
  6 | 
  7 | <a href="https://glama.ai/mcp/servers/@shaileshahuja/github-pr-mcp">
  8 |   <img width="380" height="200" src="https://glama.ai/mcp/servers/@shaileshahuja/github-pr-mcp/badge" alt="GitHub PR Comments Server MCP server" />
  9 | </a>
 10 | 
 11 | ## Features
 12 | 
 13 | - Fetches PR comments with file paths, line ranges, and replies
 14 | - Uses GitHub API via Octokit
 15 | - Implements MCP server with StdioServerTransport
 16 | - Returns comments in a structured JSON format
 17 | 
 18 | ## Installation
 19 | 
 20 | ### Installing via Smithery
 21 | 
 22 | To install github-pr-mcp for Claude Desktop automatically via [Smithery](https://smithery.ai/server/github-pr-mcp):
 23 | 
 24 | ```bash
 25 | npx -y @smithery/cli install github-pr-mcp --client claude
 26 | ```
 27 | 
 28 | ### Installing Manually
 29 | 1. Clone the repository
 30 | 2. Install dependencies:
 31 | 
 32 |    ```
 33 |    npm install
 34 |    ```
 35 | 
 36 | 3. Create a `.env` file with your GitHub token:
 37 | 
 38 |    ```
 39 |    GITHUB_TOKEN=your_github_token_here
 40 |    ```
 41 | 
 42 | ## Usage
 43 | 
 44 | 1. Build the project:
 45 | 
 46 |    ```
 47 |    npm run build
 48 |    ```
 49 | 
 50 | 2. Run the server:
 51 | 
 52 |    ```
 53 |    npm start
 54 |    ```
 55 | 
 56 |    Or directly with a GitHub token:
 57 | 
 58 |    ```
 59 |    node dist/server.js your_github_token_here
 60 |    ```
 61 | 
 62 | 3. The server exposes a tool called `get_pr_comments` that accepts the following parameters:
 63 |    - `owner`: Repository owner (username or organization)
 64 |    - `repo`: Repository name
 65 |    - `pull_number`: Pull request number
 66 | 
 67 | ## Integration with Cursor
 68 | 
 69 | To integrate with Cursor, use the following command in Cursor's MCP server configuration:
 70 | 
 71 | ```
 72 | node /path/to/dist/server.js your_github_token_here
 73 | ```
 74 | 
 75 | Replace `/path/to` with the actual path to your project, and `your_github_token_here` with your GitHub personal access token.
 76 | 
 77 | ## Testing
 78 | 
 79 | A test client is included to verify the server functionality:
 80 | 
 81 | 1. Build the project:
 82 | 
 83 |    ```
 84 |    npm run build
 85 |    ```
 86 | 
 87 | 2. Run the test client:
 88 | 
 89 |    ```
 90 |    npm test
 91 |    ```
 92 | 
 93 | The test client will start the server, connect to it, and call the `get_pr_comments` tool with sample parameters.
 94 | 
 95 | ## Response Format
 96 | 
 97 | The server returns comments in the following format:
 98 | 
 99 | ```json
100 | {
101 |   "comments": [
102 |     {
103 |       "id": 123456789,
104 |       "path": "src/example.js",
105 |       "body": "This is a comment on a specific line",
106 |       "line": 42,
107 |       "start_line": 40,
108 |       "user": {
109 |         "login": "username"
110 |       },
111 |       "created_at": "2023-01-01T00:00:00Z",
112 |       "replies": [
113 |         {
114 |           "id": 987654321,
115 |           "body": "This is a reply to the comment",
116 |           "user": {
117 |             "login": "another-username"
118 |           },
119 |           "created_at": "2023-01-02T00:00:00Z"
120 |         }
121 |       ]
122 |     }
123 |   ]
124 | }
125 | ```
126 | 
127 | ## Development
128 | 
129 | To run the server in development mode:
130 | 
131 | ```
132 | npm run dev
133 | ```
134 | 
135 | ## License
136 | 
137 | ISC
```

--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------

```dockerfile
 1 | # Generated by https://smithery.ai. See: https://smithery.ai/docs/config#dockerfile
 2 | FROM node:lts-alpine
 3 | 
 4 | WORKDIR /app
 5 | 
 6 | # Copy package files and install dependencies
 7 | COPY package*.json ./
 8 | RUN npm install --ignore-scripts
 9 | 
10 | # Copy the rest of the project and build
11 | COPY . .
12 | RUN npm run build
13 | 
14 | # Expose any ports if needed (not specified here)
15 | 
16 | # Start the server with the GitHub token passed as argument
17 | CMD ["node", "dist/server.js"]
18 | 
```

--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------

```typescript
 1 | export interface CommentReply {
 2 |     id: number;
 3 |     body: string;
 4 |     user: {
 5 |         login: string;
 6 |     };
 7 |     created_at: string;
 8 | }
 9 | 
10 | export interface Comment {
11 |     id: number;
12 |     path: string;
13 |     body: string;
14 |     line?: number;
15 |     start_line?: number;
16 |     user: {
17 |         login: string;
18 |     };
19 |     created_at: string;
20 |     replies: CommentReply[];
21 | }
22 | 
23 | export interface GetPRCommentsParams {
24 |     owner: string;
25 |     repo: string;
26 |     pull_number: number;
27 | }
28 | 
29 | export interface GetPRCommentsResponse {
30 |     comments: Comment[];
31 | } 
```

--------------------------------------------------------------------------------
/src/mcp.d.ts:
--------------------------------------------------------------------------------

```typescript
 1 | declare module '@modelcontextprotocol/sdk/server/mcp.js' {
 2 |     import { z } from 'zod';
 3 | 
 4 |     export class McpServer {
 5 |         constructor(options: { name: string; version: string; description?: string });
 6 | 
 7 |         tool(
 8 |             name: string,
 9 |             schema: Record<string, z.ZodType<any, any, any>>,
10 |             handler: (args: any) => Promise<any>,
11 |             options?: { description?: string }
12 |         ): void;
13 | 
14 |         connect(transport: any): Promise<void>;
15 |     }
16 | 
17 |     export class ResourceTemplate {
18 |         constructor(template: string, options: { list: undefined });
19 |     }
20 | } 
```

--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------

```json
 1 | {
 2 |   "name": "github-pr-mcp",
 3 |   "version": "1.0.0",
 4 |   "main": "dist/index.js",
 5 |   "type": "module",
 6 |   "scripts": {
 7 |     "build": "tsc",
 8 |     "start": "node dist/server.js",
 9 |     "dev": "ts-node --esm src/server.ts",
10 |     "test": "node dist/test-client.js"
11 |   },
12 |   "keywords": [],
13 |   "author": "",
14 |   "license": "ISC",
15 |   "description": "",
16 |   "dependencies": {
17 |     "@modelcontextprotocol/sdk": "^1.6.1",
18 |     "@octokit/rest": "^21.1.1",
19 |     "@types/express": "^5.0.0",
20 |     "@types/node": "^22.13.10",
21 |     "dotenv": "^16.4.7",
22 |     "express": "^4.21.2",
23 |     "ts-node": "^10.9.2",
24 |     "typescript": "^5.8.2",
25 |     "zod": "^3.22.4"
26 |   }
27 | }
```

--------------------------------------------------------------------------------
/smithery.yaml:
--------------------------------------------------------------------------------

```yaml
 1 | # Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml
 2 | 
 3 | startCommand:
 4 |   type: stdio
 5 |   configSchema:
 6 |     # JSON Schema defining the configuration options for the MCP.
 7 |     type: object
 8 |     required:
 9 |       - githubToken
10 |     properties:
11 |       githubToken:
12 |         type: string
13 |         description: Your GitHub personal access token
14 |   commandFunction:
15 |     # A JS function that produces the CLI command based on the given config to start the MCP on stdio.
16 |     |-
17 |     (config) => ({
18 |       command: 'node',
19 |       args: ['dist/server.js', config.githubToken],
20 |       env: {}
21 |     })
22 |   exampleConfig:
23 |     githubToken: your_github_token_here
24 | 
```

--------------------------------------------------------------------------------
/src/test-client.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import { Client } from '@modelcontextprotocol/sdk/client/index.js';
 2 | import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
 3 | import path from 'path';
 4 | import { fileURLToPath } from 'url';
 5 | import dotenv from 'dotenv';
 6 | 
 7 | // Load environment variables for the test
 8 | dotenv.config();
 9 | 
10 | const __dirname = path.dirname(fileURLToPath(import.meta.url));
11 | 
12 | // Get GitHub token from environment
13 | const githubToken = process.env.GITHUB_TOKEN;
14 | if (!githubToken) {
15 |     console.error('GITHUB_TOKEN environment variable is required for testing');
16 |     process.exit(1);
17 | }
18 | 
19 | async function main() {
20 |     // Create a transport that connects to the server and passes the token
21 |     const transport = new StdioClientTransport({
22 |         command: 'node',
23 |         args: [path.join(__dirname, 'server.js'), githubToken as string]
24 |     });
25 | 
26 |     // Create a client
27 |     const client = new Client(
28 |         {
29 |             name: 'test-client',
30 |             version: '1.0.0'
31 |         },
32 |         {
33 |             capabilities: {
34 |                 tools: {}
35 |             }
36 |         }
37 |     );
38 | 
39 |     try {
40 |         // Connect to the server
41 |         await client.connect(transport);
42 |         console.log('Connected to server');
43 | 
44 |         // Call the get_pr_comments tool
45 |         const result = await client.callTool({
46 |             name: 'get_pr_comments',
47 |             arguments: {
48 |                 owner: 'octocat',
49 |                 repo: 'Hello-World',
50 |                 pull_number: 1
51 |             }
52 |         });
53 | 
54 |         console.log('Tool result:', JSON.stringify(result, null, 2));
55 |     } catch (error) {
56 |         console.error('Error:', error);
57 |     }
58 | }
59 | 
60 | main().catch(console.error); 
```

--------------------------------------------------------------------------------
/src/server.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
 2 | import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
 3 | import { z } from 'zod';
 4 | import dotenv from 'dotenv';
 5 | import { GitHubService } from './github-service.js';
 6 | import { GetPRCommentsParams } from './types.js';
 7 | 
 8 | // Parse command-line arguments
 9 | let githubToken: string | undefined = process.argv[2]; // Get token from command-line arguments
10 | 
11 | // If no token provided via command line, try loading from .env file
12 | if (!githubToken) {
13 |     // Load environment variables
14 |     dotenv.config();
15 |     githubToken = process.env.GITHUB_TOKEN;
16 | }
17 | 
18 | // Check if we have a token from either source
19 | if (!githubToken) {
20 |     console.error('GitHub token is required. Provide it as a command-line argument or set GITHUB_TOKEN environment variable.');
21 |     process.exit(1);
22 | }
23 | 
24 | // Create GitHub service
25 | const githubService = new GitHubService(githubToken);
26 | 
27 | // Create MCP server
28 | const server = new McpServer({
29 |     name: 'github-pr-comments',
30 |     version: '1.0.0',
31 |     description: 'MCP server that fetches GitHub Pull Request comments'
32 | });
33 | 
34 | // Register tool to fetch PR comments
35 | // @ts-ignore - Ignoring type error for now as the MCP SDK types seem to be incompatible
36 | server.tool(
37 |     'get_pr_comments',
38 |     {
39 |         owner: z.string().min(1).describe('Repository owner (username or organization)'),
40 |         repo: z.string().min(1).describe('Repository name'),
41 |         pull_number: z.number().int().positive().describe('Pull request number')
42 |     },
43 |     async (args: { owner: string; repo: string; pull_number: number }) => {
44 |         try {
45 |             const params: GetPRCommentsParams = {
46 |                 owner: args.owner,
47 |                 repo: args.repo,
48 |                 pull_number: args.pull_number
49 |             };
50 | 
51 |             const comments = await githubService.getPRComments(params);
52 | 
53 |             return {
54 |                 content: [
55 |                     {
56 |                         type: 'text' as const,
57 |                         text: JSON.stringify({ comments }, null, 2)
58 |                     }
59 |                 ]
60 |             };
61 |         } catch (error) {
62 |             console.error('Error in get_pr_comments tool:', error);
63 |             throw error;
64 |         }
65 |     },
66 |     {
67 |         description: 'Fetches comments from a GitHub pull request with their file paths, line ranges, and replies'
68 |     }
69 | );
70 | 
71 | // Start the server with StdioServerTransport
72 | async function startServer() {
73 |     try {
74 |         const transport = new StdioServerTransport();
75 |         await server.connect(transport);
76 |         console.error('MCP server started with StdioServerTransport');
77 |     } catch (error) {
78 |         console.error('Failed to start MCP server:', error);
79 |         process.exit(1);
80 |     }
81 | }
82 | 
83 | startServer(); 
```

--------------------------------------------------------------------------------
/src/github-service.ts:
--------------------------------------------------------------------------------

```typescript
 1 | import { Octokit } from '@octokit/rest';
 2 | import { GetPRCommentsParams, Comment, CommentReply } from './types.js';
 3 | 
 4 | export class GitHubService {
 5 |     private octokit: Octokit;
 6 | 
 7 |     constructor(token: string) {
 8 |         this.octokit = new Octokit({
 9 |             auth: token
10 |         });
11 |     }
12 | 
13 |     async getPRComments({ owner, repo, pull_number }: GetPRCommentsParams): Promise<Comment[]> {
14 |         try {
15 |             // Fetch review comments on the pull request (line comments)
16 |             const { data: reviewComments } = await this.octokit.pulls.listReviewComments({
17 |                 owner,
18 |                 repo,
19 |                 pull_number,
20 |                 per_page: 100
21 |             });
22 | 
23 |             // Group comments by their path and in_reply_to_id
24 |             const groupedComments = new Map<number, Comment>();
25 |             const replyMap = new Map<number, CommentReply[]>();
26 | 
27 |             // Process all comments and separate top-level comments from replies
28 |             for (const comment of reviewComments) {
29 |                 if (comment.in_reply_to_id) {
30 |                     // This is a reply to another comment
31 |                     const reply: CommentReply = {
32 |                         id: comment.id,
33 |                         body: comment.body,
34 |                         user: {
35 |                             login: comment.user?.login || 'unknown'
36 |                         },
37 |                         created_at: comment.created_at
38 |                     };
39 | 
40 |                     if (!replyMap.has(comment.in_reply_to_id)) {
41 |                         replyMap.set(comment.in_reply_to_id, []);
42 |                     }
43 |                     replyMap.get(comment.in_reply_to_id)?.push(reply);
44 |                 } else {
45 |                     // This is a top-level comment
46 |                     const newComment: Comment = {
47 |                         id: comment.id,
48 |                         path: comment.path,
49 |                         body: comment.body,
50 |                         line: comment.line || undefined,
51 |                         start_line: comment.start_line || undefined,
52 |                         user: {
53 |                             login: comment.user?.login || 'unknown'
54 |                         },
55 |                         created_at: comment.created_at,
56 |                         replies: []
57 |                     };
58 |                     groupedComments.set(comment.id, newComment);
59 |                 }
60 |             }
61 | 
62 |             // Attach replies to their parent comments
63 |             for (const [commentId, replies] of replyMap.entries()) {
64 |                 const parentComment = groupedComments.get(commentId);
65 |                 if (parentComment) {
66 |                     parentComment.replies = replies;
67 |                 }
68 |             }
69 | 
70 |             return Array.from(groupedComments.values());
71 |         } catch (error) {
72 |             console.error('Error fetching PR comments:', error);
73 |             throw error;
74 |         }
75 |     }
76 | } 
```

--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------

```json
  1 | {
  2 |   "compilerOptions": {
  3 |     /* Visit https://aka.ms/tsconfig to read more about this file */
  4 |     /* Projects */
  5 |     // "incremental": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
  6 |     /* Language and Environment */
  7 |     "target": "ES2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
  8 |     // "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */
  9 |     // "jsx": "preserve",                                /* Specify what JSX code is generated. */
 10 |     // "libReplacement": true,                           /* Enable lib replacement. */
 11 |     // "experimentalDecorators": true,                   /* Enable experimental support for legacy experimental decorators. */
 12 |     // "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
 13 |     // "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
 14 |     // "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
 15 |     // "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
 16 |     // "reactNamespace": "",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
 17 |     // "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */
 18 |     // "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */
 19 |     // "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */
 20 |     /* Modules */
 21 |     "module": "NodeNext", /* Specify what module code is generated. */
 22 |     "moduleResolution": "NodeNext",
 23 |     // "rootDir": "./",                                  /* Specify the root folder within your source files. */
 24 |     // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
 25 |     // "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */
 26 |     // "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */
 27 |     // "typeRoots": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */
 28 |     // "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */
 29 |     // "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */
 30 |     // "moduleSuffixes": [],                             /* List of file name suffixes to search when resolving a module. */
 31 |     // "allowImportingTsExtensions": true,               /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
 32 |     // "rewriteRelativeImportExtensions": true,          /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */
 33 |     // "resolvePackageJsonExports": true,                /* Use the package.json 'exports' field when resolving package imports. */
 34 |     // "resolvePackageJsonImports": true,                /* Use the package.json 'imports' field when resolving imports. */
 35 |     // "customConditions": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
 36 |     // "noUncheckedSideEffectImports": true,             /* Check side effect imports. */
 37 |     "resolveJsonModule": true, /* Enable importing .json files. */
 38 |     // "allowArbitraryExtensions": true,                 /* Enable importing files with any extension, provided a declaration file is present. */
 39 |     // "noResolve": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */
 40 |     /* JavaScript Support */
 41 |     // "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
 42 |     // "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */
 43 |     // "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
 44 |     /* Emit */
 45 |     // "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
 46 |     // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
 47 |     // "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */
 48 |     // "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */
 49 |     // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
 50 |     // "noEmit": true,                                   /* Disable emitting files from a compilation. */
 51 |     // "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. */
 52 |     "outDir": "./dist", /* Specify an output folder for all emitted files. */
 53 |     // "removeComments": true,                           /* Disable emitting comments. */
 54 |     // "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
 55 |     // "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
 56 |     // "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */
 57 |     // "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */
 58 |     // "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */
 59 |     // "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
 60 |     // "newLine": "crlf",                                /* Set the newline character for emitting files. */
 61 |     // "stripInternal": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
 62 |     // "noEmitHelpers": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */
 63 |     // "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */
 64 |     // "preserveConstEnums": true,                       /* Disable erasing 'const enum' declarations in generated code. */
 65 |     // "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */
 66 |     /* Interop Constraints */
 67 |     // "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
 68 |     // "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. */
 69 |     // "isolatedDeclarations": true,                     /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */
 70 |     // "erasableSyntaxOnly": true,                       /* Do not allow runtime constructs that are not part of ECMAScript. */
 71 |     // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
 72 |     "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
 73 |     // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
 74 |     "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
 75 |     /* Type Checking */
 76 |     "strict": true, /* Enable all strict type-checking options. */
 77 |     // "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */
 78 |     // "strictNullChecks": true,                         /* When type checking, take into account 'null' and 'undefined'. */
 79 |     // "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
 80 |     // "strictBindCallApply": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
 81 |     // "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */
 82 |     // "strictBuiltinIteratorReturn": true,              /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */
 83 |     // "noImplicitThis": true,                           /* Enable error reporting when 'this' is given the type 'any'. */
 84 |     // "useUnknownInCatchVariables": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */
 85 |     // "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */
 86 |     // "noUnusedLocals": true,                           /* Enable error reporting when local variables aren't read. */
 87 |     // "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read. */
 88 |     // "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */
 89 |     // "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */
 90 |     // "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */
 91 |     // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to a type when accessed using an index. */
 92 |     // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */
 93 |     // "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */
 94 |     // "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */
 95 |     // "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */
 96 |     /* Completeness */
 97 |     // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */
 98 |     "skipLibCheck": true /* Skip type checking all .d.ts files. */
 99 |   },
100 |   "include": [
101 |     "src/**/*"
102 |   ],
103 |   "exclude": [
104 |     "node_modules",
105 |     "dist"
106 |   ],
107 |   "rootDir": "./src"
108 | }
```