Skip to content

Commit ececf7a

Browse files
docs(spec): tool.json's parameters note records the post-#13317 reality (#13359)
The `_note` on ToolSchema's `parameters` entry asserted that registerToolFromDefinition registered every bridged tool with NO inputSchema -- "so this key never reaches an MCP client" -- and cited that as the asymmetry with `name` / `description` (filed as #13271). PR #13317 (e29fc21, merged 2026-08-30T04:42:09Z) fixed exactly that: mcp-server-runtime.ts#toolInputSchema now converts `parameters` through zod@4's fromJSONSchema and registerToolFromDefinition forwards the result as the SDK inputSchema, which the SDK converts straight back to JSON Schema for tools/list -- the key reaches MCP clients too. The note is corrected to record the fix while keeping the sharper nuance the original note called out: the pre-fix behaviour was not "no schema" but the SDK synthesising EMPTY_OBJECT_JSON_SCHEMA (`{"type":"object","properties":{}}`) for a schema-less registration -- a positive claim that the tool takes no arguments, not silence. The grade does not move: `parameters` was live before this change and stays live -- the cloud LLM path (vercel-adapter.ts#buildVercelOptions) has read it all along, and that is what the verdict has always rested on. This closes an asymmetry between two consumers, not a change in liveness status. Fixes #13345 Claude-Session: https://claude.ai/code/session_01KX8wnyjStaZcuMyAMNsy3N Co-authored-by: Claude <noreply@anthropic.com>
1 parent e3c61c0 commit ececf7a

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
liveness ledger: `tool.json`'s `parameters` note now records the post-#13317 reality (#13345)
6+
7+
The `_note` on `ToolSchema`'s `parameters` entry asserted, in substance, that
8+
`registerToolFromDefinition` registered every bridged tool with **no**
9+
`inputSchema` — "so this key never reaches an MCP client" — and cited that as
10+
the asymmetry with `name` / `description` (filed as #13271). PR #13317
11+
(`e29fc212`, merged 2026-08-30T04:42:09Z) fixed exactly that: `parameters` is
12+
now converted through zod@4's `fromJSONSchema`
13+
(`packages/mcp/src/mcp-server-runtime.ts#toolInputSchema`) and forwarded as
14+
the SDK `inputSchema`
15+
(`registerToolFromDefinition`), so the key reaches `tools/list` too. The old
16+
sentence was stale and, left as-is, would have mis-described the current
17+
framework MCP bridge.
18+
19+
The note is corrected to record the fix and keep a sharper nuance than "no
20+
schema" ever captured: the pre-fix behaviour was the SDK synthesising
21+
`EMPTY_OBJECT_JSON_SCHEMA` (`{"type":"object","properties":{}}`) for a
22+
schema-less registration — a positive claim that the tool takes no arguments,
23+
not silence.
24+
25+
The grade does not move: `parameters` was `live` before this change and stays
26+
`live` — the cloud LLM path (`vercel-adapter.ts#buildVercelOptions`) has read
27+
it all along, and that's what the verdict has always rested on. This closes an
28+
asymmetry between two consumers, not a change in liveness status.
29+
30+
Data-only: no schema, no runtime, no authoring surface changes. `liveness/` is
31+
in this package's `files` array, so this ledger ships in the npm tarball and
32+
this is published data.

packages/spec/liveness/tool.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"verifiedAt": "2026-08-29",
3232
"evidenceScope": "cross-repo",
3333
"evidence": "cloud @15f55df: packages/service-ai/src/adapters/vercel-adapter.ts#buildVercelOptions wraps it with the SDK jsonSchema helper and passes it as the tool's inputSchema, which is what constrains the arguments the model may emit",
34-
"note": "LLM function schema. Re-closed 2026-08-29 against cloud @15f55df. ⚠ Deliberately NOT co-cited to the framework MCP bridge, and the asymmetry with `name` / `description` is the finding: registerToolFromDefinition registers each bridged tool with NO inputSchema, and the annotations it does pass carry only destructiveHint / readOnlyHint / openWorldHint — so this key never reaches an MCP client, while its own docblock claims the JSON Schema is passed as annotations metadata. Filed as #13271. The verdict rests on the cloud LLM path alone, where it is unambiguously live."
34+
"note": "LLM function schema. Re-closed 2026-08-29 against cloud @15f55df. The verdict itself never moved — this row was `live` throughout on the cloud LLM path alone (vercel-adapter.ts#buildVercelOptions), which is what the asymmetry below was measured against. ⚠ 2026-08-30 (#13345): the asymmetry this note used to record — registerToolFromDefinition registered each bridged tool with NO inputSchema, so this key reached the cloud LLM but not an MCP client, contradicting its own docblock — is CLOSED, by #13317 (`e29fc212`, merged 2026-08-30T04:42:09Z, filed as #13271). `packages/mcp/src/mcp-server-runtime.ts#toolInputSchema` (L223-242) now converts `AIToolDefinition.parameters` through zod@4's `fromJSONSchema`, and `registerToolFromDefinition` (L998) forwards the result as the SDK `inputSchema` (L1005), which the SDK converts straight back to JSON Schema for `tools/list` — the key reaches MCP clients too, now on both consumers. The pre-fix behaviour was NOT silence, and the replaced wording overstated it as such: a schema-less registration made the SDK synthesise `EMPTY_OBJECT_JSON_SCHEMA` (`{\"type\":\"object\",\"properties\":{}}`) — a positive claim that the tool takes NO arguments, sharper than an absent key would have been. #13317 closes the asymmetry, not the grade."
3535
},
3636
"objectName": {
3737
"status": "live",

0 commit comments

Comments
 (0)