# Directory Structure ``` ├── .gitignore ├── Dockerfile ├── LICENSE ├── package-lock.json ├── package.json ├── README.md ├── smithery.yaml ├── src │ ├── index.ts │ └── tools │ ├── addressSearchByPlaceName.ts │ ├── directionSearchByAddress.ts │ ├── directionSearchByCoordinates.ts │ ├── futureDirectionSearchByCoordinates.ts │ ├── geocode.ts │ └── multiDestinationDirectionSearch.ts └── tsconfig.json ``` # Files -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` 1 | # Dependencies 2 | node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | 7 | # Environment variables 8 | .env 9 | .env.local 10 | .env.*.local 11 | 12 | # Build output 13 | dist/ 14 | build/ 15 | 16 | # IDE 17 | .idea/ 18 | .vscode/ 19 | *.swp 20 | *.swo 21 | 22 | # OS 23 | .DS_Store 24 | Thumbs.db ``` -------------------------------------------------------------------------------- /smithery.yaml: -------------------------------------------------------------------------------- ```yaml 1 | app: 2 | name: kakao-mobility-mcp-server 3 | version: 1.0.2 4 | 5 | build: 6 | type: docker 7 | dockerfile: ./Dockerfile 8 | 9 | deploy: 10 | env: 11 | - name: KAKAO_REST_API_KEY 12 | required: true 13 | 14 | port: 3000 15 | 16 | health: 17 | path: /health 18 | port: 3000 19 | 20 | resources: 21 | memory: 512 22 | cpu: 1 23 | 24 | startCommand: 25 | type: stdio 26 | configSchema: 27 | type: object 28 | properties: 29 | kakaoRestApiKey: 30 | type: string 31 | description: "Kakao REST API 키" 32 | required: 33 | - kakaoRestApiKey 34 | commandFunction: |- 35 | (config) => ({ 36 | "command": "node", 37 | "args": [ 38 | "dist/index.js" 39 | ], 40 | "env": { 41 | "KAKAO_REST_API_KEY": config.kakaoRestApiKey 42 | } 43 | }) 44 | ``` -------------------------------------------------------------------------------- /src/tools/geocode.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { z } from "zod"; 2 | import dotenv from "dotenv"; 3 | import { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; 4 | dotenv.config(); 5 | 6 | export const geocodeSchema = { 7 | placeName: z.string(), 8 | }; 9 | 10 | export const geocodeHandler = async ({ placeName }: { placeName: string }): Promise<CallToolResult> => { 11 | const response = await fetch( 12 | `https://dapi.kakao.com/v2/local/search/address?query=${placeName}`, 13 | { 14 | method: "GET", 15 | headers: { 16 | "Content-Type": "application/json", 17 | Authorization: `KakaoAK ${process.env.KAKAO_REST_API_KEY}`, 18 | }, 19 | } 20 | ); 21 | const data = await response.json(); 22 | 23 | return { 24 | content: [{ 25 | type: "text", 26 | text: JSON.stringify(data), 27 | }], 28 | isError: false, 29 | }; 30 | }; 31 | ``` -------------------------------------------------------------------------------- /src/tools/addressSearchByPlaceName.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { z } from "zod"; 2 | import dotenv from "dotenv"; 3 | import { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; 4 | dotenv.config(); 5 | 6 | export const addressSearchByPlaceNameSchema = { 7 | placeName: z.string(), 8 | }; 9 | 10 | export const addressSearchByPlaceNameHandler = async ({ placeName }: { placeName: string }): Promise<CallToolResult> => { 11 | const response = await fetch( 12 | `https://dapi.kakao.com/v2/local/search/keyword?query=${placeName}`, 13 | { 14 | method: "GET", 15 | headers: { 16 | "Content-Type": "application/json", 17 | Authorization: `KakaoAK ${process.env.KAKAO_REST_API_KEY}`, 18 | }, 19 | } 20 | ); 21 | const data = await response.json(); 22 | 23 | return { 24 | content: [{ 25 | type: "text", 26 | text: JSON.stringify(data), 27 | }], 28 | isError: false, 29 | }; 30 | }; 31 | ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "name": "traffic-data-mcp-server", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1", 7 | "build": "tsc", 8 | "start": "node dist/index.js", 9 | "inspect": "npx @modelcontextprotocol/inspector node dist/index.js" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/CaChiJ/traffic-data-mcp-server.git" 14 | }, 15 | "author": "", 16 | "license": "ISC", 17 | "bugs": { 18 | "url": "https://github.com/CaChiJ/traffic-data-mcp-server/issues" 19 | }, 20 | "homepage": "https://github.com/CaChiJ/traffic-data-mcp-server#readme", 21 | "description": "", 22 | "dependencies": { 23 | "@modelcontextprotocol/sdk": "^1.8.0", 24 | "dotenv": "^16.4.7" 25 | }, 26 | "devDependencies": { 27 | "@types/node": "^22.14.0", 28 | "typescript": "^5.8.3" 29 | } 30 | } 31 | ``` -------------------------------------------------------------------------------- /src/tools/directionSearchByCoordinates.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { z } from "zod"; 2 | import dotenv from "dotenv"; 3 | import { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; 4 | dotenv.config(); 5 | 6 | export const directionSearchByCoordinatesSchema = { 7 | originLongitude: z.number(), 8 | originLatitude: z.number(), 9 | destLongitude: z.number(), 10 | destLatitude: z.number(), 11 | }; 12 | 13 | export const directionSearchByCoordinatesHandler = async ({ 14 | originLongitude, 15 | originLatitude, 16 | destLongitude, 17 | destLatitude, 18 | }: { 19 | originLongitude: number; 20 | originLatitude: number; 21 | destLongitude: number; 22 | destLatitude: number; 23 | }): Promise<CallToolResult> => { 24 | const response = await fetch( 25 | `https://apis-navi.kakaomobility.com/v1/directions?origin=${originLongitude},${originLatitude}&destination=${destLongitude},${destLatitude}`, 26 | { 27 | method: "GET", 28 | headers: { 29 | "Content-Type": "application/json", 30 | Authorization: `KakaoAK ${process.env.KAKAO_REST_API_KEY}`, 31 | }, 32 | } 33 | ); 34 | 35 | const data = await response.json(); 36 | 37 | return { 38 | content: [{ 39 | type: "text", 40 | text: JSON.stringify(data), 41 | }], 42 | isError: false, 43 | }; 44 | }; 45 | ``` -------------------------------------------------------------------------------- /src/tools/futureDirectionSearchByCoordinates.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { z } from "zod"; 2 | import dotenv from "dotenv"; 3 | import { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; 4 | dotenv.config(); 5 | 6 | export const futureDirectionSearchByCoordinatesSchema = { 7 | originLatitude: z.number(), 8 | originLongitude: z.number(), 9 | destinationLatitude: z.number(), 10 | destinationLongitude: z.number(), 11 | departureTime: z.string(), 12 | waypoints: z.string().optional(), 13 | priority: z.enum(["RECOMMEND", "TIME", "DISTANCE"]).optional(), 14 | avoid: z.string().optional(), 15 | roadEvent: z.number().optional(), 16 | alternatives: z.boolean().optional(), 17 | roadDetails: z.boolean().optional(), 18 | carType: z.number().optional(), 19 | carFuel: z.enum(["GASOLINE", "DIESEL", "LPG"]).optional(), 20 | carHipass: z.boolean().optional(), 21 | summary: z.boolean().optional(), 22 | }; 23 | 24 | export const futureDirectionSearchByCoordinatesHandler = async ({ 25 | originLatitude, 26 | originLongitude, 27 | destinationLatitude, 28 | destinationLongitude, 29 | departureTime, 30 | waypoints, 31 | priority, 32 | avoid, 33 | roadEvent, 34 | alternatives, 35 | roadDetails, 36 | carType, 37 | carFuel, 38 | carHipass, 39 | summary, 40 | }: { 41 | originLatitude: number; 42 | originLongitude: number; 43 | destinationLatitude: number; 44 | destinationLongitude: number; 45 | departureTime: string; 46 | waypoints?: string; 47 | priority?: string; 48 | avoid?: string; 49 | roadEvent?: number; 50 | alternatives?: boolean; 51 | roadDetails?: boolean; 52 | carType?: number; 53 | carFuel?: string; 54 | carHipass?: boolean; 55 | summary?: boolean; 56 | }): Promise<CallToolResult> => { 57 | let url = `https://apis-navi.kakaomobility.com/v1/future/directions?origin=${originLongitude},${originLatitude}&destination=${destinationLongitude},${destinationLatitude}&departure_time=${departureTime}`; 58 | 59 | if (waypoints) url += `&waypoints=${waypoints}`; 60 | if (priority) url += `&priority=${priority}`; 61 | if (avoid) url += `&avoid=${avoid}`; 62 | if (roadEvent !== undefined) url += `&roadevent=${roadEvent}`; 63 | if (alternatives !== undefined) url += `&alternatives=${alternatives}`; 64 | if (roadDetails !== undefined) url += `&road_details=${roadDetails}`; 65 | if (carType !== undefined) url += `&car_type=${carType}`; 66 | if (carFuel) url += `&car_fuel=${carFuel}`; 67 | if (carHipass !== undefined) url += `&car_hipass=${carHipass}`; 68 | if (summary !== undefined) url += `&summary=${summary}`; 69 | 70 | const response = await fetch(url, { 71 | method: "GET", 72 | headers: { 73 | "Content-Type": "application/json", 74 | Authorization: `KakaoAK ${process.env.KAKAO_REST_API_KEY}`, 75 | }, 76 | }); 77 | 78 | const data = await response.json(); 79 | 80 | return { 81 | content: [{ 82 | type: "text", 83 | text: JSON.stringify(data), 84 | }], 85 | isError: false, 86 | }; 87 | }; 88 | ``` -------------------------------------------------------------------------------- /src/tools/directionSearchByAddress.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { z } from "zod"; 2 | import dotenv from "dotenv"; 3 | import { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; 4 | dotenv.config(); 5 | 6 | export const directionSearchByAddressSchema = { 7 | originAddress: z.string(), 8 | destAddress: z.string(), 9 | }; 10 | 11 | export const directionSearchByAddressHandler = async ({ 12 | originAddress, 13 | destAddress, 14 | }: { 15 | originAddress: string; 16 | destAddress: string; 17 | }): Promise<CallToolResult> => { 18 | const [originResult, destResult]: [any, any] = await Promise.all([ 19 | (async () => { 20 | const response = await fetch( 21 | `https://dapi.kakao.com/v2/local/search/address?query=${originAddress}`, 22 | { 23 | method: "GET", 24 | headers: { 25 | "Content-Type": "application/json", 26 | Authorization: `KakaoAK ${process.env.KAKAO_REST_API_KEY}`, 27 | }, 28 | } 29 | ); 30 | if (!response.ok) { 31 | throw new Error( 32 | `Kakao geocode API request failed for origin: ${response.statusText}` 33 | ); 34 | } 35 | const data = await response.json(); 36 | return data; 37 | })(), 38 | (async () => { 39 | const response = await fetch( 40 | `https://dapi.kakao.com/v2/local/search/address?query=${destAddress}`, 41 | { 42 | method: "GET", 43 | headers: { 44 | "Content-Type": "application/json", 45 | Authorization: `KakaoAK ${process.env.KAKAO_REST_API_KEY}`, 46 | }, 47 | } 48 | ); 49 | if (!response.ok) { 50 | throw new Error( 51 | `Kakao geocode API request failed for destination: ${response.statusText}` 52 | ); 53 | } 54 | const data = await response.json(); 55 | return data; 56 | })(), 57 | ]); 58 | 59 | // Add basic error handling for geocoding results 60 | if ( 61 | !originResult?.documents?.[0]?.x || 62 | !originResult?.documents?.[0]?.y || 63 | !destResult?.documents?.[0]?.x || 64 | !destResult?.documents?.[0]?.y 65 | ) { 66 | // Consider returning a more informative error structure for MCP 67 | return { 68 | content: [{ 69 | type: "text", 70 | text: "Geocoding failed or returned incomplete data for one or both locations.", 71 | }], 72 | isError: true, 73 | }; 74 | } 75 | 76 | const originLongitude = originResult.documents[0].x; 77 | const originLatitude = originResult.documents[0].y; 78 | const destLongitude = destResult.documents[0].x; 79 | const destLatitude = destResult.documents[0].y; 80 | 81 | const response = await fetch( 82 | `https://apis-navi.kakaomobility.com/v1/directions?origin=${originLongitude},${originLatitude}&destination=${destLongitude},${destLatitude}`, 83 | { 84 | method: "GET", 85 | headers: { 86 | "Content-Type": "application/json", 87 | Authorization: `KakaoAK ${process.env.KAKAO_REST_API_KEY}`, 88 | }, 89 | } 90 | ); 91 | 92 | const data = await response.json(); 93 | 94 | return { 95 | content: [{ 96 | type: "text", 97 | text: JSON.stringify(data), 98 | }], 99 | isError: false, 100 | }; 101 | }; 102 | ``` -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | import { 2 | McpServer, 3 | ResourceTemplate, 4 | } from "@modelcontextprotocol/sdk/server/mcp.js"; 5 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 6 | import dotenv from "dotenv"; 7 | dotenv.config(); 8 | 9 | import { directionSearchByCoordinatesSchema, directionSearchByCoordinatesHandler } from "./tools/directionSearchByCoordinates.js"; 10 | import { directionSearchByAddressSchema, directionSearchByAddressHandler } from "./tools/directionSearchByAddress.js"; 11 | import { addressSearchByPlaceNameSchema, addressSearchByPlaceNameHandler } from "./tools/addressSearchByPlaceName.js"; 12 | import { geocodeSchema, geocodeHandler } from "./tools/geocode.js"; 13 | import { futureDirectionSearchByCoordinatesSchema, futureDirectionSearchByCoordinatesHandler } from "./tools/futureDirectionSearchByCoordinates.js"; 14 | import { multiDestinationDirectionSearchSchema, multiDestinationDirectionSearchHandler } from "./tools/multiDestinationDirectionSearch.js"; 15 | 16 | // Create an MCP server 17 | const server = new McpServer({ 18 | name: "Traffic Data MCP Server", 19 | version: "1.0.2", 20 | }); 21 | 22 | // Register tools 23 | server.tool( 24 | "direction_search_by_coords", 25 | "Search for directions between two points using their coordinates (longitude and latitude). This tool provides navigation information including distance, duration, and route details.", 26 | directionSearchByCoordinatesSchema, 27 | directionSearchByCoordinatesHandler 28 | ); 29 | 30 | server.tool( 31 | "direction_search_by_address", 32 | "Search for directions between two locations using their addresses. The tool first geocodes the addresses to coordinates, then finds the optimal route between them.", 33 | directionSearchByAddressSchema, 34 | directionSearchByAddressHandler 35 | ); 36 | 37 | server.tool( 38 | "address_search_by_place_name", 39 | "Search for addresses using a place name or keyword. Returns detailed location information including coordinates and address details.", 40 | addressSearchByPlaceNameSchema, 41 | addressSearchByPlaceNameHandler 42 | ); 43 | 44 | server.tool( 45 | "geocode", 46 | "Convert an address into geographic coordinates (geocoding). Returns the exact location coordinates and address details for the given place name.", 47 | geocodeSchema, 48 | geocodeHandler 49 | ); 50 | 51 | server.tool( 52 | "future_direction_search_by_coords", 53 | "Search for directions with future departure time. Provides navigation information considering traffic predictions for a specific future time. Supports various options like waypoints, route preferences, and vehicle details.", 54 | futureDirectionSearchByCoordinatesSchema, 55 | futureDirectionSearchByCoordinatesHandler 56 | ); 57 | 58 | server.tool( 59 | "multi_destination_direction_search", 60 | "Search for directions between a starting point and multiple destinations with coordinates. Returns a summary of the route including distance, duration, and route details. For detailed route information, additional calls to the car navigation API are required.", 61 | multiDestinationDirectionSearchSchema, 62 | multiDestinationDirectionSearchHandler 63 | ); 64 | 65 | 66 | (async () => { 67 | const transport = new StdioServerTransport(); 68 | await server.connect(transport); 69 | })(); 70 | ``` -------------------------------------------------------------------------------- /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": "es2017", /* 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 | // "libReplacement": true, /* Enable lib replacement. */ 18 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 19 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 20 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 21 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 22 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 23 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 24 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 25 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 26 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 27 | 28 | /* Modules */ 29 | "module": "nodenext", /* Specify what module code is generated. */ 30 | // "rootDir": "./", /* Specify the root folder within your source files. */ 31 | "moduleResolution": "nodenext", /* Specify how TypeScript looks up a file from a given module specifier. */ 32 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 33 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 34 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 35 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 36 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 37 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 38 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 39 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 40 | // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */ 41 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 42 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 43 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 44 | // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ 45 | // "resolveJsonModule": true, /* Enable importing .json files. */ 46 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 47 | // "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */ 48 | 49 | /* JavaScript Support */ 50 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 51 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 52 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 53 | 54 | /* Emit */ 55 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 56 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 57 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 58 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 59 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 60 | // "noEmit": true, /* Disable emitting files from a compilation. */ 61 | // "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. */ 62 | "outDir": "./dist", /* Specify an output folder for all emitted files. */ 63 | // "removeComments": true, /* Disable emitting comments. */ 64 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 65 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 66 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 67 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 68 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 69 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 70 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 71 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 72 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 73 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 74 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 75 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 76 | 77 | /* Interop Constraints */ 78 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 79 | // "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. */ 80 | // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ 81 | // "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */ 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 | } 114 | ```