# 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 | [](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 | }
```