Found while fixing #9544 (the symbol-claim half of the same README). Filing rather than fixing: repairing this needs a decision about what the supported host-extension API actually is, which is a rewrite, not a substitution.
The finding
packages/mcp/README.md tells the reader to extend the server imperatively:
| Line | Claim |
|---|
| 180 | kernel.getService('mcp').registerTool(calculateRevenueTool); |
| 200 | kernel.getService('mcp').registerResource({ … }) |
| 236 | kernel.getService('mcp').registerPrompt({ … }) |
| 453 | kernel.getService('mcp').registerResource({ … }) |
| 487 | kernel.getService('mcp').registerTool({ … }) |
| 521 | kernel.getService('mcp').registerTool({ … }) |
The 'mcp' service is an MCPServerRuntime (registered by MCPServerPlugin.init via ctx.registerService('mcp', this.runtime)). Measured against the built packages/mcp/dist/index.d.ts, its instance members are:
mcpServer, config, transport, started, server, isStarted, bridgeTools,
bridgeDataTools, registerToolFromDefinition, isReadOnlyTool, isDestructiveTool,
bridgeResources, bridgePrompts, start, stop, renderSkill, handleHttpRequest
There is no registerTool, no registerResource, no registerPrompt. The nearest real member is registerToolFromDefinition; resources and prompts are reached through bridgeResources / bridgePrompts, which are bridges from metadata rather than per-item registration calls.
Why the gate did not catch it
The published-README export gate (#9532, PR #9546) has two halves: an import half, and a member half that checks X.method where X is a name the file imported. Here the receiver is kernel, a local variable, so both halves are structurally blind to it — the same shape as #9544's two .configure rows, one step further out of reach. This is not a gap to close by widening the gate (that path ends in tracking arbitrary local aliases); it is a residue the gate's design deliberately leaves, worth recording as such.
Why it is not folded into #9544
#9544's surface is symbol claims the gate reports, and each of those had a mechanically correct answer pinned by the built types. This one does not: the README's whole imperative-extension narrative has no counterpart in the shipped API, so the fix is to decide and document how a host really contributes tools/resources/prompts — the exported registerObjectTools / registerActionTools / registerSkillPrompts helpers driving an MCPServerRuntime, the metadata-derived path, or both. That is the same kind of work as #9532's rewrite half.
Refs: #9544 · #9532 · #9545
Found while fixing #9544 (the symbol-claim half of the same README). Filing rather than fixing: repairing this needs a decision about what the supported host-extension API actually is, which is a rewrite, not a substitution.
The finding
packages/mcp/README.mdtells the reader to extend the server imperatively:kernel.getService('mcp').registerTool(calculateRevenueTool);kernel.getService('mcp').registerResource({ … })kernel.getService('mcp').registerPrompt({ … })kernel.getService('mcp').registerResource({ … })kernel.getService('mcp').registerTool({ … })kernel.getService('mcp').registerTool({ … })The
'mcp'service is anMCPServerRuntime(registered byMCPServerPlugin.initviactx.registerService('mcp', this.runtime)). Measured against the builtpackages/mcp/dist/index.d.ts, its instance members are:There is no
registerTool, noregisterResource, noregisterPrompt. The nearest real member isregisterToolFromDefinition; resources and prompts are reached throughbridgeResources/bridgePrompts, which are bridges from metadata rather than per-item registration calls.Why the gate did not catch it
The published-README export gate (#9532, PR #9546) has two halves: an import half, and a member half that checks
X.methodwhereXis a name the file imported. Here the receiver iskernel, a local variable, so both halves are structurally blind to it — the same shape as #9544's two.configurerows, one step further out of reach. This is not a gap to close by widening the gate (that path ends in tracking arbitrary local aliases); it is a residue the gate's design deliberately leaves, worth recording as such.Why it is not folded into #9544
#9544's surface is symbol claims the gate reports, and each of those had a mechanically correct answer pinned by the built types. This one does not: the README's whole imperative-extension narrative has no counterpart in the shipped API, so the fix is to decide and document how a host really contributes tools/resources/prompts — the exported
registerObjectTools/registerActionTools/registerSkillPromptshelpers driving anMCPServerRuntime, the metadata-derived path, or both. That is the same kind of work as #9532's rewrite half.Refs: #9544 · #9532 · #9545