beeai-framework 0.1.18 → 0.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/adapters/mcp/serve/http_server.cjs +5 -1
  2. package/dist/adapters/mcp/serve/http_server.cjs.map +1 -1
  3. package/dist/adapters/mcp/serve/http_server.js +5 -1
  4. package/dist/adapters/mcp/serve/http_server.js.map +1 -1
  5. package/dist/adapters/mcp/serve/server.cjs +13 -5
  6. package/dist/adapters/mcp/serve/server.cjs.map +1 -1
  7. package/dist/adapters/mcp/serve/server.d.cts +1 -1
  8. package/dist/adapters/mcp/serve/server.d.ts +1 -1
  9. package/dist/adapters/mcp/serve/server.js +13 -5
  10. package/dist/adapters/mcp/serve/server.js.map +1 -1
  11. package/dist/{agent-CmCmnEDX.d.ts → agent-CtrCeN7o.d.ts} +1 -1
  12. package/dist/{agent-Bhm6xSfI.d.cts → agent-I0Saf4A1.d.cts} +1 -1
  13. package/dist/agents/react/agent.d.cts +1 -1
  14. package/dist/agents/react/agent.d.ts +1 -1
  15. package/dist/agents/react/prompts.d.cts +1 -1
  16. package/dist/agents/react/prompts.d.ts +1 -1
  17. package/dist/agents/react/runners/base.d.cts +1 -1
  18. package/dist/agents/react/runners/base.d.ts +1 -1
  19. package/dist/agents/react/runners/deep-think/prompts.d.cts +1 -1
  20. package/dist/agents/react/runners/deep-think/prompts.d.ts +1 -1
  21. package/dist/agents/react/runners/deep-think/runner.d.cts +2 -2
  22. package/dist/agents/react/runners/deep-think/runner.d.ts +2 -2
  23. package/dist/agents/react/runners/default/runner.d.cts +2 -2
  24. package/dist/agents/react/runners/default/runner.d.ts +2 -2
  25. package/dist/agents/react/runners/granite/prompts.d.cts +1 -1
  26. package/dist/agents/react/runners/granite/prompts.d.ts +1 -1
  27. package/dist/agents/react/runners/granite/runner.d.cts +2 -2
  28. package/dist/agents/react/runners/granite/runner.d.ts +2 -2
  29. package/dist/memory/slidingMemory.d.cts +1 -1
  30. package/dist/memory/slidingMemory.d.ts +1 -1
  31. package/dist/tools/database/milvus.d.cts +2 -2
  32. package/dist/tools/database/milvus.d.ts +2 -2
  33. package/dist/version.cjs +1 -1
  34. package/dist/version.js +1 -1
  35. package/dist/workflows/agent.d.cts +37 -37
  36. package/dist/workflows/agent.d.ts +37 -37
  37. package/package.json +2 -2
@@ -118,7 +118,11 @@ function runServer(server, hostname = "127.0.0.1", port = 3e3) {
118
118
  res.status(400).send("No transport found for sessionId");
119
119
  }
120
120
  });
