From efb3a1baa654863a8097e05313bc88605d0a64f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 17:28:48 +0000 Subject: [PATCH 1/4] chore(deps): bump rmcp from 1.8.0 to 2.1.0 Bumps [rmcp](https://github.com/modelcontextprotocol/rust-sdk) from 1.8.0 to 2.1.0. - [Release notes](https://github.com/modelcontextprotocol/rust-sdk/releases) - [Changelog](https://github.com/modelcontextprotocol/rust-sdk/blob/main/release-plz.toml) - [Commits](https://github.com/modelcontextprotocol/rust-sdk/compare/rmcp-v1.8.0...rmcp-v2.1.0) --- updated-dependencies: - dependency-name: rmcp dependency-version: 2.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab949c1..149bfb5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2036,9 +2036,9 @@ dependencies = [ [[package]] name = "rmcp" -version = "1.8.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1f571c72940a19d9532fe52dbea8bc9912bf1d766c2970bb824056b86f3f59" +checksum = "f00a32c3b81b7b254076a65abd5ab2551209146713ba38f73818657e865e9433" dependencies = [ "async-trait", "base64", @@ -2063,9 +2063,9 @@ dependencies = [ [[package]] name = "rmcp-macros" -version = "1.8.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aad0035b69380782d78ea95b508327e6deaa2235909053e596eea8f27b5e1d5" +checksum = "2ee70afb7956da9f30d5348a2539b5eb90d9038f834463657ab717076ac3b1ad" dependencies = [ "darling", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index b862ef6..df0d7fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,7 +60,7 @@ tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } # MCP SDK -rmcp = { version = "1.2.0", features = ["server", "transport-io", "schemars"] } +rmcp = { version = "2.1.0", features = ["server", "transport-io", "schemars"] } # CLI parsing clap = { version = "4.5", features = ["derive"] } From f63b1d60ced99ff055af71fa570724f4d433fdb2 Mon Sep 17 00:00:00 2001 From: Ben Brandt Date: Tue, 7 Jul 2026 13:04:41 +0200 Subject: [PATCH 2/4] fix(rmcp): Adapt to rmcp 2 content blocks --- .release-plz.toml | 3 ++- .../tests/scoped_mcp_server.rs | 4 ++-- .../tests/standalone_mcp_server.rs | 4 ++-- .../tests/test_tool_fn.rs | 2 +- .../tests/trace_client_mcp_server.rs | 2 +- .../tests/trace_mcp_tool_call.rs | 8 ++++---- src/agent-client-protocol-cookbook/src/lib.rs | 2 +- src/agent-client-protocol-rmcp/README.md | 9 +++++++++ .../examples/with_mcp_server.rs | 2 +- src/agent-client-protocol-rmcp/src/builder.rs | 2 +- .../src/bin/mcp_echo_server.rs | 2 +- 11 files changed, 25 insertions(+), 15 deletions(-) diff --git a/.release-plz.toml b/.release-plz.toml index 2b87a91..9366e19 100644 --- a/.release-plz.toml +++ b/.release-plz.toml @@ -30,9 +30,10 @@ version_group = "acp" name = "agent-client-protocol-polyfill" version_group = "acp" +# rmcp is a public dependency, so this crate's major version tracks rmcp's +# major releases independently of the rest of the workspace. [[package]] name = "agent-client-protocol-rmcp" -version_group = "acp" [[package]] name = "agent-client-protocol-conductor" diff --git a/src/agent-client-protocol-conductor/tests/scoped_mcp_server.rs b/src/agent-client-protocol-conductor/tests/scoped_mcp_server.rs index 62f9e78..f63d19b 100644 --- a/src/agent-client-protocol-conductor/tests/scoped_mcp_server.rs +++ b/src/agent-client-protocol-conductor/tests/scoped_mcp_server.rs @@ -39,7 +39,7 @@ async fn test_scoped_mcp_server_through_proxy() -> Result<(), agent_client_proto .await?; expect_test::expect![[r#" - "OK: CallToolResult { content: [Annotated { raw: Text(RawTextContent { text: \"2\", meta: None }), annotations: None }], structured_content: None, is_error: Some(false), meta: None }" + "OK: CallToolResult { content: [Text(TextContent { text: \"2\", meta: None, annotations: None })], structured_content: None, is_error: Some(false), meta: None }" "#]].assert_debug_eq(&result); Ok(()) @@ -84,7 +84,7 @@ async fn test_scoped_mcp_server_through_session() -> Result<(), agent_client_pro .await?; expect_test::expect![[r#" - "OK: CallToolResult { content: [Annotated { raw: Text(RawTextContent { text: \"2\", meta: None }), annotations: None }], structured_content: None, is_error: Some(false), meta: None }" + "OK: CallToolResult { content: [Text(TextContent { text: \"2\", meta: None, annotations: None })], structured_content: None, is_error: Some(false), meta: None }" "#]].assert_debug_eq(&result); Ok(()) diff --git a/src/agent-client-protocol-conductor/tests/standalone_mcp_server.rs b/src/agent-client-protocol-conductor/tests/standalone_mcp_server.rs index 9fff00e..4ac52c2 100644 --- a/src/agent-client-protocol-conductor/tests/standalone_mcp_server.rs +++ b/src/agent-client-protocol-conductor/tests/standalone_mcp_server.rs @@ -145,7 +145,7 @@ async fn test_standalone_server_call_echo_tool() -> Result<(), agent_client_prot let text = result .content .first() - .and_then(|c| c.raw.as_text()) + .and_then(|c| c.as_text()) .map(|t| t.text.as_str()) .expect("Expected text content"); @@ -197,7 +197,7 @@ async fn test_standalone_server_call_add_tool() -> Result<(), agent_client_proto // Structured output should have the result let content = result.content.first().expect("Expected content"); - let text = content.raw.as_text().expect("Expected text content"); + let text = content.as_text().expect("Expected text content"); assert!( text.text.contains('8') || text.text.contains("result"), "Expected result to contain 8, got: {}", diff --git a/src/agent-client-protocol-conductor/tests/test_tool_fn.rs b/src/agent-client-protocol-conductor/tests/test_tool_fn.rs index 27ae614..74ec86a 100644 --- a/src/agent-client-protocol-conductor/tests/test_tool_fn.rs +++ b/src/agent-client-protocol-conductor/tests/test_tool_fn.rs @@ -74,7 +74,7 @@ async fn test_tool_fn_greet() -> Result<(), agent_client_protocol::Error> { .await?; expect_test::expect![[r#" - "OK: CallToolResult { content: [Annotated { raw: Text(RawTextContent { text: \"\\\"Hello, World!\\\"\", meta: None }), annotations: None }], structured_content: None, is_error: Some(false), meta: None }" + "OK: CallToolResult { content: [Text(TextContent { text: \"\\\"Hello, World!\\\"\", meta: None, annotations: None })], structured_content: None, is_error: Some(false), meta: None }" "#]].assert_debug_eq(&result); Ok(()) diff --git a/src/agent-client-protocol-conductor/tests/trace_client_mcp_server.rs b/src/agent-client-protocol-conductor/tests/trace_client_mcp_server.rs index bbb9101..5b2b61d 100644 --- a/src/agent-client-protocol-conductor/tests/trace_client_mcp_server.rs +++ b/src/agent-client-protocol-conductor/tests/trace_client_mcp_server.rs @@ -478,7 +478,7 @@ async fn test_trace_client_mcp_server() -> Result<(), agent_client_protocol::Err "sessionUpdate": String("agent_message_chunk"), "content": Object { "type": String("text"), - "text": String("OK: CallToolResult { content: [Annotated { raw: Text(RawTextContent { text: \"{\\\"echoed\\\":\\\"Client echoes: Hello from client test!\\\",\\\"call_number\\\":1}\", meta: None }), annotations: None }], structured_content: Some(Object {\"echoed\": String(\"Client echoes: Hello from client test!\"), \"call_number\": Number(1)}), is_error: Some(false), meta: None }"), + "text": String("OK: CallToolResult { content: [Text(TextContent { text: \"{\\\"echoed\\\":\\\"Client echoes: Hello from client test!\\\",\\\"call_number\\\":1}\", meta: None, annotations: None })], structured_content: Some(Object {\"echoed\": String(\"Client echoes: Hello from client test!\"), \"call_number\": Number(1)}), is_error: Some(false), meta: None }"), }, "messageId": String("testy-message-end-turn-1"), }, diff --git a/src/agent-client-protocol-conductor/tests/trace_mcp_tool_call.rs b/src/agent-client-protocol-conductor/tests/trace_mcp_tool_call.rs index 116da45..dee6149 100644 --- a/src/agent-client-protocol-conductor/tests/trace_mcp_tool_call.rs +++ b/src/agent-client-protocol-conductor/tests/trace_mcp_tool_call.rs @@ -648,7 +648,7 @@ async fn test_trace_mcp_tool_call() -> Result<(), agent_client_protocol::Error> "capabilities": Object {}, "clientInfo": Object { "name": String("rmcp"), - "version": String("1.8.0"), + "version": String("2.1.0"), }, }, }, @@ -667,7 +667,7 @@ async fn test_trace_mcp_tool_call() -> Result<(), agent_client_protocol::Error> }, "serverInfo": Object { "name": String("rmcp"), - "version": String("1.8.0"), + "version": String("2.1.0"), }, "instructions": String("A simple test MCP server with an echo tool"), }, @@ -739,7 +739,7 @@ async fn test_trace_mcp_tool_call() -> Result<(), agent_client_protocol::Error> "sessionUpdate": String("agent_message_chunk"), "content": Object { "type": String("text"), - "text": String("OK: CallToolResult { content: [Annotated { raw: Text(RawTextContent { text: \"{\\\"result\\\":\\\"Echo: Hello from trace test!\\\"}\", meta: None }), annotations: None }], structured_content: Some(Object {\"result\": String(\"Echo: Hello from trace test!\")}), is_error: Some(false), meta: None }"), + "text": String("OK: CallToolResult { content: [Text(TextContent { text: \"{\\\"result\\\":\\\"Echo: Hello from trace test!\\\"}\", meta: None, annotations: None })], structured_content: Some(Object {\"result\": String(\"Echo: Hello from trace test!\")}), is_error: Some(false), meta: None }"), }, "messageId": String("testy-message-end-turn-1"), }, @@ -772,7 +772,7 @@ async fn test_trace_mcp_tool_call() -> Result<(), agent_client_protocol::Error> "sessionUpdate": String("agent_message_chunk"), "content": Object { "type": String("text"), - "text": String("OK: CallToolResult { content: [Annotated { raw: Text(RawTextContent { text: \"{\\\"result\\\":\\\"Echo: Hello from trace test!\\\"}\", meta: None }), annotations: None }], structured_content: Some(Object {\"result\": String(\"Echo: Hello from trace test!\")}), is_error: Some(false), meta: None }"), + "text": String("OK: CallToolResult { content: [Text(TextContent { text: \"{\\\"result\\\":\\\"Echo: Hello from trace test!\\\"}\", meta: None, annotations: None })], structured_content: Some(Object {\"result\": String(\"Echo: Hello from trace test!\")}), is_error: Some(false), meta: None }"), }, "messageId": String("testy-message-end-turn-1"), }, diff --git a/src/agent-client-protocol-cookbook/src/lib.rs b/src/agent-client-protocol-cookbook/src/lib.rs index d42d8f6..0206cab 100644 --- a/src/agent-client-protocol-cookbook/src/lib.rs +++ b/src/agent-client-protocol-cookbook/src/lib.rs @@ -527,7 +527,7 @@ pub mod global_mcp_server { //! impl MyMcpServer { //! #[tool(description = "Echoes back the input message")] //! async fn echo(&self, Parameters(params): Parameters) -> Result { - //! Ok(CallToolResult::success(vec![Content::text(format!("Echo: {}", params.message))])) + //! Ok(CallToolResult::success(vec![ContentBlock::text(format!("Echo: {}", params.message))])) //! } //! } //! diff --git a/src/agent-client-protocol-rmcp/README.md b/src/agent-client-protocol-rmcp/README.md index b72807a..3c7017b 100644 --- a/src/agent-client-protocol-rmcp/README.md +++ b/src/agent-client-protocol-rmcp/README.md @@ -40,6 +40,15 @@ This crate is separate from `agent-client-protocol` to avoid coupling the core p - `agent-client-protocol-rmcp` to track `rmcp` updates independently - Breaking changes in `rmcp` only require updating this crate +## Versioning + +`rmcp` is a public dependency of this crate: its types appear in the public API (e.g. `McpServerExt::from_rmcp`). Each major release of `rmcp` therefore requires a major release of this crate, independent of the other `agent-client-protocol` crates. The crate re-exports the `rmcp` version it was built against as `agent_client_protocol_rmcp::rmcp` — prefer it over a direct `rmcp` dependency to guarantee matching versions. + +| agent-client-protocol-rmcp | rmcp | +| -------------------------- | ---- | +| 2.x | 2.x | +| 1.x | 1.x | + ## Related Crates - **[agent-client-protocol](../agent-client-protocol/)** — Core ACP protocol types and traits diff --git a/src/agent-client-protocol-rmcp/examples/with_mcp_server.rs b/src/agent-client-protocol-rmcp/examples/with_mcp_server.rs index 54ffd6b..24c81e8 100644 --- a/src/agent-client-protocol-rmcp/examples/with_mcp_server.rs +++ b/src/agent-client-protocol-rmcp/examples/with_mcp_server.rs @@ -56,7 +56,7 @@ impl ExampleMcpServer { &self, Parameters(params): Parameters, ) -> Result { - Ok(CallToolResult::success(vec![Content::text(format!( + Ok(CallToolResult::success(vec![ContentBlock::text(format!( "Echo: {}", params.message ))])) diff --git a/src/agent-client-protocol-rmcp/src/builder.rs b/src/agent-client-protocol-rmcp/src/builder.rs index 47ff491..a71ece2 100644 --- a/src/agent-client-protocol-rmcp/src/builder.rs +++ b/src/agent-client-protocol-rmcp/src/builder.rs @@ -329,7 +329,7 @@ impl ServerHandler for McpServerConnection { if has_structured_output { Ok(CallToolResult::structured(result)) } else { - Ok(CallToolResult::success(vec![rmcp::model::Content::text( + Ok(CallToolResult::success(vec![rmcp::model::ContentBlock::text( result.to_string(), )])) } diff --git a/src/agent-client-protocol-test/src/bin/mcp_echo_server.rs b/src/agent-client-protocol-test/src/bin/mcp_echo_server.rs index 8f1db06..02cc404 100644 --- a/src/agent-client-protocol-test/src/bin/mcp_echo_server.rs +++ b/src/agent-client-protocol-test/src/bin/mcp_echo_server.rs @@ -41,7 +41,7 @@ impl EchoServer { &self, Parameters(params): Parameters, ) -> Result { - Ok(CallToolResult::success(vec![Content::text(format!( + Ok(CallToolResult::success(vec![ContentBlock::text(format!( "Echo: {}", params.message ))])) From 2b6cded8ff45c3113d2d57344d4b2425b52c7d54 Mon Sep 17 00:00:00 2001 From: Ben Brandt Date: Tue, 7 Jul 2026 13:09:59 +0200 Subject: [PATCH 3/4] docs(rmcp): Remove rmcp re-export guidance --- src/agent-client-protocol-rmcp/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/agent-client-protocol-rmcp/README.md b/src/agent-client-protocol-rmcp/README.md index 3c7017b..448cb7d 100644 --- a/src/agent-client-protocol-rmcp/README.md +++ b/src/agent-client-protocol-rmcp/README.md @@ -42,7 +42,7 @@ This crate is separate from `agent-client-protocol` to avoid coupling the core p ## Versioning -`rmcp` is a public dependency of this crate: its types appear in the public API (e.g. `McpServerExt::from_rmcp`). Each major release of `rmcp` therefore requires a major release of this crate, independent of the other `agent-client-protocol` crates. The crate re-exports the `rmcp` version it was built against as `agent_client_protocol_rmcp::rmcp` — prefer it over a direct `rmcp` dependency to guarantee matching versions. +`rmcp` is a public dependency of this crate: its types appear in the public API (e.g. `McpServerExt::from_rmcp`). Each major release of `rmcp` therefore requires a major release of this crate, independent of the other `agent-client-protocol` crates. | agent-client-protocol-rmcp | rmcp | | -------------------------- | ---- | From dff0cf545152b21780bd8abb20e714348a685f56 Mon Sep 17 00:00:00 2001 From: Ben Brandt Date: Tue, 7 Jul 2026 13:14:01 +0200 Subject: [PATCH 4/4] fmt --- src/agent-client-protocol-rmcp/src/builder.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/agent-client-protocol-rmcp/src/builder.rs b/src/agent-client-protocol-rmcp/src/builder.rs index a71ece2..dd2bf13 100644 --- a/src/agent-client-protocol-rmcp/src/builder.rs +++ b/src/agent-client-protocol-rmcp/src/builder.rs @@ -329,9 +329,9 @@ impl ServerHandler for McpServerConnection { if has_structured_output { Ok(CallToolResult::structured(result)) } else { - Ok(CallToolResult::success(vec![rmcp::model::ContentBlock::text( - result.to_string(), - )])) + Ok(CallToolResult::success(vec![ + rmcp::model::ContentBlock::text(result.to_string()), + ])) } } Err(error) => Err(to_rmcp_error(error)),