Commit graph

428 commits

Author SHA1 Message Date
Koichi ITO
2da465c985 Release 0.8.0
Some fixes have been identified during the implementation of the conformance infrastructure.
It should be possible to proceed with a release at this stage.
2026-03-03 01:19:53 +09:00
Koichi ITO
ad45c10e13
Merge pull request #248 from koic/conformance
Support running MCP conformance tests against the Ruby SDK
2026-03-02 14:54:41 +09:00
Koichi ITO
13bbd2937d Support running MCP conformance tests against the Ruby SDK
## Motivation

To assess and track the Ruby SDK's compliance with the MCP
specification, integrate `@modelcontextprotocol/conformance` as the
standard evaluation harness. This makes it possible to measure
conformance objectively, catch regressions early, and produce the kind
of evaluation data needed for SDK tier assessments.

## Scope

Only server conformance is included at this point. Client conformance
requires protocol-level features that MCP::Client does not yet
support (initialize handshake, notifications, ping, etc.).

## Usage

Run conformance tests:

```console
bundle exec rake conformance
```

Start the conformance server in the foreground for iterating on a single
scenario without the per-run startup overhead:

```console
bundle exec rake conformance_server
```

## Default Rake Task (`bundle exec rake`)

It is configured to run in order of lower execution cost: `rubocop`, `test`, and then `conformance`.

## CI

`.github/workflows/conformance.yml` file has been added to run the conformance tests in CI.

## SDK Tier Report

