SuperAPI AI 工具集

rails-mcp

rails-mcp 是一个自托管、由调用方配置的默认拒绝(default-deny)动作注册表,并附带只追加的支出意图账本和仅限 CLI 的人工签核审计轨迹,以 MCP 工具形式暴露。其核心不变量是 classify_action 无论动作是否注册、无论加载何种配置,始终返回 GATED,无法通过任何参数或配置字段改变。它提供动作类型分类的 schema 与纯逻辑、记录动作执行层信息的注册表、只追加的支出意图账本与滚动窗口预算检查,以及记录人工批准注册表当前哈希的只追加签核账本。它本身不是执行器,不拦截任何操作,需要用户自行接入 PreToolUse 钩子、权限拒绝列表或 CI 门禁。注册表默认空载,所有动作类型数据由采用者自行提供。签核功能仅通过 CLI 命令 append_signoff 提供,刻意不作为 MCP 工具暴露,以防止仅持有该服务器 MCP 连接的智能体自我批准不可逆操作。

访问官网

工具介绍

用途

rails-mcp 是一个自托管、由调用方配置的默认拒绝(default-deny)动作注册表,同时提供只追加的支出意图账本和仅限 CLI 的人工签核审计轨迹,并以 MCP 工具形式暴露。其定位是治理与安全,即“阻止智能体在无人察觉的情况下执行不可逆操作”,与作者其他六个 MCP 服务器(mcp-factory、rag-mcp、bus-mcp、desktop-mcp、github-mcp、discord-mcp)所属的开发工具类别不同。该项目从内部实际运行的注册表(shared/rails/,31 个测试,自 2026-07-06 起在多机器人集群中运行)移植并泛化而来。

主要能力

  • 默认拒绝分类:提供 schema 与纯逻辑,将 action_type 字符串分类为无条件 GATED(默认拒绝),无论是否已注册。
  • 动作注册表:可注册动作类型当前的执行信息(enforcement_layer、enforcement_pointer、ceremony),仅作信息记录,绝不表示许可。
  • 支出意图账本:只追加的支出意图记录,配合滚动窗口预算检查。
  • 人工签核账本:只追加的签核记录,记录谁批准了注册表当前哈希以及批准时间。
  • 六个只读为主的 MCP 工具:均无法写入签核账本。

核心不变量

classify_action(action_type) 始终返回 "GATED",无论是否注册、无论加载何种配置,没有任何参数或配置字段可以改变这一结果。这是整个产品的核心。registry.py 中的 classify() 只接受一个 action_type 参数,不存在任何能让调用方使其返回许可结果的参数。is_action_registered 回答的是另一个纯信息性问题——“我是否知道该动作类型的执行信息?”——且永远不会反馈到 GATED 判定中。

使用方式

将以下内容加入 Claude Desktop/Code 的 MCP 配置:

若 PATH 中没有控制台脚本,可回退为 "command": "python", "args": ["-m", "rails_mcp"]。

默认情况下注册表为空载(诚实的空,而非失败开放——classify_action 对所有内容仍无条件 GATED)。可将其指向自己的动作类型配置:

配置形状参见 examples/rails.config.example.yaml(或 .example.json)。

配置文件支持 YAML 或 JSON,支持完整形式或紧凑的三元素形式(与内部注册表原生形状一致)。JSON 用法相同({"actions": {"deploy_prod": [...]}})。enforcement_layer 应诚实填写而非理想化,“prose”(尚无结构性护栏,仅有文档)是合法且正确的值。

安装/连接:在 ~/.claude.json 的 mcpServers.rails-mcp 下注册为 stdio 服务器,通过绝对路径调用 run_server.py(无需 cwd——入口点会将自身目录加入 sys.path),或从 PyPI 安装后通过 rails-mcp 控制台脚本使用。握手检查会打印六个已注册工具名称,不启动任何传输。

CLI 签核边界

append_signoff——记录人工批准注册表当前哈希的函数——刻意不作为 MCP 工具,且永远不会。它仅作为人工手动运行的 CLI 命令暴露:

原因:该边界用于防止仅持有此服务器 MCP 工具连接的智能体自我批准不可逆操作。若 append_signoff 可作为 MCP 工具访问,任何持有此服务器连接的智能体都能签署自己的注册表,悄然破坏该边界存在的唯一目的。这呼应了原始 shared/rails/ 实现所遵循的内部设计规则:构建审计器的通道永远不签署它交付的注册表。能签署的审计器不是审计器。

该边界通过结构而非仅约定来强制:server.py 和 routes.py 从不导入或调用 append_signoff(由基于 AST 的检查证明,而非简单字符串 grep);注册的 MCP 工具集恰好是上述六个只读为主的工具,不存在 sign / append_signoff / revoke_signoff 工具;行为测试驱动每个已注册工具并确认签核账本文件从未被创建;run_server.py(~/.claude.json 调用的入口点)仅导入 rails_mcp.server,从不导入 rails_mcp.cli。

该边界不能证明什么:签核账本没有密码学防篡改证据,也不绑定真实人类身份——其完整性完全依赖文件系统 ACL 和自托管部署模型,而非密码学。拥有账本路径 shell 或文件写入权限的智能体(或任何人)可以自行运行 rails-mcp sign,或直接向文件追加伪造的 {"type": "signoff", ...} JSONL 行——账本无法区分这与真实 CLI 调用。MCP 专属边界仅阻止仅持有此服务器 MCP 工具连接的智能体这一较窄情形,并非证明有人工审查过,不应被如此解读。

适用场景

适用于需要对智能体不可逆操作进行治理与安全管控的场景,例如在生产部署、支出等高风险动作前设置默认拒绝门禁,并保留可审计的支出意图与人工签核记录。

限制

  • 不是执行器。classify_action 返回 GATED 本身不阻止任何操作,需自行接入 PreToolUse 钩子、权限拒绝列表或 CI 门禁。
  • record_spend_intent 仅记录支出意图,从不调用供应商、付费 API 或经纪商,也不阻止超预算支出发生。
  • 不预载任何动作类型数据,每个采用者需自备注册表(YAML/JSON 配置文件或普通 dict)。
  • 非多租户。签核账本假设每个注册表一个操作者字符串,v1 可接受,后续为已知限制。
  • 无实际执行机制:无 git 钩子、无 settings.json 拒绝规则、无毕业门禁。
  • 不包含覆盖审计器,无法检查特定执行机制是否真正执行注册表所声称的内容。
  • 不支持多租户/多操作者签核,v1 每个账本一个操作者字符串。
  • 不阻止超预算支出,evaluate_budget 只给出数字,不拦截调用。
  • 账本无轮转/上限,record_spend_intent 永久追加,无轮转、大小上限或归档。

测试与 CI

106 个测试,全部封闭(每个账本/配置路径均通过 tmp_path 和 tests/conftest.py 中的 autouse 环境隔离 fixture,不触碰真实 ./rails_data/)。无网络,无需实时冒烟门禁。CI(.github/workflows/ci.yml)在每次 push/PR 时运行该套件,若 Tests 徽章与实际报告不符则构建失败。

商业支持

由 Jaimen Bell 维护。生产 MCP 集成、智能体治理护栏或智能体可靠性工作可参见 jaimenbell.dev。构建自己的 MCP 服务器可参考 MCP Starter Kit。

mcp-name: io.github.jaimenbell/rails-mcp