Arai MCP 服务说明文档:从 CLAUDE.md 到 stdio 的 Rust 实现路径 1. 为什么 CLAUDE.md 写了却像没写Arai MCP 服务要解决的规则失效问题如果你用 Claude Code 或 Cursor 写过项目级指令文件大概率遇到过这种尴尬CLAUDE.md 里明明写了「Never force-push to main」结果某次对话里助手还是把git push --force拼了出来你写了「Always run tests before pushing」它照样直接推。问题不在于模型不听话而在于 CLAUDE.md 本质上是一份被动上下文——它随会话增长被塞进 prompt然后被后续几十轮对话稀释、遗忘最后变成一段没人执行的建议文本。Arai 这个 MCP 服务想干的事就是把「建议」变成「可执行规则」。它读取你的 CLAUDE.md、.cursorrules、.windsurfrules 等指令文件用模式匹配把祈使句never / always / must / dont抽成结构化规则再通过 MCP 协议暴露给 AI 工具链。当模型准备调用某个工具时Arai 会在 PreToolUse 阶段判断这条调用是否踩了规则踩了禁止性规则never、forbids、must_not它直接返回permissionDecision: deny让 Claude Code 拒绝这次工具调用而不是事后提醒。一句话概括Arai 是一个本地运行的 MCP 服务把 CLAUDE.md 从「写给模型看的散文」变成「能被程序判定和拦截的规则集」。它适合三类人一是项目里有多条硬性编码规范、希望 AI 别越线的团队开发者二是想给 Agent 加一层本地护栏、又不想把代码传到云端的隐私敏感用户三是正在研究 MCP stdio 传输怎么落地、想找一个真实 Rust 实现参考的工程师。本文聚焦最后一类同时把前两类的接入路径讲清楚。需要先说明的是Arai 本身是本地 stdio 服务零云端依赖数据落在~/.arai/目录。而如果你希望把这类本地 MCP 服务统一接入一个可管理的模型网关、方便切换模型和集中看调用日志可以配合 TaoToken 这类平台使用——它提供兼容 OpenAI 风格的 API 入口模型对话、Coding Plan、API Keys 都有对应页面后面第 2 节会给出具体地址和配置方式。两者不冲突Arai 管规则TaoToken 管模型接入。2. 接入前的环境准备Rust 工具链、CLAUDE.md 与 TaoToken 模型入口在动手配 Arai 之前先把三样东西备齐Rust 环境、一份能被解析的 CLAUDE.md、以及一个可用的模型调用入口。前两样是 Arai 的运行前提第三样决定你的 AI 工具链能不能真正跑起来。Rust 环境是硬要求。Arai 是 Rust 实现安装脚本会拉取预编译二进制但如果你想从源码构建或调试 stdio 行为需要cargo和rustc。检查命令rustc --version cargo --version如果提示 command not found去 rustup 官网按系统装即可装完重开终端。实测下来Rust 1.75 以上版本都能正常编译 Arai 的依赖树低于这个版本可能在 tree-sitter 相关 crate 上卡住。CLAUDE.md 是 Arai 的规则来源。它支持的文件不止 CLAUDE.md 一个完整清单如下指令文件对应工具Arai 执行方式CLAUDE.mdClaude CodeHooksblock advise~/.claude/CLAUDE.mdClaude Code 全局Hooksblock advise~/.claude/projects//memory/.mdClaude Code memoryHooksblock advise.cursorrules / .cursor/rulesCursorMCPadvise.windsurfrulesWindsurfMCPadvise.github/copilot-instructions.mdGitHub Copilot仅摄取注意最后一行Copilot 的指令文件只被摄取、不参与拦截因为 Copilot 目前没有对应的 hook 机制。真正能「拒绝工具调用」的是 Claude Code 这条链路。第三样是模型入口。Arai 负责规则判定但模型本身还是要通过某个 API 调用。如果你用 Claude Code它默认走 Anthropic 官方如果你想把模型调用统一到一个可管理的入口可以用 TaoToken 的 API官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址https://taotoken.net/api模型对话页https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel-chatCoding Plan 页https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-planAPI Keys 页https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi-keys接入文档https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc这里要强调一个配置原则无论你接的是 Arai 还是别的 MCP 服务只要涉及模型调用三件套必须写全——Base URL、API Key、Model ID。少任何一个客户端都会在启动时报错最常见的表现就是 401 或local proxy failed。后面第 3 节会给出完整的可复制配置片段。环境备齐后先跑一次安装和初始化确认 Arai 能识别你的项目# 安装 Arai curl -sSf https://arai.taniwha.ai/install | sh # 进入你的项目目录 cd your-project # 初始化发现指令文件、提取规则、设置 hooks arai initarai init做完后用arai status看当前生效的规则数量用arai guardrails列出所有活动规则。如果这两条命令输出为空说明你的 CLAUDE.md 里没有可被识别的祈使句或者文件路径不在 Arai 的扫描范围内。3. 可复制的配置CLAUDE.md 规则写法与 stdio 启动命令这一节是全文最需要动手的部分。我会给出三段可直接复制的配置CLAUDE.md 的规则写法、Arai 的 MCP 服务声明JSON 格式、以及 stdio 启动命令。三段配好服务就能被 Claude Code 发现。先看 CLAUDE.md 的规则写法。Arai 靠模式匹配祈使语言来抽规则所以句子结构越明确抽取越准。推荐用「谓词 动作 对象」的短句# 项目规则 - Never force-push to main - Always run tests before pushing - Never hand-write migration files - Must not delete files under src/core - Prefer the new payment SDK over the legacy one (until 2027-06-30) - Never touch the old auth module (expires 2026-09-01)几个细节值得注意。第一never、forbids、must_not这类禁止性谓词会被推断为 block 级别触发时返回permissionDecision: denyalways、requires是 warn 级别返回 allow 但附带上下文prefers、learned_from是 inform 级别只记录不拦截。第二行尾的(expires YYYY-MM-DD)或(until YYYY-MM-DD)是规则过期注解解析时会被剥离并单独存储到期后load_guardrails自动过滤规则停止触发——这对临时性约束特别有用不用手动回来删。第三Arai 不是纯关键词匹配它会做意图分类和代码图分析。比如「never hand-write migration files」只在 Write 工具上触发不会误伤 Edit写入migrations/versions/目录时会触发 alembic 相关规则哪怕文件里没提 alembic。写完 CLAUDE.md先别急着接 MCP用arai lint预览一下抽取结果arai lint CLAUDE.md这条命令会解析文件并打印提取出的规则三元组主体/谓词/客体。如果某条规则没被抽出来多半是句子太口语化改成上面的短句结构即可。想预览规则集增量用arai diff CLAUDE.md。接下来是 MCP 服务声明。Claude Code 的 MCP 配置通常写在项目根目录的.mcp.json或者用户级的~/.claude.json。Arai 是 stdio 服务所以配置里command指向araiargs是mcp{ mcpServers: { arai: { command: arai, args: [mcp], env: { ARAI_HOME: /Users/yourname/.arai } } } }如果你同时用 TaoToken 作为模型入口Claude Code 侧的模型配置需要写全三件套。以 settings 片段为例{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-your-taotoken-key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 } }注意ANTHROPIC_BASE_URL填的是https://taotoken.net/api不要带 UTM 参数UTM 只用于网页跳转归因。API Key 去 TaoToken 的 API Keys 页生成Model ID 按你实际要用的模型填。这三项缺一不可缺 Base URL 会走默认官方地址导致鉴权失败缺 Key 直接 401缺 Model ID 客户端可能报模型不存在。最后是 stdio 启动命令。Arai 的 MCP 服务不需要你手动常驻Claude Code 会在需要时按配置拉起。但调试阶段建议手动跑一次确认 stdio 通道正常# 直接启动 MCP 服务器stdio 模式 arai mcp启动后进程会阻塞等待 stdin 输入这是正常的——stdio 传输就是靠标准输入输出通信。你可以手动发一条 JSON-RPC 初始化消息测试但更推荐用第 4 节的连通性验证方法。4. 验证服务可被发现与调用一次完整的本地连通性测试配置写完不代表服务能用。这一节给出一套可复现的验证流程从「服务能否启动」到「工具能否被调用」逐层确认。第一步确认 Arai 二进制在 PATH 里且 MCP 子命令存在which arai arai mcp --help如果which arai没输出说明安装脚本把二进制放在了非 PATH 目录手动加一下或重装。arai mcp --help能打印用法说明子命令注册正常。第二步用 MCP 的 initialize 握手验证 stdio 通道。最直接的办法是往arai mcp的 stdin 里灌一条初始化请求echo {jsonrpc:2.0,id:1,method:initialize,params:{protocolVersion:2024-11-05,capabilities:{},clientInfo:{name:test,version:1.0}}} | arai mcp正常情况会返回一段 JSON包含serverInfo和capabilities其中capabilities.tools应该存在。如果返回空或报错检查 Arai 版本arai --versionv0.2.3 以上才完整支持工具接口。第三步列出工具。MCP 协议里列工具用tools/listecho {jsonrpc:2.0,id:2,method:tools/list,params:{}} | arai mcp你应该能看到三个核心工具arai_add_guard、arai_list_guards、arai_recent_decisions。这三个是 Arai MCP 的对外接口分别对应注册规则、列出规则、检索最近触发记录。如果只看到一个或没有说明服务声明里的args写错了或者 CLAUDE.md 解析失败导致工具注册中断。第四步实际调用一次arai_list_guards确认规则被正确加载echo {jsonrpc:2.0,id:3,method:tools/call,params:{name:arai_list_guards,arguments:{}}} | arai mcp返回内容里应该包含你在 CLAUDE.md 里写的规则以主体/谓词/客体三元组形式呈现并标注来源文件。这一步通过说明「CLAUDE.md → 规则抽取 → MCP 工具暴露」这条链路是通的。第五步在 Claude Code 里做端到端验证。重启 Claude Code让它重新读取.mcp.json。然后在对话里输入/mcp查看已连接的服务应该能看到arai。接着故意触发一条禁止性规则比如让助手执行git push --force观察它是否被拒绝。如果返回permissionDecision: deny并附带规则来源说明拦截生效。验证过程中arai why是个好帮手它能在不写审计日志的前提下解释哪些规则会触发arai why git push --force这条命令是 dry-run适合在改规则前预判影响。另外arai audit可以查看本地审计日志arai stats聚合统计顶级规则、合规性和 token 经济学——后者对评估规则是否真的被遵守很有用。5. 常见报错排查401、local proxy failed 与 reading choices 的对照处理接入 MCP 服务时报错信息往往指向配置的某个具体字段。这一节按真实报错分类给出对照排查路径。401 Unauthorized。这个几乎总是 API Key 问题。如果你在 Claude Code 里配了 TaoToken 作为模型入口检查ANTHROPIC_API_KEY是否填了完整的sk-开头字符串有没有多余空格或换行。另一个常见原因是 Base URL 写成了带路径的形式比如https://taotoken.net/api/v1而客户端又自动拼了一次/v1导致鉴权端点错位。正确写法是https://taotoken.net/api让客户端自己补全路径。如果 Key 确认无误仍报 401去 TaoToken 的 API Keys 页确认这个 Key 是否被禁用或额度耗尽。local proxy failed。这个报错通常出现在客户端尝试连接本地 MCP 服务时。Arai 是 stdio 服务不走网络端口所以如果你在配置里写了url字段而不是command客户端会尝试当 HTTP 服务连自然失败。检查.mcp.json确保 Arai 的配置块用的是commandargs而不是url。另外如果command填的是相对路径或~开头的路径某些客户端不会展开建议填绝对路径或者确保arai在系统 PATH 里。reading choices 相关报错。这类错误一般出现在模型返回结构不符合预期时比如客户端期望choices数组但拿到的是错误对象。根因往往是模型 ID 写错或者 Base URL 指向了一个不兼容 OpenAI 格式的端点。排查顺序先确认ANTHROPIC_MODEL或对应的模型字段填的是有效 Model ID再确认 Base URL 是https://taotoken.net/api最后看客户端日志里实际发出的请求体确认字段名没写错。如果用的是 Claude Code 的 Anthropic 兼容模式注意它读的是ANTHROPIC_*系列环境变量不是OPENAI_*。OAuth 相关报错。如果你在配置里同时启用了需要 OAuth 的 MCP 服务而 Arai 是本地 stdio 不需要认证两者混在一起可能导致客户端在启动阶段卡住。处理办法是把 Arai 的配置块单独隔离确认它不依赖任何 token 字段。Arai 完全本地运行env里只需要ARAI_HOME指向数据目录不需要任何认证信息。工具列表为空。如果/mcp能看到 arai 服务但工具列表是空的先跑第 4 节的tools/list手动验证。如果手动也空检查 CLAUDE.md 是否存在且可读以及arai init是否成功执行过。arai status会显示当前正在执行的规则数量为 0 就说明抽取阶段就失败了。规则不触发。规则写进去了但拦截不生效先确认谓词级别。只有never、forbids、must_not会返回 denyalways系列只 warn。如果你写的是「should not」Arai 可能识别为 inform 级别不会拦截。改成never或must not再试。另外检查规则是否已过期行尾的(expires ...)到期后规则会被自动过滤。排查时善用arai audit和arai stats前者看每次触发的详细记录后者看聚合合规率。如果某条规则频繁被 ignored说明模型确实在违反这时候要么加强规则措辞要么检查是不是规则本身太模糊导致误判。6. 把 Arai 接进你的工具链从规则管理到模型入口的完整路径走到这里Arai 的 stdio 服务应该已经能在本地被正确发现和调用了。最后说一下怎么把它用顺以及模型入口这块怎么配。规则管理上Arai 提供了几个实用命令。arai add Never X可以手动加规则不用改 CLAUDE.mdarai scan重新扫描指令文件适合你刚编辑完 CLAUDE.md 想立即生效arai severity用来固定规则的严重性支持增量拒绝推出——你可以先让一批规则处于 advise 模式观察一段时间确认误报率低再切到 block。arai test scenarios.json能针对规则重放合成 hook 场景适合在 CI 里做规则回归。合规追踪这块每次 PostToolUse 后 Arai 会把调用与同一会话的 PreToolUse 触发关联发出 Compliance 事件状态分三种obeyed禁止短语不在执行的命令里或所需证据存在、ignored禁止短语仍在命令里模型还是执行了、unclear信号不足。arai stats会聚合这些事件你能看到哪些规则被真正遵守、哪些形同虚设。模型入口方面如果你用 Claude Code 配合 TaoToken记住三件套写全Base URL 用https://taotoken.net/apiAPI Key 去 API Keys 页生成Model ID 按实际模型填。需要长期跑编码任务或 Agent 的可以看 Coding Plan 页只是想验证模型连通性的用模型对话页最快接入细节和字段说明在接入文档里。这几个入口按需取用不用全配。一个实际经验Arai 的规则抽取对句子结构敏感我试过把「不要直接改数据库」这种中文祈使句写进 CLAUDE.md抽取效果不如英文短句稳定。如果你的项目规则是中文的建议在 CLAUDE.md 里用英文谓词开头、中文补充说明比如Never modify production database directly不要直接改生产库这样既能被稳定抽取又保留了可读性。最后Arai 是本地 stdio 服务数据全在~/.arai/审计日志是 JSONL 格式配置在~/.arai/config.toml。想深入定制的话直接读这两个路径下的文件比翻文档快。服务本身零云端依赖不需要认证这也是它适合接进本地 AI 工具链的原因——规则判定不出机器模型调用走你选的入口两边解耦各管各的。