Skip to content

chore(deps): bump rmcp to 3.4.0 and dirs to 7.0.0 - #111

Merged
abnegate merged 3 commits into
mainfrom
migrate/rmcp
Oct 7, 2026
Merged

abnegate merged 3 commits into
mainfrom
migrate/rmcp

Conversation

@abnegate

@abnegate abnegate commented Oct 5, 2026

Copy link
Copy Markdown
Owner

Stacked on #110 (migrate/sanitize). Until that PR merges, GitHub shows its commits here too. The only commit that belongs to this PR is chore(deps): bump rmcp to 3.4.0 and dirs to 7.0.0.

Summary

abnegate-agent 0.1.x, which zone moves onto in a later slice, requires rmcp = "^3.4". Bumping the MCP SDK here keeps that later PR to the crate swap itself. No zone production code changes: every rmcp API zone uses has the same shape in 3.4.0. The one source change is a new test in zone_core::mcp::client::tests that pins how a server-cancelled call now ends (see Behaviour differences).

before after notes
rmcp (workspace, exact pin) =3.2.0 =3.4.0 features unchanged: zone_core keeps client + transport-child-process (and server, macros, schemars, transport-async-rw for its tests); zone_server uses only the model types. rmcp-macros is locked at 3.4.0 to match rmcp, not 3.5.0.
process-wrap (via rmcp) 9.1.0 10.0.1 rmcp 3.3.0's own requirement. rmcp's TokioChildProcess source is identical between 3.2.0 and 3.4.0.
dirs (workspace; zone_context, zone_core, zone_installer) =6.0.0 =7.0.0 zone_core now takes the workspace pin instead of its own copy. abnegate-secret, abnegate-config and aiusg already pulled 7.0.0, so zone's own crates no longer build a second dirs. (hf-hub via fastembed, and tauri/wry/tray-icon via zone_desktop, still pull 6.0.0.)

dirs 7.0.0's only change is preference_dir on Windows (Local → Roaming AppData). zone calls only home_dir and cache_dir, so this is a no-op.

rmcp 3.4.0 is pinned exactly, as the spec for this slice says. 3.4.1 and 3.5.0 are also published; abnegate-agent's ^3.4 accepts any of them.

No environment variables or config files change.

Behaviour differences

From rmcp's CHANGELOG for 3.3.0 and 3.4.0, limited to what zone exercises (a stdio client in zone_core::mcp, model types in zone_server::mcp). The HTTP transport, SSE and OAuth fixes in those releases sit behind features zone does not enable.

