内容
mcp_server
基于 Rack 的 Ruby 应用程序的可插拔、协议无关的 MCP(模型-上下文-协议)服务器。
## 安装
将以下行添加到您的应用程序的 Gemfile 中:
```ruby
gem 'mcp_server'
```
然后执行:
```bash
bundle install
```
或者您可以自己安装:
```bash
gem install mcp_server
```
## 使用
### 基本配置
使用您的身份验证逻辑和 MCP 组件(工具、提示、资源)配置 MCP 服务器:
```ruby
require 'mcp_server'
require 'mcp'
# 定义您的 MCP 工具
class CalculatorTool < MCP::Tool
tool_name "calculator"
description "执行基本算术运算"
input_schema(
properties: {
operation: { type: "string", enum: ["add", "subtract", "multiply", "divide"] },
a: { type: "number" },
b: { type: "number" }
},
required: ["operation", "a", "b"]
)
def self.call(operation:, a:, b:, server_context:)
# 在您的工具中访问上下文数据
user = server_context[:user]
permissions = server_context[:permissions]
# 您的工具逻辑在此
result = case operation
when "add" then a + b
when "subtract" then a - b
when "multiply" then a * b
when "divide" then b != 0 ? a / b : "错误:除以零"
end
MCP::Tool::Response.new(
content: [MCP::Content.text("结果:#{result}")]
)
end
end
# 配置服务器
MCPServer.configure do |config|
# 定义如何身份验证请求(可选)
config.authenticate_with do |request|
# 您的身份验证逻辑在此
# 返回 true/false 或引发错误
request.env['HTTP_AUTHORIZATION'] == 'Bearer secret-token'
end
# 定义如何构建服务器上下文(可选)
config.build_context_with do |request|
# 返回工具所需的任何上下文数据的哈希
{
user: User.find_by_token(request.env['HTTP_AUTHORIZATION']),
organization: Organization.from_request(request),
permissions: Permission.for_request(request),
locale: request.env['HTTP_ACCEPT_LANGUAGE'],
custom_data: "您需要的任何其他上下文"
}
end
# 配置 MCP 组件(作为动态加载的可调用对象)
config.tools = -> { [CalculatorTool] }
config.prompts = -> { [] } # 在此处添加您的 MCP::Prompt 类
config.resources = -> { [] } # 在此处添加您的 MCP::Resource 实例
# 参考 https://github.com/modelcontextprotocol/ruby-sdk?tab=readme-ov-file#resources
# 以获取有关如何定义资源的更多详细信息
config.resources_read_handler do |request_params|
# 处理资源读取请求
resource = Resource.find_by_id(request_params['id'])
[{
uri: request_params[:uri],
mimeType: 'application/json',
text: resource.to_json
}]
end
# 仅在使用 MCP gem 的 382ae13 提交哈希之后的版本时
# https://github.com/modelcontextprotocol/ruby-sdk/commit/382ae13e25ba095fbe227b186b3287c3c7eb7ff4
config.transport = MCP::Server::Transports::StdioTransport
# 定义一个响应处理程序来修改响应(可选)
config.response_handler do |response, request|
# 修改响应头、状态或正 status, headers, body = response
headers['X-Custom-Header'] =修改'
# 通过 ID 头来禁用 SSE(服务器发送事件)
# headers.delete('Mcp-Session-Id')
[status, headers, body]
end
end
```
### 服务器发送事件(SSE)和多进程**重要:** 当前的 SSE 实现需要将流对象保中。这意味着 SSE 在服务器(例如 Unicorn、 在集群模式下或中无法正常工作,因为: 流对象存储在处理进程中
- 随后的请求可能会被路由到不同的进程无法访问这些流
请求由不同的进程处理时 SSE 连接失败
**解决方案:**
1. 使用单进程、多线程服务器(例如,Puma 在单模式下使用多个线程)
2. 通过在响应处理程序中删除 `Mcp-Session-Id` 头来禁用 SSE(示例)
### 在 Rack 应用程序中挂载
#### 应用程序中
添加到您的 `config/routes.rb` 中:
```ruby
mount MCPServer::RackApp => '/mcp#### 在 Sinatra 应用程序中
```ruby
require 'sinatra'
require 'mcp_server'
# 配置 MCPServer...
use MCPServer::RackApp
```
#### 在纯 Rack 应用程序config.ru)
```ruby
require 'mcp_server'
MCPServer...
run MCPRackApp
```
## 开发
检出仓库后,运行 `bundle install` 以安装依赖项。
### 运行测试
```bash
# 运行所有测试
rake test
# 运行特定的测试文件
ruby -Ilib:test test/test_configuration.rb
```
### 代码检查
该项目使用 StandardRB 进行 Ruby 风格指南:
```bash
standardrb
```
###
```bash
gem build mcp_server.gemspec## 架构
该 gem模块化架构:
- **配置:** 中央配置对象:
- 身份验证回调(可选)
- 上下文构建回调(可选)- 构建传递给工具的服务器上下文
- 返回 MCP 工具、提示和资源的数组的可调用对象(用于动态加载)
- 响应处理回调(可选)- 用于在发送之前修改响应
- **RackApp:** 主要 Rack 应用程序,负责:
- 处理带有 JSON-R载荷的 HTTP 请求(支持所有 HTTP 方法)
- 如果配置了身份验证,则执行
- 使用配置创建 MCP::Server 实例 - 将请求处理委托给 MCP gem 或配置的传输
处理各种响应正文nil、字符串、数组、对象)
- **MCP 集成:** 利用官方 MCP Ruby协议 compliance
## 贡献
1. 分叉它. 创建您的功能分支( checkout -b my-new)
3. 提交您的`git commit -am 'Add some feature'`)
4. 推送到分支(`git push origin my-new-feature`)
5. 创建一个新的拉取请求 许可证
该 gem软件在 [MIT License](https://opensource.org/licenses/MIT) 的条款下提供。