mcp-proxy 5.6.1 → 5.8.0
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 +1 -0
- package/dist/bin/mcp-proxy.js +7 -1
- package/dist/bin/mcp-proxy.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -1
- package/dist/{stdio-D0Lv8ytu.js → stdio-so1-I7Pn.js} +43 -16
- package/dist/stdio-so1-I7Pn.js.map +1 -0
- package/jsr.json +1 -1
- package/package.json +1 -1
- package/src/bin/mcp-proxy.ts +6 -0
- package/src/fixtures/slow-stdio-server.ts +91 -0
- package/src/proxyServer.test.ts +148 -0
- package/src/proxyServer.ts +43 -10
- package/src/startHTTPServer.test.ts +480 -0
- package/src/startHTTPServer.ts +42 -2
- package/dist/stdio-D0Lv8ytu.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -43,10 +43,12 @@ declare class InMemoryEventStore implements EventStore {
|
|
|
43
43
|
//#region src/proxyServer.d.ts
|
|
44
44
|
declare const proxyServer: ({
|
|
45
45
|
client,
|
|
46
|
+
requestTimeout,
|
|
46
47
|
server,
|
|
47
48
|
serverCapabilities
|
|
48
49
|
}: {
|
|
49
50
|
client: Client;
|
|
51
|
+
requestTimeout?: number;
|
|
50
52
|
server: Server;
|
|
51
53
|
serverCapabilities: ServerCapabilities;
|
|
52
54
|
}) => Promise<void>;
|
|
@@ -61,6 +63,7 @@ type ServerLike = {
|
|
|
61
63
|
};
|
|
62
64
|
declare const startHTTPServer: <T extends ServerLike>({
|
|
63
65
|
apiKey,
|
|
66
|
+
authenticate,
|
|
64
67
|
createServer,
|
|
65
68
|
enableJsonResponse,
|
|
66
69
|
eventStore,
|
|
@@ -74,6 +77,7 @@ declare const startHTTPServer: <T extends ServerLike>({
|
|
|
74
77
|
streamEndpoint
|
|
75
78
|
}: {
|
|
76
79
|
apiKey?: string;
|
|
80
|
+
authenticate?: (request: http.IncomingMessage) => Promise<unknown>;
|
|
77
81
|
createServer: (request: http.IncomingMessage) => Promise<T>;
|
|
78
82
|
enableJsonResponse?: boolean;
|
|
79
83
|
eventStore?: EventStore;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Client, InMemoryEventStore, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, NEVER, ReadBuffer, Server, ZodIssueCode, anyType, arrayType, booleanType, isInitializedNotification, isJSONRPCRequest, isJSONRPCResponse, numberType, objectType, proxyServer, serializeMessage, startHTTPServer, stringType } from "./stdio-
|
|
1
|
+
import { Client, InMemoryEventStore, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, NEVER, ReadBuffer, Server, ZodIssueCode, anyType, arrayType, booleanType, isInitializedNotification, isJSONRPCRequest, isJSONRPCResponse, numberType, objectType, proxyServer, serializeMessage, startHTTPServer, stringType } from "./stdio-so1-I7Pn.js";
|
|
2
2
|
import process from "node:process";
|
|
3
3
|
|
|
4
4
|
//#region node_modules/.pnpm/eventsource-parser@3.0.6/node_modules/eventsource-parser/dist/index.js
|
|
@@ -4400,7 +4400,7 @@ var McpError = class extends Error {
|
|
|
4400
4400
|
|
|
4401
4401
|
//#endregion
|
|
4402
4402
|
//#region src/proxyServer.ts
|
|
4403
|
-
const proxyServer = async ({ client, server, serverCapabilities }) => {
|
|
4403
|
+
const proxyServer = async ({ client, requestTimeout, server, serverCapabilities }) => {
|
|
4404
4404
|
if (serverCapabilities?.logging) {
|
|
4405
4405
|
server.setNotificationHandler(LoggingMessageNotificationSchema, async (args) => {
|
|
4406
4406
|
return client.notification(args);
|
|
@@ -4411,44 +4411,44 @@ const proxyServer = async ({ client, server, serverCapabilities }) => {
|
|
|
4411
4411
|
}
|
|
4412
4412
|
if (serverCapabilities?.prompts) {
|
|
4413
4413
|
server.setRequestHandler(GetPromptRequestSchema, async (args) => {
|
|
4414
|
-
return client.getPrompt(args.params);
|
|
4414
|
+
return client.getPrompt(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4415
4415
|
});
|
|
4416
4416
|
server.setRequestHandler(ListPromptsRequestSchema, async (args) => {
|
|
4417
|
-
return client.listPrompts(args.params);
|
|
4417
|
+
return client.listPrompts(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4418
4418
|
});
|
|
4419
4419
|
}
|
|
4420
4420
|
if (serverCapabilities?.resources) {
|
|
4421
4421
|
server.setRequestHandler(ListResourcesRequestSchema, async (args) => {
|
|
4422
|
-
return client.listResources(args.params);
|
|
4422
|
+
return client.listResources(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4423
4423
|
});
|
|
4424
4424
|
server.setRequestHandler(ListResourceTemplatesRequestSchema, async (args) => {
|
|
4425
|
-
return client.listResourceTemplates(args.params);
|
|
4425
|
+
return client.listResourceTemplates(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4426
4426
|
});
|
|
4427
4427
|
server.setRequestHandler(ReadResourceRequestSchema, async (args) => {
|
|
4428
|
-
return client.readResource(args.params);
|
|
4428
|
+
return client.readResource(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4429
4429
|
});
|
|
4430
4430
|
if (serverCapabilities?.resources.subscribe) {
|
|
4431
4431
|
server.setNotificationHandler(ResourceUpdatedNotificationSchema, async (args) => {
|
|
4432
4432
|
return client.notification(args);
|
|
4433
4433
|
});
|
|
4434
4434
|
server.setRequestHandler(SubscribeRequestSchema, async (args) => {
|
|
4435
|
-
return client.subscribeResource(args.params);
|
|
4435
|
+
return client.subscribeResource(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4436
4436
|
});
|
|
4437
4437
|
server.setRequestHandler(UnsubscribeRequestSchema, async (args) => {
|
|
4438
|
-
return client.unsubscribeResource(args.params);
|
|
4438
|
+
return client.unsubscribeResource(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4439
4439
|
});
|
|
4440
4440
|
}
|
|
4441
4441
|
}
|
|
4442
4442
|
if (serverCapabilities?.tools) {
|
|
4443
4443
|
server.setRequestHandler(CallToolRequestSchema, async (args) => {
|
|
4444
|
-
return client.callTool(args.params);
|
|
4444
|
+
return client.callTool(args.params, void 0, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4445
4445
|
});
|
|
4446
4446
|
server.setRequestHandler(ListToolsRequestSchema, async (args) => {
|
|
4447
|
-
return client.listTools(args.params);
|
|
4447
|
+
return client.listTools(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4448
4448
|
});
|
|
4449
4449
|
}
|
|
4450
4450
|
server.setRequestHandler(CompleteRequestSchema, async (args) => {
|
|
4451
|
-
return client.complete(args.params);
|
|
4451
|
+
return client.complete(args.params, requestTimeout ? { timeout: requestTimeout } : void 0);
|
|
4452
4452
|
});
|
|
4453
4453
|
};
|
|
4454
4454
|
|
|
@@ -15045,13 +15045,39 @@ const cleanupServer = async (server, onClose) => {
|
|
|
15045
15045
|
console.error("[mcp-proxy] error closing server", error);
|
|
15046
15046
|
}
|
|
15047
15047
|
};
|
|
15048
|
-
const handleStreamRequest = async ({ activeTransports, createServer, enableJsonResponse, endpoint, eventStore, onClose, onConnect, req, res, stateless }) => {
|
|
15048
|
+
const handleStreamRequest = async ({ activeTransports, authenticate, createServer, enableJsonResponse, endpoint, eventStore, onClose, onConnect, req, res, stateless }) => {
|
|
15049
15049
|
if (req.method === "POST" && new URL(req.url, "http://localhost").pathname === endpoint) {
|
|
15050
15050
|
try {
|
|
15051
15051
|
const sessionId = Array.isArray(req.headers["mcp-session-id"]) ? req.headers["mcp-session-id"][0] : req.headers["mcp-session-id"];
|
|
15052
15052
|
let transport;
|
|
15053
15053
|
let server;
|
|
15054
15054
|
const body = await getBody(req);
|
|
15055
|
+
if (stateless && authenticate) try {
|
|
15056
|
+
if (!await authenticate(req)) {
|
|
15057
|
+
res.setHeader("Content-Type", "application/json");
|
|
15058
|
+
res.writeHead(401).end(JSON.stringify({
|
|
15059
|
+
error: {
|
|
15060
|
+
code: -32e3,
|
|
15061
|
+
message: "Unauthorized: Authentication failed"
|
|
15062
|
+
},
|
|
15063
|
+
id: body?.id ?? null,
|
|
15064
|
+
jsonrpc: "2.0"
|
|
15065
|
+
}));
|
|
15066
|
+
return true;
|
|
15067
|
+
}
|
|
15068
|
+
} catch (error) {
|
|
15069
|
+
console.error("Authentication error:", error);
|
|
15070
|
+
res.setHeader("Content-Type", "application/json");
|
|
15071
|
+
res.writeHead(401).end(JSON.stringify({
|
|
15072
|
+
error: {
|
|
15073
|
+
code: -32e3,
|
|
15074
|
+
message: "Unauthorized: Authentication error"
|
|
15075
|
+
},
|
|
15076
|
+
id: body?.id ?? null,
|
|
15077
|
+
jsonrpc: "2.0"
|
|
15078
|
+
}));
|
|
15079
|
+
return true;
|
|
15080
|
+
}
|
|
15055
15081
|
if (sessionId) {
|
|
15056
15082
|
const activeTransport = activeTransports[sessionId];
|
|
15057
15083
|
if (!activeTransport) {
|
|
@@ -15220,7 +15246,7 @@ const handleSSERequest = async ({ activeTransports, createServer, endpoint, onCl
|
|
|
15220
15246
|
}
|
|
15221
15247
|
return false;
|
|
15222
15248
|
};
|
|
15223
|
-
const startHTTPServer = async ({ apiKey, createServer, enableJsonResponse, eventStore, host = "::", onClose, onConnect, onUnhandledRequest, port, sseEndpoint = "/sse", stateless, streamEndpoint = "/mcp" }) => {
|
|
15249
|
+
const startHTTPServer = async ({ apiKey, authenticate, createServer, enableJsonResponse, eventStore, host = "::", onClose, onConnect, onUnhandledRequest, port, sseEndpoint = "/sse", stateless, streamEndpoint = "/mcp" }) => {
|
|
15224
15250
|
const activeSSETransports = {};
|
|
15225
15251
|
const activeStreamTransports = {};
|
|
15226
15252
|
const authMiddleware = new AuthenticationMiddleware({ apiKey });
|
|
@@ -15233,8 +15259,8 @@ const startHTTPServer = async ({ apiKey, createServer, enableJsonResponse, event
|
|
|
15233
15259
|
res.setHeader("Access-Control-Allow-Origin", origin.origin);
|
|
15234
15260
|
res.setHeader("Access-Control-Allow-Credentials", "true");
|
|
15235
15261
|
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
15236
|
-
res.setHeader("Access-Control-Allow-Headers", "
|
|
15237
|
-
res.setHeader("Access-Control-Expose-Headers", "
|
|
15262
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, Mcp-Session-Id, Last-Event-Id");
|
|
15263
|
+
res.setHeader("Access-Control-Expose-Headers", "Mcp-Session-Id");
|
|
15238
15264
|
} catch (error) {
|
|
15239
15265
|
console.error("[mcp-proxy] error parsing origin", error);
|
|
15240
15266
|
}
|
|
@@ -15264,6 +15290,7 @@ const startHTTPServer = async ({ apiKey, createServer, enableJsonResponse, event
|
|
|
15264
15290
|
})) return;
|
|
15265
15291
|
if (streamEndpoint && await handleStreamRequest({
|
|
15266
15292
|
activeTransports: activeStreamTransports,
|
|
15293
|
+
authenticate,
|
|
15267
15294
|
createServer,
|
|
15268
15295
|
enableJsonResponse,
|
|
15269
15296
|
endpoint: streamEndpoint,
|
|
@@ -21483,4 +21510,4 @@ function serializeMessage(message) {
|
|
|
21483
21510
|
|
|
21484
21511
|
//#endregion
|
|
21485
21512
|
export { Client, InMemoryEventStore, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, NEVER, ReadBuffer, Server, ZodIssueCode, __commonJS, __toESM, anyType, arrayType, booleanType, isInitializedNotification, isJSONRPCRequest, isJSONRPCResponse, numberType, objectType, proxyServer, serializeMessage, startHTTPServer, stringType };
|
|
21486
|
-
//# sourceMappingURL=stdio-
|
|
21513
|
+
//# sourceMappingURL=stdio-so1-I7Pn.js.map
|