@bevel-software/platform-mcp-core 0.26.0 → 0.27.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.
Files changed (50) hide show
  1. package/dist/call-guards.d.ts +47 -0
  2. package/dist/call-guards.d.ts.map +1 -0
  3. package/dist/call-guards.js +215 -0
  4. package/dist/call-guards.js.map +1 -0
  5. package/dist/dispatch.d.ts +5 -1
  6. package/dist/dispatch.d.ts.map +1 -1
  7. package/dist/dispatch.js +19 -2
  8. package/dist/dispatch.js.map +1 -1
  9. package/dist/get-has-no-body.d.ts +49 -0
  10. package/dist/get-has-no-body.d.ts.map +1 -0
  11. package/dist/get-has-no-body.js +104 -0
  12. package/dist/get-has-no-body.js.map +1 -0
  13. package/dist/index.d.ts +6 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +6 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/mcp-app.d.ts +118 -0
  18. package/dist/mcp-app.d.ts.map +1 -0
  19. package/dist/mcp-app.js +126 -0
  20. package/dist/mcp-app.js.map +1 -0
  21. package/dist/meta-tools.d.ts.map +1 -1
  22. package/dist/meta-tools.js +27 -5
  23. package/dist/meta-tools.js.map +1 -1
  24. package/dist/proxied-tool.d.ts +11 -0
  25. package/dist/proxied-tool.d.ts.map +1 -1
  26. package/dist/proxied-tool.js +13 -1
  27. package/dist/proxied-tool.js.map +1 -1
  28. package/dist/results.d.ts +20 -1
  29. package/dist/results.d.ts.map +1 -1
  30. package/dist/results.js +117 -3
  31. package/dist/results.js.map +1 -1
  32. package/dist/tool-interface.d.ts +137 -0
  33. package/dist/tool-interface.d.ts.map +1 -0
  34. package/dist/tool-interface.js +640 -0
  35. package/dist/tool-interface.js.map +1 -0
  36. package/dist/utcp-namespace.d.ts +14 -0
  37. package/dist/utcp-namespace.d.ts.map +1 -1
  38. package/dist/utcp-namespace.js +7 -2
  39. package/dist/utcp-namespace.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/call-guards.ts +237 -0
  42. package/src/dispatch.ts +18 -1
  43. package/src/get-has-no-body.ts +110 -0
  44. package/src/index.ts +39 -0
  45. package/src/mcp-app.ts +194 -0
  46. package/src/meta-tools.ts +30 -5
  47. package/src/proxied-tool.ts +23 -1
  48. package/src/results.ts +129 -3
  49. package/src/tool-interface.ts +673 -0
  50. package/src/utcp-namespace.ts +7 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-interface.js","sourceRoot":"","sources":["../src/tool-interface.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,20 @@
11
11
  */
12
12
  export declare function utcpNamespacePrefix(manualName: string): string;
13
13
  export declare function utcpNamespacedKey(manualName: string, varName: string): string;
