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