mcp-trellis 2.2.0 → 3.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/dist/adapters/node-request.d.ts +5 -0
- package/dist/adapters/node-request.d.ts.map +1 -1
- package/dist/adapters/node-request.js +17 -1
- package/dist/adapters/node-request.js.map +1 -1
- package/dist/adapters/node.d.ts +15 -0
- package/dist/adapters/node.d.ts.map +1 -1
- package/dist/adapters/node.js +38 -0
- package/dist/adapters/node.js.map +1 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +63 -6
- package/dist/audit.js.map +1 -1
- package/dist/clients.js +2 -2
- package/dist/clients.js.map +1 -1
- package/dist/http/origins.d.ts.map +1 -1
- package/dist/http/origins.js +13 -2
- package/dist/http/origins.js.map +1 -1
- package/dist/mcp/dispatch.d.ts.map +1 -1
- package/dist/mcp/dispatch.js +2 -1
- package/dist/mcp/dispatch.js.map +1 -1
- package/dist/mcp/methods.d.ts +1 -0
- package/dist/mcp/methods.d.ts.map +1 -1
- package/dist/mcp/methods.js +1 -0
- package/dist/mcp/methods.js.map +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +15 -3
- package/dist/mcp/registry.js.map +1 -1
- package/dist/mcp/rpc-handlers.d.ts.map +1 -1
- package/dist/mcp/rpc-handlers.js +58 -11
- package/dist/mcp/rpc-handlers.js.map +1 -1
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +114 -17
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/validate.d.ts +7 -1
- package/dist/mcp/validate.d.ts.map +1 -1
- package/dist/mcp/validate.js +58 -24
- package/dist/mcp/validate.js.map +1 -1
- package/dist/oauth/audit.d.ts +10 -0
- package/dist/oauth/audit.d.ts.map +1 -1
- package/dist/oauth/audit.js +25 -1
- package/dist/oauth/audit.js.map +1 -1
- package/dist/oauth/cimd/cimd-parse.d.ts.map +1 -1
- package/dist/oauth/cimd/cimd-parse.js +27 -14
- package/dist/oauth/cimd/cimd-parse.js.map +1 -1
- package/dist/oauth/cimd/cimd-ssrf.d.ts.map +1 -1
- package/dist/oauth/cimd/cimd-ssrf.js +39 -6
- package/dist/oauth/cimd/cimd-ssrf.js.map +1 -1
- package/dist/oauth/cimd/cimd.d.ts +11 -2
- package/dist/oauth/cimd/cimd.d.ts.map +1 -1
- package/dist/oauth/cimd/cimd.js +40 -34
- package/dist/oauth/cimd/cimd.js.map +1 -1
- package/dist/oauth/cimd/failure.d.ts +19 -0
- package/dist/oauth/cimd/failure.d.ts.map +1 -0
- package/dist/oauth/cimd/failure.js +28 -0
- package/dist/oauth/cimd/failure.js.map +1 -0
- package/dist/oauth/crypto/clientauth.d.ts.map +1 -1
- package/dist/oauth/crypto/clientauth.js +7 -6
- package/dist/oauth/crypto/clientauth.js.map +1 -1
- package/dist/oauth/endpoints/authorize.d.ts.map +1 -1
- package/dist/oauth/endpoints/authorize.js +24 -6
- package/dist/oauth/endpoints/authorize.js.map +1 -1
- package/dist/oauth/endpoints/consent-page.d.ts.map +1 -1
- package/dist/oauth/endpoints/consent-page.js +34 -1
- package/dist/oauth/endpoints/consent-page.js.map +1 -1
- package/dist/oauth/endpoints/token.d.ts.map +1 -1
- package/dist/oauth/endpoints/token.js +7 -1
- package/dist/oauth/endpoints/token.js.map +1 -1
- package/dist/oauth/policy/redirect.d.ts +6 -0
- package/dist/oauth/policy/redirect.d.ts.map +1 -1
- package/dist/oauth/policy/redirect.js +6 -0
- package/dist/oauth/policy/redirect.js.map +1 -1
- package/dist/oauth/policy/reqbody.d.ts +6 -1
- package/dist/oauth/policy/reqbody.d.ts.map +1 -1
- package/dist/oauth/policy/reqbody.js +8 -3
- package/dist/oauth/policy/reqbody.js.map +1 -1
- package/dist/oauth/types.d.ts +3 -1
- package/dist/oauth/types.d.ts.map +1 -1
- package/dist/util/clip.d.ts +7 -0
- package/dist/util/clip.d.ts.map +1 -0
- package/dist/util/clip.js +13 -0
- package/dist/util/clip.js.map +1 -0
- package/dist/util/json.d.ts +5 -0
- package/dist/util/json.d.ts.map +1 -1
- package/dist/util/json.js +21 -0
- package/dist/util/json.js.map +1 -1
- package/dist/util/own.d.ts +8 -0
- package/dist/util/own.d.ts.map +1 -0
- package/dist/util/own.js +8 -0
- package/dist/util/own.js.map +1 -0
- package/docs/guide.md +15 -4
- package/docs/reference.md +2 -1
- package/docs/security.md +5 -3
- package/docs/troubleshooting.md +1 -0
- package/package.json +2 -2
package/dist/mcp/rpc-handlers.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/** JSON-RPC method handlers and authenticated dispatch. */
|
|
2
2
|
import { jsonResponse } from "../http/http.js";
|
|
3
|
+
import { clipText } from "../util/clip.js";
|
|
3
4
|
import { isJsonObject } from "../util/json.js";
|
|
5
|
+
import { ownValue } from "../util/own.js";
|
|
4
6
|
import { JSONRPC_INVALID_PARAMS, JSONRPC_METHOD_NOT_FOUND, rpcError, rpcResult, } from "./jsonrpc.js";
|
|
5
7
|
import { DENIAL_REASONS, hasScope, insufficientScope, resolveWwwAuthenticate, safeAudit, unauthorized, } from "./methods.js";
|
|
6
8
|
import { pickProtocolVersion } from "./protocol.js";
|
|
@@ -13,11 +15,40 @@ const auditToolCall = (options, input) => safeAudit(options, {
|
|
|
13
15
|
error: input.error,
|
|
14
16
|
durationMs: Date.now() - input.startedAt,
|
|
15
17
|
});
|
|
18
|
+
/** Longest tool-failure text copied into an audit entry — it is tool- or caller-supplied. */
|
|
19
|
+
const MAX_AUDIT_ERROR_LENGTH = 1000;
|
|
20
|
+
const auditText = (text) => text === undefined ? undefined : clipText(text, MAX_AUDIT_ERROR_LENGTH, "…");
|
|
21
|
+
/** A tool name as echoed back or audited — the name is whatever the caller sent. */
|
|
22
|
+
const MAX_TOOL_NAME_LENGTH = 200;
|
|
23
|
+
const shownToolName = (name) => clipText(name, MAX_TOOL_NAME_LENGTH, "…");
|
|
24
|
+
const INVALID_ARGUMENTS_MESSAGE = "tools/call params.arguments must be an object";
|
|
25
|
+
/**
|
|
26
|
+
* Omitted params default to `{}`; null, an array or a primitive fail rather
|
|
27
|
+
* than being coerced. `name` is only ever a string: `String(params.name)`
|
|
28
|
+
* would throw on an object with a hostile `toString`, and coerce `["a"]` or
|
|
29
|
+
* `1` into a real-looking tool name. An absent `arguments` is `{}` (it is
|
|
30
|
+
* optional); a malformed one must not silently become `{}` and run the tool
|
|
31
|
+
* with every optional argument unset.
|
|
32
|
+
*/
|
|
16
33
|
const parseToolCallArgs = (body) => {
|
|
17
|
-
const params = body.params
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
34
|
+
const params = body.params === undefined ? {} : body.params;
|
|
35
|
+
if (!isJsonObject(params))
|
|
36
|
+
return { error: "tools/call params must be an object" };
|
|
37
|
+
const name = typeof params.name === "string" ? params.name : "";
|
|
38
|
+
if (params.arguments === undefined)
|
|
39
|
+
return { name, args: {} };
|
|
40
|
+
return { name, args: isJsonObject(params.arguments) ? params.arguments : null };
|
|
41
|
+
};
|
|
42
|
+
const invalidArgumentsResponse = async (options, input) => {
|
|
43
|
+
await auditToolCall(options, {
|
|
44
|
+
...input,
|
|
45
|
+
tool: shownToolName(input.name),
|
|
46
|
+
ok: false,
|
|
47
|
+
error: DENIAL_REASONS.invalidParams,
|
|
48
|
+
});
|
|
49
|
+
return jsonResponse({
|
|
50
|
+
data: rpcError(input.id, JSONRPC_INVALID_PARAMS, INVALID_ARGUMENTS_MESSAGE),
|
|
51
|
+
});
|
|
21
52
|
};
|
|
22
53
|
/**
|
|
23
54
|
* A name that doesn't refer to any registered tool is a malformed request,
|
|
@@ -30,12 +61,12 @@ const parseToolCallArgs = (body) => {
|
|
|
30
61
|
const unknownToolResponse = async (options, input) => {
|
|
31
62
|
await auditToolCall(options, {
|
|
32
63
|
...input,
|
|
33
|
-
tool: input.name,
|
|
64
|
+
tool: shownToolName(input.name),
|
|
34
65
|
ok: false,
|
|
35
66
|
error: DENIAL_REASONS.unknownTool,
|
|
36
67
|
});
|
|
37
68
|
return jsonResponse({
|
|
38
|
-
data: rpcError(input.id, JSONRPC_INVALID_PARAMS, `Unknown tool: ${input.name}`),
|
|
69
|
+
data: rpcError(input.id, JSONRPC_INVALID_PARAMS, `Unknown tool: ${shownToolName(input.name)}`),
|
|
39
70
|
});
|
|
40
71
|
};
|
|
41
72
|
const missingScopeResponse = async (req, options, input) => {
|
|
@@ -71,7 +102,13 @@ const METHODS = {
|
|
|
71
102
|
return jsonResponse({ data: rpcResult(id, { tools: options.registry.list(allowScope) }) });
|
|
72
103
|
},
|
|
73
104
|
"tools/call": async ({ req, body, id, principal, options, startedAt }) => {
|
|
74
|
-
const
|
|
105
|
+
const parsed = parseToolCallArgs(body);
|
|
106
|
+
if ("error" in parsed) {
|
|
107
|
+
return jsonResponse({
|
|
108
|
+
data: rpcError(id, JSONRPC_INVALID_PARAMS, parsed.error),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
const { name, args } = parsed;
|
|
75
112
|
const tool = options.registry.get(name);
|
|
76
113
|
if (!tool)
|
|
77
114
|
return unknownToolResponse(options, { name, principal, id, startedAt });
|
|
@@ -84,6 +121,10 @@ const METHODS = {
|
|
|
84
121
|
scope: tool.scope,
|
|
85
122
|
});
|
|
86
123
|
}
|
|
124
|
+
// After the scope check, so a caller without the scope is told so (403 +
|
|
125
|
+
// step-up challenge), not that its arguments are malformed.
|
|
126
|
+
if (args === null)
|
|
127
|
+
return invalidArgumentsResponse(options, { name, principal, id, startedAt });
|
|
87
128
|
// Built only for a call that will actually run: `initialize`, `ping`,
|
|
88
129
|
// `tools/list` and denied calls never reach the host's `context` port.
|
|
89
130
|
const ctx = await options.ports.context(req, principal);
|
|
@@ -93,7 +134,7 @@ const METHODS = {
|
|
|
93
134
|
tool: name,
|
|
94
135
|
principal,
|
|
95
136
|
ok: !result.isError,
|
|
96
|
-
error: result.isError ? result.content[0]?.text : undefined,
|
|
137
|
+
error: result.isError ? auditText(result.content[0]?.text) : undefined,
|
|
97
138
|
startedAt: toolStartedAt,
|
|
98
139
|
});
|
|
99
140
|
return jsonResponse({ data: rpcResult(id, result) });
|
|
@@ -105,7 +146,11 @@ export const dispatchRpc = async (input) => {
|
|
|
105
146
|
const method = typeof body.method === "string" ? body.method : "";
|
|
106
147
|
// Notifications omit `id`; explicit null is a valid request id (JSON-RPC).
|
|
107
148
|
const id = body.id === undefined ? null : body.id;
|
|
108
|
-
const toolName = method === "tools/call"
|
|
149
|
+
const toolName = method === "tools/call"
|
|
150
|
+
? typeof body.params?.name === "string"
|
|
151
|
+
? body.params.name
|
|
152
|
+
: ""
|
|
153
|
+
: undefined;
|
|
109
154
|
// Notifications (including every `notifications/*`) already got 202 in `handlePost`.
|
|
110
155
|
const isPublic = options.publicMethods.has(method);
|
|
111
156
|
let principal = null;
|
|
@@ -114,7 +159,7 @@ export const dispatchRpc = async (input) => {
|
|
|
114
159
|
if (!principal) {
|
|
115
160
|
await safeAudit(options, {
|
|
116
161
|
method,
|
|
117
|
-
tool: toolName,
|
|
162
|
+
tool: toolName === undefined ? undefined : shownToolName(toolName),
|
|
118
163
|
ok: false,
|
|
119
164
|
error: DENIAL_REASONS.unauthorized,
|
|
120
165
|
durationMs: Date.now() - startedAt,
|
|
@@ -122,7 +167,9 @@ export const dispatchRpc = async (input) => {
|
|
|
122
167
|
return unauthorized(resolveWwwAuthenticate(options, req), undefined, id);
|
|
123
168
|
}
|
|
124
169
|
}
|
|
125
|
-
|
|
170
|
+
// A client-selected method name must not reach Object.prototype (e.g.
|
|
171
|
+
// `toString` or `__proto__`): only own entries in METHODS are RPC methods.
|
|
172
|
+
const handler = ownValue(METHODS, method);
|
|
126
173
|
if (!handler) {
|
|
127
174
|
return jsonResponse({
|
|
128
175
|
data: rpcError(id, JSONRPC_METHOD_NOT_FOUND, `Method not found: ${method}`),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-handlers.js","sourceRoot":"","sources":["../../src/mcp/rpc-handlers.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EAGxB,QAAQ,EACR,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,cAAc,EACd,QAAQ,EACR,iBAAiB,EAIjB,sBAAsB,EACtB,SAAS,EACT,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,uGAAuG;AACvG,MAAM,aAAa,GAAG,CACpB,OAAgC,EAChC,KAGC,EACc,EAAE,CACjB,SAAS,CAAC,OAAO,EAAE;IACjB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;IAChC,EAAE,EAAE,KAAK,CAAC,EAAE;IACZ,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS;CACzC,CAAC,CAAC;AAEL,MAAM,iBAAiB,GAAG,
|
|
1
|
+
{"version":3,"file":"rpc-handlers.js","sourceRoot":"","sources":["../../src/mcp/rpc-handlers.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EAGxB,QAAQ,EACR,SAAS,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,cAAc,EACd,QAAQ,EACR,iBAAiB,EAIjB,sBAAsB,EACtB,SAAS,EACT,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,uGAAuG;AACvG,MAAM,aAAa,GAAG,CACpB,OAAgC,EAChC,KAGC,EACc,EAAE,CACjB,SAAS,CAAC,OAAO,EAAE;IACjB,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE;IAChC,EAAE,EAAE,KAAK,CAAC,EAAE;IACZ,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS;CACzC,CAAC,CAAC;AAEL,6FAA6F;AAC7F,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,MAAM,SAAS,GAAG,CAAC,IAAwB,EAAsB,EAAE,CACjE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;AAE/E,oFAAoF;AACpF,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC;AAK1F,MAAM,yBAAyB,GAAG,+CAA+C,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAG,CAAC,IAAoB,EAAkB,EAAE;IACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAC5D,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;IACnF,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC9D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClF,CAAC,CAAC;AASF,MAAM,wBAAwB,GAAG,KAAK,EACpC,OAAgC,EAChC,KAA0B,EACP,EAAE;IACrB,MAAM,aAAa,CAAC,OAAO,EAAE;QAC3B,GAAG,KAAK;QACR,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/B,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,cAAc,CAAC,aAAa;KACpC,CAAC,CAAC;IACH,OAAO,YAAY,CAAC;QAClB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,sBAAsB,EAAE,yBAAyB,CAAC;KAC5E,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,mBAAmB,GAAG,KAAK,EAC/B,OAAgC,EAChC,KAA0B,EACP,EAAE;IACrB,MAAM,aAAa,CAAC,OAAO,EAAE;QAC3B,GAAG,KAAK;QACR,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/B,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,cAAc,CAAC,WAAW;KAClC,CAAC,CAAC;IACH,OAAO,YAAY,CAAC;QAClB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,sBAAsB,EAAE,iBAAiB,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;KAC/F,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,EAChC,GAAY,EACZ,OAAgC,EAChC,KAA8C,EAC3B,EAAE;IACrB,MAAM,aAAa,CAAC,OAAO,EAAE;QAC3B,GAAG,KAAK;QACR,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,cAAc,CAAC,YAAY;KACnC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,uEAAuE;IACvE,sEAAsE;IACtE,kEAAkE;IAClE,sEAAsE;IACtE,OAAO,KAAK,CAAC,SAAS;QACpB,CAAC,CAAC,iBAAiB,CAAC,eAAe,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3D,CAAC,CAAC,YAAY,CAAC,eAAe,EAAE,kBAAkB,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC,CAAC;AAYF,MAAM,OAAO,GAAG;IACd,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAC1C,YAAY,CAAC;QACX,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE;YAClB,eAAe,EAAE,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;YACjD,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;SACzC,CAAC;KACH,CAAC;IAEJ,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IAEjE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACjD,MAAM,UAAU,GAAG,OAAO,CAAC,qBAAqB;YAC9C,CAAC,CAAC,CAAC,KAAgC,EAAE,EAAE,CACnC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC9D,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACvE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,OAAO,YAAY,CAAC;gBAClB,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,sBAAsB,EAAE,MAAM,CAAC,KAAK,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QAE9B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,mBAAmB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACnE,OAAO,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE;gBACxC,IAAI;gBACJ,SAAS;gBACT,EAAE;gBACF,SAAS;gBACT,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;QACL,CAAC;QAED,yEAAyE;QACzE,4DAA4D;QAC5D,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,wBAAwB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAEhG,sEAAsE;QACtE,uEAAuE;QACvE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,aAAa,CAAC,OAAO,EAAE;YAC3B,IAAI,EAAE,IAAI;YACV,SAAS;YACT,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO;YACnB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACtE,SAAS,EAAE,aAAa;SACzB,CAAC,CAAC;QACH,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;CAC2D,CAAC;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAQ,KAMvC,EAAqB,EAAE;IACtB,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAChD,iFAAiF;IACjF,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,2EAA2E;IAC3E,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAClD,MAAM,QAAQ,GACZ,MAAM,KAAK,YAAY;QACrB,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,QAAQ;YACrC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;YAClB,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,SAAS,CAAC;IAEhB,qFAAqF;IACrF,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,SAAS,GAAqB,IAAI,CAAC;IAEvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,SAAS,CAAC,OAAO,EAAE;gBACvB,MAAM;gBACN,IAAI,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC;gBAClE,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,cAAc,CAAC,YAAY;gBAClC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACnC,CAAC,CAAC;YACH,OAAO,YAAY,CAAC,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,2EAA2E;IAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAiD,EAAE,MAAM,CAAC,CAAC;IACpF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,YAAY,CAAC;YAClB,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,wBAAwB,EAAE,qBAAqB,MAAM,EAAE,CAAC;SAC5E,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;AACnE,CAAC,CAAC"}
|
package/dist/mcp/tools.d.ts
CHANGED
|
@@ -64,6 +64,8 @@ export type DefineToolOptions<TCtx, Input = Record<string, unknown>> = (ToolCore
|
|
|
64
64
|
*/
|
|
65
65
|
export declare const defineTool: <TCtx, Input = Record<string, unknown>>(options: DefineToolOptions<TCtx, Input>) => ToolDef<TCtx>;
|
|
66
66
|
export type ApiRequest = string | URL | Request;
|
|
67
|
+
/** See `ApiExtra.redirect`. */
|
|
68
|
+
export type RedirectMode = "manual" | "error" | "follow";
|
|
67
69
|
type ApiExtra<TCtx, Args> = {
|
|
68
70
|
request: (ctx: TCtx, args: Args) => ApiRequest | Promise<ApiRequest>;
|
|
69
71
|
respond?: (res: Response) => Promise<ToolResult | string> | ToolResult | string;
|
|
@@ -95,6 +97,18 @@ type ApiExtra<TCtx, Args> = {
|
|
|
95
97
|
* as `isError: true`, not a thrown exception `onToolError` would redact.
|
|
96
98
|
*/
|
|
97
99
|
maxResponseBytes?: number;
|
|
100
|
+
/**
|
|
101
|
+
* What to do when the upstream answers with a redirect. Default
|
|
102
|
+
* `"manual"`: the 3xx is returned as-is and surfaces as an ordinary failed
|
|
103
|
+
* request (status only), so credentials in custom headers (`X-Api-Key`,
|
|
104
|
+
* which `fetch` forwards cross-origin on a redirect), a POST body, and a
|
|
105
|
+
* request into an internal address are never handed to a `Location` the
|
|
106
|
+
* upstream picked. `"error"` makes any redirect throw. `"follow"` restores
|
|
107
|
+
* the platform default — only for an upstream you fully trust, since an
|
|
108
|
+
* open redirect or compromised upstream can then reach any URL the server
|
|
109
|
+
* can, and the response comes back to the model.
|
|
110
|
+
*/
|
|
111
|
+
redirect?: RedirectMode;
|
|
98
112
|
};
|
|
99
113
|
export type ApiToolOptions<TCtx, Input = Record<string, unknown>> = (ToolCore & ValidatedInput<Input> & ApiExtra<TCtx, Input>) | (ToolCore & RawInput & ApiExtra<TCtx, Record<string, unknown>>);
|
|
100
114
|
/**
|
package/dist/mcp/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,IAAI;IAC9D,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,CACjB,KAAK,EAAE,OAAO,KAEZ;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,SAAS,CAAA;SAAE,GACrC;YAAE,MAAM,EAAE,aAAa,CAAC;gBAAE,OAAO,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;aAAE,CAAC,CAAA;SAAE,GAC7E,OAAO,CACH;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,SAAS,CAAA;SAAE,GACrC;YAAE,MAAM,EAAE,aAAa,CAAC;gBAAE,OAAO,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;aAAE,CAAC,CAAA;SAAE,CAChF,CAAC;KACP,CAAC;CACH,CAAC;AAmCF,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,UAAU,CAAC;IACxB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,KAAK,WAAW,CAAC,IAAI,EAAE,IAAI,IAAI,CAC7B,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,IAAI,KACP,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,UAAU,GAAG,MAAM,CAAC;AAExD,KAAK,cAAc,CAAC,KAAK,IAAI;IAC3B,4EAA4E;IAC5E,KAAK,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;CACzC,CAAC;AAEF,KAAK,QAAQ,GAAG;IAAE,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,iBAAiB,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC/D,CAAC,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;CAAE,CAAC,GAC1E,CAAC,QAAQ,GAAG,QAAQ,GAAG;IAAE,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,CAAC,CAAC;AAEpF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,SAAS,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,KACtC,OAAO,CAAC,IAAI,CAWb,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC;AAEhD,+BAA+B;AAC/B,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEzD,KAAK,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI;IAC1B,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,UAAU,GAAG,MAAM,CAAC;IAChF;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,UAAU,GAAG,MAAM,CAAC;IAChF,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC3B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D,CAAC,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAC1D,CAAC,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAoOpE;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,SAAS,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,KACnC,OAAO,CAAC,IAAI,CAkBd,CAAC"}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -59,8 +59,12 @@ const defaultRespond = (res) => res.text();
|
|
|
59
59
|
*/
|
|
60
60
|
const defaultErrorResult = (res) => {
|
|
61
61
|
const status = [res.status, res.statusText].filter(Boolean).join(" ");
|
|
62
|
+
// A redirect is not followed by default; an opaque one (some runtimes) has
|
|
63
|
+
// status 0. Say so, or a previously working http→https hop just "fails".
|
|
64
|
+
const isRedirect = res.type === "opaqueredirect" || (res.status >= 300 && res.status < 400);
|
|
65
|
+
const hint = isRedirect ? ' (redirect not followed; set redirect: "follow" to allow it)' : "";
|
|
62
66
|
return {
|
|
63
|
-
content: [{ type: "text", text: `Request failed: ${status}` }],
|
|
67
|
+
content: [{ type: "text", text: `Request failed: ${status}${hint}` }],
|
|
64
68
|
isError: true,
|
|
65
69
|
};
|
|
66
70
|
};
|
|
@@ -73,20 +77,101 @@ const isTimeoutError = (caught) => {
|
|
|
73
77
|
caught.message === "body read aborted");
|
|
74
78
|
};
|
|
75
79
|
const timedOutResult = (timeoutMs) => ({
|
|
76
|
-
content: [
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: "text",
|
|
83
|
+
text: timeoutMs === false ? "Request timed out" : `Request timed out after ${timeoutMs}ms`,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
77
86
|
isError: true,
|
|
78
87
|
});
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
88
|
+
const cancelledResult = () => ({
|
|
89
|
+
content: [{ type: "text", text: "Request was cancelled" }],
|
|
90
|
+
isError: true,
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* The `ToolResult` for a caller abort or a timeout, or `null` for any other
|
|
94
|
+
* error. A caller abort is checked first and by signal state, not by error
|
|
95
|
+
* shape: `fetch` rejects with the abort *reason*, which is whatever the
|
|
96
|
+
* caller passed to `abort(...)` — not necessarily an `AbortError`.
|
|
97
|
+
*/
|
|
98
|
+
const abortResult = (caught, timeoutMs, callerSignal) => {
|
|
99
|
+
if (callerSignal?.aborted)
|
|
100
|
+
return cancelledResult();
|
|
101
|
+
return isTimeoutError(caught) ? timedOutResult(timeoutMs) : null;
|
|
102
|
+
};
|
|
103
|
+
const NOOP = () => { };
|
|
104
|
+
/**
|
|
105
|
+
* `AbortSignal.any` is Node >= 20.3; `engines` allows 20.0. The fallback
|
|
106
|
+
* follows whichever signal fires first and removes its listeners on
|
|
107
|
+
* `dispose` — a long-lived caller signal shared across many calls must not
|
|
108
|
+
* accumulate one listener per call.
|
|
109
|
+
*/
|
|
110
|
+
const anySignal = (signals) => {
|
|
111
|
+
if (typeof AbortSignal.any === "function") {
|
|
112
|
+
return { signal: AbortSignal.any(signals), dispose: NOOP };
|
|
113
|
+
}
|
|
114
|
+
const controller = new AbortController();
|
|
115
|
+
const listeners = [];
|
|
116
|
+
const dispose = () => {
|
|
117
|
+
for (const [signal, listener] of listeners)
|
|
118
|
+
signal.removeEventListener("abort", listener);
|
|
119
|
+
listeners.length = 0;
|
|
120
|
+
};
|
|
121
|
+
for (const signal of signals) {
|
|
122
|
+
if (signal.aborted) {
|
|
123
|
+
controller.abort(signal.reason);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
const listener = () => {
|
|
127
|
+
controller.abort(signal.reason);
|
|
128
|
+
dispose();
|
|
129
|
+
};
|
|
130
|
+
signal.addEventListener("abort", listener, { once: true });
|
|
131
|
+
listeners.push([signal, listener]);
|
|
132
|
+
}
|
|
133
|
+
return { signal: controller.signal, dispose };
|
|
134
|
+
};
|
|
135
|
+
/** An aborted or timed-out fetch becomes a `ToolResult`; every other throw still propagates. */
|
|
136
|
+
const fetchWithTimeout = async ({ fetchImpl, input, timeoutMs, redirect, }) => {
|
|
137
|
+
const callerSignal = input instanceof Request ? input.signal : undefined;
|
|
138
|
+
if (timeoutMs === false) {
|
|
139
|
+
// Nothing to combine: `fetch` keeps the `Request`'s own signal, and the
|
|
140
|
+
// same signal is handed to the body read so a later abort stops it too.
|
|
141
|
+
try {
|
|
142
|
+
return {
|
|
143
|
+
response: await fetchImpl(input, { redirect }),
|
|
144
|
+
signal: callerSignal,
|
|
145
|
+
callerSignal,
|
|
146
|
+
dispose: NOOP,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch (caught) {
|
|
150
|
+
const aborted = abortResult(caught, timeoutMs, callerSignal);
|
|
151
|
+
if (aborted)
|
|
152
|
+
return aborted;
|
|
153
|
+
throw caught;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// `init.signal` replaces a `Request`'s own signal — combine both so a
|
|
157
|
+
// caller's abort still cancels the call.
|
|
158
|
+
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
159
|
+
const combined = callerSignal
|
|
160
|
+
? anySignal([timeoutSignal, callerSignal])
|
|
161
|
+
: { signal: timeoutSignal, dispose: NOOP };
|
|
84
162
|
try {
|
|
85
|
-
return {
|
|
163
|
+
return {
|
|
164
|
+
response: await fetchImpl(input, { signal: combined.signal, redirect }),
|
|
165
|
+
signal: combined.signal,
|
|
166
|
+
callerSignal,
|
|
167
|
+
dispose: combined.dispose,
|
|
168
|
+
};
|
|
86
169
|
}
|
|
87
170
|
catch (caught) {
|
|
88
|
-
|
|
89
|
-
|
|
171
|
+
combined.dispose();
|
|
172
|
+
const aborted = abortResult(caught, timeoutMs, callerSignal);
|
|
173
|
+
if (aborted)
|
|
174
|
+
return aborted;
|
|
90
175
|
throw caught;
|
|
91
176
|
}
|
|
92
177
|
};
|
|
@@ -97,10 +182,10 @@ const fetchWithTimeout = async (fetchImpl, input, timeoutMs) => {
|
|
|
97
182
|
* raw bytes — not decoded text — so `respond`/`onError` can still call
|
|
98
183
|
* res.arrayBuffer()/res.blob() on binary bodies as well as res.text()/
|
|
99
184
|
* res.json(), exactly as if they'd read the original response themselves.
|
|
100
|
-
* An oversized body, or the timeout signal firing mid-body, becomes
|
|
101
|
-
* `ToolResult`; every other throw still propagates.
|
|
185
|
+
* An oversized body, or the timeout or caller signal firing mid-body, becomes
|
|
186
|
+
* a `ToolResult`; every other throw still propagates.
|
|
102
187
|
*/
|
|
103
|
-
const boundResponse = async (res, maxResponseBytes, timeoutMs, signal) => {
|
|
188
|
+
const boundResponse = async (res, maxResponseBytes, timeoutMs, { signal, callerSignal }) => {
|
|
104
189
|
let bytes;
|
|
105
190
|
try {
|
|
106
191
|
bytes = (await readBoundedBytes(res, maxResponseBytes, signal));
|
|
@@ -112,8 +197,9 @@ const boundResponse = async (res, maxResponseBytes, timeoutMs, signal) => {
|
|
|
112
197
|
isError: true,
|
|
113
198
|
};
|
|
114
199
|
}
|
|
115
|
-
|
|
116
|
-
|
|
200
|
+
const aborted = abortResult(caught, timeoutMs, callerSignal);
|
|
201
|
+
if (aborted)
|
|
202
|
+
return aborted;
|
|
117
203
|
throw caught;
|
|
118
204
|
}
|
|
119
205
|
// The buffered body is already decoded and re-framed — the upstream
|
|
@@ -127,11 +213,22 @@ const runApi = async (options, ctx, args) => {
|
|
|
127
213
|
const fetchImpl = options.fetch ?? fetch;
|
|
128
214
|
const input = await options.request(ctx, args);
|
|
129
215
|
const timeoutMs = options.timeoutMs ?? DEFAULT_API_TOOL_TIMEOUT_MS;
|
|
130
|
-
const fetched = await fetchWithTimeout(
|
|
216
|
+
const fetched = await fetchWithTimeout({
|
|
217
|
+
fetchImpl,
|
|
218
|
+
input,
|
|
219
|
+
timeoutMs,
|
|
220
|
+
redirect: options.redirect ?? "manual",
|
|
221
|
+
});
|
|
131
222
|
if (!("response" in fetched))
|
|
132
223
|
return fetched;
|
|
133
224
|
const maxResponseBytes = options.maxResponseBytes ?? DEFAULT_MCP_BODY_LIMIT;
|
|
134
|
-
|
|
225
|
+
let bounded;
|
|
226
|
+
try {
|
|
227
|
+
bounded = await boundResponse(fetched.response, maxResponseBytes, timeoutMs, fetched);
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
fetched.dispose();
|
|
231
|
+
}
|
|
135
232
|
if (!(bounded instanceof Response))
|
|
136
233
|
return bounded;
|
|
137
234
|
if (!bounded.ok)
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA2BjD,MAAM,YAAY,GAAG,CAAC,IAAwC,EAAU,EAAE,CACxE,CAAC,IAAI,IAAI,EAAE,CAAC;KACT,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACf,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,IAAI,OAAO;IACxD,CAAC,CAAC,MAAM,CAAE,OAA4B,CAAC,GAAG,CAAC;IAC3C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACpB;KACA,IAAI,CAAC,GAAG,CAAC,CAAC;AAEf,MAAM,eAAe,GAAG,KAAK,EAC3B,MAAyC,EACzC,GAAY,EACkB,EAAE;IAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC3B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;YAC5D,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAG,MAA4B,CAAC,KAAK,EAAE,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,MAAgB,EAAc,EAAE,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACpD,OAAO,EAAE,IAAI;CACd,CAAC,CAAC;AA2BH;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,OAAuC,EACxB,EAAE,CAAC,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC,IAAI;IAClB,WAAW,EAAE,OAAO,CAAC,WAAW;IAChC,WAAW,EAAE,OAAO,CAAC,WAAW;IAChC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC9B,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,QAAQ,IAAI,MAAM;YAAE,OAAO,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/validate.d.ts
CHANGED
|
@@ -44,6 +44,12 @@ export declare const unsupportedKeywords: (schema: JsonSchema, path?: string) =>
|
|
|
44
44
|
* reach validation unchecked.
|
|
45
45
|
*/
|
|
46
46
|
export declare const missingObjectType: (schema: JsonSchema, path?: string) => string[];
|
|
47
|
-
/**
|
|
47
|
+
/** Errors reported for one value before validation stops looking for more. */
|
|
48
|
+
export declare const MAX_VALIDATION_ERRORS = 20;
|
|
49
|
+
/**
|
|
50
|
+
* Minimal JSON Schema subset used by MCP tool inputSchema. Empty = valid.
|
|
51
|
+
* Reports at most `MAX_VALIDATION_ERRORS` violations — enough to fix a call,
|
|
52
|
+
* bounded however large or hostile the arguments are.
|
|
53
|
+
*/
|
|
48
54
|
export declare const validateAgainstSchema: (value: unknown, schema: JsonSchema) => string[];
|
|
49
55
|
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/mcp/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/mcp/validate.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG;IACvB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,oBAAoB,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;CAQpB,CAAC;AAkBX,2DAA2D;AAC3D,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,MAAM,CASxD,CAAC;AAUH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAYtD,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,UAAU,EAAE,aAAa,KAAG,MAAM,EAU7E,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,UAAU,EAAE,aAAa,KAAG,MAAM,EAS3E,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAoJxC;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,EAAE,QAAQ,UAAU,KAAG,MAAM,EAQhF,CAAC"}
|
package/dist/mcp/validate.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { areJsonValuesEqual } from "../util/json.js";
|
|
1
2
|
export const JSON_SCHEMA_TYPES = {
|
|
2
3
|
string: "string",
|
|
3
4
|
number: "number",
|
|
@@ -81,6 +82,13 @@ export const missingObjectType = (schema, path = "args") => {
|
|
|
81
82
|
...childSchemas(schema, path).flatMap(([child, childPath]) => missingObjectType(child, childPath)),
|
|
82
83
|
];
|
|
83
84
|
};
|
|
85
|
+
/** Errors reported for one value before validation stops looking for more. */
|
|
86
|
+
export const MAX_VALIDATION_ERRORS = 20;
|
|
87
|
+
const spend = (budget, errors) => {
|
|
88
|
+
const kept = errors.slice(0, Math.max(0, budget.remaining));
|
|
89
|
+
budget.remaining -= kept.length;
|
|
90
|
+
return kept;
|
|
91
|
+
};
|
|
84
92
|
const runtimeTypeOf = (value) => {
|
|
85
93
|
if (value === null)
|
|
86
94
|
return JSON_SCHEMA_TYPES.null;
|
|
@@ -101,7 +109,7 @@ const typeMismatch = (value, schema, path) => {
|
|
|
101
109
|
return matches ? [] : [`${path}: expected ${declared.join(" | ")}, got ${actual}`];
|
|
102
110
|
};
|
|
103
111
|
const enumErrors = (value, schema, path) => {
|
|
104
|
-
if (!schema.enum || schema.enum.
|
|
112
|
+
if (!schema.enum || schema.enum.some((entry) => areJsonValuesEqual(entry, value)))
|
|
105
113
|
return [];
|
|
106
114
|
return [`${path}: value not in enum`];
|
|
107
115
|
};
|
|
@@ -117,17 +125,17 @@ const RANGE_BOUNDS = [
|
|
|
117
125
|
message: (path, bound) => `${path}: above maximum ${bound}`,
|
|
118
126
|
},
|
|
119
127
|
];
|
|
120
|
-
const rangeErrors = (value, schema, path) => {
|
|
128
|
+
const rangeErrors = (value, schema, path, budget) => {
|
|
121
129
|
if (typeof value !== "number")
|
|
122
130
|
return [];
|
|
123
|
-
return RANGE_BOUNDS.flatMap(({ key, fails, message }) => {
|
|
131
|
+
return spend(budget, RANGE_BOUNDS.flatMap(({ key, fails, message }) => {
|
|
124
132
|
const bound = schema[key];
|
|
125
133
|
if (bound === undefined || !fails(value, bound))
|
|
126
134
|
return [];
|
|
127
135
|
return [message(path, bound)];
|
|
128
|
-
});
|
|
136
|
+
}));
|
|
129
137
|
};
|
|
130
|
-
const objectErrors = (value, schema, path) => {
|
|
138
|
+
const objectErrors = (value, schema, path, budget) => {
|
|
131
139
|
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
132
140
|
return [];
|
|
133
141
|
const record = value;
|
|
@@ -137,24 +145,38 @@ const objectErrors = (value, schema, path) => {
|
|
|
137
145
|
// `properties: { constructor: {...} }` entry would validate against the
|
|
138
146
|
// prototype's own `constructor`, neither of which is an actual argument
|
|
139
147
|
// the caller supplied.
|
|
140
|
-
const
|
|
148
|
+
const errors = spend(budget, (schema.required ?? [])
|
|
141
149
|
.filter((key) => !Object.hasOwn(record, key))
|
|
142
|
-
.map((key) => `${path}.${key}: required`);
|
|
143
|
-
const
|
|
144
|
-
.
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
150
|
+
.map((key) => `${path}.${key}: required`));
|
|
151
|
+
for (const [key, propSchema] of Object.entries(schema.properties ?? {})) {
|
|
152
|
+
if (budget.remaining <= 0)
|
|
153
|
+
return errors;
|
|
154
|
+
if (Object.hasOwn(record, key)) {
|
|
155
|
+
errors.push(...validateNode(record[key], propSchema, `${path}.${key}`, budget));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (schema.additionalProperties === false) {
|
|
159
|
+
for (const key of Object.keys(record)) {
|
|
160
|
+
if (budget.remaining <= 0)
|
|
161
|
+
return errors;
|
|
162
|
+
if (!Object.hasOwn(schema.properties ?? {}, key)) {
|
|
163
|
+
errors.push(...spend(budget, [`${path}.${key}: not allowed`]));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return errors;
|
|
152
168
|
};
|
|
153
|
-
const arrayErrors = (value, schema, path) => {
|
|
169
|
+
const arrayErrors = (value, schema, path, budget) => {
|
|
154
170
|
const items = schema.items;
|
|
155
171
|
if (!Array.isArray(value) || !items)
|
|
156
172
|
return [];
|
|
157
|
-
|
|
173
|
+
const errors = [];
|
|
174
|
+
for (const [index, entry] of value.entries()) {
|
|
175
|
+
if (budget.remaining <= 0)
|
|
176
|
+
break;
|
|
177
|
+
errors.push(...validateNode(entry, items, `${path}[${index}]`, budget));
|
|
178
|
+
}
|
|
179
|
+
return errors;
|
|
158
180
|
};
|
|
159
181
|
const TYPE_CHECKERS = {
|
|
160
182
|
[JSON_SCHEMA_TYPES.object]: objectErrors,
|
|
@@ -162,10 +184,10 @@ const TYPE_CHECKERS = {
|
|
|
162
184
|
[JSON_SCHEMA_TYPES.number]: rangeErrors,
|
|
163
185
|
[JSON_SCHEMA_TYPES.integer]: rangeErrors,
|
|
164
186
|
};
|
|
165
|
-
const validateNode = (value, schema, path) => {
|
|
187
|
+
const validateNode = (value, schema, path, budget) => {
|
|
166
188
|
const typeErrors = typeMismatch(value, schema, path);
|
|
167
189
|
if (typeErrors.length > 0)
|
|
168
|
-
return typeErrors;
|
|
190
|
+
return spend(budget, typeErrors);
|
|
169
191
|
// Dispatch on the value's own runtime shape, not the declared type
|
|
170
192
|
// string(s). By this point `typeMismatch` has already confirmed `value`
|
|
171
193
|
// is consistent with whatever was declared (or nothing was declared at
|
|
@@ -177,10 +199,22 @@ const validateNode = (value, schema, path) => {
|
|
|
177
199
|
// backstop for a schema that reaches validation unchecked).
|
|
178
200
|
const actual = runtimeTypeOf(value);
|
|
179
201
|
return [
|
|
180
|
-
...enumErrors(value, schema, path),
|
|
181
|
-
...(TYPE_CHECKERS[actual]?.(value, schema, path) ?? []),
|
|
202
|
+
...spend(budget, enumErrors(value, schema, path)),
|
|
203
|
+
...(TYPE_CHECKERS[actual]?.(value, schema, path, budget) ?? []),
|
|
182
204
|
];
|
|
183
205
|
};
|
|
184
|
-
/**
|
|
185
|
-
|
|
206
|
+
/**
|
|
207
|
+
* Minimal JSON Schema subset used by MCP tool inputSchema. Empty = valid.
|
|
208
|
+
* Reports at most `MAX_VALIDATION_ERRORS` violations — enough to fix a call,
|
|
209
|
+
* bounded however large or hostile the arguments are.
|
|
210
|
+
*/
|
|
211
|
+
export const validateAgainstSchema = (value, schema) => {
|
|
212
|
+
const budget = { remaining: MAX_VALIDATION_ERRORS };
|
|
213
|
+
const errors = validateNode(value, schema, "args", budget);
|
|
214
|
+
// A spent budget means the walk stopped early: say so, so a caller does not
|
|
215
|
+
// read the list as complete and loop on "fix these, find more".
|
|
216
|
+
return budget.remaining <= 0
|
|
217
|
+
? [...errors, `(stopped after ${MAX_VALIDATION_ERRORS} errors; more may follow)`]
|
|
218
|
+
: errors;
|
|
219
|
+
};
|
|
186
220
|
//# sourceMappingURL=validate.js.map
|
package/dist/mcp/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/mcp/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/mcp/validate.ts"],"names":[],"mappings":"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"}
|