14
+ /**
15
+ * True only when `${API_URL}` is the URL's ORIGIN (scheme+authority) — the shape
16
+ * we ourselves produce for a Bevel-hosted manual. A third-party `.tool` author
17
+ * can embed the literal `${API_URL}` anywhere in a path or query
18
+ * (`http://evil.example/?x=${API_URL}`) but can NOT make it the authority without
19
+ * pointing the request back at our own loopback, so anchoring the trust decision
20
+ * to the origin is what a user `.tool`'s URL text cannot forge.
21
+ *
22
+ * Two decisions rest on it, for the same reason: WHICH manuals are seeded the
23
+ * loopback bearer (below), and WHICH tools the tool client leaves unchecked
24
+ * because this server hosts them as routes and their own handlers check them
25
+ * (`call-guards.ts`).
26
+ */
27
+ export declare function isPlatformHostedUrl(url: string): boolean;
14
28
  /**
15
29
  * Seed the loopback discovery vars (`<ns>_API_URL` + `<ns>_CONNECTION_KEY`) for
16
30
  * every Bevel-HOSTED manual in `manuals` — one whose discovery `url` targets our
@@ -1 +1 @@
1
- {"version":3,"file":"utcp-namespace.d.ts","sourceRoot":"","sources":["../src/utcp-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7E;AAyBD;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,EACrD,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB"}
1
+ {"version":3,"file":"utcp-namespace.d.ts","sourceRoot":"","sources":["../src/utcp-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7E;AASD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,EACrD,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,GACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB"}
@@ -28,8 +28,13 @@ const LOOPBACK_ORIGIN_TEMPLATE = '${API_URL}';
28
28
  * (`http://evil.example/?x=${API_URL}`) but can NOT make it the authority without
29
29
  * pointing the request back at our own loopback, so anchoring the trust decision
30
30
  * to the origin is what a user `.tool`'s URL text cannot forge.
31
+ *
32
+ * Two decisions rest on it, for the same reason: WHICH manuals are seeded the
33
+ * loopback bearer (below), and WHICH tools the tool client leaves unchecked
34
+ * because this server hosts them as routes and their own handlers check them
35
+ * (`call-guards.ts`).
31
36
  */
