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

```
├── .env.template
├── .gitignore
├── LICENSE
├── package-lock.json
├── package.json
├── README.md
├── src
│   └── index.ts
└── tsconfig.json
```

# Files

--------------------------------------------------------------------------------
/.env.template:
--------------------------------------------------------------------------------

```
1 | ATTIO_API_KEY=ATTIO_API_KEY
2 | 
```

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

```
  1 | # Logs
  2 | logs
  3 | *.log
  4 | npm-debug.log*
  5 | yarn-debug.log*
  6 | yarn-error.log*
  7 | lerna-debug.log*
  8 | .pnpm-debug.log*
  9 | 
 10 | # Diagnostic reports (https://nodejs.org/api/report.html)
 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
 12 | 
 13 | # Runtime data
 14 | pids
 15 | *.pid
 16 | *.seed
 17 | *.pid.lock
 18 | 
 19 | # Directory for instrumented libs generated by jscoverage/JSCover
 20 | lib-cov
 21 | 
 22 | # Coverage directory used by tools like istanbul
 23 | coverage
 24 | *.lcov
 25 | 
 26 | # nyc test coverage
 27 | .nyc_output
 28 | 
 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
 30 | .grunt
 31 | 
 32 | # Bower dependency directory (https://bower.io/)
 33 | bower_components
 34 | 
 35 | # node-waf configuration
 36 | .lock-wscript
 37 | 
 38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
 39 | build/Release
 40 | 
 41 | # Dependency directories
 42 | node_modules/
 43 | jspm_packages/
 44 | 
 45 | # Snowpack dependency directory (https://snowpack.dev/)
 46 | web_modules/
 47 | 
 48 | # TypeScript cache
 49 | *.tsbuildinfo
 50 | 
 51 | # Optional npm cache directory
 52 | .npm
 53 | 
 54 | # Optional eslint cache
 55 | .eslintcache
 56 | 
 57 | # Optional stylelint cache
 58 | .stylelintcache
 59 | 
 60 | # Microbundle cache
 61 | .rpt2_cache/
 62 | .rts2_cache_cjs/
 63 | .rts2_cache_es/
 64 | .rts2_cache_umd/
 65 | 
 66 | # Optional REPL history
 67 | .node_repl_history
 68 | 
 69 | # Output of 'npm pack'
 70 | *.tgz
 71 | 
 72 | # Yarn Integrity file
 73 | .yarn-integrity
 74 | 
 75 | # dotenv environment variable files
 76 | .env
 77 | .env.development.local
 78 | .env.test.local
 79 | .env.production.local
 80 | .env.local
 81 | 
 82 | # parcel-bundler cache (https://parceljs.org/)
 83 | .cache
 84 | .parcel-cache
 85 | 
 86 | # Next.js build output
 87 | .next
 88 | out
 89 | 
 90 | # Nuxt.js build / generate output
 91 | .nuxt
 92 | 
 93 | # Gatsby files
 94 | .cache/
 95 | # Comment in the public line in if your project uses Gatsby and not Next.js
 96 | # https://nextjs.org/blog/next-9-1#public-directory-support
 97 | # public
 98 | 
 99 | # vuepress build output
100 | .vuepress/dist
101 | 
102 | # vuepress v2.x temp and cache directory
103 | .temp
104 | .cache
105 | 
106 | # Docusaurus cache and generated files
107 | .docusaurus
108 | 
109 | # Serverless directories
110 | .serverless/
111 | 
112 | # FuseBox cache
113 | .fusebox/
114 | 
115 | # DynamoDB Local files
116 | .dynamodb/
117 | 
118 | # TernJS port file
119 | .tern-port
120 | 
121 | # Stores VSCode versions used for testing VSCode extensions
122 | .vscode-test
123 | 
124 | # yarn v2
125 | .yarn/cache
126 | .yarn/unplugged
127 | .yarn/build-state.yml
128 | .yarn/install-state.gz
129 | .pnp.*
130 | 
131 | .DS_Store
132 | dist/
133 | 
```

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

