项目简介
'mcp-rails' 是一个 Ruby on Rails gem,旨在简化 Rails 应用与 LLM (大型语言模型) 智能体的集成。它基于 Model Context Protocol (MCP),允许开发者将 Rails 应用中的路由和控制器动作转化为 MCP 服务器可以理解和调用的工具 (Tools),使得 LLM 智能体能够通过标准的 MCP 协议与 Rails 后端进行交互,从而实现诸如数据访问、功能调用等操作。
主要功能点
- 路由标记: 通过在 'routes.rb' 中标记路由,即可将指定的 Rails 路由暴露为 MCP 服务器的工具,支持标记所有 RESTful 动作或仅标记特定动作。
- 自动服务器生成: 自动在 'tmp/server.rb' 生成 Ruby 语言的 MCP 服务器代码,该服务器作为 HTTP 桥梁,使得 LLM 智能体可以通过 HTTP 请求与 Rails 应用交互。
- 参数定义: 在 Controller 中使用 DSL 定义 MCP 工具的参数,这些参数定义同时用于 MCP 服务器的配置生成和 Rails 强参数校验。参数定义支持类型、示例、是否必填等元数据。
- HTTP 桥接: 生成的 MCP 服务器将 MCP 工具调用转换为 HTTP 请求,使得 LLM 智能体可以像人类用户一样通过 HTTP 路径与应用交互,复用已有的 Rails 应用逻辑。
- 环境变量集成: 允许配置需要自动包含在 MCP 工具调用中的环境变量,方便处理 API 密钥、组织 ID 等环境特定值。
- CSRF 保护绕过: 提供生成 CSRF 绕过密钥的机制,并指导开发者如何在 'ApplicationController' 中配置以允许 MCP 服务器的请求绕过 CSRF 保护(仅用于开发和测试环境,生产环境需谨慎评估安全性)。
安装步骤
-
在你的 Rails 应用的 'Gemfile' 中添加 'mcp-rails' gem,并指定 git 仓库地址:
gem 'mcp-rails', git: 'https://github.com/Tonksthebear/mcp-rails' -
运行 'bundle install' 安装 gem。
bundle install -
确保同时安装了 'mcp-rb' gem,因为 'mcp-rails' 依赖于它:
gem 'mcp-rb'如果 'Gemfile' 中没有 'mcp-rb',也需要运行 'bundle install' 安装。
服务器配置
MCP 客户端 (如 Goose) 需要配置以下信息才能连接到 'mcp-rails' 生成的 MCP 服务器。以下是一个 JSON 格式的配置示例,你需要根据实际情况修改 'args' 中的路径:
{ "serverName": "mcp-server", // MCP 服务器名称,可在 config/initializers/mcp_rails.rb 中配置 "command": "ruby", // 启动 MCP 服务器的命令,这里使用 ruby 解释器 "args": [ // 启动命令的参数 "path/to/your/rails/app/tmp/server.rb" // 指向生成的 server.rb 文件的路径,需要替换为你的 Rails 应用中实际的文件路径 ] }
参数注释:
- 'serverName': MCP 服务器的名称,默认为 'mcp-server',可以在 'config/initializers/mcp_rails.rb' 文件中通过 'config.server_name = "your-server-name"' 进行自定义配置。
- 'command': 运行 MCP 服务器的命令。由于 'mcp-rails' 生成的是 Ruby 服务器代码,因此这里通常设置为 'ruby',表示使用 Ruby 解释器来执行服务器脚本。
- 'args': 一个字符串数组,包含传递给 'command' 的参数。
- 数组中的第一个元素通常是生成的 'server.rb' 脚本的路径。你需要将 '"path/to/your/rails/app/tmp/server.rb"' 替换为你的 Rails 应用中 'tmp/server.rb' 文件的实际绝对或相对路径。这个路径是相对于 MCP 客户端的执行环境而言的。
注意:
- 请确保 MCP 客户端能够访问到 Rails 应用生成的 'tmp/server.rb' 文件。如果客户端和服务器运行在不同的文件系统中,可能需要考虑文件共享或部署方式。
- 'serverName' 应该与 'config/initializers/mcp_rails.rb' 中配置的 'server_name' 一致,以便客户端正确识别服务器。
- 如果你的 Ruby 环境或 gemset 配置比较特殊,可能需要调整 'command' 和 'args' 以确保 'server.rb' 脚本能够正确执行。
基本使用方法
-
标记路由: 在 'config/routes.rb' 文件中,使用 'mcp: true' 或 'mcp: [:action1, :action2]' 选项标记需要暴露为 MCP 工具的路由。例如:
Rails.application.routes.draw do resources :channels, mcp: true # 暴露 channels 资源的所有 RESTful 动作 resources :posts, mcp: [:create] # 仅暴露 posts 资源的 create 动作 end -
定义参数: 在对应的 Controller 中,使用 'permitted_params_for' DSL 定义 MCP 工具的参数。例如在 'ChannelsController' 中定义 'create' 动作的参数:
class ChannelsController < ApplicationController permitted_params_for :create do param :channel, required: true do param :name, type: :string, example: "频道名称", required: true param :user_ids, type: :array, item_type: :string, example: ["用户ID1", "用户ID2"] end end def create @channel = Channel.new(resource_params) # 使用 resource_params 获取已许可的参数 # ... 创建频道的逻辑 end end -
生成 MCP 服务器: 运行以下 Rails 命令生成 'tmp/server.rb' 文件:
bin/rails mcp:rails:generate_server -
运行 MCP 客户端: 使用 MCP 客户端 (如 Goose) 连接到生成的 'tmp/server.rb'。参考客户端的文档配置连接信息,通常需要指定服务器启动命令和参数,如上面 服务器配置 章节所述。
例如,使用 Goose 连接到本地生成的 'tmp/server.rb',可以使用类似以下的命令:
goose session --with-extension "ruby path/to/your/rails/app/tmp/server.rb"将 'path/to/your/rails/app/tmp/server.rb' 替换为你的 'server.rb' 文件的实际路径。
通过以上步骤,你就可以将 Rails 应用的功能以 MCP 服务器的形式暴露出来,供 LLM 智能体调用。
信息
分类
开发者工具