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) ⇒ 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



30
31
32
33
34
35
36
37
38
# File 'lib/mcp_client/tool.rb', line 30

def initialize(name:, description:, schema:, title: nil, output_schema: nil, annotations: nil, server: nil)
  @name = name
  @title = title
  @description = description
  @schema = schema
  @output_schema = output_schema
  @annotations = annotations
  @server = server
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)



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

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

#descriptionString (readonly)

Returns the description of the tool.

Returns:

  • (String)

    the description of the tool



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

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

#nameString (readonly)

Returns the name of the tool.

Returns:

  • (String)

    the name of the tool



20
21
22
# File 'lib/mcp_client/tool.rb', line 20

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)



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

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

#schemaHash (readonly)

Returns the JSON schema for the tool inputs.

Returns:

  • (Hash)

    the JSON schema for the tool inputs



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

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

#serverObject (readonly)

Returns the value of attribute server.



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

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

#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



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

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

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:



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/mcp_client/tool.rb', line 44

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]
  new(
    name: data['name'] || data[:name],
    description: data['description'] || data[:description],
    schema: schema,
    title: title,
    output_schema: output_schema,
    annotations: annotations,
    server: server
  )
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:



105
106
107
# File 'lib/mcp_client/tool.rb', line 105

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.

Returns:

  • (Boolean)

    defaults to false when not specified



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

def destructive_hint?
  return false unless @annotations

  fetch_annotation_hint('destructiveHint', :destructiveHint, false)
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



138
139
140
141
142
# File 'lib/mcp_client/tool.rb', line 138

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



147
148
149
150
151
# File 'lib/mcp_client/tool.rb', line 147

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:



98
99
100
# File 'lib/mcp_client/tool.rb', line 98

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.

Returns:

  • (Boolean)

    defaults to true when not specified



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

def read_only_hint?
  return true unless @annotations

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

#requires_confirmation?Boolean

Check if the tool requires confirmation before execution

Returns:

  • (Boolean)

    true if the tool requires confirmation



111
112
113
# File 'lib/mcp_client/tool.rb', line 111

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



155
156
157
# File 'lib/mcp_client/tool.rb', line 155

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

#to_anthropic_toolHash

Convert tool to Anthropic Claude tool specification format

Returns:

  • (Hash)

    Anthropic Claude tool specification with cleaned schema



77
78
79
80
81
82
83
# File 'lib/mcp_client/tool.rb', line 77

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



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

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



64
65
66
67
68
69
70
71
72
73
# File 'lib/mcp_client/tool.rb', line 64

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