Class: MCP::ServerContext

Inherits:
Object
  • Object
show all
Defined in:
lib/mcp/server_context.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context, progress:, notification_target:, related_request_id: nil, cancellation: nil) ⇒ ServerContext

Returns a new instance of ServerContext.



7
8
9
10
11
12
13
# File 'lib/mcp/server_context.rb', line 7

def initialize(context, progress:, notification_target:, related_request_id: nil, cancellation: nil)
  @context = context
  @progress = progress
  @notification_target = notification_target
  @related_request_id = related_request_id
  @cancellation = cancellation
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, **kwargs, &block) ⇒ Object

Forward arguments explicitly with *args, **kwargs, &block rather than the ... forwarding syntax. The gem supports Ruby 2.7.0 (see required_ruby_version), but RuboCop's Parser backend only runs on Ruby 2.7.8, so leading-argument forwarding like def method_missing(name, ...) is allowed by the linter even though it raises a SyntaxError on Ruby 2.7.0 through 2.7.2 (it was added in Ruby 2.7.3). Explicit forwarding keeps this method loadable on Ruby 2.7.0.



148
149
150
151
152
153
154
# File 'lib/mcp/server_context.rb', line 148

def method_missing(name, *args, **kwargs, &block)
  if @context.respond_to?(name)
    @context.public_send(name, *args, **kwargs, &block)
  else
    super
  end
end

Instance Attribute Details

#cancellationObject (readonly)

Returns the value of attribute cancellation.



5
6
7
# File 'lib/mcp/server_context.rb', line 5

def cancellation
  @cancellation
end

Instance Method Details

#cancelled?Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/mcp/server_context.rb', line 15

def cancelled?
  !!@cancellation&.cancelled?
end

#create_form_elicitation(**kwargs) ⇒ Object

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 elicitation.



110
111
112
113
114
115
116
117
118
# File 'lib/mcp/server_context.rb', line 110

def create_form_elicitation(**kwargs)
  if @notification_target.respond_to?(:create_form_elicitation)
    @notification_target.create_form_elicitation(**kwargs, related_request_id: @related_request_id)
  elsif @context.respond_to?(:create_form_elicitation)
    @context.create_form_elicitation(**kwargs, related_request_id: @related_request_id)
  else
    raise NoMethodError, "undefined method 'create_form_elicitation' for #{self}"
  end
end

#create_sampling_message(**kwargs) ⇒ Object

Deprecated.

MCP Sampling (sampling/createMessage) is deprecated as of MCP protocol version 2026-07-28 (SEP-2577). Use direct LLM provider APIs instead.

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.



97
98
99
100
101
102
103
104
105
# File 'lib/mcp/server_context.rb', line 97

def create_sampling_message(**kwargs)
  if @notification_target.respond_to?(:create_sampling_message)
    @notification_target.create_sampling_message(**kwargs, related_request_id: @related_request_id)
  elsif @context.respond_to?(:create_sampling_message)
    @context.create_sampling_message(**kwargs, related_request_id: @related_request_id)
  else
    raise NoMethodError, "undefined method 'create_sampling_message' for #{self}"
  end
end

#create_url_elicitation(**kwargs) ⇒ Object

Delegates to the session so the request is scoped to the originating client. Falls back to @context when @notification_target does not support URL mode elicitation.



122
123
124
125
126
127
128
129
130
# File 'lib/mcp/server_context.rb', line 122

def create_url_elicitation(**kwargs)
  if @notification_target.respond_to?(:create_url_elicitation)
    @notification_target.create_url_elicitation(**kwargs, related_request_id: @related_request_id)
  elsif @context.respond_to?(:create_url_elicitation)
    @context.create_url_elicitation(**kwargs, related_request_id: @related_request_id)
  else
    raise NoMethodError, "undefined method 'create_url_elicitation' for #{self}"
  end
end

#list_rootsObject

Deprecated.

MCP Roots (roots/list and notifications/roots/list_changed) is deprecated as of MCP protocol version 2026-07-28 (SEP-2577). Use tool parameters, resource URIs, server configuration, or environment variables instead.

Delegates to the session so the request is scoped to the originating client.



61
62
63
64
65
66
67
# File 'lib/mcp/server_context.rb', line 61

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

#notify_elicitation_complete(**kwargs) ⇒ Object

Delegates to the session so the notification is scoped to the originating client.



133
134
135
136
137
138
139
140
141
# File 'lib/mcp/server_context.rb', line 133

def notify_elicitation_complete(**kwargs)
  if @notification_target.respond_to?(:notify_elicitation_complete)
    @notification_target.notify_elicitation_complete(**kwargs)
  elsif @context.respond_to?(:notify_elicitation_complete)
    @context.notify_elicitation_complete(**kwargs)
  else
    raise NoMethodError, "undefined method 'notify_elicitation_complete' for #{self}"
  end
end

#notify_log_message(data:, level:, logger: nil) ⇒ Object

Deprecated.

MCP Logging (logging/setLevel and notifications/message) is deprecated as of MCP protocol version 2026-07-28 (SEP-2577). Use stderr or OpenTelemetry instead.

Sends a log message notification scoped to the originating session.

Parameters:

  • data (Object)

    The log data to send.

  • level (String)

    Log level (e.g., "debug", "info", "error").

  • logger (String, nil) (defaults to: nil)

    Logger name.



41
42
43
44
45
# File 'lib/mcp/server_context.rb', line 41

def notify_log_message(data:, level:, logger: nil)
  return unless @notification_target

  @notification_target.notify_log_message(data: data, level: level, logger: logger, related_request_id: @related_request_id)
end

#notify_resources_updated(uri:) ⇒ Object

Sends a resource updated notification scoped to the originating session.

Parameters:

  • uri (String)

    The URI of the updated resource.



50
51
52
53
54
# File 'lib/mcp/server_context.rb', line 50

def notify_resources_updated(uri:)
  return unless @notification_target

  @notification_target.notify_resources_updated(uri: uri)
end

#pingHash

Sends a ping request to the originating client to verify it is still responsive. Per the MCP spec, the client MUST respond promptly with an empty result.

Examples:

def self.call(server_context:)
  server_context.ping # => {}
  # ...
end

Returns:

  • (Hash)

    An empty hash on success.

Raises:

  • (Server::ValidationError)

    If the response result is not a Hash.

  • (NoMethodError)

    If the session does not support sending pings.

See Also:



83
84
85
86
87
88
89
# File 'lib/mcp/server_context.rb', line 83

def ping
  if @notification_target.respond_to?(:ping)
    @notification_target.ping(related_request_id: @related_request_id)
  else
    raise NoMethodError, "undefined method 'ping' for #{self}"
  end
end

#raise_if_cancelled!Object



19
20
21
# File 'lib/mcp/server_context.rb', line 19

def raise_if_cancelled!
  @cancellation&.raise_if_cancelled!
end

#report_progress(progress, total: nil, message: nil) ⇒ Object

Reports progress for the current tool operation. The notification is automatically scoped to the originating session.

Parameters:

  • progress (Numeric)

    Current progress value.

  • total (Numeric, nil) (defaults to: nil)

    Total expected value.

  • message (String, nil) (defaults to: nil)

    Human-readable status message.



29
30
31
# File 'lib/mcp/server_context.rb', line 29

def report_progress(progress, total: nil, message: nil)
  @progress.report(progress, total: total, message: message)
end

#respond_to_missing?(name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


156
157
158
# File 'lib/mcp/server_context.rb', line 156

def respond_to_missing?(name, include_private = false)
  @context.respond_to?(name) || super
end