Merge pull request #315 from koic/support_roots
Add `roots/list` and `notifications/roots/list_changed` support
This commit is contained in:
commit
7b5533c809
4 changed files with 324 additions and 8 deletions
|
|
@ -73,14 +73,12 @@ module MCP
|
|||
require_capability!(method, capabilities, :completions)
|
||||
when ROOTS_LIST
|
||||
require_capability!(method, capabilities, :roots)
|
||||
when NOTIFICATIONS_ROOTS_LIST_CHANGED
|
||||
require_capability!(method, capabilities, :roots)
|
||||
require_capability!(method, capabilities, :roots, :listChanged)
|
||||
when SAMPLING_CREATE_MESSAGE
|
||||
require_capability!(method, capabilities, :sampling)
|
||||
when ELICITATION_CREATE
|
||||
require_capability!(method, capabilities, :elicitation)
|
||||
when INITIALIZE, PING, NOTIFICATIONS_INITIALIZED, NOTIFICATIONS_PROGRESS, NOTIFICATIONS_CANCELLED, NOTIFICATIONS_ELICITATION_COMPLETE
|
||||
when INITIALIZE, PING, NOTIFICATIONS_INITIALIZED, NOTIFICATIONS_ROOTS_LIST_CHANGED,
|
||||
NOTIFICATIONS_PROGRESS, NOTIFICATIONS_CANCELLED, NOTIFICATIONS_ELICITATION_COMPLETE
|
||||
# No specific capability required.
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@ module MCP
|
|||
Methods::PING => ->(_) { {} },
|
||||
Methods::NOTIFICATIONS_INITIALIZED => ->(_) {},
|
||||
Methods::NOTIFICATIONS_PROGRESS => ->(_) {},
|
||||
Methods::NOTIFICATIONS_ROOTS_LIST_CHANGED => ->(_) {},
|
||||
Methods::COMPLETION_COMPLETE => ->(_) { DEFAULT_COMPLETION_RESULT },
|
||||
Methods::LOGGING_SET_LEVEL => method(:configure_logging_level),
|
||||
|
||||
|
|
@ -218,6 +219,14 @@ module MCP
|
|||
report_exception(e, { notification: "log_message" })
|
||||
end
|
||||
|
||||
# Sets a handler for `notifications/roots/list_changed` notifications.
|
||||
# Called when a client notifies the server that its filesystem roots have changed.
|
||||
#
|
||||
# @yield [params] The notification params (typically `nil`).
|
||||
def roots_list_changed_handler(&block)
|
||||
@handlers[Methods::NOTIFICATIONS_ROOTS_LIST_CHANGED] = block
|
||||
end
|
||||
|
||||
# Sets a custom handler for `resources/read` requests.
|
||||
# The block receives the parsed request params and should return resource
|
||||
# contents. The return value is set as the `contents` field of the response.
|
||||
|
|
|
|||
|
|
@ -30,6 +30,15 @@ module MCP
|
|||
@notification_target.notify_log_message(data: data, level: level, logger: logger, related_request_id: @related_request_id)
|
||||
end
|
||||
|
||||
# Delegates to the session so the request is scoped to the originating client.
|
||||
def list_roots
|
||||
if @notification_target.respond_to?(:list_roots)
|
||||
@notification_target.list_roots(related_request_id: @related_request_id)
|
||||
else
|
||||
raise NoMethodError, "undefined method 'list_roots' for #{self}"
|
||||
end
|
||||
end
|
||||
|
||||
# Delegates to the session so the request is scoped to the originating client.
|
||||
# Falls back to `@context` (via `method_missing`) when `@notification_target`
|
||||
# does not support sampling.
|
||||
|
|
|
|||
|
|
@ -41,6 +41,15 @@ module MCP
|
|||
@client_capabilities || @server.client_capabilities
|
||||
end
|
||||
|
||||
# Sends a `roots/list` request scoped to this session.
|
||||
def list_roots(related_request_id: nil)
|
||||
unless client_capabilities&.dig(:roots)
|
||||
raise "Client does not support roots."
|
||||
end
|
||||
|
||||
send_to_transport_request(Methods::ROOTS_LIST, nil, related_request_id: related_request_id)
|
||||
end
|
||||
|
||||
# Sends a `sampling/createMessage` request scoped to this session.
|
||||
def create_sampling_message(related_request_id: nil, **kwargs)
|
||||
params = @server.build_sampling_params(client_capabilities, **kwargs)
|
||||
|
|
|
|||
Loading…
Reference in a new issue