@mcp-ts/sdk 1.5.1 → 1.5.3
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.
- package/README.md +89 -27
- package/dist/adapters/agui-adapter.d.mts +1 -1
- package/dist/adapters/agui-adapter.d.ts +1 -1
- package/dist/adapters/agui-adapter.js +50 -10
- package/dist/adapters/agui-adapter.js.map +1 -1
- package/dist/adapters/agui-adapter.mjs +50 -10
- package/dist/adapters/agui-adapter.mjs.map +1 -1
- package/dist/adapters/agui-middleware.d.mts +5 -1
- package/dist/adapters/agui-middleware.d.ts +5 -1
- package/dist/adapters/agui-middleware.js +116 -49
- package/dist/adapters/agui-middleware.js.map +1 -1
- package/dist/adapters/agui-middleware.mjs +117 -50
- package/dist/adapters/agui-middleware.mjs.map +1 -1
- package/dist/adapters/ai-adapter.d.mts +1 -1
- package/dist/adapters/ai-adapter.d.ts +1 -1
- package/dist/adapters/ai-adapter.js +49 -9
- package/dist/adapters/ai-adapter.js.map +1 -1
- package/dist/adapters/ai-adapter.mjs +49 -9
- package/dist/adapters/ai-adapter.mjs.map +1 -1
- package/dist/adapters/langchain-adapter.d.mts +1 -1
- package/dist/adapters/langchain-adapter.d.ts +1 -1
- package/dist/adapters/langchain-adapter.js +49 -9
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langchain-adapter.mjs +49 -9
- package/dist/adapters/langchain-adapter.mjs.map +1 -1
- package/dist/client/react.d.mts +10 -0
- package/dist/client/react.d.ts +10 -0
- package/dist/client/react.js +23 -0
- package/dist/client/react.js.map +1 -1
- package/dist/client/react.mjs +23 -0
- package/dist/client/react.mjs.map +1 -1
- package/dist/client/vue.d.mts +10 -0
- package/dist/client/vue.d.ts +10 -0
- package/dist/client/vue.js +17 -0
- package/dist/client/vue.js.map +1 -1
- package/dist/client/vue.mjs +17 -0
- package/dist/client/vue.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +123 -28
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +123 -28
- package/dist/index.mjs.map +1 -1
- package/dist/shared/index.d.mts +2 -2
- package/dist/shared/index.d.ts +2 -2
- package/dist/shared/index.js +123 -28
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +123 -28
- package/dist/shared/index.mjs.map +1 -1
- package/dist/{tool-router-XnWVxPzv.d.mts → tool-router-DK0RJblO.d.mts} +3 -0
- package/dist/{tool-router-Bo8qZbsD.d.ts → tool-router-DsKhRmJm.d.ts} +3 -0
- package/package.json +3 -3
- package/src/adapters/agui-adapter.ts +7 -7
- package/src/adapters/agui-middleware.ts +163 -59
- package/src/adapters/ai-adapter.ts +5 -5
- package/src/adapters/langchain-adapter.ts +5 -5
- package/src/client/react/use-mcp.ts +48 -0
- package/src/client/vue/use-mcp.ts +42 -0
- package/src/shared/meta-tools.ts +73 -15
- package/src/shared/tool-index.ts +85 -12
- package/src/shared/tool-router.ts +8 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared/meta-tools.ts","../../src/adapters/agui-adapter.ts"],"names":["namespace"],"mappings":"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","file":"agui-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_tool_bm25` — BM25 natural language search\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';\n\n// ---------------------------------------------------------------------------\n// Tool Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `mcp_search_tool_bm25` 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_tool_bm25',\n description:\n 'Search the catalog of available tools using BM25 natural language ranking. ' +\n 'Returns tool names, descriptions, and server info. ' +\n 'Use this FIRST to find relevant tools before calling them. ' +\n 'Example queries: \"database query\", \"send email\", \"github pull request\".',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: {\n type: 'string',\n description: 'Natural language description of the capability you need.',\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_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_tool_bm25` 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_tool_bm25 to get the parameter details ' +\n 'needed to call a tool correctly.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n toolName: {\n type: 'string',\n description: 'The exact tool name returned by mcp_search_tool_bm25.',\n },\n serverName: {\n type: 'string',\n description:\n 'Optional: The server name provided in mcp_search_tool_bm25. 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_tool_bm25` 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_tool_bm25. ' +\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_tool_bm25 results.',\n },\n serverName: {\n type: 'string',\n description:\n 'Optional: The server name provided in mcp_search_tool_bm25. 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_tool_bm25, 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 = (name: string, namespace?: string): { tool?: Tool; error?: CallToolResult } => {\n try {\n return { tool: router.getToolSchema(name, namespace) };\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_tool_bm25': {\n const query = String(args.query ?? '');\n const limit = Math.min(Number(args.limit) || 5, 20);\n\n const results = await router.searchTools(query, limit);\n\n const text = results.length === 0\n ? 'No tools found matching your query. Try different keywords.'\n : results\n .map(\n (t, i) =>\n `${i + 1}. **${t.name}** (server: ${t.serverName})\\n` +\n ` ${t.description}\\n` +\n ` Estimated tokens: ${t.estimatedTokens}`\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 : results\n .map(\n (t, i) =>\n `${i + 1}. **${t.name}** (server: ${t.serverName})\\n` +\n ` ${t.description}\\n` +\n ` Estimated tokens: ${t.estimatedTokens}`\n )\n .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.serverName ?? '') || 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_tool_bm25 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 };\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.serverName ?? '') || 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_tool_bm25 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\n/** Check if a tool name is one of the meta-tools. */\nexport function isMetaTool(toolName: string): boolean {\n return (\n toolName === 'mcp_search_tool_bm25' ||\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","/**\n * MCP Adapter for AG-UI Integration\n *\n * This adapter transforms MCP tools into formats compatible with AG-UI agents.\n * It provides tools with handlers for server-side execution and tool definitions\n * in JSON Schema format for passing to remote agents.\n *\n * @example\n * ```typescript\n * import { MultiSessionClient } from '@mcp-ts/sdk/server';\n * import { AguiAdapter } from '@mcp-ts/sdk/adapters/agui-adapter';\n * import { createMcpMiddleware } from '@mcp-ts/sdk/adapters/agui-middleware';\n * import { HttpAgent } from '@ag-ui/client';\n *\n * // Create MCP client\n * const mcpClient = new MultiSessionClient('user_123');\n * await mcpClient.connect();\n *\n * // Create adapter and get tools\n * const adapter = new AguiAdapter(mcpClient);\n * const tools = await adapter.getTools();\n *\n * // Use with AG-UI middleware\n * const agent = new HttpAgent({ url: 'http://localhost:8000/agent' });\n * agent.use(createMcpMiddleware({ tools }));\n * ```\n */\n\nimport { MCPClient } from '../server/mcp/oauth-client.js';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client.js';\nimport { ToolRouter } from '../shared/tool-router.js';\nimport { executeMetaTool, isMetaTool } from '../shared/meta-tools.js';\n\n/**\n * Extended JSON Schema properties that Pydantic's strict validation rejects.\n * These are valid JSON Schema extensions but not part of the core spec.\n */\nconst PYDANTIC_FORBIDDEN_PROPS = [\n // JSON Schema meta-properties\n '$schema', '$id', '$comment', '$defs', 'definitions',\n // Extended properties used by some MCP servers (e.g., Apify)\n 'prefill', 'examples', 'enumTitles', 'enumDescriptions',\n // Other common extensions\n 'deprecated', 'readOnly', 'writeOnly', 'contentMediaType', 'contentEncoding',\n];\n\n/**\n * Cleans a JSON Schema by removing meta-properties that cause issues with\n * strict Pydantic validation (e.g., Google ADK, LangGraph).\n *\n * @param schema - The JSON Schema to clean\n * @returns Cleaned schema without forbidden properties\n */\nexport function cleanSchema(schema: Record<string, any> | undefined): Record<string, any> {\n if (!schema) {\n return { type: 'object', properties: {} };\n }\n\n const cleaned = { ...schema };\n\n // Remove all forbidden properties\n for (const prop of PYDANTIC_FORBIDDEN_PROPS) {\n delete cleaned[prop];\n }\n\n // Recursively clean nested properties\n if (cleaned.properties && typeof cleaned.properties === 'object') {\n const cleanedProps: Record<string, any> = {};\n for (const [key, value] of Object.entries(cleaned.properties)) {\n if (typeof value === 'object' && value !== null) {\n cleanedProps[key] = cleanSchema(value as Record<string, any>);\n } else {\n cleanedProps[key] = value;\n }\n }\n cleaned.properties = cleanedProps;\n }\n\n // Clean items if it's an array schema\n if (cleaned.items && typeof cleaned.items === 'object') {\n cleaned.items = cleanSchema(cleaned.items);\n }\n\n // Clean additionalProperties if it's an object schema\n if (cleaned.additionalProperties && typeof cleaned.additionalProperties === 'object') {\n cleaned.additionalProperties = cleanSchema(cleaned.additionalProperties);\n }\n\n return cleaned;\n}\n\n/**\n * Configuration options for AguiAdapter\n */\nexport interface AguiAdapterOptions {\n /**\n * Prefix for tool names to avoid collision with other tools.\n * @default serverId or 'mcp'\n */\n prefix?: string;\n\n /**\n * Optional ToolRouter for intelligent tool selection.\n */\n toolRouter?: ToolRouter;\n}\n\n/**\n * AG-UI Tool with handler for server-side execution.\n */\nexport interface AguiTool {\n name: string;\n description: string;\n parameters?: Record<string, any>;\n _meta?: Record<string, any>; // Add _meta to AguiTool\n handler?: (args: any) => any | Promise<any>;\n}\n\n/**\n * Tool definition format for passing to remote agents (without handler).\n */\nexport interface AguiToolDefinition {\n name: string;\n description: string;\n parameters: Record<string, any>;\n _meta?: Record<string, any>; // Add _meta to AguiToolDefinition\n}\n\n/**\n * Adapter that transforms MCP tools into AG-UI compatible formats.\n */\nexport class AguiAdapter {\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: AguiAdapterOptions = {}\n ) { }\n\n /**\n * Get tools with handlers for MCP tool execution.\n */\n async getTools(): Promise<AguiTool[]> {\n if (this.options.toolRouter) {\n return this.getToolsViaRouter(this.options.toolRouter);\n }\n\n if (this.isMultiSession()) {\n const clients = (this.client as MultiSessionClient).getClients();\n const allTools: AguiTool[] = [];\n for (const client of clients) {\n allTools.push(...await this.transformTools(client));\n }\n return allTools;\n }\n return this.transformTools(this.client as MCPClient);\n }\n\n /**\n * Get tool definitions in JSON Schema format for passing to remote agents.\n */\n async getToolDefinitions(): Promise<AguiToolDefinition[]> {\n if (this.options.toolRouter) {\n return this.getToolDefinitionsViaRouter(this.options.toolRouter);\n }\n\n if (this.isMultiSession()) {\n const clients = (this.client as MultiSessionClient).getClients();\n const allTools: AguiToolDefinition[] = [];\n for (const client of clients) {\n allTools.push(...await this.transformToolDefinitions(client));\n }\n return allTools;\n }\n return this.transformToolDefinitions(this.client as MCPClient);\n }\n\n /**\n * Get tools as a function (for dynamic loading).\n */\n getToolsFunction(): () => Promise<AguiTool[]> {\n return () => this.getTools();\n }\n\n private isMultiSession(): boolean {\n return typeof (this.client as any).getClients === 'function';\n }\n\n private async transformTools(client: MCPClient): Promise<AguiTool[]> {\n if (!client.isConnected()) return [];\n\n const result = await client.listTools();\n const serverId = (typeof (client as any).getServerId === 'function'\n ? (client as any).getServerId()\n : undefined) as string | undefined;\n const normalizedPrefix = this.options.prefix?.replace(/-/g, '') ?? serverId?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const prefix = `tool_${normalizedPrefix}`;\n\n return result.tools.map(tool => {\n // Type assertion to access _meta if it exists on the tool object (it comes from MCP SDK)\n const mcpTool = tool as any;\n const mcpToolName = tool.name;\n return {\n name: `${prefix}_${tool.name}`,\n description: tool.description || `Execute ${tool.name}`,\n parameters: cleanSchema(tool.inputSchema),\n _meta: { ...mcpTool._meta, sessionId: (client as any).getSessionId?.() },\n handler: async (args: any) => {\n // Call the actual MCP tool\n const callResult = await (client as any).callTool(mcpToolName, args ?? {});\n\n // Return the raw result object so middleware can inspect `_meta` (e.g. for UI triggers)\n return callResult;\n }\n }\n });\n }\n\n private async transformToolDefinitions(client: MCPClient): Promise<AguiToolDefinition[]> {\n if (!client.isConnected()) return [];\n\n const result = await client.listTools();\n const serverId = (typeof (client as any).getServerId === 'function'\n ? (client as any).getServerId()\n : undefined) as string | undefined;\n const normalizedPrefix = this.options.prefix?.replace(/-/g, '') ?? serverId?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const prefix = `tool_${normalizedPrefix}`;\n\n return result.tools.map(tool => {\n const mcpTool = tool as any;\n return {\n name: `${prefix}_${tool.name}`,\n description: tool.description || `Execute ${tool.name}`,\n parameters: cleanSchema(tool.inputSchema),\n _meta: { ...mcpTool._meta, sessionId: (client as any).getSessionId?.() },\n };\n });\n }\n\n /**\n * Build AG-UI tools 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<AguiTool[]> {\n const filteredTools = await router.getFilteredTools();\n\n return filteredTools.map(tool => {\n const routedTool = tool as typeof tool & { sessionId?: string; serverName?: string };\n const namespace = routedTool.serverName ?? routedTool.sessionId;\n return {\n name: isMetaTool(tool.name)\n ? tool.name\n : this.getRouterToolKey(tool.name, routedTool.sessionId, routedTool.serverName),\n description: tool.description || `Execute ${tool.name}`,\n parameters: cleanSchema(tool.inputSchema),\n handler: async (args: any) => {\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 return \"Failed to execute meta-tool\";\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 }\n };\n });\n }\n\n private async getToolDefinitionsViaRouter(router: ToolRouter): Promise<AguiToolDefinition[]> {\n const filteredTools = await router.getFilteredTools();\n return filteredTools.map(tool => {\n const routedTool = tool as typeof tool & { sessionId?: string; serverName?: string };\n return {\n name: isMetaTool(tool.name)\n ? tool.name\n : this.getRouterToolKey(tool.name, routedTool.sessionId, routedTool.serverName),\n description: tool.description || `Execute ${tool.name}`,\n parameters: cleanSchema(tool.inputSchema)\n };\n });\n }\n\n private getRouterToolKey(toolName: string, sessionId?: string, serverName?: string): string {\n const namespace = sessionId ?? serverName ?? '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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/shared/meta-tools.ts","../../src/adapters/agui-adapter.ts"],"names":["text","namespace"],"mappings":"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","file":"agui-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_tool_bm25` — BM25 natural language search\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 } from './tool-index.js';\n\n// ---------------------------------------------------------------------------\n// Tool Definitions\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `mcp_search_tool_bm25` 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_tool_bm25',\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 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_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_tool_bm25` 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_tool_bm25 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_tool_bm25.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tool_bm25. 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_tool_bm25` 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_tool_bm25. ' +\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_tool_bm25 results.',\n },\n serverId: {\n type: 'string',\n description:\n 'Optional: The server ID provided in mcp_search_tool_bm25. 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_tool_bm25, 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 = (name: string, namespace?: string): { tool?: IndexedTool; error?: CallToolResult } => {\n try {\n return { tool: router.getToolSchema(name, namespace) };\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_tool_bm25': {\n const query = String(args.query ?? '');\n const limit = Math.min(Number(args.limit) || 5, 20);\n\n // Fast path: Check for select: prefix\n const selectMatch = query.match(/^select:(.+)$/i);\n if (selectMatch) {\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 for (const requestedToolName of requested) {\n const { tool, error } = resolveToolSchema(requestedToolName);\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_tool_bm25.`);\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);\n\n const text = results.length === 0\n ? 'No tools found matching your query. Try different keywords.'\n : results\n .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 .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 : results\n .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 .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_tool_bm25 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_tool_bm25 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\n/** Check if a tool name is one of the meta-tools. */\nexport function isMetaTool(toolName: string): boolean {\n return (\n toolName === 'mcp_search_tool_bm25' ||\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","/**\n * MCP Adapter for AG-UI Integration\n *\n * This adapter transforms MCP tools into formats compatible with AG-UI agents.\n * It provides tools with handlers for server-side execution and tool definitions\n * in JSON Schema format for passing to remote agents.\n *\n * @example\n * ```typescript\n * import { MultiSessionClient } from '@mcp-ts/sdk/server';\n * import { AguiAdapter } from '@mcp-ts/sdk/adapters/agui-adapter';\n * import { createMcpMiddleware } from '@mcp-ts/sdk/adapters/agui-middleware';\n * import { HttpAgent } from '@ag-ui/client';\n *\n * // Create MCP client\n * const mcpClient = new MultiSessionClient('user_123');\n * await mcpClient.connect();\n *\n * // Create adapter and get tools\n * const adapter = new AguiAdapter(mcpClient);\n * const tools = await adapter.getTools();\n *\n * // Use with AG-UI middleware\n * const agent = new HttpAgent({ url: 'http://localhost:8000/agent' });\n * agent.use(createMcpMiddleware({ tools }));\n * ```\n */\n\nimport { MCPClient } from '../server/mcp/oauth-client.js';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client.js';\nimport { ToolRouter } from '../shared/tool-router.js';\nimport { executeMetaTool, isMetaTool } from '../shared/meta-tools.js';\n\n/**\n * Extended JSON Schema properties that Pydantic's strict validation rejects.\n * These are valid JSON Schema extensions but not part of the core spec.\n */\nconst PYDANTIC_FORBIDDEN_PROPS = [\n // JSON Schema meta-properties\n '$schema', '$id', '$comment', '$defs', 'definitions',\n // Extended properties used by some MCP servers (e.g., Apify)\n 'prefill', 'examples', 'enumTitles', 'enumDescriptions',\n // Other common extensions\n 'deprecated', 'readOnly', 'writeOnly', 'contentMediaType', 'contentEncoding',\n];\n\n/**\n * Cleans a JSON Schema by removing meta-properties that cause issues with\n * strict Pydantic validation (e.g., Google ADK, LangGraph).\n *\n * @param schema - The JSON Schema to clean\n * @returns Cleaned schema without forbidden properties\n */\nexport function cleanSchema(schema: Record<string, any> | undefined): Record<string, any> {\n if (!schema) {\n return { type: 'object', properties: {} };\n }\n\n const cleaned = { ...schema };\n\n // Remove all forbidden properties\n for (const prop of PYDANTIC_FORBIDDEN_PROPS) {\n delete cleaned[prop];\n }\n\n // Recursively clean nested properties\n if (cleaned.properties && typeof cleaned.properties === 'object') {\n const cleanedProps: Record<string, any> = {};\n for (const [key, value] of Object.entries(cleaned.properties)) {\n if (typeof value === 'object' && value !== null) {\n cleanedProps[key] = cleanSchema(value as Record<string, any>);\n } else {\n cleanedProps[key] = value;\n }\n }\n cleaned.properties = cleanedProps;\n }\n\n // Clean items if it's an array schema\n if (cleaned.items && typeof cleaned.items === 'object') {\n cleaned.items = cleanSchema(cleaned.items);\n }\n\n // Clean additionalProperties if it's an object schema\n if (cleaned.additionalProperties && typeof cleaned.additionalProperties === 'object') {\n cleaned.additionalProperties = cleanSchema(cleaned.additionalProperties);\n }\n\n return cleaned;\n}\n\n/**\n * Configuration options for AguiAdapter\n */\nexport interface AguiAdapterOptions {\n /**\n * Prefix for tool names to avoid collision with other tools.\n * @default serverId or 'mcp'\n */\n prefix?: string;\n\n /**\n * Optional ToolRouter for intelligent tool selection.\n */\n toolRouter?: ToolRouter;\n}\n\n/**\n * AG-UI Tool with handler for server-side execution.\n */\nexport interface AguiTool {\n name: string;\n description: string;\n parameters?: Record<string, any>;\n _meta?: Record<string, any>; // Add _meta to AguiTool\n handler?: (args: any) => any | Promise<any>;\n}\n\n/**\n * Tool definition format for passing to remote agents (without handler).\n */\nexport interface AguiToolDefinition {\n name: string;\n description: string;\n parameters: Record<string, any>;\n _meta?: Record<string, any>; // Add _meta to AguiToolDefinition\n}\n\n/**\n * Adapter that transforms MCP tools into AG-UI compatible formats.\n */\nexport class AguiAdapter {\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: AguiAdapterOptions = {}\n ) { }\n\n /**\n * Get tools with handlers for MCP tool execution.\n */\n async getTools(): Promise<AguiTool[]> {\n if (this.options.toolRouter) {\n return this.getToolsViaRouter(this.options.toolRouter);\n }\n\n if (this.isMultiSession()) {\n const clients = (this.client as MultiSessionClient).getClients();\n const allTools: AguiTool[] = [];\n for (const client of clients) {\n allTools.push(...await this.transformTools(client));\n }\n return allTools;\n }\n return this.transformTools(this.client as MCPClient);\n }\n\n /**\n * Get tool definitions in JSON Schema format for passing to remote agents.\n */\n async getToolDefinitions(): Promise<AguiToolDefinition[]> {\n if (this.options.toolRouter) {\n return this.getToolDefinitionsViaRouter(this.options.toolRouter);\n }\n\n if (this.isMultiSession()) {\n const clients = (this.client as MultiSessionClient).getClients();\n const allTools: AguiToolDefinition[] = [];\n for (const client of clients) {\n allTools.push(...await this.transformToolDefinitions(client));\n }\n return allTools;\n }\n return this.transformToolDefinitions(this.client as MCPClient);\n }\n\n /**\n * Get tools as a function (for dynamic loading).\n */\n getToolsFunction(): () => Promise<AguiTool[]> {\n return () => this.getTools();\n }\n\n private isMultiSession(): boolean {\n return typeof (this.client as any).getClients === 'function';\n }\n\n private async transformTools(client: MCPClient): Promise<AguiTool[]> {\n if (!client.isConnected()) return [];\n\n const result = await client.listTools();\n const serverId = (typeof (client as any).getServerId === 'function'\n ? (client as any).getServerId()\n : undefined) as string | undefined;\n const normalizedPrefix = this.options.prefix?.replace(/-/g, '') ?? serverId?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const prefix = `tool_${normalizedPrefix}`;\n\n return result.tools.map(tool => {\n // Type assertion to access _meta if it exists on the tool object (it comes from MCP SDK)\n const mcpTool = tool as any;\n const mcpToolName = tool.name;\n return {\n name: `${prefix}_${tool.name}`,\n description: tool.description || `Execute ${tool.name}`,\n parameters: cleanSchema(tool.inputSchema),\n _meta: { ...mcpTool._meta, sessionId: (client as any).getSessionId?.() },\n handler: async (args: any) => {\n // Call the actual MCP tool\n const callResult = await (client as any).callTool(mcpToolName, args ?? {});\n\n // Return the raw result object so middleware can inspect `_meta` (e.g. for UI triggers)\n return callResult;\n }\n }\n });\n }\n\n private async transformToolDefinitions(client: MCPClient): Promise<AguiToolDefinition[]> {\n if (!client.isConnected()) return [];\n\n const result = await client.listTools();\n const serverId = (typeof (client as any).getServerId === 'function'\n ? (client as any).getServerId()\n : undefined) as string | undefined;\n const normalizedPrefix = this.options.prefix?.replace(/-/g, '') ?? serverId?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const prefix = `tool_${normalizedPrefix}`;\n\n return result.tools.map(tool => {\n const mcpTool = tool as any;\n return {\n name: `${prefix}_${tool.name}`,\n description: tool.description || `Execute ${tool.name}`,\n parameters: cleanSchema(tool.inputSchema),\n _meta: { ...mcpTool._meta, sessionId: (client as any).getSessionId?.() },\n };\n });\n }\n\n /**\n * Build AG-UI tools 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<AguiTool[]> {\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 return {\n name: isMetaTool(tool.name)\n ? tool.name\n : this.getRouterToolKey(tool.name, routedTool.sessionId, routedTool.serverId),\n description: tool.description || `Execute ${tool.name}`,\n parameters: cleanSchema(tool.inputSchema),\n handler: async (args: any) => {\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 return \"Failed to execute meta-tool\";\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 }\n };\n });\n }\n\n private async getToolDefinitionsViaRouter(router: ToolRouter): Promise<AguiToolDefinition[]> {\n const filteredTools = await router.getFilteredTools();\n return filteredTools.map(tool => {\n const routedTool = tool as typeof tool & { sessionId?: string; serverId?: string; serverName?: string };\n return {\n name: isMetaTool(tool.name)\n ? tool.name\n : this.getRouterToolKey(tool.name, routedTool.sessionId, routedTool.serverId),\n description: tool.description || `Execute ${tool.name}`,\n parameters: cleanSchema(tool.inputSchema)\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"]}
|
|
@@ -7,7 +7,7 @@ import '../events-CK3N--3g.mjs';
|
|
|
7
7
|
import '@modelcontextprotocol/sdk/types.js';
|
|
8
8
|
import '@modelcontextprotocol/sdk/client/auth.js';
|
|
9
9
|
import '@modelcontextprotocol/sdk/shared/auth.js';
|
|
10
|
-
import '../tool-router-
|
|
10
|
+
import '../tool-router-DK0RJblO.mjs';
|
|
11
11
|
import '../types-CfCoIsWI.mjs';
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -36,9 +36,13 @@ declare class McpMiddleware extends Middleware {
|
|
|
36
36
|
constructor(config: McpMiddlewareConfig);
|
|
37
37
|
private isMcpTool;
|
|
38
38
|
private parseArgs;
|
|
39
|
+
private normalizeArgsString;
|
|
39
40
|
private executeTool;
|
|
40
41
|
private generateId;
|
|
41
42
|
private ensureIds;
|
|
43
|
+
private getSnapshotToolCalls;
|
|
44
|
+
private getResolvedToolCallIds;
|
|
45
|
+
private shouldFilterMessagesSnapshot;
|
|
42
46
|
/** Process tool call events and update state */
|
|
43
47
|
private handleToolCallEvent;
|
|
44
48
|
/** Execute pending MCP tools and return results */
|
|
@@ -7,7 +7,7 @@ import '../events-CK3N--3g.js';
|
|
|
7
7
|
import '@modelcontextprotocol/sdk/types.js';
|
|
8
8
|
import '@modelcontextprotocol/sdk/client/auth.js';
|
|
9
9
|
import '@modelcontextprotocol/sdk/shared/auth.js';
|
|
10
|
-
import '../tool-router-
|
|
10
|
+
import '../tool-router-DsKhRmJm.js';
|
|
11
11
|
import '../types-CfCoIsWI.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -36,9 +36,13 @@ declare class McpMiddleware extends Middleware {
|
|
|
36
36
|
constructor(config: McpMiddlewareConfig);
|
|
37
37
|
private isMcpTool;
|
|
38
38
|
private parseArgs;
|
|
39
|
+
private normalizeArgsString;
|
|
39
40
|
private executeTool;
|
|
40
41
|
private generateId;
|
|
41
42
|
private ensureIds;
|
|
43
|
+
private getSnapshotToolCalls;
|
|
44
|
+
private getResolvedToolCallIds;
|
|
45
|
+
private shouldFilterMessagesSnapshot;
|
|
42
46
|
/** Process tool call events and update state */
|
|
43
47
|
private handleToolCallEvent;
|
|
44
48
|
/** Execute pending MCP tools and return results */
|
|
@@ -89,6 +89,9 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
89
89
|
return {};
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
+
normalizeArgsString(argsString) {
|
|
93
|
+
return JSON.stringify(this.parseArgs(argsString));
|
|
94
|
+
}
|
|
92
95
|
async executeTool(toolName, args) {
|
|
93
96
|
const tool = this.tools.find((t) => t.name === toolName);
|
|
94
97
|
if (!tool?.handler) {
|
|
@@ -113,11 +116,55 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
113
116
|
if (!anyInput.threadId) anyInput.threadId = this.generateId("mcp_thread");
|
|
114
117
|
if (!anyInput.runId) anyInput.runId = this.generateId("mcp_run");
|
|
115
118
|
}
|
|
119
|
+
getSnapshotToolCalls(message) {
|
|
120
|
+
const rawToolCalls = Array.isArray(message?.toolCalls) ? message.toolCalls : Array.isArray(message?.tool_calls) ? message.tool_calls : [];
|
|
121
|
+
return rawToolCalls.flatMap((toolCall) => {
|
|
122
|
+
if (!toolCall || typeof toolCall !== "object") return [];
|
|
123
|
+
const id = typeof toolCall.id === "string" ? toolCall.id : void 0;
|
|
124
|
+
const fn = toolCall.function && typeof toolCall.function === "object" ? toolCall.function : void 0;
|
|
125
|
+
const name = typeof fn?.name === "string" ? fn.name : typeof toolCall.name === "string" ? toolCall.name : void 0;
|
|
126
|
+
if (!id || !name) return [];
|
|
127
|
+
const rawArgs = fn?.arguments ?? toolCall.arguments ?? toolCall.args;
|
|
128
|
+
const argsString = typeof rawArgs === "string" ? rawArgs : rawArgs && typeof rawArgs === "object" ? JSON.stringify(rawArgs) : "{}";
|
|
129
|
+
return [{ id, name, arguments: argsString }];
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
getResolvedToolCallIds(messages) {
|
|
133
|
+
const resolved = /* @__PURE__ */ new Set();
|
|
134
|
+
for (const message of messages) {
|
|
135
|
+
if (message?.role !== "tool") continue;
|
|
136
|
+
const toolCallId = message.toolCallId ?? message.tool_call_id;
|
|
137
|
+
if (typeof toolCallId === "string") {
|
|
138
|
+
resolved.add(toolCallId);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return resolved;
|
|
142
|
+
}
|
|
143
|
+
shouldFilterMessagesSnapshot(event, state) {
|
|
144
|
+
if (state.completedMcpCalls.size === 0 || state.pendingMcpCalls.size > 0) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
if (!state.assistantMessageId && !state.textContent) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
const messages = event.messages;
|
|
151
|
+
if (!Array.isArray(messages)) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
const lastAssistant = [...messages].reverse().find((message) => message?.role === "assistant");
|
|
155
|
+
if (!lastAssistant) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
return typeof lastAssistant.id === "string" && lastAssistant.id === state.assistantMessageId || typeof lastAssistant.content === "string" && lastAssistant.content === state.textContent;
|
|
159
|
+
}
|
|
116
160
|
/** Process tool call events and update state */
|
|
117
161
|
handleToolCallEvent(event, state) {
|
|
118
|
-
const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls } = state;
|
|
119
|
-
if (event.type === client.EventType.TEXT_MESSAGE_CHUNK) {
|
|
162
|
+
const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;
|
|
163
|
+
if (event.type === client.EventType.TEXT_MESSAGE_CHUNK || event.type === client.EventType.TEXT_MESSAGE_CONTENT) {
|
|
120
164
|
const e = event;
|
|
165
|
+
if (typeof e.messageId === "string") {
|
|
166
|
+
state.assistantMessageId = e.messageId;
|
|
167
|
+
}
|
|
121
168
|
if (e.delta) {
|
|
122
169
|
state.textContent = (state.textContent || "") + e.delta;
|
|
123
170
|
}
|
|
@@ -126,7 +173,7 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
126
173
|
const e = event;
|
|
127
174
|
if (e.toolCallId && e.toolCallName) {
|
|
128
175
|
toolCallNames.set(e.toolCallId, e.toolCallName);
|
|
129
|
-
if (this.isMcpTool(e.toolCallName)) {
|
|
176
|
+
if (this.isMcpTool(e.toolCallName) && !completedMcpCalls.has(e.toolCallId)) {
|
|
130
177
|
pendingMcpCalls.add(e.toolCallId);
|
|
131
178
|
}
|
|
132
179
|
console.log(`[McpMiddleware] TOOL_CALL_START: ${e.toolCallName} (id: ${e.toolCallId}, isMCP: ${this.isMcpTool(e.toolCallName)})`);
|
|
@@ -143,27 +190,42 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
143
190
|
const e = event;
|
|
144
191
|
console.log(`[McpMiddleware] TOOL_CALL_END: ${toolCallNames.get(e.toolCallId) ?? "unknown"} (id: ${e.toolCallId})`);
|
|
145
192
|
}
|
|
193
|
+
if (event.type === client.EventType.TOOL_CALL_RESULT) {
|
|
194
|
+
const e = event;
|
|
195
|
+
if (typeof e.toolCallId === "string") {
|
|
196
|
+
pendingMcpCalls.delete(e.toolCallId);
|
|
197
|
+
completedMcpCalls.add(e.toolCallId);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
146
200
|
if (event.type === client.EventType.MESSAGES_SNAPSHOT) {
|
|
147
201
|
const messages = event.messages || [];
|
|
148
202
|
if (messages.length > 0) {
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
203
|
+
const resolvedToolCallIds = this.getResolvedToolCallIds(messages);
|
|
204
|
+
for (const toolCallId of [...pendingMcpCalls]) {
|
|
205
|
+
if (resolvedToolCallIds.has(toolCallId) || completedMcpCalls.has(toolCallId)) {
|
|
206
|
+
pendingMcpCalls.delete(toolCallId);
|
|
207
|
+
}
|
|
152
208
|
}
|
|
153
209
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
154
210
|
const msg = messages[i];
|
|
155
|
-
const tools =
|
|
211
|
+
const tools = this.getSnapshotToolCalls(msg).filter(
|
|
212
|
+
(tc) => !resolvedToolCallIds.has(tc.id) && !completedMcpCalls.has(tc.id) && this.isMcpTool(tc.name)
|
|
213
|
+
);
|
|
156
214
|
if (msg.role === "assistant" && tools.length > 0) {
|
|
157
215
|
for (const tc of tools) {
|
|
158
|
-
if (
|
|
159
|
-
toolCallNames.set(tc.id, tc.
|
|
160
|
-
toolCallArgsBuffer.set(tc.id, tc.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
console.log(`[McpMiddleware] MESSAGES_SNAPSHOT: Discovered ${tc.function.name} (id: ${tc.id})`);
|
|
164
|
-
}
|
|
216
|
+
if (!toolCallNames.has(tc.id)) {
|
|
217
|
+
toolCallNames.set(tc.id, tc.name);
|
|
218
|
+
toolCallArgsBuffer.set(tc.id, tc.arguments || "{}");
|
|
219
|
+
pendingMcpCalls.add(tc.id);
|
|
220
|
+
console.log(`[McpMiddleware] MESSAGES_SNAPSHOT: Discovered ${tc.name} (id: ${tc.id})`);
|
|
165
221
|
}
|
|
166
222
|
}
|
|
223
|
+
if (typeof msg.id === "string") {
|
|
224
|
+
state.assistantMessageId = msg.id;
|
|
225
|
+
}
|
|
226
|
+
if (typeof msg.content === "string") {
|
|
227
|
+
state.textContent = msg.content;
|
|
228
|
+
}
|
|
167
229
|
break;
|
|
168
230
|
}
|
|
169
231
|
}
|
|
@@ -172,9 +234,13 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
172
234
|
}
|
|
173
235
|
/** Execute pending MCP tools and return results */
|
|
174
236
|
async executeTools(state) {
|
|
175
|
-
const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls } = state;
|
|
237
|
+
const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;
|
|
176
238
|
const results = [];
|
|
177
239
|
const promises = [...pendingMcpCalls].map(async (toolCallId) => {
|
|
240
|
+
if (completedMcpCalls.has(toolCallId)) {
|
|
241
|
+
pendingMcpCalls.delete(toolCallId);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
178
244
|
const toolName = toolCallNames.get(toolCallId);
|
|
179
245
|
if (!toolName) return;
|
|
180
246
|
const args = this.parseArgs(toolCallArgsBuffer.get(toolCallId) || "{}");
|
|
@@ -187,6 +253,7 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
187
253
|
messageId: this.generateId("mcp_result")
|
|
188
254
|
});
|
|
189
255
|
pendingMcpCalls.delete(toolCallId);
|
|
256
|
+
completedMcpCalls.add(toolCallId);
|
|
190
257
|
});
|
|
191
258
|
await Promise.all(promises);
|
|
192
259
|
return results;
|
|
@@ -207,10 +274,13 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
207
274
|
}
|
|
208
275
|
run(input, next) {
|
|
209
276
|
return new rxjs.Observable((observer) => {
|
|
277
|
+
const subscriptions = /* @__PURE__ */ new Set();
|
|
278
|
+
let continuationInProgress = false;
|
|
210
279
|
const state = {
|
|
211
280
|
toolCallArgsBuffer: /* @__PURE__ */ new Map(),
|
|
212
281
|
toolCallNames: /* @__PURE__ */ new Map(),
|
|
213
282
|
pendingMcpCalls: /* @__PURE__ */ new Set(),
|
|
283
|
+
completedMcpCalls: /* @__PURE__ */ new Set(),
|
|
214
284
|
textContent: "",
|
|
215
285
|
error: false
|
|
216
286
|
};
|
|
@@ -236,10 +306,11 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
236
306
|
return;
|
|
237
307
|
}
|
|
238
308
|
console.log(`[McpMiddleware] RUN_FINISHED with ${state.pendingMcpCalls.size} pending calls`);
|
|
309
|
+
continuationInProgress = true;
|
|
239
310
|
const toolCalls = [];
|
|
240
311
|
for (const toolCallId of state.pendingMcpCalls) {
|
|
241
312
|
const name = state.toolCallNames.get(toolCallId);
|
|
242
|
-
const args = state.toolCallArgsBuffer.get(toolCallId) || "{}";
|
|
313
|
+
const args = this.normalizeArgsString(state.toolCallArgsBuffer.get(toolCallId) || "{}");
|
|
243
314
|
if (name) {
|
|
244
315
|
toolCalls.push({
|
|
245
316
|
id: toolCallId,
|
|
@@ -250,11 +321,11 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
250
321
|
}
|
|
251
322
|
if (toolCalls.length > 0 || state.textContent) {
|
|
252
323
|
const assistantMsg = {
|
|
253
|
-
id: this.generateId("msg_ast"),
|
|
324
|
+
id: state.assistantMessageId || this.generateId("msg_ast"),
|
|
254
325
|
role: "assistant",
|
|
255
326
|
content: state.textContent || null,
|
|
256
327
|
// Ensure null if empty string for strict LLMs
|
|
257
|
-
|
|
328
|
+
toolCalls: toolCalls.length > 0 ? toolCalls : void 0
|
|
258
329
|
};
|
|
259
330
|
input.messages.push(assistantMsg);
|
|
260
331
|
console.log(`[McpMiddleware] Added assistant message to history before tools: ${state.textContent?.slice(0, 50)}... [${toolCalls.length} tools]`);
|
|
@@ -266,34 +337,43 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
266
337
|
input.messages.push({
|
|
267
338
|
id: messageId,
|
|
268
339
|
role: "tool",
|
|
269
|
-
|
|
340
|
+
toolCallId,
|
|
270
341
|
content: result
|
|
271
342
|
});
|
|
272
343
|
}
|
|
273
344
|
state.toolCallArgsBuffer.clear();
|
|
274
345
|
state.toolCallNames.clear();
|
|
346
|
+
state.assistantMessageId = void 0;
|
|
275
347
|
state.textContent = "";
|
|
276
|
-
anyInput.runId = this.generateId("mcp_run");
|
|
277
348
|
console.log(`[McpMiddleware] === CONTINUATION RUN === messages: ${input.messages.length}`);
|
|
278
|
-
|
|
349
|
+
subscribeToRun(true);
|
|
350
|
+
};
|
|
351
|
+
const subscribeToRun = (isContinuation) => {
|
|
352
|
+
let subscription = new rxjs.Subscription();
|
|
353
|
+
subscription = next.run(input).subscribe({
|
|
279
354
|
next: (event) => {
|
|
280
355
|
if (state.error) return;
|
|
281
356
|
this.handleToolCallEvent(event, state);
|
|
282
357
|
if (event.type === client.EventType.RUN_ERROR) {
|
|
283
|
-
console.log(`[McpMiddleware] RUN_ERROR received in continuation`);
|
|
358
|
+
console.log(`[McpMiddleware] RUN_ERROR received${isContinuation ? " in continuation" : ""}`);
|
|
284
359
|
state.error = true;
|
|
285
360
|
observer.next(event);
|
|
286
361
|
observer.complete();
|
|
287
362
|
return;
|
|
288
363
|
}
|
|
289
|
-
if (event.type === client.EventType.RUN_STARTED) {
|
|
364
|
+
if (isContinuation && event.type === client.EventType.RUN_STARTED) {
|
|
290
365
|
console.log(`[McpMiddleware] Filtering RUN_STARTED from continuation`);
|
|
291
366
|
return;
|
|
292
367
|
}
|
|
368
|
+
if (event.type === client.EventType.MESSAGES_SNAPSHOT && this.shouldFilterMessagesSnapshot(event, state)) {
|
|
369
|
+
console.log(`[McpMiddleware] Filtering completed MCP MESSAGES_SNAPSHOT to preserve streamed message order`);
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
293
372
|
if (event.type === client.EventType.RUN_FINISHED) {
|
|
294
373
|
if (state.pendingMcpCalls.size > 0) {
|
|
295
374
|
handleRunFinished();
|
|
296
375
|
} else {
|
|
376
|
+
continuationInProgress = false;
|
|
297
377
|
observer.next(event);
|
|
298
378
|
observer.complete();
|
|
299
379
|
}
|
|
@@ -303,39 +383,26 @@ var McpMiddleware = class extends client.Middleware {
|
|
|
303
383
|
},
|
|
304
384
|
error: (err) => {
|
|
305
385
|
state.error = true;
|
|
386
|
+
continuationInProgress = false;
|
|
306
387
|
observer.error(err);
|
|
307
388
|
},
|
|
308
389
|
complete: () => {
|
|
309
|
-
|
|
390
|
+
subscriptions.delete(subscription);
|
|
391
|
+
if (!state.error && state.pendingMcpCalls.size === 0 && !continuationInProgress) observer.complete();
|
|
310
392
|
}
|
|
311
393
|
});
|
|
394
|
+
if (!subscription.closed) {
|
|
395
|
+
subscriptions.add(subscription);
|
|
396
|
+
}
|
|
397
|
+
return subscription;
|
|
312
398
|
};
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
if (event.type === client.EventType.RUN_ERROR) {
|
|
318
|
-
console.log(`[McpMiddleware] RUN_ERROR received`);
|
|
319
|
-
state.error = true;
|
|
320
|
-
observer.next(event);
|
|
321
|
-
observer.complete();
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
if (event.type === client.EventType.RUN_FINISHED) {
|
|
325
|
-
handleRunFinished();
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
observer.next(event);
|
|
329
|
-
},
|
|
330
|
-
error: (err) => {
|
|
331
|
-
state.error = true;
|
|
332
|
-
observer.error(err);
|
|
333
|
-
},
|
|
334
|
-
complete: () => {
|
|
335
|
-
if (!state.error && state.pendingMcpCalls.size === 0) observer.complete();
|
|
399
|
+
subscribeToRun(false);
|
|
400
|
+
return () => {
|
|
401
|
+
for (const subscription of subscriptions) {
|
|
402
|
+
subscription.unsubscribe();
|
|
336
403
|
}
|
|
337
|
-
|
|
338
|
-
|
|
404
|
+
subscriptions.clear();
|
|
405
|
+
};
|
|
339
406
|
});
|
|
340
407
|
}
|
|
341
408
|
};
|