mcp-trellis 0.2.0 → 1.0.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 +41 -561
- package/dist/adapters/node.d.ts +15 -6
- package/dist/adapters/node.d.ts.map +1 -1
- package/dist/adapters/node.js +56 -29
- package/dist/adapters/node.js.map +1 -1
- package/dist/adapters/origins.d.ts.map +1 -1
- package/dist/adapters/origins.js +1 -4
- package/dist/adapters/origins.js.map +1 -1
- package/dist/app.d.ts +27 -4
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +31 -18
- package/dist/app.js.map +1 -1
- package/dist/auth/bearer.d.ts.map +1 -1
- package/dist/auth/bearer.js +6 -1
- package/dist/auth/bearer.js.map +1 -1
- package/dist/body.d.ts +48 -0
- package/dist/body.d.ts.map +1 -0
- package/dist/body.js +145 -0
- package/dist/body.js.map +1 -0
- package/dist/clients.d.ts.map +1 -1
- package/dist/clients.js +2 -5
- package/dist/clients.js.map +1 -1
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.d.ts.map +1 -1
- package/dist/dispatch.js +58 -18
- package/dist/dispatch.js.map +1 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js.map +1 -1
- package/dist/jsonrpc.d.ts +1 -0
- package/dist/jsonrpc.d.ts.map +1 -1
- package/dist/jsonrpc.js +1 -0
- package/dist/jsonrpc.js.map +1 -1
- package/dist/methods.d.ts +38 -15
- package/dist/methods.d.ts.map +1 -1
- package/dist/methods.js +38 -22
- package/dist/methods.js.map +1 -1
- package/dist/oauth/authorize.d.ts.map +1 -1
- package/dist/oauth/authorize.js +100 -68
- package/dist/oauth/authorize.js.map +1 -1
- package/dist/oauth/base64url.d.ts +1 -1
- package/dist/oauth/base64url.d.ts.map +1 -1
- package/dist/oauth/base64url.js +1 -4
- package/dist/oauth/base64url.js.map +1 -1
- package/dist/oauth/clientauth.d.ts +7 -2
- package/dist/oauth/clientauth.d.ts.map +1 -1
- package/dist/oauth/clientauth.js +59 -16
- package/dist/oauth/clientauth.js.map +1 -1
- package/dist/oauth/codes.d.ts +4 -4
- package/dist/oauth/codes.d.ts.map +1 -1
- package/dist/oauth/codes.js +43 -51
- package/dist/oauth/codes.js.map +1 -1
- package/dist/oauth/consent.d.ts +65 -0
- package/dist/oauth/consent.d.ts.map +1 -0
- package/dist/oauth/consent.js +173 -0
- package/dist/oauth/consent.js.map +1 -0
- package/dist/oauth/constants.d.ts +4 -0
- package/dist/oauth/constants.d.ts.map +1 -1
- package/dist/oauth/constants.js +4 -0
- package/dist/oauth/constants.js.map +1 -1
- package/dist/oauth/metadata.d.ts +6 -6
- package/dist/oauth/metadata.d.ts.map +1 -1
- package/dist/oauth/metadata.js.map +1 -1
- package/dist/oauth/pkce.d.ts.map +1 -1
- package/dist/oauth/pkce.js +1 -1
- package/dist/oauth/pkce.js.map +1 -1
- package/dist/oauth/redirect.d.ts +6 -1
- package/dist/oauth/redirect.d.ts.map +1 -1
- package/dist/oauth/redirect.js +23 -10
- package/dist/oauth/redirect.js.map +1 -1
- package/dist/oauth/reqbody.d.ts +10 -0
- package/dist/oauth/reqbody.d.ts.map +1 -0
- package/dist/oauth/reqbody.js +29 -0
- package/dist/oauth/reqbody.js.map +1 -0
- package/dist/oauth/resource.d.ts +30 -0
- package/dist/oauth/resource.d.ts.map +1 -1
- package/dist/oauth/resource.js +38 -8
- package/dist/oauth/resource.js.map +1 -1
- package/dist/oauth/revoke.d.ts.map +1 -1
- package/dist/oauth/revoke.js +15 -3
- package/dist/oauth/revoke.js.map +1 -1
- package/dist/oauth/router.d.ts +14 -11
- package/dist/oauth/router.d.ts.map +1 -1
- package/dist/oauth/router.js +62 -22
- package/dist/oauth/router.js.map +1 -1
- package/dist/oauth/scope.d.ts +11 -2
- package/dist/oauth/scope.d.ts.map +1 -1
- package/dist/oauth/scope.js +18 -7
- package/dist/oauth/scope.js.map +1 -1
- package/dist/oauth/sealed.d.ts +17 -0
- package/dist/oauth/sealed.d.ts.map +1 -0
- package/dist/oauth/sealed.js +57 -0
- package/dist/oauth/sealed.js.map +1 -0
- package/dist/oauth/secrethash.d.ts +44 -0
- package/dist/oauth/secrethash.d.ts.map +1 -0
- package/dist/oauth/secrethash.js +66 -0
- package/dist/oauth/secrethash.js.map +1 -0
- package/dist/oauth/token.d.ts.map +1 -1
- package/dist/oauth/token.js +13 -34
- package/dist/oauth/token.js.map +1 -1
- package/dist/oauth/types.d.ts +106 -9
- package/dist/oauth/types.d.ts.map +1 -1
- package/dist/oauth/types.js +67 -4
- package/dist/oauth/types.js.map +1 -1
- package/dist/oauth/wellknown.d.ts.map +1 -1
- package/dist/oauth/wellknown.js +6 -4
- package/dist/oauth/wellknown.js.map +1 -1
- package/dist/protocol.d.ts +15 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +16 -6
- package/dist/protocol.js.map +1 -1
- package/dist/registry.d.ts +4 -4
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +15 -7
- package/dist/registry.js.map +1 -1
- package/dist/server.d.ts +14 -10
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +8 -8
- package/dist/server.js.map +1 -1
- package/dist/tools.d.ts +11 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +14 -13
- package/dist/tools.js.map +1 -1
- package/dist/validate.d.ts +16 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +46 -8
- package/dist/validate.js.map +1 -1
- package/docs/ROADMAP.md +295 -0
- package/docs/guide.md +417 -0
- package/docs/reference.md +178 -0
- package/docs/security.md +63 -0
- package/package.json +7 -3
package/dist/body.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request-body size limits. Nothing upstream caps body size on its own —
|
|
3
|
+
* `request.json()` / `request.text()` and a raw `http.createServer` stream
|
|
4
|
+
* both buffer the whole body in memory first, so an uncapped read is a
|
|
5
|
+
* straightforward memory-exhaustion DoS.
|
|
6
|
+
*/
|
|
7
|
+
export class BodyTooLargeError extends Error {
|
|
8
|
+
maxBytes;
|
|
9
|
+
constructor(maxBytes) {
|
|
10
|
+
super(`request body exceeds ${maxBytes} bytes`);
|
|
11
|
+
this.maxBytes = maxBytes;
|
|
12
|
+
this.name = "BodyTooLargeError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Default cap for `/mcp` — JSON-RPC payloads, generally small but tool args can be text-heavy. */
|
|
16
|
+
export const DEFAULT_MCP_BODY_LIMIT = 1_048_576; // 1 MiB
|
|
17
|
+
/** Default cap for OAuth endpoints (`/token`, `/revoke`, `/register`, `/consent`) — tiny form/JSON. */
|
|
18
|
+
export const DEFAULT_OAUTH_BODY_LIMIT = 65_536; // 64 KiB
|
|
19
|
+
const declaredContentLength = (headers) => {
|
|
20
|
+
const header = headers.get("content-length");
|
|
21
|
+
if (!header)
|
|
22
|
+
return null;
|
|
23
|
+
const declared = Number(header);
|
|
24
|
+
return Number.isFinite(declared) ? declared : null;
|
|
25
|
+
};
|
|
26
|
+
const concatBytes = (chunks, total) => {
|
|
27
|
+
const combined = new Uint8Array(total);
|
|
28
|
+
chunks.reduce((offset, chunk) => {
|
|
29
|
+
combined.set(chunk, offset);
|
|
30
|
+
return offset + chunk.byteLength;
|
|
31
|
+
}, 0);
|
|
32
|
+
return combined;
|
|
33
|
+
};
|
|
34
|
+
const toBytes = (chunk) => typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk;
|
|
35
|
+
/**
|
|
36
|
+
* Reads a Web `Request` body as text, rejecting early on an honest
|
|
37
|
+
* oversized `Content-Length`, then aborting mid-stream — before the whole
|
|
38
|
+
* body is buffered — if a chunked body (no `Content-Length`) exceeds
|
|
39
|
+
* `maxBytes`. Falls back to `request.text()` when `request.body` is null
|
|
40
|
+
* (some runtimes don't expose a streaming body), still enforcing the cap.
|
|
41
|
+
*/
|
|
42
|
+
export const readBoundedText = async (request, maxBytes) => {
|
|
43
|
+
const declared = declaredContentLength(request.headers);
|
|
44
|
+
if (declared !== null && declared > maxBytes) {
|
|
45
|
+
throw new BodyTooLargeError(maxBytes);
|
|
46
|
+
}
|
|
47
|
+
const reader = request.body?.getReader();
|
|
48
|
+
if (!reader) {
|
|
49
|
+
const text = await request.text();
|
|
50
|
+
if (new TextEncoder().encode(text).byteLength > maxBytes) {
|
|
51
|
+
throw new BodyTooLargeError(maxBytes);
|
|
52
|
+
}
|
|
53
|
+
return text;
|
|
54
|
+
}
|
|
55
|
+
const chunks = [];
|
|
56
|
+
let total = 0;
|
|
57
|
+
try {
|
|
58
|
+
for (;;) {
|
|
59
|
+
const { done, value } = await reader.read();
|
|
60
|
+
if (done)
|
|
61
|
+
break;
|
|
62
|
+
// ponytail: one oversized chunk can briefly allocate maxBytes + highWaterMark
|
|
63
|
+
// (~64 KiB on Node) before reject — fine for 1 MiB / 64 KiB caps.
|
|
64
|
+
total += value.byteLength;
|
|
65
|
+
if (total > maxBytes)
|
|
66
|
+
throw new BodyTooLargeError(maxBytes);
|
|
67
|
+
chunks.push(value);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
await reader.cancel().catch(() => { });
|
|
72
|
+
}
|
|
73
|
+
return new TextDecoder().decode(concatBytes(chunks, total));
|
|
74
|
+
};
|
|
75
|
+
export const isNodeReadable = (value) => typeof value?.on === "function" &&
|
|
76
|
+
typeof value?.pause === "function" &&
|
|
77
|
+
typeof value?.removeListener === "function";
|
|
78
|
+
const readFromEvents = (stream, maxBytes) => new Promise((resolve, reject) => {
|
|
79
|
+
const collected = [];
|
|
80
|
+
let total = 0;
|
|
81
|
+
let settled = false;
|
|
82
|
+
const onData = (chunk) => {
|
|
83
|
+
const bytes = toBytes(chunk);
|
|
84
|
+
total += bytes.byteLength;
|
|
85
|
+
if (total > maxBytes) {
|
|
86
|
+
fail(new BodyTooLargeError(maxBytes));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
collected.push(bytes);
|
|
90
|
+
};
|
|
91
|
+
const onEnd = () => {
|
|
92
|
+
if (settled)
|
|
93
|
+
return;
|
|
94
|
+
settled = true;
|
|
95
|
+
cleanup();
|
|
96
|
+
resolve(concatBytes(collected, total));
|
|
97
|
+
};
|
|
98
|
+
const onError = (err) => {
|
|
99
|
+
fail(err);
|
|
100
|
+
};
|
|
101
|
+
const cleanup = () => {
|
|
102
|
+
stream.removeListener("data", onData);
|
|
103
|
+
stream.removeListener("end", onEnd);
|
|
104
|
+
stream.removeListener("error", onError);
|
|
105
|
+
};
|
|
106
|
+
const fail = (err) => {
|
|
107
|
+
if (settled)
|
|
108
|
+
return;
|
|
109
|
+
settled = true;
|
|
110
|
+
stream.pause();
|
|
111
|
+
cleanup();
|
|
112
|
+
reject(err);
|
|
113
|
+
};
|
|
114
|
+
stream.on("data", onData);
|
|
115
|
+
stream.on("end", onEnd);
|
|
116
|
+
stream.on("error", onError);
|
|
117
|
+
});
|
|
118
|
+
const readFromAsyncIterable = async (chunks, maxBytes) => {
|
|
119
|
+
const collected = [];
|
|
120
|
+
let total = 0;
|
|
121
|
+
for await (const chunk of chunks) {
|
|
122
|
+
const bytes = toBytes(chunk);
|
|
123
|
+
total += bytes.byteLength;
|
|
124
|
+
if (total > maxBytes)
|
|
125
|
+
throw new BodyTooLargeError(maxBytes);
|
|
126
|
+
collected.push(bytes);
|
|
127
|
+
}
|
|
128
|
+
return concatBytes(collected, total);
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Same contract as `readBoundedText` for a raw Node request stream.
|
|
132
|
+
* Does **not** destroy the socket — that races a 413 response into EPIPE.
|
|
133
|
+
* On overflow the event path pauses and drops listeners; the caller writes
|
|
134
|
+
* 413 then tears down after flush.
|
|
135
|
+
*/
|
|
136
|
+
export const readBoundedNodeBody = async (source, maxBytes, options = {}) => {
|
|
137
|
+
const declared = options.contentLength ? Number(options.contentLength) : NaN;
|
|
138
|
+
if (Number.isFinite(declared) && declared > maxBytes) {
|
|
139
|
+
throw new BodyTooLargeError(maxBytes);
|
|
140
|
+
}
|
|
141
|
+
if (isNodeReadable(source))
|
|
142
|
+
return readFromEvents(source, maxBytes);
|
|
143
|
+
return readFromAsyncIterable(source, maxBytes);
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=body.js.map
|
package/dist/body.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../src/body.ts"],"names":[],"mappings":"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"}
|
package/dist/clients.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../src/clients.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../src/clients.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA+B,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEjG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,sDAAsD;IACtD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gDAAgD;IAChD,wBAAwB,EAAE,uBAAuB,EAAE,CAAC;IACpD;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,UAAU,EAAE,aAAa,CAsB7D,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,UAAU,EAAe,CAAC;AAExD,kEAAkE;AAClE,eAAO,MAAM,eAAe,GAAI,SAAS,UAAU,EAAE,KAAG,MAAM,EAE7D,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,cAAc,GAAI,SAAS,UAAU,EAAE,KAAG,uBAAuB,EAS7E,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,oBAAoB,GAAI,SAAS,UAAU,EAAE,KAAG,UAAU,EACR,CAAC;AAEhE,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,GAAI,SAAS,UAAU,EAAE,KAAG,OACK,CAAC;AAE/D,eAAO,MAAM,uBAAuB,GAClC,SAAS,UAAU,EAAE,EACrB,aAAa,WAAW,GAAG,SAAS,KACnC,IASF,CAAC"}
|
package/dist/clients.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* callback URLs, different registration models. Encoding that here is the
|
|
6
6
|
* point: you name your clients, the library configures the AS to match.
|
|
7
7
|
*/
|
|
8
|
-
import { TOKEN_ENDPOINT_AUTH_METHODS
|
|
8
|
+
import { TOKEN_ENDPOINT_AUTH_METHODS } from "./oauth/constants.js";
|
|
9
9
|
import { CLAUDE_CALLBACK } from "./oauth/redirect.js";
|
|
10
10
|
export const CLIENT_PROFILES = {
|
|
11
11
|
/** Claude Custom Connectors — dynamic registration, public client + PKCE. */
|
|
@@ -20,10 +20,7 @@ export const CLIENT_PROFILES = {
|
|
|
20
20
|
*/
|
|
21
21
|
gemini: {
|
|
22
22
|
redirectUris: [],
|
|
23
|
-
tokenEndpointAuthMethods: [
|
|
24
|
-
TOKEN_ENDPOINT_AUTH_METHODS.basic,
|
|
25
|
-
TOKEN_ENDPOINT_AUTH_METHODS.post,
|
|
26
|
-
],
|
|
23
|
+
tokenEndpointAuthMethods: [TOKEN_ENDPOINT_AUTH_METHODS.basic, TOKEN_ENDPOINT_AUTH_METHODS.post],
|
|
27
24
|
preRegistered: true,
|
|
28
25
|
},
|
|
29
26
|
/** OpenAI Codex / ChatGPT connectors — OAuth 2.1 per the MCP auth spec. */
|
package/dist/clients.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../src/clients.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../src/clients.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,2BAA2B,EAAgC,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAiBtD,MAAM,CAAC,MAAM,eAAe,GAAsC;IAChE,6EAA6E;IAC7E,MAAM,EAAE;QACN,YAAY,EAAE,CAAC,eAAe,CAAC;QAC/B,wBAAwB,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC;QAC5D,aAAa,EAAE,KAAK;KACrB;IACD;;;OAGG;IACH,MAAM,EAAE;QACN,YAAY,EAAE,EAAE;QAChB,wBAAwB,EAAE,CAAC,2BAA2B,CAAC,KAAK,EAAE,2BAA2B,CAAC,IAAI,CAAC;QAC/F,aAAa,EAAE,IAAI;KACpB;IACD,2EAA2E;IAC3E,KAAK,EAAE;QACL,YAAY,EAAE,EAAE;QAChB,wBAAwB,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC;QAC5D,aAAa,EAAE,KAAK;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAiB,CAAC,QAAQ,CAAC,CAAC;AAExD,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAqB,EAAY,EAAE,CAAC;IAClE,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC;CAC1E,CAAC;AAEF,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAqB,EAA6B,EAAE;IACjF,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,wBAAwB,CAAC,CAC1E,CAAC;IACF,OAAO;QACL,2BAA2B,CAAC,IAAI;QAChC,2BAA2B,CAAC,KAAK;QACjC,2BAA2B,CAAC,IAAI;KACjC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAqB,EAAgB,EAAE,CAC1E,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC;AAEhE,2FAA2F;AAC3F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAqB,EAAW,EAAE,CACjE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAqB,EACrB,WAAoC,EAC9B,EAAE;IACR,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACtF,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB;YACxD,0EAA0E,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
|
package/dist/dispatch.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type McpHandlerOptions } from "./methods.js";
|
|
2
|
-
export type {
|
|
2
|
+
export type { AuditEntry, McpHandlerOptions, McpPorts, Principal, ServerInfo, } from "./methods.js";
|
|
3
3
|
export type McpHandler = {
|
|
4
4
|
fetch: (request: Request) => Promise<Response>;
|
|
5
5
|
};
|
package/dist/dispatch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAkBA,OAAO,EAIL,KAAK,iBAAiB,EAIvB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAChD,CAAC;AAiIF,eAAO,MAAM,gBAAgB,GAAI,IAAI,EAAE,SAAS,iBAAiB,CAAC,IAAI,CAAC,KAAG,UAyBzE,CAAC"}
|
package/dist/dispatch.js
CHANGED
|
@@ -1,39 +1,74 @@
|
|
|
1
|
-
import { JSONRPC_INTERNAL_ERROR, JSONRPC_INVALID_REQUEST, JSONRPC_PARSE_ERROR, rpcError, } from "./jsonrpc.js";
|
|
2
|
-
import { INTERNAL_ERROR, emptyResponse, jsonResponse, methodNotAllowed, optionsResponse, } from "./http.js";
|
|
3
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";
|
|
4
5
|
import { DEFAULT_PUBLIC_METHODS, dispatchRpc, isNotification, resolveWww, safeAudit, unauthorized, } from "./methods.js";
|
|
6
|
+
import { PROTOCOL_VERSIONS } from "./protocol.js";
|
|
5
7
|
const parseBody = async (request) => {
|
|
8
|
+
let text;
|
|
6
9
|
try {
|
|
7
|
-
|
|
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);
|
|
8
20
|
}
|
|
9
21
|
catch {
|
|
10
22
|
return jsonResponse(rpcError(null, JSONRPC_PARSE_ERROR, "Parse error"), 400);
|
|
11
23
|
}
|
|
12
24
|
};
|
|
13
25
|
/** Transport-level denial: no JSON-RPC method has been parsed yet. */
|
|
14
|
-
const auditDenial = (options, error) => safeAudit(options, { method: "", ok: false, error, durationMs:
|
|
15
|
-
const guardPost = async (request, options) => {
|
|
26
|
+
const auditDenial = (options, error, startedAt) => safeAudit(options, { method: "", ok: false, error, durationMs: Date.now() - startedAt });
|
|
27
|
+
const guardPost = async (request, options, startedAt) => {
|
|
16
28
|
if (rejectQueryToken(new URL(request.url))) {
|
|
17
|
-
await auditDenial(options, "query_string_token");
|
|
29
|
+
await auditDenial(options, "query_string_token", startedAt);
|
|
18
30
|
return unauthorized(resolveWww(options, request), "Token in query string is rejected. Use Authorization Bearer.");
|
|
19
31
|
}
|
|
20
32
|
return null;
|
|
21
33
|
};
|
|
22
|
-
const handleGet = async (request, options) => {
|
|
34
|
+
const handleGet = async (request, options, startedAt) => {
|
|
23
35
|
if (rejectQueryToken(new URL(request.url))) {
|
|
24
|
-
await auditDenial(options, "query_string_token");
|
|
36
|
+
await auditDenial(options, "query_string_token", startedAt);
|
|
25
37
|
return jsonResponse({
|
|
26
38
|
error: "Pass token via Authorization: Bearer header, not query string",
|
|
27
39
|
}, 400);
|
|
28
40
|
}
|
|
29
41
|
if (!request.headers.get("authorization")) {
|
|
30
|
-
await auditDenial(options, "unauthorized");
|
|
42
|
+
await auditDenial(options, "unauthorized", startedAt);
|
|
31
43
|
return unauthorized(resolveWww(options, request));
|
|
32
44
|
}
|
|
33
45
|
return methodNotAllowed("Use POST for MCP");
|
|
34
46
|
};
|
|
35
|
-
|
|
36
|
-
|
|
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);
|
|
37
72
|
if (denied)
|
|
38
73
|
return denied;
|
|
39
74
|
const parsed = await parseBody(request);
|
|
@@ -46,31 +81,36 @@ const handlePost = async (request, options, publicMethods) => {
|
|
|
46
81
|
return jsonResponse(rpcError(null, JSONRPC_PARSE_ERROR, "Parse error"), 400);
|
|
47
82
|
}
|
|
48
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;
|
|
49
90
|
if (isNotification(msg))
|
|
50
91
|
return emptyResponse(202);
|
|
51
|
-
return dispatchRpc({ req: request, body: msg, options, publicMethods });
|
|
92
|
+
return dispatchRpc({ req: request, body: msg, options, publicMethods, startedAt });
|
|
52
93
|
};
|
|
53
94
|
export const createMcpHandler = (options) => {
|
|
54
95
|
const publicMethods = options.publicMethods ?? DEFAULT_PUBLIC_METHODS;
|
|
55
96
|
const HTTP_METHODS = {
|
|
56
97
|
OPTIONS: () => optionsResponse(),
|
|
57
|
-
GET: (request) => handleGet(request, options),
|
|
58
|
-
POST: (request) => handlePost(request, options, publicMethods),
|
|
98
|
+
GET: (request, startedAt) => handleGet(request, options, startedAt),
|
|
99
|
+
POST: (request, startedAt) => handlePost(request, options, publicMethods, startedAt),
|
|
59
100
|
};
|
|
60
101
|
return {
|
|
61
102
|
fetch: async (request) => {
|
|
103
|
+
const startedAt = Date.now();
|
|
62
104
|
try {
|
|
63
105
|
const handler = HTTP_METHODS[request.method];
|
|
64
|
-
return await (handler
|
|
65
|
-
? handler(request, options, publicMethods)
|
|
66
|
-
: methodNotAllowed());
|
|
106
|
+
return await (handler ? handler(request, startedAt) : methodNotAllowed());
|
|
67
107
|
}
|
|
68
108
|
catch (exc) {
|
|
69
109
|
// A host port (authenticate/context/audit) threw. `fetch` must never
|
|
70
110
|
// reject — the caller gets an honest 500, not an unhandled rejection
|
|
71
111
|
// whose shape depends on which runtime is hosting this.
|
|
72
112
|
const error = exc instanceof Error && exc.message ? exc.message : INTERNAL_ERROR;
|
|
73
|
-
await auditDenial(options, error);
|
|
113
|
+
await auditDenial(options, error, startedAt);
|
|
74
114
|
return jsonResponse(rpcError(null, JSONRPC_INTERNAL_ERROR, "Internal error"), 500);
|
|
75
115
|
}
|
|
76
116
|
},
|
package/dist/dispatch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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
CHANGED
|
@@ -27,6 +27,7 @@ export declare const JSONRPC_METHOD_NOT_FOUND = -32601;
|
|
|
27
27
|
export declare const JSONRPC_INVALID_PARAMS = -32602;
|
|
28
28
|
export declare const JSONRPC_INTERNAL_ERROR = -32603;
|
|
29
29
|
export declare const JSONRPC_UNAUTHORIZED = -32001;
|
|
30
|
+
export declare const JSONRPC_PAYLOAD_TOO_LARGE = -32002;
|
|
30
31
|
export declare const rpcResult: (id: JsonRpcId, result: unknown) => JsonRpcSuccess;
|
|
31
32
|
export declare const rpcError: (id: JsonRpcId, code: number, message: string) => JsonRpcFailure;
|
|
32
33
|
//# sourceMappingURL=jsonrpc.d.ts.map
|
package/dist/jsonrpc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
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
CHANGED
|
@@ -4,6 +4,7 @@ export const JSONRPC_METHOD_NOT_FOUND = -32601;
|
|
|
4
4
|
export const JSONRPC_INVALID_PARAMS = -32602;
|
|
5
5
|
export const JSONRPC_INTERNAL_ERROR = -32603;
|
|
6
6
|
export const JSONRPC_UNAUTHORIZED = -32001;
|
|
7
|
+
export const JSONRPC_PAYLOAD_TOO_LARGE = -32002;
|
|
7
8
|
export const rpcResult = (id, result) => ({
|
|
8
9
|
jsonrpc: "2.0",
|
|
9
10
|
id,
|
package/dist/jsonrpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
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
CHANGED
|
@@ -1,32 +1,36 @@
|
|
|
1
|
-
import { type JsonRpcRequest } from "./jsonrpc.js";
|
|
2
|
-
import type { ToolRegistry } from "./registry.js";
|
|
3
1
|
import { type WwwAuthenticateOptions } from "./auth/bearer.js";
|
|
2
|
+
import { type JsonRpcId, type JsonRpcRequest } from "./jsonrpc.js";
|
|
3
|
+
import type { ToolRegistry } from "./registry.js";
|
|
4
4
|
export type Principal = {
|
|
5
5
|
id: string;
|
|
6
6
|
scopes: string[];
|
|
7
7
|
/** Optional host claims from `verifyToken` (tenant, plan, role, …). */
|
|
8
|
-
claims?: Record<string, unknown
|
|
8
|
+
claims?: Record<string, unknown> | undefined;
|
|
9
9
|
};
|
|
10
10
|
/** Per-request metrics emitted through the optional `audit` port. */
|
|
11
11
|
export type AuditEntry = {
|
|
12
12
|
/** JSON-RPC method, or `""` for transport-level rejections made before parsing. */
|
|
13
13
|
method: string;
|
|
14
|
-
tool?: string;
|
|
15
|
-
principalId?: string;
|
|
14
|
+
tool?: string | undefined;
|
|
15
|
+
principalId?: string | undefined;
|
|
16
16
|
ok: boolean;
|
|
17
|
-
error?: string;
|
|
17
|
+
error?: string | undefined;
|
|
18
18
|
durationMs: number;
|
|
19
19
|
};
|
|
20
20
|
export type McpPorts<TCtx> = {
|
|
21
21
|
authenticate: (req: Request, method: string, tool?: string) => Promise<Principal | null>;
|
|
22
22
|
context: (req: Request, principal: Principal | null) => TCtx | Promise<TCtx>;
|
|
23
23
|
/**
|
|
24
|
-
* Opt-in metrics hook. Pass any function to receive
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* `
|
|
24
|
+
* Opt-in metrics hook. Pass any function to receive tool results and auth
|
|
25
|
+
* denials (bad token, missing scope, query-string token), plus the 500
|
|
26
|
+
* path when a host port throws. Protocol errors (malformed JSON, bad
|
|
27
|
+
* `jsonrpc`, unsupported protocol version, oversized body, batch) are not
|
|
28
|
+
* audited. Omit it and the library stays silent — no stdout, no store.
|
|
29
|
+
* Do what you want with `entry` (DB, APM, admin UI). Throwing never fails
|
|
30
|
+
* the request, and neither does hanging — see
|
|
31
|
+
* `McpHandlerOptions.auditTimeoutMs`.
|
|
28
32
|
*/
|
|
29
|
-
audit?: (entry: AuditEntry) => void | Promise<void
|
|
33
|
+
audit?: ((entry: AuditEntry) => void | Promise<void>) | undefined;
|
|
30
34
|
};
|
|
31
35
|
export type ServerInfo = {
|
|
32
36
|
name: string;
|
|
@@ -40,15 +44,32 @@ export type McpHandlerOptions<TCtx> = {
|
|
|
40
44
|
wwwAuthenticate: WwwAuthenticateOptions | ((req: Request) => WwwAuthenticateOptions);
|
|
41
45
|
/** Methods that skip auth (default: initialize, ping, notifications/*). */
|
|
42
46
|
publicMethods?: Set<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Max time to wait for `ports.audit` before giving up on it and
|
|
49
|
+
* responding anyway. Default 1000ms. A hanging audit sink can't fail a
|
|
50
|
+
* request (see `safeAudit`), but without this it could stall one
|
|
51
|
+
* indefinitely — "can't fail" isn't "can't delay."
|
|
52
|
+
*/
|
|
53
|
+
auditTimeoutMs?: number;
|
|
43
54
|
};
|
|
44
55
|
export declare const DEFAULT_PUBLIC_METHODS: Set<string>;
|
|
45
56
|
export declare const isNotification: (body: JsonRpcRequest) => boolean;
|
|
46
57
|
export declare const resolveWww: <TCtx>(options: McpHandlerOptions<TCtx>, req: Request) => WwwAuthenticateOptions;
|
|
47
|
-
export declare const unauthorized: (www: WwwAuthenticateOptions, message?: string) => Response;
|
|
48
58
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
59
|
+
* `id` defaults to `null` for the transport-level call sites in
|
|
60
|
+
* `dispatch.ts` — a body hasn't been parsed yet there, so there's no real
|
|
61
|
+
* id to echo. Call sites past that point (inside `dispatchRpc` and the
|
|
62
|
+
* method handlers) have one and must pass it, or a client correlating
|
|
63
|
+
* responses by id sees `null` on every 401 regardless of what it sent.
|
|
64
|
+
*/
|
|
65
|
+
export declare const unauthorized: (www: WwwAuthenticateOptions, message?: string, id?: JsonRpcId) => Response;
|
|
66
|
+
/**
|
|
67
|
+
* Invoke the audit metrics hook, swallowing any failure and racing it
|
|
68
|
+
* against `auditTimeoutMs` so a hanging sink can't stall the response
|
|
69
|
+
* either — "can't fail a request" was already true; this adds "can't
|
|
70
|
+
* delay one" past a bound. The audit call keeps running in the background
|
|
71
|
+
* if the timer wins; its own `catch` below means it can never surface as
|
|
72
|
+
* an unhandled rejection whenever it does finish.
|
|
52
73
|
*/
|
|
53
74
|
export declare const safeAudit: <TCtx>(options: McpHandlerOptions<TCtx>, entry: AuditEntry) => Promise<void>;
|
|
54
75
|
export declare const hasScope: (principal: Principal, scope: string | undefined) => boolean;
|
|
@@ -57,5 +78,7 @@ export declare const dispatchRpc: <TCtx>(input: {
|
|
|
57
78
|
body: JsonRpcRequest;
|
|
58
79
|
options: McpHandlerOptions<TCtx>;
|
|
59
80
|
publicMethods: Set<string>;
|
|
81
|
+
/** Request start (captured in `createMcpHandler.fetch`), for denial-path audit timing. */
|
|
82
|
+
startedAt: number;
|
|
60
83
|
}) => Promise<Response>;
|
|
61
84
|
//# sourceMappingURL=methods.d.ts.map
|
package/dist/methods.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":"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"}
|