# 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 |
```