From cfda5891198cdf6296b7cd79b78c0d08b0ef922b Mon Sep 17 00:00:00 2001 From: olaservo Date: Wed, 19 Aug 2026 18:03:57 -0700 Subject: [PATCH] Update the tests README for Ruby server coverage The README still said the Ruby weather server was uncovered and described the resultType gap as unfixable from an example. Both stopped being true when the server test landed. Also move the no-API-key comment below the Ruby server test. It describes the client tests, and sat where it read as describing the server one. Co-Authored-By: Claude Opus 5 --- tests/README.md | 4 +--- tests/smoke-test.sh | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/README.md b/tests/README.md index 2f0fa39..3d7b602 100644 --- a/tests/README.md +++ b/tests/README.md @@ -6,13 +6,11 @@ This directory contains smoke tests for the MCP quickstart examples. These tests The smoke tests verify: -- **Servers**: Each weather server (Python, TypeScript, Rust, Go) can start, respond to MCP protocol requests, and honour the output schemas it advertises +- **Servers**: Each weather server (Python, TypeScript, Rust, Go, Ruby) can start, respond to MCP protocol requests, and honour the output schemas it advertises - **Clients**: The Python, TypeScript and Ruby MCP clients can connect to a mock server and list tools The Go and Rust clients are not covered here: on `main` both abort when no `.env` file is present, so they cannot be driven without credentials. Making them start credential-free is a change in their own directories, so their coverage lands with those changes rather than here. -The Ruby **weather server** is not covered, for an upstream reason rather than a local one. The `mcp` gem negotiates `2026-07-28`, but its server never emits the `resultType` field that revision makes mandatory, so the test client rejects its responses — including `tools/list`. That is a fix for the gem, not something an example can work around. The Ruby **client** is covered: there it is the gem's client code that runs, and the server it is pointed at is the mock. - ## Structured content Listing tools is not enough to catch a broken structured result, so each server test also **calls** every tool that declares an `outputSchema` and checks the answer: diff --git a/tests/smoke-test.sh b/tests/smoke-test.sh index 494c5d2..b81d022 100755 --- a/tests/smoke-test.sh +++ b/tests/smoke-test.sh @@ -84,10 +84,6 @@ test_weather_server_go() { node "${TEST_CLIENT}" "${server_bin}" } -# The client tests drive the no-API-key path, where each client prints a notice -# and exits. Empty rather than unset: dotenv skips a name already present in -# ENV, so a key in the environment or a local .env would start the chat loop. - # Test: Ruby weather server test_weather_server_ruby() { check_dependency ruby || return 1 @@ -97,6 +93,10 @@ test_weather_server_ruby() { (cd "${server_dir}" && node "${TEST_CLIENT}" bundle exec ruby weather.rb) } +# The client tests drive the no-API-key path, where each client prints a notice +# and exits. Empty rather than unset: dotenv skips a name already present in +# ENV, so a key in the environment or a local .env would start the chat loop. + # Test: Python MCP client test_mcp_client_python() { check_dependency uv || return 1