121
- app.listen(port, hostname, () => {
121
+ app.listen(port, hostname, (error) => {
122
+ if (error) {
123
+ logger.error(error, "Error starting server");
124
+ process.exit(1);
125
+ }
122
126
  logger.info(`Backwards compatible MCP server listening on port ${hostname}:${port}`);
123
127
  logger.debug(`
124
128
  ==============================================
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/adapters/mcp/serve/http_server.ts"],"names":["logger","Logger","root","child","name","runServer","server","hostname","port","app","express","use","json","transports","all","req","res","debug","method","sessionId","headers","transport","existingTransport","StreamableHTTPServerTransport","status","jsonrpc","error","code","message","id","isInitializeRequest","body","eventStore","InMemoryEventStore","sessionIdGenerator","randomUUID","onsessioninitialized","onclose","sid","connect","handleRequest","headersSent","get","info","SSEServerTransport","on","post","query","handlePostMessage","send","listen","process","close","exit"],"mappings":"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","file":"http_server.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Taken from: https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/examples/server/sseAndStreamableHttpCompatibleServer.ts\n\nimport express, { Request, Response } from \"express\";\nimport { SSEServerTransport } from \"@modelcontextprotocol/sdk/server/sse.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport { InMemoryEventStore } from \"./in_memory_store.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { Logger } from \"@/logger/logger.js\";\n\nconst logger = Logger.root.child({\n name: \"MCP HTTP server\",\n});\n\nexport function runServer(server: McpServer, hostname = \"127.0.0.1\", port = 3000) {\n // Create Express application\n const app = express();\n app.use(express.json());\n\n // Store transports by session ID\n const transports: Record<string, StreamableHTTPServerTransport | SSEServerTransport> = {};\n\n //=============================================================================\n // STREAMABLE HTTP TRANSPORT (PROTOCOL VERSION 2025-03-26)\n //=============================================================================\n\n // Handle all MCP Streamable HTTP requests (GET, POST, DELETE) on a single endpoint\n app.all(\"/mcp\", async (req: Request, res: Response) => {\n logger.debug(`Received ${req.method} request to /mcp`);\n\n try {\n // Check for existing session ID\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n let transport: StreamableHTTPServerTransport;\n\n if (sessionId && transports[sessionId]) {\n // Check if the transport is of the correct type\n const existingTransport = transports[sessionId];\n if (existingTransport instanceof StreamableHTTPServerTransport) {\n // Reuse existing transport\n transport = existingTransport;\n } else {\n // Transport exists but is not a StreamableHTTPServerTransport (could be SSEServerTransport)\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Session exists but uses a different transport protocol\",\n },\n id: null,\n });\n return;\n }\n } else if (!sessionId && req.method === \"POST\" && isInitializeRequest(req.body)) {\n const eventStore = new InMemoryEventStore();\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n eventStore, // Enable resumability\n onsessioninitialized: (sessionId) => {\n // Store the transport by session ID when session is initialized\n logger.debug(`StreamableHTTP session initialized with ID: ${sessionId}`);\n transports[sessionId] = transport;\n },\n });\n\n // Set up onclose handler to clean up transport when closed\n transport.onclose = () => {\n const sid = transport.sessionId;\n if (sid && transports[sid]) {\n logger.debug(`Transport closed for session ${sid}, removing from transports map`);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[sid];\n }\n };\n\n // Connect the transport to the MCP server\n await server.connect(transport);\n } else {\n // Invalid request - no session ID or not initialization request\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: No valid session ID provided\",\n },\n id: null,\n });\n return;\n }\n\n // Handle the request with the transport\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n logger.error(\"Error handling MCP request:\", error);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32603,\n message: \"Internal server error\",\n },\n id: null,\n });\n }\n }\n });\n\n //=============================================================================\n // DEPRECATED HTTP+SSE TRANSPORT (PROTOCOL VERSION 2024-11-05)\n //=============================================================================\n\n app.get(\"/sse\", async (req: Request, res: Response) => {\n logger.info(\"Received GET request to /sse (deprecated SSE transport)\");\n const transport = new SSEServerTransport(\"/messages\", res);\n transports[transport.sessionId] = transport;\n res.on(\"close\", () => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[transport.sessionId];\n });\n await server.connect(transport);\n });\n\n app.post(\"/messages\", async (req: Request, res: Response) => {\n const sessionId = req.query.sessionId as string;\n let transport: SSEServerTransport;\n const existingTransport = transports[sessionId];\n if (existingTransport instanceof SSEServerTransport) {\n // Reuse existing transport\n transport = existingTransport;\n } else {\n // Transport exists but is not a SSEServerTransport (could be StreamableHTTPServerTransport)\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Session exists but uses a different transport protocol\",\n },\n id: null,\n });\n return;\n }\n if (transport) {\n await transport.handlePostMessage(req, res, req.body);\n } else {\n res.status(400).send(\"No transport found for sessionId\");\n }\n });\n\n // Start the server\n app.listen(port, hostname, () => {\n logger.info(`Backwards compatible MCP server listening on port ${hostname}:${port}`);\n logger.debug(`\n ==============================================\n SUPPORTED TRANSPORT OPTIONS:\n\n 1. Streamable Http(Protocol version: 2025-03-26)\n Endpoint: /mcp\n Methods: GET, POST, DELETE\n Usage: \n - Initialize with POST to /mcp\n - Establish SSE stream with GET to /mcp\n - Send requests with POST to /mcp\n - Terminate session with DELETE to /mcp\n\n 2. Http + SSE (Protocol version: 2024-11-05)\n Endpoints: /sse (GET) and /messages (POST)\n Usage:\n - Establish SSE stream with GET to /sse\n - Send requests with POST to /messages?sessionId=<id>\n ==============================================\n `);\n });\n\n // Handle server shutdown\n process.on(\"SIGINT\", async () => {\n logger.info(\"Shutting down server...\");\n\n // Close all active transports to properly clean up resources\n for (const sessionId in transports) {\n try {\n logger.debug(`Closing transport for session ${sessionId}`);\n await transports[sessionId].close();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[sessionId];\n } catch (error) {\n logger.error(`Error closing transport for session ${sessionId}:`, error);\n }\n }\n logger.debug(\"Server shutdown complete\");\n process.exit(0);\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/adapters/mcp/serve/http_server.ts"],"names":["logger","Logger","root","child","name","runServer","server","hostname","port","app","express","use","json","transports","all","req","res","debug","method","sessionId","headers","transport","existingTransport","StreamableHTTPServerTransport","status","jsonrpc","error","code","message","id","isInitializeRequest","body","eventStore","InMemoryEventStore","sessionIdGenerator","randomUUID","onsessioninitialized","onclose","sid","connect","handleRequest","headersSent","get","info","SSEServerTransport","on","post","query","handlePostMessage","send","listen","process","exit","close"],"mappings":"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","file":"http_server.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Taken from: https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/examples/server/sseAndStreamableHttpCompatibleServer.ts\n\nimport express, { Request, Response } from \"express\";\nimport { SSEServerTransport } from \"@modelcontextprotocol/sdk/server/sse.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport { InMemoryEventStore } from \"./in_memory_store.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { Logger } from \"@/logger/logger.js\";\n\nconst logger = Logger.root.child({\n name: \"MCP HTTP server\",\n});\n\nexport function runServer(server: McpServer, hostname = \"127.0.0.1\", port = 3000) {\n // Create Express application\n const app = express();\n app.use(express.json());\n\n // Store transports by session ID\n const transports: Record<string, StreamableHTTPServerTransport | SSEServerTransport> = {};\n\n //=============================================================================\n // STREAMABLE HTTP TRANSPORT (PROTOCOL VERSION 2025-03-26)\n //=============================================================================\n\n // Handle all MCP Streamable HTTP requests (GET, POST, DELETE) on a single endpoint\n app.all(\"/mcp\", async (req: Request, res: Response) => {\n logger.debug(`Received ${req.method} request to /mcp`);\n\n try {\n // Check for existing session ID\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n let transport: StreamableHTTPServerTransport;\n\n if (sessionId && transports[sessionId]) {\n // Check if the transport is of the correct type\n const existingTransport = transports[sessionId];\n if (existingTransport instanceof StreamableHTTPServerTransport) {\n // Reuse existing transport\n transport = existingTransport;\n } else {\n // Transport exists but is not a StreamableHTTPServerTransport (could be SSEServerTransport)\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Session exists but uses a different transport protocol\",\n },\n id: null,\n });\n return;\n }\n } else if (!sessionId && req.method === \"POST\" && isInitializeRequest(req.body)) {\n const eventStore = new InMemoryEventStore();\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n eventStore, // Enable resumability\n onsessioninitialized: (sessionId) => {\n // Store the transport by session ID when session is initialized\n logger.debug(`StreamableHTTP session initialized with ID: ${sessionId}`);\n transports[sessionId] = transport;\n },\n });\n\n // Set up onclose handler to clean up transport when closed\n transport.onclose = () => {\n const sid = transport.sessionId;\n if (sid && transports[sid]) {\n logger.debug(`Transport closed for session ${sid}, removing from transports map`);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[sid];\n }\n };\n\n // Connect the transport to the MCP server\n await server.connect(transport);\n } else {\n // Invalid request - no session ID or not initialization request\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: No valid session ID provided\",\n },\n id: null,\n });\n return;\n }\n\n // Handle the request with the transport\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n logger.error(\"Error handling MCP request:\", error);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32603,\n message: \"Internal server error\",\n },\n id: null,\n });\n }\n }\n });\n\n //=============================================================================\n // DEPRECATED HTTP+SSE TRANSPORT (PROTOCOL VERSION 2024-11-05)\n //=============================================================================\n\n app.get(\"/sse\", async (req: Request, res: Response) => {\n logger.info(\"Received GET request to /sse (deprecated SSE transport)\");\n const transport = new SSEServerTransport(\"/messages\", res);\n transports[transport.sessionId] = transport;\n res.on(\"close\", () => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[transport.sessionId];\n });\n await server.connect(transport);\n });\n\n app.post(\"/messages\", async (req: Request, res: Response) => {\n const sessionId = req.query.sessionId as string;\n let transport: SSEServerTransport;\n const existingTransport = transports[sessionId];\n if (existingTransport instanceof SSEServerTransport) {\n // Reuse existing transport\n transport = existingTransport;\n } else {\n // Transport exists but is not a SSEServerTransport (could be StreamableHTTPServerTransport)\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Session exists but uses a different transport protocol\",\n },\n id: null,\n });\n return;\n }\n if (transport) {\n await transport.handlePostMessage(req, res, req.body);\n } else {\n res.status(400).send(\"No transport found for sessionId\");\n }\n });\n\n // Start the server\n app.listen(port, hostname, (error) => {\n if (error) {\n logger.error(error, \"Error starting server\");\n process.exit(1);\n }\n logger.info(`Backwards compatible MCP server listening on port ${hostname}:${port}`);\n logger.debug(`\n ==============================================\n SUPPORTED TRANSPORT OPTIONS:\n\n 1. Streamable Http(Protocol version: 2025-03-26)\n Endpoint: /mcp\n Methods: GET, POST, DELETE\n Usage: \n - Initialize with POST to /mcp\n - Establish SSE stream with GET to /mcp\n - Send requests with POST to /mcp\n - Terminate session with DELETE to /mcp\n\n 2. Http + SSE (Protocol version: 2024-11-05)\n Endpoints: /sse (GET) and /messages (POST)\n Usage:\n - Establish SSE stream with GET to /sse\n - Send requests with POST to /messages?sessionId=<id>\n ==============================================\n `);\n });\n\n // Handle server shutdown\n process.on(\"SIGINT\", async () => {\n logger.info(\"Shutting down server...\");\n\n // Close all active transports to properly clean up resources\n for (const sessionId in transports) {\n try {\n logger.debug(`Closing transport for session ${sessionId}`);\n await transports[sessionId].close();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[sessionId];\n } catch (error) {\n logger.error(`Error closing transport for session ${sessionId}:`, error);\n }\n }\n logger.debug(\"Server shutdown complete\");\n process.exit(0);\n });\n}\n"]}
@@ -112,7 +112,11 @@ function runServer(server, hostname = "127.0.0.1", port = 3e3) {
112
112
  res.status(400).send("No transport found for sessionId");
113
113
  }
114
114
  });
115
- app.listen(port, hostname, () => {
115
+ app.listen(port, hostname, (error) => {
116
+ if (error) {
117
+ logger.error(error, "Error starting server");
118
+ process.exit(1);
119
+ }
116
120
  logger.info(`Backwards compatible MCP server listening on port ${hostname}:${port}`);
117
121
  logger.debug(`
118
122
  ==============================================
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/adapters/mcp/serve/http_server.ts"],"names":["logger","Logger","root","child","name","runServer","server","hostname","port","app","express","use","json","transports","all","req","res","debug","method","sessionId","headers","transport","existingTransport","StreamableHTTPServerTransport","status","jsonrpc","error","code","message","id","isInitializeRequest","body","eventStore","InMemoryEventStore","sessionIdGenerator","randomUUID","onsessioninitialized","onclose","sid","connect","handleRequest","headersSent","get","info","SSEServerTransport","on","post","query","handlePostMessage","send","listen","process","close","exit"],"mappings":"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","file":"http_server.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Taken from: https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/examples/server/sseAndStreamableHttpCompatibleServer.ts\n\nimport express, { Request, Response } from \"express\";\nimport { SSEServerTransport } from \"@modelcontextprotocol/sdk/server/sse.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport { InMemoryEventStore } from \"./in_memory_store.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { Logger } from \"@/logger/logger.js\";\n\nconst logger = Logger.root.child({\n name: \"MCP HTTP server\",\n});\n\nexport function runServer(server: McpServer, hostname = \"127.0.0.1\", port = 3000) {\n // Create Express application\n const app = express();\n app.use(express.json());\n\n // Store transports by session ID\n const transports: Record<string, StreamableHTTPServerTransport | SSEServerTransport> = {};\n\n //=============================================================================\n // STREAMABLE HTTP TRANSPORT (PROTOCOL VERSION 2025-03-26)\n //=============================================================================\n\n // Handle all MCP Streamable HTTP requests (GET, POST, DELETE) on a single endpoint\n app.all(\"/mcp\", async (req: Request, res: Response) => {\n logger.debug(`Received ${req.method} request to /mcp`);\n\n try {\n // Check for existing session ID\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n let transport: StreamableHTTPServerTransport;\n\n if (sessionId && transports[sessionId]) {\n // Check if the transport is of the correct type\n const existingTransport = transports[sessionId];\n if (existingTransport instanceof StreamableHTTPServerTransport) {\n // Reuse existing transport\n transport = existingTransport;\n } else {\n // Transport exists but is not a StreamableHTTPServerTransport (could be SSEServerTransport)\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Session exists but uses a different transport protocol\",\n },\n id: null,\n });\n return;\n }\n } else if (!sessionId && req.method === \"POST\" && isInitializeRequest(req.body)) {\n const eventStore = new InMemoryEventStore();\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n eventStore, // Enable resumability\n onsessioninitialized: (sessionId) => {\n // Store the transport by session ID when session is initialized\n logger.debug(`StreamableHTTP session initialized with ID: ${sessionId}`);\n transports[sessionId] = transport;\n },\n });\n\n // Set up onclose handler to clean up transport when closed\n transport.onclose = () => {\n const sid = transport.sessionId;\n if (sid && transports[sid]) {\n logger.debug(`Transport closed for session ${sid}, removing from transports map`);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[sid];\n }\n };\n\n // Connect the transport to the MCP server\n await server.connect(transport);\n } else {\n // Invalid request - no session ID or not initialization request\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: No valid session ID provided\",\n },\n id: null,\n });\n return;\n }\n\n // Handle the request with the transport\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n logger.error(\"Error handling MCP request:\", error);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32603,\n message: \"Internal server error\",\n },\n id: null,\n });\n }\n }\n });\n\n //=============================================================================\n // DEPRECATED HTTP+SSE TRANSPORT (PROTOCOL VERSION 2024-11-05)\n //=============================================================================\n\n app.get(\"/sse\", async (req: Request, res: Response) => {\n logger.info(\"Received GET request to /sse (deprecated SSE transport)\");\n const transport = new SSEServerTransport(\"/messages\", res);\n transports[transport.sessionId] = transport;\n res.on(\"close\", () => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[transport.sessionId];\n });\n await server.connect(transport);\n });\n\n app.post(\"/messages\", async (req: Request, res: Response) => {\n const sessionId = req.query.sessionId as string;\n let transport: SSEServerTransport;\n const existingTransport = transports[sessionId];\n if (existingTransport instanceof SSEServerTransport) {\n // Reuse existing transport\n transport = existingTransport;\n } else {\n // Transport exists but is not a SSEServerTransport (could be StreamableHTTPServerTransport)\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Session exists but uses a different transport protocol\",\n },\n id: null,\n });\n return;\n }\n if (transport) {\n await transport.handlePostMessage(req, res, req.body);\n } else {\n res.status(400).send(\"No transport found for sessionId\");\n }\n });\n\n // Start the server\n app.listen(port, hostname, () => {\n logger.info(`Backwards compatible MCP server listening on port ${hostname}:${port}`);\n logger.debug(`\n ==============================================\n SUPPORTED TRANSPORT OPTIONS:\n\n 1. Streamable Http(Protocol version: 2025-03-26)\n Endpoint: /mcp\n Methods: GET, POST, DELETE\n Usage: \n - Initialize with POST to /mcp\n - Establish SSE stream with GET to /mcp\n - Send requests with POST to /mcp\n - Terminate session with DELETE to /mcp\n\n 2. Http + SSE (Protocol version: 2024-11-05)\n Endpoints: /sse (GET) and /messages (POST)\n Usage:\n - Establish SSE stream with GET to /sse\n - Send requests with POST to /messages?sessionId=<id>\n ==============================================\n `);\n });\n\n // Handle server shutdown\n process.on(\"SIGINT\", async () => {\n logger.info(\"Shutting down server...\");\n\n // Close all active transports to properly clean up resources\n for (const sessionId in transports) {\n try {\n logger.debug(`Closing transport for session ${sessionId}`);\n await transports[sessionId].close();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[sessionId];\n } catch (error) {\n logger.error(`Error closing transport for session ${sessionId}:`, error);\n }\n }\n logger.debug(\"Server shutdown complete\");\n process.exit(0);\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/adapters/mcp/serve/http_server.ts"],"names":["logger","Logger","root","child","name","runServer","server","hostname","port","app","express","use","json","transports","all","req","res","debug","method","sessionId","headers","transport","existingTransport","StreamableHTTPServerTransport","status","jsonrpc","error","code","message","id","isInitializeRequest","body","eventStore","InMemoryEventStore","sessionIdGenerator","randomUUID","onsessioninitialized","onclose","sid","connect","handleRequest","headersSent","get","info","SSEServerTransport","on","post","query","handlePostMessage","send","listen","process","exit","close"],"mappings":"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","file":"http_server.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Taken from: https://github.com/modelcontextprotocol/typescript-sdk/blob/main/src/examples/server/sseAndStreamableHttpCompatibleServer.ts\n\nimport express, { Request, Response } from \"express\";\nimport { SSEServerTransport } from \"@modelcontextprotocol/sdk/server/sse.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport { InMemoryEventStore } from \"./in_memory_store.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { Logger } from \"@/logger/logger.js\";\n\nconst logger = Logger.root.child({\n name: \"MCP HTTP server\",\n});\n\nexport function runServer(server: McpServer, hostname = \"127.0.0.1\", port = 3000) {\n // Create Express application\n const app = express();\n app.use(express.json());\n\n // Store transports by session ID\n const transports: Record<string, StreamableHTTPServerTransport | SSEServerTransport> = {};\n\n //=============================================================================\n // STREAMABLE HTTP TRANSPORT (PROTOCOL VERSION 2025-03-26)\n //=============================================================================\n\n // Handle all MCP Streamable HTTP requests (GET, POST, DELETE) on a single endpoint\n app.all(\"/mcp\", async (req: Request, res: Response) => {\n logger.debug(`Received ${req.method} request to /mcp`);\n\n try {\n // Check for existing session ID\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n let transport: StreamableHTTPServerTransport;\n\n if (sessionId && transports[sessionId]) {\n // Check if the transport is of the correct type\n const existingTransport = transports[sessionId];\n if (existingTransport instanceof StreamableHTTPServerTransport) {\n // Reuse existing transport\n transport = existingTransport;\n } else {\n // Transport exists but is not a StreamableHTTPServerTransport (could be SSEServerTransport)\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Session exists but uses a different transport protocol\",\n },\n id: null,\n });\n return;\n }\n } else if (!sessionId && req.method === \"POST\" && isInitializeRequest(req.body)) {\n const eventStore = new InMemoryEventStore();\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n eventStore, // Enable resumability\n onsessioninitialized: (sessionId) => {\n // Store the transport by session ID when session is initialized\n logger.debug(`StreamableHTTP session initialized with ID: ${sessionId}`);\n transports[sessionId] = transport;\n },\n });\n\n // Set up onclose handler to clean up transport when closed\n transport.onclose = () => {\n const sid = transport.sessionId;\n if (sid && transports[sid]) {\n logger.debug(`Transport closed for session ${sid}, removing from transports map`);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[sid];\n }\n };\n\n // Connect the transport to the MCP server\n await server.connect(transport);\n } else {\n // Invalid request - no session ID or not initialization request\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: No valid session ID provided\",\n },\n id: null,\n });\n return;\n }\n\n // Handle the request with the transport\n await transport.handleRequest(req, res, req.body);\n } catch (error) {\n logger.error(\"Error handling MCP request:\", error);\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32603,\n message: \"Internal server error\",\n },\n id: null,\n });\n }\n }\n });\n\n //=============================================================================\n // DEPRECATED HTTP+SSE TRANSPORT (PROTOCOL VERSION 2024-11-05)\n //=============================================================================\n\n app.get(\"/sse\", async (req: Request, res: Response) => {\n logger.info(\"Received GET request to /sse (deprecated SSE transport)\");\n const transport = new SSEServerTransport(\"/messages\", res);\n transports[transport.sessionId] = transport;\n res.on(\"close\", () => {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[transport.sessionId];\n });\n await server.connect(transport);\n });\n\n app.post(\"/messages\", async (req: Request, res: Response) => {\n const sessionId = req.query.sessionId as string;\n let transport: SSEServerTransport;\n const existingTransport = transports[sessionId];\n if (existingTransport instanceof SSEServerTransport) {\n // Reuse existing transport\n transport = existingTransport;\n } else {\n // Transport exists but is not a SSEServerTransport (could be StreamableHTTPServerTransport)\n res.status(400).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Session exists but uses a different transport protocol\",\n },\n id: null,\n });\n return;\n }\n if (transport) {\n await transport.handlePostMessage(req, res, req.body);\n } else {\n res.status(400).send(\"No transport found for sessionId\");\n }\n });\n\n // Start the server\n app.listen(port, hostname, (error) => {\n if (error) {\n logger.error(error, \"Error starting server\");\n process.exit(1);\n }\n logger.info(`Backwards compatible MCP server listening on port ${hostname}:${port}`);\n logger.debug(`\n ==============================================\n SUPPORTED TRANSPORT OPTIONS:\n\n 1. Streamable Http(Protocol version: 2025-03-26)\n Endpoint: /mcp\n Methods: GET, POST, DELETE\n Usage: \n - Initialize with POST to /mcp\n - Establish SSE stream with GET to /mcp\n - Send requests with POST to /mcp\n - Terminate session with DELETE to /mcp\n\n 2. Http + SSE (Protocol version: 2024-11-05)\n Endpoints: /sse (GET) and /messages (POST)\n Usage:\n - Establish SSE stream with GET to /sse\n - Send requests with POST to /messages?sessionId=<id>\n ==============================================\n `);\n });\n\n // Handle server shutdown\n process.on(\"SIGINT\", async () => {\n logger.info(\"Shutting down server...\");\n\n // Close all active transports to properly clean up resources\n for (const sessionId in transports) {\n try {\n logger.debug(`Closing transport for session ${sessionId}`);\n await transports[sessionId].close();\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete transports[sessionId];\n } catch (error) {\n logger.error(`Error closing transport for session ${sessionId}:`, error);\n }\n }\n logger.debug(\"Server shutdown complete\");\n process.exit(0);\n });\n}\n"]}
@@ -16,7 +16,7 @@ class MCPServerConfig {
16
16
  }
17
17
  transport = "stdio";
18
18
  hostname = "127.0.0.1";
19
- port = 3e3;
19
+ port = 8e3;
20
20
  name = "MCP Server";
21
21
  version = "1.0.0";
22
22
  settings;
@@ -65,10 +65,18 @@ class MCPServer extends server_cjs.Server {
65
65
  throw new errors_cjs.ValueError("Input type is not supported by this server.");
66
66
  }
67
67
  }
68
- if (this.config.transport === "sse") {
69
- http_server_cjs.runServer(this.server, this.config.hostname, this.config.port);
70
- } else {
71
- await this.server.connect(new stdio_js.StdioServerTransport());
68
+ switch (this.config.transport) {
69
+ case "stdio":
70
+ await this.server.connect(new stdio_js.StdioServerTransport());
71
+ break;
72
+ case "sse":
73
+ case "streamable-http":
74
+ http_server_cjs.runServer(this.server, this.config.hostname, this.config.port);
75
+ break;
76
+ default: {
77
+ this.config.transport;
78
+ throw new Error("Unsupported transport type.");
79
+ }
72
80
  }
73
81
  }
74
82
  getFactory(member) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/adapters/mcp/serve/server.ts"],"names":["MCPServerConfig","transport","hostname","port","name","version","settings","partial","Object","assign","MCPServer","Server","server","config","McpServer","serve","member","members","factory","getFactory","entry","type","tool","description","paramsSchema","callback","prompt","argsSchema","resource","uri","template","ValueError","runServer","connect","StdioServerTransport","factories","has","Tool","get","toolFactory","schema","inputSchema","ZodType","shape","args","result","run","content","text","getTextContent","registerFactory"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ValueError } from \"@/errors.js\";\nimport { Server } from \"@/serve/server.js\";\nimport { ServerOptions } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n McpServer,\n PromptCallback,\n ReadResourceCallback,\n ReadResourceTemplateCallback,\n ResourceTemplate,\n ToolCallback,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { AnyTool, Tool } from \"@/tools/base.js\";\nimport { runServer } from \"./http_server.js\";\nimport { ZodRawShape, ZodType } from \"zod\";\nimport { ToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\n\ntype MCPServerPrompt =\n | {\n type: \"prompt\";\n name: string;\n description: string;\n callback: PromptCallback;\n }\n | {\n type: \"prompt\";\n name: string;\n description: string;\n argsSchema: ZodRawShape;\n callback: PromptCallback<ZodRawShape>;\n };\n\ntype MCPServerResource =\n | {\n type: \"resource\";\n name: string;\n uri: string;\n callback: ReadResourceCallback;\n }\n | {\n type: \"resource\";\n name: string;\n template: ResourceTemplate;\n callback: ReadResourceTemplateCallback;\n };\n\ninterface MCPServerTool {\n type: \"tool\";\n name: string;\n description: string;\n paramsSchema: ZodRawShape | ToolAnnotations;\n callback: ToolCallback<ZodRawShape>;\n}\n\ntype MCPServerEntry = MCPServerPrompt | MCPServerResource | MCPServerTool;\n\n// Configuration for the MCPServer.\nexport class MCPServerConfig {\n transport: \"stdio\" | \"sse\" = \"stdio\";\n hostname = \"127.0.0.1\";\n port = 3000;\n name = \"MCP Server\";\n version = \"1.0.0\";\n settings?: ServerOptions;\n\n constructor(partial?: Partial<MCPServerConfig>) {\n if (partial) {\n Object.assign(this, partial);\n }\n }\n}\n\nexport class MCPServer extends Server<any, MCPServerEntry, MCPServerConfig, never> {\n protected server: McpServer;\n\n constructor(config?: MCPServerConfig) {\n super(config || new MCPServerConfig());\n this.server = new McpServer({\n name: this.config.name,\n version: this.config.version,\n ...this.config.settings,\n });\n }\n\n async serve() {\n for (const member of this.members) {\n const factory = this.getFactory(member);\n const entry = await factory(member);\n\n switch (entry.type) {\n case \"tool\":\n this.server.tool(entry.name, entry.description, entry.paramsSchema, entry.callback);\n break;\n case \"prompt\":\n if (\"argsSchema\" in entry) {\n this.server.prompt(entry.name, entry.description, entry.argsSchema, entry.callback);\n } else {\n this.server.prompt(entry.name, entry.description, entry.callback);\n }\n break;\n case \"resource\":\n if (\"uri\" in entry) {\n this.server.resource(entry.name, entry.uri, entry.callback);\n } else {\n this.server.resource(entry.name, entry.template, entry.callback);\n }\n break;\n default:\n throw new ValueError(\"Input type is not supported by this server.\");\n }\n }\n\n if (this.config.transport === \"sse\") {\n runServer(this.server, this.config.hostname, this.config.port);\n } else {\n await this.server.connect(new StdioServerTransport());\n }\n }\n\n getFactory(member: any) {\n const factories = (this.constructor as typeof Server).factories;\n return !factories.has(member.constructor) && member instanceof Tool && factories.has(Tool)\n ? factories.get(Tool)!\n : super.getFactory(member);\n }\n}\n\nasync function toolFactory(tool: AnyTool): Promise<MCPServerEntry> {\n const schema = await tool.inputSchema();\n if (!(schema instanceof ZodType)) {\n throw new ValueError(\"JsonSchema is not supported for MCP tools.\");\n }\n const paramsSchema = schema.shape;\n return {\n type: \"tool\",\n name: tool.name,\n description: tool.description,\n paramsSchema: paramsSchema,\n callback: async (...args: Parameters<typeof tool.run>) => {\n const result = await tool.run(...args);\n return {\n content: [\n {\n type: \"text\",\n text: result.getTextContent(),\n },\n ],\n };\n },\n };\n}\n\nMCPServer.registerFactory(Tool, toolFactory);\n"]}
