@alcyone-labs/arg-parser 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +460 -1179
- package/dist/assets/.dxtignore.template +38 -0
- package/dist/assets/logo_1_small.jpg +0 -0
- package/dist/assets/tsdown.dxt.config.ts +37 -0
- package/dist/index.cjs +23702 -2315
- package/dist/index.cjs.map +1 -1
- package/dist/index.min.mjs +16360 -1725
- package/dist/index.min.mjs.map +1 -1
- package/dist/index.mjs +23694 -2315
- package/dist/index.mjs.map +1 -1
- package/dist/src/config/ConfigurationManager.d.ts +74 -0
- package/dist/src/config/ConfigurationManager.d.ts.map +1 -0
- package/dist/src/config/plugins/ConfigPlugin.d.ts +60 -0
- package/dist/src/config/plugins/ConfigPlugin.d.ts.map +1 -0
- package/dist/src/config/plugins/ConfigPluginRegistry.d.ts +72 -0
- package/dist/src/config/plugins/ConfigPluginRegistry.d.ts.map +1 -0
- package/dist/src/config/plugins/TomlConfigPlugin.d.ts +30 -0
- package/dist/src/config/plugins/TomlConfigPlugin.d.ts.map +1 -0
- package/dist/src/config/plugins/YamlConfigPlugin.d.ts +29 -0
- package/dist/src/config/plugins/YamlConfigPlugin.d.ts.map +1 -0
- package/dist/src/config/plugins/index.d.ts +5 -0
- package/dist/src/config/plugins/index.d.ts.map +1 -0
- package/dist/src/core/ArgParser.d.ts +332 -0
- package/dist/src/core/ArgParser.d.ts.map +1 -0
- package/dist/src/{ArgParserBase.d.ts → core/ArgParserBase.d.ts} +84 -3
- package/dist/src/core/ArgParserBase.d.ts.map +1 -0
- package/dist/src/core/FlagManager.d.ts.map +1 -0
- package/dist/src/{types.d.ts → core/types.d.ts} +40 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/dxt/DxtGenerator.d.ts +115 -0
- package/dist/src/dxt/DxtGenerator.d.ts.map +1 -0
- package/dist/src/index.d.ts +10 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/mcp/ArgParserMcp.d.ts +21 -0
- package/dist/src/mcp/ArgParserMcp.d.ts.map +1 -0
- package/dist/src/mcp/mcp-integration.d.ts +83 -0
- package/dist/src/mcp/mcp-integration.d.ts.map +1 -0
- package/dist/src/mcp/mcp-notifications.d.ts +138 -0
- package/dist/src/mcp/mcp-notifications.d.ts.map +1 -0
- package/dist/src/mcp/mcp-prompts.d.ts +132 -0
- package/dist/src/mcp/mcp-prompts.d.ts.map +1 -0
- package/dist/src/mcp/mcp-resources.d.ts +133 -0
- package/dist/src/mcp/mcp-resources.d.ts.map +1 -0
- package/dist/src/testing/fuzzy-test-cli.d.ts +5 -0
- package/dist/src/testing/fuzzy-test-cli.d.ts.map +1 -0
- package/dist/src/{fuzzy-tester.d.ts → testing/fuzzy-tester.d.ts} +1 -1
- package/dist/src/testing/fuzzy-tester.d.ts.map +1 -0
- package/package.json +51 -17
- package/dist/examples/fuzzy-demo.d.ts +0 -8
- package/dist/examples/fuzzy-demo.d.ts.map +0 -1
- package/dist/examples/fuzzy-test-example.d.ts +0 -8
- package/dist/examples/fuzzy-test-example.d.ts.map +0 -1
- package/dist/examples/fzf-search-cli.d.ts +0 -8
- package/dist/examples/fzf-search-cli.d.ts.map +0 -1
- package/dist/examples/getting-started.d.ts +0 -27
- package/dist/examples/getting-started.d.ts.map +0 -1
- package/dist/examples/mcp-preset-transports.d.ts +0 -19
- package/dist/examples/mcp-preset-transports.d.ts.map +0 -1
- package/dist/examples/simple-cli.d.ts +0 -26
- package/dist/examples/simple-cli.d.ts.map +0 -1
- package/dist/examples/v1.1.0-showcase.d.ts +0 -16
- package/dist/examples/v1.1.0-showcase.d.ts.map +0 -1
- package/dist/examples/with-env-example.d.ts +0 -3
- package/dist/examples/with-env-example.d.ts.map +0 -1
- package/dist/index-6G9StDO_.js +0 -6445
- package/dist/index-6G9StDO_.js.map +0 -1
- package/dist/index-CqU7Fj3C.cjs +0 -6444
- package/dist/index-CqU7Fj3C.cjs.map +0 -1
- package/dist/index-Dx_q1msW.js +0 -4682
- package/dist/index-Dx_q1msW.js.map +0 -1
- package/dist/src/ArgParser.d.ts +0 -156
- package/dist/src/ArgParser.d.ts.map +0 -1
- package/dist/src/ArgParserBase.d.ts.map +0 -1
- package/dist/src/FlagManager.d.ts.map +0 -1
- package/dist/src/fuzzy-test-cli.d.ts +0 -5
- package/dist/src/fuzzy-test-cli.d.ts.map +0 -1
- package/dist/src/fuzzy-tester.d.ts.map +0 -1
- package/dist/src/mcp-integration.d.ts +0 -31
- package/dist/src/mcp-integration.d.ts.map +0 -1
- package/dist/src/types.d.ts.map +0 -1
- package/dist/sse-B5Jf_YpG.cjs +0 -121
- package/dist/sse-B5Jf_YpG.cjs.map +0 -1
- package/dist/sse-BDL3h2Ll.js +0 -121
- package/dist/sse-BDL3h2Ll.js.map +0 -1
- package/dist/sse-DSjLfGFo.js +0 -107
- package/dist/sse-DSjLfGFo.js.map +0 -1
- package/dist/stdio-Cf19UQO7.js +0 -70
- package/dist/stdio-Cf19UQO7.js.map +0 -1
- package/dist/stdio-DESvSONI.cjs +0 -94
- package/dist/stdio-DESvSONI.cjs.map +0 -1
- package/dist/stdio-DLOResWr.js +0 -94
- package/dist/stdio-DLOResWr.js.map +0 -1
- package/dist/streamableHttp-DXIdDSbF.js +0 -342
- package/dist/streamableHttp-DXIdDSbF.js.map +0 -1
- package/dist/streamableHttp-DsXlAnqJ.cjs +0 -456
- package/dist/streamableHttp-DsXlAnqJ.cjs.map +0 -1
- package/dist/streamableHttp-Vd4Qsgko.js +0 -456
- package/dist/streamableHttp-Vd4Qsgko.js.map +0 -1
- package/dist/types-DSxPEImy.cjs +0 -943
- package/dist/types-DSxPEImy.cjs.map +0 -1
- package/dist/types-DdsPVLQ5.js +0 -846
- package/dist/types-DdsPVLQ5.js.map +0 -1
- package/dist/types-DpK81FWv.js +0 -944
- package/dist/types-DpK81FWv.js.map +0 -1
- /package/dist/src/{FlagManager.d.ts → core/FlagManager.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streamableHttp-DXIdDSbF.js","sources":["../node_modules/.pnpm/@modelcontextprotocol+sdk@1.13.1/node_modules/@modelcontextprotocol/sdk/dist/esm/server/streamableHttp.js"],"sourcesContent":["import { isInitializeRequest, isJSONRPCError, isJSONRPCRequest, isJSONRPCResponse, JSONRPCMessageSchema, SUPPORTED_PROTOCOL_VERSIONS, DEFAULT_NEGOTIATED_PROTOCOL_VERSION } from \"../types.js\";\nimport getRawBody from \"raw-body\";\nimport contentType from \"content-type\";\nimport { randomUUID } from \"node:crypto\";\nconst MAXIMUM_MESSAGE_SIZE = \"4mb\";\n/**\n * Server transport for Streamable HTTP: this implements the MCP Streamable HTTP transport specification.\n * It supports both SSE streaming and direct HTTP responses.\n *\n * Usage example:\n *\n * ```typescript\n * // Stateful mode - server sets the session ID\n * const statefulTransport = new StreamableHTTPServerTransport({\n * sessionIdGenerator: () => randomUUID(),\n * });\n *\n * // Stateless mode - explicitly set session ID to undefined\n * const statelessTransport = new StreamableHTTPServerTransport({\n * sessionIdGenerator: undefined,\n * });\n *\n * // Using with pre-parsed request body\n * app.post('/mcp', (req, res) => {\n * transport.handleRequest(req, res, req.body);\n * });\n * ```\n *\n * In stateful mode:\n * - Session ID is generated and included in response headers\n * - Session ID is always included in initialization responses\n * - Requests with invalid session IDs are rejected with 404 Not Found\n * - Non-initialization requests without a session ID are rejected with 400 Bad Request\n * - State is maintained in-memory (connections, message history)\n *\n * In stateless mode:\n * - No Session ID is included in any responses\n * - No session validation is performed\n */\nexport class StreamableHTTPServerTransport {\n constructor(options) {\n var _a;\n this._started = false;\n this._streamMapping = new Map();\n this._requestToStreamMapping = new Map();\n this._requestResponseMap = new Map();\n this._initialized = false;\n this._enableJsonResponse = false;\n this._standaloneSseStreamId = '_GET_stream';\n this.sessionIdGenerator = options.sessionIdGenerator;\n this._enableJsonResponse = (_a = options.enableJsonResponse) !== null && _a !== void 0 ? _a : false;\n this._eventStore = options.eventStore;\n this._onsessioninitialized = options.onsessioninitialized;\n }\n /**\n * Starts the transport. This is required by the Transport interface but is a no-op\n * for the Streamable HTTP transport as connections are managed per-request.\n */\n async start() {\n if (this._started) {\n throw new Error(\"Transport already started\");\n }\n this._started = true;\n }\n /**\n * Handles an incoming HTTP request, whether GET or POST\n */\n async handleRequest(req, res, parsedBody) {\n if (req.method === \"POST\") {\n await this.handlePostRequest(req, res, parsedBody);\n }\n else if (req.method === \"GET\") {\n await this.handleGetRequest(req, res);\n }\n else if (req.method === \"DELETE\") {\n await this.handleDeleteRequest(req, res);\n }\n else {\n await this.handleUnsupportedRequest(res);\n }\n }\n /**\n * Handles GET requests for SSE stream\n */\n async handleGetRequest(req, res) {\n // The client MUST include an Accept header, listing text/event-stream as a supported content type.\n const acceptHeader = req.headers.accept;\n if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes(\"text/event-stream\"))) {\n res.writeHead(406).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Not Acceptable: Client must accept text/event-stream\"\n },\n id: null\n }));\n return;\n }\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it\n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n if (!this.validateSession(req, res)) {\n return;\n }\n if (!this.validateProtocolVersion(req, res)) {\n return;\n }\n // Handle resumability: check for Last-Event-ID header\n if (this._eventStore) {\n const lastEventId = req.headers['last-event-id'];\n if (lastEventId) {\n await this.replayEvents(lastEventId, res);\n return;\n }\n }\n // The server MUST either return Content-Type: text/event-stream in response to this HTTP GET,\n // or else return HTTP 405 Method Not Allowed\n const headers = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n };\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n headers[\"mcp-session-id\"] = this.sessionId;\n }\n // Check if there's already an active standalone SSE stream for this session\n if (this._streamMapping.get(this._standaloneSseStreamId) !== undefined) {\n // Only one GET SSE stream is allowed per session\n res.writeHead(409).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Conflict: Only one SSE stream is allowed per session\"\n },\n id: null\n }));\n return;\n }\n // We need to send headers immediately as messages will arrive much later,\n // otherwise the client will just wait for the first message\n res.writeHead(200, headers).flushHeaders();\n // Assign the response to the standalone SSE stream\n this._streamMapping.set(this._standaloneSseStreamId, res);\n // Set up close handler for client disconnects\n res.on(\"close\", () => {\n this._streamMapping.delete(this._standaloneSseStreamId);\n });\n }\n /**\n * Replays events that would have been sent after the specified event ID\n * Only used when resumability is enabled\n */\n async replayEvents(lastEventId, res) {\n var _a, _b;\n if (!this._eventStore) {\n return;\n }\n try {\n const headers = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n };\n if (this.sessionId !== undefined) {\n headers[\"mcp-session-id\"] = this.sessionId;\n }\n res.writeHead(200, headers).flushHeaders();\n const streamId = await ((_a = this._eventStore) === null || _a === void 0 ? void 0 : _a.replayEventsAfter(lastEventId, {\n send: async (eventId, message) => {\n var _a;\n if (!this.writeSSEEvent(res, message, eventId)) {\n (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, new Error(\"Failed replay events\"));\n res.end();\n }\n }\n }));\n this._streamMapping.set(streamId, res);\n }\n catch (error) {\n (_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);\n }\n }\n /**\n * Writes an event to the SSE stream with proper formatting\n */\n writeSSEEvent(res, message, eventId) {\n let eventData = `event: message\\n`;\n // Include event ID if provided - this is important for resumability\n if (eventId) {\n eventData += `id: ${eventId}\\n`;\n }\n eventData += `data: ${JSON.stringify(message)}\\n\\n`;\n return res.write(eventData);\n }\n /**\n * Handles unsupported requests (PUT, PATCH, etc.)\n */\n async handleUnsupportedRequest(res) {\n res.writeHead(405, {\n \"Allow\": \"GET, POST, DELETE\"\n }).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Method not allowed.\"\n },\n id: null\n }));\n }\n /**\n * Handles POST requests containing JSON-RPC messages\n */\n async handlePostRequest(req, res, parsedBody) {\n var _a, _b, _c, _d, _e;\n try {\n // Validate the Accept header\n const acceptHeader = req.headers.accept;\n // The client MUST include an Accept header, listing both application/json and text/event-stream as supported content types.\n if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes(\"application/json\")) || !acceptHeader.includes(\"text/event-stream\")) {\n res.writeHead(406).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Not Acceptable: Client must accept both application/json and text/event-stream\"\n },\n id: null\n }));\n return;\n }\n const ct = req.headers[\"content-type\"];\n if (!ct || !ct.includes(\"application/json\")) {\n res.writeHead(415).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Unsupported Media Type: Content-Type must be application/json\"\n },\n id: null\n }));\n return;\n }\n const authInfo = req.auth;\n let rawMessage;\n if (parsedBody !== undefined) {\n rawMessage = parsedBody;\n }\n else {\n const parsedCt = contentType.parse(ct);\n const body = await getRawBody(req, {\n limit: MAXIMUM_MESSAGE_SIZE,\n encoding: (_a = parsedCt.parameters.charset) !== null && _a !== void 0 ? _a : \"utf-8\",\n });\n rawMessage = JSON.parse(body.toString());\n }\n let messages;\n // handle batch and single messages\n if (Array.isArray(rawMessage)) {\n messages = rawMessage.map(msg => JSONRPCMessageSchema.parse(msg));\n }\n else {\n messages = [JSONRPCMessageSchema.parse(rawMessage)];\n }\n // Check if this is an initialization request\n // https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/lifecycle/\n const isInitializationRequest = messages.some(isInitializeRequest);\n if (isInitializationRequest) {\n // If it's a server with session management and the session ID is already set we should reject the request\n // to avoid re-initialization.\n if (this._initialized && this.sessionId !== undefined) {\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32600,\n message: \"Invalid Request: Server already initialized\"\n },\n id: null\n }));\n return;\n }\n if (messages.length > 1) {\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32600,\n message: \"Invalid Request: Only one initialization request is allowed\"\n },\n id: null\n }));\n return;\n }\n this.sessionId = (_b = this.sessionIdGenerator) === null || _b === void 0 ? void 0 : _b.call(this);\n this._initialized = true;\n // If we have a session ID and an onsessioninitialized handler, call it immediately\n // This is needed in cases where the server needs to keep track of multiple sessions\n if (this.sessionId && this._onsessioninitialized) {\n this._onsessioninitialized(this.sessionId);\n }\n }\n if (!isInitializationRequest) {\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it \n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n if (!this.validateSession(req, res)) {\n return;\n }\n // Mcp-Protocol-Version header is required for all requests after initialization.\n if (!this.validateProtocolVersion(req, res)) {\n return;\n }\n }\n // check if it contains requests\n const hasRequests = messages.some(isJSONRPCRequest);\n if (!hasRequests) {\n // if it only contains notifications or responses, return 202\n res.writeHead(202).end();\n // handle each message\n for (const message of messages) {\n (_c = this.onmessage) === null || _c === void 0 ? void 0 : _c.call(this, message, { authInfo });\n }\n }\n else if (hasRequests) {\n // The default behavior is to use SSE streaming\n // but in some cases server will return JSON responses\n const streamId = randomUUID();\n if (!this._enableJsonResponse) {\n const headers = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n };\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n headers[\"mcp-session-id\"] = this.sessionId;\n }\n res.writeHead(200, headers);\n }\n // Store the response for this request to send messages back through this connection\n // We need to track by request ID to maintain the connection\n for (const message of messages) {\n if (isJSONRPCRequest(message)) {\n this._streamMapping.set(streamId, res);\n this._requestToStreamMapping.set(message.id, streamId);\n }\n }\n // Set up close handler for client disconnects\n res.on(\"close\", () => {\n this._streamMapping.delete(streamId);\n });\n // handle each message\n for (const message of messages) {\n (_d = this.onmessage) === null || _d === void 0 ? void 0 : _d.call(this, message, { authInfo });\n }\n // The server SHOULD NOT close the SSE stream before sending all JSON-RPC responses\n // This will be handled by the send() method when responses are ready\n }\n }\n catch (error) {\n // return JSON-RPC formatted error\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32700,\n message: \"Parse error\",\n data: String(error)\n },\n id: null\n }));\n (_e = this.onerror) === null || _e === void 0 ? void 0 : _e.call(this, error);\n }\n }\n /**\n * Handles DELETE requests to terminate sessions\n */\n async handleDeleteRequest(req, res) {\n if (!this.validateSession(req, res)) {\n return;\n }\n if (!this.validateProtocolVersion(req, res)) {\n return;\n }\n await this.close();\n res.writeHead(200).end();\n }\n /**\n * Validates session ID for non-initialization requests\n * Returns true if the session is valid, false otherwise\n */\n validateSession(req, res) {\n if (this.sessionIdGenerator === undefined) {\n // If the sessionIdGenerator ID is not set, the session management is disabled\n // and we don't need to validate the session ID\n return true;\n }\n if (!this._initialized) {\n // If the server has not been initialized yet, reject all requests\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Server not initialized\"\n },\n id: null\n }));\n return false;\n }\n const sessionId = req.headers[\"mcp-session-id\"];\n if (!sessionId) {\n // Non-initialization requests without a session ID should return 400 Bad Request\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Mcp-Session-Id header is required\"\n },\n id: null\n }));\n return false;\n }\n else if (Array.isArray(sessionId)) {\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Mcp-Session-Id header must be a single value\"\n },\n id: null\n }));\n return false;\n }\n else if (sessionId !== this.sessionId) {\n // Reject requests with invalid session ID with 404 Not Found\n res.writeHead(404).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32001,\n message: \"Session not found\"\n },\n id: null\n }));\n return false;\n }\n return true;\n }\n validateProtocolVersion(req, res) {\n var _a;\n let protocolVersion = (_a = req.headers[\"mcp-protocol-version\"]) !== null && _a !== void 0 ? _a : DEFAULT_NEGOTIATED_PROTOCOL_VERSION;\n if (Array.isArray(protocolVersion)) {\n protocolVersion = protocolVersion[protocolVersion.length - 1];\n }\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(protocolVersion)) {\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: `Bad Request: Unsupported protocol version (supported versions: ${SUPPORTED_PROTOCOL_VERSIONS.join(\", \")})`\n },\n id: null\n }));\n return false;\n }\n return true;\n }\n async close() {\n var _a;\n // Close all SSE connections\n this._streamMapping.forEach((response) => {\n response.end();\n });\n this._streamMapping.clear();\n // Clear any pending responses\n this._requestResponseMap.clear();\n (_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);\n }\n async send(message, options) {\n let requestId = options === null || options === void 0 ? void 0 : options.relatedRequestId;\n if (isJSONRPCResponse(message) || isJSONRPCError(message)) {\n // If the message is a response, use the request ID from the message\n requestId = message.id;\n }\n // Check if this message should be sent on the standalone SSE stream (no request ID)\n // Ignore notifications from tools (which have relatedRequestId set)\n // Those will be sent via dedicated response SSE streams\n if (requestId === undefined) {\n // For standalone SSE streams, we can only send requests and notifications\n if (isJSONRPCResponse(message) || isJSONRPCError(message)) {\n throw new Error(\"Cannot send a response on a standalone SSE stream unless resuming a previous client request\");\n }\n const standaloneSse = this._streamMapping.get(this._standaloneSseStreamId);\n if (standaloneSse === undefined) {\n // The spec says the server MAY send messages on the stream, so it's ok to discard if no stream\n return;\n }\n // Generate and store event ID if event store is provided\n let eventId;\n if (this._eventStore) {\n // Stores the event and gets the generated event ID\n eventId = await this._eventStore.storeEvent(this._standaloneSseStreamId, message);\n }\n // Send the message to the standalone SSE stream\n this.writeSSEEvent(standaloneSse, message, eventId);\n return;\n }\n // Get the response for this request\n const streamId = this._requestToStreamMapping.get(requestId);\n const response = this._streamMapping.get(streamId);\n if (!streamId) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`);\n }\n if (!this._enableJsonResponse) {\n // For SSE responses, generate event ID if event store is provided\n let eventId;\n if (this._eventStore) {\n eventId = await this._eventStore.storeEvent(streamId, message);\n }\n if (response) {\n // Write the event to the response stream\n this.writeSSEEvent(response, message, eventId);\n }\n }\n if (isJSONRPCResponse(message) || isJSONRPCError(message)) {\n this._requestResponseMap.set(requestId, message);\n const relatedIds = Array.from(this._requestToStreamMapping.entries())\n .filter(([_, streamId]) => this._streamMapping.get(streamId) === response)\n .map(([id]) => id);\n // Check if we have responses for all requests using this connection\n const allResponsesReady = relatedIds.every(id => this._requestResponseMap.has(id));\n if (allResponsesReady) {\n if (!response) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`);\n }\n if (this._enableJsonResponse) {\n // All responses ready, send as JSON\n const headers = {\n 'Content-Type': 'application/json',\n };\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n const responses = relatedIds\n .map(id => this._requestResponseMap.get(id));\n response.writeHead(200, headers);\n if (responses.length === 1) {\n response.end(JSON.stringify(responses[0]));\n }\n else {\n response.end(JSON.stringify(responses));\n }\n }\n else {\n // End the SSE stream\n response.end();\n }\n // Clean up\n for (const id of relatedIds) {\n this._requestResponseMap.delete(id);\n this._requestToStreamMapping.delete(id);\n }\n }\n }\n }\n}\n//# sourceMappingURL=streamableHttp.js.map"],"names":["MAXIMUM_MESSAGE_SIZE","StreamableHTTPServerTransport","options","_a","req","res","parsedBody","acceptHeader","lastEventId","headers","_b","streamId","eventId","message","error","eventData","_c","_d","_e","ct","authInfo","rawMessage","parsedCt","contentType","body","getRawBody","messages","msg","JSONRPCMessageSchema","isInitializationRequest","isInitializeRequest","hasRequests","isJSONRPCRequest","randomUUID","sessionId","protocolVersion","DEFAULT_NEGOTIATED_PROTOCOL_VERSION","SUPPORTED_PROTOCOL_VERSIONS","response","requestId","isJSONRPCResponse","isJSONRPCError","standaloneSse","relatedIds","_","id","responses"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,456 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const types = require("./types-DSxPEImy.cjs");
|
|
4
|
-
const index = require("./index-CqU7Fj3C.cjs");
|
|
5
|
-
const node_crypto = require("node:crypto");
|
|
6
|
-
const MAXIMUM_MESSAGE_SIZE = "4mb";
|
|
7
|
-
class StreamableHTTPServerTransport {
|
|
8
|
-
constructor(options) {
|
|
9
|
-
var _a;
|
|
10
|
-
this._started = false;
|
|
11
|
-
this._streamMapping = /* @__PURE__ */ new Map();
|
|
12
|
-
this._requestToStreamMapping = /* @__PURE__ */ new Map();
|
|
13
|
-
this._requestResponseMap = /* @__PURE__ */ new Map();
|
|
14
|
-
this._initialized = false;
|
|
15
|
-
this._enableJsonResponse = false;
|
|
16
|
-
this._standaloneSseStreamId = "_GET_stream";
|
|
17
|
-
this.sessionIdGenerator = options.sessionIdGenerator;
|
|
18
|
-
this._enableJsonResponse = (_a = options.enableJsonResponse) !== null && _a !== void 0 ? _a : false;
|
|
19
|
-
this._eventStore = options.eventStore;
|
|
20
|
-
this._onsessioninitialized = options.onsessioninitialized;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Starts the transport. This is required by the Transport interface but is a no-op
|
|
24
|
-
* for the Streamable HTTP transport as connections are managed per-request.
|
|
25
|
-
*/
|
|
26
|
-
async start() {
|
|
27
|
-
if (this._started) {
|
|
28
|
-
throw new Error("Transport already started");
|
|
29
|
-
}
|
|
30
|
-
this._started = true;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Handles an incoming HTTP request, whether GET or POST
|
|
34
|
-
*/
|
|
35
|
-
async handleRequest(req, res, parsedBody) {
|
|
36
|
-
if (req.method === "POST") {
|
|
37
|
-
await this.handlePostRequest(req, res, parsedBody);
|
|
38
|
-
} else if (req.method === "GET") {
|
|
39
|
-
await this.handleGetRequest(req, res);
|
|
40
|
-
} else if (req.method === "DELETE") {
|
|
41
|
-
await this.handleDeleteRequest(req, res);
|
|
42
|
-
} else {
|
|
43
|
-
await this.handleUnsupportedRequest(res);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Handles GET requests for SSE stream
|
|
48
|
-
*/
|
|
49
|
-
async handleGetRequest(req, res) {
|
|
50
|
-
const acceptHeader = req.headers.accept;
|
|
51
|
-
if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes("text/event-stream"))) {
|
|
52
|
-
res.writeHead(406).end(JSON.stringify({
|
|
53
|
-
jsonrpc: "2.0",
|
|
54
|
-
error: {
|
|
55
|
-
code: -32e3,
|
|
56
|
-
message: "Not Acceptable: Client must accept text/event-stream"
|
|
57
|
-
},
|
|
58
|
-
id: null
|
|
59
|
-
}));
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (!this.validateSession(req, res)) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
if (!this.validateProtocolVersion(req, res)) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
if (this._eventStore) {
|
|
69
|
-
const lastEventId = req.headers["last-event-id"];
|
|
70
|
-
if (lastEventId) {
|
|
71
|
-
await this.replayEvents(lastEventId, res);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
const headers = {
|
|
76
|
-
"Content-Type": "text/event-stream",
|
|
77
|
-
"Cache-Control": "no-cache, no-transform",
|
|
78
|
-
Connection: "keep-alive"
|
|
79
|
-
};
|
|
80
|
-
if (this.sessionId !== void 0) {
|
|
81
|
-
headers["mcp-session-id"] = this.sessionId;
|
|
82
|
-
}
|
|
83
|
-
if (this._streamMapping.get(this._standaloneSseStreamId) !== void 0) {
|
|
84
|
-
res.writeHead(409).end(JSON.stringify({
|
|
85
|
-
jsonrpc: "2.0",
|
|
86
|
-
error: {
|
|
87
|
-
code: -32e3,
|
|
88
|
-
message: "Conflict: Only one SSE stream is allowed per session"
|
|
89
|
-
},
|
|
90
|
-
id: null
|
|
91
|
-
}));
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
res.writeHead(200, headers).flushHeaders();
|
|
95
|
-
this._streamMapping.set(this._standaloneSseStreamId, res);
|
|
96
|
-
res.on("close", () => {
|
|
97
|
-
this._streamMapping.delete(this._standaloneSseStreamId);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Replays events that would have been sent after the specified event ID
|
|
102
|
-
* Only used when resumability is enabled
|
|
103
|
-
*/
|
|
104
|
-
async replayEvents(lastEventId, res) {
|
|
105
|
-
var _a, _b;
|
|
106
|
-
if (!this._eventStore) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
const headers = {
|
|
111
|
-
"Content-Type": "text/event-stream",
|
|
112
|
-
"Cache-Control": "no-cache, no-transform",
|
|
113
|
-
Connection: "keep-alive"
|
|
114
|
-
};
|
|
115
|
-
if (this.sessionId !== void 0) {
|
|
116
|
-
headers["mcp-session-id"] = this.sessionId;
|
|
117
|
-
}
|
|
118
|
-
res.writeHead(200, headers).flushHeaders();
|
|
119
|
-
const streamId = await ((_a = this._eventStore) === null || _a === void 0 ? void 0 : _a.replayEventsAfter(lastEventId, {
|
|
120
|
-
send: async (eventId, message) => {
|
|
121
|
-
var _a2;
|
|
122
|
-
if (!this.writeSSEEvent(res, message, eventId)) {
|
|
123
|
-
(_a2 = this.onerror) === null || _a2 === void 0 ? void 0 : _a2.call(this, new Error("Failed replay events"));
|
|
124
|
-
res.end();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}));
|
|
128
|
-
this._streamMapping.set(streamId, res);
|
|
129
|
-
} catch (error) {
|
|
130
|
-
(_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Writes an event to the SSE stream with proper formatting
|
|
135
|
-
*/
|
|
136
|
-
writeSSEEvent(res, message, eventId) {
|
|
137
|
-
let eventData = `event: message
|
|
138
|
-
`;
|
|
139
|
-
if (eventId) {
|
|
140
|
-
eventData += `id: ${eventId}
|
|
141
|
-
`;
|
|
142
|
-
}
|
|
143
|
-
eventData += `data: ${JSON.stringify(message)}
|
|
144
|
-
|
|
145
|
-
`;
|
|
146
|
-
return res.write(eventData);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Handles unsupported requests (PUT, PATCH, etc.)
|
|
150
|
-
*/
|
|
151
|
-
async handleUnsupportedRequest(res) {
|
|
152
|
-
res.writeHead(405, {
|
|
153
|
-
"Allow": "GET, POST, DELETE"
|
|
154
|
-
}).end(JSON.stringify({
|
|
155
|
-
jsonrpc: "2.0",
|
|
156
|
-
error: {
|
|
157
|
-
code: -32e3,
|
|
158
|
-
message: "Method not allowed."
|
|
159
|
-
},
|
|
160
|
-
id: null
|
|
161
|
-
}));
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Handles POST requests containing JSON-RPC messages
|
|
165
|
-
*/
|
|
166
|
-
async handlePostRequest(req, res, parsedBody) {
|
|
167
|
-
var _a, _b, _c, _d, _e;
|
|
168
|
-
try {
|
|
169
|
-
const acceptHeader = req.headers.accept;
|
|
170
|
-
if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes("application/json")) || !acceptHeader.includes("text/event-stream")) {
|
|
171
|
-
res.writeHead(406).end(JSON.stringify({
|
|
172
|
-
jsonrpc: "2.0",
|
|
173
|
-
error: {
|
|
174
|
-
code: -32e3,
|
|
175
|
-
message: "Not Acceptable: Client must accept both application/json and text/event-stream"
|
|
176
|
-
},
|
|
177
|
-
id: null
|
|
178
|
-
}));
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
const ct = req.headers["content-type"];
|
|
182
|
-
if (!ct || !ct.includes("application/json")) {
|
|
183
|
-
res.writeHead(415).end(JSON.stringify({
|
|
184
|
-
jsonrpc: "2.0",
|
|
185
|
-
error: {
|
|
186
|
-
code: -32e3,
|
|
187
|
-
message: "Unsupported Media Type: Content-Type must be application/json"
|
|
188
|
-
},
|
|
189
|
-
id: null
|
|
190
|
-
}));
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
const authInfo = req.auth;
|
|
194
|
-
let rawMessage;
|
|
195
|
-
if (parsedBody !== void 0) {
|
|
196
|
-
rawMessage = parsedBody;
|
|
197
|
-
} else {
|
|
198
|
-
const parsedCt = index.contentType.parse(ct);
|
|
199
|
-
const body = await index.getRawBody(req, {
|
|
200
|
-
limit: MAXIMUM_MESSAGE_SIZE,
|
|
201
|
-
encoding: (_a = parsedCt.parameters.charset) !== null && _a !== void 0 ? _a : "utf-8"
|
|
202
|
-
});
|
|
203
|
-
rawMessage = JSON.parse(body.toString());
|
|
204
|
-
}
|
|
205
|
-
let messages;
|
|
206
|
-
if (Array.isArray(rawMessage)) {
|
|
207
|
-
messages = rawMessage.map((msg) => types.JSONRPCMessageSchema.parse(msg));
|
|
208
|
-
} else {
|
|
209
|
-
messages = [types.JSONRPCMessageSchema.parse(rawMessage)];
|
|
210
|
-
}
|
|
211
|
-
const isInitializationRequest = messages.some(types.isInitializeRequest);
|
|
212
|
-
if (isInitializationRequest) {
|
|
213
|
-
if (this._initialized && this.sessionId !== void 0) {
|
|
214
|
-
res.writeHead(400).end(JSON.stringify({
|
|
215
|
-
jsonrpc: "2.0",
|
|
216
|
-
error: {
|
|
217
|
-
code: -32600,
|
|
218
|
-
message: "Invalid Request: Server already initialized"
|
|
219
|
-
},
|
|
220
|
-
id: null
|
|
221
|
-
}));
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
if (messages.length > 1) {
|
|
225
|
-
res.writeHead(400).end(JSON.stringify({
|
|
226
|
-
jsonrpc: "2.0",
|
|
227
|
-
error: {
|
|
228
|
-
code: -32600,
|
|
229
|
-
message: "Invalid Request: Only one initialization request is allowed"
|
|
230
|
-
},
|
|
231
|
-
id: null
|
|
232
|
-
}));
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
this.sessionId = (_b = this.sessionIdGenerator) === null || _b === void 0 ? void 0 : _b.call(this);
|
|
236
|
-
this._initialized = true;
|
|
237
|
-
if (this.sessionId && this._onsessioninitialized) {
|
|
238
|
-
this._onsessioninitialized(this.sessionId);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
if (!isInitializationRequest) {
|
|
242
|
-
if (!this.validateSession(req, res)) {
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
if (!this.validateProtocolVersion(req, res)) {
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
const hasRequests = messages.some(types.isJSONRPCRequest);
|
|
250
|
-
if (!hasRequests) {
|
|
251
|
-
res.writeHead(202).end();
|
|
252
|
-
for (const message of messages) {
|
|
253
|
-
(_c = this.onmessage) === null || _c === void 0 ? void 0 : _c.call(this, message, { authInfo });
|
|
254
|
-
}
|
|
255
|
-
} else if (hasRequests) {
|
|
256
|
-
const streamId = node_crypto.randomUUID();
|
|
257
|
-
if (!this._enableJsonResponse) {
|
|
258
|
-
const headers = {
|
|
259
|
-
"Content-Type": "text/event-stream",
|
|
260
|
-
"Cache-Control": "no-cache",
|
|
261
|
-
Connection: "keep-alive"
|
|
262
|
-
};
|
|
263
|
-
if (this.sessionId !== void 0) {
|
|
264
|
-
headers["mcp-session-id"] = this.sessionId;
|
|
265
|
-
}
|
|
266
|
-
res.writeHead(200, headers);
|
|
267
|
-
}
|
|
268
|
-
for (const message of messages) {
|
|
269
|
-
if (types.isJSONRPCRequest(message)) {
|
|
270
|
-
this._streamMapping.set(streamId, res);
|
|
271
|
-
this._requestToStreamMapping.set(message.id, streamId);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
res.on("close", () => {
|
|
275
|
-
this._streamMapping.delete(streamId);
|
|
276
|
-
});
|
|
277
|
-
for (const message of messages) {
|
|
278
|
-
(_d = this.onmessage) === null || _d === void 0 ? void 0 : _d.call(this, message, { authInfo });
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
} catch (error) {
|
|
282
|
-
res.writeHead(400).end(JSON.stringify({
|
|
283
|
-
jsonrpc: "2.0",
|
|
284
|
-
error: {
|
|
285
|
-
code: -32700,
|
|
286
|
-
message: "Parse error",
|
|
287
|
-
data: String(error)
|
|
288
|
-
},
|
|
289
|
-
id: null
|
|
290
|
-
}));
|
|
291
|
-
(_e = this.onerror) === null || _e === void 0 ? void 0 : _e.call(this, error);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Handles DELETE requests to terminate sessions
|
|
296
|
-
*/
|
|
297
|
-
async handleDeleteRequest(req, res) {
|
|
298
|
-
if (!this.validateSession(req, res)) {
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
if (!this.validateProtocolVersion(req, res)) {
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
await this.close();
|
|
305
|
-
res.writeHead(200).end();
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Validates session ID for non-initialization requests
|
|
309
|
-
* Returns true if the session is valid, false otherwise
|
|
310
|
-
*/
|
|
311
|
-
validateSession(req, res) {
|
|
312
|
-
if (this.sessionIdGenerator === void 0) {
|
|
313
|
-
return true;
|
|
314
|
-
}
|
|
315
|
-
if (!this._initialized) {
|
|
316
|
-
res.writeHead(400).end(JSON.stringify({
|
|
317
|
-
jsonrpc: "2.0",
|
|
318
|
-
error: {
|
|
319
|
-
code: -32e3,
|
|
320
|
-
message: "Bad Request: Server not initialized"
|
|
321
|
-
},
|
|
322
|
-
id: null
|
|
323
|
-
}));
|
|
324
|
-
return false;
|
|
325
|
-
}
|
|
326
|
-
const sessionId = req.headers["mcp-session-id"];
|
|
327
|
-
if (!sessionId) {
|
|
328
|
-
res.writeHead(400).end(JSON.stringify({
|
|
329
|
-
jsonrpc: "2.0",
|
|
330
|
-
error: {
|
|
331
|
-
code: -32e3,
|
|
332
|
-
message: "Bad Request: Mcp-Session-Id header is required"
|
|
333
|
-
},
|
|
334
|
-
id: null
|
|
335
|
-
}));
|
|
336
|
-
return false;
|
|
337
|
-
} else if (Array.isArray(sessionId)) {
|
|
338
|
-
res.writeHead(400).end(JSON.stringify({
|
|
339
|
-
jsonrpc: "2.0",
|
|
340
|
-
error: {
|
|
341
|
-
code: -32e3,
|
|
342
|
-
message: "Bad Request: Mcp-Session-Id header must be a single value"
|
|
343
|
-
},
|
|
344
|
-
id: null
|
|
345
|
-
}));
|
|
346
|
-
return false;
|
|
347
|
-
} else if (sessionId !== this.sessionId) {
|
|
348
|
-
res.writeHead(404).end(JSON.stringify({
|
|
349
|
-
jsonrpc: "2.0",
|
|
350
|
-
error: {
|
|
351
|
-
code: -32001,
|
|
352
|
-
message: "Session not found"
|
|
353
|
-
},
|
|
354
|
-
id: null
|
|
355
|
-
}));
|
|
356
|
-
return false;
|
|
357
|
-
}
|
|
358
|
-
return true;
|
|
359
|
-
}
|
|
360
|
-
validateProtocolVersion(req, res) {
|
|
361
|
-
var _a;
|
|
362
|
-
let protocolVersion = (_a = req.headers["mcp-protocol-version"]) !== null && _a !== void 0 ? _a : types.DEFAULT_NEGOTIATED_PROTOCOL_VERSION;
|
|
363
|
-
if (Array.isArray(protocolVersion)) {
|
|
364
|
-
protocolVersion = protocolVersion[protocolVersion.length - 1];
|
|
365
|
-
}
|
|
366
|
-
if (!types.SUPPORTED_PROTOCOL_VERSIONS.includes(protocolVersion)) {
|
|
367
|
-
res.writeHead(400).end(JSON.stringify({
|
|
368
|
-
jsonrpc: "2.0",
|
|
369
|
-
error: {
|
|
370
|
-
code: -32e3,
|
|
371
|
-
message: `Bad Request: Unsupported protocol version (supported versions: ${types.SUPPORTED_PROTOCOL_VERSIONS.join(", ")})`
|
|
372
|
-
},
|
|
373
|
-
id: null
|
|
374
|
-
}));
|
|
375
|
-
return false;
|
|
376
|
-
}
|
|
377
|
-
return true;
|
|
378
|
-
}
|
|
379
|
-
async close() {
|
|
380
|
-
var _a;
|
|
381
|
-
this._streamMapping.forEach((response) => {
|
|
382
|
-
response.end();
|
|
383
|
-
});
|
|
384
|
-
this._streamMapping.clear();
|
|
385
|
-
this._requestResponseMap.clear();
|
|
386
|
-
(_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
387
|
-
}
|
|
388
|
-
async send(message, options) {
|
|
389
|
-
let requestId = options === null || options === void 0 ? void 0 : options.relatedRequestId;
|
|
390
|
-
if (types.isJSONRPCResponse(message) || types.isJSONRPCError(message)) {
|
|
391
|
-
requestId = message.id;
|
|
392
|
-
}
|
|
393
|
-
if (requestId === void 0) {
|
|
394
|
-
if (types.isJSONRPCResponse(message) || types.isJSONRPCError(message)) {
|
|
395
|
-
throw new Error("Cannot send a response on a standalone SSE stream unless resuming a previous client request");
|
|
396
|
-
}
|
|
397
|
-
const standaloneSse = this._streamMapping.get(this._standaloneSseStreamId);
|
|
398
|
-
if (standaloneSse === void 0) {
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
let eventId;
|
|
402
|
-
if (this._eventStore) {
|
|
403
|
-
eventId = await this._eventStore.storeEvent(this._standaloneSseStreamId, message);
|
|
404
|
-
}
|
|
405
|
-
this.writeSSEEvent(standaloneSse, message, eventId);
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
const streamId = this._requestToStreamMapping.get(requestId);
|
|
409
|
-
const response = this._streamMapping.get(streamId);
|
|
410
|
-
if (!streamId) {
|
|
411
|
-
throw new Error(`No connection established for request ID: ${String(requestId)}`);
|
|
412
|
-
}
|
|
413
|
-
if (!this._enableJsonResponse) {
|
|
414
|
-
let eventId;
|
|
415
|
-
if (this._eventStore) {
|
|
416
|
-
eventId = await this._eventStore.storeEvent(streamId, message);
|
|
417
|
-
}
|
|
418
|
-
if (response) {
|
|
419
|
-
this.writeSSEEvent(response, message, eventId);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
if (types.isJSONRPCResponse(message) || types.isJSONRPCError(message)) {
|
|
423
|
-
this._requestResponseMap.set(requestId, message);
|
|
424
|
-
const relatedIds = Array.from(this._requestToStreamMapping.entries()).filter(([_, streamId2]) => this._streamMapping.get(streamId2) === response).map(([id]) => id);
|
|
425
|
-
const allResponsesReady = relatedIds.every((id) => this._requestResponseMap.has(id));
|
|
426
|
-
if (allResponsesReady) {
|
|
427
|
-
if (!response) {
|
|
428
|
-
throw new Error(`No connection established for request ID: ${String(requestId)}`);
|
|
429
|
-
}
|
|
430
|
-
if (this._enableJsonResponse) {
|
|
431
|
-
const headers = {
|
|
432
|
-
"Content-Type": "application/json"
|
|
433
|
-
};
|
|
434
|
-
if (this.sessionId !== void 0) {
|
|
435
|
-
headers["mcp-session-id"] = this.sessionId;
|
|
436
|
-
}
|
|
437
|
-
const responses = relatedIds.map((id) => this._requestResponseMap.get(id));
|
|
438
|
-
response.writeHead(200, headers);
|
|
439
|
-
if (responses.length === 1) {
|
|
440
|
-
response.end(JSON.stringify(responses[0]));
|
|
441
|
-
} else {
|
|
442
|
-
response.end(JSON.stringify(responses));
|
|
443
|
-
}
|
|
444
|
-
} else {
|
|
445
|
-
response.end();
|
|
446
|
-
}
|
|
447
|
-
for (const id of relatedIds) {
|
|
448
|
-
this._requestResponseMap.delete(id);
|
|
449
|
-
this._requestToStreamMapping.delete(id);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
exports.StreamableHTTPServerTransport = StreamableHTTPServerTransport;
|
|
456
|
-
//# sourceMappingURL=streamableHttp-DsXlAnqJ.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streamableHttp-DsXlAnqJ.cjs","sources":["../node_modules/.pnpm/@modelcontextprotocol+sdk@1.13.1/node_modules/@modelcontextprotocol/sdk/dist/esm/server/streamableHttp.js"],"sourcesContent":["import { isInitializeRequest, isJSONRPCError, isJSONRPCRequest, isJSONRPCResponse, JSONRPCMessageSchema, SUPPORTED_PROTOCOL_VERSIONS, DEFAULT_NEGOTIATED_PROTOCOL_VERSION } from \"../types.js\";\nimport getRawBody from \"raw-body\";\nimport contentType from \"content-type\";\nimport { randomUUID } from \"node:crypto\";\nconst MAXIMUM_MESSAGE_SIZE = \"4mb\";\n/**\n * Server transport for Streamable HTTP: this implements the MCP Streamable HTTP transport specification.\n * It supports both SSE streaming and direct HTTP responses.\n *\n * Usage example:\n *\n * ```typescript\n * // Stateful mode - server sets the session ID\n * const statefulTransport = new StreamableHTTPServerTransport({\n * sessionIdGenerator: () => randomUUID(),\n * });\n *\n * // Stateless mode - explicitly set session ID to undefined\n * const statelessTransport = new StreamableHTTPServerTransport({\n * sessionIdGenerator: undefined,\n * });\n *\n * // Using with pre-parsed request body\n * app.post('/mcp', (req, res) => {\n * transport.handleRequest(req, res, req.body);\n * });\n * ```\n *\n * In stateful mode:\n * - Session ID is generated and included in response headers\n * - Session ID is always included in initialization responses\n * - Requests with invalid session IDs are rejected with 404 Not Found\n * - Non-initialization requests without a session ID are rejected with 400 Bad Request\n * - State is maintained in-memory (connections, message history)\n *\n * In stateless mode:\n * - No Session ID is included in any responses\n * - No session validation is performed\n */\nexport class StreamableHTTPServerTransport {\n constructor(options) {\n var _a;\n this._started = false;\n this._streamMapping = new Map();\n this._requestToStreamMapping = new Map();\n this._requestResponseMap = new Map();\n this._initialized = false;\n this._enableJsonResponse = false;\n this._standaloneSseStreamId = '_GET_stream';\n this.sessionIdGenerator = options.sessionIdGenerator;\n this._enableJsonResponse = (_a = options.enableJsonResponse) !== null && _a !== void 0 ? _a : false;\n this._eventStore = options.eventStore;\n this._onsessioninitialized = options.onsessioninitialized;\n }\n /**\n * Starts the transport. This is required by the Transport interface but is a no-op\n * for the Streamable HTTP transport as connections are managed per-request.\n */\n async start() {\n if (this._started) {\n throw new Error(\"Transport already started\");\n }\n this._started = true;\n }\n /**\n * Handles an incoming HTTP request, whether GET or POST\n */\n async handleRequest(req, res, parsedBody) {\n if (req.method === \"POST\") {\n await this.handlePostRequest(req, res, parsedBody);\n }\n else if (req.method === \"GET\") {\n await this.handleGetRequest(req, res);\n }\n else if (req.method === \"DELETE\") {\n await this.handleDeleteRequest(req, res);\n }\n else {\n await this.handleUnsupportedRequest(res);\n }\n }\n /**\n * Handles GET requests for SSE stream\n */\n async handleGetRequest(req, res) {\n // The client MUST include an Accept header, listing text/event-stream as a supported content type.\n const acceptHeader = req.headers.accept;\n if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes(\"text/event-stream\"))) {\n res.writeHead(406).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Not Acceptable: Client must accept text/event-stream\"\n },\n id: null\n }));\n return;\n }\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it\n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n if (!this.validateSession(req, res)) {\n return;\n }\n if (!this.validateProtocolVersion(req, res)) {\n return;\n }\n // Handle resumability: check for Last-Event-ID header\n if (this._eventStore) {\n const lastEventId = req.headers['last-event-id'];\n if (lastEventId) {\n await this.replayEvents(lastEventId, res);\n return;\n }\n }\n // The server MUST either return Content-Type: text/event-stream in response to this HTTP GET,\n // or else return HTTP 405 Method Not Allowed\n const headers = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n };\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n headers[\"mcp-session-id\"] = this.sessionId;\n }\n // Check if there's already an active standalone SSE stream for this session\n if (this._streamMapping.get(this._standaloneSseStreamId) !== undefined) {\n // Only one GET SSE stream is allowed per session\n res.writeHead(409).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Conflict: Only one SSE stream is allowed per session\"\n },\n id: null\n }));\n return;\n }\n // We need to send headers immediately as messages will arrive much later,\n // otherwise the client will just wait for the first message\n res.writeHead(200, headers).flushHeaders();\n // Assign the response to the standalone SSE stream\n this._streamMapping.set(this._standaloneSseStreamId, res);\n // Set up close handler for client disconnects\n res.on(\"close\", () => {\n this._streamMapping.delete(this._standaloneSseStreamId);\n });\n }\n /**\n * Replays events that would have been sent after the specified event ID\n * Only used when resumability is enabled\n */\n async replayEvents(lastEventId, res) {\n var _a, _b;\n if (!this._eventStore) {\n return;\n }\n try {\n const headers = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n };\n if (this.sessionId !== undefined) {\n headers[\"mcp-session-id\"] = this.sessionId;\n }\n res.writeHead(200, headers).flushHeaders();\n const streamId = await ((_a = this._eventStore) === null || _a === void 0 ? void 0 : _a.replayEventsAfter(lastEventId, {\n send: async (eventId, message) => {\n var _a;\n if (!this.writeSSEEvent(res, message, eventId)) {\n (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, new Error(\"Failed replay events\"));\n res.end();\n }\n }\n }));\n this._streamMapping.set(streamId, res);\n }\n catch (error) {\n (_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);\n }\n }\n /**\n * Writes an event to the SSE stream with proper formatting\n */\n writeSSEEvent(res, message, eventId) {\n let eventData = `event: message\\n`;\n // Include event ID if provided - this is important for resumability\n if (eventId) {\n eventData += `id: ${eventId}\\n`;\n }\n eventData += `data: ${JSON.stringify(message)}\\n\\n`;\n return res.write(eventData);\n }\n /**\n * Handles unsupported requests (PUT, PATCH, etc.)\n */\n async handleUnsupportedRequest(res) {\n res.writeHead(405, {\n \"Allow\": \"GET, POST, DELETE\"\n }).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Method not allowed.\"\n },\n id: null\n }));\n }\n /**\n * Handles POST requests containing JSON-RPC messages\n */\n async handlePostRequest(req, res, parsedBody) {\n var _a, _b, _c, _d, _e;\n try {\n // Validate the Accept header\n const acceptHeader = req.headers.accept;\n // The client MUST include an Accept header, listing both application/json and text/event-stream as supported content types.\n if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes(\"application/json\")) || !acceptHeader.includes(\"text/event-stream\")) {\n res.writeHead(406).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Not Acceptable: Client must accept both application/json and text/event-stream\"\n },\n id: null\n }));\n return;\n }\n const ct = req.headers[\"content-type\"];\n if (!ct || !ct.includes(\"application/json\")) {\n res.writeHead(415).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Unsupported Media Type: Content-Type must be application/json\"\n },\n id: null\n }));\n return;\n }\n const authInfo = req.auth;\n let rawMessage;\n if (parsedBody !== undefined) {\n rawMessage = parsedBody;\n }\n else {\n const parsedCt = contentType.parse(ct);\n const body = await getRawBody(req, {\n limit: MAXIMUM_MESSAGE_SIZE,\n encoding: (_a = parsedCt.parameters.charset) !== null && _a !== void 0 ? _a : \"utf-8\",\n });\n rawMessage = JSON.parse(body.toString());\n }\n let messages;\n // handle batch and single messages\n if (Array.isArray(rawMessage)) {\n messages = rawMessage.map(msg => JSONRPCMessageSchema.parse(msg));\n }\n else {\n messages = [JSONRPCMessageSchema.parse(rawMessage)];\n }\n // Check if this is an initialization request\n // https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/lifecycle/\n const isInitializationRequest = messages.some(isInitializeRequest);\n if (isInitializationRequest) {\n // If it's a server with session management and the session ID is already set we should reject the request\n // to avoid re-initialization.\n if (this._initialized && this.sessionId !== undefined) {\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32600,\n message: \"Invalid Request: Server already initialized\"\n },\n id: null\n }));\n return;\n }\n if (messages.length > 1) {\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32600,\n message: \"Invalid Request: Only one initialization request is allowed\"\n },\n id: null\n }));\n return;\n }\n this.sessionId = (_b = this.sessionIdGenerator) === null || _b === void 0 ? void 0 : _b.call(this);\n this._initialized = true;\n // If we have a session ID and an onsessioninitialized handler, call it immediately\n // This is needed in cases where the server needs to keep track of multiple sessions\n if (this.sessionId && this._onsessioninitialized) {\n this._onsessioninitialized(this.sessionId);\n }\n }\n if (!isInitializationRequest) {\n // If an Mcp-Session-Id is returned by the server during initialization,\n // clients using the Streamable HTTP transport MUST include it \n // in the Mcp-Session-Id header on all of their subsequent HTTP requests.\n if (!this.validateSession(req, res)) {\n return;\n }\n // Mcp-Protocol-Version header is required for all requests after initialization.\n if (!this.validateProtocolVersion(req, res)) {\n return;\n }\n }\n // check if it contains requests\n const hasRequests = messages.some(isJSONRPCRequest);\n if (!hasRequests) {\n // if it only contains notifications or responses, return 202\n res.writeHead(202).end();\n // handle each message\n for (const message of messages) {\n (_c = this.onmessage) === null || _c === void 0 ? void 0 : _c.call(this, message, { authInfo });\n }\n }\n else if (hasRequests) {\n // The default behavior is to use SSE streaming\n // but in some cases server will return JSON responses\n const streamId = randomUUID();\n if (!this._enableJsonResponse) {\n const headers = {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n };\n // After initialization, always include the session ID if we have one\n if (this.sessionId !== undefined) {\n headers[\"mcp-session-id\"] = this.sessionId;\n }\n res.writeHead(200, headers);\n }\n // Store the response for this request to send messages back through this connection\n // We need to track by request ID to maintain the connection\n for (const message of messages) {\n if (isJSONRPCRequest(message)) {\n this._streamMapping.set(streamId, res);\n this._requestToStreamMapping.set(message.id, streamId);\n }\n }\n // Set up close handler for client disconnects\n res.on(\"close\", () => {\n this._streamMapping.delete(streamId);\n });\n // handle each message\n for (const message of messages) {\n (_d = this.onmessage) === null || _d === void 0 ? void 0 : _d.call(this, message, { authInfo });\n }\n // The server SHOULD NOT close the SSE stream before sending all JSON-RPC responses\n // This will be handled by the send() method when responses are ready\n }\n }\n catch (error) {\n // return JSON-RPC formatted error\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32700,\n message: \"Parse error\",\n data: String(error)\n },\n id: null\n }));\n (_e = this.onerror) === null || _e === void 0 ? void 0 : _e.call(this, error);\n }\n }\n /**\n * Handles DELETE requests to terminate sessions\n */\n async handleDeleteRequest(req, res) {\n if (!this.validateSession(req, res)) {\n return;\n }\n if (!this.validateProtocolVersion(req, res)) {\n return;\n }\n await this.close();\n res.writeHead(200).end();\n }\n /**\n * Validates session ID for non-initialization requests\n * Returns true if the session is valid, false otherwise\n */\n validateSession(req, res) {\n if (this.sessionIdGenerator === undefined) {\n // If the sessionIdGenerator ID is not set, the session management is disabled\n // and we don't need to validate the session ID\n return true;\n }\n if (!this._initialized) {\n // If the server has not been initialized yet, reject all requests\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Server not initialized\"\n },\n id: null\n }));\n return false;\n }\n const sessionId = req.headers[\"mcp-session-id\"];\n if (!sessionId) {\n // Non-initialization requests without a session ID should return 400 Bad Request\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Mcp-Session-Id header is required\"\n },\n id: null\n }));\n return false;\n }\n else if (Array.isArray(sessionId)) {\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Bad Request: Mcp-Session-Id header must be a single value\"\n },\n id: null\n }));\n return false;\n }\n else if (sessionId !== this.sessionId) {\n // Reject requests with invalid session ID with 404 Not Found\n res.writeHead(404).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32001,\n message: \"Session not found\"\n },\n id: null\n }));\n return false;\n }\n return true;\n }\n validateProtocolVersion(req, res) {\n var _a;\n let protocolVersion = (_a = req.headers[\"mcp-protocol-version\"]) !== null && _a !== void 0 ? _a : DEFAULT_NEGOTIATED_PROTOCOL_VERSION;\n if (Array.isArray(protocolVersion)) {\n protocolVersion = protocolVersion[protocolVersion.length - 1];\n }\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(protocolVersion)) {\n res.writeHead(400).end(JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: `Bad Request: Unsupported protocol version (supported versions: ${SUPPORTED_PROTOCOL_VERSIONS.join(\", \")})`\n },\n id: null\n }));\n return false;\n }\n return true;\n }\n async close() {\n var _a;\n // Close all SSE connections\n this._streamMapping.forEach((response) => {\n response.end();\n });\n this._streamMapping.clear();\n // Clear any pending responses\n this._requestResponseMap.clear();\n (_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);\n }\n async send(message, options) {\n let requestId = options === null || options === void 0 ? void 0 : options.relatedRequestId;\n if (isJSONRPCResponse(message) || isJSONRPCError(message)) {\n // If the message is a response, use the request ID from the message\n requestId = message.id;\n }\n // Check if this message should be sent on the standalone SSE stream (no request ID)\n // Ignore notifications from tools (which have relatedRequestId set)\n // Those will be sent via dedicated response SSE streams\n if (requestId === undefined) {\n // For standalone SSE streams, we can only send requests and notifications\n if (isJSONRPCResponse(message) || isJSONRPCError(message)) {\n throw new Error(\"Cannot send a response on a standalone SSE stream unless resuming a previous client request\");\n }\n const standaloneSse = this._streamMapping.get(this._standaloneSseStreamId);\n if (standaloneSse === undefined) {\n // The spec says the server MAY send messages on the stream, so it's ok to discard if no stream\n return;\n }\n // Generate and store event ID if event store is provided\n let eventId;\n if (this._eventStore) {\n // Stores the event and gets the generated event ID\n eventId = await this._eventStore.storeEvent(this._standaloneSseStreamId, message);\n }\n // Send the message to the standalone SSE stream\n this.writeSSEEvent(standaloneSse, message, eventId);\n return;\n }\n // Get the response for this request\n const streamId = this._requestToStreamMapping.get(requestId);\n const response = this._streamMapping.get(streamId);\n if (!streamId) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`);\n }\n if (!this._enableJsonResponse) {\n // For SSE responses, generate event ID if event store is provided\n let eventId;\n if (this._eventStore) {\n eventId = await this._eventStore.storeEvent(streamId, message);\n }\n if (response) {\n // Write the event to the response stream\n this.writeSSEEvent(response, message, eventId);\n }\n }\n if (isJSONRPCResponse(message) || isJSONRPCError(message)) {\n this._requestResponseMap.set(requestId, message);\n const relatedIds = Array.from(this._requestToStreamMapping.entries())\n .filter(([_, streamId]) => this._streamMapping.get(streamId) === response)\n .map(([id]) => id);\n // Check if we have responses for all requests using this connection\n const allResponsesReady = relatedIds.every(id => this._requestResponseMap.has(id));\n if (allResponsesReady) {\n if (!response) {\n throw new Error(`No connection established for request ID: ${String(requestId)}`);\n }\n if (this._enableJsonResponse) {\n // All responses ready, send as JSON\n const headers = {\n 'Content-Type': 'application/json',\n };\n if (this.sessionId !== undefined) {\n headers['mcp-session-id'] = this.sessionId;\n }\n const responses = relatedIds\n .map(id => this._requestResponseMap.get(id));\n response.writeHead(200, headers);\n if (responses.length === 1) {\n response.end(JSON.stringify(responses[0]));\n }\n else {\n response.end(JSON.stringify(responses));\n }\n }\n else {\n // End the SSE stream\n response.end();\n }\n // Clean up\n for (const id of relatedIds) {\n this._requestResponseMap.delete(id);\n this._requestToStreamMapping.delete(id);\n }\n }\n }\n }\n}\n//# sourceMappingURL=streamableHttp.js.map"],"names":["_a","contentType","getRawBody","JSONRPCMessageSchema","isInitializeRequest","isJSONRPCRequest","randomUUID","DEFAULT_NEGOTIATED_PROTOCOL_VERSION","SUPPORTED_PROTOCOL_VERSIONS","isJSONRPCResponse","isJSONRPCError","streamId"],"mappings":"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","x_google_ignoreList":[0]}
|