Repository navigation
Description
What problem are you trying to solve?
Landing pins bub-mcp==0.3.0. Every later release changes how remote MCP tools reach the model, so the pin cannot move as a routine bump:
- bub-mcp 0.3.1 adds
MCPSettings.deferred_tools: bool = Trueand passesdeferred=self.settings.deferred_toolswhen it builds a remote tool. - bub-mcp 0.3.2 and 0.4.0 keep that default. 0.4.0 also renames
MCPChanneltoMCPManager(leavingMCPChannel = MCPManager), changesbind_agentto takeBubAgent, drops the channel lifecycle in favor ofprovide_tools/provide_lifespan, and adds its ownmcplist tool.
Bub 0.6.1's BubAgent.prepare_tools keeps deferred tools out of the direct tool list, lists them in a <deferred_tools> prompt section, and exposes tool.describe as the only way to load one. In Landing that means a configured server's mcp_<server>_<tool> is no longer callable directly.
Reproduced on a branch that pins bub-mcp==0.4.0 (bub 0.6.1): uv run python -m pytest tests/test_mcp.py fails with bub.errors.BubError: [tool] Unknown tool name: mcp_evidence_record. after the model calls the tool name it uses today, and uv run ty check reports src/landing/mcp.py:54 passing Agent where bub-mcp 0.4.0 declares BubAgent. The rest of the suite is untested past that first failure.
Adopting the newer bub-mcp therefore changes released MCP behavior in docs/reference/configuration.md: tools stop appearing in the model's tool list and the model has to discover them through tool.describe. AGENTS.md asks for released public behavior to be preserved unless a change is authorized, which is why #77 bumps Bub alone and leaves bub-mcp at 0.3.0.
What would a useful result look like?
A maintainer decision on which MCP behavior Landing should ship, and then the matching dependency bump:
- Keep direct MCP tools: pin
bub-mcpat a release withdeferred_toolsdisabled for Landing's channel, or set the bub-mcp setting tofalsefrom Landing's configuration. Acceptance: an MCP tool from a configured server is callable by name without a discovery step, andtests/test_mcp.pypasses on the newer bub-mcp. - Adopt deferred MCP tools: bump to
bub-mcp==0.4.0, importMCPManager, passBubAgenttobind_agent, and cover the discovery flow in the mode prompts anddocs/reference/configuration.md. Acceptance: a task can list and load a remote MCP tool through the supported tooling, and the MCP tests exercise that path instead of a direct call.
Either way the pin should move only after the corresponding behavior is covered, so the next uv lock --upgrade does not silently change MCP behavior.
Additional context
Evidence comes from the dependency maintenance run that produced #76 (lockfile refresh) and #77 (Bub 0.6.1). No Dependabot or code-scanning alert is open for this repository, so nothing forces the bub-mcp bump; this is a policy decision rather than a security fix.
Activity
PsiACE commentedon Nov 10, 2026
/landing fix use bub-mcp==0.4.0 to fix this issue
github-actions commentedon Nov 10, 2026
Repair is in #79: Landing ships
bub-mcp==0.4.0with deferred MCP tools, the second option #78 offered.MCPManagerandBubAgentreplaceMCPChannelandAgentinlanding.mcp.connected_tools;tests/test_mcp.pynow loads each server tool withtool_describebefore calling it.Runtime.create_agentreplaces the agent's prompt sections, which also dropped the SDK's<deferred_tools>list, so the model sawtool_describewith no tool names to pass it.src/landing/prompts.pyrenders that list itself; a probe of the first model request showed- mcp_evidence_recordunder<deferred_tools>after the change.allowed_tools/excluded_toolsstill filter before loading, so an excluded server tool is neither listed nor loadable. Nativemcp.deferred_tools: falsekeeps the previous direct-tool behavior; a probe with that setting recorded a direct call.docs/reference/configuration.mdanddocs/guides/mcp.mddescribe loading on demand and the setting.Checks: 136 tests pass (
uv run python -m pytest),uv run ty check,uv run pre-commit run --all-files, andmake docs-test. Dropping the load step from one MCP test makes it fail with no receipt, so the suite depends on loading rather than a direct call. Candidate CI started at run 42778159225.