```markdown
 1 | # attio-mcp-server
 2 | 
 3 | This is an MCP server for [Attio](https://attio.com/), the AI-native CRM. It allows mcp clients (like Claude) to connect to the Attio API.
 4 | 
 5 | #### Current Capabilities
 6 | 
 7 | - [x] reading company records
 8 | - [x] reading company notes
 9 | - [x] writing company notes
10 | - [ ] other activities
11 | 
12 | ## Usage
13 | 
14 | You will need:
15 | 
16 | - `ATTIO_API_KEY` 
17 | 
18 | This is expected to be a *bearer token* which means you can get one through the [API Explorer](https://developers.attio.com/reference/get_v2-objects) on the right hand side or configure OAuth and retrieve one throught the Attio API.
19 | 
20 | 
21 | ### Claude Desktop Configuration
22 | 
23 | ```json
24 | {
25 |   "mcpServers": {
26 |     "attio": {
27 |       "command": "npx",
28 |       "args": ["attio-mcp-server"],
29 |       "env": {
30 |         "ATTIO_API_KEY": "YOUR_ATTIO_API_KEY"
31 |       }
32 |     }
33 |   }
34 | }
35 | ```
36 | ## Development
37 | 
38 | ### Prerequisites
39 | 
40 | Before you begin, ensure you have the following installed:
41 | 
42 | - Node.js (recommended v22 or higher)
43 | - npm
44 | - git
45 | - dotenv
46 | 
47 | ### Setting up Development Environment
48 | 
49 | To set up the development environment, follow these steps:
50 | 
51 | 1. Fork the repository
52 | 
53 |    - Click the "Fork" button in the top-right corner of this repository
54 |    - This creates your own copy of the repository under your Github acocunt
55 | 
56 | 1. Clone Your Fork:
57 | 
58 |    ```sh
59 |    git clone https://github.com/YOUR_USERNAME/attio-mcp-server.git
60 |    cd attio-mcp-server
61 |    ```
62 | 
63 | 1. Add Upstream Remote
64 |    ```sh
65 |    git remote add upstream https://github.com/hmk/attio-mcp-server.git
66 |    ```
67 | 
68 | 1. Copy the dotenv file
69 |     ```sh
70 |     cp .env.template .env
71 |     ```
72 | 
73 | 1. Install dependencies:
74 | 
75 |    ```sh
76 |    npm install
77 |    ```
78 | 
79 | 1. Run watch to keep index.js updated:
80 | 
81 |    ```sh
82 |    npm run build:watch
83 |    ```
84 | 
85 | 1. Start the model context protocol development server:
86 | 
87 |    ```sh
88 |    dotenv npx @modelcontextprotocol/inspector node PATH_TO_YOUR_CLONED_REPO/dist/index.js
89 |    ```
90 | 
91 | 1. If the development server did not load the environment variable correctly, set the `ATTIO_API_KEY` on the left-hand side of the mcp inspector.
```

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

```json
 1 | {
 2 |   "name": "attio-mcp-server",
 3 |   "version": "0.0.2",
 4 |   "description": "A Model Context Protocol server that connects Attio to LLMs",
 5 |   "main": "dist/index.js",
 6 |   "module": "dist/index.js",
 7 |   "type": "module",
 8 |   "access": "public",
 9 |   "bin": {
10 |     "attio-mcp-server": "dist/index.js"
11 |   },
12 |   "scripts": {
13 |     "clean": "shx rm -rf dist",
14 |     "build": "tsc",
15 |     "postbuild": "shx chmod +x dist/*.js",
16 |     "check": "tsc --noEmit",
17 |     "build:watch": "tsc --watch"
18 |   },
19 |   "files": [
20 |     "dist"
21 |   ],
22 |   "dependencies": {
23 |     "@modelcontextprotocol/sdk": "^1.4.1",
24 |     "axios": "^1.7.9",
25 |     "shx": "^0.3.4",
26 |     "typescript": "^5.7.2"
27 |   },
28 |   "author": "@hmk",
29 |   "license": "BSD-3-Clause",
30 |   "devDependencies": {
31 |     "@types/jest": "^29.5.14",
32 |     "jest": "^29.7.0",
33 |     "ts-jest": "^29.2.5",
34 |     "tsx": "^4.19.2"
35 |   },
36 |   "jest": {
37 |     "preset": "ts-jest",
38 |     "testEnvironment": "node",
39 |     "testPathIgnorePatterns": [
40 |       "<rootDir>/dist/"
41 |     ]
42 |   }
43 | }
44 | 
```

