Uh oh!
There was an error while loading. Please reload this page.
docs(spec): tool.json's parameters note records the post-#13317 reality - #13359
Conversation
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 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KX8wnyjStaZcuMyAMNsy3N
📓 Docs Drift Check
What this run could not see
Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 33298382178 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Queue-failure disposition (PR owner seat, session
Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#13345
What was stale
packages/spec/liveness/tool.json's_noteon theparametersentry asserted, in substance, thatregisterToolFromDefinitionregistered every bridged tool with noinputSchema— "so this key never reaches an MCP client" — citing that as the asymmetry withname/description, and pointing at #13271 as evidence.#13271 is now closed, by the PR that made that sentence false: PR #13317 (
e29fc212, merged 2026-08-30T04:42:09Z) convertsAIToolDefinition.parametersthrough zod@4'sfromJSONSchemaand forwards it as the SDKinputSchema— the SDK converts it straight back to JSON Schema fortools/list, so the key now reaches MCP clients too.What changed
Only the
parametersentry's_notesentence. Grade unchanged —parameterswaslivebefore this PR and stayslive; the cloud LLM path (vercel-adapter.ts#buildVercelOptions) has read it all along and is what the verdict has always rested on. This closes an asymmetry between two consumers, not a liveness-status change. No other entry, no ledger mechanism, touched.The replacement wording keeps the nuance the original note called out: the pre-#13317 behaviour was not "no schema" — the SDK synthesised
EMPTY_OBJECT_JSON_SCHEMA({"type":"object","properties":{}}) for a schema-less registration, a positive claim that the tool takes no arguments, which is a stronger misstatement than silence would have been.Evidence now points at the current implementation with real anchors:
packages/mcp/src/mcp-server-runtime.ts#toolInputSchema(L223-242, thefromJSONSchemaconversion) and#registerToolFromDefinition(L998, theinputSchema: toolInputSchema(tool, logger)forward at L1005).Note text — before
Note text — after
Changeset
Followed the #13275 / #13309 precedent for ledger-note-only fixes:
liveness/is in@objectstack/spec'sfilesarray, so these ledgers ship in the npm tarball and are published data — apatchchangeset is owed even though nothing schema/runtime/authoring-facing moved..changeset/tool-liveness-parameters-note-post-13317.md.Tests
node -e "JSON.parse(...)"ontool.json— parses.pnpm --filter @objectstack/spec run check:liveness— green:✓ every governed-type property ... classified ... every 'live' / 'planned' / 'experimental' entry's repo-local evidence path resolves ...(exit 0).pnpm --filter @objectstack/spec run check:empty-state/check:strictness-ledger/check:variant-docs— green.dispatch-gates.mjs-derived local family for this diff — every matched gate run and green:check:nul-bytes,check:merge-driver,check:page-declaration-shape,check:slot-lookup,check:test-source-alias,check:type-source-resolution,check:published-files,check:comment-mask-adoption,check-dev-prereqs.mjs --self-test(the CI-run form; lint.yml runs--self-testonly per the script's own docblock),check-plugin-teardown-shape.mjs,check-undeclared-dep-imports.mjs,check-keyed-text-bounds.mjs,check-empty-changeset.mjs,check-changeset-no-major.mjs,check-adr-0087-registration.mjs,check:changeset-gate-self-tests,check:pm-half-states,check:objectui-changeset,docs-audit/check-affected-docs.mjs,docs-audit/check-drift-comment.mjs.check:dual-build-cjs-loads(requires a fullpnpm buildof all 78 workspace packages; matched only via thepackages/**CI job path filter, and this diff touches no code or build artifact — left to CI's "Build Core" job, per the local-verification-scope rule that whole-farm scans are CI's territory).HEAD at push:
378e7cb8.Generated by Claude Code