The MCP SDK Tier system (https://modelcontextprotocol.io/community/sdk-tiers)
requires SDK maintainers to self-assess and report results to the SDK Working
Group via https://github.com/modelcontextprotocol/modelcontextprotocol/issues.

To generate a full tier assessment report, use the `/mcp-sdk-tier-audit`
slash command from the https://github.com/modelcontextprotocol/conformance repository with
the conformance server running:

```console
# Terminal 1 (this repository): start the conformance server
bundle exec rake conformance_server

# Terminal 2 (conformance repository): run the tier audit skill as a slash command in Claude Code
/mcp-sdk-tier-audit /path/to/modelcontextprotocol/ruby-sdk http://localhost:9292/mcp
```

The skill evaluates conformance pass rate, issue label taxonomy, triage
metrics, documentation coverage, and policy compliance, then produces a
markdown report suitable for tier advancement submissions.
2026-03-02 14:50:03 +09:00
Koichi ITO
5f16abfd96
Merge pull request #244 from koic/add_content_embedded_resource
Add `Content::EmbeddedResource` class for embedded resource content type
2026-03-02 01:35:37 +09:00
Koichi ITO
ba7a08aa04 Add Content::EmbeddedResource class for embedded resource content type
The MCP spec defines an embedded resource content type, but the SDK had
no corresponding class. Add `Content::EmbeddedResource` that wraps a
resource object and serializes it via `to_h`.

https://modelcontextprotocol.io/specification/2025-11-25/server/tools#embedded-resources
2026-03-02 01:33:05 +09:00
Koichi ITO
60f69351ee
Merge pull request #249 from koic/fix_econnreset_in_sse_notification
Handle `Errno::ECONNRESET` in SSE stream operations
2026-03-02 01:30:40 +09:00
Koichi ITO
2fc4f5e1d2
Merge pull request #243 from koic/add_content_audio
Add `Content::Audio` class for audio content type
2026-03-02 01:30:20 +09:00
Koichi ITO
29a32900fd
Merge pull request #246 from koic/fix_prompt_nil_arguments
Fix `Prompt#validate_arguments!` crash when arguments are `nil`
2026-03-01 18:38:14 +09:00
Koichi ITO
cbb81a836c Add Content::Audio class for audio content type
The MCP spec defines an audio content type, but the SDK only had
`Content::Text` and `Content::Image`. Add `Content::Audio` with the
same structure as `Content::Image`.

https://modelcontextprotocol.io/specification/2025-11-25/server/tools#audio-content
2026-03-01 17:30:17 +09:00
Koichi ITO
9c1c2491b1 Handle Errno::ECONNRESET in SSE stream operations
`Errno::ECONNRESET` is a `SystemCallError`, not an `IOError`, so it was
not caught by the existing `rescue IOError, Errno::EPIPE` clauses. When
a client disconnected with a TCP RST during SSE notification broadcast,
the unhandled exception aborted the entire broadcast loop, causing
notifications to be lost for all remaining sessions.

This caused the `tools-call-with-logging` conformance scenario to fail
in CI (#248), where stale sessions from prior scenarios triggered
`ECONNRESET` on the first notification write, aborting the broadcast
and losing log notifications.

Add `Errno::ECONNRESET` to all four rescue clauses in
`StreamableHTTPTransport`: `send_notification` (targeted and broadcast),
`send_response_to_stream`, and `send_keepalive_ping`.
2026-03-01 17:25:38 +09:00
Koichi ITO
200826c7fd
Merge pull request #247 from koic/fix_default_handler_return_values
Fix default handler return values to comply with MCP spec
2026-03-01 17:23:42 +09:00
Koichi ITO
ef5c76373b Fix Prompt#validate_arguments! crash when arguments are nil
`Prompt#validate_arguments!` called `required_args` which does `arguments_value.filter_map`,
crashing with `NoMethodError` when `arguments_value` is `nil` (the default for prompts without
declared arguments). Additionally, passing `nil` as args caused a crash on `args.keys`.

Fix by defaulting `arguments_value` to `[]` and guarding against `nil` args.
2026-03-01 17:21:41 +09:00
Koichi ITO
76ab822ad7
Merge pull request #245 from koic/fix_sse_response_status
Return 202 Accepted for SSE responses per MCP spec
2026-03-01 17:17:26 +09:00
Koichi ITO
145dc1f2c5
Merge pull request #242 from koic/support_ref_in_tool_schema
Allow `$ref` in `Tool::Schema` for protocol version 2025-11-25
2026-03-01 17:16:47 +09:00
Koichi ITO
c62902b1e8
Merge pull request #241 from koic/fix_content_image_to_h
Fix `Content::Image#to_h` to return `mimeType` (camelCase) per MCP spec
2026-03-01 17:16:25 +09:00
Koichi ITO
7b910bca23 Fix default handler return values to comply with MCP spec
The no-op handlers for `completion/complete`, `resources/subscribe`,
and `resources/unsubscribe` returned `nil`.
When a client accesses the expected response structure (e.g., `result[:completion][:values]`),
a `nil` result raises `NoMethodError`.

The MCP spec requires specific response structures even for no-op handlers.
Returning spec-compliant defaults ensures that clients receive valid responses without
requiring servers to explicitly override each handler.

`completion/complete` now returns `{ completion: { values: [], hasMore: false } }`.
ref: https://modelcontextprotocol.io/specification/2025-11-25/server/utilities/completion

`resources/subscribe` and `resources/unsubscribe` now return `{}` (empty result).
ref: https://modelcontextprotocol.io/specification/2025-11-25/server/resources#subscriptions
2026-03-01 00:55:31 +09:00
Koichi ITO
a02a4572c4 Return 202 Accepted for SSE responses per MCP spec
`StreamableHTTPTransport#send_response_to_stream` returned 200 with
`{ accepted: true }` body, but the MCP spec requires 202 with empty body
when a response is sent via SSE stream. This has been a requirement since
Streamable HTTP was introduced in protocol version 2025-03-26.

- https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#sending-messages-to-the-server
- https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#sending-messages-to-the-server
2026-02-28 17:59:54 +09:00
Koichi ITO
99cbefc610 Allow $ref in Tool::Schema for protocol version 2025-11-25
`Tool::Schema` rejected `$ref` with an `ArgumentError`.
Earlier MCP spec versions (2024-11-05 through 2025-06-18) did not define
a JSON Schema dialect or reference the `$ref` keyword. `inputSchema` was described
only as "JSON Schema defining expected parameters" with no further constraints:

- https://modelcontextprotocol.io/specification/2024-11-05/server/tools
- https://modelcontextprotocol.io/specification/2025-06-18/server/tools

The MCP spec 2025-11-25 introduced a "JSON Schema Usage" section that adopts
JSON Schema 2020-12 as the default dialect. Since `$ref` is a core keyword in 2020-12,
it is now allowed for protocol version 2025-11-25 and later.

- https://modelcontextprotocol.io/specification/2025-11-25/basic#json-schema-usage
- https://modelcontextprotocol.io/specification/2025-11-25/server/tools
- https://json-schema.org/draft/2020-12/release-notes

For backward compatibility with older protocol versions (2025-06-18 and earlier),
`Server#validate!` continues to raise `ArgumentError` when a tool input schema contains `$ref`.
This preserves the existing behavior for servers targeting those spec versions.
2026-02-27 14:33:36 +09:00
Koichi ITO
37563e59bd Fix Content::Image#to_h to return mimeType (camelCase) per MCP spec
This is a fix for a similar bug that remained, as in #235.

`Content::Image#to_h` returned `mime_type` (snake_case), but the MCP spec
requires `mimeType` (camelCase) for the MIME type field in image content.
2026-02-27 12:51:38 +09:00
Koichi ITO
5b04089e06
Merge pull request #236 from koic/release_0_7_1 v0.7.1
Release 0.7.1
2026-02-21 11:15:14 +09:00
Koichi ITO
4af216fa32 Release 0.7.1
This is a release that includes several bug fixes.
2026-02-21 03:33:28 +09:00
Koichi ITO
a05da399ba
Merge pull request #235 from koic/fix_property_field_names_in_resource_contents
Fix `Resource::Contents#to_h` to use correct property names per MCP spec
2026-02-20 11:51:34 +09:00
Koichi ITO
c8a68da37b
Merge pull request #231 from koic/return_json_rpc_protocol_errors_for_unknown_tool_calls
Return JSON-RPC protocol errors for unknown tool calls
2026-02-20 11:51:16 +09:00
Koichi ITO
08832c6b43 Fix Resource::Contents#to_h to use correct property names per MCP spec
This PR fixes thr following fields with the MCP specification which requires:

- Text resources use `text` and `mimeType` fields
- Binary resources use `blob` (base64-encoded) and `mimeType` fields

https://modelcontextprotocol.io/specification/2025-11-25/server/resources#resource-contents

Fixes #234.
2026-02-19 13:50:10 +09:00
Den Delimarsky
6df8e4c74c
Add SECURITY.md with GitHub Security Advisories guidance (#232) 2026-02-18 20:49:17 -05:00
Koichi ITO
15710ef0aa Return JSON-RPC protocol errors for unknown tool calls
Per the MCP specification, an unknown tool call is a protocol-level error, not a tool execution error.
Return JSON-RPC -32602 (Invalid params) instead of successful responses with `isError: true`.
https://modelcontextprotocol.io/specification/2025-11-25/server/tools#error-handling

Fixes #228.
2026-02-19 02:53:39 +09:00
Koichi ITO
b8f1cc92e6
Merge pull request #230 from koic/fix_logging_set_level
Fix `logging/setLevel` to return empty hash per MCP specification
2026-02-19 02:52:51 +09:00
Koichi ITO
34b7c68b5a
Merge pull request #219 from koic/acknowledge_shopify_in_the_initial_release
[Doc] Acknowledge Shopify in the initial release
2026-02-17 12:40:08 +09:00
Koichi ITO
4dc2a8eb4a Fix logging/setLevel to return empty hash per MCP specification
This PR fixes `logging/setLevel` to return empty hash per MCP specification.
The MCP specification requires `logging/setLevel` to return an empty result
on success, not nil or the `LoggingMessageNotification` object.

Specification reference:
https://modelcontextprotocol.io/specification/2025-11-25/server/utilities/logging

Fixes #229.
2026-02-17 01:00:15 +09:00
Koichi ITO
2b790d6804
Merge pull request #227 from koic/release_0_7_0 v0.7.0
Release 0.7.0
2026-02-14 15:44:43 +09:00
Koichi ITO
0175fff4dd Release 0.7.0
Some new features and fixes have been added, and it seems like a good time to cut a release.

- https://github.com/modelcontextprotocol/ruby-sdk/pull/103
- https://github.com/modelcontextprotocol/ruby-sdk/pull/223
- https://github.com/modelcontextprotocol/ruby-sdk/pull/218
- https://github.com/modelcontextprotocol/ruby-sdk/pull/221
- https://github.com/modelcontextprotocol/ruby-sdk/pull/225
- https://github.com/modelcontextprotocol/ruby-sdk/pull/224
- https://github.com/modelcontextprotocol/ruby-sdk/pull/220

For now, the features completed so far can be included in this release,
and subsequent feature proposals can continue to be incorporated into future releases.
2026-02-14 10:07:07 +09:00
Koichi ITO
c11393f4c4
Merge pull request #224 from koic/extract_annotations_from_mcp
Extract `MCP::Annotations` into a dedicated file
2026-02-10 02:30:42 +09:00
Koichi ITO
1a2750d6d7
Merge pull request #222 from koic/update_readme_for_instrumentation_callback
[Doc] Add `tool_arguments` to instrumentation callback documentation
2026-02-09 00:48:46 +09:00
Koichi ITO
ebd658d50d
Merge pull request #226 from sjrct/remove-unused-require
Remove unused require from logging_message_notification.rb
2026-02-07 02:59:16 +09:00
Koichi ITO
0e30dff80b
Merge pull request #225 from sjrct/add-client-resource-templates
Add resource_templates to MCP::Client
2026-02-07 02:58:52 +09:00
Chris Harding
d0107c304a logging_message_notification: Remove unused require 2026-02-05 16:05:08 -05:00
Chris Harding
c145fe39df Add resource_templates to MCP::Client
Includes relevant README addition and tests
2026-02-05 16:02:07 -05:00
Koichi ITO
15ef5ebda2
Merge pull request #223 from chattermill/md-protocol-negotiation
Add protocol version negotiation to server initialization
2026-02-06 00:11:28 +09:00
Mikhail Dubov
077a5cf15a Add protocol version negotiation to server initialization
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 10:43:59 +00:00
Koichi ITO
4a71fa8ec4
Merge pull request #221 from chattermill/md-client-instrumentation
Add client info to instrumentation callback
2026-02-05 11:28:14 +09:00
Mikhail Dubov
2d926ab386 Add client info to instrumentation callback 2026-02-04 12:03:03 +00:00
Koichi ITO
248c1ec532
Merge pull request #220 from koic/fix_resource_embedded_not_setting_resource_in_initialize
Fix `Resource::Embedded` not setting `@resource` in `initialize`
2026-02-04 10:58:49 +09:00
Koichi ITO
a85fa028f7 Extract MCP::Annotations into a dedicated file
This PR moves `MCP::Annotations` from lib/mcp.rb to lib/mcp/annotations.rb for better organization,
following the pattern used for other classes such as `Tool::Annotations`.

This PR also adds the missing `last_modified` attribute to `MCP::Annotations`:
https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/schema/2025-11-25/schema.ts#L1701-L1736

It also adds a `to_h` method for serialization and includes comprehensive test coverage.

NOTE: This code is unused within the ruby-sdk repository, but it is kept for compatibility, as it may be used by users.
2026-02-03 15:38:04 +09:00
Koichi ITO
1c449ae549 [Doc] Add tool_arguments to instrumentation callback documentation
Follow-up to #218, which added the `tool_arguments` feature to the instrumentation callback.
This updates README.md to document the new `tool_arguments` key in both instrumentation callback sections,
and removes redundant instrumentation documentation.
2026-01-31 15:47:56 +09:00
Koichi ITO
0ab77c318f
Merge pull request #103 from dak2/support-logging
Add `logging` support
2026-01-30 12:29:29 +09:00
dak2
afa2fb4077 Add logging support
A server can send structured logging messages to the client.
https://modelcontextprotocol.io/specification/2025-06-18/server/utilities/logging#logging

Logging was specified in the 2024-11-05 specification, but since it was not supported in ruby-sdk, I implemented it.
https://modelcontextprotocol.io/specification/2024-11-05/server/utilities/logging

I also made it possible to output a simple notification message in the examples.
2026-01-26 22:23:46 +09:00
Koichi ITO
05c0119e53 Fix Resource::Embedded not setting @resource in initialize
The `initialize` method was missing the assignment of `@resource`,
causing the resource method to always return `nil` and `to_h` to return
an incorrect hash with an empty resource value.

Added comprehensive tests to verify the fix and prevent regression.
2026-01-26 11:37:33 +09:00
Koichi ITO
5331c237bd [Doc] Acknowledge Shopify in the initial release
The repository's "About" section currently states,
"The official Ruby SDK for the Model Context Protocol. Maintained in collaboration with Shopify."
However, now that MCP governance has been established, maintenance is handled by the MCP steering group.

Given this, it seems more accurate to remove the maintenance wording from the "About" section.
That said, I think it would be good to preserve acknowledgment of Shopify, which originally developed and released the Ruby SDK.

There may be a more appropriate place for this, but at the very least, it could be recorded in the changelog as part of the project's history.
2026-01-25 16:11:27 +09:00
Koichi ITO
3addc525df
Merge pull request #218 from chattermill/add-tool-arguments-to-instrumentation
Add Tool Arguments to Instrumentation Data
2026-01-23 01:11:28 +09:00
Mikhail Dubov
7412197e52 feat: add tool_arguments to instrumentation data
Include the tool arguments in instrumentation callback data when
tools/call is invoked. This allows consumers to track which arguments
were passed to each tool call for analytics and debugging purposes.
2026-01-21 17:18:28 +00:00