9. MCP 服务
**Model Context Protocol(MCP)**是一种标准化的方式,让 AI 智能体调用外部工具。一个 MCP 服务对智能体暴露一组工具:读取 GitHub issue、发 Slack 消息、查数据库、打你自己的接口。接入 MCP 服务,就是让智能体的触角伸出工作区。
本章从用户视角讲怎么用 MCP 服务:注册、启用、和智能体对话让它挑对工具。怎么写 MCP 服务是另一个话题,属于 MCP 项目上游本身。
9.1 实际用起来是什么感觉
比方说你启用了一个叫 mcp_github 的 MCP 服务。启用之后,智能体就能拿到 list_issues、create_pr、read_file 这样的工具。然后你像往常一样和它对话:
infra这个 repo 上现在还开着哪些 issue?
智能体会用合适的参数调用 list_issues,拿到数据,做汇总。你没打过任何工具名字。MCP 这一层在聊天层是看不见的;它出现在 Web UI 的 tool calls 展开里 —— 想看才能看见。
9.2 MCP 服务从哪儿来
OpenHermit 不带默认 MCP 服务 —— 目录里有什么,完全取决于你(或更广义的 MCP 生态)注册了什么。常见来源:
- 官方 MCP 服务 —— 协议作者和生态伙伴发布的。通常以 npm 包或容器镜像分发。
- 社区服务 —— 第三方为流行服务发布的 MCP 服务。
- 你自己的 —— 把内部 API 包装成 MCP 服务。
注册通常走 OpenHermit 的 MCP 商店 / 配置。运维把它们加到你这套实例上的方式各不相同;从你这边看,重要的是哪些已经在、哪些被启用了。
9.3 hermit mcp 命令
# 列出本实例注册的 MCP 服务。
hermit mcp list
# 看哪个服务启用在哪个智能体上。
hermit mcp assignments
# 为某个智能体启用一个 MCP 服务。
hermit mcp enable mcp_github --agent main
# 为所有智能体启用。
hermit mcp enable mcp_github --all
# 停用。
hermit mcp disable mcp_github --agent main
切换 MCP 服务是热生效 —— 下一条消息智能体就会感知到变化。
9.4 认证与密钥
绝大多数有用的 MCP 服务都需要凭证(GitHub token、Slack bot token、内部 API key)。模式是:
-
把凭证存为密钥(见 第 18 章 · 密钥):
hermit config --agent main secrets set GITHUB_TOKEN ghp_xxx --pass-through -
MCP 服务的配置里用
${{GITHUB_TOKEN}}引用这个密钥。网关在启动服务时会替换为真实值。
凭证的轮换通过 hermit config --agent ... secrets 管理,不在 MCP 服务自己的配置里改。
9.5 Web 管理界面
Manage → MCP 选项卡列出已注册的服务,并提供按智能体启用的开关。如果你的实例提供了 MCP 目录浏览器,你可能也能从那里安装新服务。
9.6 角色差异
| Owner | User | Guest | |
|---|---|---|---|
| 使用智能体拥有的 MCP 工具 | ✓ | ✓(默认) | ✓(默认) |
| 启用 / 停用 MCP 服务 | ✓ | — | — |
| 注册新 MCP 服务 | ✓ | — | — |
默认情况下,user 也能看到 MCP 工具;取决于服务本身的能力,你可能想用策略把它收紧。例如能 create_pr 的 MCP 服务大概不该对 guest 可见 —— 用一条策略规则拦掉,见 第 15 章。
9.7 How-to 配方
9.7.1 给你的智能体启用 GitHub 访问
场景 —— 你想让智能体在几个 repo 上读 issue、评论、开 PR。
前置 —— 实例上已经注册了类似 mcp_github 的 MCP 服务。(如果没有,让运维装上。)
步骤
# 1. 把你的 GitHub token 存为密钥。
hermit config --agent main secrets set GITHUB_TOKEN <ghp_...> --pass-through
# 2. 启用 MCP 服务。
hermit mcp enable mcp_github --agent main
验证 —— 对智能体说:
列一下
org/repo仓库最近的 issue。
它应该返回真实的 GitHub 数据。
9.7.2 把一个 MCP 服务对 user 收紧为只读
场景 —— 你启用了 mcp_github,现在想让 user(不是 owner)能 读 但不能开 PR 或删分支。
步骤
这是策略的活。打开 第 15 章 · 策略与审批,为写类工具加一条 deny 规则,作用于 principal role 为 user 时。MCP 服务保持启用;网关按工具粒度拦截。
9.7.3 排查时临时关掉某个 MCP 服务
场景 —— 某个 MCP 服务行为异常,你想先关掉再排查。
hermit mcp disable mcp_slack --agent main
弄好了再启用。数据不会丢;凭证和配置都还在。
9.7.4 把一个 MCP 推到整个舰队
hermit mcp enable mcp_research --all
验证 —— hermit mcp assignments 显示每个智能体上都启用了该服务。
9.8 FAQ
为什么启用 MCP 之后智能体变慢了? 每个启用的 MCP 服务都会把它的工具定义注入到每个 prompt 里,抬高输入 token 数。把没在用的关掉。
智能体能挑要用哪个 MCP 服务吗? 可以 —— 工具定义带服务名标签,智能体会路由到提供匹配工具的那个服务。
多个 MCP 服务能暴露同名工具吗? 可以;网关用服务名前缀消歧。如果有冲突,智能体的工具调用会带上前缀。
MCP 服务跑在我的工作区沙箱里吗? 不在 —— MCP 服务是网关侧的独立进程,通过 MCP 协议和智能体对话。它们不能访问你的工作区文件,除非它们明确暴露读文件的工具。
到哪儿去找更多 MCP 服务? 看 MCP 官方项目的目录、GitHub 上 mcp-server 这个 topic。生态在快速增长。
9.9 指引
- 管理 MCP 服务用的凭证 → 第 18 章 · 密钥。
- 限制哪些角色能调用某个 MCP 工具 → 第 15 章 · 策略与审批。
- 技能 vs MCP —— 什么时候用哪个 → 第 8 章 · 技能 8.8 节。