@mcp-ts/sdk 2.4.5 → 2.5.1

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 (86) hide show
  1. package/dist/adapters/agui-adapter.d.mts +3 -3
  2. package/dist/adapters/agui-adapter.d.ts +3 -3
  3. package/dist/adapters/agui-adapter.js.map +1 -1
  4. package/dist/adapters/agui-adapter.mjs.map +1 -1
  5. package/dist/adapters/agui-middleware.d.mts +3 -3
  6. package/dist/adapters/agui-middleware.d.ts +3 -3
  7. package/dist/adapters/agui-middleware.js.map +1 -1
  8. package/dist/adapters/agui-middleware.mjs.map +1 -1
  9. package/dist/adapters/ai-adapter.d.mts +3 -3
  10. package/dist/adapters/ai-adapter.d.ts +3 -3
  11. package/dist/adapters/ai-adapter.js.map +1 -1
  12. package/dist/adapters/ai-adapter.mjs.map +1 -1
  13. package/dist/adapters/langchain-adapter.d.mts +3 -3
  14. package/dist/adapters/langchain-adapter.d.ts +3 -3
  15. package/dist/adapters/langchain-adapter.js +2 -2
  16. package/dist/adapters/langchain-adapter.js.map +1 -1
  17. package/dist/adapters/langchain-adapter.mjs +2 -2
  18. package/dist/adapters/langchain-adapter.mjs.map +1 -1
  19. package/dist/adapters/mastra-adapter.d.mts +2 -2
  20. package/dist/adapters/mastra-adapter.d.ts +2 -2
  21. package/dist/adapters/mastra-adapter.js +2 -2
  22. package/dist/adapters/mastra-adapter.js.map +1 -1
  23. package/dist/adapters/mastra-adapter.mjs +2 -2
  24. package/dist/adapters/mastra-adapter.mjs.map +1 -1
  25. package/dist/client/index.d.mts +2 -2
  26. package/dist/client/index.d.ts +2 -2
  27. package/dist/client/index.js +9 -0
  28. package/dist/client/index.js.map +1 -1
  29. package/dist/client/index.mjs +9 -0
  30. package/dist/client/index.mjs.map +1 -1
  31. package/dist/client/react.d.mts +15 -4
  32. package/dist/client/react.d.ts +15 -4
  33. package/dist/client/react.js +56 -37
  34. package/dist/client/react.js.map +1 -1
  35. package/dist/client/react.mjs +56 -37
  36. package/dist/client/react.mjs.map +1 -1
  37. package/dist/client/vue.d.mts +4 -4
  38. package/dist/client/vue.d.ts +4 -4
  39. package/dist/client/vue.js +9 -0
  40. package/dist/client/vue.js.map +1 -1
  41. package/dist/client/vue.mjs +9 -0
  42. package/dist/client/vue.mjs.map +1 -1
  43. package/dist/{index-CZk2gu2E.d.ts → index-BEdyuz1M.d.ts} +6 -1
  44. package/dist/{index-CkM3p0eE.d.mts → index-C99wE2Zf.d.mts} +6 -1
  45. package/dist/index.d.mts +4 -4
  46. package/dist/index.d.ts +4 -4
  47. package/dist/index.js +380 -82
  48. package/dist/index.js.map +1 -1
  49. package/dist/index.mjs +376 -82
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/{multi-session-client-QOOPdEVp.d.ts → multi-session-client-CclWRxTD.d.mts} +14 -2
  52. package/dist/{multi-session-client-ChQrBZhF.d.mts → multi-session-client-DzvZD6Tt.d.ts} +14 -2
  53. package/dist/server/index.d.mts +18 -4
  54. package/dist/server/index.d.ts +18 -4
  55. package/dist/server/index.js +371 -82
  56. package/dist/server/index.js.map +1 -1
  57. package/dist/server/index.mjs +367 -82
  58. package/dist/server/index.mjs.map +1 -1
  59. package/dist/shared/index.d.mts +4 -4
  60. package/dist/shared/index.d.ts +4 -4
  61. package/dist/shared/index.js.map +1 -1
  62. package/dist/shared/index.mjs.map +1 -1
  63. package/dist/{tool-router-CGs3IDOJ.d.mts → tool-router-C9ECn3FX.d.mts} +1 -1
  64. package/dist/{tool-router-DQ-HrD7W.d.ts → tool-router-CUSSk6lT.d.ts} +1 -1
  65. package/dist/{types-Bf-7GOLW.d.mts → types-CbFbPkfQ.d.mts} +38 -3
  66. package/dist/{types-Bf-7GOLW.d.ts → types-CbFbPkfQ.d.ts} +38 -3
  67. package/migrations/neon/20260513010000_install_mcp_sessions.sql +1 -0
  68. package/migrations/supabase/20260330195700_install_mcp_sessions.sql +1 -0
  69. package/package.json +2 -2
  70. package/src/adapters/agui-adapter.ts +6 -2
  71. package/src/adapters/ai-adapter.ts +3 -1
  72. package/src/adapters/langchain-adapter.ts +5 -3
  73. package/src/adapters/mastra-adapter.ts +5 -3
  74. package/src/client/core/sse-client.ts +21 -0
  75. package/src/client/react/oauth-popup.tsx +17 -24
  76. package/src/client/react/use-mcp.ts +69 -15
  77. package/src/server/handlers/sse-handler.ts +202 -9
  78. package/src/server/mcp/multi-session-client.ts +7 -3
  79. package/src/server/mcp/oauth-client.ts +25 -10
  80. package/src/server/mcp/tool-policy-gateway.ts +90 -0
  81. package/src/server/storage/neon-backend.ts +65 -60
  82. package/src/server/storage/session-lifecycle.ts +5 -0
  83. package/src/server/storage/supabase-backend.ts +27 -15
  84. package/src/server/storage/tool-policy.ts +89 -0
  85. package/src/server/storage/types.ts +11 -0
  86. package/src/shared/types.ts +52 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/agui-adapter.ts","../../src/adapters/agui-middleware.ts"],"names":["Middleware","EventType","Observable","Subscription"],"mappings":"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","file":"agui-middleware.js","sourcesContent":["/**\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","/**\n * AG-UI Middleware for MCP Tool Execution\n *\n * This middleware intercepts tool calls from remote agents and executes\n * MCP tools server-side, returning results back to the agent.\n *\n * @requires @ag-ui/client - Peer dependency for AG-UI types\n * @requires rxjs - Uses RxJS Observables for event streaming\n */\n\nimport { Observable, Subscriber, Subscription } from 'rxjs';\nimport {\n Middleware,\n EventType,\n type AbstractAgent,\n type RunAgentInput,\n type BaseEvent,\n type ToolCallEndEvent,\n type Tool,\n} from '@ag-ui/client';\nimport { type AguiTool, cleanSchema } from './agui-adapter.js';\n\n/** Tool execution result for continuation */\ninterface ToolResult {\n toolCallId: string;\n toolName: string;\n result: string;\n messageId: string;\n}\n\ninterface SnapshotToolCall {\n id: string;\n name: string;\n arguments: string;\n}\n\n/** State for tracking tool calls during a run */\ninterface RunState {\n toolCallArgsBuffer: Map<string, string>;\n toolCallNames: Map<string, string>;\n pendingMcpCalls: Set<string>;\n completedMcpCalls: Set<string>;\n assistantMessageId?: string;\n textContent?: string;\n error: boolean;\n}\n\n/**\n * Configuration for McpMiddleware\n */\nexport interface McpMiddlewareConfig {\n /** Pre-loaded tools with handlers (required) */\n tools: AguiTool[];\n}\n\n/**\n * AG-UI Middleware that executes MCP tools server-side.\n */\nexport class McpMiddleware extends Middleware {\n private tools: AguiTool[];\n private toolSchemas: Tool[];\n\n constructor(config: McpMiddlewareConfig) {\n super();\n this.tools = config.tools;\n this.toolSchemas = this.tools.map((t: AguiTool) => ({\n name: t.name,\n description: t.description,\n parameters: cleanSchema(t.parameters),\n }));\n }\n\n private isMcpTool(toolName: string): boolean {\n return this.tools.some(t => t.name === toolName);\n }\n\n private parseArgs(argsString: string): Record<string, any> {\n if (!argsString?.trim()) return {};\n\n try {\n return JSON.parse(argsString);\n } catch {\n // Handle duplicated JSON from streaming issues: {...}{...}\n const trimmed = argsString.trim();\n if (trimmed.includes('}{')) {\n const firstObject = trimmed.slice(0, trimmed.indexOf('}{') + 1);\n try {\n return JSON.parse(firstObject);\n } catch {\n console.error(`[McpMiddleware] Failed to parse JSON:`, firstObject);\n }\n }\n console.error(`[McpMiddleware] Failed to parse args:`, argsString);\n return {};\n }\n }\n\n private normalizeArgsString(argsString: string): string {\n return JSON.stringify(this.parseArgs(argsString));\n }\n\n private async executeTool(toolName: string, args: Record<string, any>): Promise<string> {\n const tool = this.tools.find(t => t.name === toolName);\n if (!tool?.handler) {\n return `Error: Tool ${tool ? 'has no handler' : 'not found'}: ${toolName}`;\n }\n\n try {\n console.log(`[McpMiddleware] Executing tool: ${toolName}`, args);\n const result = await tool.handler(args);\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n\n console.log(`[McpMiddleware] Tool result:`, resultStr.slice(0, 200));\n return resultStr;\n } catch (error: any) {\n console.error(`[McpMiddleware] Error executing tool:`, error);\n return `Error: ${error.message || String(error)}`;\n }\n }\n\n private generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private ensureIds(input: RunAgentInput): void {\n const anyInput = input as any;\n if (!anyInput.threadId) anyInput.threadId = this.generateId('mcp_thread');\n if (!anyInput.runId) anyInput.runId = this.generateId('mcp_run');\n }\n\n private getSnapshotToolCalls(message: any): SnapshotToolCall[] {\n const rawToolCalls = Array.isArray(message?.toolCalls)\n ? message.toolCalls\n : (Array.isArray(message?.tool_calls) ? message.tool_calls : []);\n\n return rawToolCalls.flatMap((toolCall: any) => {\n if (!toolCall || typeof toolCall !== 'object') return [];\n\n const id = typeof toolCall.id === 'string' ? toolCall.id : undefined;\n const fn = toolCall.function && typeof toolCall.function === 'object'\n ? toolCall.function\n : undefined;\n const name = typeof fn?.name === 'string'\n ? fn.name\n : (typeof toolCall.name === 'string' ? toolCall.name : undefined);\n\n if (!id || !name) return [];\n\n const rawArgs = fn?.arguments ?? toolCall.arguments ?? toolCall.args;\n const argsString = typeof rawArgs === 'string'\n ? rawArgs\n : (rawArgs && typeof rawArgs === 'object' ? JSON.stringify(rawArgs) : '{}');\n\n return [{ id, name, arguments: argsString }];\n });\n }\n\n private getResolvedToolCallIds(messages: any[]): Set<string> {\n const resolved = new Set<string>();\n for (const message of messages) {\n if (message?.role !== 'tool') continue;\n const toolCallId = message.toolCallId ?? message.tool_call_id;\n if (typeof toolCallId === 'string') {\n resolved.add(toolCallId);\n }\n }\n return resolved;\n }\n\n private shouldFilterMessagesSnapshot(event: BaseEvent, state: RunState): boolean {\n if (state.completedMcpCalls.size === 0 || state.pendingMcpCalls.size > 0) {\n return false;\n }\n\n // Only suppress snapshots that replay an assistant answer we already streamed.\n // Snapshot-only final answers still need to reach the UI.\n if (!state.assistantMessageId && !state.textContent) {\n return false;\n }\n\n const messages = (event as any).messages;\n if (!Array.isArray(messages)) {\n return false;\n }\n\n const lastAssistant = [...messages].reverse().find((message) => message?.role === 'assistant');\n if (!lastAssistant) {\n return false;\n }\n\n return (\n (typeof lastAssistant.id === 'string' && lastAssistant.id === state.assistantMessageId) ||\n (typeof lastAssistant.content === 'string' && lastAssistant.content === state.textContent)\n );\n }\n\n /** Process tool call events and update state */\n private handleToolCallEvent(event: BaseEvent, state: RunState): void {\n const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;\n\n // Accumulate text content for reconstruction\n if (event.type === EventType.TEXT_MESSAGE_CHUNK || event.type === EventType.TEXT_MESSAGE_CONTENT) {\n const e = event as any;\n if (typeof e.messageId === 'string') {\n state.assistantMessageId = e.messageId;\n }\n if (e.delta) {\n state.textContent = (state.textContent || '') + e.delta;\n }\n }\n\n if (event.type === EventType.TOOL_CALL_START) {\n const e = event as any;\n if (e.toolCallId && e.toolCallName) {\n toolCallNames.set(e.toolCallId, e.toolCallName);\n if (this.isMcpTool(e.toolCallName) && !completedMcpCalls.has(e.toolCallId)) {\n pendingMcpCalls.add(e.toolCallId);\n }\n console.log(`[McpMiddleware] TOOL_CALL_START: ${e.toolCallName} (id: ${e.toolCallId}, isMCP: ${this.isMcpTool(e.toolCallName)})`);\n }\n }\n\n if (event.type === EventType.TOOL_CALL_ARGS) {\n const e = event as any;\n if (e.toolCallId && e.delta) {\n const existing = toolCallArgsBuffer.get(e.toolCallId) || '';\n toolCallArgsBuffer.set(e.toolCallId, existing + e.delta);\n }\n }\n\n if (event.type === EventType.TOOL_CALL_END) {\n const e = event as ToolCallEndEvent;\n console.log(`[McpMiddleware] TOOL_CALL_END: ${toolCallNames.get(e.toolCallId) ?? 'unknown'} (id: ${e.toolCallId})`);\n }\n\n if (event.type === EventType.TOOL_CALL_RESULT) {\n const e = event as any;\n if (typeof e.toolCallId === 'string') {\n pendingMcpCalls.delete(e.toolCallId);\n completedMcpCalls.add(e.toolCallId);\n }\n }\n\n // Workaround: Extract parallel tool calls from MESSAGES_SNAPSHOT\n if (event.type === EventType.MESSAGES_SNAPSHOT) {\n const messages = (event as any).messages || [];\n if (messages.length > 0) {\n const resolvedToolCallIds = this.getResolvedToolCallIds(messages);\n\n for (const toolCallId of [...pendingMcpCalls]) {\n if (resolvedToolCallIds.has(toolCallId) || completedMcpCalls.has(toolCallId)) {\n pendingMcpCalls.delete(toolCallId);\n }\n }\n\n // Discover unresolved tools. LangGraph snapshots include historical\n // assistant tool calls, so only calls without a tool result are pending.\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n const tools = this.getSnapshotToolCalls(msg)\n .filter(tc =>\n !resolvedToolCallIds.has(tc.id) &&\n !completedMcpCalls.has(tc.id) &&\n this.isMcpTool(tc.name)\n );\n\n if (msg.role === 'assistant' && tools.length > 0) {\n for (const tc of tools) {\n if (!toolCallNames.has(tc.id)) {\n toolCallNames.set(tc.id, tc.name);\n toolCallArgsBuffer.set(tc.id, tc.arguments || '{}');\n pendingMcpCalls.add(tc.id);\n console.log(`[McpMiddleware] MESSAGES_SNAPSHOT: Discovered ${tc.name} (id: ${tc.id})`);\n }\n }\n if (typeof msg.id === 'string') {\n state.assistantMessageId = msg.id;\n }\n if (typeof msg.content === 'string') {\n state.textContent = msg.content;\n }\n break;\n }\n }\n }\n }\n }\n\n /** Execute pending MCP tools and return results */\n private async executeTools(state: RunState): Promise<ToolResult[]> {\n const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;\n const results: ToolResult[] = [];\n\n const promises = [...pendingMcpCalls].map(async (toolCallId) => {\n if (completedMcpCalls.has(toolCallId)) {\n pendingMcpCalls.delete(toolCallId);\n return;\n }\n\n const toolName = toolCallNames.get(toolCallId);\n if (!toolName) return;\n\n const args = this.parseArgs(toolCallArgsBuffer.get(toolCallId) || '{}');\n console.log(`[McpMiddleware] Executing pending tool: ${toolName}`);\n\n const result = await this.executeTool(toolName, args);\n results.push({\n toolCallId,\n toolName,\n result,\n messageId: this.generateId('mcp_result'),\n });\n pendingMcpCalls.delete(toolCallId);\n completedMcpCalls.add(toolCallId);\n });\n\n await Promise.all(promises);\n return results;\n }\n\n /** Emit tool results (without RUN_FINISHED - that's emitted when truly done) */\n private emitToolResults(observer: Subscriber<BaseEvent>, results: ToolResult[]): void {\n for (const { toolCallId, toolName, result, messageId } of results) {\n observer.next({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId,\n messageId,\n content: result,\n role: 'tool',\n timestamp: Date.now(),\n } as any);\n console.log(`[McpMiddleware] Emitting TOOL_CALL_RESULT for: ${toolName}`);\n }\n }\n\n run(input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent> {\n return new Observable<BaseEvent>((observer: Subscriber<BaseEvent>) => {\n const subscriptions = new Set<Subscription>();\n let continuationInProgress = false;\n const state: RunState = {\n toolCallArgsBuffer: new Map(),\n toolCallNames: new Map(),\n pendingMcpCalls: new Set(),\n completedMcpCalls: new Set(),\n textContent: '',\n error: false,\n };\n\n this.ensureIds(input);\n const anyInput = input as any;\n\n console.log(`[McpMiddleware] === NEW RUN ===`);\n console.log(`[McpMiddleware] threadId: ${anyInput.threadId}, runId: ${anyInput.runId}`);\n console.log(`[McpMiddleware] messages: ${input.messages?.length ?? 0}, tools: ${this.tools?.length ?? 0}`);\n\n // Inject MCP tools\n if (this.toolSchemas?.length) {\n input.tools = [...(input.tools || []), ...this.toolSchemas];\n console.log(`[McpMiddleware] Injected ${this.toolSchemas.length} tools:`, this.toolSchemas.map((t: Tool) => t.name));\n }\n\n const handleRunFinished = async () => {\n if (state.error) return; // Don't continue after error\n\n if (state.pendingMcpCalls.size === 0) {\n observer.next({\n type: EventType.RUN_FINISHED,\n threadId: anyInput.threadId,\n runId: anyInput.runId,\n timestamp: Date.now(),\n } as any);\n observer.complete();\n return;\n }\n\n console.log(`[McpMiddleware] RUN_FINISHED with ${state.pendingMcpCalls.size} pending calls`);\n continuationInProgress = true;\n\n // Reconstruct the Assistant Message that triggered these tools\n const toolCalls = [];\n for (const toolCallId of state.pendingMcpCalls) {\n const name = state.toolCallNames.get(toolCallId);\n const args = this.normalizeArgsString(state.toolCallArgsBuffer.get(toolCallId) || '{}');\n if (name) {\n toolCalls.push({\n id: toolCallId,\n type: 'function',\n function: { name, arguments: args }\n });\n }\n }\n\n // Add the Assistant Message to history FIRST\n if (toolCalls.length > 0 || state.textContent) {\n const assistantMsg = {\n id: state.assistantMessageId || this.generateId('msg_ast'),\n role: 'assistant',\n content: state.textContent || null, // Ensure null if empty string for strict LLMs\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined\n };\n input.messages.push(assistantMsg as any);\n console.log(`[McpMiddleware] Added assistant message to history before tools: ${state.textContent?.slice(0, 50)}... [${toolCalls.length} tools]`);\n }\n\n // Execute tools and emit results (no RUN_FINISHED yet - continuation follows)\n const results = await this.executeTools(state);\n this.emitToolResults(observer, results);\n\n // Prepare continuation\n console.log(`[McpMiddleware] Triggering continuation with ${results.length} results`);\n\n // Add tool result messages to history\n for (const { toolCallId, result, messageId } of results) {\n input.messages.push({\n id: messageId,\n role: 'tool',\n toolCallId,\n content: result,\n } as any);\n }\n\n // Reset state for next turn\n state.toolCallArgsBuffer.clear();\n state.toolCallNames.clear();\n state.assistantMessageId = undefined;\n state.textContent = ''; // Clear text content for next turn\n\n console.log(`[McpMiddleware] === CONTINUATION RUN === messages: ${input.messages.length}`);\n\n subscribeToRun(true);\n };\n\n const subscribeToRun = (isContinuation: boolean): Subscription => {\n let subscription = new Subscription();\n subscription = next.run(input).subscribe({\n next: (event) => {\n if (state.error) return;\n\n this.handleToolCallEvent(event, state);\n\n if (event.type === EventType.RUN_ERROR) {\n console.log(`[McpMiddleware] RUN_ERROR received${isContinuation ? ' in continuation' : ''}`);\n state.error = true;\n observer.next(event);\n observer.complete();\n return;\n }\n\n if (isContinuation && event.type === EventType.RUN_STARTED) {\n console.log(`[McpMiddleware] Filtering RUN_STARTED from continuation`);\n return;\n }\n\n if (event.type === EventType.MESSAGES_SNAPSHOT && this.shouldFilterMessagesSnapshot(event, state)) {\n console.log(`[McpMiddleware] Filtering completed MCP MESSAGES_SNAPSHOT to preserve streamed message order`);\n return;\n }\n\n if (event.type === EventType.RUN_FINISHED) {\n if (state.pendingMcpCalls.size > 0) {\n handleRunFinished();\n } else {\n continuationInProgress = false;\n observer.next(event);\n observer.complete();\n }\n return;\n }\n observer.next(event);\n },\n error: (err) => {\n state.error = true;\n continuationInProgress = false;\n observer.error(err);\n },\n complete: () => {\n subscriptions.delete(subscription);\n if (!state.error && state.pendingMcpCalls.size === 0 && !continuationInProgress) observer.complete();\n },\n });\n if (!subscription.closed) {\n subscriptions.add(subscription);\n }\n return subscription;\n };\n\n subscribeToRun(false);\n\n return () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n subscriptions.clear();\n };\n });\n }\n}\n\n/**\n * Factory function to create MCP middleware.\n */\nexport function createMcpMiddleware(\n options: { tools: AguiTool[] }\n) {\n const middleware = new McpMiddleware(options);\n return (input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent> => {\n return middleware.run(input, next);\n };\n}\n\n// Legacy exports\nexport { McpMiddleware as McpToolExecutorMiddleware };\nexport { createMcpMiddleware as createMcpToolMiddleware };\n\n// Re-exports\nexport { Middleware, EventType };\nexport type { RunAgentInput, BaseEvent, AbstractAgent, ToolCallEndEvent, Tool };\n"]}
1
+ {"version":3,"sources":["../../src/adapters/agui-adapter.ts","../../src/adapters/agui-middleware.ts"],"names":["Middleware","EventType","Observable","Subscription"],"mappings":"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","file":"agui-middleware.js","sourcesContent":["/**\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 type { ToolClient } from '../shared/types.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: ToolClient): 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: ToolClient): 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\n\n\n","/**\n * AG-UI Middleware for MCP Tool Execution\n *\n * This middleware intercepts tool calls from remote agents and executes\n * MCP tools server-side, returning results back to the agent.\n *\n * @requires @ag-ui/client - Peer dependency for AG-UI types\n * @requires rxjs - Uses RxJS Observables for event streaming\n */\n\nimport { Observable, Subscriber, Subscription } from 'rxjs';\nimport {\n Middleware,\n EventType,\n type AbstractAgent,\n type RunAgentInput,\n type BaseEvent,\n type ToolCallEndEvent,\n type Tool,\n} from '@ag-ui/client';\nimport { type AguiTool, cleanSchema } from './agui-adapter.js';\n\n/** Tool execution result for continuation */\ninterface ToolResult {\n toolCallId: string;\n toolName: string;\n result: string;\n messageId: string;\n}\n\ninterface SnapshotToolCall {\n id: string;\n name: string;\n arguments: string;\n}\n\n/** State for tracking tool calls during a run */\ninterface RunState {\n toolCallArgsBuffer: Map<string, string>;\n toolCallNames: Map<string, string>;\n pendingMcpCalls: Set<string>;\n completedMcpCalls: Set<string>;\n assistantMessageId?: string;\n textContent?: string;\n error: boolean;\n}\n\n/**\n * Configuration for McpMiddleware\n */\nexport interface McpMiddlewareConfig {\n /** Pre-loaded tools with handlers (required) */\n tools: AguiTool[];\n}\n\n/**\n * AG-UI Middleware that executes MCP tools server-side.\n */\nexport class McpMiddleware extends Middleware {\n private tools: AguiTool[];\n private toolSchemas: Tool[];\n\n constructor(config: McpMiddlewareConfig) {\n super();\n this.tools = config.tools;\n this.toolSchemas = this.tools.map((t: AguiTool) => ({\n name: t.name,\n description: t.description,\n parameters: cleanSchema(t.parameters),\n }));\n }\n\n private isMcpTool(toolName: string): boolean {\n return this.tools.some(t => t.name === toolName);\n }\n\n private parseArgs(argsString: string): Record<string, any> {\n if (!argsString?.trim()) return {};\n\n try {\n return JSON.parse(argsString);\n } catch {\n // Handle duplicated JSON from streaming issues: {...}{...}\n const trimmed = argsString.trim();\n if (trimmed.includes('}{')) {\n const firstObject = trimmed.slice(0, trimmed.indexOf('}{') + 1);\n try {\n return JSON.parse(firstObject);\n } catch {\n console.error(`[McpMiddleware] Failed to parse JSON:`, firstObject);\n }\n }\n console.error(`[McpMiddleware] Failed to parse args:`, argsString);\n return {};\n }\n }\n\n private normalizeArgsString(argsString: string): string {\n return JSON.stringify(this.parseArgs(argsString));\n }\n\n private async executeTool(toolName: string, args: Record<string, any>): Promise<string> {\n const tool = this.tools.find(t => t.name === toolName);\n if (!tool?.handler) {\n return `Error: Tool ${tool ? 'has no handler' : 'not found'}: ${toolName}`;\n }\n\n try {\n console.log(`[McpMiddleware] Executing tool: ${toolName}`, args);\n const result = await tool.handler(args);\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n\n console.log(`[McpMiddleware] Tool result:`, resultStr.slice(0, 200));\n return resultStr;\n } catch (error: any) {\n console.error(`[McpMiddleware] Error executing tool:`, error);\n return `Error: ${error.message || String(error)}`;\n }\n }\n\n private generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private ensureIds(input: RunAgentInput): void {\n const anyInput = input as any;\n if (!anyInput.threadId) anyInput.threadId = this.generateId('mcp_thread');\n if (!anyInput.runId) anyInput.runId = this.generateId('mcp_run');\n }\n\n private getSnapshotToolCalls(message: any): SnapshotToolCall[] {\n const rawToolCalls = Array.isArray(message?.toolCalls)\n ? message.toolCalls\n : (Array.isArray(message?.tool_calls) ? message.tool_calls : []);\n\n return rawToolCalls.flatMap((toolCall: any) => {\n if (!toolCall || typeof toolCall !== 'object') return [];\n\n const id = typeof toolCall.id === 'string' ? toolCall.id : undefined;\n const fn = toolCall.function && typeof toolCall.function === 'object'\n ? toolCall.function\n : undefined;\n const name = typeof fn?.name === 'string'\n ? fn.name\n : (typeof toolCall.name === 'string' ? toolCall.name : undefined);\n\n if (!id || !name) return [];\n\n const rawArgs = fn?.arguments ?? toolCall.arguments ?? toolCall.args;\n const argsString = typeof rawArgs === 'string'\n ? rawArgs\n : (rawArgs && typeof rawArgs === 'object' ? JSON.stringify(rawArgs) : '{}');\n\n return [{ id, name, arguments: argsString }];\n });\n }\n\n private getResolvedToolCallIds(messages: any[]): Set<string> {\n const resolved = new Set<string>();\n for (const message of messages) {\n if (message?.role !== 'tool') continue;\n const toolCallId = message.toolCallId ?? message.tool_call_id;\n if (typeof toolCallId === 'string') {\n resolved.add(toolCallId);\n }\n }\n return resolved;\n }\n\n private shouldFilterMessagesSnapshot(event: BaseEvent, state: RunState): boolean {\n if (state.completedMcpCalls.size === 0 || state.pendingMcpCalls.size > 0) {\n return false;\n }\n\n // Only suppress snapshots that replay an assistant answer we already streamed.\n // Snapshot-only final answers still need to reach the UI.\n if (!state.assistantMessageId && !state.textContent) {\n return false;\n }\n\n const messages = (event as any).messages;\n if (!Array.isArray(messages)) {\n return false;\n }\n\n const lastAssistant = [...messages].reverse().find((message) => message?.role === 'assistant');\n if (!lastAssistant) {\n return false;\n }\n\n return (\n (typeof lastAssistant.id === 'string' && lastAssistant.id === state.assistantMessageId) ||\n (typeof lastAssistant.content === 'string' && lastAssistant.content === state.textContent)\n );\n }\n\n /** Process tool call events and update state */\n private handleToolCallEvent(event: BaseEvent, state: RunState): void {\n const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;\n\n // Accumulate text content for reconstruction\n if (event.type === EventType.TEXT_MESSAGE_CHUNK || event.type === EventType.TEXT_MESSAGE_CONTENT) {\n const e = event as any;\n if (typeof e.messageId === 'string') {\n state.assistantMessageId = e.messageId;\n }\n if (e.delta) {\n state.textContent = (state.textContent || '') + e.delta;\n }\n }\n\n if (event.type === EventType.TOOL_CALL_START) {\n const e = event as any;\n if (e.toolCallId && e.toolCallName) {\n toolCallNames.set(e.toolCallId, e.toolCallName);\n if (this.isMcpTool(e.toolCallName) && !completedMcpCalls.has(e.toolCallId)) {\n pendingMcpCalls.add(e.toolCallId);\n }\n console.log(`[McpMiddleware] TOOL_CALL_START: ${e.toolCallName} (id: ${e.toolCallId}, isMCP: ${this.isMcpTool(e.toolCallName)})`);\n }\n }\n\n if (event.type === EventType.TOOL_CALL_ARGS) {\n const e = event as any;\n if (e.toolCallId && e.delta) {\n const existing = toolCallArgsBuffer.get(e.toolCallId) || '';\n toolCallArgsBuffer.set(e.toolCallId, existing + e.delta);\n }\n }\n\n if (event.type === EventType.TOOL_CALL_END) {\n const e = event as ToolCallEndEvent;\n console.log(`[McpMiddleware] TOOL_CALL_END: ${toolCallNames.get(e.toolCallId) ?? 'unknown'} (id: ${e.toolCallId})`);\n }\n\n if (event.type === EventType.TOOL_CALL_RESULT) {\n const e = event as any;\n if (typeof e.toolCallId === 'string') {\n pendingMcpCalls.delete(e.toolCallId);\n completedMcpCalls.add(e.toolCallId);\n }\n }\n\n // Workaround: Extract parallel tool calls from MESSAGES_SNAPSHOT\n if (event.type === EventType.MESSAGES_SNAPSHOT) {\n const messages = (event as any).messages || [];\n if (messages.length > 0) {\n const resolvedToolCallIds = this.getResolvedToolCallIds(messages);\n\n for (const toolCallId of [...pendingMcpCalls]) {\n if (resolvedToolCallIds.has(toolCallId) || completedMcpCalls.has(toolCallId)) {\n pendingMcpCalls.delete(toolCallId);\n }\n }\n\n // Discover unresolved tools. LangGraph snapshots include historical\n // assistant tool calls, so only calls without a tool result are pending.\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n const tools = this.getSnapshotToolCalls(msg)\n .filter(tc =>\n !resolvedToolCallIds.has(tc.id) &&\n !completedMcpCalls.has(tc.id) &&\n this.isMcpTool(tc.name)\n );\n\n if (msg.role === 'assistant' && tools.length > 0) {\n for (const tc of tools) {\n if (!toolCallNames.has(tc.id)) {\n toolCallNames.set(tc.id, tc.name);\n toolCallArgsBuffer.set(tc.id, tc.arguments || '{}');\n pendingMcpCalls.add(tc.id);\n console.log(`[McpMiddleware] MESSAGES_SNAPSHOT: Discovered ${tc.name} (id: ${tc.id})`);\n }\n }\n if (typeof msg.id === 'string') {\n state.assistantMessageId = msg.id;\n }\n if (typeof msg.content === 'string') {\n state.textContent = msg.content;\n }\n break;\n }\n }\n }\n }\n }\n\n /** Execute pending MCP tools and return results */\n private async executeTools(state: RunState): Promise<ToolResult[]> {\n const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;\n const results: ToolResult[] = [];\n\n const promises = [...pendingMcpCalls].map(async (toolCallId) => {\n if (completedMcpCalls.has(toolCallId)) {\n pendingMcpCalls.delete(toolCallId);\n return;\n }\n\n const toolName = toolCallNames.get(toolCallId);\n if (!toolName) return;\n\n const args = this.parseArgs(toolCallArgsBuffer.get(toolCallId) || '{}');\n console.log(`[McpMiddleware] Executing pending tool: ${toolName}`);\n\n const result = await this.executeTool(toolName, args);\n results.push({\n toolCallId,\n toolName,\n result,\n messageId: this.generateId('mcp_result'),\n });\n pendingMcpCalls.delete(toolCallId);\n completedMcpCalls.add(toolCallId);\n });\n\n await Promise.all(promises);\n return results;\n }\n\n /** Emit tool results (without RUN_FINISHED - that's emitted when truly done) */\n private emitToolResults(observer: Subscriber<BaseEvent>, results: ToolResult[]): void {\n for (const { toolCallId, toolName, result, messageId } of results) {\n observer.next({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId,\n messageId,\n content: result,\n role: 'tool',\n timestamp: Date.now(),\n } as any);\n console.log(`[McpMiddleware] Emitting TOOL_CALL_RESULT for: ${toolName}`);\n }\n }\n\n run(input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent> {\n return new Observable<BaseEvent>((observer: Subscriber<BaseEvent>) => {\n const subscriptions = new Set<Subscription>();\n let continuationInProgress = false;\n const state: RunState = {\n toolCallArgsBuffer: new Map(),\n toolCallNames: new Map(),\n pendingMcpCalls: new Set(),\n completedMcpCalls: new Set(),\n textContent: '',\n error: false,\n };\n\n this.ensureIds(input);\n const anyInput = input as any;\n\n console.log(`[McpMiddleware] === NEW RUN ===`);\n console.log(`[McpMiddleware] threadId: ${anyInput.threadId}, runId: ${anyInput.runId}`);\n console.log(`[McpMiddleware] messages: ${input.messages?.length ?? 0}, tools: ${this.tools?.length ?? 0}`);\n\n // Inject MCP tools\n if (this.toolSchemas?.length) {\n input.tools = [...(input.tools || []), ...this.toolSchemas];\n console.log(`[McpMiddleware] Injected ${this.toolSchemas.length} tools:`, this.toolSchemas.map((t: Tool) => t.name));\n }\n\n const handleRunFinished = async () => {\n if (state.error) return; // Don't continue after error\n\n if (state.pendingMcpCalls.size === 0) {\n observer.next({\n type: EventType.RUN_FINISHED,\n threadId: anyInput.threadId,\n runId: anyInput.runId,\n timestamp: Date.now(),\n } as any);\n observer.complete();\n return;\n }\n\n console.log(`[McpMiddleware] RUN_FINISHED with ${state.pendingMcpCalls.size} pending calls`);\n continuationInProgress = true;\n\n // Reconstruct the Assistant Message that triggered these tools\n const toolCalls = [];\n for (const toolCallId of state.pendingMcpCalls) {\n const name = state.toolCallNames.get(toolCallId);\n const args = this.normalizeArgsString(state.toolCallArgsBuffer.get(toolCallId) || '{}');\n if (name) {\n toolCalls.push({\n id: toolCallId,\n type: 'function',\n function: { name, arguments: args }\n });\n }\n }\n\n // Add the Assistant Message to history FIRST\n if (toolCalls.length > 0 || state.textContent) {\n const assistantMsg = {\n id: state.assistantMessageId || this.generateId('msg_ast'),\n role: 'assistant',\n content: state.textContent || null, // Ensure null if empty string for strict LLMs\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined\n };\n input.messages.push(assistantMsg as any);\n console.log(`[McpMiddleware] Added assistant message to history before tools: ${state.textContent?.slice(0, 50)}... [${toolCalls.length} tools]`);\n }\n\n // Execute tools and emit results (no RUN_FINISHED yet - continuation follows)\n const results = await this.executeTools(state);\n this.emitToolResults(observer, results);\n\n // Prepare continuation\n console.log(`[McpMiddleware] Triggering continuation with ${results.length} results`);\n\n // Add tool result messages to history\n for (const { toolCallId, result, messageId } of results) {\n input.messages.push({\n id: messageId,\n role: 'tool',\n toolCallId,\n content: result,\n } as any);\n }\n\n // Reset state for next turn\n state.toolCallArgsBuffer.clear();\n state.toolCallNames.clear();\n state.assistantMessageId = undefined;\n state.textContent = ''; // Clear text content for next turn\n\n console.log(`[McpMiddleware] === CONTINUATION RUN === messages: ${input.messages.length}`);\n\n subscribeToRun(true);\n };\n\n const subscribeToRun = (isContinuation: boolean): Subscription => {\n let subscription = new Subscription();\n subscription = next.run(input).subscribe({\n next: (event) => {\n if (state.error) return;\n\n this.handleToolCallEvent(event, state);\n\n if (event.type === EventType.RUN_ERROR) {\n console.log(`[McpMiddleware] RUN_ERROR received${isContinuation ? ' in continuation' : ''}`);\n state.error = true;\n observer.next(event);\n observer.complete();\n return;\n }\n\n if (isContinuation && event.type === EventType.RUN_STARTED) {\n console.log(`[McpMiddleware] Filtering RUN_STARTED from continuation`);\n return;\n }\n\n if (event.type === EventType.MESSAGES_SNAPSHOT && this.shouldFilterMessagesSnapshot(event, state)) {\n console.log(`[McpMiddleware] Filtering completed MCP MESSAGES_SNAPSHOT to preserve streamed message order`);\n return;\n }\n\n if (event.type === EventType.RUN_FINISHED) {\n if (state.pendingMcpCalls.size > 0) {\n handleRunFinished();\n } else {\n continuationInProgress = false;\n observer.next(event);\n observer.complete();\n }\n return;\n }\n observer.next(event);\n },\n error: (err) => {\n state.error = true;\n continuationInProgress = false;\n observer.error(err);\n },\n complete: () => {\n subscriptions.delete(subscription);\n if (!state.error && state.pendingMcpCalls.size === 0 && !continuationInProgress) observer.complete();\n },\n });\n if (!subscription.closed) {\n subscriptions.add(subscription);\n }\n return subscription;\n };\n\n subscribeToRun(false);\n\n return () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n subscriptions.clear();\n };\n });\n }\n}\n\n/**\n * Factory function to create MCP middleware.\n */\nexport function createMcpMiddleware(\n options: { tools: AguiTool[] }\n) {\n const middleware = new McpMiddleware(options);\n return (input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent> => {\n return middleware.run(input, next);\n };\n}\n\n// Legacy exports\nexport { McpMiddleware as McpToolExecutorMiddleware };\nexport { createMcpMiddleware as createMcpToolMiddleware };\n\n// Re-exports\nexport { Middleware, EventType };\nexport type { RunAgentInput, BaseEvent, AbstractAgent, ToolCallEndEvent, Tool };\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/agui-adapter.ts","../../src/adapters/agui-middleware.ts"],"names":[],"mappings":"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","file":"agui-middleware.mjs","sourcesContent":["/**\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","/**\n * AG-UI Middleware for MCP Tool Execution\n *\n * This middleware intercepts tool calls from remote agents and executes\n * MCP tools server-side, returning results back to the agent.\n *\n * @requires @ag-ui/client - Peer dependency for AG-UI types\n * @requires rxjs - Uses RxJS Observables for event streaming\n */\n\nimport { Observable, Subscriber, Subscription } from 'rxjs';\nimport {\n Middleware,\n EventType,\n type AbstractAgent,\n type RunAgentInput,\n type BaseEvent,\n type ToolCallEndEvent,\n type Tool,\n} from '@ag-ui/client';\nimport { type AguiTool, cleanSchema } from './agui-adapter.js';\n\n/** Tool execution result for continuation */\ninterface ToolResult {\n toolCallId: string;\n toolName: string;\n result: string;\n messageId: string;\n}\n\ninterface SnapshotToolCall {\n id: string;\n name: string;\n arguments: string;\n}\n\n/** State for tracking tool calls during a run */\ninterface RunState {\n toolCallArgsBuffer: Map<string, string>;\n toolCallNames: Map<string, string>;\n pendingMcpCalls: Set<string>;\n completedMcpCalls: Set<string>;\n assistantMessageId?: string;\n textContent?: string;\n error: boolean;\n}\n\n/**\n * Configuration for McpMiddleware\n */\nexport interface McpMiddlewareConfig {\n /** Pre-loaded tools with handlers (required) */\n tools: AguiTool[];\n}\n\n/**\n * AG-UI Middleware that executes MCP tools server-side.\n */\nexport class McpMiddleware extends Middleware {\n private tools: AguiTool[];\n private toolSchemas: Tool[];\n\n constructor(config: McpMiddlewareConfig) {\n super();\n this.tools = config.tools;\n this.toolSchemas = this.tools.map((t: AguiTool) => ({\n name: t.name,\n description: t.description,\n parameters: cleanSchema(t.parameters),\n }));\n }\n\n private isMcpTool(toolName: string): boolean {\n return this.tools.some(t => t.name === toolName);\n }\n\n private parseArgs(argsString: string): Record<string, any> {\n if (!argsString?.trim()) return {};\n\n try {\n return JSON.parse(argsString);\n } catch {\n // Handle duplicated JSON from streaming issues: {...}{...}\n const trimmed = argsString.trim();\n if (trimmed.includes('}{')) {\n const firstObject = trimmed.slice(0, trimmed.indexOf('}{') + 1);\n try {\n return JSON.parse(firstObject);\n } catch {\n console.error(`[McpMiddleware] Failed to parse JSON:`, firstObject);\n }\n }\n console.error(`[McpMiddleware] Failed to parse args:`, argsString);\n return {};\n }\n }\n\n private normalizeArgsString(argsString: string): string {\n return JSON.stringify(this.parseArgs(argsString));\n }\n\n private async executeTool(toolName: string, args: Record<string, any>): Promise<string> {\n const tool = this.tools.find(t => t.name === toolName);\n if (!tool?.handler) {\n return `Error: Tool ${tool ? 'has no handler' : 'not found'}: ${toolName}`;\n }\n\n try {\n console.log(`[McpMiddleware] Executing tool: ${toolName}`, args);\n const result = await tool.handler(args);\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n\n console.log(`[McpMiddleware] Tool result:`, resultStr.slice(0, 200));\n return resultStr;\n } catch (error: any) {\n console.error(`[McpMiddleware] Error executing tool:`, error);\n return `Error: ${error.message || String(error)}`;\n }\n }\n\n private generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private ensureIds(input: RunAgentInput): void {\n const anyInput = input as any;\n if (!anyInput.threadId) anyInput.threadId = this.generateId('mcp_thread');\n if (!anyInput.runId) anyInput.runId = this.generateId('mcp_run');\n }\n\n private getSnapshotToolCalls(message: any): SnapshotToolCall[] {\n const rawToolCalls = Array.isArray(message?.toolCalls)\n ? message.toolCalls\n : (Array.isArray(message?.tool_calls) ? message.tool_calls : []);\n\n return rawToolCalls.flatMap((toolCall: any) => {\n if (!toolCall || typeof toolCall !== 'object') return [];\n\n const id = typeof toolCall.id === 'string' ? toolCall.id : undefined;\n const fn = toolCall.function && typeof toolCall.function === 'object'\n ? toolCall.function\n : undefined;\n const name = typeof fn?.name === 'string'\n ? fn.name\n : (typeof toolCall.name === 'string' ? toolCall.name : undefined);\n\n if (!id || !name) return [];\n\n const rawArgs = fn?.arguments ?? toolCall.arguments ?? toolCall.args;\n const argsString = typeof rawArgs === 'string'\n ? rawArgs\n : (rawArgs && typeof rawArgs === 'object' ? JSON.stringify(rawArgs) : '{}');\n\n return [{ id, name, arguments: argsString }];\n });\n }\n\n private getResolvedToolCallIds(messages: any[]): Set<string> {\n const resolved = new Set<string>();\n for (const message of messages) {\n if (message?.role !== 'tool') continue;\n const toolCallId = message.toolCallId ?? message.tool_call_id;\n if (typeof toolCallId === 'string') {\n resolved.add(toolCallId);\n }\n }\n return resolved;\n }\n\n private shouldFilterMessagesSnapshot(event: BaseEvent, state: RunState): boolean {\n if (state.completedMcpCalls.size === 0 || state.pendingMcpCalls.size > 0) {\n return false;\n }\n\n // Only suppress snapshots that replay an assistant answer we already streamed.\n // Snapshot-only final answers still need to reach the UI.\n if (!state.assistantMessageId && !state.textContent) {\n return false;\n }\n\n const messages = (event as any).messages;\n if (!Array.isArray(messages)) {\n return false;\n }\n\n const lastAssistant = [...messages].reverse().find((message) => message?.role === 'assistant');\n if (!lastAssistant) {\n return false;\n }\n\n return (\n (typeof lastAssistant.id === 'string' && lastAssistant.id === state.assistantMessageId) ||\n (typeof lastAssistant.content === 'string' && lastAssistant.content === state.textContent)\n );\n }\n\n /** Process tool call events and update state */\n private handleToolCallEvent(event: BaseEvent, state: RunState): void {\n const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;\n\n // Accumulate text content for reconstruction\n if (event.type === EventType.TEXT_MESSAGE_CHUNK || event.type === EventType.TEXT_MESSAGE_CONTENT) {\n const e = event as any;\n if (typeof e.messageId === 'string') {\n state.assistantMessageId = e.messageId;\n }\n if (e.delta) {\n state.textContent = (state.textContent || '') + e.delta;\n }\n }\n\n if (event.type === EventType.TOOL_CALL_START) {\n const e = event as any;\n if (e.toolCallId && e.toolCallName) {\n toolCallNames.set(e.toolCallId, e.toolCallName);\n if (this.isMcpTool(e.toolCallName) && !completedMcpCalls.has(e.toolCallId)) {\n pendingMcpCalls.add(e.toolCallId);\n }\n console.log(`[McpMiddleware] TOOL_CALL_START: ${e.toolCallName} (id: ${e.toolCallId}, isMCP: ${this.isMcpTool(e.toolCallName)})`);\n }\n }\n\n if (event.type === EventType.TOOL_CALL_ARGS) {\n const e = event as any;\n if (e.toolCallId && e.delta) {\n const existing = toolCallArgsBuffer.get(e.toolCallId) || '';\n toolCallArgsBuffer.set(e.toolCallId, existing + e.delta);\n }\n }\n\n if (event.type === EventType.TOOL_CALL_END) {\n const e = event as ToolCallEndEvent;\n console.log(`[McpMiddleware] TOOL_CALL_END: ${toolCallNames.get(e.toolCallId) ?? 'unknown'} (id: ${e.toolCallId})`);\n }\n\n if (event.type === EventType.TOOL_CALL_RESULT) {\n const e = event as any;\n if (typeof e.toolCallId === 'string') {\n pendingMcpCalls.delete(e.toolCallId);\n completedMcpCalls.add(e.toolCallId);\n }\n }\n\n // Workaround: Extract parallel tool calls from MESSAGES_SNAPSHOT\n if (event.type === EventType.MESSAGES_SNAPSHOT) {\n const messages = (event as any).messages || [];\n if (messages.length > 0) {\n const resolvedToolCallIds = this.getResolvedToolCallIds(messages);\n\n for (const toolCallId of [...pendingMcpCalls]) {\n if (resolvedToolCallIds.has(toolCallId) || completedMcpCalls.has(toolCallId)) {\n pendingMcpCalls.delete(toolCallId);\n }\n }\n\n // Discover unresolved tools. LangGraph snapshots include historical\n // assistant tool calls, so only calls without a tool result are pending.\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n const tools = this.getSnapshotToolCalls(msg)\n .filter(tc =>\n !resolvedToolCallIds.has(tc.id) &&\n !completedMcpCalls.has(tc.id) &&\n this.isMcpTool(tc.name)\n );\n\n if (msg.role === 'assistant' && tools.length > 0) {\n for (const tc of tools) {\n if (!toolCallNames.has(tc.id)) {\n toolCallNames.set(tc.id, tc.name);\n toolCallArgsBuffer.set(tc.id, tc.arguments || '{}');\n pendingMcpCalls.add(tc.id);\n console.log(`[McpMiddleware] MESSAGES_SNAPSHOT: Discovered ${tc.name} (id: ${tc.id})`);\n }\n }\n if (typeof msg.id === 'string') {\n state.assistantMessageId = msg.id;\n }\n if (typeof msg.content === 'string') {\n state.textContent = msg.content;\n }\n break;\n }\n }\n }\n }\n }\n\n /** Execute pending MCP tools and return results */\n private async executeTools(state: RunState): Promise<ToolResult[]> {\n const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;\n const results: ToolResult[] = [];\n\n const promises = [...pendingMcpCalls].map(async (toolCallId) => {\n if (completedMcpCalls.has(toolCallId)) {\n pendingMcpCalls.delete(toolCallId);\n return;\n }\n\n const toolName = toolCallNames.get(toolCallId);\n if (!toolName) return;\n\n const args = this.parseArgs(toolCallArgsBuffer.get(toolCallId) || '{}');\n console.log(`[McpMiddleware] Executing pending tool: ${toolName}`);\n\n const result = await this.executeTool(toolName, args);\n results.push({\n toolCallId,\n toolName,\n result,\n messageId: this.generateId('mcp_result'),\n });\n pendingMcpCalls.delete(toolCallId);\n completedMcpCalls.add(toolCallId);\n });\n\n await Promise.all(promises);\n return results;\n }\n\n /** Emit tool results (without RUN_FINISHED - that's emitted when truly done) */\n private emitToolResults(observer: Subscriber<BaseEvent>, results: ToolResult[]): void {\n for (const { toolCallId, toolName, result, messageId } of results) {\n observer.next({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId,\n messageId,\n content: result,\n role: 'tool',\n timestamp: Date.now(),\n } as any);\n console.log(`[McpMiddleware] Emitting TOOL_CALL_RESULT for: ${toolName}`);\n }\n }\n\n run(input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent> {\n return new Observable<BaseEvent>((observer: Subscriber<BaseEvent>) => {\n const subscriptions = new Set<Subscription>();\n let continuationInProgress = false;\n const state: RunState = {\n toolCallArgsBuffer: new Map(),\n toolCallNames: new Map(),\n pendingMcpCalls: new Set(),\n completedMcpCalls: new Set(),\n textContent: '',\n error: false,\n };\n\n this.ensureIds(input);\n const anyInput = input as any;\n\n console.log(`[McpMiddleware] === NEW RUN ===`);\n console.log(`[McpMiddleware] threadId: ${anyInput.threadId}, runId: ${anyInput.runId}`);\n console.log(`[McpMiddleware] messages: ${input.messages?.length ?? 0}, tools: ${this.tools?.length ?? 0}`);\n\n // Inject MCP tools\n if (this.toolSchemas?.length) {\n input.tools = [...(input.tools || []), ...this.toolSchemas];\n console.log(`[McpMiddleware] Injected ${this.toolSchemas.length} tools:`, this.toolSchemas.map((t: Tool) => t.name));\n }\n\n const handleRunFinished = async () => {\n if (state.error) return; // Don't continue after error\n\n if (state.pendingMcpCalls.size === 0) {\n observer.next({\n type: EventType.RUN_FINISHED,\n threadId: anyInput.threadId,\n runId: anyInput.runId,\n timestamp: Date.now(),\n } as any);\n observer.complete();\n return;\n }\n\n console.log(`[McpMiddleware] RUN_FINISHED with ${state.pendingMcpCalls.size} pending calls`);\n continuationInProgress = true;\n\n // Reconstruct the Assistant Message that triggered these tools\n const toolCalls = [];\n for (const toolCallId of state.pendingMcpCalls) {\n const name = state.toolCallNames.get(toolCallId);\n const args = this.normalizeArgsString(state.toolCallArgsBuffer.get(toolCallId) || '{}');\n if (name) {\n toolCalls.push({\n id: toolCallId,\n type: 'function',\n function: { name, arguments: args }\n });\n }\n }\n\n // Add the Assistant Message to history FIRST\n if (toolCalls.length > 0 || state.textContent) {\n const assistantMsg = {\n id: state.assistantMessageId || this.generateId('msg_ast'),\n role: 'assistant',\n content: state.textContent || null, // Ensure null if empty string for strict LLMs\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined\n };\n input.messages.push(assistantMsg as any);\n console.log(`[McpMiddleware] Added assistant message to history before tools: ${state.textContent?.slice(0, 50)}... [${toolCalls.length} tools]`);\n }\n\n // Execute tools and emit results (no RUN_FINISHED yet - continuation follows)\n const results = await this.executeTools(state);\n this.emitToolResults(observer, results);\n\n // Prepare continuation\n console.log(`[McpMiddleware] Triggering continuation with ${results.length} results`);\n\n // Add tool result messages to history\n for (const { toolCallId, result, messageId } of results) {\n input.messages.push({\n id: messageId,\n role: 'tool',\n toolCallId,\n content: result,\n } as any);\n }\n\n // Reset state for next turn\n state.toolCallArgsBuffer.clear();\n state.toolCallNames.clear();\n state.assistantMessageId = undefined;\n state.textContent = ''; // Clear text content for next turn\n\n console.log(`[McpMiddleware] === CONTINUATION RUN === messages: ${input.messages.length}`);\n\n subscribeToRun(true);\n };\n\n const subscribeToRun = (isContinuation: boolean): Subscription => {\n let subscription = new Subscription();\n subscription = next.run(input).subscribe({\n next: (event) => {\n if (state.error) return;\n\n this.handleToolCallEvent(event, state);\n\n if (event.type === EventType.RUN_ERROR) {\n console.log(`[McpMiddleware] RUN_ERROR received${isContinuation ? ' in continuation' : ''}`);\n state.error = true;\n observer.next(event);\n observer.complete();\n return;\n }\n\n if (isContinuation && event.type === EventType.RUN_STARTED) {\n console.log(`[McpMiddleware] Filtering RUN_STARTED from continuation`);\n return;\n }\n\n if (event.type === EventType.MESSAGES_SNAPSHOT && this.shouldFilterMessagesSnapshot(event, state)) {\n console.log(`[McpMiddleware] Filtering completed MCP MESSAGES_SNAPSHOT to preserve streamed message order`);\n return;\n }\n\n if (event.type === EventType.RUN_FINISHED) {\n if (state.pendingMcpCalls.size > 0) {\n handleRunFinished();\n } else {\n continuationInProgress = false;\n observer.next(event);\n observer.complete();\n }\n return;\n }\n observer.next(event);\n },\n error: (err) => {\n state.error = true;\n continuationInProgress = false;\n observer.error(err);\n },\n complete: () => {\n subscriptions.delete(subscription);\n if (!state.error && state.pendingMcpCalls.size === 0 && !continuationInProgress) observer.complete();\n },\n });\n if (!subscription.closed) {\n subscriptions.add(subscription);\n }\n return subscription;\n };\n\n subscribeToRun(false);\n\n return () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n subscriptions.clear();\n };\n });\n }\n}\n\n/**\n * Factory function to create MCP middleware.\n */\nexport function createMcpMiddleware(\n options: { tools: AguiTool[] }\n) {\n const middleware = new McpMiddleware(options);\n return (input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent> => {\n return middleware.run(input, next);\n };\n}\n\n// Legacy exports\nexport { McpMiddleware as McpToolExecutorMiddleware };\nexport { createMcpMiddleware as createMcpToolMiddleware };\n\n// Re-exports\nexport { Middleware, EventType };\nexport type { RunAgentInput, BaseEvent, AbstractAgent, ToolCallEndEvent, Tool };\n"]}
1
+ {"version":3,"sources":["../../src/adapters/agui-adapter.ts","../../src/adapters/agui-middleware.ts"],"names":[],"mappings":"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","file":"agui-middleware.mjs","sourcesContent":["/**\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 type { ToolClient } from '../shared/types.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: ToolClient): 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: ToolClient): 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\n\n\n","/**\n * AG-UI Middleware for MCP Tool Execution\n *\n * This middleware intercepts tool calls from remote agents and executes\n * MCP tools server-side, returning results back to the agent.\n *\n * @requires @ag-ui/client - Peer dependency for AG-UI types\n * @requires rxjs - Uses RxJS Observables for event streaming\n */\n\nimport { Observable, Subscriber, Subscription } from 'rxjs';\nimport {\n Middleware,\n EventType,\n type AbstractAgent,\n type RunAgentInput,\n type BaseEvent,\n type ToolCallEndEvent,\n type Tool,\n} from '@ag-ui/client';\nimport { type AguiTool, cleanSchema } from './agui-adapter.js';\n\n/** Tool execution result for continuation */\ninterface ToolResult {\n toolCallId: string;\n toolName: string;\n result: string;\n messageId: string;\n}\n\ninterface SnapshotToolCall {\n id: string;\n name: string;\n arguments: string;\n}\n\n/** State for tracking tool calls during a run */\ninterface RunState {\n toolCallArgsBuffer: Map<string, string>;\n toolCallNames: Map<string, string>;\n pendingMcpCalls: Set<string>;\n completedMcpCalls: Set<string>;\n assistantMessageId?: string;\n textContent?: string;\n error: boolean;\n}\n\n/**\n * Configuration for McpMiddleware\n */\nexport interface McpMiddlewareConfig {\n /** Pre-loaded tools with handlers (required) */\n tools: AguiTool[];\n}\n\n/**\n * AG-UI Middleware that executes MCP tools server-side.\n */\nexport class McpMiddleware extends Middleware {\n private tools: AguiTool[];\n private toolSchemas: Tool[];\n\n constructor(config: McpMiddlewareConfig) {\n super();\n this.tools = config.tools;\n this.toolSchemas = this.tools.map((t: AguiTool) => ({\n name: t.name,\n description: t.description,\n parameters: cleanSchema(t.parameters),\n }));\n }\n\n private isMcpTool(toolName: string): boolean {\n return this.tools.some(t => t.name === toolName);\n }\n\n private parseArgs(argsString: string): Record<string, any> {\n if (!argsString?.trim()) return {};\n\n try {\n return JSON.parse(argsString);\n } catch {\n // Handle duplicated JSON from streaming issues: {...}{...}\n const trimmed = argsString.trim();\n if (trimmed.includes('}{')) {\n const firstObject = trimmed.slice(0, trimmed.indexOf('}{') + 1);\n try {\n return JSON.parse(firstObject);\n } catch {\n console.error(`[McpMiddleware] Failed to parse JSON:`, firstObject);\n }\n }\n console.error(`[McpMiddleware] Failed to parse args:`, argsString);\n return {};\n }\n }\n\n private normalizeArgsString(argsString: string): string {\n return JSON.stringify(this.parseArgs(argsString));\n }\n\n private async executeTool(toolName: string, args: Record<string, any>): Promise<string> {\n const tool = this.tools.find(t => t.name === toolName);\n if (!tool?.handler) {\n return `Error: Tool ${tool ? 'has no handler' : 'not found'}: ${toolName}`;\n }\n\n try {\n console.log(`[McpMiddleware] Executing tool: ${toolName}`, args);\n const result = await tool.handler(args);\n const resultStr = typeof result === 'string' ? result : JSON.stringify(result);\n\n console.log(`[McpMiddleware] Tool result:`, resultStr.slice(0, 200));\n return resultStr;\n } catch (error: any) {\n console.error(`[McpMiddleware] Error executing tool:`, error);\n return `Error: ${error.message || String(error)}`;\n }\n }\n\n private generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private ensureIds(input: RunAgentInput): void {\n const anyInput = input as any;\n if (!anyInput.threadId) anyInput.threadId = this.generateId('mcp_thread');\n if (!anyInput.runId) anyInput.runId = this.generateId('mcp_run');\n }\n\n private getSnapshotToolCalls(message: any): SnapshotToolCall[] {\n const rawToolCalls = Array.isArray(message?.toolCalls)\n ? message.toolCalls\n : (Array.isArray(message?.tool_calls) ? message.tool_calls : []);\n\n return rawToolCalls.flatMap((toolCall: any) => {\n if (!toolCall || typeof toolCall !== 'object') return [];\n\n const id = typeof toolCall.id === 'string' ? toolCall.id : undefined;\n const fn = toolCall.function && typeof toolCall.function === 'object'\n ? toolCall.function\n : undefined;\n const name = typeof fn?.name === 'string'\n ? fn.name\n : (typeof toolCall.name === 'string' ? toolCall.name : undefined);\n\n if (!id || !name) return [];\n\n const rawArgs = fn?.arguments ?? toolCall.arguments ?? toolCall.args;\n const argsString = typeof rawArgs === 'string'\n ? rawArgs\n : (rawArgs && typeof rawArgs === 'object' ? JSON.stringify(rawArgs) : '{}');\n\n return [{ id, name, arguments: argsString }];\n });\n }\n\n private getResolvedToolCallIds(messages: any[]): Set<string> {\n const resolved = new Set<string>();\n for (const message of messages) {\n if (message?.role !== 'tool') continue;\n const toolCallId = message.toolCallId ?? message.tool_call_id;\n if (typeof toolCallId === 'string') {\n resolved.add(toolCallId);\n }\n }\n return resolved;\n }\n\n private shouldFilterMessagesSnapshot(event: BaseEvent, state: RunState): boolean {\n if (state.completedMcpCalls.size === 0 || state.pendingMcpCalls.size > 0) {\n return false;\n }\n\n // Only suppress snapshots that replay an assistant answer we already streamed.\n // Snapshot-only final answers still need to reach the UI.\n if (!state.assistantMessageId && !state.textContent) {\n return false;\n }\n\n const messages = (event as any).messages;\n if (!Array.isArray(messages)) {\n return false;\n }\n\n const lastAssistant = [...messages].reverse().find((message) => message?.role === 'assistant');\n if (!lastAssistant) {\n return false;\n }\n\n return (\n (typeof lastAssistant.id === 'string' && lastAssistant.id === state.assistantMessageId) ||\n (typeof lastAssistant.content === 'string' && lastAssistant.content === state.textContent)\n );\n }\n\n /** Process tool call events and update state */\n private handleToolCallEvent(event: BaseEvent, state: RunState): void {\n const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;\n\n // Accumulate text content for reconstruction\n if (event.type === EventType.TEXT_MESSAGE_CHUNK || event.type === EventType.TEXT_MESSAGE_CONTENT) {\n const e = event as any;\n if (typeof e.messageId === 'string') {\n state.assistantMessageId = e.messageId;\n }\n if (e.delta) {\n state.textContent = (state.textContent || '') + e.delta;\n }\n }\n\n if (event.type === EventType.TOOL_CALL_START) {\n const e = event as any;\n if (e.toolCallId && e.toolCallName) {\n toolCallNames.set(e.toolCallId, e.toolCallName);\n if (this.isMcpTool(e.toolCallName) && !completedMcpCalls.has(e.toolCallId)) {\n pendingMcpCalls.add(e.toolCallId);\n }\n console.log(`[McpMiddleware] TOOL_CALL_START: ${e.toolCallName} (id: ${e.toolCallId}, isMCP: ${this.isMcpTool(e.toolCallName)})`);\n }\n }\n\n if (event.type === EventType.TOOL_CALL_ARGS) {\n const e = event as any;\n if (e.toolCallId && e.delta) {\n const existing = toolCallArgsBuffer.get(e.toolCallId) || '';\n toolCallArgsBuffer.set(e.toolCallId, existing + e.delta);\n }\n }\n\n if (event.type === EventType.TOOL_CALL_END) {\n const e = event as ToolCallEndEvent;\n console.log(`[McpMiddleware] TOOL_CALL_END: ${toolCallNames.get(e.toolCallId) ?? 'unknown'} (id: ${e.toolCallId})`);\n }\n\n if (event.type === EventType.TOOL_CALL_RESULT) {\n const e = event as any;\n if (typeof e.toolCallId === 'string') {\n pendingMcpCalls.delete(e.toolCallId);\n completedMcpCalls.add(e.toolCallId);\n }\n }\n\n // Workaround: Extract parallel tool calls from MESSAGES_SNAPSHOT\n if (event.type === EventType.MESSAGES_SNAPSHOT) {\n const messages = (event as any).messages || [];\n if (messages.length > 0) {\n const resolvedToolCallIds = this.getResolvedToolCallIds(messages);\n\n for (const toolCallId of [...pendingMcpCalls]) {\n if (resolvedToolCallIds.has(toolCallId) || completedMcpCalls.has(toolCallId)) {\n pendingMcpCalls.delete(toolCallId);\n }\n }\n\n // Discover unresolved tools. LangGraph snapshots include historical\n // assistant tool calls, so only calls without a tool result are pending.\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n const tools = this.getSnapshotToolCalls(msg)\n .filter(tc =>\n !resolvedToolCallIds.has(tc.id) &&\n !completedMcpCalls.has(tc.id) &&\n this.isMcpTool(tc.name)\n );\n\n if (msg.role === 'assistant' && tools.length > 0) {\n for (const tc of tools) {\n if (!toolCallNames.has(tc.id)) {\n toolCallNames.set(tc.id, tc.name);\n toolCallArgsBuffer.set(tc.id, tc.arguments || '{}');\n pendingMcpCalls.add(tc.id);\n console.log(`[McpMiddleware] MESSAGES_SNAPSHOT: Discovered ${tc.name} (id: ${tc.id})`);\n }\n }\n if (typeof msg.id === 'string') {\n state.assistantMessageId = msg.id;\n }\n if (typeof msg.content === 'string') {\n state.textContent = msg.content;\n }\n break;\n }\n }\n }\n }\n }\n\n /** Execute pending MCP tools and return results */\n private async executeTools(state: RunState): Promise<ToolResult[]> {\n const { toolCallArgsBuffer, toolCallNames, pendingMcpCalls, completedMcpCalls } = state;\n const results: ToolResult[] = [];\n\n const promises = [...pendingMcpCalls].map(async (toolCallId) => {\n if (completedMcpCalls.has(toolCallId)) {\n pendingMcpCalls.delete(toolCallId);\n return;\n }\n\n const toolName = toolCallNames.get(toolCallId);\n if (!toolName) return;\n\n const args = this.parseArgs(toolCallArgsBuffer.get(toolCallId) || '{}');\n console.log(`[McpMiddleware] Executing pending tool: ${toolName}`);\n\n const result = await this.executeTool(toolName, args);\n results.push({\n toolCallId,\n toolName,\n result,\n messageId: this.generateId('mcp_result'),\n });\n pendingMcpCalls.delete(toolCallId);\n completedMcpCalls.add(toolCallId);\n });\n\n await Promise.all(promises);\n return results;\n }\n\n /** Emit tool results (without RUN_FINISHED - that's emitted when truly done) */\n private emitToolResults(observer: Subscriber<BaseEvent>, results: ToolResult[]): void {\n for (const { toolCallId, toolName, result, messageId } of results) {\n observer.next({\n type: EventType.TOOL_CALL_RESULT,\n toolCallId,\n messageId,\n content: result,\n role: 'tool',\n timestamp: Date.now(),\n } as any);\n console.log(`[McpMiddleware] Emitting TOOL_CALL_RESULT for: ${toolName}`);\n }\n }\n\n run(input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent> {\n return new Observable<BaseEvent>((observer: Subscriber<BaseEvent>) => {\n const subscriptions = new Set<Subscription>();\n let continuationInProgress = false;\n const state: RunState = {\n toolCallArgsBuffer: new Map(),\n toolCallNames: new Map(),\n pendingMcpCalls: new Set(),\n completedMcpCalls: new Set(),\n textContent: '',\n error: false,\n };\n\n this.ensureIds(input);\n const anyInput = input as any;\n\n console.log(`[McpMiddleware] === NEW RUN ===`);\n console.log(`[McpMiddleware] threadId: ${anyInput.threadId}, runId: ${anyInput.runId}`);\n console.log(`[McpMiddleware] messages: ${input.messages?.length ?? 0}, tools: ${this.tools?.length ?? 0}`);\n\n // Inject MCP tools\n if (this.toolSchemas?.length) {\n input.tools = [...(input.tools || []), ...this.toolSchemas];\n console.log(`[McpMiddleware] Injected ${this.toolSchemas.length} tools:`, this.toolSchemas.map((t: Tool) => t.name));\n }\n\n const handleRunFinished = async () => {\n if (state.error) return; // Don't continue after error\n\n if (state.pendingMcpCalls.size === 0) {\n observer.next({\n type: EventType.RUN_FINISHED,\n threadId: anyInput.threadId,\n runId: anyInput.runId,\n timestamp: Date.now(),\n } as any);\n observer.complete();\n return;\n }\n\n console.log(`[McpMiddleware] RUN_FINISHED with ${state.pendingMcpCalls.size} pending calls`);\n continuationInProgress = true;\n\n // Reconstruct the Assistant Message that triggered these tools\n const toolCalls = [];\n for (const toolCallId of state.pendingMcpCalls) {\n const name = state.toolCallNames.get(toolCallId);\n const args = this.normalizeArgsString(state.toolCallArgsBuffer.get(toolCallId) || '{}');\n if (name) {\n toolCalls.push({\n id: toolCallId,\n type: 'function',\n function: { name, arguments: args }\n });\n }\n }\n\n // Add the Assistant Message to history FIRST\n if (toolCalls.length > 0 || state.textContent) {\n const assistantMsg = {\n id: state.assistantMessageId || this.generateId('msg_ast'),\n role: 'assistant',\n content: state.textContent || null, // Ensure null if empty string for strict LLMs\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined\n };\n input.messages.push(assistantMsg as any);\n console.log(`[McpMiddleware] Added assistant message to history before tools: ${state.textContent?.slice(0, 50)}... [${toolCalls.length} tools]`);\n }\n\n // Execute tools and emit results (no RUN_FINISHED yet - continuation follows)\n const results = await this.executeTools(state);\n this.emitToolResults(observer, results);\n\n // Prepare continuation\n console.log(`[McpMiddleware] Triggering continuation with ${results.length} results`);\n\n // Add tool result messages to history\n for (const { toolCallId, result, messageId } of results) {\n input.messages.push({\n id: messageId,\n role: 'tool',\n toolCallId,\n content: result,\n } as any);\n }\n\n // Reset state for next turn\n state.toolCallArgsBuffer.clear();\n state.toolCallNames.clear();\n state.assistantMessageId = undefined;\n state.textContent = ''; // Clear text content for next turn\n\n console.log(`[McpMiddleware] === CONTINUATION RUN === messages: ${input.messages.length}`);\n\n subscribeToRun(true);\n };\n\n const subscribeToRun = (isContinuation: boolean): Subscription => {\n let subscription = new Subscription();\n subscription = next.run(input).subscribe({\n next: (event) => {\n if (state.error) return;\n\n this.handleToolCallEvent(event, state);\n\n if (event.type === EventType.RUN_ERROR) {\n console.log(`[McpMiddleware] RUN_ERROR received${isContinuation ? ' in continuation' : ''}`);\n state.error = true;\n observer.next(event);\n observer.complete();\n return;\n }\n\n if (isContinuation && event.type === EventType.RUN_STARTED) {\n console.log(`[McpMiddleware] Filtering RUN_STARTED from continuation`);\n return;\n }\n\n if (event.type === EventType.MESSAGES_SNAPSHOT && this.shouldFilterMessagesSnapshot(event, state)) {\n console.log(`[McpMiddleware] Filtering completed MCP MESSAGES_SNAPSHOT to preserve streamed message order`);\n return;\n }\n\n if (event.type === EventType.RUN_FINISHED) {\n if (state.pendingMcpCalls.size > 0) {\n handleRunFinished();\n } else {\n continuationInProgress = false;\n observer.next(event);\n observer.complete();\n }\n return;\n }\n observer.next(event);\n },\n error: (err) => {\n state.error = true;\n continuationInProgress = false;\n observer.error(err);\n },\n complete: () => {\n subscriptions.delete(subscription);\n if (!state.error && state.pendingMcpCalls.size === 0 && !continuationInProgress) observer.complete();\n },\n });\n if (!subscription.closed) {\n subscriptions.add(subscription);\n }\n return subscription;\n };\n\n subscribeToRun(false);\n\n return () => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n subscriptions.clear();\n };\n });\n }\n}\n\n/**\n * Factory function to create MCP middleware.\n */\nexport function createMcpMiddleware(\n options: { tools: AguiTool[] }\n) {\n const middleware = new McpMiddleware(options);\n return (input: RunAgentInput, next: AbstractAgent): Observable<BaseEvent> => {\n return middleware.run(input, next);\n };\n}\n\n// Legacy exports\nexport { McpMiddleware as McpToolExecutorMiddleware };\nexport { createMcpMiddleware as createMcpToolMiddleware };\n\n// Re-exports\nexport { Middleware, EventType };\nexport type { RunAgentInput, BaseEvent, AbstractAgent, ToolCallEndEvent, Tool };\n"]}
@@ -1,7 +1,7 @@
1
- import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-ChQrBZhF.mjs';
1
+ import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CclWRxTD.mjs';
2
2
  import { ToolSet } from 'ai';
3
- import { d as ToolRouter } from '../tool-router-CGs3IDOJ.mjs';
4
- import '../types-Bf-7GOLW.mjs';
3
+ import { d as ToolRouter } from '../tool-router-C9ECn3FX.mjs';
4
+ import '../types-CbFbPkfQ.mjs';
5
5
  import '@modelcontextprotocol/sdk/types.js';
6
6
  import '@modelcontextprotocol/sdk/client/auth.js';
7
7
  import '@modelcontextprotocol/sdk/shared/auth.js';
@@ -1,7 +1,7 @@
1
- import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-QOOPdEVp.js';
1
+ import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-DzvZD6Tt.js';
2
2
  import { ToolSet } from 'ai';
3
- import { d as ToolRouter } from '../tool-router-DQ-HrD7W.js';
4
- import '../types-Bf-7GOLW.js';
3
+ import { d as ToolRouter } from '../tool-router-CUSSk6lT.js';
4
+ import '../types-CbFbPkfQ.js';
5
5
  import '@modelcontextprotocol/sdk/types.js';
6
6
  import '@modelcontextprotocol/sdk/client/auth.js';
7
7
  import '@modelcontextprotocol/sdk/shared/auth.js';