This release repairs the `subscriptions/listen` stream: a host that buffers its responses, the documented Rails controller pattern among them, can decline the method with `serve_subscriptions_listen: false` instead of answering a modern client with a streaming body it cannot render, and the stream's ordering guarantees are enforced - no notification before the acknowledgement, none after the graceful closing result. The new keyword argument is what makes this a minor release; everything else is a bug fix. The controller-pattern crash is a regression from 1.2.0, where the modern lifecycle began answering `subscriptions/listen` that earlier versions had refused as an unknown method, and it fails quietly: only the notification stream breaks, so tool calls keep working.
563 lines
18 KiB
Markdown
563 lines
18 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to this project will be documented in this file.
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
|
## [Unreleased]
|
|
|
|
## [1.4.0] - 2026-08-28
|
|
|
|
This release repairs the `subscriptions/listen` stream. A host that buffers its responses,
|
|
the documented Rails controller pattern among them, can decline the method with
|
|
`serve_subscriptions_listen: false` instead of answering a modern client with a streaming body
|
|
it cannot render, and the stream's ordering guarantees are enforced: no notification reaches
|
|
a client before the acknowledgement, and none follows the graceful closing result.
|
|
|
|
### Added
|
|
|
|
- Add `serve_subscriptions_listen:` for hosts that cannot hold an SSE stream open (#533)
|
|
|
|
### Fixed
|
|
|
|
- Deliver `subscriptions/listen` notifications only after the acknowledgement (#532)
|
|
- Serialize `subscriptions/listen` writes so the graceful result is the final message (#535)
|
|
|
|
## [1.3.0] - 2026-08-22
|
|
|
|
User-facing documentation now lives on the documentation site at https://ruby.sdk.modelcontextprotocol.io,
|
|
and README.md keeps the quick start. Two entries under "Changed" reject traffic that earlier releases accepted
|
|
and ship in a minor release under the exceptions described in [VERSIONING.md](VERSIONING.md).
|
|
|
|
### Added
|
|
|
|
- Add a `resources_list_handler` for context-dependent resource lists (#509)
|
|
- Pass a handler-returned `_meta` through the subscribe result (#510)
|
|
|
|
### Changed
|
|
|
|
- Bound OAuth response bodies in the client (#520)
|
|
- Reject duplicate in-flight JSON-RPC request ids (#521)
|
|
- Move the documentation from README.md to the documentation site (#523)
|
|
|
|
## [1.2.0] - 2026-08-15
|
|
|
|
This release completes the SEP-2575 stateless lifecycle of the 2026-07-28 specification, together with
|
|
the SEP-2322, SEP-2549, and SEP-2243 features that revision builds on. Several entries under "Changed"
|
|
are incompatible with 1.1.0 and ship in a minor release under the spec-conformance and security exceptions
|
|
described in [VERSIONING.md](VERSIONING.md).
|
|
|
|
### Added
|
|
|
|
- Handle the SEP-2575 modern request envelope in the server core (#475)
|
|
- Serve both lifecycle eras over stdio with an era lock per SEP-2575 (#478)
|
|
- Serve the sessionless modern path over Streamable HTTP per SEP-2575 (#479)
|
|
- Finalize `server/discover` and add client modern lifecycle support per SEP-2575 (#480)
|
|
- Let handlers return multi round-trip `input_required` results per SEP-2322 (#481)
|
|
- Add `MCP::Elicitation::EnumSchema` builders per SEP-1330 (#482)
|
|
- Stamp the required `resultType` on modern results per SEP-2322 (#487)
|
|
- Enforce the modern lifecycle admission rules per SEP-2575 (#489)
|
|
- Stream modern request notifications and honor the envelope `logLevel` per SEP-2575 (#490)
|
|
- Expose the user-defined `server_context` in instrumentation data (#493)
|
|
- Serve the `subscriptions/listen` notification stream per SEP-2575 (#495)
|
|
- Add opt-in `requestState` sealing via `MCP::Server::RequestStateSecurity` (#496)
|
|
- Mirror `x-mcp-header` tool parameters into `Mcp-Param-*` headers per SEP-2243 (#498)
|
|
- Stamp the required cache hints on modern cacheable results per SEP-2549 (#499)
|
|
- Drive multi round-trip `input_required` results on the client per SEP-2322 (#500)
|
|
- Fulfill `input_required` results on the legacy wire per SEP-2322 (#501)
|
|
|
|
### Changed
|
|
|
|
- Align modern envelope validation with the finalized specification (#491)
|
|
- Require the `Mcp-Method` header on the modern path (#492)
|
|
- Bound server-to-client requests with a timeout (#502)
|
|
- Refuse server-to-client requests in the modern lifecycle per SEP-2575 (#503)
|
|
- Bound the total wait across SSE reconnection attempts (#504)
|
|
- Bound automatic pagination in the MCP client (#505)
|
|
- Reject modern-removed methods before the connection era locks (#511)
|
|
- Stop negotiating modern protocol versions through the `initialize` handshake (#516)
|
|
|
|
### Deprecated
|
|
|
|
- Warn on modern client connects that declare the Roots or Sampling capabilities deprecated per SEP-2577 (#406, #516)
|
|
|
|
### Fixed
|
|
|
|
- Stop leaking exception messages to clients via JSON-RPC error data (#486)
|
|
- Return Invalid Params for unknown prompts and missing prompt arguments (#517)
|
|
- Restrict OAuth discovery to same-origin metadata URLs and refuse private-network destinations
|
|
|
|
## [1.1.0] - 2026-08-01
|
|
|
|
### Added
|
|
|
|
- Support 2026-07-28 as the Latest Protocol Version (#476)
|
|
- Expose server tool annotations on MCP::Client::Tool (#445)
|
|
|
|
### Fixed
|
|
|
|
- Preserve explicit tool response content (#469)
|
|
|
|
## [1.0.0] - 2026-07-24
|
|
|
|
First stable release. The public API is now stable: breaking changes ship only in major releases,
|
|
apart from the narrow exceptions documented in [VERSIONING.md](VERSIONING.md).
|
|
|
|
### Added
|
|
|
|
- Add `ROADMAP.md` outlining the path toward SEP-1730 (#465)
|
|
- Add `VERSIONING.md` documenting the versioning and breaking-change policy (#466)
|
|
|
|
## [0.25.0] - 2026-07-18
|
|
|
|
### Added
|
|
|
|
- Support SEP-990 Cross-App Access via ID-JAG and the `jwt-bearer` grant (#454)
|
|
- Support client-side sampling via `MCP::Client#on_sampling` (#458)
|
|
|
|
### Fixed
|
|
|
|
- Reject notifications carrying an unknown or expired session (#455)
|
|
- Handle an `initialize` request sent without an ID (#456)
|
|
- Bound client-side message buffering in the HTTP transport (#459)
|
|
- Lowercase response header names in `StreamableHTTPTransport` (#460)
|
|
|
|
## [0.24.0] - 2026-07-12
|
|
|
|
### Added
|
|
|
|
- Support SSE reconnection per SEP-1699 in the HTTP client transport (#426)
|
|
- Validate the RFC 9207 `iss` authorization response parameter per SEP-2468 (#431)
|
|
- Support `private_key_jwt` client authentication for the `client_credentials` grant (#432)
|
|
- Recognize multi round-trip `input_required` results per SEP-2322 (#433)
|
|
- Add opt-in `ttlMs` / `cacheScope` cache hints to List and Read results per SEP-2549 (#436)
|
|
- Add `server/discover` and stateless lifecycle error codes per SEP-2575 (#438)
|
|
- Associate server-to-client requests with the originating client request per SEP-2260 (#440)
|
|
- Add server-side MCP Apps helpers per SEP-1865 (#441)
|
|
- Support client-side elicitation with SEP-1034 schema defaults (#443)
|
|
- Support class-based Resource and ResourceTemplate definitions (#447)
|
|
|
|
### Changed
|
|
|
|
- Bind stored client credentials to the authorization server issuer per SEP-2352 (#439)
|
|
|
|
### Fixed
|
|
|
|
- Handle non-object JSON-RPC messages without raising (#448)
|
|
- Perform SSE stream writes outside the session mutex (#449)
|
|
- Validate required params for `initialize` and `resources/subscribe` (#451)
|
|
|
|
## [0.23.0] - 2026-07-07
|
|
|
|
### Added
|
|
|
|
- Add a session-ownership hook to `StreamableHTTPTransport`
|
|
|
|
### Changed
|
|
|
|
- Require calling `MCP::Client#connect` before sending requests on stdio transport (#427)
|
|
|
|
### Deprecated
|
|
|
|
- Annotate Roots, Sampling, and Logging APIs as deprecated per SEP-2577 (#429)
|
|
|
|
### Fixed
|
|
|
|
- Fix an incorrect `result: null` response to an id-bearing notification message (#435)
|
|
- Validate `Host` and `Origin` headers to prevent DNS rebinding per MCP 2025-11-25
|
|
- Bound stateful session retention to prevent an initialize-flood DoS
|
|
- Bound stdio frame reads with `max_line_bytes`
|
|
- Bound request body and frame reads to prevent memory-exhaustion DoS
|
|
|
|
## [0.22.0] - 2026-06-27
|
|
|
|
### Added
|
|
|
|
- Add `audience` role validation for `MCP::Annotations` per MCP specification (#422)
|
|
- Send SEP-2243 `Mcp-Method` and `Mcp-Name` headers per MCP specification (#423)
|
|
- Support client-side `notifications/cancelled` per MCP specification (#425)
|
|
|
|
### Changed
|
|
|
|
- Conform Tool Schemas to JSON Schema 2020-12 per SEP-2106 (#417)
|
|
|
|
### Fixed
|
|
|
|
- Fix a `SyntaxError` on Ruby 2.7.0 caused by arguments forwarding syntax (#419)
|
|
|
|
## [0.21.0] - 2026-06-20
|
|
|
|
### Added
|
|
|
|
- Support capability extensions per SEP-2133 (#405)
|
|
- Add range validation for `MCP::Annotations#priority` per MCP specification (#410)
|
|
- Isolate stateless requests in ephemeral sessions per SEP-2567 (#415)
|
|
|
|
### Changed
|
|
|
|
- Set OIDC `application_type` on Dynamic Client Registration per SEP-837 (#408)
|
|
- Fall back to legacy 2025-03-26 OAuth discovery for servers without PRM (#414)
|
|
|
|
## [0.20.0] - 2026-06-14
|
|
|
|
### Added
|
|
|
|
- Support W3C Trace Context Propagation via `_meta` per SEP-414 (#397)
|
|
- Support OAuth `client_credentials` grant in OAuth client (#399)
|
|
- Add `annotations` field to `MCP::Resource` and `MCP::ResourceTemplate` per MCP specification (#403)
|
|
|
|
### Changed
|
|
|
|
- Re-run OAuth flow on 403 `insufficient_scope` (step-up) (#368)
|
|
- Speed up `Tool::Schema` validation by 5x to 100x (#369)
|
|
- Use JSON-RPC error envelope for `StreamableHTTPTransport` errors (#371)
|
|
- Pin RFC 8414 default well-known suffix per SEP-2351 (#395)
|
|
- Default missing `MCP-Protocol-Version` to `2025-03-26` in `StreamableHTTPTransport` (#392)
|
|
|
|
### Fixed
|
|
|
|
- Preserve the request ID in invalid request error responses (#400)
|
|
- Standardize Resource Not Found errors on -32602 with URI data per SEP-2164 (#402)
|
|
|
|
## [0.19.0] - 2026-06-13
|
|
|
|
### Added
|
|
|
|
- Support Client ID Metadata Documents in OAuth client (#361)
|
|
- Request `offline_access` scope when supported (#365)
|
|
- Add `size` field to `MCP::Resource` per MCP specification (#393)
|
|
|
|
## [0.18.0] - 2026-05-30
|
|
|
|
### Added
|
|
|
|
- Support server-to-client `ping` per MCP specification (#358)
|
|
|
|
### Changed
|
|
|
|
- Warn on implicit stdio initialization (#338)
|
|
- Cache `Tool::Schema` validation to avoid re-validating identical schemas (#363)
|
|
|
|
### Fixed
|
|
|
|
- Fix case-sensitive `Accept` header comparison (#359)
|
|
|
|
## [0.17.0] - 2026-05-19
|
|
|
|
### Added
|
|
|
|
- Add OAuth 2.1 client support for MCP authorization flow (#353)
|
|
|
|
### Fixed
|
|
|
|
- Validate `MCP-Protocol-Version` header in `StreamableHTTPTransport` (#347)
|
|
- Reject duplicate `initialize` requests (#350)
|
|
- Reject non-Hash JSON-RPC bodies in `StreamableHTTPTransport` (#354)
|
|
|
|
## [0.16.0] - 2026-05-14
|
|
|
|
### Added
|
|
|
|
- Add opt-in tool output validation (#344)
|
|
|
|
### Changed
|
|
|
|
- Advertise JSON Schema 2020-12 dialect on emitted tool schemas (#342)
|
|
|
|
### Fixed
|
|
|
|
- Preserve client tool output schemas (#343)
|
|
- Fix missing `output_schema` argument in `define_tool` API (#301)
|
|
|
|
## [0.15.0] - 2026-05-05
|
|
|
|
### Added
|
|
|
|
- Support `notifications/cancelled` per MCP specification (#332)
|
|
- Add client-level `connect` for initialize handshake (#327)
|
|
- Add client-level `connect` handshake to stdio transport (#336)
|
|
|
|
### Changed
|
|
|
|
- Return tool argument validation failures as tool execution errors (#333)
|
|
|
|
### Removed
|
|
|
|
- Remove obsolete `MCP::Transports` module (#331)
|
|
|
|
## [0.14.0] - 2026-04-24
|
|
|
|
### Added
|
|
|
|
- Support pagination per MCP specification (#320)
|
|
- Support resource subscriptions per MCP specification (#313)
|
|
- Add `roots/list` and `notifications/roots/list_changed` support (#315)
|
|
- Support JSON response mode for `StreamableHTTPTransport` (#328)
|
|
- Add HTTP client close for explicit session termination (#326)
|
|
- Track `Mcp-Session-Id` and protocol version in HTTP client (#325)
|
|
- Support `ping` client API per MCP specification (#324)
|
|
|
|
### Fixed
|
|
|
|
- Handle 202 Accepted response in HTTP client (#323)
|
|
|
|
### Changed
|
|
|
|
- Parse SSE responses in HTTP client via `event_stream_parser` (#322)
|
|
|
|
## [0.13.0] - 2026-04-16
|
|
|
|
### Added
|
|
|
|
- Make `StreamableHTTPTransport` a Rack application (#263)
|
|
- Support `elicitation/create` per MCP specification (#312)
|
|
- Add `around_request` hook for request instrumentation (#309)
|
|
- Add `_meta` field to resource, content, and result classes (#310)
|
|
|
|
### Removed
|
|
|
|
- Remove `Server#create_sampling_message` direct call (#311)
|
|
|
|
## [0.12.0] - 2026-04-11
|
|
|
|
### Added
|
|
|
|
- Support customizing the Faraday client in `MCP::Client::HTTP` (#306)
|
|
|
|
### Changed
|
|
|
|
- Auto-set `server.transport` in `Transport#initialize` (#305)
|
|
|
|
### Fixed
|
|
|
|
- Validate Content-Type on POST requests (#304)
|
|
|
|
## [0.11.0] - 2026-04-06
|
|
|
|
### Added
|
|
|
|
- Support `sampling/createMessage` per MCP specification (#282)
|
|
- Support `completion/complete` per MCP specification (#289)
|
|
|
|
### Fixed
|
|
|
|
- Support POST response SSE streams for server-to-client messages (#294)
|
|
- Return protocol errors for invalid arguments and server errors (#285)
|
|
- Fix client methods silently swallowing JSON-RPC error responses (#281)
|
|
- Close streams outside mutex in session cleanup (#291)
|
|
|
|
## [0.10.0] - 2026-03-30
|
|
|
|
### Added
|
|
|
|
- Session expiry controls for `StreamableHTTPTransport` via `session_idle_timeout:` option (#268)
|
|
|
|
### Changed
|
|
|
|
- `ServerSession` for per-connection state (#275)
|
|
|
|
### Removed
|
|
|
|
- Remove `Server#notify_progress` broadcast API (#276)
|
|
- Remove undocumented handler override methods (#270)
|
|
|
|
### Fixed
|
|
|
|
- Reject POST requests without session ID in stateful mode (#274)
|
|
|
|
## [0.9.2] - 2026-03-27
|
|
|
|
### Fixed
|
|
|
|
- Use accessor method in `server_context_with_meta` instead of ivar (#273)
|
|
- Reject duplicate SSE connections with 409 to prevent stream hijacking
|
|
|
|
## [0.9.1] - 2026-03-23
|
|
|
|
### Added
|
|
|
|
- Allow `Client#call_tool` to accept a tool name (#266)
|
|
|
|
### Fixed
|
|
|
|
- Return 404 for invalid session ID in `handle_delete` (#261)
|
|
|
|
## [0.9.0] - 2026-03-20
|
|
|
|
### Added
|
|
|
|
- `MCP::Client::Stdio` transport (#262)
|
|
- Progress notifications per MCP specification (#254)
|
|
- Automatic `_meta` parameter extraction support (#172)
|
|
- CORS and Accept wildcard support for browser-based MCP clients (#253)
|
|
|
|
### Changed
|
|
|
|
- Use `autoload` to defer loading of unused subsystems (#255)
|
|
- Reduce release package size (#239)
|
|
|
|
### Fixed
|
|
|
|
- Return 404 for invalid session ID in `handle_regular_request` (#257)
|
|
- Use mutex-protected `session_exists?` in `handle_regular_request` (#258)
|
|
|
|
## [0.8.0] - 2026-03-03
|
|
|
|
### Added
|
|
|
|
- `Content::EmbeddedResource` class for embedded resource content type (#244)
|
|
- `Content::Audio` class for audio content type (#243)
|
|
- `$ref` support in `Tool::Schema` for protocol version 2025-11-25 (#242)
|
|
- MCP conformance test suite (#248)
|
|
|
|
### Fixed
|
|
|
|
- Handle `Errno::ECONNRESET` in SSE stream operations (#249)
|
|
- Fix default handler return values to comply with MCP spec (#247)
|
|
- Fix `Prompt#validate_arguments!` crash when arguments are `nil` (#246)
|
|
- Return 202 Accepted for SSE responses per MCP spec (#245)
|
|
- Fix `Content::Image#to_h` to return `mimeType` (camelCase) per MCP spec (#241)
|
|
|
|
## [0.7.1] - 2026-02-21
|
|
|
|
### Fixed
|
|
|
|
- Fix `Resource::Contents#to_h` to use correct property names per MCP spec (#235)
|
|
- Return JSON-RPC protocol errors for unknown tool calls (#231)
|
|
- Fix `logging/setLevel` to return empty hash per MCP specification (#230)
|
|
|
|
## [0.7.0] - 2026-02-14
|
|
|
|
### Added
|
|
|
|
- `logging` support (#103)
|
|
- Protocol version negotiation to server initialization (#223)
|
|
- Tool arguments to instrumentation data (#218)
|
|
- Client info to instrumentation callback (#221)
|
|
- `resource_templates` to `MCP::Client` (#225)
|
|
|
|
### Changed
|
|
|
|
- Extract `MCP::Annotations` into a dedicated file (#224)
|
|
|
|
### Fixed
|
|
|
|
- `Resource::Embedded` not setting `@resource` in `initialize` (#220)
|
|
|
|
## [0.6.0] - 2026-01-16
|
|
|
|
### Changed
|
|
|
|
- Update licensing to Apache 2.0 for new contributions (#213)
|
|
|
|
### Fixed
|
|
|
|
- Omit `icons` from responses when empty or nil to reduce context window usage (#212)
|
|
|
|
## [0.5.0] - 2026-01-11
|
|
|
|
### Added
|
|
|
|
- Protocol specification version "2025-11-25" support (#184)
|
|
- `icons` parameter support (#205)
|
|
- `websiteUrl` parameter in `serverInfo` (#188)
|
|
- `description` parameter in `serverInfo` (#201)
|
|
- `additionalProperties` support for schema validation (#198)
|
|
- "Draft" protocol version to supported versions (#179)
|
|
- `stateless` mode for high availability (#101)
|
|
- Exception messages for tool call errors (#194)
|
|
- Elicitation skeleton (#178)
|
|
- `prompts/list` and `prompts/get` support to client (#163)
|
|
- Accept header validation for HTTP client transport (#207)
|
|
- Ruby 2.7 - Ruby 3.1 support (#206)
|
|
|
|
### Changed
|
|
|
|
- Make tool names stricter (#204)
|
|
|
|
### Fixed
|
|
|
|
- Symlink path comparison in schema validation (#193)
|
|
- Duplicate tool names across namespaces now raise an error (#199)
|
|
- Tool error handling to follow MCP spec (#165)
|
|
- XSS vulnerability in json_rpc_handler (#175)
|
|
|
|
## [0.4.0] - 2025-10-15
|
|
|
|
### Added
|
|
|
|
- Client resources support with `resources/list` and `resources/read` methods (#160)
|
|
- `_meta` field support for Tool schema (#124)
|
|
- `_meta` field support for Prompt
|
|
- `title` field support for prompt arguments
|
|
- `call_tool_raw` method to client for accessing full tool responses (#149)
|
|
- Structured content support in tool responses (#147)
|
|
- AGENTS.md development guidance documentation (#134)
|
|
- Dependabot configuration for automated dependency updates (#138)
|
|
|
|
### Changed
|
|
|
|
- Set default `content` to empty array instead of `nil` (#150)
|
|
- Improved prompt spec compliance (#153)
|
|
- Allow output schema to be array of objects (#144)
|
|
- Return 202 response code for accepted JSON-RPC notifications (#114)
|
|
- Added validation to `MCP::Configuration` setters (#145)
|
|
- Updated metaschema URI format for cross-OS compatibility
|
|
|
|
### Fixed
|
|
|
|
- Client tools functionality and test coverage (#166)
|
|
- Client resources test for empty responses (#162)
|
|
- Documentation typos and incorrect examples (#157, #146)
|
|
- Removed redundant transport requires (#154)
|
|
- Cleaned up unused block parameters and magic comments
|
|
|
|
## [0.3.0] - 2025-09-14
|
|
|
|
### Added
|
|
|
|
- Tool output schema support with comprehensive validation (#122)
|
|
- HTTP client transport layer for MCP clients (#28)
|
|
- Tool annotations validation for protocol compatibility (#122)
|
|
- Server instructions support (#87)
|
|
- Title support in server info (#119)
|
|
- Default values for tool annotation hints (#118)
|
|
- Notifications/initialized method implementation (#84)
|
|
|
|
### Changed
|
|
|
|
- Make default protocol version the latest specification version (#83)
|
|
- Protocol version validation to ensure valid values (#80)
|
|
- Improved tool handling for tools with no arguments (#85, #86)
|
|
- Better error handling and response API (#109)
|
|
|
|
### Fixed
|
|
|
|
- JSON-RPC notification format in Streamable HTTP transport (#91)
|
|
- Errors when title is not specified (#126)
|
|
- Tools with missing arguments handling (#86)
|
|
- Namespacing issues in README examples (#89)
|
|
|
|
## [0.2.0] - 2025-07-15
|
|
|
|
### Added
|
|
|
|
- Custom methods support via `define_custom_method` (#75)
|
|
- Streamable HTTP transport implementation (#33)
|
|
- Tool argument validation against schemas (#43)
|
|
|
|
### Changed
|
|
|
|
- Server context is now optional for Tools and Prompts (#54)
|
|
- Improved capability handling and removed automatic capability determination (#61, #63)
|
|
- Refactored architecture in preparation for client support (#27)
|
|
|
|
### Fixed
|
|
|
|
- Input schema validation for schemas without required fields (#73)
|
|
- Error handling when sending notifications (#70)
|
|
|
|
## [0.1.0] - 2025-05-30
|
|
|
|
Initial release in collaboration with Shopify
|