@n24q02m/mcp-core 1.7.6 → 1.8.0-beta.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-server.d.ts","sourceRoot":"","sources":["../../src/transport/local-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"local-server.d.ts","sourceRoot":"","sources":["../../src/transport/local-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,EAEL,KAAK,wBAAwB,EAE9B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EACL,KAAK,mBAAmB,EAGxB,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAA;AAInC,kEAAkE;AAClE,MAAM,MAAM,SAAS,GAAG,UAAU,CAAA;AAElC,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAA;IAClB,sDAAsD;IACtD,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,YAAY,GAAG,WAAW,CAAC,CAAA;IAC3E,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,mBAAmB,CAAA;IACxC,gEAAgE;IAChE,eAAe,CAAC,EAAE,YAAY,CAAA;IAC9B;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EACd,CAAC,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC,GAChD,CAAC,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC,CAAA;IACxG;;;OAGG;IACH,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAA;IAChG;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5E;AAED,MAAM,WAAW,iBAAiB;IAChC,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,SAAS,EAC9B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAyN5B"}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* This is a TypeScript port of ``core-py``'s ``local_server.py``. Route layout,
|
|
14
14
|
* Bearer enforcement, and lifecycle semantics are kept identical.
|
|
15
15
|
*/
|
|
16
|
+
import { randomUUID } from 'node:crypto';
|
|
16
17
|
import * as fs from 'node:fs';
|
|
17
18
|
import { createServer } from 'node:http';
|
|
18
19
|
import * as os from 'node:os';
|
|
@@ -60,35 +61,47 @@ export async function runLocalServer(serverFactory, options) {
|
|
|
60
61
|
});
|
|
61
62
|
jwtIssuer = oauthApp.jwtIssuer;
|
|
62
63
|
}
|
|
63
|
-
// MCP
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
64
|
+
// MCP per-session pattern (mirrors Python's StreamableHTTPSessionManager):
|
|
65
|
+
//
|
|
66
|
+
// - Each MCP client gets its own ``StreamableHTTPServerTransport`` keyed by
|
|
67
|
+
// Mcp-Session-Id, plus its own ``McpServer`` instance.
|
|
68
|
+
// - The first POST (initialize) has no session header; we mint a UUID via
|
|
69
|
+
// ``sessionIdGenerator`` and register the transport in ``onsessioninitialized``.
|
|
70
|
+
// - Subsequent POSTs (notifications/initialized, tools/list, tools/call)
|
|
71
|
+
// carry Mcp-Session-Id and are routed to the same transport, so the SDK's
|
|
72
|
+
// ``_initialized`` flag is in the right state for ``validateSession`` /
|
|
73
|
+
// ``validateProtocolVersion`` to accept the request.
|
|
74
|
+
//
|
|
75
|
+
// Stateless mode (sessionIdGenerator: undefined) was an earlier attempt; it
|
|
76
|
+
// returned HTTP 500 on the SDK-mandatory ``notifications/initialized`` POST
|
|
77
|
+
// because each request landed on a fresh transport with ``_initialized=false``
|
|
78
|
+
// and the SDK had no session manager to bridge them. Per-session routing is
|
|
79
|
+
// the same architecture the SDK examples + Python core-py use.
|
|
80
|
+
const transports = new Map();
|
|
81
|
+
const servers = new Map();
|
|
82
|
+
async function handleSessionRequest(req, res) {
|
|
83
|
+
const sessionHeader = req.headers['mcp-session-id'];
|
|
84
|
+
const incomingSessionId = Array.isArray(sessionHeader) ? sessionHeader[0] : sessionHeader;
|
|
85
|
+
let transport = incomingSessionId ? transports.get(incomingSessionId) : undefined;
|
|
86
|
+
if (!transport) {
|
|
87
|
+
const server = serverFactory();
|
|
88
|
+
transport = new StreamableHTTPServerTransport({
|
|
89
|
+
sessionIdGenerator: () => randomUUID(),
|
|
90
|
+
onsessioninitialized: (sessionId) => {
|
|
91
|
+
transports.set(sessionId, transport);
|
|
92
|
+
servers.set(sessionId, server);
|
|
93
|
+
},
|
|
94
|
+
onsessionclosed: (sessionId) => {
|
|
95
|
+
transports.delete(sessionId);
|
|
96
|
+
servers.delete(sessionId);
|
|
97
|
+
server.close().catch(() => {
|
|
98
|
+
/* best-effort cleanup */
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
});
|
|
75
102
|
await server.connect(transport);
|
|
76
|
-
await transport.handleRequest(req, res);
|
|
77
|
-
}
|
|
78
|
-
finally {
|
|
79
|
-
try {
|
|
80
|
-
await transport.close();
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
/* best-effort cleanup */
|
|
84
|
-
}
|
|
85
|
-
try {
|
|
86
|
-
await server.close();
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
/* best-effort cleanup */
|
|
90
|
-
}
|
|
91
103
|
}
|
|
104
|
+
await transport.handleRequest(req, res);
|
|
92
105
|
}
|
|
93
106
|
async function mcpHandler(req, res) {
|
|
94
107
|
// Bearer auth if configured.
|
|
@@ -112,13 +125,13 @@ export async function runLocalServer(serverFactory, options) {
|
|
|
112
125
|
}
|
|
113
126
|
if (options.authScope) {
|
|
114
127
|
await options.authScope(claims, async () => {
|
|
115
|
-
await
|
|
128
|
+
await handleSessionRequest(req, res);
|
|
116
129
|
});
|
|
117
130
|
return;
|
|
118
131
|
}
|
|
119
132
|
}
|
|
120
|
-
// Delegate to per-
|
|
121
|
-
await
|
|
133
|
+
// Delegate to per-session MCP transport.
|
|
134
|
+
await handleSessionRequest(req, res);
|
|
122
135
|
}
|
|
123
136
|
const handler = async (req, res) => {
|
|
124
137
|
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
@@ -186,6 +199,29 @@ export async function runLocalServer(serverFactory, options) {
|
|
|
186
199
|
close: () => new Promise((resolve, reject) => {
|
|
187
200
|
const delegatedShutdown = oauthApp && 'shutdown' in oauthApp ? oauthApp.shutdown() : Promise.resolve();
|
|
188
201
|
delegatedShutdown
|
|
202
|
+
.then(async () => {
|
|
203
|
+
// Drain per-session transports + servers so their open SSE streams
|
|
204
|
+
// and tool-call timers don't keep the event loop alive after the
|
|
205
|
+
// HTTP server closes.
|
|
206
|
+
for (const transport of transports.values()) {
|
|
207
|
+
try {
|
|
208
|
+
await transport.close();
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
/* best-effort cleanup */
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
for (const server of servers.values()) {
|
|
215
|
+
try {
|
|
216
|
+
await server.close();
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
/* best-effort cleanup */
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
transports.clear();
|
|
223
|
+
servers.clear();
|
|
224
|
+
})
|
|
189
225
|
.then(() => {
|
|
190
226
|
httpServer.close((err) => {
|
|
191
227
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-server.js","sourceRoot":"","sources":["../../src/transport/local-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAA;AAEhG,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAGjC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAA;AAGlG,OAAO,EACL,uBAAuB,EAGxB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAEL,mBAAmB,EAGpB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAiEhD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAA8B,EAC9B,OAA8B;IAE9B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAA;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAA;IAEpC,IAAI,QAAQ,GAAyD,IAAI,CAAA;IACzE,IAAI,SAAS,GAAqB,IAAI,CAAA;IAEtC,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,QAAQ,GAAG,MAAM,uBAAuB,CAAC;YACvC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI;YACjC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ;YACzC,eAAe,EAAE,OAAO,CAAC,cAAc,CAAC,eAAe;SACxD,CAAC,CAAA;QACF,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;IAChC,CAAC;SAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC/B,QAAQ,GAAG,MAAM,mBAAmB,CAAC;YACnC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;SAC3D,CAAC,CAAA;QACF,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;IAChC,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"local-server.js","sourceRoot":"","sources":["../../src/transport/local-server.ts"],"names":[],"mappings":"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"}
|