MCP server for accessing Ruby YARD documentation in a project
1#!/usr/bin/env ruby
2
3require 'json'
4require 'open3'
5
6def test_mcp_server
7 puts "Testing YARD MCP Server..."
8
9 # Test messages
10 initialize_msg = {
11 jsonrpc: "2.0",
12 method: "initialize",
13 params: {
14 protocolVersion: "2024-11-05",
15 capabilities: {},
16 clientInfo: { name: "test", version: "1.0" }
17 },
18 id: 1
19 }
20
21 tools_list_msg = {
22 jsonrpc: "2.0",
23 method: "tools/list",
24 params: {},
25 id: 2
26 }
27
28 lookup_msg = {
29 jsonrpc: "2.0",
30 method: "tools/call",
31 params: {
32 name: "lookup_object",
33 arguments: { object_path: "User" }
34 },
35 id: 3
36 }
37
38 # Send messages to server
39 input = [
40 initialize_msg.to_json,
41 tools_list_msg.to_json,
42 lookup_msg.to_json
43 ].join("\n") + "\n"
44
45 Open3.popen3("bin/yard-mcp --no-live") do |stdin, stdout, stderr, wait_thr|
46 stdin.write(input)
47 stdin.close
48
49 # Read responses with timeout
50 responses = []
51 begin
52 Timeout.timeout(5) do
53 while line = stdout.gets
54 responses << line.strip
55 end
56 end
57 rescue Timeout::Error
58 puts "Server response timeout (expected)"
59 end
60
61 wait_thr.kill
62
63 puts "Server responses:"
64 responses.each_with_index do |response, i|
65 next if response.empty?
66 begin
67 parsed = JSON.parse(response)
68 puts "#{i + 1}. #{parsed['method'] || 'Response'}: #{response[0..100]}..."
69 rescue JSON::ParserError
70 puts "#{i + 1}. Raw: #{response[0..100]}..."
71 end
72 end
73 end
74end
75
76if __FILE__ == $0
77 require 'timeout'
78 test_mcp_server
79end