You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bump the workspace off rmcp = "1.7" to 2.1. This is a 1.7 → 1.8 → 2.0 → 2.1 span, so we inherit the 1.8 schema/auth hardening, the 2.0 breaking rename batch (MCP 2025-11-25 model alignment, #927), and the 2.1 meta helpers.
Good news: we hand-roll all our ServerHandler/ClientHandler impls — zero #[tool]/#[tool_router]/#[prompt_router]/#[tool_handler] usage — so the entire macro-migration surface is a non-issue. Damage is concentrated in labby (server handlers + mcp/logging) and labby-gateway (upstream/pool/relay.rs). labby-auth is behavioral-only.
Bad news: CI + just + release all run RUSTFLAGS: -D warnings and cargo clippy -- -D warnings, so every SEP-2577 deprecation is a hard build failure, not a friendly warning. The ~121 LoggingLevel references block the merge.
A2 — Elicitation type renames (#927):CreateElicitationRequestParams → ElicitRequestParams, CreateElicitationResult → ElicitResult. Method name create_elicitation is unchanged; only param/result types change. We already use the plural variant names (FormElicitationParams), which match 2.x. Sites: labby-gateway/.../relay.rs (ClientHandler::create_elicitation impl), labby/src/mcp/elicitation.rs (peer call).
A4 — ⚠️ Local name clash:labby/src/mcp/elicitation.rs defines its own pub(crate) enum ElicitResult { Confirmed, Declined, Cancelled, NotSupported, Failed } (12 refs across 2 files). rmcp 2.x now owns rmcp::model::ElicitResult. Rename ours (e.g. ConfirmOutcome) to kill the shadow.
B. Deprecations → CI failures under -D warnings (SEP-2577)
Deprecated ≠ removed. As a gateway we legitimately must keep proxying logging/sampling/roots for our upstreams while the SDK still supports them. Recommended: scoped #![allow(deprecated)] islands, not a full rip-out.
B1 — LoggingLevel (whole enum deprecated). 121 hits / 11 files. Our entire mcp/logging.rs severity model is built on it. → #![allow(deprecated)] island (or migrate to an internal severity enum, later).
B6 — PrimitiveSchema → PrimitiveSchemaDefinition (deprecated alias, 4 hits in elicitation.rs + relay.rs). One-word swap — just rename, don't allow.
C. Behavioral / non-compile (test + eyeball — no compiler safety net)
1.8 tool-schema stripping/validation (#856 remove unnecessary inputSchema fields, #860 strip+validate in/out schema). We re-expose upstream schemas via lab:search/lab:execute; emitted inputSchema shape can change. Adjacent to the old MAX_SCHEMA_BYTES truncation issue. Re-run + re-accept insta snapshots; diff advertised gateway tool schemas before/after.
1.8 tool errors for invalid arguments (#894) — error surface for bad args changed; check tests asserting old behavior.
1.8 → 2.1 protocol-version negotiation (#855, #930) + 2025-11-25 support — verify gateway↔upstream handshake. (Note: ProtocolVersion::V1 in acp/runtime.rs is Agent Client Protocol, not rmcp — leave it.)
Auth stack (labby-authupstream-oauth-rmcp) — 1.8: OAuth issuer validation (#896), DCR application_type (#883), metadata-discovery ordering (#887); 2.0: block resource spoofing (#937) + metadata SSRF (#935); 2.1: preserve refresh_token when omitted (#949) + block redirect header leaks (#936). Mostly free hardening, but issuer validation + discovery ordering can change which OAuth upstreams authenticate — smoke-test the real ones.
#[non_exhaustive] + new TaskStatusNotification / ClientHandler::on_task_status — default impl, non-breaking; only bites an exhaustive match on ServerNotification/ClientNotification without a _ arm (we don't appear to). Optionally implement on_task_status to surface upstream task progress.
Verify relocated helpers on first compile: AnnotateAble, RawResource, Annotated (used in handlers_resources.rs) — 2.x model restructure may have moved these.
D. Free wins to adopt while we're in here (new in 2.1)
SEP-414 trace context (traceparent/tracestate/baggage on _meta) — thread a trace ID through gateway hops; would make the bimodal catalog flapping (simultaneous lab:search/lab:execute drops) actually traceable end-to-end.
SEP-2575 meta helpers — read clientInfo / clientCapabilities / protocolVersion / logLevel off per-request _meta; tailor-made for stateless/multiplexed dispatch.
1.8 custom HTTP client for OAuth (#908) + preserve configured reqwest client (#917) — let labby-auth reuse one tuned client across the upstream OAuth stack.
Suggested execution order
Cargo bump + Cargo.lock regen (expect a wall of errors — fine).
A1Content → ContentBlock (unblocks most of the tree).
A2/A3/A4 elicitation renames + rename local ElicitResult; B6PrimitiveSchema in the same files.
B1–B5#![allow(deprecated)] islands on logging.rs, server.rs, relay.rs.
cargo build green → C snapshot re-accept + auth/upstream smoke tests.
Summary
Bump the workspace off
rmcp = "1.7"to2.1. This is a 1.7 → 1.8 → 2.0 → 2.1 span, so we inherit the 1.8 schema/auth hardening, the 2.0 breaking rename batch (MCP 2025-11-25 model alignment, #927), and the 2.1 meta helpers.Good news: we hand-roll all our
ServerHandler/ClientHandlerimpls — zero#[tool]/#[tool_router]/#[prompt_router]/#[tool_handler]usage — so the entire macro-migration surface is a non-issue. Damage is concentrated inlabby(server handlers +mcp/logging) andlabby-gateway(upstream/pool/relay.rs).labby-authis behavioral-only.Bad news: CI +
just+ release all runRUSTFLAGS: -D warningsandcargo clippy -- -D warnings, so every SEP-2577 deprecation is a hard build failure, not a friendly warning. The ~121LoggingLevelreferences block the merge.rmcp 1.7.0(workspace-pinned"1.7"), audited @97244c0rmcp 2.1.0(2026-07-02)Cargo bump
All enabled feature flags still exist in 2.1. Regenerate
Cargo.lock.A. Hard compile errors (won't build regardless of lints)
Contentremoved →ContentBlock.rmcp::model::Contentno longer exists (wasAnnotated<RawContent>; 2.x flattened to aContentBlockenum), no compat alias. ~34Content::text(...)calls + 5 imports across 8 files. MechanicalContent::text→ContentBlock::text, but eyeball each import line.labby-gateway/src/upstream/pool/relay.rs,.../tools_call.rslabby/src/mcp/result_format.rs,.../call_tool.rs,.../upstream.rs,.../upstream/tests.rsCreateElicitationRequestParams→ElicitRequestParams,CreateElicitationResult→ElicitResult. Method namecreate_elicitationis unchanged; only param/result types change. We already use the plural variant names (FormElicitationParams), which match 2.x. Sites:labby-gateway/.../relay.rs(ClientHandler::create_elicitationimpl),labby/src/mcp/elicitation.rs(peer call).ServerRequest::CreateElicitationRequest→ElicitRequest;ClientResult::CreateElicitationResult→ElicitResult;ServerNotification::ElicitationCompletionNotification→ElicitationCompleteNotification. (relay.rs)labby/src/mcp/elicitation.rsdefines its ownpub(crate) enum ElicitResult { Confirmed, Declined, Cancelled, NotSupported, Failed }(12 refs across 2 files). rmcp 2.x now ownsrmcp::model::ElicitResult. Rename ours (e.g.ConfirmOutcome) to kill the shadow.B. Deprecations → CI failures under
-D warnings(SEP-2577)Deprecated ≠ removed. As a gateway we legitimately must keep proxying logging/sampling/roots for our upstreams while the SDK still supports them. Recommended: scoped
#![allow(deprecated)]islands, not a full rip-out.LoggingLevel(whole enum deprecated). 121 hits / 11 files. Our entiremcp/logging.rsseverity model is built on it. →#![allow(deprecated)]island (or migrate to an internal severity enum, later).LoggingMessageNotificationParam/LoggingMessageNotification(4 hits,mcp/logging.rs)..enable_logging()server-capability builder —mcp/server.rs:138.create_message(peer) +CreateMessage*— sampling proxy inrelay.rs(5 hits).list_roots(peer) +ListRootsResult/Root— roots proxy inrelay.rs.PrimitiveSchema→PrimitiveSchemaDefinition(deprecated alias, 4 hits inelicitation.rs+relay.rs). One-word swap — just rename, don'tallow.C. Behavioral / non-compile (test + eyeball — no compiler safety net)
inputSchemafields, #860 strip+validate in/out schema). We re-expose upstream schemas vialab:search/lab:execute; emittedinputSchemashape can change. Adjacent to the oldMAX_SCHEMA_BYTEStruncation issue. Re-run + re-acceptinstasnapshots; diff advertised gateway tool schemas before/after.ProtocolVersion::V1inacp/runtime.rsis Agent Client Protocol, not rmcp — leave it.)labby-authupstream-oauth-rmcp) — 1.8: OAuth issuer validation (#896), DCRapplication_type(#883), metadata-discovery ordering (#887); 2.0: block resource spoofing (#937) + metadata SSRF (#935); 2.1: preserverefresh_tokenwhen omitted (#949) + block redirect header leaks (#936). Mostly free hardening, but issuer validation + discovery ordering can change which OAuth upstreams authenticate — smoke-test the real ones.#[non_exhaustive]+ newTaskStatusNotification/ClientHandler::on_task_status— default impl, non-breaking; only bites an exhaustive match onServerNotification/ClientNotificationwithout a_arm (we don't appear to). Optionally implementon_task_statusto surface upstream task progress.AnnotateAble,RawResource,Annotated(used inhandlers_resources.rs) — 2.x model restructure may have moved these.D. Free wins to adopt while we're in here (new in 2.1)
traceparent/tracestate/baggageon_meta) — thread a trace ID through gateway hops; would make the bimodal catalog flapping (simultaneouslab:search/lab:executedrops) actually traceable end-to-end.clientInfo/clientCapabilities/protocolVersion/logLeveloff per-request_meta; tailor-made for stateless/multiplexed dispatch.reqwestclient (#917) — letlabby-authreuse one tuned client across the upstream OAuth stack.Suggested execution order
Cargo.lockregen (expect a wall of errors — fine).Content→ContentBlock(unblocks most of the tree).ElicitResult; B6PrimitiveSchemain the same files.#![allow(deprecated)]islands onlogging.rs,server.rs,relay.rs.cargo buildgreen → C snapshot re-accept + auth/upstream smoke tests.Files touched (~20)
References
Audited against
97244c0(workspace v0.30.0).