MCP client (zone_core::mcp::McpSession)

  • Peer cancellation is routed by lifecycle (rust-sdk#1262). Under 3.2.0, a notifications/cancelled from a stdio server naming one of zone's in-flight requests (for example a tools/call) failed that request at once with Cancelled. Under 3.4.0 the client honours a server's cancellation only for subscription requests on the modern lifecycle, which zone never sends. Otherwise a cancellation only stops a server-to-client request zone is handling (zone's client handles none), so it has no effect. The server still answers or errors the call itself; zone just no longer gives up on the server's say-so. During shutdown, a reply zone's client handler would send to a server request that was already cancelled is now dropped rather than sent. Each tools/call is still bounded by ToolContext::command_timeout (default 300 s, zone_core/src/mcp/tool.rs:90); a server that cancels and never answers now produces a timeout error after that period instead of an immediate Cancelled error. The new test pins this.
  • The first request a server sends before initialisation completes is now run in the normal service loop instead of being lost (#1263).
  • Handshake, tools/list and tools/call are unchanged on the wire: the negotiated protocol versions (LATEST = 2025-11-25, same known list) and the request/response types zone builds and reads (CallToolRequestParams, CallToolResult, ContentBlock, Tool, ErrorData, ErrorCode, ProtocolVersion) are the same.

Zone's MCP endpoint (zone_server::mcp)

  • No change. It uses rmcp only for model types, whose serialisation is unchanged; 3.4.0's model.rs diff only adds ServerConfig/ClientConfig (aliases of InitializeResult/InitializeRequestParams), deprecates the ServerInfo/ClientInfo aliases (zone uses neither) and adds ProtocolVersion::known_up_to.

Build

  • rmcp's #[tool_router] macro now rejects an empty router at compile time (#1233). zone's only router (the Echo test server in zone_core::mcp::client::tests) has a tool.

Verification

Run from runner/ in this branch's worktree; every compile line showed this worktree's path.

  • cargo clippy -p zone_core -p zone_server --all-targets --no-default-features --features zone_context/test-utils -- -D warnings: PASS (zone_core re-run with the new test: PASS).
  • New test mcp::client::tests::a_call_the_server_cancels_and_never_answers_times_out: a raw in-process server answers initialize and tools/list, then answers tools/call only with notifications/cancelled for that request. With command_timeout: 1 the call ends in MCP tool 'silent_hang' timed out after 1 seconds, well inside a 30 s outer deadline. PASS on 3.4.0 (cargo nextest run -p zone_core --no-default-features --lib -E 'test(/mcp::/)', 33/33). It FAILS with the lock set back to rmcp 3.2.0, where the call ended at once with MCP tool call failed: task cancelled for reason abandoned.
  • cargo check --workspace --exclude zone_desktop --all-targets --no-default-features --features zone_context/test-utils: PASS.
  • cargo fmt --all --check: clean. cargo metadata --locked: the committed lock resolves unchanged.
  • Against a throwaway Postgres (pg16, tmpfs, port ≠ 5432) with migrations applied: cargo nextest run -p zone_core -p zone_server -E 'test(/mcp/) | binary(mcp_task_tools_tests) | binary(mcp_agent_tests) | binary(chat_agent_tools_tests)': PASS, 78/78. That covers every zone_core::mcp test (33, including the in-process rmcp client/server round trip, the stdio handshake timeouts and the proxy environment test), every zone_server::mcp unit test (endpoint, protocol, turn, agent tools), mcp_task_tools_tests and chat_agent_tools_tests.
  • cargo deny --locked check --warn unmaintained --warn notice: PASS (advisories ok, bans ok, licenses ok, sources ok). No new advisory or licence from rmcp 3.4.0, rmcp-macros 3.4.0 or process-wrap 10.0.1.

Not verified locally: mcp_agent_tests::the_host_agent_connects_to_zone_and_is_shown_zones_tools is #[ignore] (it needs the host's claude CLI and spends a model turn), so it was skipped. It exercises zone's own endpoint, which uses no rmcp code path that changed. Also not run: the full workspace nextest run, sqlx-prepare.sh --check and the coverage gate. CI covers these.

🤖 Generated with Claude Code

abnegate and others added 3 commits October 5, 2026 16:50
zone_core kept its own copy of the terminal-control stripper that
abnegate-secret 0.1.3 already publishes as sanitize and sanitize_owned,
with the same redaction pass behind it. Two copies drift, and the
published one has since closed gaps the local one still had: invisible
formatting characters (zero-width, bidirectional overrides, tag
characters) let a credential split by a zero-width space reach the
transcript unredacted, two-byte escapes outside 0x40-0x5F and escapes
with intermediate bytes such as ESC ( B left their tails behind, and
the ESC X start-of-string leaked its payload.

ToolResult and zone_notify now call the crate directly. zone_notify
used zone_core for nothing else, so that dependency goes too. The new
ToolResult tests pin each output change, and a read_file test pins the
cost: file content reaches the model through ToolResult, so variation
selectors and zero-width joiners and non-joiners are dropped from what
it reads, though not from the file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clippy 1.98 flags Routing as a large enum: the Chat variant's Route
makes every Routing at least 856 bytes, 216 more than the next largest
variant, and clippy -D warnings fails zone_server on main. Boxing the
route keeps the enum near the media variants' size; it is built once
per turn, so the allocation costs nothing that matters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
abnegate-agent 0.1.x requires rmcp ^3.4, so moving to it later would
otherwise drag an MCP SDK bump into an already large migration. Bumping
now keeps that PR to the crate swap itself. rmcp 3.3 and 3.4 add
ServerConfig/ClientConfig and negotiate_initialize, route peer
cancellation by lifecycle and tighten HTTP transport validation; none of
zone's call sites change and the negotiated protocol versions are the
same.

Routing cancellation by lifecycle means a stdio server's
notifications/cancelled no longer fails zone's in-flight tools/call at
once. The call is then bounded only by ToolContext::command_timeout, so
a test now pins that a server which cancels and never answers ends in
the timeout error rather than hanging. It fails against rmcp 3.2.0,
where the call ended at once with the server's cancellation.

dirs 7.0.0 only changes preference_dir on Windows, which zone never
calls; the abnegate crates already pull 7.0.0, so zone_core now takes the
workspace pin instead of repeating the version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 21 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository: abnegate/zone/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: fb7d4a55-2c51-4870-9967-fdd22d43639a
📥 Commits

Reviewing files that changed from the base of the PR and between 1338e95 and a3a861d.

⛔ Files ignored due to path filters (1)
  • runner/Cargo.lock is excluded by !**/*.lock, !**/Cargo.lock, !**/*.lock
📒 Files selected for processing (12)
  • runner/Cargo.toml
  • runner/zone_core/Cargo.toml
  • runner/zone_core/src/mcp/client.rs
  • runner/zone_core/src/tools/file.rs
  • runner/zone_core/src/tools/mod.rs
  • runner/zone_core/src/tools/sanitize.rs
  • runner/zone_notify/Cargo.toml
  • runner/zone_notify/src/backend/email.rs
  • runner/zone_notify/src/backend/webhook.rs
  • runner/zone_notify/src/lib.rs
  • runner/zone_notify/src/notification.rs
  • runner/zone_server/src/ws/chat.rs
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@abnegate
abnegate merged commit d54c141 into main Oct 7, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant