Class: Html2mdMcpClient::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/html2md_mcp_client/client.rb

Constant Summary collapse

JSONRPC_VERSION =
'2.0'.freeze
PROTOCOL_VERSION =
'2025-03-26'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(transport, client_name: 'html2md_mcp_client', client_version: Html2mdMcpClient::VERSION) ⇒ Client

Returns a new instance of Client.



11
12
13
14
15
16
17
18
# File 'lib/html2md_mcp_client/client.rb', line 11

def initialize(transport, client_name: 'html2md_mcp_client', client_version: Html2mdMcpClient::VERSION)
  @transport = transport
  @client_name = client_name
  @client_version = client_version
  @request_id = 0
  @connected = false
  @tools_cache = nil
end

Instance Attribute Details

#capabilitiesObject (readonly)

Returns the value of attribute capabilities.



9
10
11
# File 'lib/html2md_mcp_client/client.rb', line 9

def capabilities
  @capabilities
end

#server_infoObject (readonly)

Returns the value of attribute server_info.



9
10
11
# File 'lib/html2md_mcp_client/client.rb', line 9

def server_info
  @server_info
end

#transportObject (readonly)

Returns the value of attribute transport.



9
10
11
# File 'lib/html2md_mcp_client/client.rb', line 9

def transport
  @transport
end

Instance Method Details

#call_tool(name, arguments = {}) ⇒ Object

Call a tool. Returns the content array. Raises ToolError if the server signals an error or if text content begins with “Error” (some servers omit the isError flag).



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/html2md_mcp_client/client.rb', line 66

def call_tool(name, arguments = {})
  ensure_connected!
  result = request('tools/call', { name: name, arguments: arguments })

  texts = Array(result['content']).select { |c| c['type'] == 'text' }.map { |c| c['text'] }

  if result['isError'] || texts.any? { |t| t.start_with?('Error') }
    raise ToolError, "Tool '#{name}' error: #{texts.join('; ')}"
  end

  result['content'] || []
end

#connect!Object

— Connection lifecycle —



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/html2md_mcp_client/client.rb', line 22

def connect!
  return self if @connected

  @transport.start if @transport.respond_to?(:start)

  result = request('initialize', {
    protocolVersion: PROTOCOL_VERSION,
    capabilities: {},
    clientInfo: { name: @client_name, version: @client_version }
  })

  @server_info = result['serverInfo']
  @capabilities = result['capabilities'] || {}

  notify('notifications/initialized')
  @connected = true
  self
end

#connected?Boolean

Returns:

  • (Boolean)


48
49
50
# File 'lib/html2md_mcp_client/client.rb', line 48

def connected?
  @connected
end

#disconnect!Object



41
42
43
44
45
46
# File 'lib/html2md_mcp_client/client.rb', line 41

def disconnect!
  return unless @connected
  @transport.close
  @connected = false
  @tools_cache = nil
end

#find_tool(name) ⇒ Object

Find a tool definition by name. Returns nil if not found.



92
93
94
# File 'lib/html2md_mcp_client/client.rb', line 92

def find_tool(name)
  list_tools.find { |t| t['name'] == name }
end

#get_prompt(name, arguments = {}) ⇒ Object



118
119
120
121
# File 'lib/html2md_mcp_client/client.rb', line 118

def get_prompt(name, arguments = {})
  ensure_connected!
  request('prompts/get', { name: name, arguments: arguments })
end

#list_promptsObject

— Prompts —



112
113
114
115
116
# File 'lib/html2md_mcp_client/client.rb', line 112

def list_prompts
  ensure_connected!
  result = request('prompts/list', {})
  result['prompts'] || []
end

#list_resourcesObject

— Resources —



98
99
100
101
102
# File 'lib/html2md_mcp_client/client.rb', line 98

def list_resources
  ensure_connected!
  result = request('resources/list', {})
  result['resources'] || []
end

#list_toolsObject

Returns array of tool definitions: [{ “name” => …, “description” => …, “inputSchema” => … }]



55
56
57
58
59
60
61
# File 'lib/html2md_mcp_client/client.rb', line 55

def list_tools
  ensure_connected!
  @tools_cache ||= begin
    result = request('tools/list', {})
    result['tools'] || []
  end
end

#read_resource(uri) ⇒ Object



104
105
106
107
108
# File 'lib/html2md_mcp_client/client.rb', line 104

def read_resource(uri)
  ensure_connected!
  result = request('resources/read', { uri: uri })
  result['contents'] || []
end

#tool_text(name, arguments = {}) ⇒ Object

Convenience: call a tool and return joined text content. Raises ToolError if no text content is returned.

Raises:



81
82
83
84
85
86
87
88
89
# File 'lib/html2md_mcp_client/client.rb', line 81

def tool_text(name, arguments = {})
  texts = call_tool(name, arguments)
    .select { |c| c['type'] == 'text' }
    .map { |c| c['text'] }

  raise ToolError, "Tool '#{name}' returned no text content" if texts.empty?

  texts.join("\n")
end