@mcpjam/inspector 0.9.6 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -3
- package/dist/client/assets/index-CxSz4W4P.css +0 -1
- package/dist/client/assets/index-Uo2CGMHd.js +0 -1738
- package/dist/client/assets/index-Uo2CGMHd.js.map +0 -1
- package/dist/client/catalyst.png +0 -0
- package/dist/client/claude_logo.png +0 -0
- package/dist/client/deepseek_logo.svg +0 -1
- package/dist/client/demo_1.png +0 -0
- package/dist/client/demo_2.png +0 -0
- package/dist/client/demo_3.png +0 -0
- package/dist/client/file.svg +0 -1
- package/dist/client/globe.svg +0 -1
- package/dist/client/index.html +0 -14
- package/dist/client/mcp.svg +0 -1
- package/dist/client/mcp_jam.svg +0 -12
- package/dist/client/mcp_jam_dark.png +0 -0
- package/dist/client/mcp_jam_light.png +0 -0
- package/dist/client/next.svg +0 -1
- package/dist/client/ollama_dark.png +0 -0
- package/dist/client/ollama_logo.svg +0 -7
- package/dist/client/openai_logo.png +0 -0
- package/dist/client/vercel.svg +0 -1
- package/dist/client/window.svg +0 -1
- package/dist/server/index.js +0 -2022
- package/dist/server/index.js.map +0 -1
package/dist/server/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/index.ts","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/routes/mcp/servers.ts","../../server/routes/mcp/tools.ts","../../server/routes/mcp/resources.ts","../../server/routes/mcp/prompts.ts","../../server/routes/mcp/chat.ts","../../client/src/lib/chat-utils.ts","../../server/routes/mcp/tests.ts","../../server/utils/mcp-utils.ts","../../server/routes/mcp/oauth.ts","../../server/services/mcpjam-client-manager.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { logger } from \"hono/logger\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\n// ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n};\n\n// Utility function to create a boxed console output\nfunction logBox(content: string, title?: string) {\n const lines = content.split(\"\\n\");\n const maxLength = Math.max(...lines.map((line) => line.length));\n const width = maxLength + 4;\n\n console.log(\"┌\" + \"─\".repeat(width) + \"┐\");\n if (title) {\n const titlePadding = Math.floor((width - title.length - 2) / 2);\n console.log(\n \"│\" +\n \" \".repeat(titlePadding) +\n title +\n \" \".repeat(width - title.length - titlePadding) +\n \"│\",\n );\n console.log(\"├\" + \"─\".repeat(width) + \"┤\");\n }\n\n lines.forEach((line) => {\n const padding = width - line.length - 2;\n console.log(\"│ \" + line + \" \".repeat(padding) + \" │\");\n });\n\n console.log(\"└\" + \"─\".repeat(width) + \"┘\");\n}\n\n// Import routes and services\nimport mcpRoutes from \"./routes/mcp/index\";\nimport { MCPJamClientManager } from \"./services/mcpjam-client-manager\";\nimport \"./types/hono\"; // Type extensions\n\n// Utility function to extract MCP server config from environment variables\nfunction getMCPConfigFromEnv() {\n const command = process.env.MCP_SERVER_COMMAND;\n if (!command) {\n return null;\n }\n\n const argsString = process.env.MCP_SERVER_ARGS;\n const args = argsString ? JSON.parse(argsString) : [];\n\n return {\n command,\n args,\n name: \"CLI Server\", // Default name for CLI-provided servers\n };\n}\n\nconst app = new Hono();\n\n// Initialize centralized MCPJam Client Manager\nconst mcpJamClientManager = new MCPJamClientManager();\n\n// Middleware to inject client manager into context\napp.use(\"*\", async (c, next) => {\n c.mcpJamClientManager = mcpJamClientManager;\n await next();\n});\n\n// Middleware\napp.use(\"*\", logger());\n// Dynamic CORS origin based on PORT environment variable\nconst serverPort = process.env.PORT || \"3001\";\nconst corsOrigins = [\n `http://localhost:${serverPort}`,\n \"http://localhost:3000\", // Keep for development\n \"http://localhost:3001\", // Keep for development\n];\n\napp.use(\n \"*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n);\n\n// API Routes\napp.route(\"/api/mcp\", mcpRoutes);\n\n// Health check\napp.get(\"/health\", (c) => {\n return c.json({ status: \"ok\", timestamp: new Date().toISOString() });\n});\n\n// API endpoint to get MCP CLI config (for development mode)\napp.get(\"/api/mcp-cli-config\", (c) => {\n const mcpConfig = getMCPConfigFromEnv();\n return c.json({ config: mcpConfig });\n});\n\n// Static file serving (for production)\nif (process.env.NODE_ENV === \"production\") {\n // Serve static assets (JS, CSS, images, etc.)\n app.use(\"/*\", serveStatic({ root: \"./dist/client\" }));\n\n // SPA fallback - serve index.html for all non-API routes\n app.get(\"*\", async (c) => {\n const path = c.req.path;\n // Don't intercept API routes\n if (path.startsWith(\"/api/\")) {\n return c.notFound();\n }\n // Return index.html for SPA routes\n const indexPath = join(process.cwd(), \"dist\", \"client\", \"index.html\");\n let htmlContent = readFileSync(indexPath, \"utf-8\");\n\n // Inject MCP server config if provided via CLI\n const mcpConfig = getMCPConfigFromEnv();\n if (mcpConfig) {\n const configScript = `<script>window.MCP_CLI_CONFIG = ${JSON.stringify(mcpConfig)};</script>`;\n htmlContent = htmlContent.replace(\"</head>\", `${configScript}</head>`);\n }\n\n return c.html(htmlContent);\n });\n} else {\n // Development mode - just API\n app.get(\"/\", (c) => {\n return c.json({\n message: \"MCPJam API Server\",\n environment: \"development\",\n frontend: `http://localhost:${serverPort}`,\n });\n });\n}\n\nconst port = parseInt(process.env.PORT || \"3001\");\n\n// Display the localhost URL in a box\nlogBox(`http://localhost:${port}`, \"🚀 Inspector Launched\");\n\n// Graceful shutdown handling\nconst server = serve({\n fetch: app.fetch,\n port,\n hostname: \"0.0.0.0\", // Bind to all interfaces for Docker\n});\n\n// Handle graceful shutdown\nprocess.on(\"SIGINT\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nexport default app;\n","import { Hono } from \"hono\";\nimport connect from \"./connect\";\nimport servers from \"./servers\";\nimport tools from \"./tools\";\nimport resources from \"./resources\";\nimport prompts from \"./prompts\";\nimport chat from \"./chat\";\nimport tests from \"./tests.ts\";\nimport oauth from \"./oauth\";\n\nconst mcp = new Hono();\n\n// Health check\nmcp.get(\"/health\", (c) => {\n return c.json({\n service: \"MCP API\",\n status: \"ready\",\n timestamp: new Date().toISOString(),\n });\n});\n\n// Chat endpoint - REAL IMPLEMENTATION\nmcp.route(\"/chat\", chat);\n\n// Connect endpoint - REAL IMPLEMENTATION\nmcp.route(\"/connect\", connect);\n\n// Servers management endpoints - REAL IMPLEMENTATION\nmcp.route(\"/servers\", servers);\n\n// Tools endpoint - REAL IMPLEMENTATION\nmcp.route(\"/tools\", tools);\n\n// Tests endpoint - generate per-test agents\nmcp.route(\"/tests\", tests);\n\n// Resources endpoints - REAL IMPLEMENTATION\nmcp.route(\"/resources\", resources);\n\n// Prompts endpoints - REAL IMPLEMENTATION\nmcp.route(\"/prompts\", prompts);\n\n// OAuth proxy endpoints\nmcp.route(\"/oauth\", oauth);\n\nexport default mcp;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst connect = new Hono();\n\nconnect.post(\"/\", async (c) => {\n try {\n const { serverConfig, serverId } = await c.req.json();\n\n if (!serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverConfig is required\",\n },\n 400,\n );\n }\n\n if (!serverId) {\n return c.json(\n {\n success: false,\n error: \"serverId is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n try {\n await mcpClientManager.connectToServer(serverId, serverConfig);\n const status = mcpClientManager.getConnectionStatus(serverId);\n if (status === \"connected\") {\n return c.json({\n success: true,\n status: \"connected\",\n });\n } else {\n return c.json(\n {\n success: false,\n error: \"Connection failed\",\n status,\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `MCP configuration is invalid. Please double check your server configuration: ${JSON.stringify(serverConfig)}`,\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: \"Failed to parse request body\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 400,\n );\n }\n});\n\nexport default connect;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst servers = new Hono();\n\n// List all connected servers with their status\nservers.get(\"/\", async (c) => {\n try {\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get all server configurations and statuses\n const connectedServers = mcpJamClientManager.getConnectedServers();\n\n const serverList = Object.entries(connectedServers).map(\n ([serverId, serverInfo]) => ({\n id: serverId,\n name: serverId,\n status: serverInfo.status,\n config: serverInfo.config,\n }),\n );\n\n return c.json({\n success: true,\n servers: serverList,\n });\n } catch (error) {\n console.error(\"Error listing servers:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get status for a specific server\nservers.get(\"/status/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n });\n } catch (error) {\n console.error(\"Error getting server status:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Disconnect from a server\nservers.delete(\"/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n await mcpJamClientManager.disconnectFromServer(serverId);\n\n return c.json({\n success: true,\n message: `Disconnected from server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error disconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Reconnect to a server\nservers.post(\"/reconnect\", async (c) => {\n try {\n const { serverId, serverConfig } = await c.req.json();\n\n if (!serverId || !serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverId and serverConfig are required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Disconnect first, then reconnect\n await mcpJamClientManager.disconnectFromServer(serverId);\n await mcpJamClientManager.connectToServer(serverId, serverConfig);\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n message: `Reconnected to server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error reconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default servers;\n","import { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { TextEncoder } from \"util\";\nimport \"../../types/hono\"; // Type extensions\n\nconst tools = new Hono();\n\n// Store for pending elicitation requests\nconst pendingElicitations = new Map<\n string,\n {\n resolve: (response: any) => void;\n reject: (error: any) => void;\n }\n>();\n\ntools.post(\"/\", async (c) => {\n let action: string | undefined;\n let toolName: string | undefined;\n\n try {\n const requestData = await c.req.json();\n action = requestData.action;\n toolName = requestData.toolName;\n const { serverConfig, parameters, requestId, response } = requestData;\n\n if (!action || ![\"list\", \"execute\", \"respond\"].includes(action)) {\n return c.json(\n {\n success: false,\n error: \"Action must be 'list', 'execute', or 'respond'\",\n },\n 400,\n );\n }\n\n // Handle elicitation response\n if (action === \"respond\") {\n if (!requestId) {\n return c.json(\n {\n success: false,\n error: \"requestId is required for respond action\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n const success = mcpJamClientManager.respondToElicitation(\n requestId,\n response,\n );\n\n if (!success) {\n // Also check local pendingElicitations for backward compatibility\n const pending = pendingElicitations.get(requestId);\n if (pending) {\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n return c.json({ success: true });\n }\n\n return c.json(\n {\n success: false,\n error: \"No pending elicitation found for this requestId\",\n },\n 404,\n );\n }\n\n return c.json({ success: true });\n }\n\n // Use centralized MCPJam Agent\n const encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n try {\n if (!serverConfig) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: \"serverConfig is required\" })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n // Use server name from config or default key\n const serverId =\n (serverConfig as any).name || (serverConfig as any).id || \"server\";\n await mcpJamClientManager.connectToServer(serverId, serverConfig);\n\n // Set up elicitation callback for streaming context\n mcpJamClientManager.setElicitationCallback(async (request) => {\n const { requestId, message, schema } = request;\n\n // Stream elicitation request to client\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n requestId,\n message,\n schema,\n toolName: toolName || \"unknown\",\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n\n // Return a promise that will be resolved by the respond endpoint\n return new Promise((resolve, reject) => {\n pendingElicitations.set(requestId, {\n resolve: (response: any) => {\n resolve(response);\n pendingElicitations.delete(requestId);\n },\n reject: (error: any) => {\n reject(error);\n pendingElicitations.delete(requestId);\n },\n });\n\n // Set timeout\n setTimeout(() => {\n if (pendingElicitations.has(requestId)) {\n pendingElicitations.delete(requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, 300000); // 5 minutes\n });\n });\n\n if (action === \"list\") {\n // Use existing connection through MCPJam Agent to get un-prefixed tools\n try {\n const flattenedTools =\n await mcpJamClientManager.getToolsetsForServer(serverId);\n\n // Convert to the expected format with JSON schema conversion\n const toolsWithJsonSchema: Record<string, any> = {};\n for (const [name, tool] of Object.entries(flattenedTools)) {\n let inputSchema = (tool as any).inputSchema;\n try {\n // If original schemas are Zod, convert to JSON Schema. Otherwise pass through.\n inputSchema = zodToJsonSchema(inputSchema as z.ZodType<any>);\n } catch {\n // ignore conversion errors and use existing schema shape\n }\n toolsWithJsonSchema[name] = {\n name,\n description: (tool as any).description,\n inputSchema,\n outputSchema: (tool as any).outputSchema,\n };\n }\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tools_list\", tools: toolsWithJsonSchema })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n } catch (err) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: err instanceof Error ? err.message : String(err) })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n }\n\n if (action === \"execute\") {\n if (!toolName) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: \"Tool name is required for execution\" })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_executing\", toolName, parameters: parameters || {}, message: \"Executing tool...\" })}\\n\\n`,\n ),\n );\n\n // Execute tool using centralized client manager\n const exec = await mcpJamClientManager.executeToolDirect(\n toolName,\n parameters || {},\n );\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_result\", toolName, result: exec.result })}\\n\\n`,\n ),\n );\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"elicitation_complete\", toolName })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n } catch (err) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: err instanceof Error ? err.message : String(err) })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n } finally {\n // Clear the elicitation callback\n const mcpJamClientManager = c.mcpJamClientManager;\n if (mcpJamClientManager) {\n mcpJamClientManager.clearElicitationCallback();\n }\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n\n return c.json(\n {\n success: false,\n error: errorMsg,\n },\n 500,\n );\n }\n});\n\nexport default tools;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst resources = new Hono();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n const mcpClientManager = c.mcpJamClientManager;\n const serverResources = mcpClientManager.getResourcesForServer(serverId);\n return c.json({ resources: { [serverId]: serverResources } });\n } catch (error) {\n console.error(\"Error fetching resources:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Read resource endpoint\nresources.post(\"/read\", async (c) => {\n try {\n const { serverId, uri } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!uri) {\n return c.json(\n {\n success: false,\n error: \"Resource URI is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n const content = await mcpClientManager.getResource(uri, serverId);\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error reading resource:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default resources;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst prompts = new Hono();\n\n// List prompts endpoint\nprompts.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompts for specific server\n const serverPrompts = mcpJamClientManager.getPromptsForServer(serverId);\n\n return c.json({ prompts: { [serverId]: serverPrompts } });\n } catch (error) {\n console.error(\"Error fetching prompts:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get prompt endpoint\nprompts.post(\"/get\", async (c) => {\n try {\n const { serverId, name, args } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!name) {\n return c.json(\n {\n success: false,\n error: \"Prompt name is required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompt content directly - servers are already connected\n const content = await mcpJamClientManager.getPrompt(\n name,\n serverId,\n args || {},\n );\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error getting prompt:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default prompts;\n","import { Hono } from \"hono\";\nimport { Agent } from \"@mastra/core/agent\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOllama } from \"ollama-ai-provider\";\nimport {\n ChatMessage,\n ModelDefinition,\n ModelProvider,\n} from \"../../../shared/types\";\nimport { TextEncoder } from \"util\";\nimport { getDefaultTemperatureByProvider } from \"../../../client/src/lib/chat-utils\";\n\n// Types\ninterface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\ninterface PendingElicitation {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n}\n\ninterface StreamingContext {\n controller: ReadableStreamDefaultController;\n encoder: TextEncoder;\n toolCallId: number;\n lastEmittedToolCallId: number | null;\n stepIndex: number;\n}\n\ninterface ChatRequest {\n serverConfigs?: Record<string, any>;\n model: ModelDefinition;\n provider: ModelProvider;\n apiKey?: string;\n systemPrompt?: string;\n messages?: ChatMessage[];\n ollamaBaseUrl?: string;\n action?: string;\n requestId?: string;\n response?: any;\n}\n\n// Constants\nconst DEBUG_ENABLED = process.env.MCP_DEBUG !== \"false\";\nconst ELICITATION_TIMEOUT = 300000; // 5 minutes\nconst MAX_AGENT_STEPS = 10;\n\n// Debug logging helper\nconst dbg = (...args: any[]) => {\n if (DEBUG_ENABLED) console.log(\"[mcp/chat]\", ...args);\n};\n\n// Avoid MaxListeners warnings when repeatedly creating MCP clients in dev\ntry {\n (process as any).setMaxListeners?.(50);\n} catch {}\n\n// Store for pending elicitation requests\nconst pendingElicitations = new Map<string, PendingElicitation>();\n\n// Use the context-injected MCPJamClientManager (see server/index.ts middleware)\n\nconst chat = new Hono();\n\n// Helper Functions\n\n/**\n * Creates an LLM model based on the provider and configuration\n */\nconst createLlmModel = (\n modelDefinition: ModelDefinition,\n apiKey: string,\n ollamaBaseUrl?: string,\n) => {\n if (!modelDefinition?.id || !modelDefinition?.provider) {\n throw new Error(\n `Invalid model definition: ${JSON.stringify(modelDefinition)}`,\n );\n }\n\n switch (modelDefinition.provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey })(modelDefinition.id);\n case \"openai\":\n return createOpenAI({ apiKey })(modelDefinition.id);\n case \"deepseek\":\n return createOpenAI({ apiKey, baseURL: \"https://api.deepseek.com/v1\" })(\n modelDefinition.id,\n );\n case \"ollama\":\n const baseUrl = ollamaBaseUrl || \"http://localhost:11434\";\n return createOllama({\n baseURL: `${baseUrl}`,\n })(modelDefinition.id, {\n simulateStreaming: true,\n });\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n\n// Removed unused createElicitationHandler\n\n/**\n * Wraps MCP tools to capture execution events and stream them to the client\n */\nconst wrapToolsWithStreaming = (\n tools: Record<string, any>,\n streamingContext: StreamingContext,\n) => {\n const wrappedTools: Record<string, any> = {};\n\n for (const [name, tool] of Object.entries(tools)) {\n wrappedTools[name] = {\n ...(tool as any),\n execute: async (params: any) => {\n const currentToolCallId = ++streamingContext.toolCallId;\n const startedAt = Date.now();\n\n // Stream tool call event immediately\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name,\n parameters: params,\n timestamp: new Date(),\n status: \"executing\",\n },\n })}\\n\\n`,\n ),\n );\n }\n\n dbg(\"Tool executing\", { name, currentToolCallId, params });\n\n try {\n const result = await (tool as any).execute(params);\n dbg(\"Tool result\", {\n name,\n currentToolCallId,\n ms: Date.now() - startedAt,\n });\n\n // Stream tool result event\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result,\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n\n return result;\n } catch (error) {\n dbg(\"Tool error\", {\n name,\n currentToolCallId,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Stream tool error event\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n error:\n error instanceof Error ? error.message : String(error),\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n throw error;\n }\n },\n };\n }\n\n return wrappedTools;\n};\n\n/**\n * Handles tool call and result events from the agent's onStepFinish callback\n */\nconst handleAgentStepFinish = (\n streamingContext: StreamingContext,\n text: string,\n toolCalls: any[] | undefined,\n toolResults: any[] | undefined,\n) => {\n try {\n // Handle tool calls\n if (toolCalls && Array.isArray(toolCalls)) {\n for (const call of toolCalls) {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: call.name || call.toolName,\n parameters: call.params || call.args || {},\n timestamp: new Date(),\n status: \"executing\",\n },\n })}\\n\\n`,\n ),\n );\n }\n }\n }\n\n // Handle tool results\n if (toolResults && Array.isArray(toolResults)) {\n for (const result of toolResults) {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: result.result,\n error: (result as any).error,\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n }\n }\n\n // Emit a consolidated trace step event for UI tracing panels\n streamingContext.stepIndex = (streamingContext.stepIndex || 0) + 1;\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"trace_step\",\n step: streamingContext.stepIndex,\n text,\n toolCalls: (toolCalls || []).map((c: any) => ({\n name: c.name || c.toolName,\n params: c.params || c.args || {},\n })),\n toolResults: (toolResults || []).map((r: any) => ({\n result: r.result,\n error: (r as any).error,\n })),\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n }\n } catch (err) {\n dbg(\"onStepFinish error\", err);\n }\n};\n\n/**\n * Streams text content from the agent's response\n */\nconst streamAgentResponse = async (\n streamingContext: StreamingContext,\n stream: any,\n) => {\n let hasContent = false;\n let chunkCount = 0;\n\n for await (const chunk of stream.textStream) {\n if (chunk && chunk.trim()) {\n hasContent = true;\n chunkCount++;\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({ type: \"text\", content: chunk })}\\n\\n`,\n ),\n );\n }\n }\n\n dbg(\"Streaming finished\", { hasContent, chunkCount });\n return { hasContent, chunkCount };\n};\n\n/**\n * Falls back to regular completion when streaming fails\n */\nconst fallbackToCompletion = async (\n agent: Agent,\n messages: any[],\n streamingContext: StreamingContext,\n provider: ModelProvider,\n) => {\n try {\n const result = await agent.generate(messages, {\n temperature: getDefaultTemperatureByProvider(provider),\n });\n if (result.text && result.text.trim()) {\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"text\",\n content: result.text,\n })}\\n\\n`,\n ),\n );\n }\n } catch (fallbackErr) {\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"text\",\n content: \"Failed to generate response. Please try again. \",\n error:\n fallbackErr instanceof Error\n ? fallbackErr.message\n : \"Unknown error\",\n })}\\n\\n`,\n ),\n );\n }\n};\n\n/**\n * Creates the streaming response for the chat\n */\nconst createStreamingResponse = async (\n agent: Agent,\n messages: any[],\n toolsets: any,\n streamingContext: StreamingContext,\n provider: ModelProvider,\n) => {\n const stream = await agent.stream(messages, {\n maxSteps: MAX_AGENT_STEPS,\n temperature: getDefaultTemperatureByProvider(provider),\n toolsets,\n onStepFinish: ({ text, toolCalls, toolResults }) => {\n handleAgentStepFinish(streamingContext, text, toolCalls, toolResults);\n },\n });\n\n const { hasContent } = await streamAgentResponse(streamingContext, stream);\n\n // Fall back to completion if no content was streamed\n if (!hasContent) {\n dbg(\"No content from textStream; falling back to completion\");\n await fallbackToCompletion(agent, messages, streamingContext, provider);\n }\n\n // Stream elicitation completion\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_complete\",\n })}\\n\\n`,\n ),\n );\n\n // End stream\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(`data: [DONE]\\n\\n`),\n );\n};\n\n// Main chat endpoint\nchat.post(\"/\", async (c) => {\n const mcpClientManager = c.mcpJamClientManager;\n try {\n const requestData: ChatRequest = await c.req.json();\n const {\n serverConfigs,\n model,\n provider,\n apiKey,\n systemPrompt,\n messages,\n ollamaBaseUrl,\n action,\n requestId,\n response,\n } = requestData;\n\n // Handle elicitation response\n if (action === \"elicitation_response\") {\n if (!requestId) {\n return c.json(\n {\n success: false,\n error: \"requestId is required for elicitation_response action\",\n },\n 400,\n );\n }\n\n const pending = pendingElicitations.get(requestId);\n if (!pending) {\n return c.json(\n {\n success: false,\n error: \"No pending elicitation found for this requestId\",\n },\n 404,\n );\n }\n\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n return c.json({ success: true });\n }\n\n // Validate required parameters\n if (!model?.id || !apiKey || !messages) {\n return c.json(\n {\n success: false,\n error: \"model (with id), apiKey, and messages are required\",\n },\n 400,\n );\n }\n\n // Connect to servers through MCPJamClientManager\n if (!serverConfigs || Object.keys(serverConfigs).length === 0) {\n return c.json(\n {\n success: false,\n error: \"No server configs provided\",\n },\n 400,\n );\n }\n\n // Connect to each server using MCPJamClientManager\n const serverErrors: Record<string, string> = {};\n const connectedServers: string[] = [];\n\n for (const [serverName, serverConfig] of Object.entries(serverConfigs)) {\n try {\n await mcpClientManager.connectToServer(serverName, serverConfig);\n connectedServers.push(serverName);\n dbg(\"Connected to server\", { serverName });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n serverErrors[serverName] = errorMessage;\n dbg(\"Failed to connect to server\", { serverName, error: errorMessage });\n }\n }\n\n // Check if any servers connected successfully\n if (connectedServers.length === 0) {\n return c.json(\n {\n success: false,\n error: \"Failed to connect to any servers\",\n details: serverErrors,\n },\n 400,\n );\n }\n\n // Log warnings for failed connections but continue with successful ones\n if (Object.keys(serverErrors).length > 0) {\n dbg(\"Some servers failed to connect\", {\n connectedServers,\n failedServers: Object.keys(serverErrors),\n errors: serverErrors,\n });\n }\n\n // Create LLM model\n const llmModel = createLlmModel(model, apiKey, ollamaBaseUrl);\n\n // Create agent without tools initially - we'll add them in the streaming context\n const agent = new Agent({\n name: \"MCP Chat Agent\",\n instructions:\n systemPrompt || \"You are a helpful assistant with access to MCP tools.\",\n model: llmModel,\n tools: undefined, // Start without tools, add them in streaming context\n });\n\n const formattedMessages = messages.map((msg: ChatMessage) => ({\n role: msg.role,\n content: msg.content,\n }));\n\n // Get available tools from all connected servers\n const allTools = mcpClientManager.getAvailableTools();\n const toolsByServer: Record<string, any> = {};\n\n // Group tools by server for the agent\n for (const tool of allTools) {\n if (!toolsByServer[tool.serverId]) {\n toolsByServer[tool.serverId] = {};\n }\n toolsByServer[tool.serverId][tool.name] = {\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (params: any) => {\n return await mcpClientManager.executeToolDirect(\n `${tool.serverId}:${tool.name}`,\n params,\n );\n },\n };\n }\n\n dbg(\"Streaming start\", {\n connectedServers,\n toolCount: allTools.length,\n messageCount: formattedMessages.length,\n });\n\n // Create streaming response\n const encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n const streamingContext: StreamingContext = {\n controller,\n encoder,\n toolCallId: 0,\n lastEmittedToolCallId: null,\n stepIndex: 0,\n };\n\n // Flatten toolsets into a single tools object for streaming wrapper\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsByServer).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n // Create streaming-wrapped tools\n const streamingWrappedTools = wrapToolsWithStreaming(\n flattenedTools,\n streamingContext,\n );\n\n // Create a new agent instance with streaming tools since tools property is read-only\n const streamingAgent = new Agent({\n name: agent.name,\n instructions: agent.instructions,\n model: agent.model!,\n tools:\n Object.keys(streamingWrappedTools).length > 0\n ? streamingWrappedTools\n : undefined,\n });\n\n // Register elicitation handler with MCPJamClientManager\n mcpClientManager.setElicitationCallback(async (request) => {\n // Convert MCPJamClientManager format to createElicitationHandler format\n const elicitationRequest = {\n message: request.message,\n requestedSchema: request.schema,\n };\n\n // Stream elicitation request to client using the provided requestId\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n requestId: request.requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n }\n\n // Return a promise that will be resolved when user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n pendingElicitations.set(request.requestId, { resolve, reject });\n\n // Set timeout to clean up if no response\n setTimeout(() => {\n if (pendingElicitations.has(request.requestId)) {\n pendingElicitations.delete(request.requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, ELICITATION_TIMEOUT);\n });\n });\n\n try {\n await createStreamingResponse(\n streamingAgent,\n formattedMessages,\n toolsByServer,\n streamingContext,\n provider,\n );\n } catch (error) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"error\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n })}\\n\\n`,\n ),\n );\n } finally {\n // Clear elicitation callback to prevent memory leaks\n mcpClientManager.clearElicitationCallback();\n controller.close();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"[mcp/chat] Error in chat API:\", error);\n\n // Clear elicitation callback on error\n mcpClientManager.clearElicitationCallback();\n\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default chat;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ChatMessage } from \"./chat-types\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateId(): string {\n return Math.random().toString(36).substr(2, 9);\n}\n\nexport function sanitizeText(text: string): string {\n // Basic sanitization - in production you might want more robust sanitization\n return text.trim();\n}\n\nexport function formatTimestamp(date: Date): string {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nexport function formatMessageDate(date: Date): string {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24));\n\n if (diffInDays === 0) {\n return formatTimestamp(date);\n } else if (diffInDays === 1) {\n return `Yesterday ${formatTimestamp(date)}`;\n } else if (diffInDays < 7) {\n return `${diffInDays} days ago`;\n } else {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: date.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n }).format(date);\n }\n}\n\nexport function createMessage(\n role: \"user\" | \"assistant\",\n content: string,\n attachments?: any[],\n): ChatMessage {\n return {\n id: generateId(),\n role,\n content,\n timestamp: new Date(),\n attachments,\n metadata: {\n createdAt: new Date().toISOString(),\n },\n };\n}\n\nexport function isValidFileType(file: File): boolean {\n const allowedTypes = [\n \"text/plain\",\n \"application/pdf\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"application/json\",\n \"text/csv\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ];\n\n return allowedTypes.includes(file.type);\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\");\n}\n\nexport function isImageUrl(url: string): boolean {\n const imageExtensions = [\".jpg\", \".jpeg\", \".png\", \".gif\", \".webp\", \".svg\"];\n const lowerUrl = url.toLowerCase();\n return (\n imageExtensions.some((ext) => lowerUrl.includes(ext)) ||\n lowerUrl.includes(\"data:image/\") ||\n lowerUrl.includes(\"blob:\")\n );\n}\n\nexport function getImageDimensions(\n url: string,\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + \"...\";\n}\n\nexport function scrollToBottom(element?: Element | null) {\n if (element) {\n element.scrollTop = element.scrollHeight;\n } else {\n window.scrollTo(0, document.body.scrollHeight);\n }\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\nexport function getDefaultTemperatureByProvider(provider: string): number {\n switch (provider) {\n case \"openai\":\n return 1.0;\n case \"anthropic\":\n return 0;\n default:\n return 0;\n }\n}\n","import { Hono } from \"hono\";\nimport { writeFile, mkdir } from \"fs/promises\";\nimport { join, dirname } from \"path\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOllama } from \"ollama-ai-provider\";\nimport { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\nimport type { ModelDefinition } from \"../../../shared/types\";\nimport { Agent } from \"@mastra/core/agent\";\nimport {\n normalizeServerConfigName,\n validateMultipleServerConfigs,\n createMCPClientWithMultipleConnections,\n} from \"../../utils/mcp-utils\";\n\nconst tests = new Hono();\n\n// Generate a @TestAgent.ts file for a saved test with selected servers\ntests.post(\"/generate\", async (c) => {\n try {\n const body = await c.req.json();\n const test = body?.test;\n const servers = body?.servers as Record<string, any>;\n const model = body?.model as { id: string; provider: string } | undefined;\n\n if (\n !test?.id ||\n !test?.prompt ||\n !servers ||\n Object.keys(servers).length === 0\n ) {\n return c.json(\n { success: false, error: \"Missing test, servers, or prompt\" },\n 400,\n );\n }\n\n const safeName = String(test.title || test.id)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n const filename = `@TestAgent_${safeName || test.id}.ts`;\n\n const fileContents = `import { Agent } from \"@mastra/core/agent\";\nimport { MCPClient } from \"@mastra/mcp\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOllama } from \"ollama-ai-provider\";\n\nconst servers = ${JSON.stringify(servers, null, 2)} as const;\n\nfunction createModel() {\n const def = ${JSON.stringify(model || null)} as any;\n if (!def) throw new Error(\"Model not provided by UI when generating test agent\");\n switch (def.provider) {\n case \"anthropic\": return createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY! })(def.id);\n case \"openai\": return createOpenAI({ apiKey: process.env.OPENAI_API_KEY! })(def.id);\n case \"deepseek\": return createOpenAI({ apiKey: process.env.DEEPSEEK_API_KEY!, baseURL: \"https://api.deepseek.com/v1\" })(def.id);\n case \"ollama\": return createOllama({ baseURL: process.env.OLLAMA_BASE_URL || \"http://localhost:11434\" })(def.id, { simulateStreaming: true });\n default: throw new Error(\"Unsupported provider: \" + def.provider);\n }\n}\n\nexport const createTestAgent = async () => {\n const mcp = new MCPClient({ servers });\n const toolsets = await mcp.getToolsets();\n return new Agent({\n name: ${JSON.stringify(test.title || \"Test Agent\")},\n instructions: ${JSON.stringify(test.prompt)},\n model: createModel(),\n tools: undefined,\n defaultGenerateOptions: { toolChoice: \"auto\" }\n });\n};\n`;\n\n const targetPath = join(process.cwd(), \"server\", \"agents\", filename);\n await mkdir(dirname(targetPath), { recursive: true });\n await writeFile(targetPath, fileContents, \"utf8\");\n return c.json({ success: true, file: `server/agents/${filename}` });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Unknown error\";\n return c.json({ success: false, error: msg }, 500);\n }\n});\n\nexport default tests;\n\n// Run-all (parallel orchestrated) endpoint\ntests.post(\"/run-all\", async (c) => {\n const encoder = new TextEncoder();\n try {\n const body = await c.req.json();\n const testsInput = (body?.tests || []) as Array<{\n id: string;\n title: string;\n prompt: string;\n expectedTools: string[];\n model: ModelDefinition;\n selectedServers?: string[];\n }>;\n const allServers = (body?.allServers || {}) as Record<\n string,\n MastraMCPServerDefinition\n >;\n const providerApiKeys = body?.providerApiKeys || {};\n const ollamaBaseUrl: string | undefined = body?.ollamaBaseUrl;\n const maxConcurrency: number = Math.max(\n 1,\n Math.min(8, body?.concurrency ?? 5),\n );\n\n if (!Array.isArray(testsInput) || testsInput.length === 0) {\n return c.json({ success: false, error: \"No tests provided\" }, 400);\n }\n\n function createModel(model: ModelDefinition) {\n switch (model.provider) {\n case \"anthropic\":\n return createAnthropic({\n apiKey:\n providerApiKeys?.anthropic || process.env.ANTHROPIC_API_KEY || \"\",\n })(model.id);\n case \"openai\":\n return createOpenAI({\n apiKey: providerApiKeys?.openai || process.env.OPENAI_API_KEY || \"\",\n })(model.id);\n case \"deepseek\":\n return createOpenAI({\n apiKey:\n providerApiKeys?.deepseek || process.env.DEEPSEEK_API_KEY || \"\",\n baseURL: \"https://api.deepseek.com/v1\",\n })(model.id);\n case \"ollama\":\n return createOllama({\n baseURL:\n ollamaBaseUrl ||\n process.env.OLLAMA_BASE_URL ||\n \"http://localhost:11434\",\n })(model.id, { simulateStreaming: true });\n default:\n throw new Error(`Unsupported provider: ${model.provider}`);\n }\n }\n\n const readableStream = new ReadableStream({\n async start(controller) {\n let active = 0;\n let index = 0;\n let failed = false;\n\n const runNext = async () => {\n if (index >= testsInput.length) {\n if (active === 0) {\n // All done\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"run_complete\", passed: !failed })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n }\n return;\n }\n const test = testsInput[index++];\n active++;\n (async () => {\n const calledTools = new Set<string>();\n const expectedSet = new Set<string>(test.expectedTools || []);\n let step = 0;\n let client: MCPClient | null = null;\n try {\n // Build servers for this test\n let serverConfigs: Record<string, MastraMCPServerDefinition> = {};\n if (test.selectedServers && test.selectedServers.length > 0) {\n for (const name of test.selectedServers) {\n if (allServers[name]) serverConfigs[name] = allServers[name];\n }\n } else {\n for (const [name, cfg] of Object.entries(allServers)) {\n serverConfigs[name] = cfg;\n }\n }\n\n // Validate and connect with multiple servers like chat endpoint to ensure headers/eventSourceInit are set\n const validation = validateMultipleServerConfigs(serverConfigs);\n let finalServers: Record<string, MastraMCPServerDefinition> = {};\n if (validation.success && validation.validConfigs) {\n finalServers = validation.validConfigs;\n } else if (\n validation.validConfigs &&\n Object.keys(validation.validConfigs).length > 0\n ) {\n finalServers = validation.validConfigs; // partial success; continue with valid ones\n } else {\n throw new Error(\"No valid MCP server configs for test\");\n }\n\n client = createMCPClientWithMultipleConnections(finalServers);\n const model = createModel(test.model);\n const agent = new Agent({\n name: `TestAgent-${test.id}`,\n instructions:\n \"You are a helpful assistant with access to MCP tools\",\n model,\n });\n const toolsets = await client.getToolsets();\n const stream = await agent.stream(\n [{ role: \"user\", content: test.prompt || \"\" }] as any,\n {\n maxSteps: 10,\n toolsets,\n onStepFinish: ({ text, toolCalls, toolResults }) => {\n step += 1;\n // Accumulate tool names\n (toolCalls || []).forEach((c: any) => {\n const toolName = c?.name || c?.toolName;\n if (toolName) {\n calledTools.add(toolName);\n }\n });\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"trace_step\",\n testId: test.id,\n step,\n text,\n toolCalls,\n toolResults,\n })}\\n\\n`,\n ),\n );\n },\n },\n );\n // Drain text (no need to forward text here)\n for await (const _ of stream.textStream) {\n // no-op\n }\n const called = Array.from(calledTools);\n const missing = Array.from(expectedSet).filter(\n (t) => !calledTools.has(t),\n );\n const unexpected = called.filter((t) => !expectedSet.has(t));\n const passed = missing.length === 0 && unexpected.length === 0;\n if (!passed) failed = true;\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed, calledTools: called, missingTools: missing, unexpectedTools: unexpected })}\\n\\n`,\n ),\n );\n } catch (err) {\n failed = true;\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed: false, error: (err as Error)?.message })}\\n\\n`,\n ),\n );\n } finally {\n try {\n await client?.disconnect();\n } catch {}\n active--;\n runNext();\n }\n })();\n };\n\n for (let i = 0; i < Math.min(maxConcurrency, testsInput.length); i++) {\n runNext();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (err) {\n return c.json(\n { success: false, error: (err as Error)?.message || \"Unknown error\" },\n 500,\n );\n }\n});\n","import { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\n\n// Hono-compatible error response type\nexport interface HonoErrorResponse {\n message: string;\n status: number;\n}\n\nexport interface ValidationResult {\n success: boolean;\n config?: MastraMCPServerDefinition;\n error?: HonoErrorResponse;\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\nexport function validateServerConfig(serverConfig: any): ValidationResult {\n if (!serverConfig) {\n return {\n success: false,\n error: {\n message: \"Server configuration is required\",\n status: 400,\n },\n };\n }\n\n // Validate and prepare config\n const config = { ...serverConfig };\n\n // Validate and convert URL if provided\n if (config.url) {\n try {\n // Convert string URL to URL object if needed and strip query/hash\n if (typeof config.url === \"string\") {\n const parsed = new URL(config.url);\n parsed.search = \"\";\n parsed.hash = \"\";\n config.url = parsed;\n } else if (typeof config.url === \"object\" && !config.url.href) {\n return {\n success: false,\n error: {\n message: \"Invalid URL configuration\",\n status: 400,\n },\n };\n }\n\n // Handle OAuth authentication for HTTP servers\n if (config.oauth?.access_token) {\n const authHeaders = {\n Authorization: `Bearer ${config.oauth.access_token}`,\n ...(config.requestInit?.headers || {}),\n };\n\n config.requestInit = {\n ...config.requestInit,\n headers: authHeaders,\n };\n\n // For SSE connections, add eventSourceInit with OAuth headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Add OAuth authorization header\n headers.set(\n \"Authorization\",\n `Bearer ${config.oauth!.access_token}`,\n );\n\n // Copy other headers from requestInit\n if (config.requestInit?.headers) {\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n if (key.toLowerCase() !== \"authorization\") {\n headers.set(key, value);\n }\n });\n }\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n } else if (config.requestInit?.headers) {\n // For SSE connections without OAuth, add eventSourceInit if requestInit has custom headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Copy headers from requestInit\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n headers.set(key, value);\n });\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n }\n } catch (error) {\n return {\n success: false,\n error: {\n message: `Invalid URL format: ${error}`,\n status: 400,\n },\n };\n }\n }\n\n return {\n success: true,\n config,\n };\n}\n\nexport function createMCPClient(\n config: MastraMCPServerDefinition,\n id: string,\n): MCPClient {\n return new MCPClient({\n id,\n servers: {\n server: config,\n },\n });\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n serverNameMapping?: Record<string, string>; // serverID -> originalName\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\n// Generate unique server ID that avoids collisions\nfunction generateUniqueServerID(serverName: string): string {\n // Use normalized name as base + timestamp + random suffix to ensure uniqueness\n const normalizedBase = normalizeServerConfigName(serverName);\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nexport const validateMultipleServerConfigs = (\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MultipleValidationResult => {\n if (!serverConfigs || Object.keys(serverConfigs).length === 0) {\n return {\n success: false,\n error: {\n message: \"At least one server configuration is required\",\n status: 400,\n },\n };\n }\n\n const validConfigs: Record<string, MastraMCPServerDefinition> = {};\n const serverNameMapping: Record<string, string> = {};\n const errors: Record<string, string> = {};\n let hasErrors = false;\n\n // Validate each server configuration\n for (const [serverName, serverConfig] of Object.entries(serverConfigs)) {\n const validationResult = validateServerConfig(serverConfig);\n\n if (validationResult.success && validationResult.config) {\n // Generate unique server ID to avoid collisions from normalized names\n const serverID = generateUniqueServerID(serverName);\n validConfigs[serverID] = validationResult.config;\n serverNameMapping[serverID] = serverName; // Map serverID back to original name\n } else {\n hasErrors = true;\n let errorMessage = \"Configuration validation failed\";\n if (validationResult.error) {\n errorMessage = validationResult.error.message;\n }\n // Use original server name for error keys since this is for user display\n errors[serverName] = errorMessage;\n }\n }\n\n // If all configs are valid, return success\n if (!hasErrors) {\n return {\n success: true,\n validConfigs,\n serverNameMapping,\n };\n }\n\n // If some configs are valid but others failed, return partial success\n if (Object.keys(validConfigs).length > 0) {\n return {\n success: false,\n validConfigs,\n serverNameMapping,\n errors,\n };\n }\n\n // If all configs failed, return error\n return {\n success: false,\n errors,\n error: {\n message: \"All server configurations failed validation\",\n status: 400,\n },\n };\n};\n\nexport function createMCPClientWithMultipleConnections(\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MCPClient {\n // Custom MCPClient wrapper to fix double prefixing issue\n const originalMCPClient = new MCPClient({\n id: `chat-${Date.now()}`,\n servers: serverConfigs,\n });\n\n // Override getTools method to fix double prefixing\n const originalGetTools = originalMCPClient.getTools.bind(originalMCPClient);\n originalMCPClient.getTools = async () => {\n const tools = await originalGetTools();\n const fixedTools: Record<string, any> = {};\n\n for (const [toolName, toolConfig] of Object.entries(tools)) {\n // Check if tool name has double prefix pattern (serverName_serverName_actualTool)\n const parts = toolName.split(\"_\");\n if (parts.length >= 3 && parts[0] === parts[1]) {\n // Remove the duplicate prefix: \"asana_asana_list_workspaces\" -> \"asana_list_workspaces\"\n const fixedName = parts.slice(1).join(\"_\");\n fixedTools[fixedName] = toolConfig;\n } else {\n fixedTools[toolName] = toolConfig;\n }\n }\n\n return fixedTools;\n };\n\n return originalMCPClient;\n}\n\nexport function normalizeServerConfigName(serverName: string): string {\n // Convert to lowercase and replace spaces/hyphens with underscores\n return serverName\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n}\n\nexport function createErrorResponse(\n message: string,\n details?: string,\n status: number = 500,\n): HonoErrorResponse {\n return {\n message: details ? `${message}: ${details}` : message,\n status,\n };\n}\n","import { Hono } from \"hono\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst oauth = new Hono();\n\n/**\n * Proxy OAuth metadata requests to bypass CORS restrictions\n * GET /api/mcp/oauth/metadata?url=https://mcp.asana.com/.well-known/oauth-authorization-server/sse\n */\noauth.get(\"/metadata\", async (c) => {\n try {\n const url = c.req.query(\"url\");\n\n if (!url) {\n return c.json({ error: \"Missing url parameter\" }, 400);\n }\n\n // Validate URL format and ensure it's HTTPS\n let metadataUrl: URL;\n try {\n metadataUrl = new URL(url);\n if (metadataUrl.protocol !== \"https:\") {\n return c.json({ error: \"Only HTTPS URLs are allowed\" }, 400);\n }\n } catch (error) {\n return c.json({ error: \"Invalid URL format\" }, 400);\n }\n\n // Fetch OAuth metadata from the server\n const response = await fetch(metadataUrl.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"MCP-Inspector/1.0\",\n },\n });\n\n if (!response.ok) {\n return c.json(\n {\n error: `Failed to fetch OAuth metadata: ${response.status} ${response.statusText}`,\n },\n response.status as ContentfulStatusCode,\n );\n }\n\n const metadata = (await response.json()) as Record<string, unknown>;\n\n // Return the metadata with proper CORS headers\n return c.json(metadata);\n } catch (error) {\n console.error(\"OAuth metadata proxy error:\", error);\n return c.json(\n {\n error:\n error instanceof Error ? error.message : \"Unknown error occurred\",\n },\n 500,\n );\n }\n});\n\nexport default oauth;\n","import { MCPClient, MastraMCPServerDefinition } from \"@mastra/mcp\";\nimport { validateServerConfig } from \"../utils/mcp-utils\";\n\nexport type ConnectionStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport interface DiscoveredTool {\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n serverId: string;\n}\n\nexport interface DiscoveredResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n serverId: string;\n}\n\nexport interface DiscoveredPrompt {\n name: string;\n description?: string;\n arguments?: Record<string, any>;\n serverId: string;\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n}\n\nexport interface ChatResponse {\n text?: string;\n toolCalls?: any[];\n toolResults?: any[];\n}\n\nexport interface ToolResult {\n result: any;\n}\n\nexport interface ElicitationRequest {\n message: string;\n requestedSchema: any;\n}\n\nexport interface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\nexport interface ResourceContent {\n contents: any[];\n}\n\nexport interface PromptResult {\n content: any;\n}\n\nfunction generateUniqueServerId(serverId: string) {\n // Generate unique server ID that avoids collisions\n const normalizedBase = serverId\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nclass MCPJamClientManager {\n private mcpClients: Map<string, MCPClient> = new Map();\n private statuses: Map<string, ConnectionStatus> = new Map();\n private configs: Map<string, MastraMCPServerDefinition> = new Map();\n\n // Map original server names to unique IDs\n private serverIdMapping: Map<string, string> = new Map();\n\n // Track in-flight connections to avoid duplicate concurrent connects\n private pendingConnections: Map<string, Promise<void>> = new Map();\n\n private toolRegistry: Map<string, DiscoveredTool> = new Map();\n private resourceRegistry: Map<string, DiscoveredResource> = new Map();\n private promptRegistry: Map<string, DiscoveredPrompt> = new Map();\n\n // Store for pending elicitation requests with Promise resolvers\n private pendingElicitations: Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > = new Map();\n\n // Optional callback for handling elicitation requests\n private elicitationCallback?: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>;\n\n // Helper method to get unique ID for a server name\n private getServerUniqueId(serverName: string): string | undefined {\n return this.serverIdMapping.get(serverName);\n }\n\n // Public method to get server ID for external use (like frontend)\n getServerIdForName(serverName: string): string | undefined {\n return this.serverIdMapping.get(serverName);\n }\n\n async connectToServer(serverId: string, serverConfig: any): Promise<void> {\n // If a connection is already in-flight for this server name, wait for it\n const pending = this.pendingConnections.get(serverId);\n if (pending) {\n await pending;\n return;\n }\n\n const connectPromise = (async () => {\n // Reuse existing unique ID for this server name if present; otherwise generate and map one\n let id = this.serverIdMapping.get(serverId);\n if (!id) {\n id = generateUniqueServerId(serverId);\n this.serverIdMapping.set(serverId, id);\n }\n\n // If already connected, no-op\n if (this.mcpClients.has(id)) return;\n\n // Validate server configuration\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n this.statuses.set(id, \"error\");\n throw new Error(validation.error!.message);\n }\n\n this.configs.set(id, validation.config!);\n this.statuses.set(id, \"connecting\");\n\n const client = new MCPClient({\n id: `mcpjam-${id}`,\n servers: { [id]: validation.config! },\n });\n\n try {\n // touch the server to verify connection\n await client.getTools();\n this.mcpClients.set(id, client);\n this.statuses.set(id, \"connected\");\n\n // Register elicitation handler for this server\n if (client.elicitation?.onRequest) {\n client.elicitation.onRequest(\n id,\n async (elicitationRequest: ElicitationRequest) => {\n return await this.handleElicitationRequest(elicitationRequest);\n },\n );\n }\n\n await this.discoverServerResources(id);\n } catch (err) {\n this.statuses.set(id, \"error\");\n try {\n await client.disconnect();\n } catch {}\n this.mcpClients.delete(id);\n throw err;\n }\n })().finally(() => {\n this.pendingConnections.delete(serverId);\n });\n\n this.pendingConnections.set(serverId, connectPromise);\n await connectPromise;\n }\n\n async disconnectFromServer(serverId: string): Promise<void> {\n const id = this.getServerUniqueId(serverId);\n if (!id) return; // Server not found\n\n const client = this.mcpClients.get(id);\n if (client) {\n try {\n await client.disconnect();\n } catch {}\n }\n this.mcpClients.delete(id);\n this.statuses.set(id, \"disconnected\");\n this.serverIdMapping.delete(serverId); // Clean up the mapping\n\n // purge registries for this server\n for (const key of Array.from(this.toolRegistry.keys())) {\n const item = this.toolRegistry.get(key)!;\n if (item.serverId === id) this.toolRegistry.delete(key);\n }\n for (const key of Array.from(this.resourceRegistry.keys())) {\n const item = this.resourceRegistry.get(key)!;\n if (item.serverId === id) this.resourceRegistry.delete(key);\n }\n for (const key of Array.from(this.promptRegistry.keys())) {\n const item = this.promptRegistry.get(key)!;\n if (item.serverId === id) this.promptRegistry.delete(key);\n }\n }\n\n getConnectionStatus(serverId: string): ConnectionStatus {\n const id = this.getServerUniqueId(serverId);\n return id ? this.statuses.get(id) || \"disconnected\" : \"disconnected\";\n }\n\n getConnectedServers(): Record<\n string,\n { status: ConnectionStatus; config?: any }\n > {\n const servers: Record<string, { status: ConnectionStatus; config?: any }> =\n {};\n\n // Return data keyed by the original server names provided by callers\n for (const [originalName, uniqueId] of this.serverIdMapping.entries()) {\n servers[originalName] = {\n status: this.statuses.get(uniqueId) || \"disconnected\",\n config: this.configs.get(uniqueId),\n };\n }\n\n return servers;\n }\n\n async discoverAllResources(): Promise<void> {\n const serverIds = Array.from(this.mcpClients.keys());\n await Promise.all(serverIds.map((id) => this.discoverServerResources(id)));\n }\n\n private async discoverServerResources(serverId: string): Promise<void> {\n // serverId is already the unique ID when called from connectToServer\n const client = this.mcpClients.get(serverId);\n if (!client) return;\n\n // Tools - use toolsets instead of getTools for consistency\n const toolsets = await client.getToolsets();\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n for (const [name, tool] of Object.entries<any>(flattenedTools)) {\n this.toolRegistry.set(`${serverId}:${name}`, {\n name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: (tool as any).outputSchema,\n serverId: serverId,\n });\n }\n\n // Resources\n try {\n const res = await client.resources.list();\n for (const [, list] of Object.entries<any>(res)) {\n for (const r of list as any[]) {\n this.resourceRegistry.set(`${serverId}:${r.uri}`, {\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n serverId: serverId,\n });\n }\n }\n } catch {}\n\n // Prompts\n try {\n const prompts = await client.prompts.list();\n for (const [, list] of Object.entries<any>(prompts)) {\n for (const p of list as any[]) {\n this.promptRegistry.set(`${serverId}:${p.name}`, {\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n serverId: serverId,\n });\n }\n }\n } catch {}\n }\n\n getAvailableTools(): DiscoveredTool[] {\n return Array.from(this.toolRegistry.values());\n }\n\n async getToolsetsForServer(serverId: string): Promise<Record<string, any>> {\n const id = this.getServerUniqueId(serverId);\n if (!id) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n const client = this.mcpClients.get(id);\n if (!client) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n // Get toolsets like in the chat route - this gives us server-prefixed tools\n const toolsets = await client.getToolsets();\n\n // Flatten toolsets to get un-prefixed tool names like in chat route\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n return flattenedTools;\n }\n getAvailableResources(): DiscoveredResource[] {\n return Array.from(this.resourceRegistry.values());\n }\n\n getResourcesForServer(serverId: string): DiscoveredResource[] {\n const id = this.getServerUniqueId(serverId);\n if (!id) return [];\n return Array.from(this.resourceRegistry.values()).filter(\n (r) => r.serverId === id,\n );\n }\n\n getAvailablePrompts(): DiscoveredPrompt[] {\n return Array.from(this.promptRegistry.values());\n }\n\n getPromptsForServer(serverId: string): DiscoveredPrompt[] {\n const id = this.getServerUniqueId(serverId);\n if (!id) return [];\n return Array.from(this.promptRegistry.values()).filter(\n (p) => p.serverId === id,\n );\n }\n\n async executeToolDirect(\n toolName: string,\n parameters: Record<string, any> = {},\n ): Promise<ToolResult> {\n // toolName may include server prefix \"serverId:tool\"\n let serverId = \"\";\n let name = toolName;\n\n if (toolName.includes(\":\")) {\n const [sid, n] = toolName.split(\":\", 2);\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(sid);\n serverId = mappedId || (this.mcpClients.has(sid) ? sid : \"\");\n name = n;\n } else {\n // Find which server has this tool by checking un-prefixed name\n for (const tool of this.toolRegistry.values()) {\n if (tool.name === toolName) {\n serverId = tool.serverId;\n name = toolName;\n break;\n }\n }\n }\n\n // If not found in registry, try to find it using toolsets from all connected servers\n if (!serverId) {\n for (const [clientServerId, client] of this.mcpClients.entries()) {\n try {\n const toolsets = await client.getToolsets();\n // Flatten toolsets to check for the tool\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n if (flattenedTools[toolName]) {\n serverId = clientServerId;\n name = toolName;\n break;\n }\n } catch {\n // Continue to next server if this one fails\n }\n }\n }\n\n if (!serverId) {\n throw new Error(`Tool not found in any connected server: ${toolName}`);\n }\n\n const client = this.mcpClients.get(serverId);\n if (!client)\n throw new Error(`No MCP client available for server: ${serverId}`);\n\n // Use toolsets to get the actual tool (since tools might be prefixed in getTools())\n const toolsets = await client.getToolsets();\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n const tool = flattenedTools[name];\n if (!tool)\n throw new Error(`Tool '${name}' not found in server '${serverId}'`);\n\n // Inspect input schema to choose the most likely argument shape, but be robust and\n // fall back to the alternate shape on invalid-arguments errors.\n const schema: any = (tool as any).inputSchema;\n const hasContextProperty =\n schema &&\n typeof schema === \"object\" &&\n (schema as any).properties &&\n Object.prototype.hasOwnProperty.call(\n (schema as any).properties,\n \"context\",\n );\n const requiresContext =\n hasContextProperty ||\n (schema &&\n Array.isArray((schema as any).required) &&\n (schema as any).required.includes(\"context\"));\n\n const contextWrapped = { context: parameters || {} };\n const direct = parameters || {};\n const attempts = requiresContext\n ? [contextWrapped, direct]\n : [direct, contextWrapped];\n\n let lastError: any = undefined;\n for (const args of attempts) {\n try {\n const result = await tool.execute(args);\n return { result };\n } catch (err: any) {\n lastError = err;\n }\n }\n throw lastError;\n }\n\n async getResource(\n resourceUri: string,\n serverId: string,\n ): Promise<ResourceContent> {\n // resourceUri may include server prefix\n let uri = resourceUri;\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(serverId);\n const resolvedServerId =\n mappedId || (this.mcpClients.has(serverId) ? serverId : undefined);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.resources.read(resolvedServerId, uri);\n return { contents: content?.contents || [] };\n }\n\n async getPrompt(\n promptName: string,\n serverId: string,\n args?: Record<string, any>,\n ): Promise<PromptResult> {\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(serverId);\n const resolvedServerId =\n mappedId || (this.mcpClients.has(serverId) ? serverId : undefined);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.prompts.get({\n serverName: resolvedServerId,\n name: promptName,\n args: args || {},\n });\n return { content };\n }\n\n /**\n * Handles elicitation requests from MCP servers during direct tool execution\n */\n private async handleElicitationRequest(\n elicitationRequest: ElicitationRequest,\n ): Promise<ElicitationResponse> {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Create a promise that will be resolved when the user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n this.pendingElicitations.set(requestId, { resolve, reject });\n\n // If there's an active elicitation callback, use it\n if (this.elicitationCallback) {\n this.elicitationCallback({\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n })\n .then(resolve)\n .catch(reject);\n } else {\n // If no callback is set, reject with details for the tools route to handle\n const error = new Error(\"ELICITATION_REQUIRED\");\n (error as any).elicitationRequest = {\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n };\n reject(error);\n }\n });\n }\n\n /**\n * Responds to a pending elicitation request\n */\n respondToElicitation(\n requestId: string,\n response: ElicitationResponse,\n ): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) {\n return false;\n }\n\n pending.resolve(response);\n this.pendingElicitations.delete(requestId);\n return true;\n }\n\n /**\n * Gets the pending elicitations map for external access\n */\n getPendingElicitations(): Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n /**\n * Sets a callback to handle elicitation requests\n */\n setElicitationCallback(\n callback: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>,\n ): void {\n this.elicitationCallback = callback;\n }\n\n /**\n * Clears the elicitation callback\n */\n clearElicitationCallback(): void {\n this.elicitationCallback = undefined;\n }\n}\n\n// Export the class directly instead of singleton\nexport { MCPJamClientManager };\nexport default MCPJamClientManager;\n"],"mappings":"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","names":["Hono","join","Hono","Hono","Hono","mcpJamClientManager","Hono","TextEncoder","Hono","mcpJamClientManager","TextEncoder","requestId","response","Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","TextEncoder","pendingElicitations","Hono","tools","TextEncoder","Hono","createAnthropic","createOpenAI","createOllama","Agent","tools","Hono","servers","createModel","createAnthropic","createOpenAI","createOllama","Agent","c","Hono","Hono","MCPClient","MCPClient","servers","prompts","tool","client","toolsets","flattenedTools","Hono","join"]}
|