Class: MCPClient::Tool

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

Overview

Representation of an MCP tool

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name:, description:, schema:, title: nil, output_schema: nil, annotations: nil, server: nil, task_support: nil) ⇒ Tool

Initialize a new Tool

Parameters:

  • name (String)

    the name of the tool

  • description (String)

    the description of the tool

  • schema (Hash)

    the JSON schema for the tool inputs

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

    optional human-readable name of the tool for display purposes

  • output_schema (Hash, nil) (defaults to: nil)

    optional JSON schema for structured tool outputs (MCP 2025-06-18)

  • annotations (Hash, nil) (defaults to: nil)

    optional annotations describing tool behavior

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

    the server this tool belongs to

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

    execution.taskSupport value (MCP 2025-11-25)



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/mcp_client/tool.rb', line 34

def initialize(name:, description:, schema:, title: nil, output_schema: nil, annotations: nil, server: nil,
               task_support: nil)
  @name = name
  @title = title
  @description = description
  @schema = schema
  @output_schema = output_schema
  @annotations = annotations
  @server = server
  @task_support = task_support
end

Instance Attribute Details

#annotationsHash? (readonly)

Returns optional annotations describing tool behavior (e.g., readOnly, destructive).

Returns:

  • (Hash, nil)

    optional annotations describing tool behavior (e.g., readOnly, destructive)



23
# File 'lib/mcp_client/tool.rb', line 23

attr_reader :name, :title, :description, :schema, :output_schema, :annotations, :server, :task_support

#descriptionString (readonly)

Returns the description of the tool.

Returns:

  • (String)

    the description of the tool



23
# File 'lib/mcp_client/tool.rb', line 23

attr_reader :name, :title, :description, :schema, :output_schema, :annotations, :server, :task_support

#nameString (readonly)

Returns the name of the tool.

Returns:

  • (String)

    the name of the tool



23
24
25
# File 'lib/mcp_client/tool.rb', line 23

def name
  @name
end

#output_schemaHash? (readonly)

Returns optional JSON schema for structured tool outputs (MCP 2025-06-18).

Returns:

  • (Hash, nil)

    optional JSON schema for structured tool outputs (MCP 2025-06-18)



23
# File 'lib/mcp_client/tool.rb', line 23

attr_reader :name, :title, :description, :schema, :output_schema, :annotations, :server, :task_support

#schemaHash (readonly)

Returns the JSON schema for the tool inputs.

Returns:

  • (Hash)

    the JSON schema for the tool inputs



23
# File 'lib/mcp_client/tool.rb', line 23

attr_reader :name, :title, :description, :schema, :output_schema, :annotations, :server, :task_support

#serverMCPClient::ServerBase? (readonly)

Returns the server this tool belongs to.

Returns:



23
# File 'lib/mcp_client/tool.rb', line 23

attr_reader :name, :title, :description, :schema, :output_schema, :annotations, :server, :task_support

#task_supportObject (readonly)

Returns the value of attribute task_support.



23
# File 'lib/mcp_client/tool.rb', line 23

attr_reader :name, :title, :description, :schema, :output_schema, :annotations, :server, :task_support

#titleString? (readonly)

Returns optional human-readable name of the tool for display purposes.

Returns:

  • (String, nil)

    optional human-readable name of the tool for display purposes



23
# File 'lib/mcp_client/tool.rb', line 23

attr_reader :name, :title, :description, :schema, :output_schema, :annotations, :server, :task_support

Class Method Details

.from_json(data, server: nil) ⇒ MCPClient::Tool

Create a Tool instance from JSON data

Parameters:

  • data (Hash)

    JSON data from MCP server

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

    the server this tool belongs to

Returns:



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/mcp_client/tool.rb', line 50

def self.from_json(data, server: nil)
  # Some servers (Playwright MCP CLI) use 'inputSchema' instead of 'schema'
  # Handle both string and symbol keys
  schema = data['inputSchema'] || data[:inputSchema] || data['schema'] || data[:schema]
  output_schema = data['outputSchema'] || data[:outputSchema]
  annotations = data['annotations'] || data[:annotations]
  title = data['title'] || data[:title]
  execution = data['execution'] || data[:execution]
  task_support = execution && (execution['taskSupport'] || execution[:taskSupport])
  new(
    name: data['name'] || data[:name],
    description: data['description'] || data[:description],
    schema: schema,
    title: title,
    output_schema: output_schema,
    annotations: annotations,
    server: server,
    task_support: task_support
  )
end

Instance Method Details

#destructive?Boolean

Check if the tool is marked as destructive (legacy annotation field)

Returns:

  • (Boolean)

    true if the tool is destructive

See Also:



114
115
116
# File 'lib/mcp_client/tool.rb', line 114

def destructive?
  !!(@annotations && @annotations['destructive'] == true)
end

#destructive_hint?Boolean

Check the destructiveHint annotation (MCP 2025-11-25) When true, the tool may perform destructive updates. Only meaningful when readOnlyHint is false. Per the MCP ToolAnnotations schema the default is true, i.e. a non-read-only tool without this hint is assumed to be potentially destructive.

