mcp-proxy 5.11.1 → 5.12.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/dist/bin/mcp-proxy.js +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1 -1
- package/dist/{stdio-DLSsHME0.js → stdio-CfAxSAGj.js} +51 -5
- package/dist/stdio-CfAxSAGj.js.map +1 -0
- package/jsr.json +1 -1
- package/package.json +1 -1
- package/src/authentication.test.ts +195 -0
- package/src/authentication.ts +45 -0
- package/src/startHTTPServer.ts +42 -3
- package/dist/stdio-DLSsHME0.js.map +0 -1
package/dist/bin/mcp-proxy.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { Client, InMemoryEventStore, ReadBuffer, Server, __commonJS, __toESM, proxyServer, serializeMessage, startHTTPServer } from "../stdio-
|
|
2
|
+
import { Client, InMemoryEventStore, ReadBuffer, Server, __commonJS, __toESM, proxyServer, serializeMessage, startHTTPServer } from "../stdio-CfAxSAGj.js";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import { basename, dirname, extname, join, normalize, relative, resolve } from "path";
|
|
5
5
|
import { format, inspect } from "util";
|
package/dist/index.d.ts
CHANGED
|
@@ -24,6 +24,11 @@ interface AuthConfig {
|
|
|
24
24
|
declare class AuthenticationMiddleware {
|
|
25
25
|
private config;
|
|
26
26
|
constructor(config?: AuthConfig);
|
|
27
|
+
getScopeChallengeResponse(requiredScopes: string[], errorDescription?: string, requestId?: unknown): {
|
|
28
|
+
body: string;
|
|
29
|
+
headers: Record<string, string>;
|
|
30
|
+
statusCode: number;
|
|
31
|
+
};
|
|
27
32
|
getUnauthorizedResponse(options?: {
|
|
28
33
|
error?: string;
|
|
29
34
|
error_description?: string;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AuthenticationMiddleware, 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 { AuthenticationMiddleware, Client, InMemoryEventStore, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, NEVER, ReadBuffer, Server, ZodIssueCode, anyType, arrayType, booleanType, isInitializedNotification, isJSONRPCRequest, isJSONRPCResponse, numberType, objectType, proxyServer, serializeMessage, startHTTPServer, stringType } from "./stdio-CfAxSAGj.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
|
|
@@ -35,6 +35,38 @@ var AuthenticationMiddleware = class {
|
|
|
35
35
|
constructor(config = {}) {
|
|
36
36
|
this.config = config;
|
|
37
37
|
}
|
|
38
|
+
getScopeChallengeResponse(requiredScopes, errorDescription, requestId) {
|
|
39
|
+
const headers = { "Content-Type": "application/json" };
|
|
40
|
+
if (this.config.oauth?.protectedResource?.resource) {
|
|
41
|
+
const parts = [
|
|
42
|
+
"Bearer",
|
|
43
|
+
"error=\"insufficient_scope\"",
|
|
44
|
+
`scope="${requiredScopes.join(" ")}"`,
|
|
45
|
+
`resource_metadata="${this.config.oauth.protectedResource.resource}/.well-known/oauth-protected-resource"`
|
|
46
|
+
];
|
|
47
|
+
if (errorDescription) {
|
|
48
|
+
const escaped = errorDescription.replace(/"/g, "\\\"");
|
|
49
|
+
parts.push(`error_description="${escaped}"`);
|
|
50
|
+
}
|
|
51
|
+
headers["WWW-Authenticate"] = parts.join(", ");
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
body: JSON.stringify({
|
|
55
|
+
error: {
|
|
56
|
+
code: -32001,
|
|
57
|
+
data: {
|
|
58
|
+
error: "insufficient_scope",
|
|
59
|
+
required_scopes: requiredScopes
|
|
60
|
+
},
|
|
61
|
+
message: errorDescription || "Insufficient scope"
|
|
62
|
+
},
|
|
63
|
+
id: requestId ?? null,
|
|
64
|
+
jsonrpc: "2.0"
|
|
65
|
+
}),
|
|
66
|
+
headers,
|
|
67
|
+
statusCode: 403
|
|
68
|
+
};
|
|
69
|
+
}
|
|
38
70
|
getUnauthorizedResponse(options) {
|
|
39
71
|
const headers = { "Content-Type": "application/json" };
|
|
40
72
|
if (this.config.oauth) {
|
|
@@ -15070,6 +15102,9 @@ const getWWWAuthenticateHeader = (oauth, options) => {
|
|
|
15070
15102
|
if (params.length === 0) return;
|
|
15071
15103
|
return `Bearer ${params.join(", ")}`;
|
|
15072
15104
|
};
|
|
15105
|
+
const isScopeChallengeError = (error) => {
|
|
15106
|
+
return typeof error === "object" && error !== null && "name" in error && error.name === "InsufficientScopeError" && "data" in error && typeof error.data === "object" && error.data !== null && "error" in error.data && error.data.error === "insufficient_scope";
|
|
15107
|
+
};
|
|
15073
15108
|
const handleResponseError = async (error, res) => {
|
|
15074
15109
|
if (error && typeof error === "object" && "status" in error && "headers" in error && "statusText" in error || error instanceof Response) {
|
|
15075
15110
|
const responseError = error;
|
|
@@ -15135,13 +15170,14 @@ const applyCorsHeaders = (req, res, corsOptions) => {
|
|
|
15135
15170
|
console.error("[mcp-proxy] error parsing origin", error);
|
|
15136
15171
|
}
|
|
15137
15172
|
};
|
|
15138
|
-
const handleStreamRequest = async ({ activeTransports, authenticate, createServer, enableJsonResponse, endpoint, eventStore, oauth, onClose, onConnect, req, res, stateless }) => {
|
|
15173
|
+
const handleStreamRequest = async ({ activeTransports, authenticate, authMiddleware, createServer, enableJsonResponse, endpoint, eventStore, oauth, onClose, onConnect, req, res, stateless }) => {
|
|
15139
15174
|
if (req.method === "POST" && new URL(req.url, "http://localhost").pathname === endpoint) {
|
|
15175
|
+
let body;
|
|
15140
15176
|
try {
|
|
15141
15177
|
const sessionId = Array.isArray(req.headers["mcp-session-id"]) ? req.headers["mcp-session-id"][0] : req.headers["mcp-session-id"];
|
|
15142
15178
|
let transport;
|
|
15143
15179
|
let server;
|
|
15144
|
-
|
|
15180
|
+
body = await getBody(req);
|
|
15145
15181
|
if (stateless && authenticate) try {
|
|
15146
15182
|
const authResult = await authenticate(req);
|
|
15147
15183
|
if (!authResult || typeof authResult === "object" && "authenticated" in authResult && !authResult.authenticated) {
|
|
@@ -15286,6 +15322,12 @@ const handleStreamRequest = async ({ activeTransports, authenticate, createServe
|
|
|
15286
15322
|
await transport.handleRequest(req, res, body);
|
|
15287
15323
|
return true;
|
|
15288
15324
|
} catch (error) {
|
|
15325
|
+
if (isScopeChallengeError(error)) {
|
|
15326
|
+
const response = authMiddleware.getScopeChallengeResponse(error.data.requiredScopes, error.data.errorDescription, body?.id);
|
|
15327
|
+
res.writeHead(response.statusCode, response.headers);
|
|
15328
|
+
res.end(response.body);
|
|
15329
|
+
return true;
|
|
15330
|
+
}
|
|
15289
15331
|
console.error("[mcp-proxy] error handling request", error);
|
|
15290
15332
|
res.setHeader("Content-Type", "application/json");
|
|
15291
15333
|
res.writeHead(500).end(createJsonRpcErrorResponse(-32603, "Internal Server Error"));
|
|
@@ -15358,8 +15400,11 @@ const handleSSERequest = async ({ activeTransports, createServer, endpoint, onCl
|
|
|
15358
15400
|
await server.connect(transport);
|
|
15359
15401
|
await transport.send({
|
|
15360
15402
|
jsonrpc: "2.0",
|
|
15361
|
-
method: "
|
|
15362
|
-
params: {
|
|
15403
|
+
method: "notifications/message",
|
|
15404
|
+
params: {
|
|
15405
|
+
data: "SSE Connection established",
|
|
15406
|
+
level: "info"
|
|
15407
|
+
}
|
|
15363
15408
|
});
|
|
15364
15409
|
if (onConnect) await onConnect(server);
|
|
15365
15410
|
} catch (error) {
|
|
@@ -15425,6 +15470,7 @@ const startHTTPServer = async ({ apiKey, authenticate, cors, createServer, enabl
|
|
|
15425
15470
|
if (streamEndpoint && await handleStreamRequest({
|
|
15426
15471
|
activeTransports: activeStreamTransports,
|
|
15427
15472
|
authenticate,
|
|
15473
|
+
authMiddleware,
|
|
15428
15474
|
createServer,
|
|
15429
15475
|
enableJsonResponse,
|
|
15430
15476
|
endpoint: streamEndpoint,
|
|
@@ -21645,4 +21691,4 @@ function serializeMessage(message) {
|
|
|
21645
21691
|
|
|
21646
21692
|
//#endregion
|
|
21647
21693
|
export { AuthenticationMiddleware, Client, InMemoryEventStore, JSONRPCMessageSchema, LATEST_PROTOCOL_VERSION, NEVER, ReadBuffer, Server, ZodIssueCode, __commonJS, __toESM, anyType, arrayType, booleanType, isInitializedNotification, isJSONRPCRequest, isJSONRPCResponse, numberType, objectType, proxyServer, serializeMessage, startHTTPServer, stringType };
|
|
21648
|
-
//# sourceMappingURL=stdio-
|
|
21694
|
+
//# sourceMappingURL=stdio-CfAxSAGj.js.map
|