Support resource subscriptions per MCP specification
## Motivation and Context The MCP specification defines `resources/subscribe`, `resources/unsubscribe`, and `notifications/resources/updated` for clients to monitor resource changes: https://modelcontextprotocol.io/specification/2025-03-26/server/resources#subscriptions The Ruby SDK had stub (no-op) handlers but provided no way for server developers to customize subscription behavior or send update notifications. Following the Python SDK approach, the SDK does not track subscription state internally. Server developers register handler blocks and manage their own subscription state, allowing flexibility for different subscription semantics (per-session tracking, persistence, debouncing, etc.). Three methods are added: - `Server#resources_subscribe_handler`: registers a handler for `resources/subscribe` requests - `Server#resources_unsubscribe_handler`: registers a handler for `resources/unsubscribe` requests - `ServerSession#notify_resources_updated`: sends a `notifications/resources/updated` notification to the subscribing client `ServerContext#notify_resources_updated` is also added so that tool handlers can send the notification scoped to the originating session. ## How Has This Been Tested? All tests pass (`rake test`), RuboCop is clean. New tests cover custom handler registration for `resources/subscribe` and `resources/unsubscribe`, session-scoped `notify_resources_updated` notifications, error handling, and `ServerContext` delegation. ## Breaking Changes None.
This commit is contained in:
parent
e73c444aad
commit
d80fba4fbc
1 changed files with 176 additions and 8 deletions
44
README.md
44
README.md
|
|
@ -53,6 +53,8 @@ It implements the Model Context Protocol specification, handling model context r
|
|||
- `resources/list` - Lists all registered resources and their schemas
|
||||
- `resources/read` - Retrieves a specific resource by name
|
||||
- `resources/templates/list` - Lists all registered resource templates and their schemas
|
||||
- `resources/subscribe` - Subscribes to updates for a specific resource
|
||||
- `resources/unsubscribe` - Unsubscribes from updates for a specific resource
|
||||
- `completion/complete` - Returns autocompletion suggestions for prompt arguments and resource URIs
|
||||
- `roots/list` - Requests filesystem roots from the client (server-to-client)
|
||||
- `sampling/createMessage` - Requests LLM completion from the client (server-to-client)
|
||||
|
|
@ -958,6 +960,44 @@ end
|
|||
- Raises `RuntimeError` if client does not support `roots` capability
|
||||
- Raises `StandardError` if client returns an error response
|
||||
|
||||
### Resource Subscriptions
|
||||
|
||||
Resource subscriptions allow clients to monitor specific resources for changes.
|
||||
When a subscribed resource is updated, the server sends a notification to the client.
|
||||
|
||||
The SDK does not track subscription state internally.
|
||||
Server developers register handlers and manage their own subscription state.
|
||||
Three methods are provided:
|
||||
|
||||
- `Server#resources_subscribe_handler` - registers a handler for `resources/subscribe` requests
|
||||
- `Server#resources_unsubscribe_handler` - registers a handler for `resources/unsubscribe` requests
|
||||
- `ServerContext#notify_resources_updated` - sends a `notifications/resources/updated` notification to the subscribing client
|
||||
|
||||
```ruby
|
||||
subscribed_uris = Set.new
|
||||
|
||||
server = MCP::Server.new(
|
||||
name: "my_server",
|
||||
resources: [my_resource],
|
||||
capabilities: { resources: { subscribe: true } },
|
||||
)
|
||||
|
||||
server.resources_subscribe_handler do |params|
|
||||
subscribed_uris.add(params[:uri].to_s)
|
||||
end
|
||||
|
||||
server.resources_unsubscribe_handler do |params|
|
||||
subscribed_uris.delete(params[:uri].to_s)
|
||||
end
|
||||
|
||||
server.define_tool(name: "update_resource") do |server_context:, **args|
|
||||
if subscribed_uris.include?("test://my-resource")
|
||||
server_context.notify_resources_updated(uri: "test://my-resource")
|
||||
end
|
||||
MCP::Tool::Response.new([MCP::Content::Text.new("Resource updated").to_h])
|
||||
end
|
||||
```
|
||||
|
||||
### Sampling
|
||||
|
||||
The Model Context Protocol allows servers to request LLM completions from clients through the `sampling/createMessage` method.
|
||||
|
|
@ -1503,10 +1543,6 @@ end
|
|||
- Raises `MCP::Server::MethodAlreadyDefinedError` if trying to override an existing method
|
||||
- Supports the same exception reporting and instrumentation as standard methods
|
||||
|
||||
### Unsupported Features (to be implemented in future versions)
|
||||
|
||||
- Resource subscriptions
|
||||
|
||||
## Building an MCP Client
|
||||
|
||||
The `MCP::Client` class provides an interface for interacting with MCP servers.
|
||||
|
|
|
|||
Loading…
Reference in a new issue