Returns:

  • (Boolean)

    defaults to true when not specified



141
142
143
144
145
# File 'lib/mcp_client/tool.rb', line 141

def destructive_hint?
  return true unless @annotations

  fetch_annotation_hint('destructiveHint', :destructiveHint, true)
end

#idempotent_hint?Boolean

Check the idempotentHint annotation (MCP 2025-11-25) When true, calling the tool repeatedly with the same arguments has no additional effect. Only meaningful when readOnlyHint is false.

Returns:

  • (Boolean)

    defaults to false when not specified



151
152
153
154
155
# File 'lib/mcp_client/tool.rb', line 151

def idempotent_hint?
  return false unless @annotations

  fetch_annotation_hint('idempotentHint', :idempotentHint, false)
end

#open_world_hint?Boolean

Check the openWorldHint annotation (MCP 2025-11-25) When true, the tool may interact with the "open world" (external entities).

Returns:

  • (Boolean)

    defaults to true when not specified



160
161
162
163
164
# File 'lib/mcp_client/tool.rb', line 160

def open_world_hint?
  return true unless @annotations

  fetch_annotation_hint('openWorldHint', :openWorldHint, true)
end

#read_only?Boolean

Check if the tool is marked as read-only (legacy annotation field)

Returns:

  • (Boolean)

    true if the tool is read-only

See Also:



107
108
109
# File 'lib/mcp_client/tool.rb', line 107

def read_only?
  !!(@annotations && @annotations['readOnly'] == true)
end

#read_only_hint?Boolean

Check the readOnlyHint annotation (MCP 2025-11-25) When true, the tool does not modify its environment. Per the MCP ToolAnnotations schema the default is false, i.e. a tool without this hint is assumed to potentially modify its environment.

Returns:

  • (Boolean)

    defaults to false when not specified



129
130
131
132
133
# File 'lib/mcp_client/tool.rb', line 129

def read_only_hint?
  return false unless @annotations

  fetch_annotation_hint('readOnlyHint', :readOnlyHint, false)
end

#requires_confirmation?Boolean

Check if the tool requires confirmation before execution

Returns:

  • (Boolean)

    true if the tool requires confirmation



120
121
122
# File 'lib/mcp_client/tool.rb', line 120

def requires_confirmation?
  !!(@annotations && @annotations['requiresConfirmation'] == true)
end

#structured_output?Boolean

Check if the tool supports structured outputs (MCP 2025-06-18)

Returns:

  • (Boolean)

    true if the tool has an output schema defined



168
169
170
# File 'lib/mcp_client/tool.rb', line 168

def structured_output?
  !@output_schema.nil? && !@output_schema.empty?
end

#supports_task?Boolean

Whether task-augmented execution is allowed for this tool (MCP 2025-11-25). True when execution.taskSupport is 'optional' or 'required'.

Returns:

  • (Boolean)


175
176
177
# File 'lib/mcp_client/tool.rb', line 175

def supports_task?
  %w[optional required].include?(@task_support)
end

#task_forbidden?Boolean

Whether task-augmented execution is forbidden (the default when unset)

Returns:

  • (Boolean)


193
194
195
# File 'lib/mcp_client/tool.rb', line 193

def task_forbidden?
  @task_support.nil? || @task_support == 'forbidden'
end

#task_optional?Boolean

Whether task-augmented execution is optional for this tool

Returns:

  • (Boolean)


187
188
189
# File 'lib/mcp_client/tool.rb', line 187

def task_optional?
  @task_support == 'optional'
end

#task_required?Boolean

Whether task-augmented execution is required for this tool

Returns:

  • (Boolean)


181
182
183
# File 'lib/mcp_client/tool.rb', line 181

def task_required?
  @task_support == 'required'
end

#to_anthropic_toolHash

Convert tool to Anthropic Claude tool specification format

Returns:

  • (Hash)

    Anthropic Claude tool specification with cleaned schema



86
87
88
89
90
91
92
# File 'lib/mcp_client/tool.rb', line 86

def to_anthropic_tool
  {
    name: @name,
    description: @description,
    input_schema: cleaned_schema(@schema)
  }
end

#to_google_toolHash

Convert tool to Google Vertex AI tool specification format

Returns:

  • (Hash)

    Google Vertex AI tool specification with cleaned schema



96
97
98
99
100
101
102
# File 'lib/mcp_client/tool.rb', line 96

def to_google_tool
  {
    name: @name,
    description: @description,
    parameters: cleaned_schema(@schema)
  }
end

#to_openai_toolHash

Convert tool to OpenAI function specification format

Returns:

  • (Hash)

    OpenAI function specification



73
74
75
76
77
78
79
80
81
82
# File 'lib/mcp_client/tool.rb', line 73

def to_openai_tool
  {
    type: 'function',
    function: {
      name: @name,
      description: @description,
      parameters: @schema
    }
  }
end