1
+ {"version":3,"sources":["../../../../src/adapters/mcp/serve/server.ts"],"names":["MCPServerConfig","transport","hostname","port","name","version","settings","partial","Object","assign","MCPServer","Server","server","config","McpServer","serve","member","members","factory","getFactory","entry","type","tool","description","paramsSchema","callback","prompt","argsSchema","resource","uri","template","ValueError","connect","StdioServerTransport","runServer","Error","factories","has","Tool","get","toolFactory","schema","inputSchema","ZodType","shape","args","result","run","content","text","getTextContent","registerFactory"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ValueError } from \"@/errors.js\";\nimport { Server } from \"@/serve/server.js\";\nimport { ServerOptions } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n McpServer,\n PromptCallback,\n ReadResourceCallback,\n ReadResourceTemplateCallback,\n ResourceTemplate,\n ToolCallback,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { AnyTool, Tool } from \"@/tools/base.js\";\nimport { runServer } from \"./http_server.js\";\nimport { ZodRawShape, ZodType } from \"zod\";\nimport { ToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\n\ntype MCPServerPrompt =\n | {\n type: \"prompt\";\n name: string;\n description: string;\n callback: PromptCallback;\n }\n | {\n type: \"prompt\";\n name: string;\n description: string;\n argsSchema: ZodRawShape;\n callback: PromptCallback<ZodRawShape>;\n };\n\ntype MCPServerResource =\n | {\n type: \"resource\";\n name: string;\n uri: string;\n callback: ReadResourceCallback;\n }\n | {\n type: \"resource\";\n name: string;\n template: ResourceTemplate;\n callback: ReadResourceTemplateCallback;\n };\n\ninterface MCPServerTool {\n type: \"tool\";\n name: string;\n description: string;\n paramsSchema: ZodRawShape | ToolAnnotations;\n callback: ToolCallback<ZodRawShape>;\n}\n\ntype MCPServerEntry = MCPServerPrompt | MCPServerResource | MCPServerTool;\n\n// Configuration for the MCPServer.\nexport class MCPServerConfig {\n transport: \"stdio\" | \"sse\" | \"streamable-http\" = \"stdio\";\n hostname = \"127.0.0.1\";\n port = 8000;\n name = \"MCP Server\";\n version = \"1.0.0\";\n settings?: ServerOptions;\n\n constructor(partial?: Partial<MCPServerConfig>) {\n if (partial) {\n Object.assign(this, partial);\n }\n }\n}\n\nexport class MCPServer extends Server<any, MCPServerEntry, MCPServerConfig, never> {\n protected server: McpServer;\n\n constructor(config?: MCPServerConfig) {\n super(config || new MCPServerConfig());\n this.server = new McpServer({\n name: this.config.name,\n version: this.config.version,\n ...this.config.settings,\n });\n }\n\n async serve() {\n for (const member of this.members) {\n const factory = this.getFactory(member);\n const entry = await factory(member);\n\n switch (entry.type) {\n case \"tool\":\n this.server.tool(entry.name, entry.description, entry.paramsSchema, entry.callback);\n break;\n case \"prompt\":\n if (\"argsSchema\" in entry) {\n this.server.prompt(entry.name, entry.description, entry.argsSchema, entry.callback);\n } else {\n this.server.prompt(entry.name, entry.description, entry.callback);\n }\n break;\n case \"resource\":\n if (\"uri\" in entry) {\n this.server.resource(entry.name, entry.uri, entry.callback);\n } else {\n this.server.resource(entry.name, entry.template, entry.callback);\n }\n break;\n default:\n throw new ValueError(\"Input type is not supported by this server.\");\n }\n }\n\n switch (this.config.transport) {\n case \"stdio\":\n await this.server.connect(new StdioServerTransport());\n break;\n case \"sse\":\n case \"streamable-http\":\n runServer(this.server, this.config.hostname, this.config.port);\n break;\n default: {\n // The following line ensures exhaustiveness checking at compile time.\n const _exhaustiveCheck: never = this.config.transport;\n throw new Error(\"Unsupported transport type.\");\n }\n }\n }\n\n getFactory(member: any) {\n const factories = (this.constructor as typeof Server).factories;\n return !factories.has(member.constructor) && member instanceof Tool && factories.has(Tool)\n ? factories.get(Tool)!\n : super.getFactory(member);\n }\n}\n\nasync function toolFactory(tool: AnyTool): Promise<MCPServerEntry> {\n const schema = await tool.inputSchema();\n if (!(schema instanceof ZodType)) {\n throw new ValueError(\"JsonSchema is not supported for MCP tools.\");\n }\n const paramsSchema = schema.shape;\n return {\n type: \"tool\",\n name: tool.name,\n description: tool.description,\n paramsSchema: paramsSchema,\n callback: async (...args: Parameters<typeof tool.run>) => {\n const result = await tool.run(...args);\n return {\n content: [\n {\n type: \"text\",\n text: result.getTextContent(),\n },\n ],\n };\n },\n };\n}\n\nMCPServer.registerFactory(Tool, toolFactory);\n"]}
@@ -41,7 +41,7 @@ interface MCPServerTool {
41
41
  }
