Skip to content

Two rmcp tests fail on Windows: connection-refused text check and npm spawn in test_with_js #1364

Open

Description

@RafalOfficial

Describe the bug
I ran rmcp's tests on Windows (CI only runs Linux). Two tests fail there. Both problems are in the tests; the SDK code behaves correctly.

  1. transport::auth::tests::default_http_client_preserves_connection_failure_cause (lib, --all-features) checks for the English text connection refused. Windows describes a refused connection differently, so the assertion fails although the error chain is correct:

    unexpected discovery error: Metadata error: OAuth metadata discovery failed for http://127.0.0.1:34350/mcp
      Caused by: error sending request for url (http://127.0.0.1:34350/mcp)
      Caused by: client error (Connect)
      Caused by: tcp connect error
      Caused by: No connection could be made because the target machine actively refused it. (os error 10061)
    
  2. All three test_with_js tests (no-local feature set) fail with Error: program not found. install_js_dependencies runs Command::new("npm"), but on Windows npm is the shim npm.cmd, and Command doesn't resolve a bare name to a .cmd file. (node is node.exe, so the other spawns work.)

To Reproduce
On Windows 11 with rustc 1.96 (the version rust-toolchain.toml pins), Node 24 and uv:

  1. cargo test -p rmcp --all-features --lib default_http_client_preserves_connection_failure_cause
  2. cargo test -p rmcp --features "<all rmcp features except local, as in CI>" --test test_with_js

Expected behavior
Both pass, as they do on Linux.

Proposed fix (test-only, 8 lines added, 3 removed)

  • auth test: before the request, connect to the same dropped address with std::net::TcpStream::connect(addr), and assert that the reason contains that error's to_string(). That way the test expects whatever text the OS uses, instead of a hard-coded English phrase.
  • test_with_js: let npm = if cfg!(windows) { "npm.cmd" } else { "npm" };. Another option is to dogfood rmcp::transport::which_command("npm"), but then which-command has to be added to the test's required-features.

Patch: main...RafalOfficial:rust-sdk:fix/windows-test-portability. With it, both tests pass on Windows. These all pass unchanged on Windows: the other 606 lib tests, test_with_python, test_stdio_response_concurrency, test_close_connection and test_async_rw_max_line_length. The patch is formatted with cargo +nightly fmt. If you're happy with this, I can open the PR. If you don't want Windows-only test fixes while CI is Linux-only, just close this.

Additional context
Main at 8d226f4. This report and the proposed patch were written with Claude Code (AI-assisted). I ran the commands above on a real Windows machine.

Activity

  1. added
    bugSomething is not working
    P2Medium: important but non-blocking improvement
    T-testTesting related changes
    ready for workIssue is well-defined and ready to be picked up
    on Oct 15, 2026
  2. github-actions commented on Oct 15, 2026

    @github-actions
    Contributor

    @bolinfest is on triage rotation this week and is the reviewer for this one.

    Codex labeled this bug / P2 (T-test). Please confirm or correct those labels.

    Automated triage. Labels are a first pass and the assigned maintainer has the final say.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

P2Medium: important but non-blocking improvementT-testTesting related changesbugSomething is not workingready for workIssue is well-defined and ready to be picked up

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions