MCP Ruby服务器骨架
致谢:此实现受到了文章的启发 用TypeScript构建模型上下文协议服务器 Azuki Azusa。
这个项目是模型上下文协议(MCP)服务器骨架的Ruby实现。它提供了一个接口,允许像Claude这样的大型语言模型(LLM)调用工具。当前的实现提供了一种生成随机数的工具。
特性
get-random-number:生成一个介于1和指定最大值之间的随机整数(默认值为100)- MCP协议版本2024-11-05兼容性
- 调试详细日志记录
- 符合JSON-RPC 2.0的消息处理
需求
- Ruby 3.0+
建筑与设计
此服务器由以下组件组成:
核心组件
MCP::Server:处理MCP协议消息的主服务器实现
- 协议初始化 - 工具登记和管理 - 消息处理 - 工具列表和执行 - 错误处理
MCP::Transport::Stdio:用于通信的标准I/O传输层
- 消息接收 - 响应传输 - 事件驱动的消息处理
MCP::Tool:工具定义和执行处理程序
- 工具名称、描述和输入模式的管理 - 工具逻辑实现 - 执行过程中的参数处理
RandomNumberServer:注册和管理工具的服务器实现
- 服务器初始化 - 工具设置 - 服务器执行
协议流
服务器遵循MCP初始化协议:
- 客户端发送
initialize请求协议版本 - 服务器以其功能进行响应,并匹配协议版本
- 服务器发送
initialized通知 - 然后,客户端可以列出并调用工具
已实现的MCP API
服务器实现了以下MCP API:
initialize:服务器初始化和协议版本协商tools/list:列出可用工具及其模式tools/call:使用提供的参数执行工具
安装
克隆存储库:
git clone
cd mcp-ruby-skeleton确保服务器脚本可执行:
chmod +x bin/run_server.rb用法
直接执行
直接运行服务器:
./bin/run_server.rb与Claude Desktop集成
将以下内容添加到您的Claude Desktop配置中:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 窗户:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"random-number": {
"command": "ruby",
"args": [
"/Users/bash/src/mcp-ruby-skeleton/bin/run_server.rb"
]
}
}
}将路径替换为您的绝对路径 run_server.rb 您系统上的文件。
配置后,重新启动Claude Desktop并尝试类似“生成1到50之间的随机数”的提示
调试
日志
与MCP服务器相关的Claude应用程序日志可在以下网址获得:
- macOS:
~/Library/Logs/Claude/mcp*.log - 窗户:
%APPDATA%\Claude\logs\mcp*.log
要实时查看日志,请执行以下操作:
# On macOS
tail -f ~/Library/Logs/Claude/mcp*.log
# On Windows
type "%APPDATA%\Claude\logs\mcp*.log"服务器本身会记录到标准错误输出(STDERR),日志级别在初始化时设置 RandomNumberServer 类(目前处于调试级别)。
常见问题
服务器断开连接\ 如果您看到“MCP服务器已断开连接”之类的消息,请检查:
- 协议版本兼容性
- JSON-RPC消息格式
- 正确的初始化顺序
- 服务器脚本上的文件权限
工具未显示\ 如果随机数工具没有出现在Claude中:
- 检查服务器是否在配置文件中正确注册
- 确保服务器脚本具有执行权限
- 完全重新启动克劳德桌面
- 检查日志是否有任何错误
发展
添加新工具
您可以通过修改来向服务器添加更多工具 RandomNumberServer 类别:
def setup_tools
# Existing random number tool
random_number_tool = MCP::Tool.new(
"get-random-number",
"Generate a random number between 1 and the specified maximum value",
{
type: "object",
properties: {
max: {
type: "integer",
description: "Maximum value for the random number (defaults to 100 if not specified)"
}
}
}
) do |args|
max = (args["max"] || 100).to_i
max = 100 if max <= 0
rand(1..max)
end
@server.register_tool(random_number_tool)
# Add your new tool here
new_tool = MCP::Tool.new(
"tool-name",
"Tool description",
{
type: "object",
properties: {
# Tool parameters
}
}
) do |args|
# Tool implementation
end
@server.register_tool(new_tool)
end测试
在实现新工具或服务器功能时,建议添加测试。测试应该结合单元测试、集成测试和端到端测试。
测试应验证:
- 正确定义和登记工具
- 正确的协议处理
- 错误处理
- 输入验证
- 预期输出确认
错误处理和异常
为了提高MCP服务器的健壮性,实现适当的错误处理和异常处理非常重要:
- 在工具执行过程中适当地捕获异常,并向客户端返回有意义的错误消息
- 验证无效的输入参数
- 正确处理网络和I/O错误
- 考虑超时和资源限制