42
42
  type MCPServerEntry = MCPServerPrompt | MCPServerResource | MCPServerTool;
43
43
  declare class MCPServerConfig {
44
- transport: "stdio" | "sse";
44
+ transport: "stdio" | "sse" | "streamable-http";
45
45
  hostname: string;
46
46
  port: number;
47
47
  name: string;
@@ -41,7 +41,7 @@ interface MCPServerTool {
41
41
  }
42
42
  type MCPServerEntry = MCPServerPrompt | MCPServerResource | MCPServerTool;
43
43
  declare class MCPServerConfig {
44
- transport: "stdio" | "sse";
44
+ transport: "stdio" | "sse" | "streamable-http";
45
45
  hostname: string;
46
46
  port: number;
47
47
  name: string;
@@ -14,7 +14,7 @@ class MCPServerConfig {
14
14
  }
15
15
  transport = "stdio";
16
16
  hostname = "127.0.0.1";
17
- port = 3e3;
17
+ port = 8e3;
18
18
  name = "MCP Server";
19
19
  version = "1.0.0";
20
20
  settings;
@@ -63,10 +63,18 @@ class MCPServer extends Server {
63
63
  throw new ValueError("Input type is not supported by this server.");
64
64
  }
65
65
  }
66
- if (this.config.transport === "sse") {
67
- runServer(this.server, this.config.hostname, this.config.port);
68
- } else {
69
- await this.server.connect(new StdioServerTransport());
66
+ switch (this.config.transport) {
67
+ case "stdio":
68
+ await this.server.connect(new StdioServerTransport());
69
+ break;
70
+ case "sse":
71
+ case "streamable-http":
72
+ runServer(this.server, this.config.hostname, this.config.port);
73
+ break;
74
+ default: {
75
+ this.config.transport;
76
+ throw new Error("Unsupported transport type.");
77
+ }
70
78
  }
71
79
  }
72
80
  getFactory(member) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/adapters/mcp/serve/server.ts"],"names":["MCPServerConfig","transport","hostname","port","name","version","settings","partial","Object","assign","MCPServer","Server","server","config","McpServer","serve","member","members","factory","getFactory","entry","type","tool","description","paramsSchema","callback","prompt","argsSchema","resource","uri","template","ValueError","runServer","connect","StdioServerTransport","factories","has","Tool","get","toolFactory","schema","inputSchema","ZodType","shape","args","result","run","content","text","getTextContent","registerFactory"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ValueError } from \"@/errors.js\";\nimport { Server } from \"@/serve/server.js\";\nimport { ServerOptions } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n McpServer,\n PromptCallback,\n ReadResourceCallback,\n ReadResourceTemplateCallback,\n ResourceTemplate,\n ToolCallback,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { AnyTool, Tool } from \"@/tools/base.js\";\nimport { runServer } from \"./http_server.js\";\nimport { ZodRawShape, ZodType } from \"zod\";\nimport { ToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\n\ntype MCPServerPrompt =\n | {\n type: \"prompt\";\n name: string;\n description: string;\n callback: PromptCallback;\n }\n | {\n type: \"prompt\";\n name: string;\n description: string;\n argsSchema: ZodRawShape;\n callback: PromptCallback<ZodRawShape>;\n };\n\ntype MCPServerResource =\n | {\n type: \"resource\";\n name: string;\n uri: string;\n callback: ReadResourceCallback;\n }\n | {\n type: \"resource\";\n name: string;\n template: ResourceTemplate;\n callback: ReadResourceTemplateCallback;\n };\n\ninterface MCPServerTool {\n type: \"tool\";\n name: string;\n description: string;\n paramsSchema: ZodRawShape | ToolAnnotations;\n callback: ToolCallback<ZodRawShape>;\n}\n\ntype MCPServerEntry = MCPServerPrompt | MCPServerResource | MCPServerTool;\n\n// Configuration for the MCPServer.\nexport class MCPServerConfig {\n transport: \"stdio\" | \"sse\" = \"stdio\";\n hostname = \"127.0.0.1\";\n port = 3000;\n name = \"MCP Server\";\n version = \"1.0.0\";\n settings?: ServerOptions;\n\n constructor(partial?: Partial<MCPServerConfig>) {\n if (partial) {\n Object.assign(this, partial);\n }\n }\n}\n\nexport class MCPServer extends Server<any, MCPServerEntry, MCPServerConfig, never> {\n protected server: McpServer;\n\n constructor(config?: MCPServerConfig) {\n super(config || new MCPServerConfig());\n this.server = new McpServer({\n name: this.config.name,\n version: this.config.version,\n ...this.config.settings,\n });\n }\n\n async serve() {\n for (const member of this.members) {\n const factory = this.getFactory(member);\n const entry = await factory(member);\n\n switch (entry.type) {\n case \"tool\":\n this.server.tool(entry.name, entry.description, entry.paramsSchema, entry.callback);\n break;\n case \"prompt\":\n if (\"argsSchema\" in entry) {\n this.server.prompt(entry.name, entry.description, entry.argsSchema, entry.callback);\n } else {\n this.server.prompt(entry.name, entry.description, entry.callback);\n }\n break;\n case \"resource\":\n if (\"uri\" in entry) {\n this.server.resource(entry.name, entry.uri, entry.callback);\n } else {\n this.server.resource(entry.name, entry.template, entry.callback);\n }\n break;\n default:\n throw new ValueError(\"Input type is not supported by this server.\");\n }\n }\n\n if (this.config.transport === \"sse\") {\n runServer(this.server, this.config.hostname, this.config.port);\n } else {\n await this.server.connect(new StdioServerTransport());\n }\n }\n\n getFactory(member: any) {\n const factories = (this.constructor as typeof Server).factories;\n return !factories.has(member.constructor) && member instanceof Tool && factories.has(Tool)\n ? factories.get(Tool)!\n : super.getFactory(member);\n }\n}\n\nasync function toolFactory(tool: AnyTool): Promise<MCPServerEntry> {\n const schema = await tool.inputSchema();\n if (!(schema instanceof ZodType)) {\n throw new ValueError(\"JsonSchema is not supported for MCP tools.\");\n }\n const paramsSchema = schema.shape;\n return {\n type: \"tool\",\n name: tool.name,\n description: tool.description,\n paramsSchema: paramsSchema,\n callback: async (...args: Parameters<typeof tool.run>) => {\n const result = await tool.run(...args);\n return {\n content: [\n {\n type: \"text\",\n text: result.getTextContent(),\n },\n ],\n };\n },\n };\n}\n\nMCPServer.registerFactory(Tool, toolFactory);\n"]}
