fix(server): return METHOD_NOT_FOUND for unregistered spec methods (#3193) - #3207
fix(server): return METHOD_NOT_FOUND for unregistered spec methods (#3193)#3207Pradhyut21 wants to merge 1 commit into
Conversation
|
Hi @borisowvalia! I'd like to work on this issue. I've inspected ServerRunner._on_request in src/mcp/server/runner.py and separated the version-surface check from parameter validation so that unregistered spec methods return -32601 Method not found per JSON-RPC 2.0 while leaving parameter validation intact for registered handlers. Submitting a PR shortly! |
There was a problem hiding this comment.
All reported issues were addressed across 3 files
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
bd4195d to
9724cea
Compare
|
"After running the full multi-version CI matrix and inspecting tests/interaction/lowlevel/test_wire.py, I verified that main already enforces JSON-RPC 2.0 compliance: Unknown non-spec methods (totally/bogus, x/unknown) reach handler lookup (entry is None) and return -32601 Method not found. |
Fixes #3193.
In
ServerRunner._on_request,_methods.validate_client_requestwas previously called before checkingself.server.get_request_handler(method). For spec methods (SPEC_CLIENT_METHODS) where no handler was registered on the server, sending malformed or missing parameters triggered parameter validation first, returning-32602 Invalid paramsinstead of-32601 Method not found.Motivation and Context
Per JSON-RPC 2.0 specification (Section 5.1), calling a method that is not available / served by the server must return
-32601 Method not found. Previously, probing an unregistered spec method (such astriggers/listortools/callon a server without handlers) returned-32602 Invalid paramswhen parameters were missing or malformed.This change separates the version-surface check from parameter validation:
if method in _methods.SPEC_CLIENT_METHODS and (method, version) not in _methods.CLIENT_REQUESTS:so methods invalid at the negotiated version return-32601 Method not found._methods.validate_client_requestdown afterself.server.get_request_handler(method). Unregistered spec methods now fall through toentry is None(-32601 Method not found), while registered handlers continue to surface-validate parameters (-32602 Invalid params).initializehandshake branch remains 100% untouched.How Has This Been Tested?
uv run pytest tests/server/test_runner.py): 113/113 passed.tests/server/test_runner.pyto assert-32601 Method not foundfor unregistered spec methods and-32602 Invalid paramsfor registered spec methods with invalid parameters.uv run pytest): 5,572 passed.uv run ruff check .anduv run ruff format --check ..Breaking Changes
No breaking changes. Existing registered handler behavior and parameter validation rules are fully preserved.
Types of changes