From f5257260bb12814c47b6d8ce82c4811be4815035 Mon Sep 17 00:00:00 2001 From: Ralf Anton Beier Date: Thu, 9 Oct 2025 07:35:50 +0200 Subject: [PATCH 1/4] chore: bump version to 0.12.0 for MCP 2025-06-18 release Update all workspace crates from 0.11.0 to 0.12.0 to reflect breaking changes in the MCP 2025-06-18 specification update. --- Cargo.lock | 28 +++++++++++------------ Cargo.toml | 26 ++++++++++----------- examples/hello-world-with-auth/Cargo.toml | 6 ++--- mcp-security-middleware/Cargo.toml | 14 ++++++------ 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e69dd1..ee01a42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "hello-world-with-auth" -version = "0.10.0" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -2297,7 +2297,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-auth" -version = "0.11.0" +version = "0.12.0" dependencies = [ "aes-gcm", "anyhow", @@ -2336,7 +2336,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-cli" -version = "0.11.0" +version = "0.12.0" dependencies = [ "clap", "pulseengine-mcp-cli-derive", @@ -2355,7 +2355,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-cli-derive" -version = "0.11.0" +version = "0.12.0" dependencies = [ "async-trait", "clap", @@ -2373,7 +2373,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-external-validation" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "arbitrary", @@ -2411,7 +2411,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-integration-tests" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "assert_matches", @@ -2439,7 +2439,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-logging" -version = "0.11.0" +version = "0.12.0" dependencies = [ "chrono", "hex", @@ -2458,7 +2458,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-macros" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -2484,7 +2484,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-monitoring" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "chrono", @@ -2504,7 +2504,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-protocol" -version = "0.11.0" +version = "0.12.0" dependencies = [ "async-trait", "chrono", @@ -2521,7 +2521,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-security" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -2543,7 +2543,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-security-middleware" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "assert_matches", @@ -2575,7 +2575,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-server" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "async-trait", @@ -2603,7 +2603,7 @@ dependencies = [ [[package]] name = "pulseengine-mcp-transport" -version = "0.11.0" +version = "0.12.0" dependencies = [ "anyhow", "async-stream", diff --git a/Cargo.toml b/Cargo.toml index 8ad23f6..bc5d2a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.11.0" +version = "0.12.0" rust-version = "1.88" edition = "2024" license = "MIT OR Apache-2.0" @@ -108,18 +108,18 @@ assert_matches = "1.5" serde_yaml = "0.9" # Framework internal dependencies (published versions) -pulseengine-mcp-protocol = { version = "0.11.0", path = "mcp-protocol" } -pulseengine-mcp-logging = { version = "0.11.0", path = "mcp-logging" } -pulseengine-mcp-auth = { version = "0.11.0", path = "mcp-auth" } -pulseengine-mcp-security = { version = "0.11.0", path = "mcp-security" } -pulseengine-mcp-security-middleware = { version = "0.11.0", path = "mcp-security-middleware" } -pulseengine-mcp-monitoring = { version = "0.11.0", path = "mcp-monitoring" } -pulseengine-mcp-transport = { version = "0.11.0", path = "mcp-transport" } -pulseengine-mcp-cli = { version = "0.11.0", path = "mcp-cli" } -pulseengine-mcp-cli-derive = { version = "0.11.0", path = "mcp-cli-derive" } -pulseengine-mcp-server = { version = "0.11.0", path = "mcp-server" } -pulseengine-mcp-macros = { version = "0.11.0", path = "mcp-macros" } -pulseengine-mcp-external-validation = { version = "0.11.0", path = "mcp-external-validation" } +pulseengine-mcp-protocol = { version = "0.12.0", path = "mcp-protocol" } +pulseengine-mcp-logging = { version = "0.12.0", path = "mcp-logging" } +pulseengine-mcp-auth = { version = "0.12.0", path = "mcp-auth" } +pulseengine-mcp-security = { version = "0.12.0", path = "mcp-security" } +pulseengine-mcp-security-middleware = { version = "0.12.0", path = "mcp-security-middleware" } +pulseengine-mcp-monitoring = { version = "0.12.0", path = "mcp-monitoring" } +pulseengine-mcp-transport = { version = "0.12.0", path = "mcp-transport" } +pulseengine-mcp-cli = { version = "0.12.0", path = "mcp-cli" } +pulseengine-mcp-cli-derive = { version = "0.12.0", path = "mcp-cli-derive" } +pulseengine-mcp-server = { version = "0.12.0", path = "mcp-server" } +pulseengine-mcp-macros = { version = "0.12.0", path = "mcp-macros" } +pulseengine-mcp-external-validation = { version = "0.12.0", path = "mcp-external-validation" } [profile.release] opt-level = "s" diff --git a/examples/hello-world-with-auth/Cargo.toml b/examples/hello-world-with-auth/Cargo.toml index 2b696b8..3877e61 100644 --- a/examples/hello-world-with-auth/Cargo.toml +++ b/examples/hello-world-with-auth/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "hello-world-with-auth" -version = "0.10.0" -rust-version = "1.88" -edition = "2024" +version.workspace = true +rust-version.workspace = true +edition.workspace = true publish = false [dependencies] diff --git a/mcp-security-middleware/Cargo.toml b/mcp-security-middleware/Cargo.toml index de8fe3f..0a3907e 100644 --- a/mcp-security-middleware/Cargo.toml +++ b/mcp-security-middleware/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "pulseengine-mcp-security-middleware" -version = "0.11.0" -rust-version = "1.88" -edition = "2024" -license = "MIT OR Apache-2.0" -authors = ["PulseEngine Contributors"] -repository = "https://github.com/pulseengine/mcp" -homepage = "https://github.com/pulseengine/mcp" +version.workspace = true +rust-version.workspace = true +edition.workspace = true +license.workspace = true +authors.workspace = true +repository.workspace = true +homepage.workspace = true documentation = "https://docs.rs/pulseengine-mcp-security-middleware" keywords = ["mcp", "security", "middleware", "authentication", "framework"] categories = ["api-bindings", "development-tools", "asynchronous", "web-programming"] From 988872ecb5e3889f5c0aae01584eedb347e753c8 Mon Sep 17 00:00:00 2001 From: Ralf Anton Beier Date: Fri, 10 Oct 2025 06:40:05 +0200 Subject: [PATCH 2/4] fix(test): ignore flaky env variable test in security-middleware The test_env_security_with_invalid_profile test has a race condition when running in parallel with other tests that modify MCP_SECURITY_PROFILE. Mark it as ignored until we can add the serial_test crate to properly handle env variable isolation. --- mcp-security-middleware/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/mcp-security-middleware/src/lib.rs b/mcp-security-middleware/src/lib.rs index 7781863..cfc7c5b 100644 --- a/mcp-security-middleware/src/lib.rs +++ b/mcp-security-middleware/src/lib.rs @@ -173,6 +173,7 @@ mod tests { } #[test] + #[ignore] // TODO: Fix race condition with parallel tests - use serial_test crate fn test_env_security_with_invalid_profile() { use std::env; From 1c855c104fffd9bcf08e2db1dfdbd771c6fe10d3 Mon Sep 17 00:00:00 2001 From: Ralf Anton Beier Date: Fri, 10 Oct 2025 06:52:38 +0200 Subject: [PATCH 3/4] fix(test): properly serialize env variable tests with serial_test crate Add serial_test dependency and mark all tests that modify environment variables with #[serial_test::serial] to prevent race conditions when tests run in parallel. Fixed tests: - test_env_security_with_invalid_profile - test_env_security_with_valid_profiles - test_env_config_loading This resolves the flaky test failure in CI by ensuring these tests run one at a time instead of being ignored. --- Cargo.lock | 41 +++++++++++++++++++++++++++ mcp-security-middleware/Cargo.toml | 1 + mcp-security-middleware/src/config.rs | 1 + mcp-security-middleware/src/lib.rs | 3 +- 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index ee01a42..2c9585c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2561,6 +2561,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", + "serial_test", "sha2", "tempfile", "thiserror 2.0.12", @@ -3024,6 +3025,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "scc" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" +dependencies = [ + "sdd", +] + [[package]] name = "schannel" version = "0.1.27" @@ -3099,6 +3109,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sdd" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" + [[package]] name = "security-framework" version = "2.11.1" @@ -3209,6 +3225,31 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "serial_test" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "sha1" version = "0.10.6" diff --git a/mcp-security-middleware/Cargo.toml b/mcp-security-middleware/Cargo.toml index 0a3907e..0a839e3 100644 --- a/mcp-security-middleware/Cargo.toml +++ b/mcp-security-middleware/Cargo.toml @@ -61,6 +61,7 @@ pulseengine-mcp-protocol = { workspace = true } tempfile = { workspace = true } assert_matches = { workspace = true } tokio-test = "0.4" +serial_test = "3.0" [features] default = ["auto-config"] diff --git a/mcp-security-middleware/src/config.rs b/mcp-security-middleware/src/config.rs index 47a62be..8b3db65 100644 --- a/mcp-security-middleware/src/config.rs +++ b/mcp-security-middleware/src/config.rs @@ -473,6 +473,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_env_config_loading() { unsafe { env::set_var("MCP_SECURITY_PROFILE", "development"); diff --git a/mcp-security-middleware/src/lib.rs b/mcp-security-middleware/src/lib.rs index cfc7c5b..380b635 100644 --- a/mcp-security-middleware/src/lib.rs +++ b/mcp-security-middleware/src/lib.rs @@ -173,7 +173,7 @@ mod tests { } #[test] - #[ignore] // TODO: Fix race condition with parallel tests - use serial_test crate + #[serial_test::serial] fn test_env_security_with_invalid_profile() { use std::env; @@ -192,6 +192,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_env_security_with_valid_profiles() { use std::env; From 6863130d9a6a062bb95e61cf1d99aa970ea7029a Mon Sep 17 00:00:00 2001 From: Ralf Anton Beier Date: Fri, 10 Oct 2025 06:58:09 +0200 Subject: [PATCH 4/4] fix(test): add serial_test to all env variable tests across workspace Systematically address potential race conditions in all tests that modify environment variables by adding serial_test dependency and marking tests with #[serial_test::serial]. Changes: - mcp-security-middleware: 3 tests marked serial - mcp-cli-derive: 1 test marked serial - mcp-cli: 4 tests marked serial This prevents flaky test failures in CI when tests run in parallel and modify the same or overlapping environment variables. Tests using unique env var names per test (like in mcp-auth) don't need serialization as they don't conflict with each other. --- Cargo.lock | 2 ++ mcp-cli-derive/Cargo.toml | 1 + mcp-cli-derive/tests/test_mcp_config.rs | 1 + mcp-cli/Cargo.toml | 1 + mcp-cli/src/config_tests.rs | 4 ++++ 5 files changed, 9 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 2c9585c..2cb7ead 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2344,6 +2344,7 @@ dependencies = [ "pulseengine-mcp-protocol", "serde", "serde_json", + "serial_test", "tempfile", "thiserror 2.0.12", "tokio-test", @@ -2365,6 +2366,7 @@ dependencies = [ "pulseengine-mcp-server", "quote", "serde", + "serial_test", "syn 2.0.104", "thiserror 2.0.12", "tokio", diff --git a/mcp-cli-derive/Cargo.toml b/mcp-cli-derive/Cargo.toml index 46b84f3..f772362 100644 --- a/mcp-cli-derive/Cargo.toml +++ b/mcp-cli-derive/Cargo.toml @@ -33,3 +33,4 @@ clap = { version = "4.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] } tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } thiserror = { workspace = true } +serial_test = "3.0" diff --git a/mcp-cli-derive/tests/test_mcp_config.rs b/mcp-cli-derive/tests/test_mcp_config.rs index f2a8253..c9db8be 100644 --- a/mcp-cli-derive/tests/test_mcp_config.rs +++ b/mcp-cli-derive/tests/test_mcp_config.rs @@ -358,6 +358,7 @@ mod integration_tests { /// Test environment variable support #[test] + #[serial_test::serial] fn test_env_var_support() { use std::env; diff --git a/mcp-cli/Cargo.toml b/mcp-cli/Cargo.toml index 2569f99..69f2273 100644 --- a/mcp-cli/Cargo.toml +++ b/mcp-cli/Cargo.toml @@ -40,3 +40,4 @@ derive = ["pulseengine-mcp-cli-derive"] [dev-dependencies] tokio-test = "0.4" tempfile = "3.0" +serial_test = "3.0" diff --git a/mcp-cli/src/config_tests.rs b/mcp-cli/src/config_tests.rs index 8168be1..52c3041 100644 --- a/mcp-cli/src/config_tests.rs +++ b/mcp-cli/src/config_tests.rs @@ -147,6 +147,7 @@ fn test_env_utils_get_env_or_default() { } #[test] +#[serial_test::serial] fn test_env_utils_with_set_env_var() { use env_utils::*; @@ -183,6 +184,7 @@ fn test_env_utils_get_required_env_missing() { } #[test] +#[serial_test::serial] fn test_env_utils_get_required_env_present() { use env_utils::*; @@ -204,6 +206,7 @@ fn test_env_utils_get_required_env_present() { } #[test] +#[serial_test::serial] fn test_env_utils_get_required_env_invalid_type() { use env_utils::*; @@ -231,6 +234,7 @@ fn test_env_utils_get_required_env_invalid_type() { } #[test] +#[serial_test::serial] fn test_env_utils_get_required_env_valid_type() { use env_utils::*;