Skip to content

v1.0.0 — typed wrapper tools and progressive disclosure

Latest

Choose a tag to compare

@rockfordlhotka rockfordlhotka released this 09 Sep 21:13
· 6 commits to main since this release
204aa28

First major release. The tool surface every client sees has changed, hence 1.0.0.

Typed wrapper tools (#39, #42)

  • Every downstream tool is exposed as a typed MCP tool named {server}__{tool} carrying the downstream input schema unchanged, so clients call it with real parameters instead of a JSON-string blob.
  • find_tools(query) searches every registered server and returns typed names and schemas.
  • WrapperMode (Lazy, the default, or Eager). Lazy activation is per session: a session starts with eight consumer tools (about 5 KB of tools/list) and grows only as it discovers tools. One client's discovery never enlarges another client's list.
  • Administrative tools (register, update, unregister, update_skill, regenerate_summary, enable, disable) are hidden in Lazy mode until a session calls show_admin_tools; they are also callable by name. enable_service / disable_service moved from consumer to administrative.
  • RegisteredServer.Id is an immutable identity, backfilled on load. Server names are validated at registration because they become wrapper-name prefixes.
  • via metric tag on tool invocations: wrapper or invoke_tool.

HTTP host

  • Default session mode is StatefulForInitializeClients (McpAggregator:Http:SessionMode): clients using the legacy initialize handshake (Claude Desktop through mcp-remote, Claude Code) get an Mcp-Session-Id session so per-session lists and list_changed work; 2026-07-28 clients stay stateless as SEP-2567 requires.

Recovery for small models

  • Unknown server, unknown tool, wrapper-name-as-toolName, missing or mistyped arguments, and invoke_tool aimed at the aggregator itself all return actionable error results with the real names or schema.
  • Runtime hints and the skill document tell a client that rejects a typed name as not found to use invoke_tool with the same arguments.

Measurement

  • tools/McpAggregator.Measure harness and results in docs/measurements/. On 8B-class models the typed surface raised first-call success from 25% / 10% / 0% to 100% / 90% / 40%; details and the Claude Desktop real-host run are in docs/typed-wrapper-tools.md.

Upgrade notes

  • Clients that expected enable_service / disable_service in the initial list must call show_admin_tools or call them by name.
  • The HTTP host no longer runs stateless by default; set McpAggregator:Http:SessionMode to Stateless to restore that.
  • Server names containing __, longer than 64 characters, or equal to the aggregator's own name are rejected at registration.

🤖 Generated with Claude Code

https://claude.ai/code/session_013Kitfap3NNo7GsNXeuxyxt