Module: ModelContextProtocol::Server::Cancellable

Included in:
Prompt, Resource, Tool
Defined in:
lib/model_context_protocol/server/cancellable.rb

Defined Under Namespace

Classes: CancellationError

Instance Method Summary collapse

Instance Method Details

#cancellable(interval: 0.1) { ... } ⇒ Object

Execute a block with automatic cancellation support for blocking I/O operations. This method uses Concurrent::TimerTask to poll for cancellation every 100ms and can interrupt even blocking operations like HTTP requests or database queries.

Examples:

cancellable do
  response = Net::HTTP.get(URI('https://slow-api.example.com'))
  process_response(response)
end

Parameters:

  • interval (Float) (defaults to: 0.1)

    polling interval in seconds (default: 0.1)

Yields:

  • block to execute with cancellation support

Returns:

  • (Object)

    the result of the block

Raises:



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/model_context_protocol/server/cancellable.rb', line 22

def cancellable(interval: 0.1, &block)
  context = Thread.current[:mcp_context]
  executing_thread = Concurrent::AtomicReference.new(nil)

  timer_task = Concurrent::TimerTask.new(execution_interval: interval) do
    if context && context[:request_store] && context[:request_id]
      if context[:request_store].cancelled?(context[:request_id])
        thread = executing_thread.get
        thread&.raise(CancellationError, "Request was cancelled") if thread&.alive?
      end
    end
  end

  begin
    executing_thread.set(Thread.current)

    if context && context[:request_store] && context[:request_id]
      if context[:request_store].cancelled?(context[:request_id])
        raise CancellationError, "Request #{context[:request_id]} was cancelled"
      end
    end

    timer_task.execute

    result = block.call
    result
  ensure
    executing_thread.set(nil)
    timer_task&.shutdown if timer_task&.running?
  end
end