9. MCP 服务

**Model Context Protocol(MCP)**是一种标准化的方式,让 AI 智能体调用外部工具。一个 MCP 服务对智能体暴露一组工具:读取 GitHub issue、发 Slack 消息、查数据库、打你自己的接口。接入 MCP 服务,就是让智能体的触角伸出工作区。

本章从用户视角讲怎么用 MCP 服务:注册、启用、和智能体对话让它挑对工具。怎么写 MCP 服务是另一个话题,属于 MCP 项目上游本身。


9.1 实际用起来是什么感觉

比方说你启用了一个叫 mcp_github 的 MCP 服务。启用之后,智能体就能拿到 list_issuescreate_prread_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)。模式是:

  1. 把凭证存为密钥(见 第 18 章 · 密钥):

    hermit config --agent main secrets set GITHUB_TOKEN ghp_xxx --pass-through
  2. MCP 服务的配置里用 ${{GITHUB_TOKEN}} 引用这个密钥。网关在启动服务时会替换为真实值。

凭证的轮换通过 hermit config --agent ... secrets 管理,不在 MCP 服务自己的配置里改。


9.5 Web 管理界面

Manage → MCP 选项卡列出已注册的服务,并提供按智能体启用的开关。如果你的实例提供了 MCP 目录浏览器,你可能也能从那里安装新服务。


9.6 角色差异

OwnerUserGuest
使用智能体拥有的 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 指引