@mcp-ts/sdk 1.6.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +12 -6
  2. package/dist/adapters/agui-adapter.d.mts +3 -3
  3. package/dist/adapters/agui-adapter.d.ts +3 -3
  4. package/dist/adapters/agui-adapter.js +4 -5
  5. package/dist/adapters/agui-adapter.js.map +1 -1
  6. package/dist/adapters/agui-adapter.mjs +4 -5
  7. package/dist/adapters/agui-adapter.mjs.map +1 -1
  8. package/dist/adapters/agui-middleware.d.mts +3 -3
  9. package/dist/adapters/agui-middleware.d.ts +3 -3
  10. package/dist/adapters/ai-adapter.d.mts +9 -3
  11. package/dist/adapters/ai-adapter.d.ts +9 -3
  12. package/dist/adapters/ai-adapter.js +20 -6
  13. package/dist/adapters/ai-adapter.js.map +1 -1
  14. package/dist/adapters/ai-adapter.mjs +20 -6
  15. package/dist/adapters/ai-adapter.mjs.map +1 -1
  16. package/dist/adapters/langchain-adapter.d.mts +3 -3
  17. package/dist/adapters/langchain-adapter.d.ts +3 -3
  18. package/dist/adapters/langchain-adapter.js +9 -6
  19. package/dist/adapters/langchain-adapter.js.map +1 -1
  20. package/dist/adapters/langchain-adapter.mjs +9 -6
  21. package/dist/adapters/langchain-adapter.mjs.map +1 -1
  22. package/dist/adapters/mastra-adapter.d.mts +1 -1
  23. package/dist/adapters/mastra-adapter.d.ts +1 -1
  24. package/dist/adapters/mastra-adapter.js +5 -1
  25. package/dist/adapters/mastra-adapter.js.map +1 -1
  26. package/dist/adapters/mastra-adapter.mjs +5 -1
  27. package/dist/adapters/mastra-adapter.mjs.map +1 -1
  28. package/dist/bin/mcp-ts.js +7 -1
  29. package/dist/bin/mcp-ts.js.map +1 -1
  30. package/dist/bin/mcp-ts.mjs +7 -1
  31. package/dist/bin/mcp-ts.mjs.map +1 -1
  32. package/dist/client/index.d.mts +2 -2
  33. package/dist/client/index.d.ts +2 -2
  34. package/dist/client/index.js +9 -13
  35. package/dist/client/index.js.map +1 -1
  36. package/dist/client/index.mjs +9 -13
  37. package/dist/client/index.mjs.map +1 -1
  38. package/dist/client/react.d.mts +7 -7
  39. package/dist/client/react.d.ts +7 -7
  40. package/dist/client/react.js +15 -19
  41. package/dist/client/react.js.map +1 -1
  42. package/dist/client/react.mjs +15 -19
  43. package/dist/client/react.mjs.map +1 -1
  44. package/dist/client/vue.d.mts +7 -7
  45. package/dist/client/vue.d.ts +7 -7
  46. package/dist/client/vue.js +14 -18
  47. package/dist/client/vue.js.map +1 -1
  48. package/dist/client/vue.mjs +14 -18
  49. package/dist/client/vue.mjs.map +1 -1
  50. package/dist/{index-DhA-OEAe.d.ts → index-C9gvpxy5.d.ts} +5 -5
  51. package/dist/{index-bFL4ZF2N.d.mts → index-eaH14_5u.d.mts} +5 -5
  52. package/dist/index.d.mts +6 -6
  53. package/dist/index.d.ts +6 -6
  54. package/dist/index.js +616 -370
  55. package/dist/index.js.map +1 -1
  56. package/dist/index.mjs +615 -370
  57. package/dist/index.mjs.map +1 -1
  58. package/dist/{multi-session-client-CHE8QpVE.d.ts → multi-session-client-BYtguGJm.d.ts} +22 -22
  59. package/dist/{multi-session-client-CQsRbxYI.d.mts → multi-session-client-DYNe6az3.d.mts} +22 -22
  60. package/dist/server/index.d.mts +31 -34
  61. package/dist/server/index.d.ts +31 -34
  62. package/dist/server/index.js +531 -256
  63. package/dist/server/index.js.map +1 -1
  64. package/dist/server/index.mjs +530 -256
  65. package/dist/server/index.mjs.map +1 -1
  66. package/dist/shared/index.d.mts +5 -5
  67. package/dist/shared/index.d.ts +5 -5
  68. package/dist/shared/index.js +76 -101
  69. package/dist/shared/index.js.map +1 -1
  70. package/dist/shared/index.mjs +76 -101
  71. package/dist/shared/index.mjs.map +1 -1
  72. package/dist/{tool-router-Dh2804tM.d.ts → tool-router-Ddtybmr0.d.ts} +71 -73
  73. package/dist/{tool-router-BVaV1udm.d.mts → tool-router-Dnd6IOKC.d.mts} +71 -73
  74. package/dist/{types-rIuN1CQi.d.mts → types-BCAG20P6.d.mts} +4 -4
  75. package/dist/{types-rIuN1CQi.d.ts → types-BCAG20P6.d.ts} +4 -4
  76. package/dist/{utils-0qmYrqoa.d.mts → utils-DELRKQPU.d.mts} +1 -1
  77. package/dist/{utils-0qmYrqoa.d.ts → utils-DELRKQPU.d.ts} +1 -1
  78. package/migrations/neon/20260513010000_install_mcp_sessions.sql +69 -0
  79. package/migrations/neon/20260513020000_add_session_cleanup_cron.sql +35 -0
  80. package/{supabase/migrations → migrations/supabase}/20260330195700_install_mcp_sessions.sql +7 -9
  81. package/package.json +14 -5
  82. package/src/adapters/ai-adapter.ts +30 -1
  83. package/src/adapters/langchain-adapter.ts +6 -2
  84. package/src/adapters/mastra-adapter.ts +6 -2
  85. package/src/bin/mcp-ts.ts +8 -1
  86. package/src/client/core/app-host.ts +1 -1
  87. package/src/client/core/sse-client.ts +12 -14
  88. package/src/client/core/types.ts +1 -1
  89. package/src/client/react/use-mcp-apps.tsx +1 -1
  90. package/src/client/react/use-mcp.ts +11 -11
  91. package/src/client/vue/use-mcp.ts +10 -10
  92. package/src/server/handlers/nextjs-handler.ts +18 -15
  93. package/src/server/handlers/sse-handler.ts +29 -29
  94. package/src/server/index.ts +1 -1
  95. package/src/server/mcp/multi-session-client.ts +17 -17
  96. package/src/server/mcp/oauth-client.ts +37 -37
  97. package/src/server/mcp/storage-oauth-provider.ts +17 -17
  98. package/src/server/storage/file-backend.ts +25 -25
  99. package/src/server/storage/index.ts +67 -10
  100. package/src/server/storage/memory-backend.ts +34 -34
  101. package/src/server/storage/neon-backend.ts +281 -0
  102. package/src/server/storage/redis-backend.ts +64 -64
  103. package/src/server/storage/sqlite-backend.ts +33 -33
  104. package/src/server/storage/supabase-backend.ts +23 -24
  105. package/src/server/storage/types.ts +18 -21
  106. package/src/shared/errors.ts +1 -1
  107. package/src/shared/index.ts +1 -2
  108. package/src/shared/meta-tools.ts +4 -6
  109. package/src/shared/schema-compressor.ts +2 -42
  110. package/src/shared/tool-index.ts +89 -84
  111. package/src/shared/tool-router.ts +0 -24
  112. package/src/shared/types.ts +4 -4
  113. /package/{supabase/migrations → migrations/supabase}/20260421010000_add_session_cleanup_cron.sql +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared/meta-tools.ts","../../src/adapters/langchain-adapter.ts"],"names":["limit","text","namespace"],"mappings":"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","file":"langchain-adapter.mjs","sourcesContent":["/**\n * Meta-tools — Injectable tool definitions that let the LLM discover and\n * load MCP tools on-demand, following Anthropic's Tool Search pattern.\n *\n * Instead of injecting 50+ full tool schemas into the context window, you\n * inject just these 4 meta-tools. The LLM calls them to find and load\n * only the tools it actually needs.\n *\n * Meta-tools:\n * • `mcp_search_tools` — Search/list available tools\n * • `mcp_search_tool_regex` — Regex pattern search\n * • `mcp_get_tool_schema` — Get full inputSchema for a discovered tool\n * • `mcp_execute_tool` — Execute a discovered tool\n *\n * @packageDocumentation\n */\n\nimport type { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { ToolRouter } from './tool-router.js';\nimport type { IndexedTool, ToolLookupOptions } from './tool-index.js';\n\n// ---------------------------------------------------------------------------\n// Tool Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `mcp_search_tools` tool definition.\n *\n * This tool lets the LLM search the full catalog of available MCP tools\n * using a BM25 natural-language query. Returns tool names and descriptions\n * without the full inputSchema to save context space.\n */\nexport function createSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tools',\n description:\n 'Search the catalog of available tools. Returns tool names, descriptions, and server info. ' +\n 'Use this FIRST to find relevant tools before calling them.\\n\\n' +\n 'Query forms:\\n' +\n '- \"select:Read,Edit,Grep\" — fetch these exact tools by name\\n' +\n '- \"notebook jupyter\" — keyword search, up to limit best matches\\n' +\n '- \"+slack send\" — require \"slack\" in the name, rank by remaining terms',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Query to find tools. Use \"select:<tool_name>\" for direct selection, or keywords to search. Prefix keywords with + to require them.',\n },\n operation: {\n type: 'string',\n enum: ['search', 'list'],\n description:\n 'Operation to perform. Use \"search\" to find relevant tools by capability. Use \"list\" with serverId or serverName when the user asks for every tool from a connected MCP server.',\n },\n serverId: {\n type: 'string',\n description: 'Optional server ID to restrict search/list results to one MCP server.',\n },\n serverName: {\n type: 'string',\n description:\n 'Optional server name fragment to restrict search/list results to matching MCP servers, e.g. \"supabase\".',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5 for search, 20 for list; max: 20 for search, 100 for list).',\n },\n cursor: {\n type: 'string',\n description: 'Optional pagination cursor returned by operation \"list\".',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_list_servers` tool definition.\n *\n * This tool lets the LLM inspect connected MCP servers before doing\n * server-scoped tool discovery.\n */\nexport function createListServersToolDefinition(): Tool {\n return {\n name: 'mcp_list_servers',\n description:\n 'List connected MCP servers and their tool counts. ' +\n 'Use this when mcp_search_tools returns no matches, then retry mcp_search_tools with serverId or serverName.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description:\n 'Optional server filter text. Matches server name or serverId, e.g. \"web\" or \"supabase\".',\n },\n },\n },\n };\n}\n\n/**\n * Creates the `mcp_search_tool_regex` tool definition.\n * \n * Matches Anthropic's tool_search_tool_regex exactly (takes a 'query' regex pattern).\n */\nexport function createRegexSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tool_regex',\n description:\n 'Search the catalog of available tools using a Python-style regex pattern. ' +\n 'Matches against tool names, descriptions, and parameter descriptions. ' +\n 'Example patterns: \"^github_\", \"weather\", \"(?i)slack\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Regex pattern to search for (e.g., \"^get_.*_data\", \"database\").',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5, max: 20).',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_get_tool_schema` tool definition.\n *\n * After discovering tools via `mcp_search_tools` or\n * `mcp_search_tool_regex`, the LLM calls this to load the full\n * inputSchema for a specific tool so it can construct the correct\n * arguments.\n */\nexport function createGetSchemaToolDefinition(): Tool {\n return {\n name: 'mcp_get_tool_schema',\n description:\n 'Get the full input schema (parameters) for a specific tool. ' +\n 'Call this after mcp_search_tools to get the parameter details ' +\n 'needed to call a tool correctly. ' +\n 'Do NOT call the discovered tool directly; after reading the schema, call mcp_execute_tool.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name returned by mcp_search_tools.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tools. Required if multiple tools have the same name.',\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n/**\n * Creates the `mcp_execute_tool` tool definition.\n *\n * This is the execution meta-tool — the LLM calls this to execute any\n * tool discovered via `mcp_search_tools` or `mcp_search_tool_regex`.\n * The LLM should first call `mcp_get_tool_schema` to know the correct\n * arguments.\n *\n * Instead of registering every real tool with the framework, we proxy\n * all execution through a single meta-tool.\n */\nexport function createExecuteToolDefinition(): Tool {\n return {\n name: 'mcp_execute_tool',\n description:\n 'Execute a tool that was discovered via mcp_search_tools. ' +\n 'You MUST call mcp_get_tool_schema first to know the correct parameters. ' +\n 'Pass the exact tool name and its arguments.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name from mcp_search_tools results.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tools. Required if multiple tools have the same name.',\n },\n args: {\n type: 'object',\n description:\n \"Arguments matching the tool's inputSchema. Omit or pass {} if the tool takes no parameters.\",\n additionalProperties: true,\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Meta-tool Executors\n// ---------------------------------------------------------------------------\n\n/**\n * Callback for executing a real MCP tool via the correct client.\n * Provided by adapters that wire up client routing.\n */\nexport type CallToolFn = (\n toolName: string,\n args: Record<string, unknown>,\n namespace?: string\n) => Promise<any>;\n\n/**\n * Execute a meta-tool call and return the result in MCP CallToolResult format.\n *\n * @param toolName - One of the meta-tool names (mcp_search_tools, mcp_list_servers, mcp_search_tool_regex, etc.)\n * @param args - The arguments from the LLM's tool call\n * @param router - The ToolRouter to query\n * @param callToolFn - Optional callback for executing real tools (required for mcp_execute_tool)\n * @returns MCP-compatible CallToolResult, or null if this isn't a meta-tool\n */\nexport async function executeMetaTool(\n toolName: string,\n args: Record<string, unknown>,\n router: ToolRouter,\n callToolFn?: CallToolFn\n): Promise<CallToolResult | null> {\n const resolveToolSchema = (\n name: string,\n namespace?: string,\n options?: ToolLookupOptions\n ): { tool?: IndexedTool; error?: CallToolResult } => {\n try {\n return { tool: router.getToolSchema(name, namespace, options) };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n error: {\n content: [{ type: 'text', text: errorMessage }],\n isError: true,\n },\n };\n }\n };\n\n switch (toolName) {\n case 'mcp_search_tools': {\n const query = String(args.query ?? '');\n const operation = String(args.operation ?? 'search');\n const serverId = String(args.serverId ?? '') || undefined;\n const serverName = String(args.serverName ?? '') || undefined;\n\n if (operation === 'list') {\n const limit = Math.min(Number(args.limit) || 20, 100);\n const cursor = String(args.cursor ?? '') || undefined;\n const result = await router.listTools({\n serverId,\n serverName: serverName ?? (!serverId && query ? query : undefined),\n limit,\n cursor,\n });\n\n const serverText = result.servers.length > 0\n ? result.servers\n .map((server) => `${server.serverName} (serverId: ${server.serverId}, tools: ${server.toolCount})`)\n .join(', ')\n : 'none';\n\n const lines: string[] = [\n 'operation: list',\n `servers: ${serverText}`,\n `totalCount: ${result.totalCount}`,\n `returnedCount: ${result.returnedCount}`,\n `nextCursor: ${result.nextCursor ?? 'null'}`,\n '',\n ];\n\n if (result.tools.length > 0) {\n lines.push(...formatToolSummaries(result.tools));\n } else {\n lines.push(\n serverId || serverName\n ? 'No tools found for the requested server scope.'\n : 'No tools found. Try operation \"search\" or provide serverId/serverName.'\n );\n }\n\n return {\n content: [{ type: 'text', text: lines.join('\\n') }],\n isError: false,\n };\n }\n\n const limit = Math.min(Number(args.limit) || 5, 20);\n const searchOptions = { serverId, serverName };\n\n // Fast path: Check for select: prefix\n const selectMatch = query.match(/^select:(.+)$/i);\n if (selectMatch) {\n await router.listTools({ serverId, serverName, limit: 1 });\n\n const requested = selectMatch[1]!\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\n const found: any[] = [];\n const errors: string[] = [];\n \n const namespace = serverId ?? serverName;\n\n for (const requestedToolName of requested) {\n const { tool, error } = resolveToolSchema(requestedToolName, namespace, {\n allowServerNameFragment: Boolean(serverName && !serverId),\n });\n if (error) {\n const errorMsg = error.content[0]?.type === 'text' ? error.content[0].text : 'Unknown error';\n errors.push(`- **${requestedToolName}**: ${errorMsg}`);\n } else if (tool) {\n found.push(tool);\n } else {\n errors.push(`- **${requestedToolName}**: Tool not found. Try searching with mcp_search_tools.`);\n }\n }\n\n const lines: string[] = [];\n\n if (found.length > 0) {\n lines.push(...found.map((t, i) =>\n `${i + 1}. **${t.name}** (server: ${t.serverName}, serverId: ${t.serverId})\\n ${t.description}`\n ));\n }\n \n if (errors.length > 0) {\n if (lines.length > 0) lines.push(\"\"); // Add empty line spacing\n lines.push(\"Errors resolving some tools:\");\n lines.push(...errors);\n }\n\n const text = lines.length > 0 \n ? lines.join('\\n') \n : `No tools found matching select query: ${requested.join(', ')}`;\n\n return {\n content: [{ type: 'text', text }],\n isError: found.length === 0,\n };\n }\n\n const results = await router.searchTools(query, limit, searchOptions);\n\n const text = results.length === 0\n ? 'No tools found matching your query. Call mcp_list_servers to inspect connected servers, then retry mcp_search_tools with serverId or serverName.'\n : formatToolSummaries(results).join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_list_servers': {\n const query = String(args.query ?? '').trim();\n const servers = await router.listServers({\n serverName: query || undefined,\n });\n\n const text = servers.length === 0\n ? 'No connected servers found.'\n : servers\n .map(\n (server, i) =>\n `${i + 1}. **${server.serverName}** (serverId: ${server.serverId}, sessionId: ${server.sessionId})\\n` +\n ` Tool count: ${server.toolCount}`\n )\n .join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_search_tool_regex': {\n const pattern = String(args.query ?? '');\n const limit = Math.min(Number(args.limit) || 5, 20);\n\n const results = await router.searchToolsRegex(pattern, limit);\n\n const text = results.length === 0\n ? 'No tools matched your regex pattern. Try a broader pattern.'\n : formatToolSummaries(results).join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_get_tool_schema': {\n const name = String(args.toolName ?? '');\n const namespace = String(args.serverId ?? '') || undefined;\n const { tool, error } = resolveToolSchema(name, namespace);\n\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${name}\" not found. Use mcp_search_tools to find available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n const schema = {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n executionInstructions: {\n nextTool: 'mcp_execute_tool',\n toolName: tool.name,\n serverId: tool.serverId,\n note:\n 'Do not call this discovered tool directly unless it was explicitly registered as a runtime tool. Execute it via mcp_execute_tool and pass these parameters inside args.',\n },\n };\n\n return {\n content: [{ type: 'text', text: JSON.stringify(schema, null, 2) }],\n isError: false,\n };\n }\n\n case 'mcp_execute_tool': {\n const targetToolName = String(args.toolName ?? '');\n const namespace = String(args.serverId ?? '') || undefined;\n const toolArgs = (args.args as Record<string, unknown>) ?? {};\n\n if (!targetToolName) {\n return {\n content: [{ type: 'text', text: 'Missing required parameter \"toolName\". Specify which tool to execute.' }],\n isError: true,\n };\n }\n\n // Verify the tool exists in our index\n const { tool, error } = resolveToolSchema(targetToolName, namespace);\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${targetToolName}\" not found. Use mcp_search_tools to discover available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n if (!callToolFn) {\n return {\n content: [{ type: 'text', text: 'Tool execution is not available. No callToolFn was configured.' }],\n isError: true,\n };\n }\n\n try {\n const result = await callToolFn(targetToolName, toolArgs, namespace);\n\n // Normalize result to text\n if (result && typeof result === 'object' && 'content' in result) {\n // Already MCP CallToolResult format\n return result as CallToolResult;\n }\n\n const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `Tool execution failed: ${errorMessage}` }],\n isError: true,\n };\n }\n }\n\n default:\n return null;\n }\n}\n\nfunction formatToolSummaries(\n tools: Array<{\n name: string;\n description: string;\n serverName: string;\n serverId: string;\n estimatedTokens: number;\n }>\n): string[] {\n return tools.map(\n (t, i) =>\n `${i + 1}. **${t.name}** (server: ${t.serverName}, serverId: ${t.serverId})\\n` +\n ` ${t.description}\\n` +\n ` Estimated tokens: ${t.estimatedTokens}`\n );\n}\n\n/** Check if a tool name is one of the meta-tools. */\nexport function isMetaTool(toolName: string): boolean {\n return (\n toolName === 'mcp_search_tools' ||\n toolName === 'mcp_list_servers' ||\n toolName === 'mcp_search_tool_regex' ||\n toolName === 'mcp_get_tool_schema' ||\n toolName === 'mcp_execute_tool'\n );\n}\n\n/**\n * Unwraps a meta-tool proxy call (like mcp_execute_tool) to find the real target tool name and arguments.\n * Also automatically strips routing prefixes like tool_{serverId}_.\n * \n * Useful for frontend components that need to determine the actual tool being executed by an AI agent.\n */\nexport function resolveMetaToolProxy(\n toolName: string,\n args: Record<string, unknown> | null | undefined\n): { toolName: string; args: Record<string, unknown> } {\n // Unwrap mcp_execute_tool proxy arguments\n if (toolName === 'mcp_execute_tool') {\n const innerName = args?.toolName;\n const innerArgs = args?.args;\n return {\n toolName: typeof innerName === 'string' && innerName ? innerName : toolName,\n args: innerArgs && typeof innerArgs === 'object' && !Array.isArray(innerArgs)\n ? (innerArgs as Record<string, unknown>)\n : {},\n };\n }\n\n // Strip tool_<serverId>_ prefix used by AIAdapter\n const match = toolName.match(/(?:tool_[^_]+_)?(.+)$/);\n const resolvedName = match?.[1] ?? toolName;\n\n return { toolName: resolvedName, args: args ?? {} };\n}\n\n","import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { DynamicStructuredTool, StructuredTool } from '@langchain/core/tools';\nimport type { z } from 'zod';\nimport { ToolRouter } from '../shared/tool-router.js';\nimport { executeMetaTool, isMetaTool } from '../shared/meta-tools.js';\n\nexport interface LangChainAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n\n /**\n * Whether to simplify error messages returned to the LLM.\n * If true, returns \"Error: <message>\" string instead of throwing.\n * @default false\n */\n simplifyErrors?: boolean;\n\n /**\n * Optional ToolRouter for intelligent tool selection.\n * See AIAdapterOptions.toolRouter for details.\n */\n toolRouter?: ToolRouter;\n}\n\n/**\n * Adapter to use MCP tools within LangChain/LangGraph agents.\n */\nexport class LangChainAdapter {\n private DynamicStructuredTool: typeof DynamicStructuredTool | undefined;\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: LangChainAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads LangChain and Zod dependencies\n */\n private async ensureDependencies() {\n if (!this.DynamicStructuredTool) {\n try {\n const langchain = await import('@langchain/core/tools');\n this.DynamicStructuredTool = langchain.DynamicStructuredTool as any;\n\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'LangChain dependencies not installed. Install with:\\n' +\n ' npm install @langchain/core zod'\n );\n }\n }\n }\n\n private async transformTools(client: MCPClient): Promise<StructuredTool[]> {\n if (!client.isConnected()) {\n return [];\n }\n\n await this.ensureDependencies();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n\n return result.tools.map((tool) => {\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n return new this.DynamicStructuredTool!({\n name: `${prefix}_${tool.name}`,\n description: tool.description || `Tool ${tool.name}`,\n schema: schema,\n func: async (args: any) => {\n try {\n return await client.callTool(tool.name, args);\n } catch (error: any) {\n if (this.options.simplifyErrors) {\n return `Error: ${error.message}`;\n }\n throw error;\n }\n },\n });\n });\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error) {\n // Fallback: Accept any object if conversion fails\n console.warn('[LangChainAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to LangChain StructuredTools.\n */\n async getTools(): Promise<StructuredTool[]> {\n // If a ToolRouter is provided, use its filtered output\n if (this.options.toolRouter) {\n return this.getToolsViaRouter(this.options.toolRouter);\n }\n\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[LangChainAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return [];\n }\n })\n );\n return results.flat();\n }\n\n /**\n * Build StructuredTools from a ToolRouter's filtered output.\n *\n * In `search` strategy, only meta-tools are registered with the framework.\n * Real tool execution is proxied through `mcp_execute_tool` which uses\n * `router.callTool()` to route to the correct MCP client.\n */\n private async getToolsViaRouter(router: ToolRouter): Promise<StructuredTool[]> {\n await this.ensureDependencies();\n\n const filteredTools = await router.getFilteredTools();\n\n return filteredTools.map((tool) => {\n const routedTool = tool as typeof tool & { sessionId?: string; serverId?: string; serverName?: string };\n const namespace = routedTool.serverId ?? routedTool.sessionId;\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n return new this.DynamicStructuredTool!({\n name: isMetaTool(tool.name)\n ? tool.name\n : this.getRouterToolKey(tool.name, routedTool.sessionId, routedTool.serverId),\n description: tool.description || `Tool ${tool.name}`,\n schema: schema,\n func: async (args: any) => {\n try {\n // Handle meta-tool calls via the router\n if (isMetaTool(tool.name)) {\n const result = await executeMetaTool(\n tool.name,\n args,\n router,\n (name, toolArgs, namespace) => router.callTool(name, toolArgs, namespace)\n );\n if (result) {\n return result.content.map((c: any) => c.text ?? '').join('\\n');\n }\n }\n\n // For non-meta tools in 'all' or 'groups' strategy,\n // route directly to the correct MCP client\n return await router.callTool(tool.name, args, namespace);\n } catch (error: any) {\n if (this.options.simplifyErrors) {\n return `Error: ${error.message}`;\n }\n throw error;\n }\n },\n });\n });\n }\n\n private getRouterToolKey(toolName: string, sessionId?: string, serverId?: string): string {\n const namespace = sessionId ?? serverId ?? 'mcp';\n const normalized = namespace\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '') || 'mcp';\n return `tool_${normalized}_${toolName}`;\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: LangChainAdapterOptions = {}): Promise<StructuredTool[]> {\n return new LangChainAdapter(client, options).getTools();\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/shared/meta-tools.ts","../../src/adapters/langchain-adapter.ts"],"names":["limit","text","namespace"],"mappings":";;;;;;;;;;;AAuOA,eAAsB,eAAA,CACpB,QAAA,EACA,IAAA,EACA,MAAA,EACA,UAAA,EACgC;AAChC,EAAA,MAAM,iBAAA,GAAoB,CACxB,IAAA,EACA,SAAA,EACA,OAAA,KACmD;AACnD,IAAA,IAAI;AACF,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,cAAc,IAAA,EAAM,SAAA,EAAW,OAAO,CAAA,EAAE;AAAA,IAChE,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,eAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACpE,MAAA,OAAO;AAAA,QACL,KAAA,EAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,cAAc,CAAA;AAAA,UAC9C,OAAA,EAAS;AAAA;AACX,OACF;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,kBAAA,EAAoB;AACvB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AACrC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,SAAA,IAAa,QAAQ,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA,IAAK,MAAA;AAChD,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA,IAAK,MAAA;AAEpD,MAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,QAAA,MAAMA,MAAAA,GAAQ,KAAK,GAAA,CAAI,MAAA,CAAO,KAAK,KAAK,CAAA,IAAK,IAAI,GAAG,CAAA;AACpD,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA,IAAK,MAAA;AAC5C,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,CAAU;AAAA,UACpC,QAAA;AAAA,UACA,UAAA,EAAY,UAAA,KAAe,CAAC,QAAA,IAAY,QAAQ,KAAA,GAAQ,MAAA,CAAA;AAAA,UACxD,KAAA,EAAAA,MAAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,UAAA,GAAa,OAAO,OAAA,CAAQ,MAAA,GAAS,IACvC,MAAA,CAAO,OAAA,CACJ,GAAA,CAAI,CAAC,MAAA,KAAW,CAAA,EAAG,OAAO,UAAU,CAAA,YAAA,EAAe,MAAA,CAAO,QAAQ,CAAA,SAAA,EAAY,MAAA,CAAO,SAAS,CAAA,CAAA,CAAG,CAAA,CACjG,IAAA,CAAK,IAAI,CAAA,GACZ,MAAA;AAEJ,QAAA,MAAM,KAAA,GAAkB;AAAA,UACtB,iBAAA;AAAA,UACA,YAAY,UAAU,CAAA,CAAA;AAAA,UACtB,CAAA,YAAA,EAAe,OAAO,UAAU,CAAA,CAAA;AAAA,UAChC,CAAA,eAAA,EAAkB,OAAO,aAAa,CAAA,CAAA;AAAA,UACtC,CAAA,YAAA,EAAe,MAAA,CAAO,UAAA,IAAc,MAAM,CAAA,CAAA;AAAA,UAC1C;AAAA,SACF;AAEA,QAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC3B,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,mBAAA,CAAoB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACjD,CAAA,MAAO;AACL,UAAA,KAAA,CAAM,IAAA;AAAA,YACJ,QAAA,IAAY,aACR,gDAAA,GACA;AAAA,WACN;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA;AAAA,UAClD,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,MAAA,CAAO,KAAK,KAAK,CAAA,IAAK,GAAG,EAAE,CAAA;AAClD,MAAA,MAAM,aAAA,GAAgB,EAAE,QAAA,EAAU,UAAA,EAAW;AAG7C,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,gBAAgB,CAAA;AAChD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,OAAO,SAAA,CAAU,EAAE,UAAU,UAAA,EAAY,KAAA,EAAO,GAAG,CAAA;AAEzD,QAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,CAAA,CAC5B,MAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AAEjB,QAAA,MAAM,QAAe,EAAC;AACtB,QAAA,MAAM,SAAmB,EAAC;AAE1B,QAAA,MAAM,YAAY,QAAA,IAAY,UAAA;AAE9B,QAAA,KAAA,MAAW,qBAAqB,SAAA,EAAW;AACzC,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,iBAAA,CAAkB,mBAAmB,SAAA,EAAW;AAAA,YACtE,uBAAA,EAAyB,OAAA,CAAQ,UAAA,IAAc,CAAC,QAAQ;AAAA,WACzD,CAAA;AACD,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,IAAA,KAAS,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,GAAO,eAAA;AAC7E,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,IAAA,EAAO,iBAAiB,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,UACvD,WAAW,IAAA,EAAM;AACf,YAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,UACjB,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,IAAA,EAAO,iBAAiB,CAAA,wDAAA,CAA0D,CAAA;AAAA,UAChG;AAAA,QACF;AAEA,QAAA,MAAM,QAAkB,EAAC;AAEzB,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAA,CAAM,GAAA;AAAA,YAAI,CAAC,CAAA,EAAG,CAAA,KAC1B,CAAA,EAAG,IAAI,CAAC,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,gBAAA,EAAmB,CAAA,CAAE,UAAU,CAAA,YAAA,EAAe,EAAE,QAAQ,CAAA;AAAA,GAAA,EAAS,EAAE,WAAW,CAAA;AAAA,WACpG,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAK,EAAE,CAAA;AACnC,UAAA,KAAA,CAAM,KAAK,8BAA8B,CAAA;AACzC,UAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,QACtB;AAEA,QAAA,MAAMC,KAAAA,GAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GACxB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GACf,CAAA,sCAAA,EAAyC,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAEjE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAAA,OAAM,CAAA;AAAA,UAChC,OAAA,EAAS,MAAM,MAAA,KAAW;AAAA,SAC5B;AAAA,MACF;AAEA,MAAA,MAAM,UAAU,MAAM,MAAA,CAAO,WAAA,CAAY,KAAA,EAAO,OAAO,aAAa,CAAA;AAEpE,MAAA,MAAM,IAAA,GAAO,QAAQ,MAAA,KAAW,CAAA,GAC5B,qJACA,mBAAA,CAAoB,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE1C,MAAA,OAAO;AAAA,QACL,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,QAChC,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,IAEA,KAAK,kBAAA,EAAoB;AACvB,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,EAAE,IAAA,EAAK;AAC5C,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,WAAA,CAAY;AAAA,QACvC,YAAY,KAAA,IAAS;AAAA,OACtB,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,GAC5B,gCACA,OAAA,CACG,GAAA;AAAA,QACC,CAAC,MAAA,EAAQ,CAAA,KACP,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,IAAA,EAAO,MAAA,CAAO,UAAU,CAAA,cAAA,EAAiB,MAAA,CAAO,QAAQ,CAAA;AAAA,eAAA,EAC9C,OAAO,SAAS,CAAA;AAAA,OACtC,CACC,KAAK,IAAI,CAAA;AAEhB,MAAA,OAAO;AAAA,QACL,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,QAChC,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,IAEA,KAAK,uBAAA,EAAyB;AAC5B,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AACvC,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,MAAA,CAAO,KAAK,KAAK,CAAA,IAAK,GAAG,EAAE,CAAA;AAElD,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,gBAAA,CAAiB,SAAS,KAAK,CAAA;AAE5D,MAAA,MAAM,IAAA,GAAO,QAAQ,MAAA,KAAW,CAAA,GAC5B,gEACA,mBAAA,CAAoB,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE1C,MAAA,OAAO;AAAA,QACL,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,QAChC,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,IAEA,KAAK,qBAAA,EAAuB;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA;AACvC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA,IAAK,MAAA;AACjD,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,iBAAA,CAAkB,MAAM,SAAS,CAAA;AAEzD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,SAAS,IAAI,CAAA,gEAAA;AAAA;AACrB,WACF;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,qBAAA,EAAuB;AAAA,UACrB,QAAA,EAAU,kBAAA;AAAA,UACV,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,IAAA,EACE;AAAA;AACJ,OACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,QACjE,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,IAEA,KAAK,kBAAA,EAAoB;AACvB,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA;AACjD,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA,IAAK,MAAA;AACjD,MAAA,MAAM,QAAA,GAAY,IAAA,CAAK,IAAA,IAAoC,EAAC;AAE5D,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,yEAAyE,CAAA;AAAA,UACzG,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAGA,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,iBAAA,CAAkB,gBAAgB,SAAS,CAAA;AACnE,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,YACP;AAAA,cACE,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,SAAS,cAAc,CAAA,oEAAA;AAAA;AAC/B,WACF;AAAA,UACA,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,kEAAkE,CAAA;AAAA,UAClG,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,cAAA,EAAgB,UAAU,SAAS,CAAA;AAGnE,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,aAAa,MAAA,EAAQ;AAE/D,UAAA,OAAO,MAAA;AAAA,QACT;AAEA,QAAA,MAAM,IAAA,GAAO,OAAO,MAAA,KAAW,QAAA,GAAW,SAAS,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AACjF,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAAA,UAChC,OAAA,EAAS;AAAA,SACX;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,eAAe,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACpE,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,CAAA,uBAAA,EAA0B,YAAY,CAAA,CAAA,EAAI,CAAA;AAAA,UAC1E,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,IAEA;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,oBACP,KAAA,EAMU;AACV,EAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IACX,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,EAAG,IAAI,CAAC,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,gBAAA,EAAmB,CAAA,CAAE,UAAU,CAAA,YAAA,EAAe,EAAE,QAAQ,CAAA;AAAA,GAAA,EACvE,EAAE,WAAW,CAAA;AAAA,GACvB;AACF;AAGO,SAAS,WAAW,QAAA,EAA2B;AACpD,EAAA,OACE,QAAA,KAAa,sBACb,QAAA,KAAa,kBAAA,IACb,aAAa,uBAAA,IACb,QAAA,KAAa,yBACb,QAAA,KAAa,kBAAA;AAEjB;;;AC3fO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAI1B,WAAA,CACY,MAAA,EACA,OAAA,GAAmC,EAAC,EAC9C;AAFU,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AALZ,IAAA,aAAA,CAAA,IAAA,EAAQ,uBAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,GAAA,CAAA;AAAA,EAKJ;AAAA;AAAA;AAAA;AAAA,EAKJ,MAAc,kBAAA,GAAqB;AAC/B,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC7B,MAAA,IAAI;AACA,QAAA,MAAM,SAAA,GAAY,MAAM,OAAO,uBAAuB,CAAA;AACtD,QAAA,IAAA,CAAK,wBAAwB,SAAA,CAAU,qBAAA;AAEvC,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA;AAAA,MACjB,SAAS,KAAA,EAAO;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACN;AAAA,SAEJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,eAAe,MAAA,EAA8C;AACvE,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,OAAO,WAAA,EAAY,EAAG,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,IAAK,KAAA;AAEjG,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAE9B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA;AAEpD,MAAA,OAAO,IAAI,KAAK,qBAAA,CAAuB;AAAA,QACnC,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,QAC5B,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,CAAA,KAAA,EAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,QAClD,MAAA;AAAA,QACA,IAAA,EAAM,OAAO,IAAA,KAAc;AACvB,UAAA,IAAI;AACA,YAAA,OAAO,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,UAChD,SAAS,KAAA,EAAY;AACjB,YAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAC7B,cAAA,OAAO,CAAA,OAAA,EAAU,MAAM,OAAO,CAAA,CAAA;AAAA,YAClC;AACA,YAAA,MAAM,KAAA;AAAA,UACV;AAAA,QACJ;AAAA,OACH,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,gBAAgB,MAAA,EAA6B;AACjD,IAAA,IAAI;AACA,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,SAAA,CAAQ,oBAAoB,CAAA;AACpD,MAAA,MAAM,eAAA,GAAkB,YAAY,MAAM,CAAA;AAE1C,MAAA,OAAO,IAAI,QAAA,CAAS,GAAA,EAAK,YAAY,eAAe,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAChE,SAAS,KAAA,EAAY;AAEjB,MAAA,IAAI,KAAA,CAAM,SAAS,kBAAA,EAAoB;AACnC,QAAA,OAAA,CAAQ,KAAK,mIAAmI,CAAA;AAAA,MACpJ,CAAA,MAAO;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,4EAA4E,KAAK,CAAA;AAAA,MAClG;AACA,MAAA,OAAO,IAAA,CAAK,CAAA,CAAG,MAAA,CAAO,IAAA,CAAK,CAAA,CAAG,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,IAC5E;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAAsC;AAExC,IAAA,IAAI,IAAA,CAAK,QAAQ,UAAA,EAAY;AACzB,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAAA,IACzD;AAGA,IAAA,MAAM,cAAA,GAAiB,OAAQ,IAAA,CAAK,MAAA,CAAe,UAAA,KAAe,UAAA;AAClE,IAAA,MAAM,OAAA,GAAU,iBACT,IAAA,CAAK,MAAA,CAA8B,YAAW,GAC/C,CAAC,KAAK,MAAmB,CAAA;AAE/B,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC1B,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAA,KAAW;AAC1B,QAAA,IAAI;AACA,UAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAAA,QAC3C,SAAS,KAAA,EAAO;AACZ,UAAA,OAAA,CAAQ,MAAM,CAAA,8CAAA,EAAiD,MAAA,CAAO,WAAA,EAAa,KAAK,KAAK,CAAA;AAC7F,UAAA,OAAO,EAAC;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,KACL;AACA,IAAA,OAAO,QAAQ,IAAA,EAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,kBAAkB,MAAA,EAA+C;AAC3E,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAE9B,IAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,gBAAA,EAAiB;AAEpD,IAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,QAAA,IAAY,UAAA,CAAW,SAAA;AACpD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA;AAEpD,MAAA,OAAO,IAAI,KAAK,qBAAA,CAAuB;AAAA,QACnC,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,IAAI,IACpB,IAAA,CAAK,IAAA,GACL,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,UAAA,CAAW,SAAA,EAAW,WAAW,QAAQ,CAAA;AAAA,QAChF,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,CAAA,KAAA,EAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,QAClD,MAAA;AAAA,QACA,IAAA,EAAM,OAAO,IAAA,KAAc;AACvB,UAAA,IAAI;AAEA,YAAA,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAG;AACvB,cAAA,MAAM,SAAS,MAAM,eAAA;AAAA,gBACjB,IAAA,CAAK,IAAA;AAAA,gBACL,IAAA;AAAA,gBACA,MAAA;AAAA,gBACA,CAAC,MAAM,QAAA,EAAUC,UAAAA,KAAc,OAAO,QAAA,CAAS,IAAA,EAAM,UAAUA,UAAS;AAAA,eAC5E;AACA,cAAA,IAAI,MAAA,EAAQ;AACR,gBAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,cACjE;AAAA,YACJ;AAIA,YAAA,OAAO,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,MAAM,SAAS,CAAA;AAAA,UAC3D,SAAS,KAAA,EAAY;AACjB,YAAA,IAAI,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAC7B,cAAA,OAAO,CAAA,OAAA,EAAU,MAAM,OAAO,CAAA,CAAA;AAAA,YAClC;AACA,YAAA,MAAM,KAAA;AAAA,UACV;AAAA,QACJ;AAAA,OACH,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,gBAAA,CAAiB,QAAA,EAAkB,SAAA,EAAoB,QAAA,EAA2B;AACtF,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,IAAY,KAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,SAAA,CACd,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,IAAK,KAAA;AAChC,IAAA,OAAO,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,CAAS,MAAA,EAAwC,OAAA,GAAmC,EAAC,EAA8B;AAC5H,IAAA,OAAO,IAAI,iBAAA,CAAiB,MAAA,EAAQ,OAAO,EAAE,QAAA,EAAS;AAAA,EAC1D;AACJ","file":"langchain-adapter.mjs","sourcesContent":["/**\n * Meta-tools — Injectable tool definitions that let the LLM discover and\n * load MCP tools on-demand, following Anthropic's Tool Search pattern.\n *\n * Instead of injecting 50+ full tool schemas into the context window, you\n * inject just these 4 meta-tools. The LLM calls them to find and load\n * only the tools it actually needs.\n *\n * Meta-tools:\n * • `mcp_search_tools` — Search/list available tools\n * • `mcp_search_tool_regex` — Regex pattern search\n * • `mcp_get_tool_schema` — Get full inputSchema for a discovered tool\n * • `mcp_execute_tool` — Execute a discovered tool\n *\n * @packageDocumentation\n */\n\nimport type { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { ToolRouter } from './tool-router.js';\nimport type { IndexedTool, ToolLookupOptions } from './tool-index.js';\n\n// ---------------------------------------------------------------------------\n// Tool Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `mcp_search_tools` tool definition.\n *\n * This tool lets the LLM search the full catalog of available MCP tools\n * using a BM25 natural-language query. Returns tool names and descriptions\n * without the full inputSchema to save context space.\n */\nexport function createSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tools',\n description:\n 'Search the catalog of available tools. Returns tool names, descriptions, and server info. ' +\n 'Use this FIRST to find relevant tools before calling them.\\n\\n' +\n 'Query forms:\\n' +\n '- \"select:Read,Edit,Grep\" — fetch these exact tools by name\\n' +\n '- \"notebook jupyter\" — keyword search, up to limit best matches\\n' +\n '- \"+slack send\" — require \"slack\" in the name, rank by remaining terms',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Query to find tools. Use \"select:<tool_name>\" for direct selection, or keywords to search. Prefix keywords with + to require them.',\n },\n operation: {\n type: 'string',\n enum: ['search', 'list'],\n description:\n 'Operation to perform. Use \"search\" to find relevant tools by capability. Use \"list\" with serverId or serverName when the user asks for every tool from a connected MCP server.',\n },\n serverId: {\n type: 'string',\n description: 'Optional server ID to restrict search/list results to one MCP server.',\n },\n serverName: {\n type: 'string',\n description:\n 'Optional server name fragment to restrict search/list results to matching MCP servers, e.g. \"supabase\".',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5 for search, 20 for list; max: 20 for search, 100 for list).',\n },\n cursor: {\n type: 'string',\n description: 'Optional pagination cursor returned by operation \"list\".',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_list_servers` tool definition.\n *\n * This tool lets the LLM inspect connected MCP servers before doing\n * server-scoped tool discovery.\n */\nexport function createListServersToolDefinition(): Tool {\n return {\n name: 'mcp_list_servers',\n description:\n 'List connected MCP servers and their tool counts. ' +\n 'Use this when mcp_search_tools returns no matches, then retry mcp_search_tools with serverId or serverName.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description:\n 'Optional server filter text. Matches server name or serverId, e.g. \"web\" or \"supabase\".',\n },\n },\n },\n };\n}\n\n/**\n * Creates the `mcp_search_tool_regex` tool definition.\n * \n * Matches Anthropic's tool_search_tool_regex exactly (takes a 'query' regex pattern).\n */\nexport function createRegexSearchToolDefinition(): Tool {\n return {\n name: 'mcp_search_tool_regex',\n description:\n 'Search the catalog of available tools using a Python-style regex pattern. ' +\n 'Matches against tool names, descriptions, and parameter descriptions. ' +\n 'Example patterns: \"^github_\", \"weather\", \"(?i)slack\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Regex pattern to search for (e.g., \"^get_.*_data\", \"database\").',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 5, max: 20).',\n },\n },\n required: ['query'],\n },\n };\n}\n\n/**\n * Creates the `mcp_get_tool_schema` tool definition.\n *\n * After discovering tools via `mcp_search_tools` or\n * `mcp_search_tool_regex`, the LLM calls this to load the full\n * inputSchema for a specific tool so it can construct the correct\n * arguments.\n */\nexport function createGetSchemaToolDefinition(): Tool {\n return {\n name: 'mcp_get_tool_schema',\n description:\n 'Get the full input schema (parameters) for a specific tool. ' +\n 'Call this after mcp_search_tools to get the parameter details ' +\n 'needed to call a tool correctly. ' +\n 'Do NOT call the discovered tool directly; after reading the schema, call mcp_execute_tool.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name returned by mcp_search_tools.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tools. Required if multiple tools have the same name.',\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n/**\n * Creates the `mcp_execute_tool` tool definition.\n *\n * This is the execution meta-tool — the LLM calls this to execute any\n * tool discovered via `mcp_search_tools` or `mcp_search_tool_regex`.\n * The LLM should first call `mcp_get_tool_schema` to know the correct\n * arguments.\n *\n * Instead of registering every real tool with the framework, we proxy\n * all execution through a single meta-tool.\n */\nexport function createExecuteToolDefinition(): Tool {\n return {\n name: 'mcp_execute_tool',\n description:\n 'Execute a tool that was discovered via mcp_search_tools. ' +\n 'You MUST call mcp_get_tool_schema first to know the correct parameters. ' +\n 'Pass the exact tool name and its arguments.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name from mcp_search_tools results.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tools. Required if multiple tools have the same name.',\n },\n args: {\n type: 'object',\n description:\n \"Arguments matching the tool's inputSchema. Omit or pass {} if the tool takes no parameters.\",\n additionalProperties: true,\n },\n },\n required: ['toolName'],\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Meta-tool Executors\n// ---------------------------------------------------------------------------\n\n/**\n * Callback for executing a real MCP tool via the correct client.\n * Provided by adapters that wire up client routing.\n */\nexport type CallToolFn = (\n toolName: string,\n args: Record<string, unknown>,\n namespace?: string\n) => Promise<any>;\n\n/**\n * Execute a meta-tool call and return the result in MCP CallToolResult format.\n *\n * @param toolName - One of the meta-tool names (mcp_search_tools, mcp_list_servers, mcp_search_tool_regex, etc.)\n * @param args - The arguments from the LLM's tool call\n * @param router - The ToolRouter to query\n * @param callToolFn - Optional callback for executing real tools (required for mcp_execute_tool)\n * @returns MCP-compatible CallToolResult, or null if this isn't a meta-tool\n */\nexport async function executeMetaTool(\n toolName: string,\n args: Record<string, unknown>,\n router: ToolRouter,\n callToolFn?: CallToolFn\n): Promise<CallToolResult | null> {\n const resolveToolSchema = (\n name: string,\n namespace?: string,\n options?: ToolLookupOptions\n ): { tool?: IndexedTool; error?: CallToolResult } => {\n try {\n return { tool: router.getToolSchema(name, namespace, options) };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n error: {\n content: [{ type: 'text', text: errorMessage }],\n isError: true,\n },\n };\n }\n };\n\n switch (toolName) {\n case 'mcp_search_tools': {\n const query = String(args.query ?? '');\n const operation = String(args.operation ?? 'search');\n const serverId = String(args.serverId ?? '') || undefined;\n const serverName = String(args.serverName ?? '') || undefined;\n\n if (operation === 'list') {\n const limit = Math.min(Number(args.limit) || 20, 100);\n const cursor = String(args.cursor ?? '') || undefined;\n const result = await router.listTools({\n serverId,\n serverName: serverName ?? (!serverId && query ? query : undefined),\n limit,\n cursor,\n });\n\n const serverText = result.servers.length > 0\n ? result.servers\n .map((server) => `${server.serverName} (serverId: ${server.serverId}, tools: ${server.toolCount})`)\n .join(', ')\n : 'none';\n\n const lines: string[] = [\n 'operation: list',\n `servers: ${serverText}`,\n `totalCount: ${result.totalCount}`,\n `returnedCount: ${result.returnedCount}`,\n `nextCursor: ${result.nextCursor ?? 'null'}`,\n '',\n ];\n\n if (result.tools.length > 0) {\n lines.push(...formatToolSummaries(result.tools));\n } else {\n lines.push(\n serverId || serverName\n ? 'No tools found for the requested server scope.'\n : 'No tools found. Try operation \"search\" or provide serverId/serverName.'\n );\n }\n\n return {\n content: [{ type: 'text', text: lines.join('\\n') }],\n isError: false,\n };\n }\n\n const limit = Math.min(Number(args.limit) || 5, 20);\n const searchOptions = { serverId, serverName };\n\n // Fast path: Check for select: prefix\n const selectMatch = query.match(/^select:(.+)$/i);\n if (selectMatch) {\n await router.listTools({ serverId, serverName, limit: 1 });\n\n const requested = selectMatch[1]!\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n\n const found: any[] = [];\n const errors: string[] = [];\n \n const namespace = serverId ?? serverName;\n\n for (const requestedToolName of requested) {\n const { tool, error } = resolveToolSchema(requestedToolName, namespace, {\n allowServerNameFragment: Boolean(serverName && !serverId),\n });\n if (error) {\n const errorMsg = error.content[0]?.type === 'text' ? error.content[0].text : 'Unknown error';\n errors.push(`- **${requestedToolName}**: ${errorMsg}`);\n } else if (tool) {\n found.push(tool);\n } else {\n errors.push(`- **${requestedToolName}**: Tool not found. Try searching with mcp_search_tools.`);\n }\n }\n\n const lines: string[] = [];\n\n if (found.length > 0) {\n lines.push(...found.map((t, i) =>\n `${i + 1}. **${t.name}** (serverName: ${t.serverName}, serverId: ${t.serverId})\\n ${t.description}`\n ));\n }\n \n if (errors.length > 0) {\n if (lines.length > 0) lines.push(\"\"); // Add empty line spacing\n lines.push(\"Errors resolving some tools:\");\n lines.push(...errors);\n }\n\n const text = lines.length > 0 \n ? lines.join('\\n') \n : `No tools found matching select query: ${requested.join(', ')}`;\n\n return {\n content: [{ type: 'text', text }],\n isError: found.length === 0,\n };\n }\n\n const results = await router.searchTools(query, limit, searchOptions);\n\n const text = results.length === 0\n ? 'No tools found matching your query. Call mcp_list_servers to inspect connected servers, then retry mcp_search_tools with serverId or serverName.'\n : formatToolSummaries(results).join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_list_servers': {\n const query = String(args.query ?? '').trim();\n const servers = await router.listServers({\n serverName: query || undefined,\n });\n\n const text = servers.length === 0\n ? 'No connected servers found.'\n : servers\n .map(\n (server, i) =>\n `${i + 1}. **${server.serverName}** (serverId: ${server.serverId})\\n` +\n ` Tool count: ${server.toolCount}`\n )\n .join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_search_tool_regex': {\n const pattern = String(args.query ?? '');\n const limit = Math.min(Number(args.limit) || 5, 20);\n\n const results = await router.searchToolsRegex(pattern, limit);\n\n const text = results.length === 0\n ? 'No tools matched your regex pattern. Try a broader pattern.'\n : formatToolSummaries(results).join('\\n');\n\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n }\n\n case 'mcp_get_tool_schema': {\n const name = String(args.toolName ?? '');\n const namespace = String(args.serverId ?? '') || undefined;\n const { tool, error } = resolveToolSchema(name, namespace);\n\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${name}\" not found. Use mcp_search_tools to find available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n const schema = {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n executionInstructions: {\n nextTool: 'mcp_execute_tool',\n toolName: tool.name,\n serverId: tool.serverId,\n note:\n 'Do not call this discovered tool directly unless it was explicitly registered as a runtime tool. Execute it via mcp_execute_tool and pass these parameters inside args.',\n },\n };\n\n return {\n content: [{ type: 'text', text: JSON.stringify(schema, null, 2) }],\n isError: false,\n };\n }\n\n case 'mcp_execute_tool': {\n const targetToolName = String(args.toolName ?? '');\n const namespace = String(args.serverId ?? '') || undefined;\n const toolArgs = (args.args as Record<string, unknown>) ?? {};\n\n if (!targetToolName) {\n return {\n content: [{ type: 'text', text: 'Missing required parameter \"toolName\". Specify which tool to execute.' }],\n isError: true,\n };\n }\n\n // Verify the tool exists in our index\n const { tool, error } = resolveToolSchema(targetToolName, namespace);\n if (error) {\n return error;\n }\n\n if (!tool) {\n return {\n content: [\n {\n type: 'text',\n text: `Tool \"${targetToolName}\" not found. Use mcp_search_tools to discover available tools first.`,\n },\n ],\n isError: true,\n };\n }\n\n if (!callToolFn) {\n return {\n content: [{ type: 'text', text: 'Tool execution is not available. No callToolFn was configured.' }],\n isError: true,\n };\n }\n\n try {\n const result = await callToolFn(targetToolName, toolArgs, namespace);\n\n // Normalize result to text\n if (result && typeof result === 'object' && 'content' in result) {\n // Already MCP CallToolResult format\n return result as CallToolResult;\n }\n\n const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n return {\n content: [{ type: 'text', text }],\n isError: false,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `Tool execution failed: ${errorMessage}` }],\n isError: true,\n };\n }\n }\n\n default:\n return null;\n }\n}\n\nfunction formatToolSummaries(\n tools: Array<{\n name: string;\n description: string;\n serverName: string;\n serverId: string;\n }>\n): string[] {\n return tools.map(\n (t, i) =>\n `${i + 1}. **${t.name}** (serverName: ${t.serverName}, serverId: ${t.serverId})\\n` +\n ` ${t.description}`\n );\n}\n\n/** Check if a tool name is one of the meta-tools. */\nexport function isMetaTool(toolName: string): boolean {\n return (\n toolName === 'mcp_search_tools' ||\n toolName === 'mcp_list_servers' ||\n toolName === 'mcp_search_tool_regex' ||\n toolName === 'mcp_get_tool_schema' ||\n toolName === 'mcp_execute_tool'\n );\n}\n\n/**\n * Unwraps a meta-tool proxy call (like mcp_execute_tool) to find the real target tool name and arguments.\n * Also automatically strips routing prefixes like tool_{serverId}_.\n * \n * Useful for frontend components that need to determine the actual tool being executed by an AI agent.\n */\nexport function resolveMetaToolProxy(\n toolName: string,\n args: Record<string, unknown> | null | undefined\n): { toolName: string; args: Record<string, unknown> } {\n // Unwrap mcp_execute_tool proxy arguments\n if (toolName === 'mcp_execute_tool') {\n const innerName = args?.toolName;\n const innerArgs = args?.args;\n return {\n toolName: typeof innerName === 'string' && innerName ? innerName : toolName,\n args: innerArgs && typeof innerArgs === 'object' && !Array.isArray(innerArgs)\n ? (innerArgs as Record<string, unknown>)\n : {},\n };\n }\n\n // Strip tool_<serverId>_ prefix used by AIAdapter\n const match = toolName.match(/(?:tool_[^_]+_)?(.+)$/);\n const resolvedName = match?.[1] ?? toolName;\n\n return { toolName: resolvedName, args: args ?? {} };\n}\n\n","import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { DynamicStructuredTool, StructuredTool } from '@langchain/core/tools';\nimport type { z } from 'zod';\nimport { ToolRouter } from '../shared/tool-router.js';\nimport { executeMetaTool, isMetaTool } from '../shared/meta-tools.js';\n\nexport interface LangChainAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n\n /**\n * Whether to simplify error messages returned to the LLM.\n * If true, returns \"Error: <message>\" string instead of throwing.\n * @default false\n */\n simplifyErrors?: boolean;\n\n /**\n * Optional ToolRouter for intelligent tool selection.\n * See AIAdapterOptions.toolRouter for details.\n */\n toolRouter?: ToolRouter;\n}\n\n/**\n * Adapter to use MCP tools within LangChain/LangGraph agents.\n */\nexport class LangChainAdapter {\n private DynamicStructuredTool: typeof DynamicStructuredTool | undefined;\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: LangChainAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads LangChain and Zod dependencies\n */\n private async ensureDependencies() {\n if (!this.DynamicStructuredTool) {\n try {\n const langchain = await import('@langchain/core/tools');\n this.DynamicStructuredTool = langchain.DynamicStructuredTool as any;\n\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'LangChain dependencies not installed. Install with:\\n' +\n ' npm install @langchain/core zod'\n );\n }\n }\n }\n\n private async transformTools(client: MCPClient): Promise<StructuredTool[]> {\n if (!client.isConnected()) {\n return [];\n }\n\n await this.ensureDependencies();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n\n return result.tools.map((tool) => {\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n return new this.DynamicStructuredTool!({\n name: `${prefix}_${tool.name}`,\n description: tool.description || `Tool ${tool.name}`,\n schema: schema,\n func: async (args: any) => {\n try {\n return await client.callTool(tool.name, args);\n } catch (error: any) {\n if (this.options.simplifyErrors) {\n return `Error: ${error.message}`;\n }\n throw error;\n }\n },\n });\n });\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error: any) {\n // Fallback: Accept any object if conversion fails\n if (error.code === 'MODULE_NOT_FOUND') {\n console.warn('[LangChainAdapter] json-schema-to-zod is not installed. To improve type checking, install it with: npm install json-schema-to-zod');\n } else {\n console.warn('[LangChainAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n }\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to LangChain StructuredTools.\n */\n async getTools(): Promise<StructuredTool[]> {\n // If a ToolRouter is provided, use its filtered output\n if (this.options.toolRouter) {\n return this.getToolsViaRouter(this.options.toolRouter);\n }\n\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[LangChainAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return [];\n }\n })\n );\n return results.flat();\n }\n\n /**\n * Build StructuredTools from a ToolRouter's filtered output.\n *\n * In `search` strategy, only meta-tools are registered with the framework.\n * Real tool execution is proxied through `mcp_execute_tool` which uses\n * `router.callTool()` to route to the correct MCP client.\n */\n private async getToolsViaRouter(router: ToolRouter): Promise<StructuredTool[]> {\n await this.ensureDependencies();\n\n const filteredTools = await router.getFilteredTools();\n\n return filteredTools.map((tool) => {\n const routedTool = tool as typeof tool & { sessionId?: string; serverId?: string; serverName?: string };\n const namespace = routedTool.serverId ?? routedTool.sessionId;\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n return new this.DynamicStructuredTool!({\n name: isMetaTool(tool.name)\n ? tool.name\n : this.getRouterToolKey(tool.name, routedTool.sessionId, routedTool.serverId),\n description: tool.description || `Tool ${tool.name}`,\n schema: schema,\n func: async (args: any) => {\n try {\n // Handle meta-tool calls via the router\n if (isMetaTool(tool.name)) {\n const result = await executeMetaTool(\n tool.name,\n args,\n router,\n (name, toolArgs, namespace) => router.callTool(name, toolArgs, namespace)\n );\n if (result) {\n return result.content.map((c: any) => c.text ?? '').join('\\n');\n }\n }\n\n // For non-meta tools in 'all' or 'groups' strategy,\n // route directly to the correct MCP client\n return await router.callTool(tool.name, args, namespace);\n } catch (error: any) {\n if (this.options.simplifyErrors) {\n return `Error: ${error.message}`;\n }\n throw error;\n }\n },\n });\n });\n }\n\n private getRouterToolKey(toolName: string, sessionId?: string, serverId?: string): string {\n const namespace = sessionId ?? serverId ?? 'mcp';\n const normalized = namespace\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '') || 'mcp';\n return `tool_${normalized}_${toolName}`;\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: LangChainAdapterOptions = {}): Promise<StructuredTool[]> {\n return new LangChainAdapter(client, options).getTools();\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CQsRbxYI.mjs';
1
+ import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-DYNe6az3.mjs';
2
2
  import { z } from 'zod';
3
3
  import '../events-CK3N--3g.mjs';
4
4
  import '@modelcontextprotocol/sdk/types.js';
@@ -1,4 +1,4 @@
1
- import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CHE8QpVE.js';
1
+ import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-BYtguGJm.js';
2
2
  import { z } from 'zod';
3
3
  import '../events-CK3N--3g.js';
4
4
  import '@modelcontextprotocol/sdk/types.js';
@@ -60,7 +60,11 @@ var MastraAdapter = class _MastraAdapter {
60
60
  const zodSchemaString = parseSchema(schema);
61
61
  return new Function("z", "return " + zodSchemaString)(this.z);
62
62
  } catch (error) {
63
- console.warn("[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:", error);
63
+ if (error.code === "MODULE_NOT_FOUND") {
64
+ console.warn("[MastraAdapter] json-schema-to-zod is not installed. To improve type checking, install it with: npm install json-schema-to-zod");
65
+ } else {
66
+ console.warn("[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:", error);
67
+ }
64
68
  return this.z.record(this.z.any()).optional().describe("Dynamic Input");
65
69
  }
66
70
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AA0BO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EAGvB,WAAA,CACY,MAAA,EACA,OAAA,GAAgC,EAAC,EAC3C;AAFU,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAJZ,IAAA,aAAA,CAAA,IAAA,EAAQ,GAAA,CAAA;AAAA,EAKJ;AAAA;AAAA;AAAA;AAAA,EAKJ,MAAc,SAAA,GAAY;AACtB,IAAA,IAAI,CAAC,KAAK,CAAA,EAAG;AACT,MAAA,IAAI;AACA,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA;AAAA,MACjB,SAAS,KAAA,EAAO;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACN;AAAA,SAEJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAIA,MAAc,eAAe,MAAA,EAAwD;AACjF,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,KAAK,SAAA,EAAU;AAErB,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAU,OAAO,WAAA,EAAY,EAAG,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,IAAK,KAAA;AACjG,IAAA,MAAM,QAAoC,EAAC;AAE3C,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC7B,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAGvC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA;AAEpD,MAAA,KAAA,CAAM,QAAQ,CAAA,GAAI;AAAA,QACd,EAAA,EAAI,QAAA;AAAA,QACJ,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe,CAAA,KAAA,EAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,QAClD,WAAA,EAAa,MAAA;AAAA,QACb,OAAA,EAAS,OAAO,IAAA,KAAc;AAC1B,UAAA,OAAO,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QAChD;AAAA,OACJ;AAAA,IACJ;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEQ,gBAAgB,MAAA,EAA6B;AACjD,IAAA,IAAI;AACA,MAAA,MAAM,EAAE,WAAA,EAAY,GAAI,SAAA,CAAQ,oBAAoB,CAAA;AACpD,MAAA,MAAM,eAAA,GAAkB,YAAY,MAAM,CAAA;AAE1C,MAAA,OAAO,IAAI,QAAA,CAAS,GAAA,EAAK,YAAY,eAAe,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAChE,SAAS,KAAA,EAAO;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,yEAAyE,KAAK,CAAA;AAC3F,MAAA,OAAO,IAAA,CAAK,CAAA,CAAG,MAAA,CAAO,IAAA,CAAK,CAAA,CAAG,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,IAC5E;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAAgD;AAElD,IAAA,MAAM,cAAA,GAAiB,OAAQ,IAAA,CAAK,MAAA,CAAe,UAAA,KAAe,UAAA;AAClE,IAAA,MAAM,OAAA,GAAU,iBACT,IAAA,CAAK,MAAA,CAA8B,YAAW,GAC/C,CAAC,KAAK,MAAmB,CAAA;AAE/B,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC1B,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAA,KAAW;AAC1B,QAAA,IAAI;AACA,UAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAAA,QAC3C,SAAS,KAAA,EAAO;AACZ,UAAA,OAAA,CAAQ,MAAM,CAAA,2CAAA,EAA8C,MAAA,CAAO,WAAA,EAAa,KAAK,KAAK,CAAA;AAC1F,UAAA,OAAO,EAAC;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,KACL;AACA,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,MAAW,EAAE,GAAG,GAAA,EAAK,GAAG,KAAA,EAAM,CAAA,EAAI,EAAE,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,CAAS,MAAA,EAAwC,OAAA,GAAgC,EAAC,EAAwC;AACnI,IAAA,OAAO,IAAI,cAAA,CAAc,MAAA,EAAQ,OAAO,EAAE,QAAA,EAAS;AAAA,EACvD;AACJ","file":"mastra-adapter.js","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { z } from 'zod';\n\nexport interface MastraAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n}\n\n/**\n * Interface definition for a Mastra tool since we might not have the SDK installed.\n * Based on Mastra documentation.\n */\nexport interface MastraTool {\n id: string;\n description: string;\n inputSchema: z.ZodType<any>;\n execute: (args: any) => Promise<any>;\n}\n\n/**\n * Adapter to use MCP tools within Mastra agents.\n */\nexport class MastraAdapter {\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: MastraAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads Zod dependency\n */\n private async ensureZod() {\n if (!this.z) {\n try {\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'zod is not installed. Install with:\\n' +\n ' npm install zod'\n );\n }\n }\n }\n\n\n\n private async transformTools(client: MCPClient): Promise<Record<string, MastraTool>> {\n if (!client.isConnected()) {\n return {};\n }\n\n await this.ensureZod();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const tools: Record<string, MastraTool> = {};\n\n for (const tool of result.tools) {\n const toolName = `${prefix}_${tool.name}`;\n\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n tools[toolName] = {\n id: toolName,\n description: tool.description || `Tool ${tool.name}`,\n inputSchema: schema,\n execute: async (args: any) => {\n return await client.callTool(tool.name, args);\n },\n };\n }\n\n return tools;\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error) {\n // Fallback: Accept any object if conversion fails\n console.warn('[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to Mastra tools.\n */\n async getTools(): Promise<Record<string, MastraTool>> {\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return {};\n }\n })\n );\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: MastraAdapterOptions = {}): Promise<Record<string, MastraTool>> {\n return new MastraAdapter(client, options).getTools();\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":"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","file":"mastra-adapter.js","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { z } from 'zod';\n\nexport interface MastraAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n}\n\n/**\n * Interface definition for a Mastra tool since we might not have the SDK installed.\n * Based on Mastra documentation.\n */\nexport interface MastraTool {\n id: string;\n description: string;\n inputSchema: z.ZodType<any>;\n execute: (args: any) => Promise<any>;\n}\n\n/**\n * Adapter to use MCP tools within Mastra agents.\n */\nexport class MastraAdapter {\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: MastraAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads Zod dependency\n */\n private async ensureZod() {\n if (!this.z) {\n try {\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'zod is not installed. Install with:\\n' +\n ' npm install zod'\n );\n }\n }\n }\n\n\n\n private async transformTools(client: MCPClient): Promise<Record<string, MastraTool>> {\n if (!client.isConnected()) {\n return {};\n }\n\n await this.ensureZod();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const tools: Record<string, MastraTool> = {};\n\n for (const tool of result.tools) {\n const toolName = `${prefix}_${tool.name}`;\n\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n tools[toolName] = {\n id: toolName,\n description: tool.description || `Tool ${tool.name}`,\n inputSchema: schema,\n execute: async (args: any) => {\n return await client.callTool(tool.name, args);\n },\n };\n }\n\n return tools;\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error: any) {\n // Fallback: Accept any object if conversion fails\n if (error.code === 'MODULE_NOT_FOUND') {\n console.warn('[MastraAdapter] json-schema-to-zod is not installed. To improve type checking, install it with: npm install json-schema-to-zod');\n } else {\n console.warn('[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n }\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to Mastra tools.\n */\n async getTools(): Promise<Record<string, MastraTool>> {\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return {};\n }\n })\n );\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: MastraAdapterOptions = {}): Promise<Record<string, MastraTool>> {\n return new MastraAdapter(client, options).getTools();\n }\n}\n"]}
@@ -58,7 +58,11 @@ var MastraAdapter = class _MastraAdapter {
58
58
  const zodSchemaString = parseSchema(schema);
59
59
  return new Function("z", "return " + zodSchemaString)(this.z);
60
60
  } catch (error) {
61
- console.warn("[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:", error);
61
+ if (error.code === "MODULE_NOT_FOUND") {
62
+ console.warn("[MastraAdapter] json-schema-to-zod is not installed. To improve type checking, install it with: npm install json-schema-to-zod");
63
+ } else {
64
+ console.warn("[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:", error);
65
+ }
62
66
  return this.z.record(this.z.any()).optional().describe("Dynamic Input");
63
67
  }
64
68
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":"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","file":"mastra-adapter.mjs","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { z } from 'zod';\n\nexport interface MastraAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n}\n\n/**\n * Interface definition for a Mastra tool since we might not have the SDK installed.\n * Based on Mastra documentation.\n */\nexport interface MastraTool {\n id: string;\n description: string;\n inputSchema: z.ZodType<any>;\n execute: (args: any) => Promise<any>;\n}\n\n/**\n * Adapter to use MCP tools within Mastra agents.\n */\nexport class MastraAdapter {\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: MastraAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads Zod dependency\n */\n private async ensureZod() {\n if (!this.z) {\n try {\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'zod is not installed. Install with:\\n' +\n ' npm install zod'\n );\n }\n }\n }\n\n\n\n private async transformTools(client: MCPClient): Promise<Record<string, MastraTool>> {\n if (!client.isConnected()) {\n return {};\n }\n\n await this.ensureZod();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const tools: Record<string, MastraTool> = {};\n\n for (const tool of result.tools) {\n const toolName = `${prefix}_${tool.name}`;\n\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n tools[toolName] = {\n id: toolName,\n description: tool.description || `Tool ${tool.name}`,\n inputSchema: schema,\n execute: async (args: any) => {\n return await client.callTool(tool.name, args);\n },\n };\n }\n\n return tools;\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error) {\n // Fallback: Accept any object if conversion fails\n console.warn('[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to Mastra tools.\n */\n async getTools(): Promise<Record<string, MastraTool>> {\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return {};\n }\n })\n );\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: MastraAdapterOptions = {}): Promise<Record<string, MastraTool>> {\n return new MastraAdapter(client, options).getTools();\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":"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","file":"mastra-adapter.mjs","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { z } from 'zod';\n\nexport interface MastraAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n}\n\n/**\n * Interface definition for a Mastra tool since we might not have the SDK installed.\n * Based on Mastra documentation.\n */\nexport interface MastraTool {\n id: string;\n description: string;\n inputSchema: z.ZodType<any>;\n execute: (args: any) => Promise<any>;\n}\n\n/**\n * Adapter to use MCP tools within Mastra agents.\n */\nexport class MastraAdapter {\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: MastraAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads Zod dependency\n */\n private async ensureZod() {\n if (!this.z) {\n try {\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'zod is not installed. Install with:\\n' +\n ' npm install zod'\n );\n }\n }\n }\n\n\n\n private async transformTools(client: MCPClient): Promise<Record<string, MastraTool>> {\n if (!client.isConnected()) {\n return {};\n }\n\n await this.ensureZod();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const tools: Record<string, MastraTool> = {};\n\n for (const tool of result.tools) {\n const toolName = `${prefix}_${tool.name}`;\n\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n tools[toolName] = {\n id: toolName,\n description: tool.description || `Tool ${tool.name}`,\n inputSchema: schema,\n execute: async (args: any) => {\n return await client.callTool(tool.name, args);\n },\n };\n }\n\n return tools;\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error: any) {\n // Fallback: Accept any object if conversion fails\n if (error.code === 'MODULE_NOT_FOUND') {\n console.warn('[MastraAdapter] json-schema-to-zod is not installed. To improve type checking, install it with: npm install json-schema-to-zod');\n } else {\n console.warn('[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n }\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to Mastra tools.\n */\n async getTools(): Promise<Record<string, MastraTool>> {\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return {};\n }\n })\n );\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: MastraAdapterOptions = {}): Promise<Record<string, MastraTool>> {\n return new MastraAdapter(client, options).getTools();\n }\n}\n"]}
@@ -46,7 +46,10 @@ Commands:
46
46
  async function initSupabase() {
47
47
  console.log("\u{1F680} Initializing Supabase storage for MCP-TS...");
48
48
  const pkgRoot = path__namespace.resolve(__dirname, "../..");
49
- const sourceDir = path__namespace.join(pkgRoot, "supabase", "migrations");
49
+ const sourceDir = resolveFirstExistingPath([
50
+ path__namespace.join(pkgRoot, "migrations", "supabase"),
51
+ path__namespace.join(pkgRoot, "supabase", "migrations")
52
+ ]);
50
53
  if (!fs__namespace.existsSync(sourceDir)) {
51
54
  console.error(`\u274C Error: Could not find migration files in package at: ${sourceDir}`);
52
55
  console.log("Please ensure you are running this from a project where @mcp-ts/sdk is installed.");
@@ -97,6 +100,9 @@ async function initSupabase() {
97
100
  process.exit(1);
98
101
  }
99
102
  }
103
+ function resolveFirstExistingPath(paths) {
104
+ return paths.find((candidate) => fs__namespace.existsSync(candidate)) || paths[0];
105
+ }
100
106
  run().catch((err) => {
101
107
  console.error(err);
102
108
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/mcp-ts.ts"],"names":["path","fs"],"mappings":"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","file":"mcp-ts.js","sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * MCP-TS CLI Utility\n * \n * Provides helper commands for users of the @mcp-ts/sdk library.\n */\nasync function run() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n if (command === 'supabase-init') {\n await initSupabase();\n } else {\n showHelp();\n }\n}\n\nfunction showHelp() {\n console.log(`\n🚀 MCP-TS CLI Utility\nUsage: npx mcp-ts <command>\n\nCommands:\n supabase-init Initialize Supabase migrations in your project\n `);\n}\n\nasync function initSupabase() {\n console.log('🚀 Initializing Supabase storage for MCP-TS...');\n\n // When running from dist/bin/mcp-ts.js (compiled), __dirname is dist/bin.\n // The supabase/ migrations are at the root of the package.\n // We need to look up two levels to find 'supabase' folder in the package.\n const pkgRoot = path.resolve(__dirname, '../..');\n const sourceDir = path.join(pkgRoot, 'supabase', 'migrations');\n \n if (!fs.existsSync(sourceDir)) {\n console.error(`❌ Error: Could not find migration files in package at: ${sourceDir}`);\n console.log('Please ensure you are running this from a project where @mcp-ts/sdk is installed.');\n process.exit(1);\n }\n\n const targetDir = path.join(process.cwd(), 'supabase', 'migrations');\n\n try {\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n console.log(`📁 Created directory: ${targetDir}`);\n }\n\n const files = fs.readdirSync(sourceDir);\n let copiedCount = 0;\n\n for (const file of files) {\n if (file.endsWith('.sql')) {\n const srcPath = path.join(sourceDir, file);\n const destPath = path.join(targetDir, file);\n \n if (fs.existsSync(destPath)) {\n console.log(`⏭️ Skipping existing migration: ${file}`);\n continue;\n }\n\n fs.copyFileSync(srcPath, destPath);\n console.log(`✅ Copied: ${file}`);\n copiedCount++;\n }\n }\n\n if (copiedCount > 0) {\n console.log('\\n✨ Database migrations successfully initialized!');\n console.log('\\nNext steps:');\n console.log('1. Link your Supabase project:');\n console.log(' npx supabase link --project-ref <your-project-id>');\n console.log('\\n2. Push the migrations to your remote database:');\n console.log(' npx supabase db push');\n console.log('\\n3. Add your Supabase credentials to .env:');\n console.log(' SUPABASE_URL=https://<your-project-id>.supabase.co');\n console.log(' SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>');\n console.log('\\n⚠️ Important: Use the service_role key (not the anon key) for server-side storage.');\n console.log(' The service_role key bypasses RLS policies and is required for mcp-ts to work correctly.');\n console.log(' Find it in: Supabase Dashboard -> Project Settings -> API -> service_role');\n } else if (files.length > 0) {\n console.log('\\n👍 All migration files are already present in your project.');\n console.log(' Ensure SUPABASE_SERVICE_ROLE_KEY (not SUPABASE_ANON_KEY) is set in your .env');\n } else {\n console.log('⚠️ No migration files found to copy.');\n }\n\n } catch (error: any) {\n console.error(`❌ Error initializing Supabase: ${error.message}`);\n process.exit(1);\n }\n}\n\nrun().catch(err => {\n console.error(err);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../../src/bin/mcp-ts.ts"],"names":["path","fs"],"mappings":"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","file":"mcp-ts.js","sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * MCP-TS CLI Utility\n * \n * Provides helper commands for users of the @mcp-ts/sdk library.\n */\nasync function run() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n if (command === 'supabase-init') {\n await initSupabase();\n } else {\n showHelp();\n }\n}\n\nfunction showHelp() {\n console.log(`\n🚀 MCP-TS CLI Utility\nUsage: npx mcp-ts <command>\n\nCommands:\n supabase-init Initialize Supabase migrations in your project\n `);\n}\n\nasync function initSupabase() {\n console.log('🚀 Initializing Supabase storage for MCP-TS...');\n\n // When running from dist/bin/mcp-ts.js (compiled), __dirname is dist/bin.\n // The supabase/ migrations are at the root of the package.\n // We need to look up two levels to find 'supabase' folder in the package.\n const pkgRoot = path.resolve(__dirname, '../..');\n const sourceDir = resolveFirstExistingPath([\n path.join(pkgRoot, 'migrations', 'supabase'),\n path.join(pkgRoot, 'supabase', 'migrations'),\n ]);\n \n if (!fs.existsSync(sourceDir)) {\n console.error(`❌ Error: Could not find migration files in package at: ${sourceDir}`);\n console.log('Please ensure you are running this from a project where @mcp-ts/sdk is installed.');\n process.exit(1);\n }\n\n const targetDir = path.join(process.cwd(), 'supabase', 'migrations');\n\n try {\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n console.log(`📁 Created directory: ${targetDir}`);\n }\n\n const files = fs.readdirSync(sourceDir);\n let copiedCount = 0;\n\n for (const file of files) {\n if (file.endsWith('.sql')) {\n const srcPath = path.join(sourceDir, file);\n const destPath = path.join(targetDir, file);\n \n if (fs.existsSync(destPath)) {\n console.log(`⏭️ Skipping existing migration: ${file}`);\n continue;\n }\n\n fs.copyFileSync(srcPath, destPath);\n console.log(`✅ Copied: ${file}`);\n copiedCount++;\n }\n }\n\n if (copiedCount > 0) {\n console.log('\\n✨ Database migrations successfully initialized!');\n console.log('\\nNext steps:');\n console.log('1. Link your Supabase project:');\n console.log(' npx supabase link --project-ref <your-project-id>');\n console.log('\\n2. Push the migrations to your remote database:');\n console.log(' npx supabase db push');\n console.log('\\n3. Add your Supabase credentials to .env:');\n console.log(' SUPABASE_URL=https://<your-project-id>.supabase.co');\n console.log(' SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>');\n console.log('\\n⚠️ Important: Use the service_role key (not the anon key) for server-side storage.');\n console.log(' The service_role key bypasses RLS policies and is required for mcp-ts to work correctly.');\n console.log(' Find it in: Supabase Dashboard -> Project Settings -> API -> service_role');\n } else if (files.length > 0) {\n console.log('\\n👍 All migration files are already present in your project.');\n console.log(' Ensure SUPABASE_SERVICE_ROLE_KEY (not SUPABASE_ANON_KEY) is set in your .env');\n } else {\n console.log('⚠️ No migration files found to copy.');\n }\n\n } catch (error: any) {\n console.error(`❌ Error initializing Supabase: ${error.message}`);\n process.exit(1);\n }\n}\n\nfunction resolveFirstExistingPath(paths: string[]): string {\n return paths.find(candidate => fs.existsSync(candidate)) || paths[0];\n}\n\nrun().catch(err => {\n console.error(err);\n process.exit(1);\n});\n"]}
@@ -23,7 +23,10 @@ Commands:
23
23
  async function initSupabase() {
24
24
  console.log("\u{1F680} Initializing Supabase storage for MCP-TS...");
25
25
  const pkgRoot = path.resolve(__dirname, "../..");
26
- const sourceDir = path.join(pkgRoot, "supabase", "migrations");
26
+ const sourceDir = resolveFirstExistingPath([
27
+ path.join(pkgRoot, "migrations", "supabase"),
28
+ path.join(pkgRoot, "supabase", "migrations")
29
+ ]);
27
30
  if (!fs.existsSync(sourceDir)) {
28
31
  console.error(`\u274C Error: Could not find migration files in package at: ${sourceDir}`);
29
32
  console.log("Please ensure you are running this from a project where @mcp-ts/sdk is installed.");
@@ -74,6 +77,9 @@ async function initSupabase() {
74
77
  process.exit(1);
75
78
  }
76
79
  }
80
+ function resolveFirstExistingPath(paths) {
81
+ return paths.find((candidate) => fs.existsSync(candidate)) || paths[0];
82
+ }
77
83
  run().catch((err) => {
78
84
  console.error(err);
79
85
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/mcp-ts.ts"],"names":[],"mappings":"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","file":"mcp-ts.mjs","sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * MCP-TS CLI Utility\n * \n * Provides helper commands for users of the @mcp-ts/sdk library.\n */\nasync function run() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n if (command === 'supabase-init') {\n await initSupabase();\n } else {\n showHelp();\n }\n}\n\nfunction showHelp() {\n console.log(`\n🚀 MCP-TS CLI Utility\nUsage: npx mcp-ts <command>\n\nCommands:\n supabase-init Initialize Supabase migrations in your project\n `);\n}\n\nasync function initSupabase() {\n console.log('🚀 Initializing Supabase storage for MCP-TS...');\n\n // When running from dist/bin/mcp-ts.js (compiled), __dirname is dist/bin.\n // The supabase/ migrations are at the root of the package.\n // We need to look up two levels to find 'supabase' folder in the package.\n const pkgRoot = path.resolve(__dirname, '../..');\n const sourceDir = path.join(pkgRoot, 'supabase', 'migrations');\n \n if (!fs.existsSync(sourceDir)) {\n console.error(`❌ Error: Could not find migration files in package at: ${sourceDir}`);\n console.log('Please ensure you are running this from a project where @mcp-ts/sdk is installed.');\n process.exit(1);\n }\n\n const targetDir = path.join(process.cwd(), 'supabase', 'migrations');\n\n try {\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n console.log(`📁 Created directory: ${targetDir}`);\n }\n\n const files = fs.readdirSync(sourceDir);\n let copiedCount = 0;\n\n for (const file of files) {\n if (file.endsWith('.sql')) {\n const srcPath = path.join(sourceDir, file);\n const destPath = path.join(targetDir, file);\n \n if (fs.existsSync(destPath)) {\n console.log(`⏭️ Skipping existing migration: ${file}`);\n continue;\n }\n\n fs.copyFileSync(srcPath, destPath);\n console.log(`✅ Copied: ${file}`);\n copiedCount++;\n }\n }\n\n if (copiedCount > 0) {\n console.log('\\n✨ Database migrations successfully initialized!');\n console.log('\\nNext steps:');\n console.log('1. Link your Supabase project:');\n console.log(' npx supabase link --project-ref <your-project-id>');\n console.log('\\n2. Push the migrations to your remote database:');\n console.log(' npx supabase db push');\n console.log('\\n3. Add your Supabase credentials to .env:');\n console.log(' SUPABASE_URL=https://<your-project-id>.supabase.co');\n console.log(' SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>');\n console.log('\\n⚠️ Important: Use the service_role key (not the anon key) for server-side storage.');\n console.log(' The service_role key bypasses RLS policies and is required for mcp-ts to work correctly.');\n console.log(' Find it in: Supabase Dashboard -> Project Settings -> API -> service_role');\n } else if (files.length > 0) {\n console.log('\\n👍 All migration files are already present in your project.');\n console.log(' Ensure SUPABASE_SERVICE_ROLE_KEY (not SUPABASE_ANON_KEY) is set in your .env');\n } else {\n console.log('⚠️ No migration files found to copy.');\n }\n\n } catch (error: any) {\n console.error(`❌ Error initializing Supabase: ${error.message}`);\n process.exit(1);\n }\n}\n\nrun().catch(err => {\n console.error(err);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../../src/bin/mcp-ts.ts"],"names":[],"mappings":"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","file":"mcp-ts.mjs","sourcesContent":["#!/usr/bin/env node\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * MCP-TS CLI Utility\n * \n * Provides helper commands for users of the @mcp-ts/sdk library.\n */\nasync function run() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n if (command === 'supabase-init') {\n await initSupabase();\n } else {\n showHelp();\n }\n}\n\nfunction showHelp() {\n console.log(`\n🚀 MCP-TS CLI Utility\nUsage: npx mcp-ts <command>\n\nCommands:\n supabase-init Initialize Supabase migrations in your project\n `);\n}\n\nasync function initSupabase() {\n console.log('🚀 Initializing Supabase storage for MCP-TS...');\n\n // When running from dist/bin/mcp-ts.js (compiled), __dirname is dist/bin.\n // The supabase/ migrations are at the root of the package.\n // We need to look up two levels to find 'supabase' folder in the package.\n const pkgRoot = path.resolve(__dirname, '../..');\n const sourceDir = resolveFirstExistingPath([\n path.join(pkgRoot, 'migrations', 'supabase'),\n path.join(pkgRoot, 'supabase', 'migrations'),\n ]);\n \n if (!fs.existsSync(sourceDir)) {\n console.error(`❌ Error: Could not find migration files in package at: ${sourceDir}`);\n console.log('Please ensure you are running this from a project where @mcp-ts/sdk is installed.');\n process.exit(1);\n }\n\n const targetDir = path.join(process.cwd(), 'supabase', 'migrations');\n\n try {\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n console.log(`📁 Created directory: ${targetDir}`);\n }\n\n const files = fs.readdirSync(sourceDir);\n let copiedCount = 0;\n\n for (const file of files) {\n if (file.endsWith('.sql')) {\n const srcPath = path.join(sourceDir, file);\n const destPath = path.join(targetDir, file);\n \n if (fs.existsSync(destPath)) {\n console.log(`⏭️ Skipping existing migration: ${file}`);\n continue;\n }\n\n fs.copyFileSync(srcPath, destPath);\n console.log(`✅ Copied: ${file}`);\n copiedCount++;\n }\n }\n\n if (copiedCount > 0) {\n console.log('\\n✨ Database migrations successfully initialized!');\n console.log('\\nNext steps:');\n console.log('1. Link your Supabase project:');\n console.log(' npx supabase link --project-ref <your-project-id>');\n console.log('\\n2. Push the migrations to your remote database:');\n console.log(' npx supabase db push');\n console.log('\\n3. Add your Supabase credentials to .env:');\n console.log(' SUPABASE_URL=https://<your-project-id>.supabase.co');\n console.log(' SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>');\n console.log('\\n⚠️ Important: Use the service_role key (not the anon key) for server-side storage.');\n console.log(' The service_role key bypasses RLS policies and is required for mcp-ts to work correctly.');\n console.log(' Find it in: Supabase Dashboard -> Project Settings -> API -> service_role');\n } else if (files.length > 0) {\n console.log('\\n👍 All migration files are already present in your project.');\n console.log(' Ensure SUPABASE_SERVICE_ROLE_KEY (not SUPABASE_ANON_KEY) is set in your .env');\n } else {\n console.log('⚠️ No migration files found to copy.');\n }\n\n } catch (error: any) {\n console.error(`❌ Error initializing Supabase: ${error.message}`);\n process.exit(1);\n }\n}\n\nfunction resolveFirstExistingPath(paths: string[]): string {\n return paths.find(candidate => fs.existsSync(candidate)) || paths[0];\n}\n\nrun().catch(err => {\n console.error(err);\n process.exit(1);\n});\n"]}
@@ -1,5 +1,5 @@
1
- export { A as APP_HOST_DEFAULTS, a as AppHost, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, c as SSEClient, d as SSEClientOptions } from '../index-bFL4ZF2N.mjs';
1
+ export { A as APP_HOST_DEFAULTS, a as AppHost, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, c as SSEClient, d as SSEClientOptions } from '../index-eaH14_5u.mjs';
2
2
  export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, M as McpConnectionEvent, c as McpConnectionState, d as McpObservabilityEvent } from '../events-CK3N--3g.mjs';
3
- export { p as McpRpcRequest, q as McpRpcResponse, v as ToolInfo } from '../types-rIuN1CQi.mjs';
3
+ export { q as McpRpcRequest, r as McpRpcResponse, v as ToolInfo } from '../types-BCAG20P6.mjs';
4
4
  import '@modelcontextprotocol/ext-apps/app-bridge';
5
5
  import '@modelcontextprotocol/sdk/types.js';
@@ -1,5 +1,5 @@
1
- export { A as APP_HOST_DEFAULTS, a as AppHost, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, c as SSEClient, d as SSEClientOptions } from '../index-DhA-OEAe.js';
1
+ export { A as APP_HOST_DEFAULTS, a as AppHost, D as DEFAULT_MCP_APP_CSP, S as SANDBOX_PROXY_READY_METHOD, b as SANDBOX_RESOURCE_READY_METHOD, c as SSEClient, d as SSEClientOptions } from '../index-C9gvpxy5.js';
2
2
  export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, M as McpConnectionEvent, c as McpConnectionState, d as McpObservabilityEvent } from '../events-CK3N--3g.js';
3
- export { p as McpRpcRequest, q as McpRpcResponse, v as ToolInfo } from '../types-rIuN1CQi.js';
3
+ export { q as McpRpcRequest, r as McpRpcResponse, v as ToolInfo } from '../types-BCAG20P6.js';
4
4
  import '@modelcontextprotocol/ext-apps/app-bridge';
5
5
  import '@modelcontextprotocol/sdk/types.js';
@@ -28,8 +28,8 @@ var SSEClient = class {
28
28
  isConnected() {
29
29
  return this.connected;
30
30
  }
31
- async getSessions() {
32
- return this.sendRequest("getSessions");
31
+ async listSessions() {
32
+ return this.sendRequest("listSessions");
33
33
  }
34
34
  async connectToServer(params) {
35
35
  return this.sendRequest("connect", params);
@@ -45,8 +45,8 @@ var SSEClient = class {
45
45
  this.emitUiEventIfPresent(result, sessionId, toolName);
46
46
  return result;
47
47
  }
48
- async restoreSession(sessionId) {
49
- return this.sendRequest("restoreSession", { sessionId });
48
+ async getSession(sessionId) {
49
+ return this.sendRequest("getSession", { sessionId });
50
50
  }
51
51
  async finishAuth(sessionId, code) {
52
52
  return this.sendRequest("finishAuth", { sessionId, code });
@@ -112,7 +112,7 @@ var SSEClient = class {
112
112
  return this.parseRpcResponse(data2);
113
113
  }
114
114
  const data = await this.readRpcResponseFromStream(response, {
115
- delayConnectionEvents: method === "connect" || method === "restoreSession" || method === "finishAuth"
115
+ delayConnectionEvents: method === "connect" || method === "getSession" || method === "finishAuth"
116
116
  });
117
117
  return this.parseRpcResponse(data);
118
118
  }
@@ -202,17 +202,13 @@ var SSEClient = class {
202
202
  throw new Error("Invalid RPC response format");
203
203
  }
204
204
  buildUrl() {
205
- const url = new URL(this.options.url, globalThis.location?.origin);
206
- url.searchParams.set("identity", this.options.identity);
207
- if (this.options.authToken) {
208
- url.searchParams.set("token", this.options.authToken);
209
- }
210
- return url.toString();
205
+ return new URL(this.options.url, globalThis.location?.origin).toString();
211
206
  }
212
207
  buildHeaders() {
213
208
  const headers = {
214
209
  "Content-Type": "application/json",
215
- "Accept": "text/event-stream"
210
+ "Accept": "text/event-stream",
211
+ "x-mcp-user-id": this.options.userId
216
212
  };
217
213
  if (this.options.authToken) {
218
214
  headers["Authorization"] = `Bearer ${this.options.authToken}`;
@@ -674,7 +670,7 @@ var AppHost = class {
674
670
  async getSessionId() {
675
671
  if (this.sessionId) return this.sessionId;
676
672
  if (!this.client) return void 0;
677
- const result = await this.client.getSessions();
673
+ const result = await this.client.listSessions();
678
674
  return result.sessions?.[0]?.sessionId;
679
675
  }
680
676
  isMcpUri(url) {