1
+ {"version":3,"sources":["../../../../src/adapters/mcp/serve/server.ts"],"names":["MCPServerConfig","transport","hostname","port","name","version","settings","partial","Object","assign","MCPServer","Server","server","config","McpServer","serve","member","members","factory","getFactory","entry","type","tool","description","paramsSchema","callback","prompt","argsSchema","resource","uri","template","ValueError","connect","StdioServerTransport","runServer","Error","factories","has","Tool","get","toolFactory","schema","inputSchema","ZodType","shape","args","result","run","content","text","getTextContent","registerFactory"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { ValueError } from \"@/errors.js\";\nimport { Server } from \"@/serve/server.js\";\nimport { ServerOptions } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n McpServer,\n PromptCallback,\n ReadResourceCallback,\n ReadResourceTemplateCallback,\n ResourceTemplate,\n ToolCallback,\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { AnyTool, Tool } from \"@/tools/base.js\";\nimport { runServer } from \"./http_server.js\";\nimport { ZodRawShape, ZodType } from \"zod\";\nimport { ToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\n\ntype MCPServerPrompt =\n | {\n type: \"prompt\";\n name: string;\n description: string;\n callback: PromptCallback;\n }\n | {\n type: \"prompt\";\n name: string;\n description: string;\n argsSchema: ZodRawShape;\n callback: PromptCallback<ZodRawShape>;\n };\n\ntype MCPServerResource =\n | {\n type: \"resource\";\n name: string;\n uri: string;\n callback: ReadResourceCallback;\n }\n | {\n type: \"resource\";\n name: string;\n template: ResourceTemplate;\n callback: ReadResourceTemplateCallback;\n };\n\ninterface MCPServerTool {\n type: \"tool\";\n name: string;\n description: string;\n paramsSchema: ZodRawShape | ToolAnnotations;\n callback: ToolCallback<ZodRawShape>;\n}\n\ntype MCPServerEntry = MCPServerPrompt | MCPServerResource | MCPServerTool;\n\n// Configuration for the MCPServer.\nexport class MCPServerConfig {\n transport: \"stdio\" | \"sse\" | \"streamable-http\" = \"stdio\";\n hostname = \"127.0.0.1\";\n port = 8000;\n name = \"MCP Server\";\n version = \"1.0.0\";\n settings?: ServerOptions;\n\n constructor(partial?: Partial<MCPServerConfig>) {\n if (partial) {\n Object.assign(this, partial);\n }\n }\n}\n\nexport class MCPServer extends Server<any, MCPServerEntry, MCPServerConfig, never> {\n protected server: McpServer;\n\n constructor(config?: MCPServerConfig) {\n super(config || new MCPServerConfig());\n this.server = new McpServer({\n name: this.config.name,\n version: this.config.version,\n ...this.config.settings,\n });\n }\n\n async serve() {\n for (const member of this.members) {\n const factory = this.getFactory(member);\n const entry = await factory(member);\n\n switch (entry.type) {\n case \"tool\":\n this.server.tool(entry.name, entry.description, entry.paramsSchema, entry.callback);\n break;\n case \"prompt\":\n if (\"argsSchema\" in entry) {\n this.server.prompt(entry.name, entry.description, entry.argsSchema, entry.callback);\n } else {\n this.server.prompt(entry.name, entry.description, entry.callback);\n }\n break;\n case \"resource\":\n if (\"uri\" in entry) {\n this.server.resource(entry.name, entry.uri, entry.callback);\n } else {\n this.server.resource(entry.name, entry.template, entry.callback);\n }\n break;\n default:\n throw new ValueError(\"Input type is not supported by this server.\");\n }\n }\n\n switch (this.config.transport) {\n case \"stdio\":\n await this.server.connect(new StdioServerTransport());\n break;\n case \"sse\":\n case \"streamable-http\":\n runServer(this.server, this.config.hostname, this.config.port);\n break;\n default: {\n // The following line ensures exhaustiveness checking at compile time.\n const _exhaustiveCheck: never = this.config.transport;\n throw new Error(\"Unsupported transport type.\");\n }\n }\n }\n\n getFactory(member: any) {\n const factories = (this.constructor as typeof Server).factories;\n return !factories.has(member.constructor) && member instanceof Tool && factories.has(Tool)\n ? factories.get(Tool)!\n : super.getFactory(member);\n }\n}\n\nasync function toolFactory(tool: AnyTool): Promise<MCPServerEntry> {\n const schema = await tool.inputSchema();\n if (!(schema instanceof ZodType)) {\n throw new ValueError(\"JsonSchema is not supported for MCP tools.\");\n }\n const paramsSchema = schema.shape;\n return {\n type: \"tool\",\n name: tool.name,\n description: tool.description,\n paramsSchema: paramsSchema,\n callback: async (...args: Parameters<typeof tool.run>) => {\n const result = await tool.run(...args);\n return {\n content: [\n {\n type: \"text\",\n text: result.getTextContent(),\n },\n ],\n };\n },\n };\n}\n\nMCPServer.registerFactory(Tool, toolFactory);\n"]}
@@ -81,4 +81,4 @@ declare class ReActAgent extends BaseAgent<ReActAgentRunInput, ReActAgentRunOutp
81
81
  };
