(resource: McpResource)
| 183 | }; |
| 184 | |
| 185 | const modernHandlerFor = (resource: McpResource): McpHttpHandler => { |
| 186 | const key = mcpResourceKey(resource); |
| 187 | const cached = modernHandlers.get(key); |
| 188 | if (cached) return cached; |
| 189 | |
| 190 | const handler = createMcpHandler( |
| 191 | (context) => { |
| 192 | const request = context.requestInfo; |
| 193 | if (!request) { |
| 194 | // oxlint-disable-next-line executor/no-effect-escape-hatch -- boundary: the third-party McpServerFactory Promise contract has no typed failure channel; missing documented request context is an SDK defect |
| 195 | return Effect.runPromise(Effect.die("Modern MCP request context has no request")); |
| 196 | } |
| 197 | const parsedBody = modernRequestBodies.get(request); |
| 198 | return Effect.runPromise( |
| 199 | Effect.gen(function* () { |
| 200 | const resourceConfig = yield* Effect.promise(() => configForResource(resource)); |
| 201 | const clientCapabilities = yield* clientCapabilitiesFromRequest(request); |
| 202 | const requestStateBinding = yield* Effect.promise(() => |
| 203 | mcpRequestStateBindingFromBody({ |
| 204 | body: parsedBody, |
| 205 | principal: "local", |
| 206 | resource, |
| 207 | }), |
| 208 | ); |
| 209 | const server = yield* buildMcpServer({ |
| 210 | ...resourceConfig.config, |
| 211 | artifactsEnabled: readArtifactsEnabled(request), |
| 212 | appsEnabled: appsEnabledForClientCapabilities(clientCapabilities), |
| 213 | requestStateSigningKey: signingKey(), |
| 214 | requestStatePrincipal: "local", |
| 215 | ...(requestStateBinding === null ? {} : { requestStateBinding }), |
| 216 | }); |
| 217 | if (resourceConfig.close) { |
| 218 | const closeServer = server.close.bind(server); |
| 219 | const closeConfig = resourceConfig.close; |
| 220 | let closed = false; |
| 221 | server.close = async () => { |
| 222 | if (closed) return; |
| 223 | closed = true; |
| 224 | await ignoreClose(closeServer); |
| 225 | await ignoreClose(closeConfig); |
| 226 | }; |
| 227 | } |
| 228 | return server; |
| 229 | }), |
| 230 | ); |
| 231 | }, |
| 232 | { legacy: "reject" }, |
| 233 | ); |
| 234 | modernHandlers.set(key, handler); |
| 235 | return handler; |
| 236 | }; |
| 237 | |
| 238 | return { |
| 239 | handleRequest: async (request) => { |
no test coverage detected