mcp-trellis 1.0.0 → 2.2.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 +65 -93
- package/dist/adapters/node-request.d.ts +53 -0
- package/dist/adapters/node-request.d.ts.map +1 -0
- package/dist/adapters/node-request.js +165 -0
- package/dist/adapters/node-request.js.map +1 -0
- package/dist/adapters/node.d.ts +13 -30
- package/dist/adapters/node.d.ts.map +1 -1
- package/dist/adapters/node.js +55 -101
- package/dist/adapters/node.js.map +1 -1
- package/dist/advanced.d.ts +18 -0
- package/dist/advanced.d.ts.map +1 -0
- package/dist/advanced.js +18 -0
- package/dist/advanced.js.map +1 -0
- package/dist/app-options.d.ts +132 -0
- package/dist/app-options.d.ts.map +1 -0
- package/dist/app-options.js +2 -0
- package/dist/app-options.js.map +1 -0
- package/dist/app.d.ts +2 -89
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +143 -63
- package/dist/app.js.map +1 -1
- package/dist/audit.d.ts +5 -5
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +19 -8
- package/dist/audit.js.map +1 -1
- package/dist/auth/bearer.d.ts +4 -1
- package/dist/auth/bearer.d.ts.map +1 -1
- package/dist/auth/bearer.js +19 -4
- package/dist/auth/bearer.js.map +1 -1
- package/dist/auth/signed-token.d.ts +26 -0
- package/dist/auth/signed-token.d.ts.map +1 -0
- package/dist/auth/signed-token.js +96 -0
- package/dist/auth/signed-token.js.map +1 -0
- package/dist/clients.js +1 -1
- package/dist/clients.js.map +1 -1
- package/dist/deprecated.d.ts +42 -0
- package/dist/deprecated.d.ts.map +1 -0
- package/dist/deprecated.js +35 -0
- package/dist/deprecated.js.map +1 -0
- package/dist/{body.d.ts → http/body.d.ts} +27 -6
- package/dist/http/body.d.ts.map +1 -0
- package/dist/{body.js → http/body.js} +33 -13
- package/dist/http/body.js.map +1 -0
- package/dist/http/http.d.ts +42 -0
- package/dist/http/http.d.ts.map +1 -0
- package/dist/http/http.js +100 -0
- package/dist/http/http.js.map +1 -0
- package/dist/http/origins.d.ts +37 -0
- package/dist/http/origins.d.ts.map +1 -0
- package/dist/http/origins.js +87 -0
- package/dist/http/origins.js.map +1 -0
- package/dist/{dispatch.d.ts → mcp/dispatch.d.ts} +1 -1
- package/dist/mcp/dispatch.d.ts.map +1 -0
- package/dist/mcp/dispatch.js +99 -0
- package/dist/mcp/dispatch.js.map +1 -0
- package/dist/{jsonrpc.d.ts → mcp/jsonrpc.d.ts} +9 -0
- package/dist/mcp/jsonrpc.d.ts.map +1 -0
- package/dist/mcp/jsonrpc.js +88 -0
- package/dist/mcp/jsonrpc.js.map +1 -0
- package/dist/{methods.d.ts → mcp/methods.d.ts} +60 -11
- package/dist/mcp/methods.d.ts.map +1 -0
- package/dist/mcp/methods.js +84 -0
- package/dist/mcp/methods.js.map +1 -0
- package/dist/{protocol.d.ts → mcp/protocol.d.ts} +1 -3
- package/dist/mcp/protocol.d.ts.map +1 -0
- package/dist/{protocol.js → mcp/protocol.js} +1 -3
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/registry.d.ts +58 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +81 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/rpc-handlers.d.ts +11 -0
- package/dist/mcp/rpc-handlers.d.ts.map +1 -0
- package/dist/mcp/rpc-handlers.js +133 -0
- package/dist/mcp/rpc-handlers.js.map +1 -0
- package/dist/{tools.d.ts → mcp/tools.d.ts} +20 -1
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +166 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/{validate.d.ts → mcp/validate.d.ts} +18 -21
- package/dist/mcp/validate.d.ts.map +1 -0
- package/dist/{validate.js → mcp/validate.js} +59 -41
- package/dist/mcp/validate.js.map +1 -0
- package/dist/oauth/audit.d.ts +20 -0
- package/dist/oauth/audit.d.ts.map +1 -0
- package/dist/oauth/audit.js +29 -0
- package/dist/oauth/audit.js.map +1 -0
- package/dist/oauth/cimd/cimd-parse.d.ts +4 -0
- package/dist/oauth/cimd/cimd-parse.d.ts.map +1 -0
- package/dist/oauth/cimd/cimd-parse.js +70 -0
- package/dist/oauth/cimd/cimd-parse.js.map +1 -0
- package/dist/oauth/cimd/cimd-ssrf.d.ts +8 -0
- package/dist/oauth/cimd/cimd-ssrf.d.ts.map +1 -0
- package/dist/oauth/cimd/cimd-ssrf.js +193 -0
- package/dist/oauth/cimd/cimd-ssrf.js.map +1 -0
- package/dist/oauth/cimd/cimd.d.ts +36 -0
- package/dist/oauth/cimd/cimd.d.ts.map +1 -0
- package/dist/oauth/cimd/cimd.js +132 -0
- package/dist/oauth/cimd/cimd.js.map +1 -0
- package/dist/oauth/cimd/types.d.ts +12 -0
- package/dist/oauth/cimd/types.d.ts.map +1 -0
- package/dist/oauth/cimd/types.js +3 -0
- package/dist/oauth/cimd/types.js.map +1 -0
- package/dist/oauth/config.d.ts +51 -0
- package/dist/oauth/config.d.ts.map +1 -0
- package/dist/oauth/config.js +108 -0
- package/dist/oauth/config.js.map +1 -0
- package/dist/oauth/constants.d.ts +11 -0
- package/dist/oauth/constants.d.ts.map +1 -1
- package/dist/oauth/constants.js +11 -0
- package/dist/oauth/constants.js.map +1 -1
- package/dist/oauth/{base64url.d.ts → crypto/base64url.d.ts} +0 -1
- package/dist/oauth/crypto/base64url.d.ts.map +1 -0
- package/dist/oauth/{base64url.js → crypto/base64url.js} +0 -1
- package/dist/oauth/crypto/base64url.js.map +1 -0
- package/dist/oauth/crypto/clientauth.d.ts +13 -0
- package/dist/oauth/crypto/clientauth.d.ts.map +1 -0
- package/dist/oauth/crypto/clientauth.js +195 -0
- package/dist/oauth/crypto/clientauth.js.map +1 -0
- package/dist/oauth/crypto/codes.d.ts +65 -0
- package/dist/oauth/crypto/codes.d.ts.map +1 -0
- package/dist/oauth/crypto/codes.js +121 -0
- package/dist/oauth/crypto/codes.js.map +1 -0
- package/dist/oauth/crypto/hkdf.d.ts +13 -0
- package/dist/oauth/crypto/hkdf.d.ts.map +1 -0
- package/dist/oauth/crypto/hkdf.js +30 -0
- package/dist/oauth/crypto/hkdf.js.map +1 -0
- package/dist/oauth/crypto/keycache.d.ts +19 -0
- package/dist/oauth/crypto/keycache.d.ts.map +1 -0
- package/dist/oauth/crypto/keycache.js +44 -0
- package/dist/oauth/crypto/keycache.js.map +1 -0
- package/dist/oauth/crypto/pkce.d.ts.map +1 -0
- package/dist/oauth/{pkce.js → crypto/pkce.js} +1 -1
- package/dist/oauth/crypto/pkce.js.map +1 -0
- package/dist/oauth/{sealed.d.ts → crypto/sealed.d.ts} +12 -3
- package/dist/oauth/crypto/sealed.d.ts.map +1 -0
- package/dist/oauth/{sealed.js → crypto/sealed.js} +22 -14
- package/dist/oauth/crypto/sealed.js.map +1 -0
- package/dist/oauth/{secrethash.d.ts → crypto/secrethash.d.ts} +14 -0
- package/dist/oauth/crypto/secrethash.d.ts.map +1 -0
- package/dist/oauth/{secrethash.js → crypto/secrethash.js} +27 -11
- package/dist/oauth/crypto/secrethash.js.map +1 -0
- package/dist/oauth/deprecated.d.ts +52 -0
- package/dist/oauth/deprecated.d.ts.map +1 -0
- package/dist/oauth/deprecated.js +49 -0
- package/dist/oauth/deprecated.js.map +1 -0
- package/dist/oauth/endpoints/authorize.d.ts +3 -0
- package/dist/oauth/endpoints/authorize.d.ts.map +1 -0
- package/dist/oauth/endpoints/authorize.js +209 -0
- package/dist/oauth/endpoints/authorize.js.map +1 -0
- package/dist/oauth/endpoints/callback.d.ts +20 -0
- package/dist/oauth/endpoints/callback.d.ts.map +1 -0
- package/dist/oauth/endpoints/callback.js +31 -0
- package/dist/oauth/endpoints/callback.js.map +1 -0
- package/dist/oauth/endpoints/consent-page.d.ts +5 -0
- package/dist/oauth/endpoints/consent-page.d.ts.map +1 -0
- package/dist/oauth/endpoints/consent-page.js +63 -0
- package/dist/oauth/endpoints/consent-page.js.map +1 -0
- package/dist/oauth/endpoints/consent.d.ts +29 -0
- package/dist/oauth/endpoints/consent.d.ts.map +1 -0
- package/dist/oauth/endpoints/consent.js +98 -0
- package/dist/oauth/endpoints/consent.js.map +1 -0
- package/dist/oauth/{metadata.d.ts → endpoints/metadata.d.ts} +8 -2
- package/dist/oauth/endpoints/metadata.d.ts.map +1 -0
- package/dist/oauth/{metadata.js → endpoints/metadata.js} +10 -4
- package/dist/oauth/endpoints/metadata.js.map +1 -0
- package/dist/oauth/endpoints/register.d.ts +10 -0
- package/dist/oauth/endpoints/register.d.ts.map +1 -0
- package/dist/oauth/endpoints/register.js +96 -0
- package/dist/oauth/endpoints/register.js.map +1 -0
- package/dist/oauth/{revoke.d.ts → endpoints/revoke.d.ts} +1 -1
- package/dist/oauth/endpoints/revoke.d.ts.map +1 -0
- package/dist/oauth/{revoke.js → endpoints/revoke.js} +8 -18
- package/dist/oauth/endpoints/revoke.js.map +1 -0
- package/dist/oauth/endpoints/token.d.ts +3 -0
- package/dist/oauth/endpoints/token.d.ts.map +1 -0
- package/dist/oauth/{token.js → endpoints/token.js} +32 -25
- package/dist/oauth/endpoints/token.js.map +1 -0
- package/dist/oauth/{wellknown.d.ts → endpoints/wellknown.d.ts} +1 -1
- package/dist/oauth/endpoints/wellknown.d.ts.map +1 -0
- package/dist/oauth/{wellknown.js → endpoints/wellknown.js} +7 -9
- package/dist/oauth/endpoints/wellknown.js.map +1 -0
- package/dist/oauth/policy/redirect.d.ts.map +1 -0
- package/dist/oauth/policy/redirect.js.map +1 -0
- package/dist/oauth/policy/reqbody.d.ts +18 -0
- package/dist/oauth/policy/reqbody.d.ts.map +1 -0
- package/dist/oauth/policy/reqbody.js +68 -0
- package/dist/oauth/policy/reqbody.js.map +1 -0
- package/dist/oauth/{resource.d.ts → policy/resource.d.ts} +1 -1
- package/dist/oauth/policy/resource.d.ts.map +1 -0
- package/dist/oauth/{resource.js → policy/resource.js} +2 -2
- package/dist/oauth/policy/resource.js.map +1 -0
- package/dist/oauth/{scope.d.ts → policy/scope.d.ts} +2 -2
- package/dist/oauth/policy/scope.d.ts.map +1 -0
- package/dist/oauth/{scope.js → policy/scope.js} +3 -3
- package/dist/oauth/policy/scope.js.map +1 -0
- package/dist/oauth/router.d.ts +10 -13
- package/dist/oauth/router.d.ts.map +1 -1
- package/dist/oauth/router.js +93 -115
- package/dist/oauth/router.js.map +1 -1
- package/dist/oauth/types.d.ts +99 -45
- package/dist/oauth/types.d.ts.map +1 -1
- package/dist/oauth/types.js +1 -90
- package/dist/oauth/types.js.map +1 -1
- package/dist/server.d.ts +13 -12
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -8
- package/dist/server.js.map +1 -1
- package/dist/util/defined.d.ts +11 -0
- package/dist/util/defined.d.ts.map +1 -0
- package/dist/util/defined.js +15 -0
- package/dist/util/defined.js.map +1 -0
- package/dist/util/json.d.ts +3 -0
- package/dist/util/json.d.ts.map +1 -0
- package/dist/util/json.js +3 -0
- package/dist/util/json.js.map +1 -0
- package/docs/ROADMAP.md +37 -47
- package/docs/compatibility.md +86 -0
- package/docs/diagrams/demo-tool-result.png +0 -0
- package/docs/diagrams/mcp-trellis-architecture.html +305 -0
- package/docs/guide.md +46 -16
- package/docs/reference.md +55 -22
- package/docs/security.md +58 -9
- package/docs/troubleshooting.md +19 -0
- package/package.json +27 -10
- package/dist/adapters/origins.d.ts +0 -19
- package/dist/adapters/origins.d.ts.map +0 -1
- package/dist/adapters/origins.js +0 -52
- package/dist/adapters/origins.js.map +0 -1
- package/dist/body.d.ts.map +0 -1
- package/dist/body.js.map +0 -1
- package/dist/dispatch.d.ts.map +0 -1
- package/dist/dispatch.js +0 -119
- package/dist/dispatch.js.map +0 -1
- package/dist/http.d.ts +0 -17
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -38
- package/dist/http.js.map +0 -1
- package/dist/jsonrpc.d.ts.map +0 -1
- package/dist/jsonrpc.js +0 -18
- package/dist/jsonrpc.js.map +0 -1
- package/dist/methods.d.ts.map +0 -1
- package/dist/methods.js +0 -130
- package/dist/methods.js.map +0 -1
- package/dist/oauth/authorize.d.ts +0 -3
- package/dist/oauth/authorize.d.ts.map +0 -1
- package/dist/oauth/authorize.js +0 -141
- package/dist/oauth/authorize.js.map +0 -1
- package/dist/oauth/base64url.d.ts.map +0 -1
- package/dist/oauth/base64url.js.map +0 -1
- package/dist/oauth/clientauth.d.ts +0 -24
- package/dist/oauth/clientauth.d.ts.map +0 -1
- package/dist/oauth/clientauth.js +0 -119
- package/dist/oauth/clientauth.js.map +0 -1
- package/dist/oauth/codes.d.ts +0 -30
- package/dist/oauth/codes.d.ts.map +0 -1
- package/dist/oauth/codes.js +0 -85
- package/dist/oauth/codes.js.map +0 -1
- package/dist/oauth/consent.d.ts +0 -65
- package/dist/oauth/consent.d.ts.map +0 -1
- package/dist/oauth/consent.js +0 -173
- package/dist/oauth/consent.js.map +0 -1
- package/dist/oauth/metadata.d.ts.map +0 -1
- package/dist/oauth/metadata.js.map +0 -1
- package/dist/oauth/pkce.d.ts.map +0 -1
- package/dist/oauth/pkce.js.map +0 -1
- package/dist/oauth/redirect.d.ts.map +0 -1
- package/dist/oauth/redirect.js.map +0 -1
- package/dist/oauth/reqbody.d.ts +0 -10
- package/dist/oauth/reqbody.d.ts.map +0 -1
- package/dist/oauth/reqbody.js +0 -29
- package/dist/oauth/reqbody.js.map +0 -1
- package/dist/oauth/resource.d.ts.map +0 -1
- package/dist/oauth/resource.js.map +0 -1
- package/dist/oauth/revoke.d.ts.map +0 -1
- package/dist/oauth/revoke.js.map +0 -1
- package/dist/oauth/scope.d.ts.map +0 -1
- package/dist/oauth/scope.js.map +0 -1
- package/dist/oauth/sealed.d.ts.map +0 -1
- package/dist/oauth/sealed.js.map +0 -1
- package/dist/oauth/secrethash.d.ts.map +0 -1
- package/dist/oauth/secrethash.js.map +0 -1
- package/dist/oauth/token.d.ts +0 -3
- package/dist/oauth/token.d.ts.map +0 -1
- package/dist/oauth/token.js.map +0 -1
- package/dist/oauth/wellknown.d.ts.map +0 -1
- package/dist/oauth/wellknown.js.map +0 -1
- package/dist/protocol.d.ts.map +0 -1
- package/dist/protocol.js.map +0 -1
- package/dist/registry.d.ts +0 -37
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js +0 -77
- package/dist/registry.js.map +0 -1
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -98
- package/dist/tools.js.map +0 -1
- package/dist/validate.d.ts.map +0 -1
- package/dist/validate.js.map +0 -1
- /package/dist/oauth/{pkce.d.ts → crypto/pkce.d.ts} +0 -0
- /package/dist/oauth/{redirect.d.ts → policy/redirect.d.ts} +0 -0
- /package/dist/oauth/{redirect.js → policy/redirect.js} +0 -0
package/dist/dispatch.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { rejectQueryToken } from "./auth/bearer.js";
|
|
2
|
-
import { BodyTooLargeError, DEFAULT_MCP_BODY_LIMIT, readBoundedText } from "./body.js";
|
|
3
|
-
import { emptyResponse, INTERNAL_ERROR, jsonResponse, methodNotAllowed, optionsResponse, } from "./http.js";
|
|
4
|
-
import { JSONRPC_INTERNAL_ERROR, JSONRPC_INVALID_REQUEST, JSONRPC_PARSE_ERROR, JSONRPC_PAYLOAD_TOO_LARGE, rpcError, } from "./jsonrpc.js";
|
|
5
|
-
import { DEFAULT_PUBLIC_METHODS, dispatchRpc, isNotification, resolveWww, safeAudit, unauthorized, } from "./methods.js";
|
|
6
|
-
import { PROTOCOL_VERSIONS } from "./protocol.js";
|
|
7
|
-
const parseBody = async (request) => {
|
|
8
|
-
let text;
|
|
9
|
-
try {
|
|
10
|
-
text = await readBoundedText(request, DEFAULT_MCP_BODY_LIMIT);
|
|
11
|
-
}
|
|
12
|
-
catch (exc) {
|
|
13
|
-
if (exc instanceof BodyTooLargeError) {
|
|
14
|
-
return jsonResponse(rpcError(null, JSONRPC_PAYLOAD_TOO_LARGE, "Payload too large"), 413);
|
|
15
|
-
}
|
|
16
|
-
return jsonResponse(rpcError(null, JSONRPC_PARSE_ERROR, "Parse error"), 400);
|
|
17
|
-
}
|
|
18
|
-
try {
|
|
19
|
-
return JSON.parse(text);
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return jsonResponse(rpcError(null, JSONRPC_PARSE_ERROR, "Parse error"), 400);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
/** Transport-level denial: no JSON-RPC method has been parsed yet. */
|
|
26
|
-
const auditDenial = (options, error, startedAt) => safeAudit(options, { method: "", ok: false, error, durationMs: Date.now() - startedAt });
|
|
27
|
-
const guardPost = async (request, options, startedAt) => {
|
|
28
|
-
if (rejectQueryToken(new URL(request.url))) {
|
|
29
|
-
await auditDenial(options, "query_string_token", startedAt);
|
|
30
|
-
return unauthorized(resolveWww(options, request), "Token in query string is rejected. Use Authorization Bearer.");
|
|
31
|
-
}
|
|
32
|
-
return null;
|
|
33
|
-
};
|
|
34
|
-
const handleGet = async (request, options, startedAt) => {
|
|
35
|
-
if (rejectQueryToken(new URL(request.url))) {
|
|
36
|
-
await auditDenial(options, "query_string_token", startedAt);
|
|
37
|
-
return jsonResponse({
|
|
38
|
-
error: "Pass token via Authorization: Bearer header, not query string",
|
|
39
|
-
}, 400);
|
|
40
|
-
}
|
|
41
|
-
if (!request.headers.get("authorization")) {
|
|
42
|
-
await auditDenial(options, "unauthorized", startedAt);
|
|
43
|
-
return unauthorized(resolveWww(options, request));
|
|
44
|
-
}
|
|
45
|
-
return methodNotAllowed("Use POST for MCP");
|
|
46
|
-
};
|
|
47
|
-
/**
|
|
48
|
-
* RFC-shaped JSON-RPC id extraction for an error response before
|
|
49
|
-
* `dispatchRpc`'s own normalization runs — `undefined` (omitted, as on a
|
|
50
|
-
* notification) becomes `null`; anything else is echoed as-is, matching
|
|
51
|
-
* `dispatchRpc`'s rule so a client sees the same id either way.
|
|
52
|
-
*/
|
|
53
|
-
const errorId = (msg) => (msg.id === undefined ? null : msg.id);
|
|
54
|
-
/**
|
|
55
|
-
* The 2025-06-18 spec requires `MCP-Protocol-Version` on every request past
|
|
56
|
-
* `initialize` (which is what negotiates it in the first place — the
|
|
57
|
-
* client can't have the header yet). Unknown/unsupported → 400. Missing →
|
|
58
|
-
* assume `2025-03-26` per the spec's own backwards-compatibility rule for
|
|
59
|
-
* the header specifically (not the same default `initialize` falls back
|
|
60
|
-
* to — see `protocol.ts`).
|
|
61
|
-
*/
|
|
62
|
-
const protocolVersionHeaderError = (request, msg) => {
|
|
63
|
-
if (msg.method === "initialize")
|
|
64
|
-
return null;
|
|
65
|
-
const header = request.headers.get("MCP-Protocol-Version");
|
|
66
|
-
if (!header || PROTOCOL_VERSIONS.has(header))
|
|
67
|
-
return null;
|
|
68
|
-
return jsonResponse(rpcError(errorId(msg), JSONRPC_INVALID_REQUEST, `Unsupported MCP-Protocol-Version: ${header}`), 400);
|
|
69
|
-
};
|
|
70
|
-
const handlePost = async (request, options, publicMethods, startedAt) => {
|
|
71
|
-
const denied = await guardPost(request, options, startedAt);
|
|
72
|
-
if (denied)
|
|
73
|
-
return denied;
|
|
74
|
-
const parsed = await parseBody(request);
|
|
75
|
-
if (parsed instanceof Response)
|
|
76
|
-
return parsed;
|
|
77
|
-
if (Array.isArray(parsed)) {
|
|
78
|
-
return jsonResponse(rpcError(null, JSONRPC_INVALID_REQUEST, "Batch requests not supported"), 400);
|
|
79
|
-
}
|
|
80
|
-
if (!parsed || typeof parsed !== "object") {
|
|
81
|
-
return jsonResponse(rpcError(null, JSONRPC_PARSE_ERROR, "Parse error"), 400);
|
|
82
|
-
}
|
|
83
|
-
const msg = parsed;
|
|
84
|
-
if (msg.jsonrpc !== "2.0") {
|
|
85
|
-
return jsonResponse(rpcError(errorId(msg), JSONRPC_INVALID_REQUEST, 'jsonrpc must be "2.0"'), 400);
|
|
86
|
-
}
|
|
87
|
-
const versionError = protocolVersionHeaderError(request, msg);
|
|
88
|
-
if (versionError)
|
|
89
|
-
return versionError;
|
|
90
|
-
if (isNotification(msg))
|
|
91
|
-
return emptyResponse(202);
|
|
92
|
-
return dispatchRpc({ req: request, body: msg, options, publicMethods, startedAt });
|
|
93
|
-
};
|
|
94
|
-
export const createMcpHandler = (options) => {
|
|
95
|
-
const publicMethods = options.publicMethods ?? DEFAULT_PUBLIC_METHODS;
|
|
96
|
-
const HTTP_METHODS = {
|
|
97
|
-
OPTIONS: () => optionsResponse(),
|
|
98
|
-
GET: (request, startedAt) => handleGet(request, options, startedAt),
|
|
99
|
-
POST: (request, startedAt) => handlePost(request, options, publicMethods, startedAt),
|
|
100
|
-
};
|
|
101
|
-
return {
|
|
102
|
-
fetch: async (request) => {
|
|
103
|
-
const startedAt = Date.now();
|
|
104
|
-
try {
|
|
105
|
-
const handler = HTTP_METHODS[request.method];
|
|
106
|
-
return await (handler ? handler(request, startedAt) : methodNotAllowed());
|
|
107
|
-
}
|
|
108
|
-
catch (exc) {
|
|
109
|
-
// A host port (authenticate/context/audit) threw. `fetch` must never
|
|
110
|
-
// reject — the caller gets an honest 500, not an unhandled rejection
|
|
111
|
-
// whose shape depends on which runtime is hosting this.
|
|
112
|
-
const error = exc instanceof Error && exc.message ? exc.message : INTERNAL_ERROR;
|
|
113
|
-
await auditDenial(options, error, startedAt);
|
|
114
|
-
return jsonResponse(rpcError(null, JSONRPC_INTERNAL_ERROR, "Internal error"), 500);
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
};
|
|
119
|
-
//# sourceMappingURL=dispatch.js.map
|
package/dist/dispatch.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/** JSON `error` body / audit reason when a host port throws. */
|
|
2
|
-
export declare const INTERNAL_ERROR = "internal_error";
|
|
3
|
-
export declare const corsHeaders: (extra?: Record<string, string>) => Record<string, string>;
|
|
4
|
-
export type JsonResponseOptions = {
|
|
5
|
-
/** Include permissive CORS headers. Default true (MCP). OAuth token set false. */
|
|
6
|
-
cors?: boolean;
|
|
7
|
-
};
|
|
8
|
-
export declare const jsonResponse: (data: unknown, status?: number, extraHeaders?: Record<string, string>, options?: JsonResponseOptions) => Response;
|
|
9
|
-
export declare const emptyResponse: (status: number) => Response;
|
|
10
|
-
export declare const optionsResponse: (options?: JsonResponseOptions) => Response;
|
|
11
|
-
export declare const methodNotAllowed: (message?: string, options?: JsonResponseOptions) => Response;
|
|
12
|
-
/**
|
|
13
|
-
* OPTIONS → 204; allowed verb → null (continue); otherwise → 405.
|
|
14
|
-
* Shared by OAuth handlers that all need the same method gate.
|
|
15
|
-
*/
|
|
16
|
-
export declare const requireHttpMethod: (request: Request, allowed: ReadonlySet<string>, options?: JsonResponseOptions) => Response | null;
|
|
17
|
-
//# sourceMappingURL=http.d.ts.map
|
package/dist/http.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAKhF,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG;IAChC,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,MAAM,OAAO,EACb,eAAY,EACZ,eAAe,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,UAAU,mBAAmB,KAC5B,QAWF,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,KAAG,QACS,CAAC;AAEzD,eAAO,MAAM,eAAe,GAAI,UAAU,mBAAmB,KAAG,QAI5D,CAAC;AAEL,eAAO,MAAM,gBAAgB,GAC3B,gBAA8B,EAC9B,UAAU,mBAAmB,KAC5B,QAAqE,CAAC;AAEzE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,OAAO,EAChB,SAAS,WAAW,CAAC,MAAM,CAAC,EAC5B,UAAU,mBAAmB,KAC5B,QAAQ,GAAG,IAIb,CAAC"}
|
package/dist/http.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/** JSON `error` body / audit reason when a host port throws. */
|
|
2
|
-
export const INTERNAL_ERROR = "internal_error";
|
|
3
|
-
export const corsHeaders = (extra) => ({
|
|
4
|
-
"Access-Control-Allow-Origin": "*",
|
|
5
|
-
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
|
|
6
|
-
"Access-Control-Allow-Headers": "Content-Type, Authorization, MCP-Protocol-Version",
|
|
7
|
-
...extra,
|
|
8
|
-
});
|
|
9
|
-
export const jsonResponse = (data, status = 200, extraHeaders, options) => {
|
|
10
|
-
const cors = options?.cors !== false;
|
|
11
|
-
return new Response(JSON.stringify(data), {
|
|
12
|
-
status,
|
|
13
|
-
headers: {
|
|
14
|
-
"Content-Type": "application/json",
|
|
15
|
-
"Cache-Control": "no-store",
|
|
16
|
-
...(cors ? corsHeaders() : {}),
|
|
17
|
-
...extraHeaders,
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
export const emptyResponse = (status) => new Response(null, { status, headers: corsHeaders() });
|
|
22
|
-
export const optionsResponse = (options) => new Response(null, {
|
|
23
|
-
status: 204,
|
|
24
|
-
headers: options?.cors === false ? { "Cache-Control": "no-store" } : corsHeaders(),
|
|
25
|
-
});
|
|
26
|
-
export const methodNotAllowed = (message = "Method not allowed", options) => jsonResponse({ error: message }, 405, undefined, options);
|
|
27
|
-
/**
|
|
28
|
-
* OPTIONS → 204; allowed verb → null (continue); otherwise → 405.
|
|
29
|
-
* Shared by OAuth handlers that all need the same method gate.
|
|
30
|
-
*/
|
|
31
|
-
export const requireHttpMethod = (request, allowed, options) => {
|
|
32
|
-
if (request.method === "OPTIONS")
|
|
33
|
-
return optionsResponse(options);
|
|
34
|
-
if (allowed.has(request.method))
|
|
35
|
-
return null;
|
|
36
|
-
return jsonResponse({ detail: "method not allowed" }, 405, undefined, options);
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=http.js.map
|
package/dist/http.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAA8B,EAA0B,EAAE,CAAC,CAAC;IACtF,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,oBAAoB;IACpD,8BAA8B,EAAE,mDAAmD;IACnF,GAAG,KAAK;CACT,CAAC,CAAC;AAOH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAAa,EACb,MAAM,GAAG,GAAG,EACZ,YAAqC,EACrC,OAA6B,EACnB,EAAE;IACZ,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,KAAK,KAAK,CAAC;IACrC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,eAAe,EAAE,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,GAAG,YAAY;SAChB;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAY,EAAE,CACxD,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAA6B,EAAY,EAAE,CACzE,IAAI,QAAQ,CAAC,IAAI,EAAE;IACjB,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,OAAO,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;CACnF,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAAO,GAAG,oBAAoB,EAC9B,OAA6B,EACnB,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAgB,EAChB,OAA4B,EAC5B,OAA6B,EACZ,EAAE;IACnB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC,CAAC"}
|
package/dist/jsonrpc.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../src/jsonrpc.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAE/C,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;AAE9D,eAAO,MAAM,mBAAmB,SAAS,CAAC;AAC1C,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAC9C,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,oBAAoB,SAAS,CAAC;AAC3C,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAEhD,eAAO,MAAM,SAAS,GAAI,IAAI,SAAS,EAAE,QAAQ,OAAO,KAAG,cAIzD,CAAC;AAEH,eAAO,MAAM,QAAQ,GAAI,IAAI,SAAS,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,cAItE,CAAC"}
|
package/dist/jsonrpc.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export const JSONRPC_PARSE_ERROR = -32700;
|
|
2
|
-
export const JSONRPC_INVALID_REQUEST = -32600;
|
|
3
|
-
export const JSONRPC_METHOD_NOT_FOUND = -32601;
|
|
4
|
-
export const JSONRPC_INVALID_PARAMS = -32602;
|
|
5
|
-
export const JSONRPC_INTERNAL_ERROR = -32603;
|
|
6
|
-
export const JSONRPC_UNAUTHORIZED = -32001;
|
|
7
|
-
export const JSONRPC_PAYLOAD_TOO_LARGE = -32002;
|
|
8
|
-
export const rpcResult = (id, result) => ({
|
|
9
|
-
jsonrpc: "2.0",
|
|
10
|
-
id,
|
|
11
|
-
result,
|
|
12
|
-
});
|
|
13
|
-
export const rpcError = (id, code, message) => ({
|
|
14
|
-
jsonrpc: "2.0",
|
|
15
|
-
id,
|
|
16
|
-
error: { code, message },
|
|
17
|
-
});
|
|
18
|
-
//# sourceMappingURL=jsonrpc.js.map
|
package/dist/jsonrpc.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../src/jsonrpc.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAK,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAK,CAAC;AAC9C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAK,CAAC;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAK,CAAC;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAK,CAAC;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,CAAC;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAK,CAAC;AAEhD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAa,EAAE,MAAe,EAAkB,EAAE,CAAC,CAAC;IAC5E,OAAO,EAAE,KAAK;IACd,EAAE;IACF,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAa,EAAE,IAAY,EAAE,OAAe,EAAkB,EAAE,CAAC,CAAC;IACzF,OAAO,EAAE,KAAK;IACd,EAAE;IACF,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;CACzB,CAAC,CAAC"}
|
package/dist/methods.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"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"}
|
package/dist/methods.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { wwwAuthenticateHeader } from "./auth/bearer.js";
|
|
2
|
-
import { emptyResponse, jsonResponse } from "./http.js";
|
|
3
|
-
import { JSONRPC_METHOD_NOT_FOUND, JSONRPC_UNAUTHORIZED, rpcError, rpcResult, } from "./jsonrpc.js";
|
|
4
|
-
import { pickProtocolVersion } from "./protocol.js";
|
|
5
|
-
const DEFAULT_AUDIT_TIMEOUT_MS = 1000;
|
|
6
|
-
export const DEFAULT_PUBLIC_METHODS = new Set([
|
|
7
|
-
"initialize",
|
|
8
|
-
"ping",
|
|
9
|
-
"notifications/initialized",
|
|
10
|
-
"initialized",
|
|
11
|
-
]);
|
|
12
|
-
const NOTIFICATION_PREDICATES = [
|
|
13
|
-
(body) => typeof body.method === "string" && body.method.startsWith("notifications/"),
|
|
14
|
-
(body) => body.method === "initialized",
|
|
15
|
-
(body) => body.id === undefined && body.method === undefined && "result" in body,
|
|
16
|
-
];
|
|
17
|
-
export const isNotification = (body) => NOTIFICATION_PREDICATES.some((predicate) => predicate(body));
|
|
18
|
-
export const resolveWww = (options, req) => typeof options.wwwAuthenticate === "function"
|
|
19
|
-
? options.wwwAuthenticate(req)
|
|
20
|
-
: options.wwwAuthenticate;
|
|
21
|
-
/**
|
|
22
|
-
* `id` defaults to `null` for the transport-level call sites in
|
|
23
|
-
* `dispatch.ts` — a body hasn't been parsed yet there, so there's no real
|
|
24
|
-
* id to echo. Call sites past that point (inside `dispatchRpc` and the
|
|
25
|
-
* method handlers) have one and must pass it, or a client correlating
|
|
26
|
-
* responses by id sees `null` on every 401 regardless of what it sent.
|
|
27
|
-
*/
|
|
28
|
-
export const unauthorized = (www, message = "Unauthorized", id = null) => jsonResponse(rpcError(id, JSONRPC_UNAUTHORIZED, message), 401, {
|
|
29
|
-
"WWW-Authenticate": wwwAuthenticateHeader(www),
|
|
30
|
-
});
|
|
31
|
-
/**
|
|
32
|
-
* Invoke the audit metrics hook, swallowing any failure and racing it
|
|
33
|
-
* against `auditTimeoutMs` so a hanging sink can't stall the response
|
|
34
|
-
* either — "can't fail a request" was already true; this adds "can't
|
|
35
|
-
* delay one" past a bound. The audit call keeps running in the background
|
|
36
|
-
* if the timer wins; its own `catch` below means it can never surface as
|
|
37
|
-
* an unhandled rejection whenever it does finish.
|
|
38
|
-
*/
|
|
39
|
-
export const safeAudit = async (options, entry) => {
|
|
40
|
-
const audit = options.ports.audit;
|
|
41
|
-
if (!audit)
|
|
42
|
-
return;
|
|
43
|
-
const settled = (async () => {
|
|
44
|
-
try {
|
|
45
|
-
await audit(entry);
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// Intentionally ignored.
|
|
49
|
-
}
|
|
50
|
-
})();
|
|
51
|
-
const timeoutMs = options.auditTimeoutMs ?? DEFAULT_AUDIT_TIMEOUT_MS;
|
|
52
|
-
await Promise.race([settled, new Promise((resolve) => setTimeout(resolve, timeoutMs))]);
|
|
53
|
-
};
|
|
54
|
-
export const hasScope = (principal, scope) => {
|
|
55
|
-
if (!scope)
|
|
56
|
-
return true;
|
|
57
|
-
return principal.scopes.includes(scope) || principal.scopes.includes("*");
|
|
58
|
-
};
|
|
59
|
-
const METHODS = {
|
|
60
|
-
initialize: async ({ id, body, options }) => jsonResponse(rpcResult(id, {
|
|
61
|
-
protocolVersion: pickProtocolVersion(body.params),
|
|
62
|
-
capabilities: { tools: {} },
|
|
63
|
-
serverInfo: options.serverInfo,
|
|
64
|
-
instructions: options.instructions ?? "",
|
|
65
|
-
})),
|
|
66
|
-
ping: async ({ id }) => jsonResponse(rpcResult(id, {})),
|
|
67
|
-
"tools/list": async ({ id, options }) => jsonResponse(rpcResult(id, { tools: options.registry.list() })),
|
|
68
|
-
"tools/call": async ({ req, body, id, principal, ctx, options, startedAt }) => {
|
|
69
|
-
const params = body.params ?? {};
|
|
70
|
-
const name = String(params.name ?? "");
|
|
71
|
-
const rawArgs = params.arguments;
|
|
72
|
-
const args = rawArgs !== null && typeof rawArgs === "object" && !Array.isArray(rawArgs)
|
|
73
|
-
? rawArgs
|
|
74
|
-
: {};
|
|
75
|
-
const tool = options.registry.get(name);
|
|
76
|
-
if (tool?.scope && (!principal || !hasScope(principal, tool.scope))) {
|
|
77
|
-
await safeAudit(options, {
|
|
78
|
-
method: "tools/call",
|
|
79
|
-
tool: name,
|
|
80
|
-
principalId: principal?.id,
|
|
81
|
-
ok: false,
|
|
82
|
-
error: "missing_scope",
|
|
83
|
-
durationMs: Date.now() - startedAt,
|
|
84
|
-
});
|
|
85
|
-
return unauthorized(resolveWww(options, req), `Missing scope: ${tool.scope}`, id);
|
|
86
|
-
}
|
|
87
|
-
const started = Date.now();
|
|
88
|
-
const result = await options.registry.call(name, ctx, args);
|
|
89
|
-
await safeAudit(options, {
|
|
90
|
-
method: "tools/call",
|
|
91
|
-
tool: name,
|
|
92
|
-
principalId: principal?.id,
|
|
93
|
-
ok: !result.isError,
|
|
94
|
-
error: result.isError ? result.content[0]?.text : undefined,
|
|
95
|
-
durationMs: Date.now() - started,
|
|
96
|
-
});
|
|
97
|
-
return jsonResponse(rpcResult(id, result));
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
export const dispatchRpc = async (input) => {
|
|
101
|
-
const { req, body, options, publicMethods, startedAt } = input;
|
|
102
|
-
const method = body.method ?? "";
|
|
103
|
-
// Notifications omit `id`; explicit null is a valid request id (JSON-RPC).
|
|
104
|
-
const id = body.id === undefined ? null : body.id;
|
|
105
|
-
const toolName = method === "tools/call" ? String(body.params?.name ?? "") : undefined;
|
|
106
|
-
const isPublic = publicMethods.has(method) || method.startsWith("notifications/");
|
|
107
|
-
let principal = null;
|
|
108
|
-
if (!isPublic) {
|
|
109
|
-
principal = await options.ports.authenticate(req, method, toolName);
|
|
110
|
-
if (!principal) {
|
|
111
|
-
await safeAudit(options, {
|
|
112
|
-
method,
|
|
113
|
-
tool: toolName,
|
|
114
|
-
ok: false,
|
|
115
|
-
error: "unauthorized",
|
|
116
|
-
durationMs: Date.now() - startedAt,
|
|
117
|
-
});
|
|
118
|
-
return unauthorized(resolveWww(options, req), undefined, id);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
const handler = METHODS[method];
|
|
122
|
-
if (!handler) {
|
|
123
|
-
if (body.id === undefined)
|
|
124
|
-
return emptyResponse(202);
|
|
125
|
-
return jsonResponse(rpcError(body.id, JSONRPC_METHOD_NOT_FOUND, `Method not found: ${method}`));
|
|
126
|
-
}
|
|
127
|
-
const ctx = await options.ports.context(req, principal);
|
|
128
|
-
return handler({ req, body, id, principal, ctx, options, startedAt });
|
|
129
|
-
};
|
|
130
|
-
//# sourceMappingURL=methods.js.map
|
package/dist/methods.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../../src/oauth/authorize.ts"],"names":[],"mappings":"AAeA,OAAO,EAIL,KAAK,kBAAkB,EAKxB,MAAM,YAAY,CAAC;AA6CpB,eAAO,MAAM,eAAe,GAC1B,SAAS,OAAO,EAChB,SAAS,kBAAkB,KAC1B,OAAO,CAAC,QAAQ,CAqHlB,CAAC"}
|
package/dist/oauth/authorize.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { requireHttpMethod } from "../http.js";
|
|
2
|
-
import { issueAuthCode } from "./codes.js";
|
|
3
|
-
import { buildCodeRedirectUrl, buildErrorRedirectUrl, isPreApproved, issueConsentTicket, renderConsent, secureRedirect, } from "./consent.js";
|
|
4
|
-
import { OAUTH_ERRORS } from "./constants.js";
|
|
5
|
-
import { isAllowedRedirectUri } from "./redirect.js";
|
|
6
|
-
import { canonicalResource, resourceErrorInfo } from "./resource.js";
|
|
7
|
-
import { formatScope, requestedScopes, scopeErrorInfo } from "./scope.js";
|
|
8
|
-
import { unseal } from "./sealed.js";
|
|
9
|
-
import { advertisedScopes, defaultScopes, oauthError, registeredClientsRequired, resolveSecret, unregisteredClientError, } from "./types.js";
|
|
10
|
-
const GET_ONLY = new Set(["GET"]);
|
|
11
|
-
/** Reflected into `Location` on denial — an unbounded `state` is a header-size DoS knob. */
|
|
12
|
-
const MAX_STATE_LENGTH = 2048;
|
|
13
|
-
/**
|
|
14
|
-
* A client bound to a known redirect-URI list — either pre-registered via
|
|
15
|
-
* `clientStore`, or a sealed assertion this server itself issued via
|
|
16
|
-
* `/register` (see `sealed.ts`). Unbound clients fall back to the global
|
|
17
|
-
* allowlist, unless `requireRegisteredClients` forbids that entirely.
|
|
18
|
-
*/
|
|
19
|
-
const redirectAllowed = (redirectUri, boundRedirectUris, allowlist) => {
|
|
20
|
-
if (!redirectUri)
|
|
21
|
-
return false;
|
|
22
|
-
if (boundRedirectUris)
|
|
23
|
-
return boundRedirectUris.includes(redirectUri);
|
|
24
|
-
return isAllowedRedirectUri(redirectUri, allowlist);
|
|
25
|
-
};
|
|
26
|
-
const redirectToLogin = (request, url, options) => {
|
|
27
|
-
const next = `${url.pathname}${url.search}`;
|
|
28
|
-
const login = options.ports.loginUrl(request, next);
|
|
29
|
-
let loginTarget;
|
|
30
|
-
try {
|
|
31
|
-
loginTarget = new URL(login, url.origin);
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return oauthError(OAUTH_ERRORS.invalidRequest, 500, "loginUrl must be absolute or same-origin relative");
|
|
35
|
-
}
|
|
36
|
-
if (loginTarget.protocol !== "http:" && loginTarget.protocol !== "https:") {
|
|
37
|
-
return oauthError(OAUTH_ERRORS.invalidRequest, 500, "loginUrl must be absolute or same-origin relative");
|
|
38
|
-
}
|
|
39
|
-
return secureRedirect(loginTarget.toString());
|
|
40
|
-
};
|
|
41
|
-
export const handleAuthorize = async (request, options) => {
|
|
42
|
-
const methodError = requireHttpMethod(request, GET_ONLY);
|
|
43
|
-
if (methodError)
|
|
44
|
-
return methodError;
|
|
45
|
-
const url = new URL(request.url);
|
|
46
|
-
const expectedResource = canonicalResource(url.origin, options.resourcePath);
|
|
47
|
-
const clientId = url.searchParams.get("client_id") ?? "";
|
|
48
|
-
if (!clientId) {
|
|
49
|
-
return oauthError(OAUTH_ERRORS.invalidRequest, 400, "client_id required");
|
|
50
|
-
}
|
|
51
|
-
const registered = (await options.ports.clientStore?.get(clientId)) ?? null;
|
|
52
|
-
const secret = await resolveSecret(options.ports, request);
|
|
53
|
-
// Additive: a `client_id` this server itself sealed via `/register` is
|
|
54
|
-
// bound to its own redirect_uris exactly like a pre-registered client,
|
|
55
|
-
// without ever being written to storage. Non-sealed ids unseal to null
|
|
56
|
-
// and keep today's behavior.
|
|
57
|
-
const assertion = registered ? null : await unseal(secret, "client", clientId);
|
|
58
|
-
if (!registered && !assertion) {
|
|
59
|
-
const unregistered = unregisteredClientError(options, {
|
|
60
|
-
code: OAUTH_ERRORS.unauthorizedClient,
|
|
61
|
-
status: 400,
|
|
62
|
-
});
|
|
63
|
-
if (unregistered)
|
|
64
|
-
return unregistered;
|
|
65
|
-
if (registeredClientsRequired(options)) {
|
|
66
|
-
return oauthError(OAUTH_ERRORS.unauthorizedClient, 400, "client_id must come from clientStore or this server's own /register");
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
const boundRedirectUris = registered?.redirectUris ?? assertion?.redirectUris ?? null;
|
|
70
|
-
const redirectUri = url.searchParams.get("redirect_uri") ?? "";
|
|
71
|
-
const state = url.searchParams.get("state") ?? "";
|
|
72
|
-
// --- Pre-trust tier: redirect_uri is not yet verified as belonging to a
|
|
73
|
-
// legitimate party, so these two stay direct JSON responses. Redirecting
|
|
74
|
-
// here is exactly the open-redirect risk RFC 6749 §4.1.2.1 exists to
|
|
75
|
-
// avoid — the URI itself is what's in question. An oversized `state` is
|
|
76
|
-
// included in this tier too, for a narrower reason: reflecting it back
|
|
77
|
-
// into the error redirect it would otherwise trigger recreates the
|
|
78
|
-
// header-size DoS the cap exists to prevent, on the one input the cap
|
|
79
|
-
// can't safely echo.
|
|
80
|
-
if (!redirectAllowed(redirectUri, boundRedirectUris, options.redirect)) {
|
|
81
|
-
return oauthError(OAUTH_ERRORS.invalidRequest, 400, "invalid redirect_uri");
|
|
82
|
-
}
|
|
83
|
-
if (state.length > MAX_STATE_LENGTH) {
|
|
84
|
-
return oauthError(OAUTH_ERRORS.invalidRequest, 400, `state must be at most ${MAX_STATE_LENGTH} characters`);
|
|
85
|
-
}
|
|
86
|
-
// --- Post-trust tier: redirect_uri is now trusted, so every remaining
|
|
87
|
-
// error goes back to the client's own callback per RFC 6749 §4.1.2.1
|
|
88
|
-
// instead of a bare JSON body the connector never parses.
|
|
89
|
-
const redirectError = (code, description) => secureRedirect(buildErrorRedirectUrl(redirectUri, code, description, state));
|
|
90
|
-
const responseType = url.searchParams.get("response_type") ?? "";
|
|
91
|
-
if (responseType !== "code") {
|
|
92
|
-
return redirectError(OAUTH_ERRORS.unsupportedResponseType, "response_type must be code");
|
|
93
|
-
}
|
|
94
|
-
const codeChallenge = url.searchParams.get("code_challenge") ?? "";
|
|
95
|
-
const challengeMethod = url.searchParams.get("code_challenge_method") ?? "S256";
|
|
96
|
-
if (!codeChallenge || challengeMethod !== "S256") {
|
|
97
|
-
return redirectError(OAUTH_ERRORS.invalidRequest, "PKCE S256 code_challenge required");
|
|
98
|
-
}
|
|
99
|
-
const resourceIssue = resourceErrorInfo(url.searchParams.get("resource") ?? "", expectedResource);
|
|
100
|
-
if (resourceIssue)
|
|
101
|
-
return redirectError(resourceIssue.code, resourceIssue.description);
|
|
102
|
-
const advertised = advertisedScopes(options);
|
|
103
|
-
const granted = requestedScopes(url.searchParams.get("scope") ?? "", defaultScopes(options));
|
|
104
|
-
const scopeIssue = scopeErrorInfo(granted, advertised);
|
|
105
|
-
if (scopeIssue)
|
|
106
|
-
return redirectError(scopeIssue.code, scopeIssue.description);
|
|
107
|
-
const user = await options.ports.resolveUser(request);
|
|
108
|
-
if (!user)
|
|
109
|
-
return redirectToLogin(request, url, options);
|
|
110
|
-
if (isPreApproved(options, clientId, registered)) {
|
|
111
|
-
const code = await issueAuthCode(secret, {
|
|
112
|
-
clientId,
|
|
113
|
-
redirectUri,
|
|
114
|
-
codeChallenge,
|
|
115
|
-
userId: user.id,
|
|
116
|
-
resource: expectedResource,
|
|
117
|
-
scope: formatScope(granted),
|
|
118
|
-
});
|
|
119
|
-
return secureRedirect(buildCodeRedirectUrl(redirectUri, code, state));
|
|
120
|
-
}
|
|
121
|
-
const ticket = await issueConsentTicket(secret, {
|
|
122
|
-
clientId,
|
|
123
|
-
redirectUri,
|
|
124
|
-
codeChallenge,
|
|
125
|
-
userId: user.id,
|
|
126
|
-
resource: expectedResource,
|
|
127
|
-
scope: formatScope(granted),
|
|
128
|
-
state,
|
|
129
|
-
});
|
|
130
|
-
return renderConsent(options, {
|
|
131
|
-
clientId,
|
|
132
|
-
registeredClient: registered,
|
|
133
|
-
redirectUri,
|
|
134
|
-
scope: granted,
|
|
135
|
-
resource: expectedResource,
|
|
136
|
-
user,
|
|
137
|
-
ticket,
|
|
138
|
-
oauthPath: options.oauthPath ?? "/mcp/oauth",
|
|
139
|
-
});
|
|
140
|
-
};
|
|
141
|
-
//# sourceMappingURL=authorize.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"authorize.js","sourceRoot":"","sources":["../../src/oauth/authorize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../../src/oauth/base64url.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,eAAO,MAAM,gBAAgB,GAAI,OAAO,WAAW,GAAG,UAAU,KAAG,MAIlE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MACG,CAAC;AAEnD,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,UAAU,CAAC,WAAW,CAKlE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base64url.js","sourceRoot":"","sources":["../../src/oauth/base64url.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAA+B,EAAU,EAAE;IAC1E,MAAM,EAAE,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAU,EAAE,CACtD,gBAAgB,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAA2B,EAAE;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAC/B,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/** Token-endpoint client authentication (RFC 6749 §2.3.1). */
|
|
2
|
-
import { type TokenEndpointAuthMethod } from "./constants.js";
|
|
3
|
-
import { type OAuthRouterOptions } from "./types.js";
|
|
4
|
-
export type ClientAuth = {
|
|
5
|
-
clientId: string;
|
|
6
|
-
secret: string | null;
|
|
7
|
-
method: TokenEndpointAuthMethod;
|
|
8
|
-
};
|
|
9
|
-
/** Credentials from the Authorization header, else from the body. */
|
|
10
|
-
export declare const readClientAuth: (request: Request, body: Record<string, string>) => ClientAuth | null;
|
|
11
|
-
/**
|
|
12
|
-
* Enforce the registered auth method for known clients.
|
|
13
|
-
*
|
|
14
|
-
* An unknown client_id is treated as public — PKCE is its only proof —
|
|
15
|
-
* unless `allowUnregisteredClients` is false, in which case it is rejected
|
|
16
|
-
* rather than silently falling back to "no auth required". On that
|
|
17
|
-
* locked-down path, a dummy secret comparison runs even for a client_id
|
|
18
|
-
* this server has never heard of, so the crypto-verification cost can't be
|
|
19
|
-
* used to distinguish "unknown" from "known, wrong secret" by timing. This
|
|
20
|
-
* only runs on the non-default, already-more-expensive path — public
|
|
21
|
-
* clients (the common case) never pay it.
|
|
22
|
-
*/
|
|
23
|
-
export declare const firstClientAuthError: (auth: ClientAuth, options: OAuthRouterOptions, request: Request) => Promise<Response | null>;
|
|
24
|
-
//# sourceMappingURL=clientauth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clientauth.d.ts","sourceRoot":"","sources":["../../src/oauth/clientauth.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,kBAAkB,EAKxB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,uBAAuB,CAAC;CACjC,CAAC;AAqBF,qEAAqE;AACrE,eAAO,MAAM,cAAc,GACzB,SAAS,OAAO,EAChB,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3B,UAAU,GAAG,IAaf,CAAC;AAuCF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,UAAU,EAChB,SAAS,kBAAkB,EAC3B,SAAS,OAAO,KACf,OAAO,CAAC,QAAQ,GAAG,IAAI,CAkDzB,CAAC"}
|