82
82
  }
83
83
 
84
- export { BaseRunner as B, type ReActAgentInput as R, ReActAgent as a, type ReActAgentRunnerLLMInput as b, type ReActAgentRunnerToolInput as c, type ReActAgentTemplateFactory as d };
84
+ export { BaseRunner as B, type ReActAgentRunnerLLMInput as R, type ReActAgentRunnerToolInput as a, type ReActAgentInput as b, ReActAgent as c, type ReActAgentTemplateFactory as d };
@@ -81,4 +81,4 @@ declare class ReActAgent extends BaseAgent<ReActAgentRunInput, ReActAgentRunOutp
81
81
  };
82
82
  }
83
83
 
84
- export { BaseRunner as B, type ReActAgentInput as R, ReActAgent as a, type ReActAgentRunnerLLMInput as b, type ReActAgentRunnerToolInput as c, type ReActAgentTemplateFactory as d };
84
+ export { BaseRunner as B, type ReActAgentRunnerLLMInput as R, type ReActAgentRunnerToolInput as a, type ReActAgentInput as b, ReActAgent as c, type ReActAgentTemplateFactory as d };
@@ -4,7 +4,7 @@ import '../../tools/base.cjs';
4
4
  import '../../memory/base.cjs';
5
5
  import '../../emitter-DWEsd-ud.cjs';
