From 88fbf9a7b4142f23cad4f1cd3ba39d67493fb476 Mon Sep 17 00:00:00 2001 From: Tee8z Date: Tue, 10 Nov 2026 13:44:17 -0500 Subject: [PATCH 1/3] fix(deps): update MCP SDK to the patched transport release Signed-off-by: Tee8z --- Cargo.lock | 54 ++++++-------------------- Cargo.toml | 2 +- crates/buzz-agent/Cargo.toml | 2 +- crates/buzz-agent/src/mcp.rs | 19 ++++----- crates/buzz-agent/tests/regressions.rs | 4 +- crates/buzz-dev-mcp/Cargo.toml | 2 +- deny.toml | 5 +++ 7 files changed, 32 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b7e7e325c85..5978fbb3777 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1535,7 +1535,7 @@ dependencies = [ "nix 0.31.3", "rcgen", "reqwest 0.13.4", - "rmcp 1.8.0", + "rmcp", "serde", "serde_json", "serde_yaml", @@ -1785,7 +1785,7 @@ dependencies = [ "nix 0.31.3", "nostr 0.44.7", "reqwest 0.13.4", - "rmcp 3.4.1", + "rmcp", "rustls", "schemars 1.2.1", "serde", @@ -6354,7 +6354,7 @@ dependencies = [ "rand 0.10.1", "regex-lite", "reqwest 0.13.4", - "rmcp 3.4.1", + "rmcp", "rpassword", "rustls", "same-file", @@ -6466,7 +6466,7 @@ dependencies = [ "prost 0.14.3", "prost-build 0.14.3", "protoc-bin-vendored", - "rmcp 3.4.1", + "rmcp", "schemars 1.2.1", "serde", "serde_json", @@ -8504,20 +8504,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "process-wrap" -version = "9.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e842efad9119158434d193c6682e2ebee4b44d6ad801d7b349623b3f57cdf55" -dependencies = [ - "futures", - "indexmap 2.14.0", - "nix 0.31.3", - "tokio", - "tracing", - "windows 0.62.2", -] - [[package]] name = "process-wrap" version = "10.0.1" @@ -9445,29 +9431,9 @@ dependencies = [ [[package]] name = "rmcp" -version = "1.8.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1f571c72940a19d9532fe52dbea8bc9912bf1d766c2970bb824056b86f3f59" -dependencies = [ - "async-trait", - "chrono", - "futures", - "pin-project-lite", - "process-wrap 9.1.0", - "serde", - "serde_json", - "thiserror 2.0.18", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", -] - -[[package]] -name = "rmcp" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6317cd8c13e3ec9033cf2aa5aa92cd743f0f4f8a93cddc42ea0ae6ce3b8898" +checksum = "d24a7e92f4bcaa36b97fa93c4fa7ca8f3e669eced949345b3462dba333c7f909" dependencies = [ "async-trait", "base64 0.23.1", @@ -9478,15 +9444,17 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "indexmap 2.14.0", + "libc", "pastey", "pin-project-lite", - "process-wrap 10.0.1", + "process-wrap", "rand 0.10.1", "reqwest 0.13.4", "rmcp-macros", "schemars 1.2.1", "serde", "serde_json", + "sha2 0.11.0", "sse-stream", "thiserror 2.0.18", "tokio", @@ -9499,9 +9467,9 @@ dependencies = [ [[package]] name = "rmcp-macros" -version = "3.4.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ee366004e5f87c103be91c6c09337811517ae8d2f919ece9da7c21444b85c5" +checksum = "b3140f24a766f80f9ec1607bde85680959a69b83d46fa9ce87dadab7e67ab029" dependencies = [ "darling 0.24.1", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 90fbc6d96ff..2c3e17be495 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -142,7 +142,7 @@ url = "2" proptest = "1" # MCP SDK (used by buzz-dev-mcp and buzz-agent) -rmcp = { version = "1.1.0", features = ["server", "transport-io", "macros"] } +rmcp = { version = "3.9.0", features = ["server", "transport-io", "macros"] } schemars = { version = "1", default-features = false } # Internal crates diff --git a/crates/buzz-agent/Cargo.toml b/crates/buzz-agent/Cargo.toml index 91a024a38b3..5f71200d6ac 100644 --- a/crates/buzz-agent/Cargo.toml +++ b/crates/buzz-agent/Cargo.toml @@ -48,7 +48,7 @@ serde = { workspace = true } serde_json = { workspace = true } serde_yaml = { workspace = true } reqwest = { workspace = true, features = ["json", "rustls", "form"] } -rmcp = { version = "1", default-features = false, features = ["client", "transport-child-process"] } +rmcp = { version = "3.9.0", default-features = false, features = ["client", "transport-child-process"] } arc-swap = "1" getrandom = "0.4" tracing = { workspace = true } diff --git a/crates/buzz-agent/src/mcp.rs b/crates/buzz-agent/src/mcp.rs index cb6cb704093..5538fcf1254 100644 --- a/crates/buzz-agent/src/mcp.rs +++ b/crates/buzz-agent/src/mcp.rs @@ -956,11 +956,11 @@ pub(crate) fn truncate_middle(s: &str, max: usize) -> String { /// with a marker; text is middle-elided so the head (what ran) and tail /// (how it ended) both survive. Every elision leaves an inline marker. fn tool_result_content( - blocks: &[rmcp::model::Content], + blocks: &[rmcp::model::ContentBlock], max_bytes: usize, max_text_bytes: usize, ) -> Vec { - use rmcp::model::RawContent; + use rmcp::model::ContentBlock; let mut out = Vec::new(); let mut text = String::new(); let mut used = 0usize; // total bytes emitted (text + images) @@ -994,9 +994,9 @@ fn tool_result_content( }; for c in blocks { - match &c.raw { - RawContent::Text(t) => append(&mut text, &t.text), - RawContent::Image(i) => { + match c { + ContentBlock::Text(t) => append(&mut text, &t.text), + ContentBlock::Image(i) => { flush_text(&mut out, &mut text, &mut used, &mut text_used); let image_bytes = i.data.len().saturating_add(i.mime_type.len()); if used.saturating_add(image_bytes) <= max_bytes { @@ -1016,7 +1016,7 @@ fn tool_result_content( ); } } - RawContent::Audio(a) => append( + ContentBlock::Audio(a) => append( &mut text, &format!( "[audio elided: {}, {} bytes]", @@ -1024,10 +1024,11 @@ fn tool_result_content( a.data.len() ), ), - RawContent::ResourceLink(r) => { + ContentBlock::ResourceLink(r) => { append(&mut text, &format!("[resource: {}]", short(&r.uri))); } - RawContent::Resource(_) => append(&mut text, "[resource elided]"), + ContentBlock::Resource(_) => append(&mut text, "[resource elided]"), + _ => append(&mut text, "[unsupported content elided]"), } } flush_text(&mut out, &mut text, &mut used, &mut text_used); @@ -1090,7 +1091,7 @@ mod content_tests { ); } } - use rmcp::model::Content; + use rmcp::model::ContentBlock as Content; #[cfg(windows)] #[test] diff --git a/crates/buzz-agent/tests/regressions.rs b/crates/buzz-agent/tests/regressions.rs index 5d488d0dff9..3b25aa1ef26 100644 --- a/crates/buzz-agent/tests/regressions.rs +++ b/crates/buzz-agent/tests/regressions.rs @@ -183,7 +183,9 @@ async fn tool_metadata_caps_enforced() { "args": [], "env": [ { "name": "FAKE_MCP_TOOL_COUNT", "value": "200" }, - { "name": "FAKE_MCP_HUGE_DESC", "value": "1" }, + // Stay below rmcp's 16 MiB stdio frame bound so this + // fixture reaches Buzz's tool-count and metadata guards. + { "name": "FAKE_MCP_DESC_SIZE", "value": "10000" }, ], }], }), diff --git a/crates/buzz-dev-mcp/Cargo.toml b/crates/buzz-dev-mcp/Cargo.toml index 5b3d7a9c9d9..ab33b92255e 100644 --- a/crates/buzz-dev-mcp/Cargo.toml +++ b/crates/buzz-dev-mcp/Cargo.toml @@ -22,7 +22,7 @@ serde = { workspace = true } serde_json = { workspace = true } # Discovery-based clients (including Goose 1.52) require the modern lifecycle. # Keep the native agent's independent MCP client dependency unchanged. -rmcp = { version = "3.4.1", features = ["server", "transport-io", "macros"] } +rmcp = { version = "3.9.0", features = ["server", "transport-io", "macros"] } schemars = { workspace = true } similar = "3" tempfile = "3" diff --git a/deny.toml b/deny.toml index 6655e3c6847..b7d8b1ca866 100644 --- a/deny.toml +++ b/deny.toml @@ -38,6 +38,11 @@ ignore = [ { id = "RUSTSEC-2026-0368", reason = "zip 8.6.0 via buzz-mesh-smoke → mesh-llm v0.76.2; manual entry copy, never extracts; fix in unreleased mesh-llm#2471" }, { id = "RUSTSEC-2026-0369", reason = "zip 8.6.0 via buzz-mesh-smoke → mesh-llm v0.76.2; manual entry copy, never extracts; fix in unreleased mesh-llm#2471" }, { id = "RUSTSEC-2026-0429", reason = "zip 8.6.0 via buzz-mesh-smoke → mesh-llm v0.76.2; manual entry copy, never extracts; fix in unreleased mesh-llm#2471" }, + # libsqlite3-sys 0.38.2 via dev-only buzz-mesh-smoke → mesh-llm v0.76.2 + # → rusqlite 0.40.2. The parent stack cannot yet select the patched 0.39 + # release. Temporary exception accepted by the maintainer; remove when + # mesh-llm updates its SQLite stack. + { id = "RUSTSEC-2026-0459", reason = "dev-only mesh-llm SQLite stack has no upstream-compatible fix yet; maintainer accepted temporary exception" }, # zbus 5 D-Bus crates (zvariant, zbus_names, zvariant_derive) — unmaintained, # not vulnerable. Only path: buzz-mesh-smoke → mesh-llm → keyring 4 → # zbus-secret-service-keyring-store / secret-service 5 → zbus 5. From ea6e9b49478f32674a2588ae5993a15ca5a58d2e Mon Sep 17 00:00:00 2001 From: Tee8z Date: Tue, 10 Nov 2026 13:53:30 -0500 Subject: [PATCH 2/3] build(desktop): synchronize the patched MCP dependency lock Signed-off-by: Tee8z --- desktop/src-tauri/Cargo.lock | 84 ++++++++++++++---------------------- 1 file changed, 33 insertions(+), 51 deletions(-) diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock index ce4661988e1..a0ab11a92b3 100644 --- a/desktop/src-tauri/Cargo.lock +++ b/desktop/src-tauri/Cargo.lock @@ -220,7 +220,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -231,7 +231,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1062,7 +1062,7 @@ dependencies = [ "hex", "nix 0.31.3", "reqwest 0.13.4", - "rmcp 1.8.0", + "rmcp", "serde", "serde_json", "serde_yaml", @@ -1721,7 +1721,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -2401,7 +2401,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.118", ] [[package]] @@ -2577,7 +2577,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2843,7 +2843,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3371,7 +3371,7 @@ dependencies = [ "libc", "log", "rustversion", - "windows-link 0.1.3", + "windows-link 0.2.1", "windows-result 0.4.1", ] @@ -5515,7 +5515,7 @@ dependencies = [ "rand 0.10.2", "regex-lite", "reqwest 0.13.4", - "rmcp 3.2.0", + "rmcp", "rpassword", "rustls", "same-file", @@ -5627,7 +5627,7 @@ dependencies = [ "prost 0.14.4", "prost-build 0.14.4", "protoc-bin-vendored", - "rmcp 3.2.0", + "rmcp", "schemars 1.2.1", "serde", "serde_json", @@ -5897,7 +5897,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "536bfad37a309d62069485248eeaba1e8d9853aaf951caaeaed0585a95346f08" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6060,7 +6060,7 @@ dependencies = [ "png", "serde", "thiserror 2.0.18", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6556,7 +6556,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -7271,7 +7271,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.45.0", + "windows-sys 0.61.2", ] [[package]] @@ -7996,9 +7996,9 @@ dependencies = [ [[package]] name = "process-wrap" -version = "9.1.0" +version = "10.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e842efad9119158434d193c6682e2ebee4b44d6ad801d7b349623b3f57cdf55" +checksum = "1f21b97672d2dc848e7b25701ab4535618b92f4861c13cc3f7f7bed52ad3c8da" dependencies = [ "futures", "indexmap 2.14.0", @@ -8315,7 +8315,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -8836,29 +8836,9 @@ dependencies = [ [[package]] name = "rmcp" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1f571c72940a19d9532fe52dbea8bc9912bf1d766c2970bb824056b86f3f59" -dependencies = [ - "async-trait", - "chrono", - "futures", - "pin-project-lite", - "process-wrap", - "serde", - "serde_json", - "thiserror 2.0.18", - "tokio", - "tokio-stream", - "tokio-util", - "tracing", -] - -[[package]] -name = "rmcp" -version = "3.2.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42b6914fac0be956fe704a38239c3f44a9f841d1b06a5713d2f638065593f5b5" +checksum = "d24a7e92f4bcaa36b97fa93c4fa7ca8f3e669eced949345b3462dba333c7f909" dependencies = [ "async-trait", "base64 0.23.1", @@ -8869,6 +8849,7 @@ dependencies = [ "http-body", "http-body-util", "indexmap 2.14.0", + "libc", "pastey", "pin-project-lite", "process-wrap", @@ -8878,6 +8859,7 @@ dependencies = [ "schemars 1.2.1", "serde", "serde_json", + "sha2 0.11.0", "sse-stream", "thiserror 2.0.18", "tokio", @@ -8890,9 +8872,9 @@ dependencies = [ [[package]] name = "rmcp-macros" -version = "3.2.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf1c49bd4d52014b94db0877410db273c2008f01628b0252a2e9460ad9b7fda" +checksum = "b3140f24a766f80f9ec1607bde85680959a69b83d46fa9ce87dadab7e67ab029" dependencies = [ "darling 0.24.1", "proc-macro2", @@ -9069,7 +9051,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -9139,7 +9121,7 @@ dependencies = [ "security-framework 3.7.0", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -9438,7 +9420,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b55fb86dfd3a2f5f76ea78310a88f96c4ea21a3031f8d212443d56123fd0521" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -10100,7 +10082,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -11147,7 +11129,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -11169,7 +11151,7 @@ dependencies = [ "parking_lot", "rustix", "signal-hook 0.3.18", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -11877,7 +11859,7 @@ dependencies = [ "png", "serde", "thiserror 2.0.18", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -11978,7 +11960,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -12768,7 +12750,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -12804,7 +12786,7 @@ dependencies = [ "objc2-foundation", "objc2-quartz-core", "raw-window-handle", - "windows-sys 0.60.2", + "windows-sys 0.61.2", "windows-version", ] From 18b0395cfe05d2a01e472b035c9da20b1a47ee3e Mon Sep 17 00:00:00 2001 From: Tee8z Date: Tue, 10 Nov 2026 14:41:09 -0500 Subject: [PATCH 3/3] build(security): apply accepted SQLite exception to mesh policies Signed-off-by: Tee8z --- deny-desktop.toml | 4 ++++ deny-mesh.toml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/deny-desktop.toml b/deny-desktop.toml index e66a246abd9..786a795ef54 100644 --- a/deny-desktop.toml +++ b/deny-desktop.toml @@ -5,6 +5,10 @@ all-features = true [advisories] ignore = [ + # The mesh-llm log-store still requires rusqlite 0.40 / libsqlite3-sys + # 0.38.2. The maintainer accepted this SQLite exception until the upstream + # dependency can use the patched 0.39 series; remove on that upgrade. + { id = "RUSTSEC-2026-0459", reason = "upstream mesh-llm SQLite stack has no compatible fix yet; maintainer accepted temporary exception" }, # zip 8.6.0 < 9: extraction keeps setuid/setgid bits (0367), creates # symlinks that escape the destination (0368) and applies permissions through # symlinks (0369). Only path: the optional mesh-llm feature → mesh-llm v0.76.2 diff --git a/deny-mesh.toml b/deny-mesh.toml index 8b29b96e8fa..773eaadf09d 100644 --- a/deny-mesh.toml +++ b/deny-mesh.toml @@ -1,6 +1,10 @@ # Mesh-LLM smoke harness only. Desktop and runtime crates use deny.toml. [advisories] ignore = [ + # The mesh-llm log-store still requires rusqlite 0.40 / libsqlite3-sys + # 0.38.2. The maintainer accepted this SQLite exception until the upstream + # dependency can use the patched 0.39 series; remove on that upgrade. + { id = "RUSTSEC-2026-0459", reason = "upstream mesh-llm SQLite stack has no compatible fix yet; maintainer accepted temporary exception" }, # 0.26.11 contains no roots: it re-exports webpki-roots 1.x. Both lockfiles # resolve that parent to 1.0.10, which removes the distrusted emSign root. # The advisory also flags this compatibility wrapper. The bans below keep