--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------

```typescript
  1 | #!/usr/bin/env node
  2 | 
  3 | import { Server } from "@modelcontextprotocol/sdk/server/index.js";
  4 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
  5 | import {
  6 |   CallToolRequestSchema,
  7 |   ListResourcesRequestSchema,
  8 |   ListToolsRequestSchema,
  9 |   ReadResourceRequestSchema,
 10 | } from "@modelcontextprotocol/sdk/types.js";
 11 | import axios from "axios";
 12 | 
 13 | // Configure Axios instance with Attio API credentials from environment
 14 | const api = axios.create({
 15 |   baseURL: "https://api.attio.com/v2",
 16 |   headers: {
 17 |     "Authorization": `Bearer ${process.env.ATTIO_API_KEY}`,
 18 |     "Content-Type": "application/json",
 19 |   },
 20 | });
 21 | 
 22 | const server = new Server(
 23 |   {
 24 |     name: "attio-mcp-server",
 25 |     version: "0.0.1",
 26 |   },
 27 |   {
 28 |     capabilities: {
 29 |       resources: {},
 30 |       tools: {},
 31 |     },
 32 |   },
 33 | );
 34 | 
 35 | // Helper function to create detailed error responses
 36 | function createErrorResult(error: Error, url: string, method: string, responseData: any) {
 37 |   return {
 38 |     content: [
 39 |       {
 40 |         type: "text",
 41 |         text: `ERROR: ${error.message}\n\n` +
 42 |           `=== Request Details ===\n` +
 43 |           `- Method: ${method}\n` +
 44 |           `- URL: ${url}\n\n` +
 45 |           `=== Response Details ===\n` +
 46 |           `- Status: ${responseData.status}\n` +
 47 |           `- Headers: ${JSON.stringify(responseData.headers || {}, null, 2)}\n` +
 48 |           `- Data: ${JSON.stringify(responseData.data || {}, null, 2)}\n`
 49 |       },
 50 |     ],
 51 |     isError: true,
 52 |     error: {
 53 |       code: responseData.status || 500,
 54 |       message: error.message,
 55 |       details: responseData.data?.error || "Unknown error occurred"
 56 |     }
 57 |   };
 58 | }
 59 | 
 60 | // Example: List Resources Handler (List Companies)
 61 | server.setRequestHandler(ListResourcesRequestSchema, async (request) => {
 62 |   const path = "/objects/companies/records/query";
 63 |   try {
 64 |     const response = await api.post(path, {
 65 |       limit: 20,
 66 |       sorts: [{ attribute: 'last_interaction', field: 'interacted_at', direction: 'desc' }]
 67 |     });
 68 |     const companies = response.data.data || [];
 69 | 
 70 |     return {
 71 |       resources: companies.map((company: any) => ({
 72 |         uri: `attio://companies/${company.id?.record_id}`,
 73 |         name: company.values?.name?.[0]?.value || "Unknown Company",
 74 |         mimeType: "application/json",
 75 |       })),
 76 |       description: `Found ${companies.length} companies that you have interacted with most recently`,
 77 |     };
 78 |   } catch (error) {
 79 |     return createErrorResult(
 80 |       error instanceof Error ? error : new Error("Unknown error"),
 81 |       path,
 82 |       "POST",
 83 |       (error as any).response?.data || {}
 84 |     );
 85 |   }
 86 | });
 87 | 
 88 | // Example: Read Resource Handler (Get Company Details)
 89 | server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
 90 |   const companyId = request.params.uri.replace("attio://companies/", "");
 91 |   try {
 92 |     const path = `/objects/companies/records/${companyId}`;
 93 |     const response = await api.get(path);
 94 | 
 95 |     return {
 96 |       contents: [
 97 |         {
 98 |           uri: request.params.uri,
 99 |           text: JSON.stringify(response.data, null, 2),
100 |           mimeType: "application/json",
101 |         },
102 |       ],
103 |     };
104 |   } catch (error) {
105 |     return createErrorResult(
106 |       error instanceof Error ? error : new Error("Unknown error"),
107 |       `/objects/companies/${companyId}`,
108 |       "GET",
109 |       (error as any).response?.data || {}
110 |     );
111 |   }
112 | });
113 | 
114 | // Example: List Tools Handler
115 | server.setRequestHandler(ListToolsRequestSchema, async () => {
116 |   return {
117 |     tools: [
118 |       {
119 |         name: "search-companies",
120 |         description: "Search for companies by name",
121 |         inputSchema: {
122 |           type: "object",
123 |           properties: {
124 |             query: {
125 |               type: "string",
126 |               description: "Company name or keyword to search for",
127 |             },
128 |           },
129 |           required: ["query"],
130 |         },
131 |       },
132 |       {
133 |         name: "read-company-details",
134 |         description: "Read details of a company",
135 |         inputSchema: {
136 |           type: "object",
137 |           properties: {
138 |             uri: {
139 |               type: "string",
140 |               description: "URI of the company to read",
141 |             },
142 |           },
143 |           required: ["uri"],
144 |         },
145 |       },
146 |       {
147 |         name: "read-company-notes",
148 |         description: "Read notes for a company",
149 |         inputSchema: {
150 |           type: "object",
151 |           properties: {
152 |             uri: {
153 |               type: "string",
154 |               description: "URI of the company to read notes for",
155 |             },
156 |             limit: {
157 |               type: "number",
158 |               description: "Maximum number of notes to fetch (optional, default 10)",
159 |             },
160 |             offset: {
161 |               type: "number",
162 |               description: "Number of notes to skip (optional, default 0)",
163 |             },
164 |           },
165 |           required: ["uri"],
166 |         },
167 |       },
168 |       {
169 |         name: "create-company-note",
170 |         description: "Add a new note to a company",
171 |         inputSchema: {
172 |           type: "object",
173 |           properties: {
174 |             companyId: {
175 |               type: "string",
176 |               description: "ID of the company to add the note to",
177 |             },
178 |             noteTitle: {
179 |               type: "string",
180 |               description: "Title of the note",
181 |             },
182 |             noteText: {
183 |               type: "string",
184 |               description: "Text content of the note",
185 |             },
186 |           },
187 |           required: ["companyId", "noteTitle", "noteText"],
188 |         },
189 |       },
190 |     ],
191 |   };
192 | });
193 | 
194 | // Example: Call Tool Handler with enhanced error handling
195 | server.setRequestHandler(CallToolRequestSchema, async (request) => {
196 |   const toolName = request.params.name;
197 |   try {
198 | 
199 |     if (toolName === "search-companies") {
200 |       const query = request.params.arguments?.query as string;
201 |       const path = "/objects/companies/records/query";
202 |       try {
203 |         const response = await api.post(path, {
204 |           filter: {
205 |             name: { "$contains": query },
206 |           }
207 |         });
208 |         const results = response.data.data || [];
209 | 
210 |         const companies = results.map((company: any) => {
211 |           const companyName = company.values?.name?.[0]?.value || "Unknown Company";
212 |           const companyId = company.id?.record_id || "Record ID not found";
213 |           return `${companyName}: attio://companies/${companyId}`;
214 |         })
215 |           .join("\n");
216 |         return {
217 |           content: [
218 |             {
219 |               type: "text",
220 |               text: `Found ${results.length} companies:\n${companies}`,
221 |             },
222 |           ],
223 |           isError: false,
224 |         };
225 |       } catch (error) {
226 |         return createErrorResult(
227 |           error instanceof Error ? error : new Error("Unknown error"),
228 |           path,
229 |           "GET",
230 |           (error as any).response?.data || {}
231 |         );
232 |       }
233 |     }
234 | 
235 |     if (toolName === "read-company-details") {
236 |       const uri = request.params.arguments?.uri as string;
237 |       const companyId = uri.replace("attio://companies/", "");
238 |       const path = `/objects/companies/records/${companyId}`;
239 |       try {
240 |         const response = await api.get(path);
241 |         return {
242 |           content: [
243 |             {
244 |               type: "text",
245 |               text: `Company details for ${companyId}:\n${JSON.stringify(response.data, null, 2)}`,
246 |             },
247 |           ],
248 |           isError: false,
249 |         };
250 |       } catch (error) {
251 |         return createErrorResult(
252 |           error instanceof Error ? error : new Error("Unknown error"),
253 |           path,
254 |           "GET",
255 |           (error as any).response?.data || {}
256 |         );
257 |       }
258 |     }
259 | 
260 |     if (toolName == 'read-company-notes') {
261 |       const uri = request.params.arguments?.uri as string;
262 |       const limit = request.params.arguments?.limit as number || 10;
263 |       const offset = request.params.arguments?.offset as number || 0;
264 |       const companyId = uri.replace("attio://companies/", "");
265 |       const path = `/notes?limit=${limit}&offset=${offset}&parent_object=companies&parent_record_id=${companyId}`;
266 | 
267 |       try {
268 |         const response = await api.get(path);
269 |         const notes = response.data.data || [];
270 | 
271 |         return {
272 |           content: [
273 |             {
274 |               type: "text",
275 |               text: `Found ${notes.length} notes for company ${companyId}:\n${notes.map((note: any) => JSON.stringify(note)).join("----------\n")}`,
276 |             },
277 |           ],
278 |           isError: false,
279 |         };
280 |       } catch (error) {
281 |         return createErrorResult(
282 |           error instanceof Error ? error : new Error("Unknown error"),
283 |           path,
284 |           "GET",
285 |           (error as any).response?.data || {}
286 |         );
287 |       }
288 |     }
289 | 
290 |     if (toolName === "create-company-note") {
291 |       const companyId = request.params.arguments?.companyId as string;
292 |       const noteTitle = request.params.arguments?.noteTitle as string;
293 |       const noteText = request.params.arguments?.noteText as string;
294 |       const url = `notes`;
295 | 
296 |       try {
297 |         const response = await api.post(url, {
298 |           data: {
299 |             format: "plaintext",
300 |             parent_object: "companies",
301 |             parent_record_id: companyId,
302 |             title: `[AI] ${noteTitle}`,
303 |             content: noteText
304 |           },
305 |         });
306 | 
307 |         return {
308 |           content: [
309 |             {
310 |               type: "text",
311 |               text: `Note added to company ${companyId}: attio://notes/${response.data?.id?.note_id}`,
312 |             },
313 |           ],
314 |           isError: false,
315 |         };
316 |       } catch (error) {
317 |         return createErrorResult(
318 |           error instanceof Error ? error : new Error("Unknown error"),
319 |           url,
320 |           "POST",
321 |           (error as any).response?.data || {}
322 |         );
323 |       }
324 |     }
325 | 
326 |     throw new Error("Tool not found");
327 |   } catch (error) {
328 |     return {
329 |       content: [
330 |         {
331 |           type: "text",
332 |           text: `Error executing tool '${toolName}': ${(error as Error).message}`,
333 |         },
334 |       ],
335 |       isError: true,
336 |     };
337 |   }
338 | });
339 | 
340 | // Main function
341 | async function main() {
342 |   try {
343 |     if (!process.env.ATTIO_API_KEY) {
344 |       throw new Error("ATTIO_API_KEY environment variable not found");
345 |     }
346 | 
347 |     const transport = new StdioServerTransport();
348 |     await server.connect(transport);
349 |   } catch (error) {
350 |     console.error("Error starting server:", error);
351 |     process.exit(1);
352 |   }
353 | }
354 | 
355 | main().catch(error => {
356 |   console.error("Unhandled error:", error);
357 |   process.exit(1);
358 | });
359 | 
```

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