Class: MCPClient::Task

Inherits:
Object
  • Object
show all
Defined in:
lib/mcp_client/task.rb

Overview

Represents an MCP Task for long-running operations with progress tracking Tasks follow the MCP 2025-11-25 specification for structured task management

Task states: pending, running, completed, failed, cancelled

Constant Summary collapse

VALID_STATES =

Valid task states

%w[pending running completed failed cancelled].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id:, state: 'pending', progress_token: nil, progress: nil, total: nil, message: nil, result: nil, server: nil) ⇒ Task

Create a new Task

Parameters:

  • id (String)

    unique task identifier

  • state (String) (defaults to: 'pending')

    task state (pending, running, completed, failed, cancelled)

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

    optional token for tracking progress

  • progress (Integer, nil) (defaults to: nil)

    current progress value

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

    total progress value

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

    human-readable status message

  • result (Object, nil) (defaults to: nil)

    task result (when completed)

  • server (MCPClient::ServerBase, nil) (defaults to: nil)

    the server this task belongs to



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/mcp_client/task.rb', line 23

def initialize(id:, state: 'pending', progress_token: nil, progress: nil, total: nil,
               message: nil, result: nil, server: nil)
  validate_state!(state)
  @id = id
  @state = state
  @progress_token = progress_token
  @progress = progress
  @total = total
  @message = message
  @result = result
  @server = server
end

Instance Attribute Details

#idObject (readonly)

Returns the value of attribute id.



12
13
14
# File 'lib/mcp_client/task.rb', line 12

def id
  @id
end

#messageObject (readonly)

Returns the value of attribute message.



12
13
14
# File 'lib/mcp_client/task.rb', line 12

def message
  @message
end

#progressObject (readonly)

Returns the value of attribute progress.



12
13
14
# File 'lib/mcp_client/task.rb', line 12

def progress
  @progress
end

#progress_tokenObject (readonly)

Returns the value of attribute progress_token.



12
13
14
# File 'lib/mcp_client/task.rb', line 12

def progress_token
  @progress_token
end

#resultObject (readonly)

Returns the value of attribute result.



12
13
14
# File 'lib/mcp_client/task.rb', line 12

def result
  @result
end

#serverObject (readonly)

Returns the value of attribute server.



12
13
14
# File 'lib/mcp_client/task.rb', line 12

def server
  @server
end

#stateObject (readonly)

Returns the value of attribute state.



12
13
14
# File 'lib/mcp_client/task.rb', line 12

def state
  @state
end

#totalObject (readonly)

Returns the value of attribute total.



12
13
14
# File 'lib/mcp_client/task.rb', line 12

def total
  @total
end

Class Method Details

.from_json(json, server: nil) ⇒ Task

Create a Task from a JSON hash

Parameters:

  • json (Hash)

    the JSON hash with task fields

  • server (MCPClient::ServerBase, nil) (defaults to: nil)

    optional server reference

Returns:



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/mcp_client/task.rb', line 40

def self.from_json(json, server: nil)
  new(
    id: json['id'] || json[:id],
    state: json['state'] || json[:state] || 'pending',
    progress_token: json['progressToken'] || json[:progressToken] || json[:progress_token],
    progress: json['progress'] || json[:progress],
    total: json['total'] || json[:total],
    message: json['message'] || json[:message],
    result: json.key?('result') ? json['result'] : json[:result],
    server: server
  )
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?

Check equality



92
93
94
95
96
# File 'lib/mcp_client/task.rb', line 92

def ==(other)
  return false unless other.is_a?(Task)

  id == other.id && state == other.state
end

#active?Boolean

Check if task is still active (pending or running)

Returns:

  • (Boolean)


79
80
81
# File 'lib/mcp_client/task.rb', line 79

def active?
  %w[pending running].include?(@state)
end

#hashObject



100
101
102
# File 'lib/mcp_client/task.rb', line 100

def hash
  [id, state].hash
end

#inspectObject



112
113
114
# File 'lib/mcp_client/task.rb', line 112

def inspect
  "#<MCPClient::Task id=#{@id.inspect} state=#{@state.inspect}>"
end

#progress_percentageFloat?

Calculate progress percentage

Returns:

  • (Float, nil)

    percentage (0.0-100.0) or nil if progress info unavailable



85
86
87
88
89
# File 'lib/mcp_client/task.rb', line 85

def progress_percentage
  return nil unless @progress && @total&.positive?

  (@progress.to_f / @total * 100).round(2)
end

#terminal?Boolean

Check if task is in a terminal state

Returns:

  • (Boolean)


73
74
75
# File 'lib/mcp_client/task.rb', line 73

def terminal?
  %w[completed failed cancelled].include?(@state)
end

#to_hHash

Convert to JSON-serializable hash

Returns:

  • (Hash)


55
56
57
58
59
60
61
62
63
# File 'lib/mcp_client/task.rb', line 55

def to_h
  result = { 'id' => @id, 'state' => @state }
  result['progressToken'] = @progress_token if @progress_token
  result['progress'] = @progress if @progress
  result['total'] = @total if @total
  result['message'] = @message if @message
  result['result'] = @result unless @result.nil?
  result
end

#to_jsonString

Convert to JSON string

Returns:

  • (String)


67
68
69
# File 'lib/mcp_client/task.rb', line 67

def to_json(*)
  to_h.to_json(*)
end

#to_sObject

String representation



105
106
107
108
109
110
# File 'lib/mcp_client/task.rb', line 105

def to_s
  parts = ["Task[#{@id}]: #{@state}"]
  parts << "(#{@progress}/#{@total})" if @progress && @total
  parts << "- #{@message}" if @message
  parts.join(' ')
end