32
- function isBevelHostedUrl(url) {
37
+ export function isPlatformHostedUrl(url) {
33
38
  if (!url.startsWith(LOOPBACK_ORIGIN_TEMPLATE))
34
39
  return false;
35
40
  // The char right after the origin must delimit the authority; anything else
@@ -56,7 +61,7 @@ export function seedBevelHostedManualVars(manuals, loopbackBaseUrl, connectionKe
56
61
  if (!name)
57
62
  continue;
58
63
  const url = m.url;
59
- if (typeof url !== 'string' || !isBevelHostedUrl(url))
64
+ if (typeof url !== 'string' || !isPlatformHostedUrl(url))
60
65
  continue;
61
66
  variables[utcpNamespacedKey(name, 'API_URL')] = loopbackBaseUrl;
62
67
  variables[utcpNamespacedKey(name, 'CONNECTION_KEY')] = connectionKey;
@@ -1 +1 @@
1
- {"version":3,"file":"utcp-namespace.js","sourceRoot":"","sources":["../src/utcp-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,OAAe;IACnE,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,GAAG,OAAO,EAAE,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,YAAY,CAAC;AAE9C;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAqD,EACrD,eAAuB,EACvB,aAAqB;IAErB,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,GAAG,GAAI,CAAuB,CAAC,GAAG,CAAC;QACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;YAAE,SAAS;QAChE,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,GAAG,eAAe,CAAC;QAChE,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,GAAG,aAAa,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"utcp-namespace.js","sourceRoot":"","sources":["../src/utcp-namespace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,OAAe;IACnE,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,GAAG,OAAO,EAAE,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,YAAY,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,wBAAwB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAqD,EACrD,eAAuB,EACvB,aAAqB;IAErB,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,GAAG,GAAI,CAAuB,CAAC,GAAG,CAAC;QACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YAAE,SAAS;QACnE,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,GAAG,eAAe,CAAC;QAChE,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,GAAG,aAAa,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bevel-software/platform-mcp-core",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "description": "The transport-agnostic half of Bevel's MCP surface: UTCP manual registration, tool discovery, MCP listing/dispatch and the code-mode meta-tools. Shared by the hosted proxy and the local stdio server.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,237 @@
1
+ import type { CodeModeUtcpClient } from '@utcp/code-mode';
2
+ import { ARGUMENTS_DO_NOT_MATCH_KIND, argumentsDoNotMatchMessage, checkFor } from './tool-interface.js';
3
+ import { NOT_JSON_KIND, pageInsteadOfJson } from './results.js';
4
+ import { isPlatformHostedUrl } from './utcp-namespace.js';
5
+
6
+ /**
7
+ * The guards the tool client puts in front of a call to a tool THIS SERVER DOES
8
+ * NOT HOST: its arguments are checked against the tool's own input schema before
9
+ * anything leaves, and an answer that is a web page where JSON was expected is
10
+ * cut to something an agent can read.
11
+ *
12
+ * The check lives where the tool lives. A tool the platform (or a deployment)
13
+ * hosts as a route of its own is checked IN THAT ROUTE's handler, so every
14
+ * caller gets the same answer — an agent over MCP, a chain, and a script
15
+ * calling `POST /api/agent/tools/<name>` with a connection key alike. What is
16
+ * left for the client are the tools with no route here: a connected server's
17
+ * tools, and an http tool that calls another service directly. Those are
18
+ * checked here, before the call leaves, and route-hosted tools are skipped so
19
+ * they are not checked twice and so the route's own answer is what comes back.
20
+ *
21
+ * Installed on the UTCP client, which is the one place both of ITS call paths
22
+ * meet: `callToolStreaming` is the MCP dispatch path and `callTool` is what
23
+ * `call_tool_chain` bridges every in-isolate tool function to.
24
+ *
25
+ * Nothing here changes a call. A call that matches its schema is passed on with
26
+ * exactly the arguments that were given — no argument is added, removed,
27
+ * renamed or coerced — because a checker that repaired calls would hide the
28
+ * mistake it was built to report, and would be wrong for at least one protocol.
29
+ */
30
+
31
+ /** Marks the client's call methods as already wrapped by THESE guards. */
32
+ const GUARDED = Symbol.for('bevel.mcp-core.callGuards');
33
+
34
+ /** Tools whose schema could not be used for checking, so the reason is logged once each. */
35
+ const unchecked = new Set<string>();
36
+
37
+ /**
38
+ * The refusal a call that does not match its tool gets: a 400 carrying
39
+ * `arguments-do-not-match`, the mismatches, the tool's interface and the call
40
+ * example.
41
+ *
42
+ * Shaped like the typed refusals the platform's REST tools return, so it
43
+ * reaches an agent the same way they do: `response.data` is what
44
+ * `describeToolFailure` reads, and the enumerable `status` / `data` are what a
45
+ * chain sees on the thrown error.
46
+ */
47
+ export class ArgumentsDoNotMatchError extends Error {
48
+ readonly status = 400;
49
+ readonly kind = ARGUMENTS_DO_NOT_MATCH_KIND;
50
+ readonly data: { error: string; kind: string; status: number };
51
+ readonly response: { status: number; data: { error: string; kind: string; status: number } };
52
+
53
+ constructor(message: string) {
54
+ super(message);
55
+ this.name = 'ArgumentsDoNotMatchError';
56
+ this.data = { error: message, kind: ARGUMENTS_DO_NOT_MATCH_KIND, status: 400 };
57
+ this.response = { status: 400, data: this.data };
58
+ }
59
+ }
60
+
61
+ /** The error a tool's non-JSON answer becomes: short, with the page left behind. */
62
+ class NotJsonError extends Error {
63
+ readonly kind = NOT_JSON_KIND;
64
+ readonly data: { error: string; kind: string };
65
+ readonly response: { data: { error: string; kind: string } };
66
+
67
+ constructor(message: string) {
68
+ super(message);
69
+ this.name = 'NotJsonError';
70
+ this.data = { error: message, kind: NOT_JSON_KIND };
71
+ this.response = { data: this.data };
72
+ }
73
+ }
74
+
75
+ /** The protocols whose answer is an HTTP response, and so can be a web page. */
76
+ const HTTP_PROTOCOLS: ReadonlySet<string> = new Set(['http', 'streamable_http', 'sse']);
77
+
78
+ /**
79
+ * Where this server mounts the tools it hosts itself: one route per tool, under
80
+ * one prefix, which is what `toolDef` builds every platform (and deployment)
81
+ * tool's URL from.
82
+ */
83
+ const AGENT_TOOL_ROUTE_PREFIX = '/api/agent/tools/';
84
+
85
+ /** The length of the `${API_URL}` origin template, so the path can be read past it. */
86
+ const PLATFORM_ORIGIN_TEMPLATE_LENGTH = '${API_URL}'.length;
87
+
88
+ interface RepositoryTool {
89
+ name: string;
90
+ description?: string;
91
+ inputs?: unknown;
92
+ outputs?: unknown;
93
+ tool_call_template?: { call_template_type?: unknown; url?: unknown };
94
+ }
95
+
96
+ /**
97
+ * Is this tool a route THIS server hosts? Such a tool is checked by its own
98
+ * route handler — which sees the flat arguments the handler really takes and
99
+ * answers every caller, not only the ones that came through a client — so the
100
+ * client must leave it alone: checking it here would check it twice, and the
101
+ * first refusal would replace the route's answer with one of our own.
102
+ *
103
+ * Decided on two things together: `${API_URL}` as the template's ORIGIN, which
104
+ * expands to this server's own loopback and which a tool definition cannot fake
105
+ * (a third-party `.tool` can put that literal in a path or a query but cannot
106
+ * make it the authority without pointing the request back at us — the same rule
107
+ * as the credential seeding in `utcp-namespace.ts`), AND the agent-tool route
108
+ * prefix every such tool is served under. Both are needed: a `.tool` an
109
+ * administrator wrote may legitimately point at some OTHER endpoint of this
110
+ * same backend, and that one has no tool handler to check it, so the client
111
+ * must.
112
+ */
113
+ function isHostedAsARouteHere(tool: RepositoryTool): boolean {
114
+ const template = tool.tool_call_template;
115
+ if (!template) return false;
116
+ const type = typeof template.call_template_type === 'string' ? template.call_template_type : '';
117
+ if (!HTTP_PROTOCOLS.has(type)) return false;
118
+ const url = template.url;
119
+ if (typeof url !== 'string' || !isPlatformHostedUrl(url)) return false;
120
+ return url.slice(PLATFORM_ORIGIN_TEMPLATE_LENGTH).startsWith(AGENT_TOOL_ROUTE_PREFIX);
121
+ }
122
+
123
+ /**
124
+ * Check `args` against the tool registered as `toolName`, returning the
125
+ * refusal message when they do not match and `null` when they do (or when the
126
+ * tool's schema cannot be used for checking, which is logged once).
127
+ *
128
+ * Exported for the surfaces' tests; the guards below are the only caller in
129
+ * production.
130
+ */
131
+ export async function argumentRefusal(
132
+ client: CodeModeUtcpClient,
133
+ toolName: string,
134
+ args: Record<string, unknown>,
135
+ ): Promise<string | null> {
136
+ const tool = (await client.config.tool_repository.getTool(toolName)) as RepositoryTool | undefined;
137
+ // Not registered: the client's own "not found in the repository" is the
138
+ // honest answer, and inventing a mismatch for a tool that does not exist
139
+ // would bury it.
140
+ if (!tool) return null;
141
+ // Hosted here as a route: its handler does the checking, and its answer is
142
+ // what the caller must get (see `isHostedAsARouteHere`).
143
+ if (isHostedAsARouteHere(tool)) return null;
144
+ const check = checkFor(tool.inputs);
145
+ if (!check.checkable) {
146
+ // Once per tool, not once per call: a tool with an unusable schema is
147
+ // called on every turn, and the reason is a property of the schema.
148
+ if (!unchecked.has(toolName)) {
149
+ unchecked.add(toolName);
150
+ console.warn(
151
+ `[mcp] calling "${toolName}" without checking its arguments — ${check.reason}. ` +
152
+ 'Its calls are passed through as they are.',
153
+ );
154
+ }
155
+ return null;
156
+ }
157
+ const mismatches = check.check(args ?? {});
158
+ if (mismatches.length === 0) return null;
159
+ // The name the agent used is the bare tool name, not the `<manual>.<tool>`
160
+ // the registry keys on — but the call example has to show the namespace, so
161
+ // both go in: the sentence names the tool, the example names the call.
162
+ const bare = toolName.includes('.') ? toolName.slice(toolName.lastIndexOf('.') + 1) : toolName;
163
+ return argumentsDoNotMatchMessage(bare, toolName, tool.inputs, mismatches);
164
+ }
165
+
166
+ /**
167
+ * Install the guards on `client`. Idempotent per client, and ORDER-PROOF: when
168
+ * another layer (the downstream router, session recovery, the audit
169
+ * instrumentation) has re-wrapped the call methods since, the guards are
170
+ * wrapped around that one too, so they stay outermost and a routed call cannot
171
+ * slip past them. Checking twice is free — the check is pure and compiled once.
172
+ */
173
+ export function installCallGuards(client: CodeModeUtcpClient): void {
174
+ // Each call method is guarded on its own: a client with only one of them
175
+ // can still call tools through it, and that one path is checked all the
176
+ // same. A client with neither cannot call a tool, so there is nothing to
177
+ // guard. (A test double that only registers manuals is exactly that.)
178
+ const hasCallTool = typeof client.callTool === 'function';
179
+ const hasStreaming = typeof client.callToolStreaming === 'function';
180
+ if (!hasCallTool && !hasStreaming) return;
181
+
182
+ const repositoryTool = async (toolName: string): Promise<RepositoryTool | undefined> =>
183
+ (await client.config.tool_repository.getTool(toolName)) as RepositoryTool | undefined;
184
+
185
+ const guardResult = async (toolName: string, value: unknown): Promise<void> => {
186
+ if (typeof value !== 'string') return;
187
+ const short = pageInsteadOfJson(value);
188
+ if (!short) return;
189
+ const tool = await repositoryTool(toolName);
190
+ const type = tool?.tool_call_template?.call_template_type;
191
+ if (!HTTP_PROTOCOLS.has(typeof type === 'string' ? type : '')) return;
192
+ // A tool that DECLARES a string answer may answer with markup: by the
193
+ // time the value is here the transport has decoded it, and a JSON string
194
+ // that holds a page looks exactly like a page. Only a tool that promised
195
+ // structured data is held to it.
196
+ if (declaresStringOutput(tool?.outputs)) return;
197
+ const bare = toolName.includes('.') ? toolName.slice(toolName.lastIndexOf('.') + 1) : toolName;
198
+ throw new NotJsonError(`The "${bare}" tool answered with a page, not JSON: ${short}`);
199
+ };
200
+
201
+ if (hasCallTool && (client.callTool as unknown as Record<symbol, unknown>)[GUARDED] !== true) {
202
+ const callTool = client.callTool.bind(client);
203
+ const guarded = async function guardedCallTool(toolName: string, toolArgs: Record<string, unknown>) {
204
+ const refusal = await argumentRefusal(client, toolName, toolArgs);
205
+ if (refusal) throw new ArgumentsDoNotMatchError(refusal);
206
+ const result = await callTool(toolName, toolArgs);
207
+ await guardResult(toolName, result);
208
+ return result;
209
+ };
210
+ (guarded as unknown as Record<symbol, unknown>)[GUARDED] = true;
211
+ client.callTool = guarded as typeof client.callTool;
212
+ }
213
+
214
+ if (hasStreaming && (client.callToolStreaming as unknown as Record<symbol, unknown>)[GUARDED] !== true) {
215
+ const callToolStreaming = client.callToolStreaming.bind(client);
216
+ const guardedStreaming = async function* guardedCallToolStreaming(
217
+ toolName: string,
218
+ toolArgs: Record<string, unknown>,
219
+ ): AsyncGenerator<unknown, void, unknown> {
220
+ const refusal = await argumentRefusal(client, toolName, toolArgs);
221
+ if (refusal) throw new ArgumentsDoNotMatchError(refusal);
222
+ for await (const chunk of callToolStreaming(toolName, toolArgs)) {
223
+ await guardResult(toolName, chunk);
224
+ yield chunk;
225
+ }
226
+ };
227
+ (guardedStreaming as unknown as Record<symbol, unknown>)[GUARDED] = true;
228
+ client.callToolStreaming = guardedStreaming as typeof client.callToolStreaming;
229
+ }
230
+ }
231
+
232
+ /** Does this output schema say the tool answers with a string? */
233
+ function declaresStringOutput(outputs: unknown): boolean {
234
+ if (typeof outputs !== 'object' || outputs === null) return false;
235
+ const type = (outputs as { type?: unknown }).type;
236
+ return type === 'string' || (Array.isArray(type) && type.includes('string'));
237
+ }
package/src/dispatch.ts CHANGED
@@ -3,6 +3,8 @@ import type { CodeModeUtcpClient } from '@utcp/code-mode';
3
3
  import type { CallTemplate } from '@utcp/sdk';
4
4
  import type { ProxiedTool } from './proxied-tool.js';
5
5
  import { toCallToolResult, toolError, describeToolFailure, renderProgress } from './results.js';
6
+ import { installCallGuards } from './call-guards.js';
7
+ import { installGetHasNoBody } from './get-has-no-body.js';
6
8
 
7
9
  /**
8
10
  * Register one manual on a client, reduced to a verdict.
@@ -21,6 +23,19 @@ export async function registerManual(
21
23
  client: CodeModeUtcpClient,
22
24
  manual: CallTemplate,
23
25
  ): Promise<{ ok: true } | { ok: false; error: string }> {
26
+ // A tool must be registered before it can be called, so registration is the
27
+ // one point every tool of every surface passes through — and therefore where
28
+ // the client's guards are installed. A deployment that registers manuals of
29
+ // its own gets the argument check and the GET-sends-no-body rule for its
30
+ // tools without writing a line for either. Both are idempotent.
31
+ //
32
+ // The client checks the tools with no route HERE — a connected server's, and
33
+ // an http tool that calls another service. A tool this server hosts as a
34
+ // route is checked in that route's own handler instead, so every caller gets
35
+ // the same answer and the route's answer is what comes back
36
+ // (`call-guards.ts`).
37
+ installGetHasNoBody();
38
+ installCallGuards(client);
24
39
  try {
25
40
  const result = await client.registerManual(manual);
26
41
  if (result && result.success === false) {
@@ -57,6 +72,8 @@ export async function dispatchToolCall(
57
72
  tool: ProxiedTool,
58
73
  args: Record<string, unknown>,
59
74
  onProgress?: (progress: number, message: string) => Promise<void>,
75
+ /** See {@link toCallToolResult}'s `structured`. */
76
+ options?: { structured?: boolean },
60
77
  ): Promise<CallToolResult> {
61
78
  let prev: unknown;
62
79
  let hasPrev = false;
@@ -84,5 +101,5 @@ export async function dispatchToolCall(
84
101
  return toolError(`The "${tool.mcpName}" tool produced no output: its stream ended without a result.`);
85
102
  }
86
103
 
87
- return toCallToolResult(prev);
104
+ return toCallToolResult(prev, options);
88
105
  }
@@ -0,0 +1,110 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { CommunicationProtocol } from '@utcp/sdk';
3
+
4
+ /**
5
+ * A GET tool never sends a request body — whatever it is called with, and
6
+ * whoever registered it.
7
+ *
8
+ * A UTCP http tool sends the one argument named by its template's `body_field`
9
+ * (which DEFAULTS to `body`) as the request body, for any method. So a flat GET
10
+ * tool called with its arguments wrapped in `body` — the shape the platform's
11
+ * own tools take, and the mistake an agent makes most often — sends a GET with
12
+ * a body. Services answer that with whatever their edge does: three users of
13
+ * the enterprise deployment got an HTML error page where a search result was
14
+ * expected.
15
+ *
16
+ * The fix is in the request client rather than in each tool's definition,
17
+ * because the definitions come from three places (the platform's own
18
+ * `toolDef`, a deployment's tools, and an administrator's tool manual) and a
19
+ * rule enforced in three places is a rule that holds in two. Here, the
20
+ * protocol that would send the body is handed a template whose `body_field`
21
+ * names an argument no tool declares, so there is nothing to put in the body;
22
+ * the argument itself is untouched and travels as a query parameter, exactly as
23
+ * every other argument does.
24
+ */
25
+
26
+ /**
27
+ * The `body_field` a GET template is given. Deliberately not a name any schema
28
+ * would declare: the leading `__` and the markers make it unreachable from a
29
+ * generated call example or a described interface, so no agent is ever told to
30
+ * send it. The tail is drawn once per process, so a manual cannot write the
31
+ * name into its own template and have an argument of that name sent as the
32
+ * body after all: the name it would have to guess does not exist until the
33
+ * server starts.
34
+ */
35
+ export const NO_BODY_FIELD = `__utcp_get_sends_no_body_${randomUUID().replace(/-/g, '')}__`;
36
+
37
+ /** Marks a protocol instance as already decorated, so installing twice is free. */
38
+ const GUARDED = Symbol.for('bevel.mcp-core.getHasNoBody');
39
+
40
+ interface HttpishTemplate {
41
+ http_method?: unknown;
42
+ body_field?: unknown;
43
+ }
44
+
45
+ /**
46
+ * The template a GET tool is actually called with. Returns the template
47
+ * unchanged for anything that is not an http-family GET, so a POST tool, an
48
+ * `mcp` tool and a template with no method at all all pass through untouched.
49
+ */
50
+ export function withoutBodyOnGet<T>(template: T): T {
51
+ const t = template as HttpishTemplate | null;
52
+ if (!t || typeof t !== 'object') return template;
53
+ const method = typeof t.http_method === 'string' ? t.http_method.toUpperCase() : undefined;
54
+ if (method !== 'GET') return template;
55
+ if (t.body_field === NO_BODY_FIELD) return template;
56
+ return { ...(template as object), body_field: NO_BODY_FIELD } as T;
57
+ }
58
+
59
+ type Protocol = {
60
+ callTool?: (...args: unknown[]) => unknown;
61
+ callToolStreaming?: (...args: unknown[]) => unknown;
62
+ };
63
+
64
+ /** Decorate one protocol instance in place. Returns it, decorated or already so. */
65
+ function decorate(protocol: CommunicationProtocol): CommunicationProtocol {
66
+ const p = protocol as unknown as Protocol & Record<symbol, unknown>;
67
+ if (!p || p[GUARDED] === true) return protocol;
68
+ p[GUARDED] = true;
69
+ // The template is the LAST argument of both methods (`caller, toolName,
70
+ // toolArgs, toolCallTemplate`), already variable-substituted by the client.
71
+ // Replacing it here is the last moment before the request is built, and the
72
+ // only one where every registration path has converged.
73
+ for (const name of ['callTool', 'callToolStreaming'] as const) {
74
+ const original = p[name];
75
+ if (typeof original !== 'function') continue;
76
+ p[name] = function guardedCall(this: unknown, ...args: unknown[]) {
77
+ if (args.length > 0) args[args.length - 1] = withoutBodyOnGet(args[args.length - 1]);
78
+ return original.apply(this, args);
79
+ };
80
+ }
81
+ return protocol;
82
+ }
83
+
84
+ /**
85
+ * Install the guard over every communication protocol registered in this
86
+ * process, instances and factories alike — the registry the UTCP SDK documents
87
+ * as "the right home for a registry a decorator writes into".
88
+ *
89
+ * Process-wide and idempotent, so every client built afterwards is covered
90
+ * without being told to be: the hosted proxy's per-request clients, the pooled
91
+ * downstream clients, the local server's client, and a client a deployment
92
+ * builds on top of Hexis.
93
+ */
94
+ export function installGetHasNoBody(): void {
95
+ const instances = CommunicationProtocol.communicationProtocols;
96
+ for (const type of Object.keys(instances)) {
97
+ const instance = instances[type];
98
+ if (instance) decorate(instance);
99
+ }
100
+ const factories = CommunicationProtocol.communicationProtocolFactories;
101
+ for (const type of Object.keys(factories)) {
102
+ const factory = factories[type];
103
+ if (!factory) continue;
104
+ const marked = factory as typeof factory & Record<symbol, unknown>;
105
+ if (marked[GUARDED] === true) continue;
106
+ const wrapped = (() => decorate(factory())) as typeof factory & Record<symbol, unknown>;
107
+ wrapped[GUARDED] = true;
108
+ factories[type] = wrapped;
109
+ }
110
+ }
package/src/index.ts CHANGED
@@ -40,6 +40,21 @@ export {
40
40
  schemaDefectMarker,
41
41
  } from './schema-validity.js';
42
42
 
43
+ export {
44
+ MCP_APP_UI_META_KEY,
45
+ MCP_APP_MIME_TYPE,
46
+ MCP_APP_URI_SCHEME,
47
+ type McpAppToolUi,
48
+ type McpAppResourceUi,
49
+ type McpAppResource,
50
+ type McpAppManifest,
51
+ toolUiMeta,
52
+ resourceUiMeta,
53
+ toListedResource,
54
+ toReadResourceResult,
55
+ parseMcpAppManifest,
56
+ } from './mcp-app.js';
57
+
43
58
  export {
44
59
  describeToolFailure,
45
60
  withTransportDetail,
@@ -52,6 +67,8 @@ export {
52
67
  mcpImageResult,
53
68
  isMcpImageResult,
54
69
  omitImagePayloads,
70
+ NOT_JSON_KIND,
71
+ pageInsteadOfJson,
55
72
  } from './results.js';
56
73
 
57
74
  export {
@@ -91,6 +108,27 @@ export {
91
108
 
92
109
  export { registerManual, dispatchToolCall } from './dispatch.js';
93
110
 
111
+ export {
112
+ CALL_LINE_PREFIX,
113
+ ARGUMENTS_DO_NOT_MATCH_KIND,
114
+ BODY_AT_TOP_LEVEL_LINE,
115
+ ARGS_UNDER_BODY_LINE,
116
+ callExample,
117
+ exampleArguments,
118
+ callLine,
119
+ withCallExample,
120
+ splitCallLine,
121
+ describeInterface,
122
+ argumentsDoNotMatchMessage,
123
+ compileCheck,
124
+ checkFor,
125
+ type CompiledCheck,
126
+ } from './tool-interface.js';
127
+
128
+ export { installCallGuards, argumentRefusal, ArgumentsDoNotMatchError } from './call-guards.js';
129
+
130
+ export { installGetHasNoBody, withoutBodyOnGet, NO_BODY_FIELD } from './get-has-no-body.js';
131
+
94
132
  export {
95
133
  RETIRED_TOOL_MESSAGES,
96
134
  RETIRED_TOOL_NAMES,
@@ -115,6 +153,7 @@ export {
115
153
  utcpNamespacePrefix,
116
154
  utcpNamespacedKey,
117
155
  seedBevelHostedManualVars,
156
+ isPlatformHostedUrl,
118
157
  } from './utcp-namespace.js';
119
158
 
120
159
  export {