@mcpjam/inspector 0.9.2 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +23 -0
- package/bin/start.js +6 -3
- package/dist/client/assets/index-Bv0p7Vhi.css +1 -0
- package/dist/client/assets/index-DzF9hvwr.js +1713 -0
- package/dist/client/assets/index-DzF9hvwr.js.map +1 -0
- package/dist/client/index.html +2 -2
- package/dist/server/index.js +166 -16
- package/dist/server/index.js.map +1 -1
- package/package.json +8 -5
- package/dist/client/assets/index-BxtnlkQW.css +0 -1
- package/dist/client/assets/index-C2tpp_KC.js +0 -357
- package/dist/client/assets/index-C2tpp_KC.js.map +0 -1
- package/dist/main/main.cjs +0 -1315
- package/dist/preload/preload.js +0 -26
- package/dist/renderer/assets/index-CYiU4_x2.css +0 -1
- package/dist/renderer/assets/index-woGCpEdp.js +0 -356
- package/dist/renderer/catalyst.png +0 -0
- package/dist/renderer/claude_logo.png +0 -0
- package/dist/renderer/demo_1.png +0 -0
- package/dist/renderer/demo_2.png +0 -0
- package/dist/renderer/demo_3.png +0 -0
- package/dist/renderer/file.svg +0 -1
- package/dist/renderer/globe.svg +0 -1
- package/dist/renderer/index.html +0 -14
- package/dist/renderer/mcp.svg +0 -1
- package/dist/renderer/mcp_jam.svg +0 -12
- package/dist/renderer/mcp_jam_dark.png +0 -0
- package/dist/renderer/mcp_jam_light.png +0 -0
- package/dist/renderer/next.svg +0 -1
- package/dist/renderer/ollama_dark.png +0 -0
- package/dist/renderer/ollama_logo.svg +0 -7
- package/dist/renderer/openai_logo.png +0 -0
- package/dist/renderer/vercel.svg +0 -1
- package/dist/renderer/window.svg +0 -1
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/index.ts","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/utils/mcp-utils.ts","../../server/routes/mcp/tools.ts","../../server/routes/mcp/resources.ts","../../server/routes/mcp/prompts.ts","../../server/routes/mcp/chat.ts","../../server/routes/mcp/oauth.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\nimport mcpRoutes from \"./routes/mcp/index\";\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// 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: \"MCP Inspector 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 tools from \"./tools\";\nimport resources from \"./resources\";\nimport prompts from \"./prompts\";\nimport chat from \"./chat\";\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// Tools endpoint - REAL IMPLEMENTATION\nmcp.route(\"/tools\", tools);\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 { validateServerConfig, createMCPClient } from \"../../utils/mcp-utils\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst connect = new Hono();\n\nconnect.post(\"/\", async (c) => {\n try {\n const { serverConfig } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n const error = validation.error!;\n return c.json(\n {\n success: false,\n error: error.message,\n },\n error.status as ContentfulStatusCode,\n );\n }\n\n let client;\n try {\n client = createMCPClient(validation.config!, `test-${Date.now()}`);\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `Failed to create a MCP client. Please double check your server configuration: ${JSON.stringify(serverConfig)}`,\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n\n try {\n await client.getTools();\n await client.disconnect();\n return c.json({\n success: true,\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 { MCPClient } from \"@mastra/mcp\";\nimport type { MastraMCPServerDefinition } from \"../../shared/types\";\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\n if (typeof config.url === \"string\") {\n config.url = new URL(config.url);\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 errors?: Record<string, string>;\n error?: HonoErrorResponse;\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 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 validConfigs[serverName] = validationResult.config;\n } else {\n hasErrors = true;\n let errorMessage = \"Configuration validation failed\";\n if (validationResult.error) {\n errorMessage = validationResult.error.message;\n }\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 };\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 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 // Normalize server config names\n const normalizedConfigs: Record<string, MastraMCPServerDefinition> = {};\n for (const [serverName, config] of Object.entries(serverConfigs)) {\n const normalizedName = normalizeServerConfigName(serverName);\n normalizedConfigs[normalizedName] = config;\n }\n\n return new MCPClient({\n id: `chat-${Date.now()}`,\n servers: normalizedConfigs,\n });\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 { validateServerConfig, createMCPClient } from \"../../utils/mcp-utils\";\nimport type { Tool } from \"@mastra/core/tools\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\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 client: any = null;\n let encoder: TextEncoder | null = null;\n let streamController: ReadableStreamDefaultController | null = null;\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 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 // Resolve the pending elicitation with user's response\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n\n return c.json({ success: true });\n }\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\n }\n\n encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n streamController = controller;\n\n try {\n const clientId = `tools-${action}-${Date.now()}`;\n client = createMCPClient(validation.config!, clientId);\n\n if (action === \"list\") {\n // Stream tools list\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tools_loading\",\n message: \"Fetching tools from server...\",\n })}\\n\\n`,\n ),\n );\n\n const tools: Record<string, Tool> = await client.getTools();\n\n // Convert from Zod to JSON Schema\n const toolsWithJsonSchema: Record<string, any> = Object.fromEntries(\n Object.entries(tools).map(([toolName, tool]) => {\n return [\n toolName,\n {\n ...tool,\n inputSchema: zodToJsonSchema(\n tool.inputSchema as unknown as z.ZodType<any>,\n ),\n },\n ];\n }),\n );\n\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tools_list\",\n tools: toolsWithJsonSchema,\n })}\\n\\n`,\n ),\n );\n } else if (action === \"execute\") {\n // Stream tool execution\n if (!toolName) {\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_error\",\n error: \"Tool name is required for execution\",\n })}\\n\\n`,\n ),\n );\n return;\n }\n\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_executing\",\n toolName,\n parameters: parameters || {},\n message: \"Executing tool...\",\n })}\\n\\n`,\n ),\n );\n\n const tools = await client.getTools();\n const tool = tools[toolName];\n\n if (!tool) {\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_error\",\n error: `Tool '${toolName}' not found`,\n })}\\n\\n`,\n ),\n );\n return;\n }\n\n const toolArgs =\n parameters && typeof parameters === \"object\" ? parameters : {};\n\n // Set up elicitation handler\n const elicitationHandler = async (elicitationRequest: any) => {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Stream elicitation request to client\n if (streamController && encoder) {\n streamController.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n 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((resolve, reject) => {\n pendingElicitations.set(requestId, { resolve, reject });\n\n // Set a timeout to clean up if no response\n setTimeout(() => {\n if (pendingElicitations.has(requestId)) {\n pendingElicitations.delete(requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, 300000); // 5 minute timeout\n });\n };\n\n // Register elicitation handler with the client\n if (client.elicitation && client.elicitation.onRequest) {\n const serverName = \"server\"; // See createMCPClient() function. The name of the server is \"server\"\n client.elicitation.onRequest(serverName, elicitationHandler);\n }\n\n const result = await tool.execute({\n context: toolArgs,\n });\n\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolName,\n result,\n })}\\n\\n`,\n ),\n );\n\n // Stream elicitation completion if there were any\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_complete\",\n toolName,\n })}\\n\\n`,\n ),\n );\n }\n\n controller.enqueue(encoder!.encode(`data: [DONE]\\n\\n`));\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : \"Unknown error\";\n\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_error\",\n error: errorMsg,\n })}\\n\\n`,\n ),\n );\n } finally {\n if (client) {\n await client.disconnect();\n }\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 const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n\n // Clean up client on error\n if (client) {\n try {\n await client.disconnect();\n } catch (cleanupError) {\n // Ignore cleanup errors\n }\n }\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 { validateServerConfig, createMCPClient } from \"../../utils/mcp-utils\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst resources = new Hono();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverConfig } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\n }\n\n const client = createMCPClient(\n validation.config!,\n `resources-list-${Date.now()}`,\n );\n\n try {\n const resources = await client.resources.list();\n\n // Cleanup\n await client.disconnect();\n\n return c.json({ resources });\n } catch (error) {\n await client.disconnect();\n throw error;\n }\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 { serverConfig, uri } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\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 client = createMCPClient(\n validation.config!,\n `resources-read-${Date.now()}`,\n );\n\n try {\n const content = await client.resources.read(\"server\", uri);\n\n // Cleanup\n await client.disconnect();\n\n return c.json({ content });\n } catch (error) {\n await client.disconnect();\n throw error;\n }\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 { validateServerConfig, createMCPClient } from \"../../utils/mcp-utils\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst prompts = new Hono();\n\n// List prompts endpoint\nprompts.post(\"/list\", async (c) => {\n try {\n const { serverConfig } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\n }\n\n const client = createMCPClient(\n validation.config!,\n `prompts-list-${Date.now()}`,\n );\n\n try {\n const prompts = await client.prompts.list();\n\n // Cleanup\n await client.disconnect();\n\n return c.json({ prompts });\n } catch (error) {\n await client.disconnect();\n throw error;\n }\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 { serverConfig, name, args } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\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 client = createMCPClient(\n validation.config!,\n `prompts-get-${Date.now()}`,\n );\n\n try {\n const content = await client.prompts.get({\n serverName: \"server\",\n name,\n args: args || {},\n });\n\n // Cleanup\n await client.disconnect();\n\n return c.json({ content });\n } catch (error) {\n await client.disconnect();\n throw error;\n }\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 {\n validateMultipleServerConfigs,\n createMCPClientWithMultipleConnections,\n} from \"../../utils/mcp-utils\";\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 { ChatMessage, ModelDefinition } from \"../../../shared/types\";\nimport { MCPClient } from \"@mastra/mcp\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst chat = 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\nchat.post(\"/\", async (c) => {\n let client: MCPClient | null = null;\n try {\n const requestData = await c.req.json();\n const {\n serverConfigs,\n model,\n apiKey,\n systemPrompt,\n messages,\n ollamaBaseUrl,\n action,\n requestId,\n response,\n }: {\n serverConfigs?: Record<string, any>;\n model?: ModelDefinition;\n apiKey?: string;\n systemPrompt?: string;\n messages?: ChatMessage[];\n ollamaBaseUrl?: string;\n action?: string;\n requestId?: string;\n response?: any;\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 // Resolve the pending elicitation with user's response\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n\n return c.json({ success: true });\n }\n\n if (!model || !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 if (serverConfigs && Object.keys(serverConfigs).length > 0) {\n const validation = validateMultipleServerConfigs(serverConfigs);\n if (!validation.success) {\n return c.json(\n {\n success: false,\n error: validation.error!.message,\n details: validation.errors,\n },\n validation.error!.status as ContentfulStatusCode,\n );\n }\n\n client = createMCPClientWithMultipleConnections(validation.validConfigs!);\n } else {\n client = new MCPClient({\n id: `chat-${Date.now()}`,\n servers: {},\n });\n }\n\n // Get tools and ensure client is connected\n const tools = await client.getTools();\n\n const llmModel = getLlmModel(model, apiKey, ollamaBaseUrl);\n\n // Create a custom event emitter for streaming tool events\n let toolCallId = 0;\n let streamController: ReadableStreamDefaultController | null = null;\n let encoder: TextEncoder | null = null;\n\n // Set up elicitation handler\n const elicitationHandler = async (elicitationRequest: any) => {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n\n // Stream elicitation request to client\n if (streamController && encoder) {\n streamController.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n 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<{\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: { [x: string]: unknown };\n _meta?: { [x: string]: unknown };\n }>((resolve, reject) => {\n pendingElicitations.set(requestId, { resolve, reject });\n\n // Set a timeout to clean up if no response\n setTimeout(() => {\n if (pendingElicitations.has(requestId)) {\n pendingElicitations.delete(requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, 300000); // 5 minute timeout\n });\n };\n\n // Register elicitation handler with the client for all servers\n if (client.elicitation && client.elicitation.onRequest && serverConfigs) {\n // Register elicitation handler for each server\n for (const serverName of Object.keys(serverConfigs)) {\n // Normalize server name to match MCPClient's internal naming\n const normalizedName = serverName\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n client.elicitation.onRequest(normalizedName, elicitationHandler);\n }\n }\n\n // Wrap tools to capture tool calls and results\n const originalTools = tools && Object.keys(tools).length > 0 ? tools : {};\n const wrappedTools: Record<string, any> = {};\n\n for (const [name, tool] of Object.entries(originalTools)) {\n wrappedTools[name] = {\n ...(tool as any),\n execute: async (params: any) => {\n const currentToolCallId = ++toolCallId;\n\n // Stream tool call event immediately\n if (streamController && encoder) {\n streamController.enqueue(\n 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 try {\n const result = await (tool as any).execute(params);\n\n // Stream tool result event immediately\n if (streamController && encoder) {\n streamController.enqueue(\n 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 // Stream tool error event immediately\n if (streamController && encoder) {\n streamController.enqueue(\n 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 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: Object.keys(wrappedTools).length > 0 ? wrappedTools : undefined,\n });\n\n const formattedMessages = messages.map((msg: ChatMessage) => ({\n role: msg.role,\n content: msg.content,\n }));\n\n // Start streaming\n const stream = await agent.stream(formattedMessages, {\n maxSteps: 10, // Allow up to 10 steps for tool usage\n });\n\n encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n streamController = controller;\n\n try {\n let hasContent = false;\n for await (const chunk of stream.textStream) {\n if (chunk && chunk.trim()) {\n hasContent = true;\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({ type: \"text\", content: chunk })}\\n\\n`,\n ),\n );\n }\n }\n\n // If no content was streamed, send a fallback message\n if (!hasContent) {\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({ type: \"text\", content: \"I apologize, but I couldn't generate a response. Please try again.\" })}\\n\\n`,\n ),\n );\n }\n\n // Stream elicitation completion if there were any\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_complete\",\n })}\\n\\n`,\n ),\n );\n\n controller.enqueue(encoder!.encode(`data: [DONE]\\n\\n`));\n } catch (error) {\n console.error(\"Streaming error:\", 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 if (client) {\n try {\n await client.disconnect();\n } catch (cleanupError) {\n console.warn(\n \"Error cleaning up MCP client after streaming:\",\n cleanupError,\n );\n }\n }\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(\"Error in chat API:\", error);\n\n // Clean up client on error\n if (client) {\n try {\n await client.disconnect();\n } catch (cleanupError) {\n console.warn(\"Error cleaning up MCP client after error:\", cleanupError);\n }\n }\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\nconst getLlmModel = (\n modelDefinition: ModelDefinition,\n apiKey: string,\n ollamaBaseUrl?: string,\n) => {\n if (!modelDefinition || !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 \"ollama\":\n const baseUrl = ollamaBaseUrl || \"http://localhost:11434\";\n return createOllama({\n baseURL: `${baseUrl}/api`, // Configurable Ollama API endpoint\n })(modelDefinition.id, {\n simulateStreaming: true, // Enable streaming for Ollama models\n });\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n\nexport default chat;\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();\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"],"mappings":"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","names":["Hono","Hono","Hono","Hono","tools","toolName","requestId","Hono","Hono","resources","Hono","Hono","prompts","Hono","MCPClient","Hono","pendingElicitations","tools","requestId","Hono","Hono","Hono"]}
|
|
1
|
+
{"version":3,"sources":["../../server/index.ts","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/utils/mcp-utils.ts","../../server/routes/mcp/tools.ts","../../server/routes/mcp/resources.ts","../../server/routes/mcp/prompts.ts","../../server/routes/mcp/chat.ts","../../server/routes/mcp/oauth.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\nimport mcpRoutes from \"./routes/mcp/index\";\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// 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 tools from \"./tools\";\nimport resources from \"./resources\";\nimport prompts from \"./prompts\";\nimport chat from \"./chat\";\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// Tools endpoint - REAL IMPLEMENTATION\nmcp.route(\"/tools\", tools);\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 { validateServerConfig, createMCPClient } from \"../../utils/mcp-utils\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst connect = new Hono();\n\nconnect.post(\"/\", async (c) => {\n try {\n const { serverConfig } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n const error = validation.error!;\n return c.json(\n {\n success: false,\n error: error.message,\n },\n error.status as ContentfulStatusCode,\n );\n }\n\n let client;\n try {\n client = createMCPClient(validation.config!, `test-${Date.now()}`);\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `Failed to create a MCP client. Please double check your server configuration: ${JSON.stringify(serverConfig)}`,\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n\n try {\n await client.getTools();\n await client.disconnect();\n return c.json({\n success: true,\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 { MCPClient } from \"@mastra/mcp\";\nimport type { MastraMCPServerDefinition } from \"../../shared/types\";\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 errors?: Record<string, string>;\n error?: HonoErrorResponse;\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 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 validConfigs[serverName] = validationResult.config;\n } else {\n hasErrors = true;\n let errorMessage = \"Configuration validation failed\";\n if (validationResult.error) {\n errorMessage = validationResult.error.message;\n }\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 };\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 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 // Normalize server config names\n const normalizedConfigs: Record<string, MastraMCPServerDefinition> = {};\n for (const [serverName, config] of Object.entries(serverConfigs)) {\n const normalizedName = normalizeServerConfigName(serverName);\n normalizedConfigs[normalizedName] = config;\n }\n\n return new MCPClient({\n id: `chat-${Date.now()}`,\n servers: normalizedConfigs,\n });\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 { validateServerConfig, createMCPClient } from \"../../utils/mcp-utils\";\nimport type { Tool } from \"@mastra/core/tools\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport { TextEncoder } from \"util\";\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 client: any = null;\n let encoder: TextEncoder | null = null;\n let streamController: ReadableStreamDefaultController | null = null;\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 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 // Resolve the pending elicitation with user's response\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n\n return c.json({ success: true });\n }\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\n }\n\n encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n streamController = controller;\n\n try {\n const clientId = `tools-${action}-${Date.now()}`;\n client = createMCPClient(validation.config!, clientId);\n\n if (action === \"list\") {\n // Stream tools list\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tools_loading\",\n message: \"Fetching tools from server...\",\n })}\\n\\n`,\n ),\n );\n\n const tools: Record<string, Tool> = await client.getTools();\n\n // Convert from Zod to JSON Schema\n const toolsWithJsonSchema: Record<string, any> = Object.fromEntries(\n Object.entries(tools).map(([toolName, tool]) => {\n return [\n toolName,\n {\n ...tool,\n inputSchema: zodToJsonSchema(\n tool.inputSchema as unknown as z.ZodType<any>,\n ),\n },\n ];\n }),\n );\n\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tools_list\",\n tools: toolsWithJsonSchema,\n })}\\n\\n`,\n ),\n );\n } else if (action === \"execute\") {\n // Stream tool execution\n if (!toolName) {\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_error\",\n error: \"Tool name is required for execution\",\n })}\\n\\n`,\n ),\n );\n return;\n }\n\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_executing\",\n toolName,\n parameters: parameters || {},\n message: \"Executing tool...\",\n })}\\n\\n`,\n ),\n );\n\n const tools = await client.getTools();\n const tool = tools[toolName];\n\n if (!tool) {\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_error\",\n error: `Tool '${toolName}' not found`,\n })}\\n\\n`,\n ),\n );\n return;\n }\n\n const toolArgs =\n parameters && typeof parameters === \"object\" ? parameters : {};\n\n // Set up elicitation handler\n const elicitationHandler = async (elicitationRequest: any) => {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Stream elicitation request to client\n if (streamController && encoder) {\n streamController.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n 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((resolve, reject) => {\n pendingElicitations.set(requestId, { resolve, reject });\n\n // Set a timeout to clean up if no response\n setTimeout(() => {\n if (pendingElicitations.has(requestId)) {\n pendingElicitations.delete(requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, 300000); // 5 minute timeout\n });\n };\n\n // Register elicitation handler with the client\n if (client.elicitation && client.elicitation.onRequest) {\n const serverName = \"server\"; // See createMCPClient() function. The name of the server is \"server\"\n client.elicitation.onRequest(serverName, elicitationHandler);\n }\n\n const result = await tool.execute({\n context: toolArgs,\n });\n\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolName,\n result,\n })}\\n\\n`,\n ),\n );\n\n // Stream elicitation completion if there were any\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_complete\",\n toolName,\n })}\\n\\n`,\n ),\n );\n }\n\n controller.enqueue(encoder!.encode(`data: [DONE]\\n\\n`));\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : \"Unknown error\";\n\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"tool_error\",\n error: errorMsg,\n })}\\n\\n`,\n ),\n );\n } finally {\n if (client) {\n await client.disconnect();\n }\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 const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n\n // Clean up client on error\n if (client) {\n try {\n await client.disconnect();\n } catch (cleanupError) {\n // Ignore cleanup errors\n }\n }\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 { validateServerConfig, createMCPClient } from \"../../utils/mcp-utils\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst resources = new Hono();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverConfig } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\n }\n\n const client = createMCPClient(\n validation.config!,\n `resources-list-${Date.now()}`,\n );\n\n try {\n const resources = await client.resources.list();\n\n // Cleanup\n await client.disconnect();\n\n return c.json({ resources });\n } catch (error) {\n await client.disconnect();\n throw error;\n }\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 { serverConfig, uri } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\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 client = createMCPClient(\n validation.config!,\n `resources-read-${Date.now()}`,\n );\n\n try {\n const content = await client.resources.read(\"server\", uri);\n\n // Cleanup\n await client.disconnect();\n\n return c.json({ content });\n } catch (error) {\n await client.disconnect();\n throw error;\n }\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 { validateServerConfig, createMCPClient } from \"../../utils/mcp-utils\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst prompts = new Hono();\n\n// List prompts endpoint\nprompts.post(\"/list\", async (c) => {\n try {\n const { serverConfig } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\n }\n\n const client = createMCPClient(\n validation.config!,\n `prompts-list-${Date.now()}`,\n );\n\n try {\n const prompts = await client.prompts.list();\n\n // Cleanup\n await client.disconnect();\n\n return c.json({ prompts });\n } catch (error) {\n await client.disconnect();\n throw error;\n }\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 { serverConfig, name, args } = await c.req.json();\n\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n return c.json(\n { success: false, error: validation.error!.message },\n validation.error!.status as ContentfulStatusCode,\n );\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 client = createMCPClient(\n validation.config!,\n `prompts-get-${Date.now()}`,\n );\n\n try {\n const content = await client.prompts.get({\n serverName: \"server\",\n name,\n args: args || {},\n });\n\n // Cleanup\n await client.disconnect();\n\n return c.json({ content });\n } catch (error) {\n await client.disconnect();\n throw error;\n }\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 {\n validateMultipleServerConfigs,\n createMCPClientWithMultipleConnections,\n} from \"../../utils/mcp-utils\";\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 { ChatMessage, ModelDefinition } from \"../../../shared/types\";\nimport { MCPClient } from \"@mastra/mcp\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\nimport { TextEncoder } from \"util\";\n\nconst chat = new Hono();\n\n// Debug logging helper\nconst DEBUG_ENABLED = process.env.MCP_DEBUG !== \"false\";\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<\n string,\n {\n resolve: (response: any) => void;\n reject: (error: any) => void;\n }\n>();\n\nchat.post(\"/\", async (c) => {\n let client: MCPClient | null = null;\n try {\n const requestData = await c.req.json();\n const {\n serverConfigs,\n model,\n apiKey,\n systemPrompt,\n messages,\n ollamaBaseUrl,\n action,\n requestId,\n response,\n }: {\n serverConfigs?: Record<string, any>;\n model?: ModelDefinition;\n apiKey?: string;\n systemPrompt?: string;\n messages?: ChatMessage[];\n ollamaBaseUrl?: string;\n action?: string;\n requestId?: string;\n response?: any;\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 // Resolve the pending elicitation with user's response\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n\n return c.json({ success: true });\n }\n\n if (!model || !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 dbg(\"Incoming chat request\", {\n provider: model?.provider,\n modelId: model?.id,\n messageCount: messages?.length,\n serverCount: serverConfigs ? Object.keys(serverConfigs).length : 0,\n });\n\n if (serverConfigs && Object.keys(serverConfigs).length > 0) {\n const validation = validateMultipleServerConfigs(serverConfigs);\n if (!validation.success) {\n dbg(\"Server config validation failed\", validation.errors || validation.error);\n return c.json(\n {\n success: false,\n error: validation.error!.message,\n details: validation.errors,\n },\n validation.error!.status as ContentfulStatusCode,\n );\n }\n\n client = createMCPClientWithMultipleConnections(validation.validConfigs!);\n dbg(\"Created MCP client with servers\", Object.keys(validation.validConfigs!));\n } else {\n client = new MCPClient({\n id: `chat-${Date.now()}`,\n servers: {},\n });\n dbg(\"Created MCP client without servers\");\n }\n\n // If we have server tools, we will request toolsets at stream-time per Mastra docs\n\n const llmModel = getLlmModel(model, apiKey, ollamaBaseUrl);\n dbg(\"LLM model initialized\", { provider: model.provider, id: model.id });\n\n // Create a custom event emitter for streaming tool events\n let toolCallId = 0;\n let streamController: ReadableStreamDefaultController | null = null;\n let encoder: TextEncoder | null = null;\n // Tracks the most recent emitted tool_call id so subsequent tool_result\n // events in the same step can be correlated with the proper call\n let lastEmittedToolCallId: number | null = null;\n\n // Set up elicitation handler\n const elicitationHandler = async (elicitationRequest: any) => {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n\n // Stream elicitation request to client\n if (streamController && encoder) {\n streamController.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n }\n dbg(\"Elicitation requested\", { requestId });\n\n // Return a promise that will be resolved when user responds\n return new Promise<{\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: { [x: string]: unknown };\n _meta?: { [x: string]: unknown };\n }>((resolve, reject) => {\n pendingElicitations.set(requestId, { resolve, reject });\n\n // Set a timeout to clean up if no response\n setTimeout(() => {\n if (pendingElicitations.has(requestId)) {\n pendingElicitations.delete(requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, 300000); // 5 minute timeout\n });\n };\n\n // Register elicitation handler with the client for all servers\n if (client.elicitation && client.elicitation.onRequest && serverConfigs) {\n // Register elicitation handler for each server\n for (const serverName of Object.keys(serverConfigs)) {\n // Normalize server name to match MCPClient's internal naming\n const normalizedName = serverName\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n client.elicitation.onRequest(normalizedName, elicitationHandler);\n dbg(\"Registered elicitation handler\", { serverName, normalizedName });\n }\n }\n\n // Wrap tools to capture tool calls and results when statically resolved\n const tools = await client.getTools();\n const originalTools = tools && Object.keys(tools).length > 0 ? tools : {};\n const wrappedTools: Record<string, any> = {};\n\n for (const [name, tool] of Object.entries(originalTools)) {\n wrappedTools[name] = {\n ...(tool as any),\n execute: async (params: any) => {\n const currentToolCallId = ++toolCallId;\n const startedAt = Date.now();\n\n // Stream tool call event immediately\n if (streamController && encoder) {\n streamController.enqueue(\n 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 dbg(\"Tool executing\", { name, currentToolCallId, params });\n\n try {\n const result = await (tool as any).execute(params);\n dbg(\"Tool result\", { name, currentToolCallId, ms: Date.now() - startedAt });\n\n // Stream tool result event immediately\n if (streamController && encoder) {\n streamController.enqueue(\n 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\", { name, currentToolCallId, error: error instanceof Error ? error.message : String(error) });\n // Stream tool error event immediately\n if (streamController && encoder) {\n streamController.enqueue(\n 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 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: Object.keys(wrappedTools).length > 0 ? wrappedTools : undefined,\n });\n\n const formattedMessages = messages.map((msg: ChatMessage) => ({\n role: msg.role,\n content: msg.content,\n }));\n\n // Start streaming; prefer dynamic toolsets so tools are resolved at call-time\n const toolsets = serverConfigs ? await client.getToolsets() : undefined;\n dbg(\"Streaming start\", {\n toolsetServers: toolsets ? Object.keys(toolsets) : [],\n messageCount: formattedMessages.length,\n });\n let streamedAnyText = false;\n const stream = await agent.stream(formattedMessages, {\n maxSteps: 10, // Allow up to 10 steps for tool usage\n toolsets,\n onStepFinish: ({ text, toolCalls, toolResults }) => {\n try {\n if (text && streamController && encoder) {\n streamedAnyText = true;\n streamController.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"text\", content: text })}\\n\\n`,\n ),\n );\n }\n\n const tcList = toolCalls as any[] | undefined;\n if (tcList && Array.isArray(tcList)) {\n for (const call of tcList) {\n const currentToolCallId = ++toolCallId;\n lastEmittedToolCallId = currentToolCallId;\n if (streamController && encoder) {\n streamController.enqueue(\n 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 const trList = toolResults as any[] | undefined;\n if (trList && Array.isArray(trList)) {\n for (const result of trList) {\n const currentToolCallId =\n lastEmittedToolCallId != null ? lastEmittedToolCallId : ++toolCallId;\n if (streamController && encoder) {\n streamController.enqueue(\n 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 } catch (err) {\n dbg(\"onStepFinish error\", err);\n }\n },\n onFinish: ({ text, finishReason }) => {\n dbg(\"onFinish called\", { finishReason, hasText: Boolean(text) });\n try {\n if (text && streamController && encoder) {\n streamedAnyText = true;\n streamController.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"text\", content: text })}\\n\\n`,\n ),\n );\n }\n } catch (err) {\n dbg(\"onFinish enqueue error\", err);\n }\n },\n });\n\n encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n streamController = controller;\n\n try {\n let hasContent = false;\n let chunkCount = 0;\n for await (const chunk of stream.textStream) {\n if (chunk && chunk.trim()) {\n hasContent = true;\n chunkCount++;\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({ type: \"text\", content: chunk })}\\n\\n`,\n ),\n );\n }\n }\n dbg(\"Streaming finished\", { hasContent, chunkCount });\n\n // If no content was streamed, send a fallback message\n if (!hasContent && !streamedAnyText) {\n dbg(\"No content from textStream/callbacks; falling back to generate()\");\n try {\n const gen = await agent.generate(formattedMessages, {\n maxSteps: 10,\n toolsets,\n });\n const finalText = gen.text || \"\";\n if (finalText) {\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({ type: \"text\", content: finalText })}\\n\\n`,\n ),\n );\n } else {\n dbg(\"generate() also returned empty text\");\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({ type: \"text\", content: \"I apologize, but I couldn't generate a response. Please try again.\" })}\\n\\n`,\n ),\n );\n }\n } catch (fallbackErr) {\n console.error(\"[mcp/chat] Fallback generate() error:\", fallbackErr);\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({ type: \"error\", error: fallbackErr instanceof Error ? fallbackErr.message : String(fallbackErr) })}\\n\\n`,\n ),\n );\n }\n }\n\n // Stream elicitation completion if there were any\n controller.enqueue(\n encoder!.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_complete\",\n })}\\n\\n`,\n ),\n );\n\n controller.enqueue(encoder!.encode(`data: [DONE]\\n\\n`));\n } catch (error) {\n console.error(\"[mcp/chat] Streaming error:\", 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 if (client) {\n try {\n await client.disconnect();\n } catch (cleanupError) {\n console.warn(\n \"[mcp/chat] Error cleaning up MCP client after streaming:\",\n cleanupError,\n );\n }\n }\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 // Clean up client on error\n if (client) {\n try {\n await client.disconnect();\n } catch (cleanupError) {\n console.warn(\"Error cleaning up MCP client after error:\", cleanupError);\n }\n }\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\nconst getLlmModel = (\n modelDefinition: ModelDefinition,\n apiKey: string,\n ollamaBaseUrl?: string,\n) => {\n if (!modelDefinition || !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 \"ollama\":\n const baseUrl = ollamaBaseUrl || \"http://localhost:11434\";\n return createOllama({\n // The provider expects the root Ollama URL; it internally targets the /api endpoints\n baseURL: `${baseUrl}`,\n })(modelDefinition.id, {\n simulateStreaming: true, // Enable streaming for Ollama models\n });\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n\nexport default chat;\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"],"mappings":"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","names":["Hono","Hono","Hono","Hono","tools","toolName","requestId","Hono","Hono","resources","Hono","Hono","prompts","Hono","MCPClient","TextEncoder","Hono","pendingElicitations","requestId","tools","Hono","Hono","Hono"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcpjam/inspector",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "MCPJam Inspector",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -11,15 +11,17 @@
|
|
|
11
11
|
"type": "git",
|
|
12
12
|
"url": "https://github.com/MCPJam/inspector.git"
|
|
13
13
|
},
|
|
14
|
-
"main": "
|
|
14
|
+
"main": "bin/start.js",
|
|
15
15
|
"bin": {
|
|
16
16
|
"inspector-vite": "bin/start.js"
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"bin",
|
|
20
|
-
"dist",
|
|
21
|
-
"
|
|
22
|
-
"package.json"
|
|
20
|
+
"dist/client",
|
|
21
|
+
"dist/server",
|
|
22
|
+
"package.json",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
23
25
|
],
|
|
24
26
|
"scripts": {
|
|
25
27
|
"dev": "concurrently \"npm run dev:server\" \"npm run dev:client\"",
|
|
@@ -65,6 +67,7 @@
|
|
|
65
67
|
"@tanstack/react-table": "^8.21.3",
|
|
66
68
|
"@uiw/react-json-view": "^2.0.0-alpha.33",
|
|
67
69
|
"ai": "^4.3.19",
|
|
70
|
+
"ajv": "^8.17.1",
|
|
68
71
|
"class-variance-authority": "^0.7.1",
|
|
69
72
|
"classnames": "^2.5.1",
|
|
70
73
|
"clsx": "^2.1.1",
|