6
6
  import './types.cjs';
7
- export { a as ReActAgent, R as ReActAgentInput, d as ReActAgentTemplateFactory } from '../../agent-Bhm6xSfI.cjs';
7
+ export { c as ReActAgent, b as ReActAgentInput, d as ReActAgentTemplateFactory } from '../../agent-I0Saf4A1.cjs';
8
8
  import '../../chat-CR4yfOR9.cjs';
9
9
  import '../../internals/serializable.cjs';
10
10
  import '../../internals/types.cjs';
@@ -4,7 +4,7 @@ import '../../tools/base.js';
4
4
  import '../../memory/base.js';
5
5
  import '../../emitter-C9nwGLt6.js';
6
6
  import './types.js';
7
- export { a as ReActAgent, R as ReActAgentInput, d as ReActAgentTemplateFactory } from '../../agent-CmCmnEDX.js';
7
+ export { c as ReActAgent, b as ReActAgentInput, d as ReActAgentTemplateFactory } from '../../agent-CtrCeN7o.js';
8
8
  import '../../chat-W9j8T6UU.js';
9
9
  import '../../internals/serializable.js';
10
10
  import '../../internals/types.js';
@@ -28,12 +28,12 @@ declare const ReActAgentSystemPrompt: PromptTemplate<z.ZodObject<{
28
28
  }, z.ZodTypeAny, "passthrough">>, "many">;
29
29
  createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
