{"slug": "goose-implements-deferred-mcp-tool-schema-loading", "title": "Goose Implements Deferred MCP Tool Schema Loading", "summary": "Goose merged PR #13378, adding an opt-in deferred loading strategy for Model Context Protocol (MCP) tool schemas: when GOOSE_TOOL_DEFERRAL=lookup is set, Goose lists MCP tool names in the system prompt instead of their schemas, and the model must call enable_tools with exact names to make those schemas available on the next response. The default remains eager loading, and selected tools can stay eager via the comma-separated GOOSE_TOOL_DEFERRAL_ALWAYS_LOAD list; enable_tools validates names against model-visible MCP tools and fails the whole request if any name is unknown or app-only. The PR notes that test and clippy commands were run on an earlier implementation but not rerun after the final global-settings and eager-override revision, and it establishes no measured token savings or performance gain.", "body_md": "Goose has integrated a new mechanism for handling Model Context Protocol (MCP) tools, targeting how their schemas are presented to the model. The implementation, detailed in [Goose PR #13378](https://github.com/aaif-goose/goose/pull/13378), adds a deferred loading strategy. This story concerns the merged Goose code change; it does not establish a separate tagged product release or a change to the MCP protocol itself.\n\nBy default, Goose keeps its existing eager behavior, where tool schemas are provided to the model. Deferral is opt-in. When `GOOSE_TOOL_DEFERRAL=lookup` is set, Goose lists available MCP tool names in the system prompt rather than providing their schemas immediately. The model can call `enable_tools` with exact tool names; the selected schemas become available on the next response. [The merged implementation](https://raw.githubusercontent.com/aaif-goose/goose/c94a2abef71b7382a9710b8d7c338b007ddaadf3/crates/goose/src/agents/state_machine/ops_toolcalling.rs) validates those names against model-visible MCP tools. If any requested name is unknown or app-only, the enable request fails as a whole. Lookup is the only implemented strategy; the PR does not add search or wildcard matching.\n\nFor builders, this creates an explicit selection step between seeing a tool’s name and seeing its schema. That can matter when designing an agent workflow: a tool not enabled is not among the schemas the model can use for its next response. But this is a change in schema availability, not a new authorization layer. Calling `enable_tools` does not execute a tool or grant permission to run it. The enable call uses Goose’s existing permissions, hooks and result-recording path, and a later tool execution still requires ordinary permissions. Knowing how to call a tool and being allowed to call it remain separate conditions.\n\nThe configuration also permits selected MCP tools to remain eager through `GOOSE_TOOL_DEFERRAL_ALWAYS_LOAD`, a comma-separated list of exact model-visible names. Entries may include extension prefixes; surrounding whitespace is trimmed. These exceptions matter only with deferral enabled and do not bypass availability or visibility checks. Platform tools stay eager, while code mode keeps its own catalog. If the setting is unset, the existing eager behavior remains; the new workflow does not silently become the default.\n\nEnabled names are recovered from successful, paired enable-tool requests and responses in conversation history. The [lifecycle test](https://raw.githubusercontent.com/aaif-goose/goose/c94a2abef71b7382a9710b8d7c338b007ddaadf3/crates/goose/src/agents/state_machine/tests/tool_lifecycle.rs) exercises enabling, reconstruction and compaction, then checks that `/clear` removes the enabled state. The PR includes an eager-override test scenario that verifies an always-loaded MCP tool can execute, another MCP tool remains deferred, and an app-only tool remains hidden. For an agent that resumes from history, the enable state follows persisted conversation results; clearing that history requires the model to enable a tool again if it is needed.\n\nThere is a specific validation caveat. The PR notes that test and clippy commands were run on an earlier implementation, but were not rerun after the final global-settings and eager-override revision. Formatting and diff checks did pass after those changes. The final revision therefore lacks those post-change test and clippy reruns. No measured token savings, performance gain, adoption or broad rollout is established by the PR, and none is needed to describe the implementation.\n\nThe practical significance is narrow but consequential for workflow design: Goose can make schema exposure an explicit, exact-name step while leaving permission enforcement where it was. Builders evaluating the change should keep those two layers distinct and account for the extra selection step, rather than treating deferred schemas as either an execution capability or evidence of a measured efficiency improvement.", "url": "https://wpnews.pro/news/goose-implements-deferred-mcp-tool-schema-loading", "canonical_source": "https://forkast.news/goose-implements-deferred-mcp-tool-schema-loading/", "published_at": "2026-11-10 08:08:19+00:00", "updated_at": "2026-11-10 08:22:13.916212+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "ai-tools", "developer-tools"], "entities": ["Goose", "Model Context Protocol", "aaif-goose", "GOOSE_TOOL_DEFERRAL", "GOOSE_TOOL_DEFERRAL_ALWAYS_LOAD", "enable_tools"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/goose-implements-deferred-mcp-tool-schema-loading", "markdown": "https://wpnews.pro/news/goose-implements-deferred-mcp-tool-schema-loading.md", "text": "https://wpnews.pro/news/goose-implements-deferred-mcp-tool-schema-loading.txt", "jsonld": "https://wpnews.pro/news/goose-implements-deferred-mcp-tool-schema-loading.jsonld"}}