## Motivation and Context Fixes https://github.com/modelcontextprotocol/ruby-sdk/issues/450 The MCP schema requires `protocolVersion`, `capabilities`, and `clientInfo` on `initialize` params, and `uri` on `resources/subscribe` and `resources/unsubscribe` params. The server accepted requests with these fields absent: `initialize` silently negotiated the server's default protocol version, and `resources/subscribe` returned an empty success result. Both now return `-32602` Invalid params, matching the Python SDK, which rejects such requests during pydantic validation. The `uri` check runs before dispatch so it also covers handlers registered via `resources_subscribe_handler` and `resources_unsubscribe_handler`. A `protocolVersion` value that is present but unsupported still negotiates the server's fallback version, as the spec's lifecycle section requires. ## How Has This Been Tested? Reproduced the issue's stdio repro steps: both malformed requests now return `-32602` instead of succeeding. ## Breaking Changes Clients that send `initialize` without `protocolVersion`, `capabilities`, or `clientInfo`, or `resources/subscribe` / `resources/unsubscribe` without `uri`, now receive `-32602` Invalid params instead of a success response. Such requests violate the MCP schema, but any code relying on the previous lenient behavior (for example, test harnesses sending bare `initialize` requests) must now include the required fields.
25 lines
793 B
Ruby
25 lines
793 B
Ruby
# frozen_string_literal: true
|
|
|
|
require "mcp"
|
|
|
|
require "minitest/autorun"
|
|
require "minitest/mock"
|
|
require "mocha/minitest"
|
|
|
|
# mocha relies on `Hash.ruby2_keywords_hash?`, which is absent on Ruby 2.7.0 and the earlier 2.7.x releases
|
|
# before it was backported. Those versions also lack the flag-setting APIs, so no hash is ever flagged as
|
|
# ruby2_keywords and returning `false` is correct. Without this shim, mocha raises `NoMethodError` and
|
|
# the suite cannot run on Ruby 2.7.0.
|
|
unless Hash.respond_to?(:ruby2_keywords_hash?)
|
|
def Hash.ruby2_keywords_hash?(_hash)
|
|
false
|
|
end
|
|
end
|
|
|
|
require "active_support"
|
|
require "active_support/test_case"
|
|
|
|
require "sorbet-runtime" if RUBY_VERSION >= "3.0"
|
|
|
|
require_relative "instrumentation_test_helper"
|
|
require_relative "initialize_params_test_helper"
|