30
  }, "strip", z.ZodTypeAny, {
31
+ instructions: string;
31
32
  tools: z.objectOutputType<{
32
33
  name: z.ZodString;
33
34
  description: z.ZodString;
34
35
  schema: z.ZodString;
35
36
  }, z.ZodTypeAny, "passthrough">[];
36
- instructions: string;
37
37
  createdAt?: string | null | undefined;
38
38
  }, {
39
39
  tools: z.objectInputType<{
@@ -28,12 +28,12 @@ declare const ReActAgentSystemPrompt: PromptTemplate<z.ZodObject<{
28
28
  }, z.ZodTypeAny, "passthrough">>, "many">;
29
29
  createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
30
  }, "strip", z.ZodTypeAny, {
31
+ instructions: string;
31
32
  tools: z.objectOutputType<{
32
33
  name: z.ZodString;
33
34
  description: z.ZodString;
34
35
  schema: z.ZodString;
35
36
  }, z.ZodTypeAny, "passthrough">[];
36
- instructions: string;
37
37
  createdAt?: string | null | undefined;
38
38
  }, {
39
39
  tools: z.objectInputType<{
@@ -1,7 +1,7 @@
1
1
  import '../../../parsers/linePrefix.cjs';
2
2
  import '../types.cjs';
3
3
  import '../../../internals/serializable.cjs';
4
- export { B as BaseRunner, b as ReActAgentRunnerLLMInput, c as ReActAgentRunnerToolInput } from '../../../agent-Bhm6xSfI.cjs';
4
+ export { B as BaseRunner, R as ReActAgentRunnerLLMInput, a as ReActAgentRunnerToolInput } from '../../../agent-I0Saf4A1.cjs';
5
5
  import '../../../internals/helpers/counter.cjs';
6
6
  import '../../../memory/base.cjs';
7
7
  import '../../../context.cjs';
@@ -1,7 +1,7 @@
1
1
  import '../../../parsers/linePrefix.js';
2
2
  import '../types.js';
3
3
  import '../../../internals/serializable.js';
4
- export { B as BaseRunner, b as ReActAgentRunnerLLMInput, c as ReActAgentRunnerToolInput } from '../../../agent-CmCmnEDX.js';
4
+ export { B as BaseRunner, R as ReActAgentRunnerLLMInput, a as ReActAgentRunnerToolInput } from '../../../agent-CtrCeN7o.js';
5
5
  import '../../../internals/helpers/counter.js';
6
6
  import '../../../memory/base.js';
7
7
  import '../../../context.js';
@@ -46,12 +46,12 @@ declare const DeepThinkReActAgentSystemPrompt: PromptTemplate<zod.ZodObject<{
46
46
  }, zod.ZodTypeAny, "passthrough">>, "many">;
47
47
  createdAt: zod.ZodOptional<zod.ZodNullable<zod.ZodString>>;
48
48
  }, "strip", zod.ZodTypeAny, {
49
+ instructions: string;
49
50
  tools: zod.objectOutputType<{
50
51
  name: zod.ZodString;
51
52
  description: zod.ZodString;
52
53
  schema: zod.ZodString;
53
54
  }, zod.ZodTypeAny, "passthrough">[];
54
- instructions: string;
55
55
  createdAt?: string | null | undefined;
56
56
  }, {
57
57
  tools: zod.objectInputType<{
@@ -46,12 +46,12 @@ declare const DeepThinkReActAgentSystemPrompt: PromptTemplate<zod.ZodObject<{
46
46
  }, zod.ZodTypeAny, "passthrough">>, "many">;
47
47
  createdAt: zod.ZodOptional<zod.ZodNullable<zod.ZodString>>;
48
48
  }, "strip", zod.ZodTypeAny, {
49
+ instructions: string;
49
50
  tools: zod.objectOutputType<{
50
51
  name: zod.ZodString;
51
52
  description: zod.ZodString;
52
53
  schema: zod.ZodString;
53
54
  }, zod.ZodTypeAny, "passthrough">[];
54
- instructions: string;
55
55
  createdAt?: string | null | undefined;
56
56
  }, {
57
57
  tools: zod.objectInputType<{
@@ -4,7 +4,7 @@ import { PromptTemplate } from '../../../../template.cjs';
4
4
  import { AnyTool } from '../../../../tools/base.cjs';
5
5
  import { DefaultRunner } from '../default/runner.cjs';
6
6
  import { z } from 'zod';
7
- import { R as ReActAgentInput, a as ReActAgent } from '../../../../agent-Bhm6xSfI.cjs';
7
+ import { b as ReActAgentInput, c as ReActAgent } from '../../../../agent-I0Saf4A1.cjs';
8
8
  import { GetRunContext } from '../../../../context.cjs';
9
9
  import '../../../../emitter-DWEsd-ud.cjs';
10
10
  import '../../../../internals/types.cjs';
@@ -51,12 +51,12 @@ declare class DeepThinkRunner extends DefaultRunner {
51
51
  }, z.ZodTypeAny, "passthrough">>, "many">;
52
52
  createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
53
53
  }, "strip", z.ZodTypeAny, {
54
+ instructions: string;
54
55
  tools: z.objectOutputType<{
55
56
  name: z.ZodString;
56
57
  description: z.ZodString;
57
58
  schema: z.ZodString;
58
59
  }, z.ZodTypeAny, "passthrough">[];
59
- instructions: string;
60
60
  createdAt?: string | null | undefined;
61
61
  }, {
62
62
  tools: z.objectInputType<{
@@ -4,7 +4,7 @@ import { PromptTemplate } from '../../../../template.js';
4
4
  import { AnyTool } from '../../../../tools/base.js';
5
5
  import { DefaultRunner } from '../default/runner.js';
6
6
  import { z } from 'zod';
7
- import { R as ReActAgentInput, a as ReActAgent } from '../../../../agent-CmCmnEDX.js';
7
+ import { b as ReActAgentInput, c as ReActAgent } from '../../../../agent-CtrCeN7o.js';
8
8
  import { GetRunContext } from '../../../../context.js';
9
9
  import '../../../../emitter-C9nwGLt6.js';
10
10
  import '../../../../internals/types.js';
@@ -51,12 +51,12 @@ declare class DeepThinkRunner extends DefaultRunner {
51
51
  }, z.ZodTypeAny, "passthrough">>, "many">;
52
52
  createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
53
53
  }, "strip", z.ZodTypeAny, {
54
+ instructions: string;
54
55
  tools: z.objectOutputType<{
55
56
  name: z.ZodString;
56
57
  description: z.ZodString;
57
58
  schema: z.ZodString;
58
59
  }, z.ZodTypeAny, "passthrough">[];
59
- instructions: string;
60
60
  createdAt?: string | null | undefined;
61
61
  }, {
62
62
  tools: z.objectInputType<{
@@ -1,5 +1,5 @@
1
1
  import { PromptTemplate } from '../../../../template.cjs';
2
- import { B as BaseRunner, b as ReActAgentRunnerLLMInput, c as ReActAgentRunnerToolInput } from '../../../../agent-Bhm6xSfI.cjs';
2
+ import { B as BaseRunner, R as ReActAgentRunnerLLMInput, a as ReActAgentRunnerToolInput } from '../../../../agent-I0Saf4A1.cjs';
3
3
  import { ReActAgentRunIteration, ReActAgentRunInput, ReActAgentParserInput } from '../../types.cjs';
4
4
  import { AnyTool } from '../../../../tools/base.cjs';
5
5
  import { LinePrefixParser } from '../../../../parsers/linePrefix.cjs';
@@ -51,12 +51,12 @@ declare class DefaultRunner extends BaseRunner {
51
51
  }, z.ZodTypeAny, "passthrough">>, "many">;
52
52
  createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
53
53
  }, "strip", z.ZodTypeAny, {
54
+ instructions: string;
54
55
  tools: z.objectOutputType<{
55
56
  name: z.ZodString;
56
57
  description: z.ZodString;
57
58
  schema: z.ZodString;
58
59
  }, z.ZodTypeAny, "passthrough">[];
59
- instructions: string;
60
60
  createdAt?: string | null | undefined;
61
61
  }, {
62
62
  tools: z.objectInputType<{
@@ -1,5 +1,5 @@
1
1
  import { PromptTemplate } from '../../../../template.js';
2
- import { B as BaseRunner, b as ReActAgentRunnerLLMInput, c as ReActAgentRunnerToolInput } from '../../../../agent-CmCmnEDX.js';
2
+ import { B as BaseRunner, R as ReActAgentRunnerLLMInput, a as ReActAgentRunnerToolInput } from '../../../../agent-CtrCeN7o.js';
3
3
  import { ReActAgentRunIteration, ReActAgentRunInput, ReActAgentParserInput } from '../../types.js';
4
4
  import { AnyTool } from '../../../../tools/base.js';
5
5
  import { LinePrefixParser } from '../../../../parsers/linePrefix.js';
@@ -51,12 +51,12 @@ declare class DefaultRunner extends BaseRunner {
51
51
  }, z.ZodTypeAny, "passthrough">>, "many">;
52
52
  createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
53
53
  }, "strip", z.ZodTypeAny, {
54
+ instructions: string;
54
55
  tools: z.objectOutputType<{
55
56
  name: z.ZodString;
56
57
  description: z.ZodString;
57
58
  schema: z.ZodString;
58
59
  }, z.ZodTypeAny, "passthrough">[];
59
- instructions: string;
60
60
  createdAt?: string | null | undefined;
61
61
  }, {
62
62
  tools: z.objectInputType<{
@@ -46,12 +46,12 @@ declare const GraniteReActAgentSystemPrompt: PromptTemplate<zod.ZodObject<{
46
46
  }, zod.ZodTypeAny, "passthrough">>, "many">;
47
47
  createdAt: zod.ZodOptional<zod.ZodNullable<zod.ZodString>>;
48
48
  }, "strip", zod.ZodTypeAny, {
49
+ instructions: string;
49
50
  tools: zod.objectOutputType<{
50
51
  name: zod.ZodString;
51
52
  description: zod.ZodString;
52
53
  schema: zod.ZodString;
53
54
  }, zod.ZodTypeAny, "passthrough">[];
54
- instructions: string;
55
55
  createdAt?: string | null | undefined;
56
56
  }, {
57
57
  tools: zod.objectInputType<{
@@ -46,12 +46,12 @@ declare const GraniteReActAgentSystemPrompt: PromptTemplate<zod.ZodObject<{
46
46
  }, zod.ZodTypeAny, "passthrough">>, "many">;
47
47
  createdAt: zod.ZodOptional<zod.ZodNullable<zod.ZodString>>;
48
48
  }, "strip", zod.ZodTypeAny, {
49
+ instructions: string;
49
50
  tools: zod.objectOutputType<{
50
51
  name: zod.ZodString;
51
52
  description: zod.ZodString;
52
53
  schema: zod.ZodString;
53
54
  }, zod.ZodTypeAny, "passthrough">[];
54
- instructions: string;
55
55
  createdAt?: string | null | undefined;
56
56
  }, {
57
57
  tools: zod.objectInputType<{
@@ -4,7 +4,7 @@ import * as zod from 'zod';
4
4
  import { AnyTool } from '../../../../tools/base.cjs';
5
5
  import { DefaultRunner } from '../default/runner.cjs';
6
6
  import { ReActAgentRunOptions, ReActAgentParserInput } from '../../types.cjs';
7
- import { R as ReActAgentInput, a as ReActAgent } from '../../../../agent-Bhm6xSfI.cjs';
7
+ import { b as ReActAgentInput, c as ReActAgent } from '../../../../agent-I0Saf4A1.cjs';
8
8
  import { GetRunContext } from '../../../../context.cjs';
9
9
  import '../../../../emitter-DWEsd-ud.cjs';
10
10
  import '../../../../internals/types.cjs';
@@ -52,12 +52,12 @@ declare class GraniteRunner extends DefaultRunner {
52
52
  }, zod.ZodTypeAny, "passthrough">>, "many">;
53
53
  createdAt: zod.ZodOptional<zod.ZodNullable<zod.ZodString>>;
54
54
  }, "strip", zod.ZodTypeAny, {
55
+ instructions: string;
55
56
  tools: zod.objectOutputType<{
56
57
  name: zod.ZodString;
57
58
  description: zod.ZodString;
58
59
  schema: zod.ZodString;
59
60
  }, zod.ZodTypeAny, "passthrough">[];
60
- instructions: string;
61
61
  createdAt?: string | null | undefined;
62
62
  }, {
63
63
  tools: zod.objectInputType<{