@modelcontextprotocol/sdk 1.18.1 → 1.19.1
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 +766 -738
- package/dist/cjs/cli.js +35 -37
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/client/auth.d.ts +12 -12
- package/dist/cjs/client/auth.d.ts.map +1 -1
- package/dist/cjs/client/auth.js +76 -83
- package/dist/cjs/client/auth.js.map +1 -1
- package/dist/cjs/client/index.d.ts +186 -123
- package/dist/cjs/client/index.d.ts.map +1 -1
- package/dist/cjs/client/index.js +40 -41
- package/dist/cjs/client/index.js.map +1 -1
- package/dist/cjs/client/middleware.d.ts +2 -2
- package/dist/cjs/client/middleware.d.ts.map +1 -1
- package/dist/cjs/client/middleware.js +22 -27
- package/dist/cjs/client/middleware.js.map +1 -1
- package/dist/cjs/client/sse.d.ts +4 -4
- package/dist/cjs/client/sse.d.ts.map +1 -1
- package/dist/cjs/client/sse.js +34 -21
- package/dist/cjs/client/sse.js.map +1 -1
- package/dist/cjs/client/stdio.d.ts +4 -4
- package/dist/cjs/client/stdio.d.ts.map +1 -1
- package/dist/cjs/client/stdio.js +32 -32
- package/dist/cjs/client/stdio.js.map +1 -1
- package/dist/cjs/client/streamableHttp.d.ts +7 -6
- package/dist/cjs/client/streamableHttp.d.ts.map +1 -1
- package/dist/cjs/client/streamableHttp.js +55 -38
- package/dist/cjs/client/streamableHttp.js.map +1 -1
- package/dist/cjs/client/websocket.d.ts +2 -2
- package/dist/cjs/client/websocket.d.ts.map +1 -1
- package/dist/cjs/client/websocket.js +5 -7
- package/dist/cjs/client/websocket.js.map +1 -1
- package/dist/cjs/examples/client/multipleClientsParallel.js +2 -2
- package/dist/cjs/examples/client/multipleClientsParallel.js.map +1 -1
- package/dist/cjs/examples/client/parallelToolCallsClient.js +6 -5
- package/dist/cjs/examples/client/parallelToolCallsClient.js.map +1 -1
- package/dist/cjs/examples/client/simpleOAuthClient.js +15 -13
- package/dist/cjs/examples/client/simpleOAuthClient.js.map +1 -1
- package/dist/cjs/examples/client/simpleStreamableHttp.js +15 -11
- package/dist/cjs/examples/client/simpleStreamableHttp.js.map +1 -1
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.js +2 -2
- package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.js.map +1 -1
- package/dist/cjs/examples/server/demoInMemoryOAuthProvider.d.ts +1 -1
- package/dist/cjs/examples/server/demoInMemoryOAuthProvider.d.ts.map +1 -1
- package/dist/cjs/examples/server/demoInMemoryOAuthProvider.js +22 -16
- package/dist/cjs/examples/server/demoInMemoryOAuthProvider.js.map +1 -1
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.js +18 -18
- package/dist/cjs/examples/server/jsonResponseStreamableHttp.js.map +1 -1
- package/dist/cjs/examples/server/mcpServerOutputSchema.js +19 -17
- package/dist/cjs/examples/server/mcpServerOutputSchema.js.map +1 -1
- package/dist/cjs/examples/server/simpleSseServer.js +8 -8
- package/dist/cjs/examples/server/simpleSseServer.js.map +1 -1
- package/dist/cjs/examples/server/simpleStatelessStreamableHttp.js +22 -22
- package/dist/cjs/examples/server/simpleStatelessStreamableHttp.js.map +1 -1
- package/dist/cjs/examples/server/simpleStreamableHttp.js +78 -78
- package/dist/cjs/examples/server/simpleStreamableHttp.js.map +1 -1
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.js +18 -18
- package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.js.map +1 -1
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.js +8 -8
- package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.js.map +1 -1
- package/dist/cjs/examples/server/toolWithSampleServer.js +19 -19
- package/dist/cjs/examples/server/toolWithSampleServer.js.map +1 -1
- package/dist/cjs/examples/shared/inMemoryEventStore.d.ts.map +1 -1
- package/dist/cjs/examples/shared/inMemoryEventStore.js.map +1 -1
- package/dist/cjs/inMemory.d.ts +3 -3
- package/dist/cjs/inMemory.d.ts.map +1 -1
- package/dist/cjs/inMemory.js +1 -1
- package/dist/cjs/inMemory.js.map +1 -1
- package/dist/cjs/server/auth/clients.d.ts +2 -2
- package/dist/cjs/server/auth/clients.d.ts.map +1 -1
- package/dist/cjs/server/auth/errors.d.ts +1 -1
- package/dist/cjs/server/auth/errors.d.ts.map +1 -1
- package/dist/cjs/server/auth/errors.js +17 -17
- package/dist/cjs/server/auth/errors.js.map +1 -1
- package/dist/cjs/server/auth/handlers/authorize.d.ts +3 -3
- package/dist/cjs/server/auth/handlers/authorize.d.ts.map +1 -1
- package/dist/cjs/server/auth/handlers/authorize.js +21 -18
- package/dist/cjs/server/auth/handlers/authorize.js.map +1 -1
- package/dist/cjs/server/auth/handlers/metadata.d.ts +2 -2
- package/dist/cjs/server/auth/handlers/metadata.js +1 -1
- package/dist/cjs/server/auth/handlers/metadata.js.map +1 -1
- package/dist/cjs/server/auth/handlers/register.d.ts +4 -4
- package/dist/cjs/server/auth/handlers/register.d.ts.map +1 -1
- package/dist/cjs/server/auth/handlers/register.js +7 -9
- package/dist/cjs/server/auth/handlers/register.js.map +1 -1
- package/dist/cjs/server/auth/handlers/revoke.d.ts +4 -4
- package/dist/cjs/server/auth/handlers/revoke.d.ts.map +1 -1
- package/dist/cjs/server/auth/handlers/revoke.js +9 -9
- package/dist/cjs/server/auth/handlers/revoke.js.map +1 -1
- package/dist/cjs/server/auth/handlers/token.d.ts +3 -3
- package/dist/cjs/server/auth/handlers/token.d.ts.map +1 -1
- package/dist/cjs/server/auth/handlers/token.js +14 -14
- package/dist/cjs/server/auth/handlers/token.js.map +1 -1
- package/dist/cjs/server/auth/middleware/allowedMethods.d.ts +1 -1
- package/dist/cjs/server/auth/middleware/allowedMethods.d.ts.map +1 -1
- package/dist/cjs/server/auth/middleware/allowedMethods.js +1 -3
- package/dist/cjs/server/auth/middleware/allowedMethods.js.map +1 -1
- package/dist/cjs/server/auth/middleware/bearerAuth.d.ts +4 -4
- package/dist/cjs/server/auth/middleware/bearerAuth.d.ts.map +1 -1
- package/dist/cjs/server/auth/middleware/bearerAuth.js +7 -7
- package/dist/cjs/server/auth/middleware/bearerAuth.js.map +1 -1
- package/dist/cjs/server/auth/middleware/clientAuth.d.ts +4 -4
- package/dist/cjs/server/auth/middleware/clientAuth.d.ts.map +1 -1
- package/dist/cjs/server/auth/middleware/clientAuth.js +6 -6
- package/dist/cjs/server/auth/middleware/clientAuth.js.map +1 -1
- package/dist/cjs/server/auth/provider.d.ts +4 -4
- package/dist/cjs/server/auth/provider.d.ts.map +1 -1
- package/dist/cjs/server/auth/providers/proxyProvider.d.ts +10 -10
- package/dist/cjs/server/auth/providers/proxyProvider.d.ts.map +1 -1
- package/dist/cjs/server/auth/providers/proxyProvider.js +34 -34
- package/dist/cjs/server/auth/providers/proxyProvider.js.map +1 -1
- package/dist/cjs/server/auth/router.d.ts +18 -13
- package/dist/cjs/server/auth/router.d.ts.map +1 -1
- package/dist/cjs/server/auth/router.js +27 -24
- package/dist/cjs/server/auth/router.js.map +1 -1
- package/dist/cjs/server/auth/types.d.ts +1 -1
- package/dist/cjs/server/auth/types.d.ts.map +1 -1
- package/dist/cjs/server/completable.d.ts +5 -5
- package/dist/cjs/server/completable.d.ts.map +1 -1
- package/dist/cjs/server/completable.js +5 -5
- package/dist/cjs/server/completable.js.map +1 -1
- package/dist/cjs/server/index.d.ts +9 -9
- package/dist/cjs/server/index.d.ts.map +1 -1
- package/dist/cjs/server/index.js +38 -42
- package/dist/cjs/server/index.js.map +1 -1
- package/dist/cjs/server/mcp.d.ts +8 -8
- package/dist/cjs/server/mcp.d.ts.map +1 -1
- package/dist/cjs/server/mcp.js +87 -82
- package/dist/cjs/server/mcp.js.map +1 -1
- package/dist/cjs/server/sse.d.ts +4 -4
- package/dist/cjs/server/sse.d.ts.map +1 -1
- package/dist/cjs/server/sse.js +16 -15
- package/dist/cjs/server/sse.js.map +1 -1
- package/dist/cjs/server/stdio.d.ts +3 -3
- package/dist/cjs/server/stdio.d.ts.map +1 -1
- package/dist/cjs/server/stdio.js +7 -7
- package/dist/cjs/server/stdio.js.map +1 -1
- package/dist/cjs/server/streamableHttp.d.ts +5 -5
- package/dist/cjs/server/streamableHttp.d.ts.map +1 -1
- package/dist/cjs/server/streamableHttp.js +63 -64
- package/dist/cjs/server/streamableHttp.js.map +1 -1
- package/dist/cjs/shared/auth-utils.d.ts.map +1 -1
- package/dist/cjs/shared/auth-utils.js +3 -3
- package/dist/cjs/shared/auth-utils.js.map +1 -1
- package/dist/cjs/shared/auth.d.ts +1 -1
- package/dist/cjs/shared/auth.d.ts.map +1 -1
- package/dist/cjs/shared/auth.js +42 -46
- package/dist/cjs/shared/auth.js.map +1 -1
- package/dist/cjs/shared/metadataUtils.d.ts +1 -1
- package/dist/cjs/shared/metadataUtils.js.map +1 -1
- package/dist/cjs/shared/protocol.d.ts +6 -6
- package/dist/cjs/shared/protocol.d.ts.map +1 -1
- package/dist/cjs/shared/protocol.js +42 -43
- package/dist/cjs/shared/protocol.js.map +1 -1
- package/dist/cjs/shared/stdio.d.ts +1 -1
- package/dist/cjs/shared/stdio.d.ts.map +1 -1
- package/dist/cjs/shared/stdio.js +3 -3
- package/dist/cjs/shared/stdio.js.map +1 -1
- package/dist/cjs/shared/transport.d.ts +1 -1
- package/dist/cjs/shared/transport.d.ts.map +1 -1
- package/dist/cjs/shared/uriTemplate.d.ts.map +1 -1
- package/dist/cjs/shared/uriTemplate.js +69 -71
- package/dist/cjs/shared/uriTemplate.js.map +1 -1
- package/dist/cjs/types.d.ts +9650 -4790
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/types.js +199 -234
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/cli.js +45 -47
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/client/auth.d.ts +12 -12
- package/dist/esm/client/auth.d.ts.map +1 -1
- package/dist/esm/client/auth.js +82 -89
- package/dist/esm/client/auth.js.map +1 -1
- package/dist/esm/client/index.d.ts +186 -123
- package/dist/esm/client/index.d.ts.map +1 -1
- package/dist/esm/client/index.js +43 -44
- package/dist/esm/client/index.js.map +1 -1
- package/dist/esm/client/middleware.d.ts +2 -2
- package/dist/esm/client/middleware.d.ts.map +1 -1
- package/dist/esm/client/middleware.js +23 -28
- package/dist/esm/client/middleware.js.map +1 -1
- package/dist/esm/client/sse.d.ts +4 -4
- package/dist/esm/client/sse.d.ts.map +1 -1
- package/dist/esm/client/sse.js +37 -24
- package/dist/esm/client/sse.js.map +1 -1
- package/dist/esm/client/stdio.d.ts +4 -4
- package/dist/esm/client/stdio.d.ts.map +1 -1
- package/dist/esm/client/stdio.js +36 -36
- package/dist/esm/client/stdio.js.map +1 -1
- package/dist/esm/client/streamableHttp.d.ts +7 -6
- package/dist/esm/client/streamableHttp.d.ts.map +1 -1
- package/dist/esm/client/streamableHttp.js +58 -41
- package/dist/esm/client/streamableHttp.js.map +1 -1
- package/dist/esm/client/websocket.d.ts +2 -2
- package/dist/esm/client/websocket.d.ts.map +1 -1
- package/dist/esm/client/websocket.js +6 -8
- package/dist/esm/client/websocket.js.map +1 -1
- package/dist/esm/examples/client/multipleClientsParallel.js +3 -3
- package/dist/esm/examples/client/multipleClientsParallel.js.map +1 -1
- package/dist/esm/examples/client/parallelToolCallsClient.js +7 -6
- package/dist/esm/examples/client/parallelToolCallsClient.js.map +1 -1
- package/dist/esm/examples/client/simpleOAuthClient.js +15 -13
- package/dist/esm/examples/client/simpleOAuthClient.js.map +1 -1
- package/dist/esm/examples/client/simpleStreamableHttp.js +17 -13
- package/dist/esm/examples/client/simpleStreamableHttp.js.map +1 -1
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.js +3 -3
- package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.js.map +1 -1
- package/dist/esm/examples/server/demoInMemoryOAuthProvider.d.ts +1 -1
- package/dist/esm/examples/server/demoInMemoryOAuthProvider.d.ts.map +1 -1
- package/dist/esm/examples/server/demoInMemoryOAuthProvider.js +23 -17
- package/dist/esm/examples/server/demoInMemoryOAuthProvider.js.map +1 -1
- package/dist/esm/examples/server/jsonResponseStreamableHttp.js +18 -18
- package/dist/esm/examples/server/jsonResponseStreamableHttp.js.map +1 -1
- package/dist/esm/examples/server/mcpServerOutputSchema.js +22 -20
- package/dist/esm/examples/server/mcpServerOutputSchema.js.map +1 -1
- package/dist/esm/examples/server/simpleSseServer.js +8 -8
- package/dist/esm/examples/server/simpleSseServer.js.map +1 -1
- package/dist/esm/examples/server/simpleStatelessStreamableHttp.js +22 -22
- package/dist/esm/examples/server/simpleStatelessStreamableHttp.js.map +1 -1
- package/dist/esm/examples/server/simpleStreamableHttp.js +78 -78
- package/dist/esm/examples/server/simpleStreamableHttp.js.map +1 -1
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.js +19 -19
- package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.js.map +1 -1
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.js +8 -8
- package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.js.map +1 -1
- package/dist/esm/examples/server/toolWithSampleServer.js +22 -22
- package/dist/esm/examples/server/toolWithSampleServer.js.map +1 -1
- package/dist/esm/examples/shared/inMemoryEventStore.d.ts.map +1 -1
- package/dist/esm/examples/shared/inMemoryEventStore.js.map +1 -1
- package/dist/esm/inMemory.d.ts +3 -3
- package/dist/esm/inMemory.d.ts.map +1 -1
- package/dist/esm/inMemory.js +1 -1
- package/dist/esm/inMemory.js.map +1 -1
- package/dist/esm/server/auth/clients.d.ts +2 -2
- package/dist/esm/server/auth/clients.d.ts.map +1 -1
- package/dist/esm/server/auth/errors.d.ts +1 -1
- package/dist/esm/server/auth/errors.d.ts.map +1 -1
- package/dist/esm/server/auth/errors.js +17 -17
- package/dist/esm/server/auth/errors.js.map +1 -1
- package/dist/esm/server/auth/handlers/authorize.d.ts +3 -3
- package/dist/esm/server/auth/handlers/authorize.d.ts.map +1 -1
- package/dist/esm/server/auth/handlers/authorize.js +26 -23
- package/dist/esm/server/auth/handlers/authorize.js.map +1 -1
- package/dist/esm/server/auth/handlers/metadata.d.ts +2 -2
- package/dist/esm/server/auth/handlers/metadata.js +3 -3
- package/dist/esm/server/auth/handlers/metadata.js.map +1 -1
- package/dist/esm/server/auth/handlers/register.d.ts +4 -4
- package/dist/esm/server/auth/handlers/register.d.ts.map +1 -1
- package/dist/esm/server/auth/handlers/register.js +12 -14
- package/dist/esm/server/auth/handlers/register.js.map +1 -1
- package/dist/esm/server/auth/handlers/revoke.d.ts +4 -4
- package/dist/esm/server/auth/handlers/revoke.d.ts.map +1 -1
- package/dist/esm/server/auth/handlers/revoke.js +16 -16
- package/dist/esm/server/auth/handlers/revoke.js.map +1 -1
- package/dist/esm/server/auth/handlers/token.d.ts +3 -3
- package/dist/esm/server/auth/handlers/token.d.ts.map +1 -1
- package/dist/esm/server/auth/handlers/token.js +22 -22
- package/dist/esm/server/auth/handlers/token.js.map +1 -1
- package/dist/esm/server/auth/middleware/allowedMethods.d.ts +1 -1
- package/dist/esm/server/auth/middleware/allowedMethods.d.ts.map +1 -1
- package/dist/esm/server/auth/middleware/allowedMethods.js +2 -4
- package/dist/esm/server/auth/middleware/allowedMethods.js.map +1 -1
- package/dist/esm/server/auth/middleware/bearerAuth.d.ts +4 -4
- package/dist/esm/server/auth/middleware/bearerAuth.d.ts.map +1 -1
- package/dist/esm/server/auth/middleware/bearerAuth.js +8 -8
- package/dist/esm/server/auth/middleware/bearerAuth.js.map +1 -1
- package/dist/esm/server/auth/middleware/clientAuth.d.ts +4 -4
- package/dist/esm/server/auth/middleware/clientAuth.d.ts.map +1 -1
- package/dist/esm/server/auth/middleware/clientAuth.js +8 -8
- package/dist/esm/server/auth/middleware/clientAuth.js.map +1 -1
- package/dist/esm/server/auth/provider.d.ts +4 -4
- package/dist/esm/server/auth/provider.d.ts.map +1 -1
- package/dist/esm/server/auth/providers/proxyProvider.d.ts +10 -10
- package/dist/esm/server/auth/providers/proxyProvider.d.ts.map +1 -1
- package/dist/esm/server/auth/providers/proxyProvider.js +36 -36
- package/dist/esm/server/auth/providers/proxyProvider.js.map +1 -1
- package/dist/esm/server/auth/router.d.ts +18 -13
- package/dist/esm/server/auth/router.d.ts.map +1 -1
- package/dist/esm/server/auth/router.js +33 -30
- package/dist/esm/server/auth/router.js.map +1 -1
- package/dist/esm/server/auth/types.d.ts +1 -1
- package/dist/esm/server/auth/types.d.ts.map +1 -1
- package/dist/esm/server/completable.d.ts +5 -5
- package/dist/esm/server/completable.d.ts.map +1 -1
- package/dist/esm/server/completable.js +6 -6
- package/dist/esm/server/completable.js.map +1 -1
- package/dist/esm/server/index.d.ts +9 -9
- package/dist/esm/server/index.d.ts.map +1 -1
- package/dist/esm/server/index.js +41 -45
- package/dist/esm/server/index.js.map +1 -1
- package/dist/esm/server/mcp.d.ts +8 -8
- package/dist/esm/server/mcp.d.ts.map +1 -1
- package/dist/esm/server/mcp.js +93 -88
- package/dist/esm/server/mcp.js.map +1 -1
- package/dist/esm/server/sse.d.ts +4 -4
- package/dist/esm/server/sse.d.ts.map +1 -1
- package/dist/esm/server/sse.js +20 -19
- package/dist/esm/server/sse.js.map +1 -1
- package/dist/esm/server/stdio.d.ts +3 -3
- package/dist/esm/server/stdio.d.ts.map +1 -1
- package/dist/esm/server/stdio.js +9 -9
- package/dist/esm/server/stdio.js.map +1 -1
- package/dist/esm/server/streamableHttp.d.ts +5 -5
- package/dist/esm/server/streamableHttp.d.ts.map +1 -1
- package/dist/esm/server/streamableHttp.js +67 -68
- package/dist/esm/server/streamableHttp.js.map +1 -1
- package/dist/esm/shared/auth-utils.d.ts.map +1 -1
- package/dist/esm/shared/auth-utils.js +3 -3
- package/dist/esm/shared/auth-utils.js.map +1 -1
- package/dist/esm/shared/auth.d.ts +1 -1
- package/dist/esm/shared/auth.d.ts.map +1 -1
- package/dist/esm/shared/auth.js +43 -47
- package/dist/esm/shared/auth.js.map +1 -1
- package/dist/esm/shared/metadataUtils.d.ts +1 -1
- package/dist/esm/shared/metadataUtils.js.map +1 -1
- package/dist/esm/shared/protocol.d.ts +6 -6
- package/dist/esm/shared/protocol.d.ts.map +1 -1
- package/dist/esm/shared/protocol.js +43 -44
- package/dist/esm/shared/protocol.js.map +1 -1
- package/dist/esm/shared/stdio.d.ts +1 -1
- package/dist/esm/shared/stdio.d.ts.map +1 -1
- package/dist/esm/shared/stdio.js +4 -4
- package/dist/esm/shared/stdio.js.map +1 -1
- package/dist/esm/shared/transport.d.ts +1 -1
- package/dist/esm/shared/transport.d.ts.map +1 -1
- package/dist/esm/shared/uriTemplate.d.ts.map +1 -1
- package/dist/esm/shared/uriTemplate.js +69 -71
- package/dist/esm/shared/uriTemplate.js.map +1 -1
- package/dist/esm/types.d.ts +9650 -4790
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +197 -232
- package/dist/esm/types.js.map +1 -1
- package/package.json +100 -98
package/dist/esm/server/sse.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { randomUUID } from
|
|
2
|
-
import { JSONRPCMessageSchema } from
|
|
3
|
-
import getRawBody from
|
|
4
|
-
import contentType from
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { JSONRPCMessageSchema } from '../types.js';
|
|
3
|
+
import getRawBody from 'raw-body';
|
|
4
|
+
import contentType from 'content-type';
|
|
5
5
|
import { URL } from 'url';
|
|
6
|
-
const MAXIMUM_MESSAGE_SIZE =
|
|
6
|
+
const MAXIMUM_MESSAGE_SIZE = '4mb';
|
|
7
7
|
/**
|
|
8
8
|
* Server transport for SSE: this will send messages over an SSE connection and receive messages from HTTP POST requests.
|
|
9
9
|
*
|
|
@@ -51,12 +51,12 @@ export class SSEServerTransport {
|
|
|
51
51
|
*/
|
|
52
52
|
async start() {
|
|
53
53
|
if (this._sseResponse) {
|
|
54
|
-
throw new Error(
|
|
54
|
+
throw new Error('SSEServerTransport already started! If using Server class, note that connect() calls start() automatically.');
|
|
55
55
|
}
|
|
56
56
|
this.res.writeHead(200, {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
Connection:
|
|
57
|
+
'Content-Type': 'text/event-stream',
|
|
58
|
+
'Cache-Control': 'no-cache, no-transform',
|
|
59
|
+
Connection: 'keep-alive'
|
|
60
60
|
});
|
|
61
61
|
// Send the endpoint event
|
|
62
62
|
// Use a dummy base URL because this._endpoint is relative.
|
|
@@ -68,7 +68,7 @@ export class SSEServerTransport {
|
|
|
68
68
|
const relativeUrlWithSession = endpointUrl.pathname + endpointUrl.search + endpointUrl.hash;
|
|
69
69
|
this.res.write(`event: endpoint\ndata: ${relativeUrlWithSession}\n\n`);
|
|
70
70
|
this._sseResponse = this.res;
|
|
71
|
-
this.res.on(
|
|
71
|
+
this.res.on('close', () => {
|
|
72
72
|
var _a;
|
|
73
73
|
this._sseResponse = undefined;
|
|
74
74
|
(_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
@@ -82,7 +82,7 @@ export class SSEServerTransport {
|
|
|
82
82
|
async handlePostMessage(req, res, parsedBody) {
|
|
83
83
|
var _a, _b, _c, _d;
|
|
84
84
|
if (!this._sseResponse) {
|
|
85
|
-
const message =
|
|
85
|
+
const message = 'SSE connection not established';
|
|
86
86
|
res.writeHead(500).end(message);
|
|
87
87
|
throw new Error(message);
|
|
88
88
|
}
|
|
@@ -97,14 +97,15 @@ export class SSEServerTransport {
|
|
|
97
97
|
const requestInfo = { headers: req.headers };
|
|
98
98
|
let body;
|
|
99
99
|
try {
|
|
100
|
-
const ct = contentType.parse((_b = req.headers[
|
|
101
|
-
if (ct.type !==
|
|
100
|
+
const ct = contentType.parse((_b = req.headers['content-type']) !== null && _b !== void 0 ? _b : '');
|
|
101
|
+
if (ct.type !== 'application/json') {
|
|
102
102
|
throw new Error(`Unsupported content-type: ${ct.type}`);
|
|
103
103
|
}
|
|
104
|
-
body =
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
body =
|
|
105
|
+
parsedBody !== null && parsedBody !== void 0 ? parsedBody : (await getRawBody(req, {
|
|
106
|
+
limit: MAXIMUM_MESSAGE_SIZE,
|
|
107
|
+
encoding: (_c = ct.parameters.charset) !== null && _c !== void 0 ? _c : 'utf-8'
|
|
108
|
+
}));
|
|
108
109
|
}
|
|
109
110
|
catch (error) {
|
|
110
111
|
res.writeHead(400).end(String(error));
|
|
@@ -118,7 +119,7 @@ export class SSEServerTransport {
|
|
|
118
119
|
res.writeHead(400).end(`Invalid message: ${body}`);
|
|
119
120
|
return;
|
|
120
121
|
}
|
|
121
|
-
res.writeHead(202).end(
|
|
122
|
+
res.writeHead(202).end('Accepted');
|
|
122
123
|
}
|
|
123
124
|
/**
|
|
124
125
|
* Handle a client message, regardless of how it arrived. This can be used to inform the server of messages that arrive via a means different than HTTP POST.
|
|
@@ -143,7 +144,7 @@ export class SSEServerTransport {
|
|
|
143
144
|
}
|
|
144
145
|
async send(message) {
|
|
145
146
|
if (!this._sseResponse) {
|
|
146
|
-
throw new Error(
|
|
147
|
+
throw new Error('Not connected');
|
|
147
148
|
}
|
|
148
149
|
this._sseResponse.write(`event: message\ndata: ${JSON.stringify(message)}\n\n`);
|
|
149
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/server/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAkB,oBAAoB,EAAiC,MAAM,aAAa,CAAC;AAClG,OAAO,UAAU,MAAM,UAAU,CAAC;AAClC,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAyBnC;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/server/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Readable, Writable } from
|
|
2
|
-
import { JSONRPCMessage } from
|
|
3
|
-
import { Transport } from
|
|
1
|
+
import { Readable, Writable } from 'node:stream';
|
|
2
|
+
import { JSONRPCMessage } from '../types.js';
|
|
3
|
+
import { Transport } from '../shared/transport.js';
|
|
4
4
|
/**
|
|
5
5
|
* Server transport for stdio: this communicates with a MCP client by reading from the current process' stdin and writing to stdout.
|
|
6
6
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/server/stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,SAAS;
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/server/stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IAK9C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IALnB,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,QAAQ,CAAS;gBAGb,MAAM,GAAE,QAAwB,EAChC,OAAO,GAAE,QAAyB;IAG9C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAG9C,OAAO,UAAW,MAAM,UAGtB;IACF,QAAQ,UAAW,KAAK,UAEtB;IAEF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,OAAO,CAAC,iBAAiB;IAenB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAU/C"}
|
package/dist/esm/server/stdio.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import process from
|
|
2
|
-
import { ReadBuffer, serializeMessage } from
|
|
1
|
+
import process from 'node:process';
|
|
2
|
+
import { ReadBuffer, serializeMessage } from '../shared/stdio.js';
|
|
3
3
|
/**
|
|
4
4
|
* Server transport for stdio: this communicates with a MCP client by reading from the current process' stdin and writing to stdout.
|
|
5
5
|
*
|
|
@@ -26,11 +26,11 @@ export class StdioServerTransport {
|
|
|
26
26
|
*/
|
|
27
27
|
async start() {
|
|
28
28
|
if (this._started) {
|
|
29
|
-
throw new Error(
|
|
29
|
+
throw new Error('StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.');
|
|
30
30
|
}
|
|
31
31
|
this._started = true;
|
|
32
|
-
this._stdin.on(
|
|
33
|
-
this._stdin.on(
|
|
32
|
+
this._stdin.on('data', this._ondata);
|
|
33
|
+
this._stdin.on('error', this._onerror);
|
|
34
34
|
}
|
|
35
35
|
processReadBuffer() {
|
|
36
36
|
var _a, _b;
|
|
@@ -50,8 +50,8 @@ export class StdioServerTransport {
|
|
|
50
50
|
async close() {
|
|
51
51
|
var _a;
|
|
52
52
|
// Remove our event listeners first
|
|
53
|
-
this._stdin.off(
|
|
54
|
-
this._stdin.off(
|
|
53
|
+
this._stdin.off('data', this._ondata);
|
|
54
|
+
this._stdin.off('error', this._onerror);
|
|
55
55
|
// Check if we were the only data listener
|
|
56
56
|
const remainingDataListeners = this._stdin.listenerCount('data');
|
|
57
57
|
if (remainingDataListeners === 0) {
|
|
@@ -64,13 +64,13 @@ export class StdioServerTransport {
|
|
|
64
64
|
(_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
65
65
|
}
|
|
66
66
|
send(message) {
|
|
67
|
-
return new Promise(
|
|
67
|
+
return new Promise(resolve => {
|
|
68
68
|
const json = serializeMessage(message);
|
|
69
69
|
if (this._stdout.write(json)) {
|
|
70
70
|
resolve();
|
|
71
71
|
}
|
|
72
72
|
else {
|
|
73
|
-
this._stdout.once(
|
|
73
|
+
this._stdout.once('drain', resolve);
|
|
74
74
|
}
|
|
75
75
|
});
|
|
76
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/server/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAIlE;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/server/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAIlE;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IAI7B,YACY,SAAmB,OAAO,CAAC,KAAK,EAChC,UAAoB,OAAO,CAAC,MAAM;QADlC,WAAM,GAAN,MAAM,CAA0B;QAChC,YAAO,GAAP,OAAO,CAA2B;QALtC,gBAAW,GAAe,IAAI,UAAU,EAAE,CAAC;QAC3C,aAAQ,GAAG,KAAK,CAAC;QAWzB,gFAAgF;QAChF,YAAO,GAAG,CAAC,KAAa,EAAE,EAAE;YACxB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7B,CAAC,CAAC;QACF,aAAQ,GAAG,CAAC,KAAY,EAAE,EAAE;;YACxB,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC;IAbC,CAAC;IAeJ;;OAEG;IACH,KAAK,CAAC,KAAK;QACP,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACX,+GAA+G,CAClH,CAAC;QACN,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,iBAAiB;;QACrB,OAAO,IAAI,EAAE,CAAC;YACV,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM;gBACV,CAAC;gBAED,MAAA,IAAI,CAAC,SAAS,qDAAG,OAAO,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAc,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;;QACP,mCAAmC;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExC,0CAA0C;QAC1C,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,sBAAsB,KAAK,CAAC,EAAE,CAAC;YAC/B,gDAAgD;YAChD,0FAA0F;YAC1F,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,MAAA,IAAI,CAAC,OAAO,oDAAI,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,OAAuB;QACxB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,EAAE,CAAC;YACd,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { IncomingMessage, ServerResponse } from
|
|
2
|
-
import { Transport } from
|
|
3
|
-
import { MessageExtraInfo, JSONRPCMessage, RequestId } from
|
|
4
|
-
import { AuthInfo } from
|
|
1
|
+
import { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import { Transport } from '../shared/transport.js';
|
|
3
|
+
import { MessageExtraInfo, JSONRPCMessage, RequestId } from '../types.js';
|
|
4
|
+
import { AuthInfo } from './auth/types.js';
|
|
5
5
|
export type StreamId = string;
|
|
6
6
|
export type EventId = string;
|
|
7
7
|
/**
|
|
@@ -47,7 +47,7 @@ export interface StreamableHTTPServerTransportOptions {
|
|
|
47
47
|
* StreamableHTTPServerTransport after a request is completed while still keeping the
|
|
48
48
|
* session open/running.
|
|
49
49
|
* @param sessionId The session ID that was closed
|
|
50
|
-
|
|
50
|
+
*/
|
|
51
51
|
onsessionclosed?: (sessionId: string) => void | Promise<void>;
|
|
52
52
|
/**
|
|
53
53
|
* If true, the server will return JSON responses instead of starting an SSE stream.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamableHttp.d.ts","sourceRoot":"","sources":["../../../src/server/streamableHttp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"streamableHttp.d.ts","sourceRoot":"","sources":["../../../src/server/streamableHttp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { isInitializeRequest, isJSONRPCError, isJSONRPCRequest, isJSONRPCResponse, JSONRPCMessageSchema, SUPPORTED_PROTOCOL_VERSIONS, DEFAULT_NEGOTIATED_PROTOCOL_VERSION } from
|
|
2
|
-
import getRawBody from
|
|
3
|
-
import contentType from
|
|
4
|
-
import { randomUUID } from
|
|
5
|
-
const MAXIMUM_MESSAGE_SIZE =
|
|
1
|
+
import { isInitializeRequest, isJSONRPCError, isJSONRPCRequest, isJSONRPCResponse, JSONRPCMessageSchema, SUPPORTED_PROTOCOL_VERSIONS, DEFAULT_NEGOTIATED_PROTOCOL_VERSION } from '../types.js';
|
|
2
|
+
import getRawBody from 'raw-body';
|
|
3
|
+
import contentType from 'content-type';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
const MAXIMUM_MESSAGE_SIZE = '4mb';
|
|
6
6
|
/**
|
|
7
7
|
* Server transport for Streamable HTTP: this implements the MCP Streamable HTTP transport specification.
|
|
8
8
|
* It supports both SSE streaming and direct HTTP responses.
|
|
@@ -62,7 +62,7 @@ export class StreamableHTTPServerTransport {
|
|
|
62
62
|
*/
|
|
63
63
|
async start() {
|
|
64
64
|
if (this._started) {
|
|
65
|
-
throw new Error(
|
|
65
|
+
throw new Error('Transport already started');
|
|
66
66
|
}
|
|
67
67
|
this._started = true;
|
|
68
68
|
}
|
|
@@ -100,7 +100,7 @@ export class StreamableHTTPServerTransport {
|
|
|
100
100
|
const validationError = this.validateRequestHeaders(req);
|
|
101
101
|
if (validationError) {
|
|
102
102
|
res.writeHead(403).end(JSON.stringify({
|
|
103
|
-
jsonrpc:
|
|
103
|
+
jsonrpc: '2.0',
|
|
104
104
|
error: {
|
|
105
105
|
code: -32000,
|
|
106
106
|
message: validationError
|
|
@@ -110,13 +110,13 @@ export class StreamableHTTPServerTransport {
|
|
|
110
110
|
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, new Error(validationError));
|
|
111
111
|
return;
|
|
112
112
|
}
|
|
113
|
-
if (req.method ===
|
|
113
|
+
if (req.method === 'POST') {
|
|
114
114
|
await this.handlePostRequest(req, res, parsedBody);
|
|
115
115
|
}
|
|
116
|
-
else if (req.method ===
|
|
116
|
+
else if (req.method === 'GET') {
|
|
117
117
|
await this.handleGetRequest(req, res);
|
|
118
118
|
}
|
|
119
|
-
else if (req.method ===
|
|
119
|
+
else if (req.method === 'DELETE') {
|
|
120
120
|
await this.handleDeleteRequest(req, res);
|
|
121
121
|
}
|
|
122
122
|
else {
|
|
@@ -129,12 +129,12 @@ export class StreamableHTTPServerTransport {
|
|
|
129
129
|
async handleGetRequest(req, res) {
|
|
130
130
|
// The client MUST include an Accept header, listing text/event-stream as a supported content type.
|
|
131
131
|
const acceptHeader = req.headers.accept;
|
|
132
|
-
if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes(
|
|
132
|
+
if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes('text/event-stream'))) {
|
|
133
133
|
res.writeHead(406).end(JSON.stringify({
|
|
134
|
-
jsonrpc:
|
|
134
|
+
jsonrpc: '2.0',
|
|
135
135
|
error: {
|
|
136
136
|
code: -32000,
|
|
137
|
-
message:
|
|
137
|
+
message: 'Not Acceptable: Client must accept text/event-stream'
|
|
138
138
|
},
|
|
139
139
|
id: null
|
|
140
140
|
}));
|
|
@@ -160,22 +160,22 @@ export class StreamableHTTPServerTransport {
|
|
|
160
160
|
// The server MUST either return Content-Type: text/event-stream in response to this HTTP GET,
|
|
161
161
|
// or else return HTTP 405 Method Not Allowed
|
|
162
162
|
const headers = {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
Connection:
|
|
163
|
+
'Content-Type': 'text/event-stream',
|
|
164
|
+
'Cache-Control': 'no-cache, no-transform',
|
|
165
|
+
Connection: 'keep-alive'
|
|
166
166
|
};
|
|
167
167
|
// After initialization, always include the session ID if we have one
|
|
168
168
|
if (this.sessionId !== undefined) {
|
|
169
|
-
headers[
|
|
169
|
+
headers['mcp-session-id'] = this.sessionId;
|
|
170
170
|
}
|
|
171
171
|
// Check if there's already an active standalone SSE stream for this session
|
|
172
172
|
if (this._streamMapping.get(this._standaloneSseStreamId) !== undefined) {
|
|
173
173
|
// Only one GET SSE stream is allowed per session
|
|
174
174
|
res.writeHead(409).end(JSON.stringify({
|
|
175
|
-
jsonrpc:
|
|
175
|
+
jsonrpc: '2.0',
|
|
176
176
|
error: {
|
|
177
177
|
code: -32000,
|
|
178
|
-
message:
|
|
178
|
+
message: 'Conflict: Only one SSE stream is allowed per session'
|
|
179
179
|
},
|
|
180
180
|
id: null
|
|
181
181
|
}));
|
|
@@ -187,11 +187,11 @@ export class StreamableHTTPServerTransport {
|
|
|
187
187
|
// Assign the response to the standalone SSE stream
|
|
188
188
|
this._streamMapping.set(this._standaloneSseStreamId, res);
|
|
189
189
|
// Set up close handler for client disconnects
|
|
190
|
-
res.on(
|
|
190
|
+
res.on('close', () => {
|
|
191
191
|
this._streamMapping.delete(this._standaloneSseStreamId);
|
|
192
192
|
});
|
|
193
193
|
// Add error handler for standalone SSE stream
|
|
194
|
-
res.on(
|
|
194
|
+
res.on('error', error => {
|
|
195
195
|
var _a;
|
|
196
196
|
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
|
|
197
197
|
});
|
|
@@ -207,26 +207,26 @@ export class StreamableHTTPServerTransport {
|
|
|
207
207
|
}
|
|
208
208
|
try {
|
|
209
209
|
const headers = {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
Connection:
|
|
210
|
+
'Content-Type': 'text/event-stream',
|
|
211
|
+
'Cache-Control': 'no-cache, no-transform',
|
|
212
|
+
Connection: 'keep-alive'
|
|
213
213
|
};
|
|
214
214
|
if (this.sessionId !== undefined) {
|
|
215
|
-
headers[
|
|
215
|
+
headers['mcp-session-id'] = this.sessionId;
|
|
216
216
|
}
|
|
217
217
|
res.writeHead(200, headers).flushHeaders();
|
|
218
218
|
const streamId = await ((_a = this._eventStore) === null || _a === void 0 ? void 0 : _a.replayEventsAfter(lastEventId, {
|
|
219
219
|
send: async (eventId, message) => {
|
|
220
220
|
var _a;
|
|
221
221
|
if (!this.writeSSEEvent(res, message, eventId)) {
|
|
222
|
-
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, new Error(
|
|
222
|
+
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, new Error('Failed replay events'));
|
|
223
223
|
res.end();
|
|
224
224
|
}
|
|
225
225
|
}
|
|
226
226
|
}));
|
|
227
227
|
this._streamMapping.set(streamId, res);
|
|
228
228
|
// Add error handler for replay stream
|
|
229
|
-
res.on(
|
|
229
|
+
res.on('error', error => {
|
|
230
230
|
var _a;
|
|
231
231
|
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
|
|
232
232
|
});
|
|
@@ -252,12 +252,12 @@ export class StreamableHTTPServerTransport {
|
|
|
252
252
|
*/
|
|
253
253
|
async handleUnsupportedRequest(res) {
|
|
254
254
|
res.writeHead(405, {
|
|
255
|
-
|
|
255
|
+
Allow: 'GET, POST, DELETE'
|
|
256
256
|
}).end(JSON.stringify({
|
|
257
|
-
jsonrpc:
|
|
257
|
+
jsonrpc: '2.0',
|
|
258
258
|
error: {
|
|
259
259
|
code: -32000,
|
|
260
|
-
message:
|
|
260
|
+
message: 'Method not allowed.'
|
|
261
261
|
},
|
|
262
262
|
id: null
|
|
263
263
|
}));
|
|
@@ -271,24 +271,24 @@ export class StreamableHTTPServerTransport {
|
|
|
271
271
|
// Validate the Accept header
|
|
272
272
|
const acceptHeader = req.headers.accept;
|
|
273
273
|
// The client MUST include an Accept header, listing both application/json and text/event-stream as supported content types.
|
|
274
|
-
if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes(
|
|
274
|
+
if (!(acceptHeader === null || acceptHeader === void 0 ? void 0 : acceptHeader.includes('application/json')) || !acceptHeader.includes('text/event-stream')) {
|
|
275
275
|
res.writeHead(406).end(JSON.stringify({
|
|
276
|
-
jsonrpc:
|
|
276
|
+
jsonrpc: '2.0',
|
|
277
277
|
error: {
|
|
278
278
|
code: -32000,
|
|
279
|
-
message:
|
|
279
|
+
message: 'Not Acceptable: Client must accept both application/json and text/event-stream'
|
|
280
280
|
},
|
|
281
281
|
id: null
|
|
282
282
|
}));
|
|
283
283
|
return;
|
|
284
284
|
}
|
|
285
|
-
const ct = req.headers[
|
|
286
|
-
if (!ct || !ct.includes(
|
|
285
|
+
const ct = req.headers['content-type'];
|
|
286
|
+
if (!ct || !ct.includes('application/json')) {
|
|
287
287
|
res.writeHead(415).end(JSON.stringify({
|
|
288
|
-
jsonrpc:
|
|
288
|
+
jsonrpc: '2.0',
|
|
289
289
|
error: {
|
|
290
290
|
code: -32000,
|
|
291
|
-
message:
|
|
291
|
+
message: 'Unsupported Media Type: Content-Type must be application/json'
|
|
292
292
|
},
|
|
293
293
|
id: null
|
|
294
294
|
}));
|
|
@@ -304,7 +304,7 @@ export class StreamableHTTPServerTransport {
|
|
|
304
304
|
const parsedCt = contentType.parse(ct);
|
|
305
305
|
const body = await getRawBody(req, {
|
|
306
306
|
limit: MAXIMUM_MESSAGE_SIZE,
|
|
307
|
-
encoding: (_a = parsedCt.parameters.charset) !== null && _a !== void 0 ? _a :
|
|
307
|
+
encoding: (_a = parsedCt.parameters.charset) !== null && _a !== void 0 ? _a : 'utf-8'
|
|
308
308
|
});
|
|
309
309
|
rawMessage = JSON.parse(body.toString());
|
|
310
310
|
}
|
|
@@ -324,10 +324,10 @@ export class StreamableHTTPServerTransport {
|
|
|
324
324
|
// to avoid re-initialization.
|
|
325
325
|
if (this._initialized && this.sessionId !== undefined) {
|
|
326
326
|
res.writeHead(400).end(JSON.stringify({
|
|
327
|
-
jsonrpc:
|
|
327
|
+
jsonrpc: '2.0',
|
|
328
328
|
error: {
|
|
329
329
|
code: -32600,
|
|
330
|
-
message:
|
|
330
|
+
message: 'Invalid Request: Server already initialized'
|
|
331
331
|
},
|
|
332
332
|
id: null
|
|
333
333
|
}));
|
|
@@ -335,10 +335,10 @@ export class StreamableHTTPServerTransport {
|
|
|
335
335
|
}
|
|
336
336
|
if (messages.length > 1) {
|
|
337
337
|
res.writeHead(400).end(JSON.stringify({
|
|
338
|
-
jsonrpc:
|
|
338
|
+
jsonrpc: '2.0',
|
|
339
339
|
error: {
|
|
340
340
|
code: -32600,
|
|
341
|
-
message:
|
|
341
|
+
message: 'Invalid Request: Only one initialization request is allowed'
|
|
342
342
|
},
|
|
343
343
|
id: null
|
|
344
344
|
}));
|
|
@@ -354,7 +354,7 @@ export class StreamableHTTPServerTransport {
|
|
|
354
354
|
}
|
|
355
355
|
if (!isInitializationRequest) {
|
|
356
356
|
// If an Mcp-Session-Id is returned by the server during initialization,
|
|
357
|
-
// clients using the Streamable HTTP transport MUST include it
|
|
357
|
+
// clients using the Streamable HTTP transport MUST include it
|
|
358
358
|
// in the Mcp-Session-Id header on all of their subsequent HTTP requests.
|
|
359
359
|
if (!this.validateSession(req, res)) {
|
|
360
360
|
return;
|
|
@@ -380,13 +380,13 @@ export class StreamableHTTPServerTransport {
|
|
|
380
380
|
const streamId = randomUUID();
|
|
381
381
|
if (!this._enableJsonResponse) {
|
|
382
382
|
const headers = {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
Connection:
|
|
383
|
+
'Content-Type': 'text/event-stream',
|
|
384
|
+
'Cache-Control': 'no-cache',
|
|
385
|
+
Connection: 'keep-alive'
|
|
386
386
|
};
|
|
387
387
|
// After initialization, always include the session ID if we have one
|
|
388
388
|
if (this.sessionId !== undefined) {
|
|
389
|
-
headers[
|
|
389
|
+
headers['mcp-session-id'] = this.sessionId;
|
|
390
390
|
}
|
|
391
391
|
res.writeHead(200, headers);
|
|
392
392
|
}
|
|
@@ -399,11 +399,11 @@ export class StreamableHTTPServerTransport {
|
|
|
399
399
|
}
|
|
400
400
|
}
|
|
401
401
|
// Set up close handler for client disconnects
|
|
402
|
-
res.on(
|
|
402
|
+
res.on('close', () => {
|
|
403
403
|
this._streamMapping.delete(streamId);
|
|
404
404
|
});
|
|
405
405
|
// Add error handler for stream write errors
|
|
406
|
-
res.on(
|
|
406
|
+
res.on('error', error => {
|
|
407
407
|
var _a;
|
|
408
408
|
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
|
|
409
409
|
});
|
|
@@ -418,10 +418,10 @@ export class StreamableHTTPServerTransport {
|
|
|
418
418
|
catch (error) {
|
|
419
419
|
// return JSON-RPC formatted error
|
|
420
420
|
res.writeHead(400).end(JSON.stringify({
|
|
421
|
-
jsonrpc:
|
|
421
|
+
jsonrpc: '2.0',
|
|
422
422
|
error: {
|
|
423
423
|
code: -32700,
|
|
424
|
-
message:
|
|
424
|
+
message: 'Parse error',
|
|
425
425
|
data: String(error)
|
|
426
426
|
},
|
|
427
427
|
id: null
|
|
@@ -457,23 +457,23 @@ export class StreamableHTTPServerTransport {
|
|
|
457
457
|
if (!this._initialized) {
|
|
458
458
|
// If the server has not been initialized yet, reject all requests
|
|
459
459
|
res.writeHead(400).end(JSON.stringify({
|
|
460
|
-
jsonrpc:
|
|
460
|
+
jsonrpc: '2.0',
|
|
461
461
|
error: {
|
|
462
462
|
code: -32000,
|
|
463
|
-
message:
|
|
463
|
+
message: 'Bad Request: Server not initialized'
|
|
464
464
|
},
|
|
465
465
|
id: null
|
|
466
466
|
}));
|
|
467
467
|
return false;
|
|
468
468
|
}
|
|
469
|
-
const sessionId = req.headers[
|
|
469
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
470
470
|
if (!sessionId) {
|
|
471
471
|
// Non-initialization requests without a session ID should return 400 Bad Request
|
|
472
472
|
res.writeHead(400).end(JSON.stringify({
|
|
473
|
-
jsonrpc:
|
|
473
|
+
jsonrpc: '2.0',
|
|
474
474
|
error: {
|
|
475
475
|
code: -32000,
|
|
476
|
-
message:
|
|
476
|
+
message: 'Bad Request: Mcp-Session-Id header is required'
|
|
477
477
|
},
|
|
478
478
|
id: null
|
|
479
479
|
}));
|
|
@@ -481,10 +481,10 @@ export class StreamableHTTPServerTransport {
|
|
|
481
481
|
}
|
|
482
482
|
else if (Array.isArray(sessionId)) {
|
|
483
483
|
res.writeHead(400).end(JSON.stringify({
|
|
484
|
-
jsonrpc:
|
|
484
|
+
jsonrpc: '2.0',
|
|
485
485
|
error: {
|
|
486
486
|
code: -32000,
|
|
487
|
-
message:
|
|
487
|
+
message: 'Bad Request: Mcp-Session-Id header must be a single value'
|
|
488
488
|
},
|
|
489
489
|
id: null
|
|
490
490
|
}));
|
|
@@ -493,10 +493,10 @@ export class StreamableHTTPServerTransport {
|
|
|
493
493
|
else if (sessionId !== this.sessionId) {
|
|
494
494
|
// Reject requests with invalid session ID with 404 Not Found
|
|
495
495
|
res.writeHead(404).end(JSON.stringify({
|
|
496
|
-
jsonrpc:
|
|
496
|
+
jsonrpc: '2.0',
|
|
497
497
|
error: {
|
|
498
498
|
code: -32001,
|
|
499
|
-
message:
|
|
499
|
+
message: 'Session not found'
|
|
500
500
|
},
|
|
501
501
|
id: null
|
|
502
502
|
}));
|
|
@@ -506,16 +506,16 @@ export class StreamableHTTPServerTransport {
|
|
|
506
506
|
}
|
|
507
507
|
validateProtocolVersion(req, res) {
|
|
508
508
|
var _a;
|
|
509
|
-
let protocolVersion = (_a = req.headers[
|
|
509
|
+
let protocolVersion = (_a = req.headers['mcp-protocol-version']) !== null && _a !== void 0 ? _a : DEFAULT_NEGOTIATED_PROTOCOL_VERSION;
|
|
510
510
|
if (Array.isArray(protocolVersion)) {
|
|
511
511
|
protocolVersion = protocolVersion[protocolVersion.length - 1];
|
|
512
512
|
}
|
|
513
513
|
if (!SUPPORTED_PROTOCOL_VERSIONS.includes(protocolVersion)) {
|
|
514
514
|
res.writeHead(400).end(JSON.stringify({
|
|
515
|
-
jsonrpc:
|
|
515
|
+
jsonrpc: '2.0',
|
|
516
516
|
error: {
|
|
517
517
|
code: -32000,
|
|
518
|
-
message: `Bad Request: Unsupported protocol version (supported versions: ${SUPPORTED_PROTOCOL_VERSIONS.join(
|
|
518
|
+
message: `Bad Request: Unsupported protocol version (supported versions: ${SUPPORTED_PROTOCOL_VERSIONS.join(', ')})`
|
|
519
519
|
},
|
|
520
520
|
id: null
|
|
521
521
|
}));
|
|
@@ -526,7 +526,7 @@ export class StreamableHTTPServerTransport {
|
|
|
526
526
|
async close() {
|
|
527
527
|
var _a;
|
|
528
528
|
// Close all SSE connections
|
|
529
|
-
this._streamMapping.forEach(
|
|
529
|
+
this._streamMapping.forEach(response => {
|
|
530
530
|
response.end();
|
|
531
531
|
});
|
|
532
532
|
this._streamMapping.clear();
|
|
@@ -546,7 +546,7 @@ export class StreamableHTTPServerTransport {
|
|
|
546
546
|
if (requestId === undefined) {
|
|
547
547
|
// For standalone SSE streams, we can only send requests and notifications
|
|
548
548
|
if (isJSONRPCResponse(message) || isJSONRPCError(message)) {
|
|
549
|
-
throw new Error(
|
|
549
|
+
throw new Error('Cannot send a response on a standalone SSE stream unless resuming a previous client request');
|
|
550
550
|
}
|
|
551
551
|
const standaloneSse = this._streamMapping.get(this._standaloneSseStreamId);
|
|
552
552
|
if (standaloneSse === undefined) {
|
|
@@ -594,13 +594,12 @@ export class StreamableHTTPServerTransport {
|
|
|
594
594
|
if (this._enableJsonResponse) {
|
|
595
595
|
// All responses ready, send as JSON
|
|
596
596
|
const headers = {
|
|
597
|
-
'Content-Type': 'application/json'
|
|
597
|
+
'Content-Type': 'application/json'
|
|
598
598
|
};
|
|
599
599
|
if (this.sessionId !== undefined) {
|
|
600
600
|
headers['mcp-session-id'] = this.sessionId;
|
|
601
601
|
}
|
|
602
|
-
const responses = relatedIds
|
|
603
|
-
.map(id => this._requestResponseMap.get(id));
|
|
602
|
+
const responses = relatedIds.map(id => this._requestResponseMap.get(id));
|
|
604
603
|
response.writeHead(200, headers);
|
|
605
604
|
if (responses.length === 1) {
|
|
606
605
|
response.end(JSON.stringify(responses[0]));
|