diff --git a/LLM.md b/LLM.md new file mode 100644 index 000000000..382021774 --- /dev/null +++ b/LLM.md @@ -0,0 +1,403 @@ +# TypeScript SDK API Reference + +## Overview +This document provides a comprehensive API reference for the Model Context Protocol (MCP) TypeScript SDK. + +## Installation +```bash +npm install @modelcontextprotocol/typescript-sdk +``` + +## Core Types + +### Import Path: `@modelcontextprotocol/typescript-sdk/types` + +#### Constants +- `LATEST_PROTOCOL_VERSION: "2025-06-18"` +- `DEFAULT_NEGOTIATED_PROTOCOL_VERSION: "2025-03-26"` +- `SUPPORTED_PROTOCOL_VERSIONS: string[]` +- `JSONRPC_VERSION: "2.0"` + +#### Error Codes +```typescript +enum ErrorCode { + ConnectionClosed = -32000, + RequestTimeout = -32001, + ParseError = -32700, + InvalidRequest = -32600, + MethodNotFound = -32601, + InvalidParams = -32602, + InternalError = -32603, +} +``` + +#### Core Schemas +- `ProgressTokenSchema` +- `CursorSchema` +- `RequestSchema` +- `NotificationSchema` +- `ResultSchema` +- `RequestIdSchema` +- `JSONRPCRequestSchema` +- `JSONRPCNotificationSchema` +- `JSONRPCResponseSchema` +- `JSONRPCErrorSchema` +- `JSONRPCMessageSchema` +- `EmptyResultSchema` +- `CancelledNotificationSchema` +- `BaseMetadataSchema` +- `ImplementationSchema` +- `ClientCapabilitiesSchema` +- `ServerCapabilitiesSchema` + +## Client API + +### Import Path: `@modelcontextprotocol/typescript-sdk/client` + +#### Client Class +```typescript +class Client extends Protocol { + constructor(clientInfo: Implementation, options?: ClientOptions) + + // Methods + connect(transport: Transport, options?: RequestOptions): Promise + getServerCapabilities(): ServerCapabilities | undefined + getServerVersion(): Implementation | undefined + getInstructions(): string | undefined + registerCapabilities(capabilities: ClientCapabilities): void + + // Tool operations + callTool(name: string, arguments?: object, options?: RequestOptions): Promise + listTools(options?: RequestOptions): Promise + + // Resource operations + listResources(options?: RequestOptions): Promise + readResource(uri: string, options?: RequestOptions): Promise + subscribeResource(uri: string, options?: RequestOptions): Promise + unsubscribeResource(uri: string, options?: RequestOptions): Promise + + // Prompt operations + getPrompt(name: string, arguments?: object, options?: RequestOptions): Promise + listPrompts(options?: RequestOptions): Promise + + // Logging + setLogLevel(level: LoggingLevel, options?: RequestOptions): Promise +} + +interface ClientOptions extends ProtocolOptions { + capabilities?: ClientCapabilities +} +``` + +## Server API + +### Import Path: `@modelcontextprotocol/typescript-sdk/server` + +#### Server Class +```typescript +class Server extends Protocol { + constructor(serverInfo: Implementation, options?: ServerOptions) + + // Methods + registerCapabilities(capabilities: ServerCapabilities): void + oninitialized?: () => void + + // Request handlers + setRequestHandler( + schema: ZodSchema, + handler: (request: RequestParam) => Promise + ): void + + // Notification handlers + setNotificationHandler( + schema: ZodSchema, + handler: (notification: NotificationParam) => Promise | void + ): void + + // Convenience methods + prompt(name: string, description?: string, fn?: PromptHandler): void + resource(uri: string, name: string, fn?: ResourceHandler): void + tool(name: string, description?: string, fn?: ToolHandler): void + + // Notifications + notifyResourceUpdated(uri: string): void + notifyResourceListChanged(): void + notifyToolListChanged(): void + notifyPromptListChanged(): void + notifyLog(level: LoggingLevel, message: string): void +} + +interface ServerOptions extends ProtocolOptions { + capabilities?: ServerCapabilities + instructions?: string +} +``` + +## Transport Layer + +### Import Path: `@modelcontextprotocol/typescript-sdk/shared/transport` + +#### Transport Interface +```typescript +interface Transport { + onmessage?: (message: JSONRPCMessage) => void + onclose?: () => void + onerror?: (error: Error) => void + + start(): Promise + send(message: JSONRPCMessage): Promise + close(): Promise + + sessionId?: string + setProtocolVersion?(version: string): void +} +``` + +#### Transport Implementations + +##### Stdio Transport +```typescript +import { StdioClientTransport } from "@modelcontextprotocol/typescript-sdk/client/stdio" +import { StdioServerTransport } from "@modelcontextprotocol/typescript-sdk/server/stdio" + +// Client +const transport = new StdioClientTransport({ + command: "node", + args: ["server.js"] +}) + +// Server +const transport = new StdioServerTransport() +``` + +##### SSE Transport +```typescript +import { SSEClientTransport } from "@modelcontextprotocol/typescript-sdk/client/sse" +import { SSEServerTransport } from "@modelcontextprotocol/typescript-sdk/server/sse" + +// Client +const transport = new SSEClientTransport(new URL("http://localhost:3000/sse")) + +// Server +const transport = new SSEServerTransport(req, res) +``` + +##### Streamable HTTP Transport +```typescript +import { StreamableHttpClientTransport } from "@modelcontextprotocol/typescript-sdk/client/streamableHttp" +import { StreamableHttpServerTransport } from "@modelcontextprotocol/typescript-sdk/server/streamableHttp" + +// Client +const transport = new StreamableHttpClientTransport(new URL("http://localhost:3000/mcp")) + +// Server +const transport = new StreamableHttpServerTransport() +``` + +## Authentication + +### Import Path: `@modelcontextprotocol/typescript-sdk/client/auth` + +#### Auth Types +```typescript +interface AuthInfo { + userId: string + token: string + expiresAt?: Date +} + +// OAuth2 +import { OAuth2Client } from "@modelcontextprotocol/typescript-sdk/client/auth" +const oauth = new OAuth2Client({ + clientId: "your-client-id", + redirectUri: "http://localhost:3000/callback", + authorizationEndpoint: "https://auth.example.com/authorize", + tokenEndpoint: "https://auth.example.com/token" +}) +``` + +### Import Path: `@modelcontextprotocol/typescript-sdk/server/auth` + +#### Server Auth +```typescript +import { createAuthMiddleware } from "@modelcontextprotocol/typescript-sdk/server/auth" + +const auth = createAuthMiddleware({ + providers: [new OAuth2Provider({ + clientId: "your-client-id", + clientSecret: "your-client-secret", + redirectUri: "http://localhost:3000/callback" + })] +}) +``` + +## Protocol Base Class + +### Import Path: `@modelcontextprotocol/typescript-sdk/shared/protocol` + +#### Protocol Class +```typescript +class Protocol { + constructor(options?: ProtocolOptions) + + // Connection management + connect(transport: Transport): Promise + close(): Promise + + // Request/Response + request(method: string, params?: any, options?: RequestOptions): Promise + notification(method: string, params?: any): Promise + + // Error handling + protected handleError(error: Error): void +} + +interface ProtocolOptions { + requestTimeout?: number +} + +interface RequestOptions { + timeout?: number + signal?: AbortSignal +} +``` + +## Error Handling + +### Import Path: `@modelcontextprotocol/typescript-sdk/types` + +#### McpError Class +```typescript +class McpError extends Error { + constructor(public code: ErrorCode, message: string) +} + +// Usage +throw new McpError(ErrorCode.MethodNotFound, "Method not found") +``` + +## Usage Examples + +### Client Example +```typescript +import { Client } from "@modelcontextprotocol/typescript-sdk/client" +import { StdioClientTransport } from "@modelcontextprotocol/typescript-sdk/client/stdio" + +const client = new Client({ + name: "MyClient", + version: "1.0.0" +}) + +const transport = new StdioClientTransport({ + command: "node", + args: ["server.js"] +}) + +await client.connect(transport) + +// List available tools +const tools = await client.listTools() + +// Call a tool +const result = await client.callTool("calculator", { expression: "2+2" }) +``` + +### Server Example +```typescript +import { Server } from "@modelcontextprotocol/typescript-sdk/server" +import { StdioServerTransport } from "@modelcontextprotocol/typescript-sdk/server/stdio" + +const server = new Server({ + name: "MyServer", + version: "1.0.0" +}, { + capabilities: { + tools: {} + } +}) + +// Register a tool +server.tool("calculator", "A simple calculator", async ({ expression }) => { + return { + content: [{ + type: "text", + text: eval(expression).toString() + }] + } +}) + +const transport = new StdioServerTransport() +await server.connect(transport) +``` + +## Advanced Features + +### Custom Request/Response Types +```typescript +// Extend base types +interface CustomRequest extends Request { + method: "custom/method" + params: { customParam: string } +} + +interface CustomResult extends Result { + customResult: string +} + +// Use with Client/Server +const client = new Client(...) +``` + +### Progress Notifications +```typescript +// Server-side progress +await server.progress(token, { + progress: 50, + message: "Processing..." +}) + +// Client-side progress handling +client.onprogress = (token, progress) => { + console.log(`Progress: ${progress.progress}%`) +} +``` + +### Resource Subscriptions +```typescript +// Server notifies resource changes +server.notifyResourceUpdated("file:///path/to/resource") + +// Client subscribes to resource +await client.subscribeResource("file:///path/to/resource") +``` + +## Quick Reference + +### Essential Imports +```typescript +// Client +import { Client } from '@modelcontextprotocol/typescript-sdk/client' +import { StdioClientTransport } from '@modelcontextprotocol/typescript-sdk/client/stdio' + +// Server +import { Server } from '@modelcontextprotocol/typescript-sdk/server' +import { StdioServerTransport } from '@modelcontextprotocol/typescript-sdk/server/stdio' + +// Types +import { ErrorCode, McpError } from '@modelcontextprotocol/typescript-sdk/types' + +// Transport +import { Transport } from '@modelcontextprotocol/typescript-sdk/shared/transport' +``` + +### Common Patterns +```typescript +// Client connection +const client = new Client({ name: 'client', version: '1.0.0' }) +await client.connect(new StdioClientTransport({ command: 'server' })) + +// Server setup +const server = new Server({ name: 'server', version: '1.0.0' }) +server.tool('echo', 'Echo input', async ({ text }) => ({ content: [{ type: 'text', text }] })) +await server.connect(new StdioServerTransport()) +``` diff --git a/generate-llm-docs.ts b/generate-llm-docs.ts new file mode 100644 index 000000000..e69de29bb diff --git a/package-lock.json b/package-lock.json index 254a8e71d..0475dab36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", + "ts-morph": "^26.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" }, @@ -1115,6 +1116,27 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1576,7 +1598,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1589,7 +1610,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -1598,7 +1618,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1641,6 +1660,32 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@ts-morph/common": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2498,7 +2543,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -2710,6 +2754,12 @@ "node": ">= 0.12.0" } }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "license": "MIT" + }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -3478,16 +3528,16 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -3497,7 +3547,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -3527,7 +3576,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -3587,7 +3635,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4123,7 +4170,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4150,7 +4196,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -4162,7 +4207,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -5083,7 +5127,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -5100,7 +5143,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -5368,6 +5410,12 @@ "node": ">= 0.8" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5419,7 +5467,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -5613,7 +5660,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -5747,7 +5793,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -5771,7 +5816,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -6221,7 +6265,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -6309,6 +6352,16 @@ "node": ">=10" } }, + "node_modules/ts-morph": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.27.0", + "code-block-writer": "^13.0.3" + } + }, "node_modules/tsx": { "version": "4.19.3", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", diff --git a/package.json b/package.json index 1bd2cea91..8d40e40db 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", + "ts-morph": "^26.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" },