项目简介
这是一个实现了Model Context Protocol (MCP) 的后端应用,专注于提供一个由大型语言模型 (LLM) 可调用的 Ruby 代码执行工具。它可以部署在Heroku等平台上,通过标准化的JSON-RPC接口(支持Stdio和SSE传输)接收LLM客户端发来的请求,在隔离的环境中执行指定的Ruby代码,并返回执行结果。
主要功能点
- Ruby代码执行: 接收Ruby代码字符串并在服务器端执行。
- 依赖管理: 支持在执行前安装指定的Ruby Gems包。
- 隔离环境: 可选择在临时目录中运行代码和安装依赖,提供一定程度的隔离(非完全安全沙箱)。
- MCP协议支持: 实现标准的MCP JSON-RPC通信协议。
- 多传输协议: 支持通过Stdio(标准输入/输出)和SSE(Server-Sent Events)进行通信。
- 工具暴露: 作为一个MCP工具('code_exec_ruby')供LLM客户端发现和调用。
安装步骤
该服务主要设计用于部署在Heroku平台。
- 克隆仓库: 将代码库克隆到本地。
- 创建Heroku应用: 使用Heroku CLI创建一个新的应用 ('heroku create <your-app-name>')。
- 添加Buildpacks: 添加Ruby和Python Buildpacks。
- 配置环境变量: 设置必要的环境变量,特别是'API_KEY'用于SSE模式的认证,以及'STDIO_MODE_ONLY'来控制是否仅启用STDIO模式。
- 部署: 将代码推送到Heroku ('git push heroku main')。
- 启动Dyno: 根据需要启动'web' dyno(用于SSE)或使用'heroku run'执行一次性'worker' dyno(用于STDIO)。
详细的部署步骤和命令请参考仓库的 'README.md' 文件。
服务器配置(供MCP客户端连接)
MCP客户端需要配置如何连接到此服务器。对于Heroku部署场景,常见的配置方式是指定用于启动服务器进程的命令及其参数,尤其是在使用STDIO模式时(推荐用于隔离执行)。
以下是MCP客户端连接此MCP服务器(以STDIO模式为例,通过Heroku One-Off Dyno运行)可能需要的配置信息结构(JSON格式概念描述,非实际代码):
{ "name": "heroku-ruby-executor", // 给这个MCP服务器实例取一个标识名称 "transport": "stdio", // 指定通信协议为Stdio "server": { "command": "heroku", // 启动服务器进程的命令 "args": [ // 命令参数 "run", "--app", "<your-heroku-app-name>", // 替换为你的Heroku应用名称 "--", "python", // 在One-Off Dyno中执行Python命令 "-m", "src.stdio_server" // 启动服务器的Python模块 ], "env": { // 需要传递给服务器进程的环境变量 "API_KEY": "...", // 如果STDIO模式也需要API_KEY,则配置;STDIO模式下通常不需要 "STDIO_MODE_ONLY": "true" // 确保服务器以STDIO模式启动 // LLM可能需要访问的其他环境变量... } } // 如果使用SSE模式,配置结构会有所不同,通常包含URL和认证信息 // "transport": "sse", // "server": { "url": "https://your-app-name.herokuapp.com/sse" }, // "authentication": { "type": "bearer", "token": "your-api-key" } }
MCP客户端使用以上配置信息,便知道如何启动一个Heroku One-Off Dyno并与之建立Stdio连接,进而发送MCP请求并接收响应。
基本使用方法
部署并配置好MCP客户端后,LLM可以通过以下步骤使用此服务:
- 发现工具: LLM客户端可以调用MCP的 'list_tools' 方法,查询服务器提供的所有工具及其描述。会返回一个名为 'code_exec_ruby' 的工具信息。
- 调用工具: LLM根据 'list_tools' 返回的工具描述,调用MCP的 'call_tool' 方法,指定工具名称 'code_exec_ruby' 并提供参数。
- 'code' (字符串, 必需): 要执行的Ruby代码字符串。
- 'packages' (字符串列表, 可选): 执行前需要安装的Ruby Gem名称列表。
- 'use_temp_dir' (布尔值, 可选, 默认为 False): 如果为 True,则在临时目录中执行代码并安装依赖,提供隔离。
- 处理结果: 服务器返回一个包含执行结果的JSON对象,通常包括:
- 'returncode': Ruby脚本的退出码(0表示成功)。
- 'stdout': 标准输出内容。
- 'stderr': 标准错误输出内容或依赖安装错误信息。 LLM解析这些结果来理解代码执行的状态和输出。
信息
分类
开发者工具