-
Notifications
You must be signed in to change notification settings - Fork 110
Expand file tree
/
Copy pathhttp_client.rb
More file actions
184 lines (143 loc) · 3.98 KB
/
http_client.rb
File metadata and controls
184 lines (143 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# frozen_string_literal: true
require "net/http"
require "json"
require "uri"
# Simple HTTP client example for interacting with the MCP HTTP server
class MCPHTTPClient
def initialize(base_url = "http://localhost:9292")
@base_url = base_url
@session_id = nil
end
def send_request(method, params = nil, id = nil)
uri = URI(@base_url)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.path.empty? ? "/" : uri.path)
request["Content-Type"] = "application/json"
request["Mcp-Session-Id"] = @session_id if @session_id
body = {
jsonrpc: "2.0",
method: method,
params: params,
id: id || rand(10000),
}.compact
request.body = body.to_json
response = http.request(request)
# Store session ID if provided
if response["Mcp-Session-Id"]
@session_id = response["Mcp-Session-Id"]
puts "Session ID: #{@session_id}"
end
JSON.parse(response.body)
end
def initialize_session
puts "=== Initializing session ==="
result = send_request("initialize", {
protocolVersion: "2024-11-05",
capabilities: {},
clientInfo: {
name: "example_client",
version: "1.0",
},
})
puts "Response: #{JSON.pretty_generate(result)}"
result
end
def ping
puts "=== Sending ping ==="
result = send_request("ping")
puts "Response: #{JSON.pretty_generate(result)}"
result
end
def list_tools
puts "=== Listing tools ==="
result = send_request("tools/list")
puts "Response: #{JSON.pretty_generate(result)}"
result
end
def call_tool(name, arguments)
puts "=== Calling tool: #{name} ==="
result = send_request("tools/call", {
name: name,
arguments: arguments,
})
puts "Response: #{JSON.pretty_generate(result)}"
result
end
def list_prompts
puts "=== Listing prompts ==="
result = send_request("prompts/list")
puts "Response: #{JSON.pretty_generate(result)}"
result
end
def get_prompt(name, arguments)
puts "=== Getting prompt: #{name} ==="
result = send_request("prompts/get", {
name: name,
arguments: arguments,
})
puts "Response: #{JSON.pretty_generate(result)}"
result
end
def list_resources
puts "=== Listing resources ==="
result = send_request("resources/list")
puts "Response: #{JSON.pretty_generate(result)}"
result
end
def read_resource(uri)
puts "=== Reading resource: #{uri} ==="
result = send_request("resources/read", {
uri: uri,
})
puts "Response: #{JSON.pretty_generate(result)}"
result
end
def close_session
return unless @session_id
puts "=== Closing session ==="
uri = URI(@base_url)
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Delete.new(uri.path.empty? ? "/" : uri.path)
request["Mcp-Session-Id"] = @session_id
response = http.request(request)
result = JSON.parse(response.body)
puts "Response: #{JSON.pretty_generate(result)}"
@session_id = nil
result
end
end
# Main script
if __FILE__ == $PROGRAM_NAME
puts <<~MESSAGE
MCP HTTP Client Example
Make sure the HTTP server is running (ruby examples/http_server.rb)
#{"=" * 50}
MESSAGE
client = MCPHTTPClient.new
begin
# Initialize session
client.initialize_session
# Test ping
client.ping
# List available tools
client.list_tools
# Call the example_tool (note: snake_case name)
client.call_tool("example_tool", { a: 5, b: 3 })
# Call the echo tool
client.call_tool("echo", { message: "Hello from client!" })
# List prompts
client.list_prompts
# Get a prompt (note: snake_case name)
client.get_prompt("example_prompt", { message: "This is a test message" })
# List resources
client.list_resources
# Read a resource
client.read_resource("test_resource")
rescue => e
puts "Error: #{e.message}"
puts e.backtrace
ensure
# Clean up session
client.close_session
end
end