项目简介

'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 保护(仅用于开发和测试环境,生产环境需谨慎评估安全性)。

安装步骤

  1. 在你的 Rails 应用的 'Gemfile' 中添加 'mcp-rails' gem,并指定 git 仓库地址:

    gem 'mcp-rails', git: 'https://github.com/Tonksthebear/mcp-rails'
  2. 运行 'bundle install' 安装 gem。

    bundle install
  3. 确保同时安装了 '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' 脚本能够正确执行。

基本使用方法

  1. 标记路由: 在 '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
  2. 定义参数: 在对应的 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
  3. 生成 MCP 服务器: 运行以下 Rails 命令生成 'tmp/server.rb' 文件:

    bin/rails mcp:rails:generate_server
  4. 运行 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 智能体调用。

信息

分类

开发者工具