(
principal: Principal,
resource: McpResource,
request: Request,
)
| 245 | |
| 246 | /** Open a new session: build the server, connect a transport, drive the request. */ |
| 247 | const create = ( |
| 248 | principal: Principal, |
| 249 | resource: McpResource, |
| 250 | request: Request, |
| 251 | ): Effect.Effect<McpDispatchResult> => { |
| 252 | let createdSessionId: string | null = null; |
| 253 | return buildServer(principal, { |
| 254 | ...buildOptionsFor(request, () => createdSessionId), |
| 255 | resource, |
| 256 | }).pipe( |
| 257 | Effect.flatMap(({ mcpServer, engine }) => |
| 258 | Effect.gen(function* () { |
| 259 | const transport = new WebStandardStreamableHTTPServerTransport({ |
| 260 | sessionIdGenerator: () => crypto.randomUUID(), |
| 261 | enableJsonResponse: true, |
| 262 | onsessioninitialized: (sid) => { |
| 263 | createdSessionId = sid; |
| 264 | transports.set(sid, transport); |
| 265 | servers.set(sid, mcpServer); |
| 266 | owners.set(sid, { principal, resource }); |
| 267 | engines.set(sid, engine); |
| 268 | }, |
| 269 | onsessionclosed: (sid) => void dispose(sid, { server: true }), |
| 270 | }); |
| 271 | transport.onclose = () => { |
| 272 | const sid = transport.sessionId; |
| 273 | if (sid) void dispose(sid, { server: true }); |
| 274 | }; |
| 275 | yield* Effect.promise(() => mcpServer.connect(transport)); |
| 276 | // The session id is minted on the first (initialize) request, so we |
| 277 | // drive `handleRequest` here; if no id results we close eagerly. |
| 278 | return yield* runHandleRequest(transport, request, () => { |
| 279 | void ignoreClose(() => transport.close()); |
| 280 | void ignoreClose(() => mcpServer.close()); |
| 281 | }); |
| 282 | }), |
| 283 | ), |
| 284 | // A build failure has nowhere typed to go in the envelope; render a 500. |
| 285 | Effect.catchTag("McpEngineBuildError", () => |
| 286 | Effect.succeed(jsonRpcError(500, -32603, "Internal server error")), |
| 287 | ), |
| 288 | ); |
| 289 | }; |
| 290 | |
| 291 | const store: McpSessionStore["Service"] = { |
| 292 | dispatch: ({ request, principal, resource, sessionId }: McpDispatchInput) => |
no test coverage detected