diff --git a/.release-plz.toml b/.release-plz.toml index 2b87a91f..9366e19c 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/Cargo.lock b/Cargo.lock index ab949c13..149bfb5f 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 b862ef69..df0d7fd9 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"] } 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 62f9e78d..f63d19b4 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 9fff00e0..4ac52c2c 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 27ae6149..74ec86a7 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 bbb91017..5b2b61d6 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 116da457..dee61492 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 d42d8f66..0206cab7 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 b72807a6..448cb7d7 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. + +| 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 54ffd6b8..24c81e89 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 47ff491e..dd2bf13d 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::Content::text( - result.to_string(), - )])) + Ok(CallToolResult::success(vec![ + rmcp::model::ContentBlock::text(result.to_string()), + ])) } } Err(error) => Err(to_rmcp_error(error)), 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 8f1db067..02cc404e 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 ))]))