Class: MCPClient::Tool
- Inherits:
-
Object
- Object
- MCPClient::Tool
- Defined in:
- lib/mcp_client/tool.rb
Overview
Representation of an MCP tool
Instance Attribute Summary collapse
-
#annotations ⇒ Hash?
readonly
Optional annotations describing tool behavior (e.g., readOnly, destructive).
-
#description ⇒ String
readonly
The description of the tool.
-
#name ⇒ String
readonly
The name of the tool.
-
#output_schema ⇒ Hash?
readonly
Optional JSON schema for structured tool outputs (MCP 2025-06-18).
-
#schema ⇒ Hash
readonly
The JSON schema for the tool inputs.
-
#server ⇒ MCPClient::ServerBase?
readonly
The server this tool belongs to.
-
#task_support ⇒ Object
readonly
Returns the value of attribute task_support.
-
#title ⇒ String?
readonly
Optional human-readable name of the tool for display purposes.
Class Method Summary collapse
-
.from_json(data, server: nil) ⇒ MCPClient::Tool
Create a Tool instance from JSON data.
Instance Method Summary collapse
-
#destructive? ⇒ Boolean
Check if the tool is marked as destructive (legacy annotation field).
-
#destructive_hint? ⇒ Boolean
Check the destructiveHint annotation (MCP 2025-11-25) When true, the tool may perform destructive updates.
-
#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.
-
#initialize(name:, description:, schema:, title: nil, output_schema: nil, annotations: nil, server: nil, task_support: nil) ⇒ Tool
constructor
Initialize a new Tool.
-
#open_world_hint? ⇒ Boolean
Check the openWorldHint annotation (MCP 2025-11-25) When true, the tool may interact with the "open world" (external entities).
-
#read_only? ⇒ Boolean
Check if the tool is marked as read-only (legacy annotation field).
-
#read_only_hint? ⇒ Boolean
Check the readOnlyHint annotation (MCP 2025-11-25) When true, the tool does not modify its environment.
-
#requires_confirmation? ⇒ Boolean
Check if the tool requires confirmation before execution.
-
#structured_output? ⇒ Boolean
Check if the tool supports structured outputs (MCP 2025-06-18).
-
#supports_task? ⇒ Boolean
Whether task-augmented execution is allowed for this tool (MCP 2025-11-25).
-
#task_forbidden? ⇒ Boolean
Whether task-augmented execution is forbidden (the default when unset).
-
#task_optional? ⇒ Boolean
Whether task-augmented execution is optional for this tool.
-
#task_required? ⇒ Boolean
Whether task-augmented execution is required for this tool.
-
#to_anthropic_tool ⇒ Hash
Convert tool to Anthropic Claude tool specification format.
-
#to_google_tool ⇒ Hash
Convert tool to Google Vertex AI tool specification format.
-
#to_openai_tool ⇒ Hash
Convert tool to OpenAI function specification format.
Constructor Details
#initialize(name:, description:, schema:, title: nil, output_schema: nil, annotations: nil, server: nil, task_support: nil) ⇒ Tool
Initialize a new Tool
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
#annotations ⇒ Hash? (readonly)
Returns 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 |
#description ⇒ String (readonly)
Returns 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 |
#name ⇒ String (readonly)
Returns the name of the tool.
23 24 25 |
# File 'lib/mcp_client/tool.rb', line 23 def name @name end |
#output_schema ⇒ Hash? (readonly)
Returns 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 |
#schema ⇒ Hash (readonly)
Returns 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 |
#server ⇒ MCPClient::ServerBase? (readonly)
Returns the server this tool belongs to.
23 |
# File 'lib/mcp_client/tool.rb', line 23 attr_reader :name, :title, :description, :schema, :output_schema, :annotations, :server, :task_support |
#task_support ⇒ Object (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 |
#title ⇒ String? (readonly)
Returns 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
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)
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.
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.
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).
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)
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.
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
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)
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'.
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)
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
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
181 182 183 |
# File 'lib/mcp_client/tool.rb', line 181 def task_required? @task_support == 'required' end |
#to_anthropic_tool ⇒ Hash
Convert tool to Anthropic Claude tool specification format
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_tool ⇒ Hash
Convert tool to Google Vertex AI tool specification format
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_tool ⇒ Hash
Convert tool to OpenAI function specification format
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 |