5.5. 通过 MCP 工具链可将 Hermes 能力边界扩展至任意外部服务
你需要什么
- 一台已安装 Hermes Agent 的开发机(macOS/Linux/Windows WSL2,Python 3.11+)
- 一个已启动的 PostgreSQL 数据库(本地或远程均可,本教程使用
localhost:5432) - 一个可用的 MCP 服务器——我们将使用官方
@modelcontextprotocol/server-postgres(通过 npx 运行) - 约 30 分钟动手时间
本教程基于 Hermes Agent v0.8.0 及后续版本编写,MCP 集成功能从 v0.7.0 开始正式支持。截至当前调研资料(2026 年 6 月),Hermes 的 MCP 支持已覆盖主流 MCP 服务器类型,包括文件系统、数据库、网络搜索、GitHub 等。
最终成果
你将让 Hermes Agent 拥有一项新的工具能力:通过自然语言直接查询 PostgreSQL 数据库,获取业务指标或表结构信息。整个接入过程无需编写一行代码来对接数据库驱动或构造 SQL,只需配置一个 YAML 文件并启动一个 MCP 服务器。我们还会给这个工具加上访问范围限制,确保 Agent 只能执行 SELECT 查询,不会误删数据。
完成后你会明白:一旦某个外部系统提供了 MCP 服务器,Hermes 就可以像插 U 盘一样“即插即用”地获得其工具,大幅降低工具集成的维护成本。
步骤说明
1. 理解 MCP 协议与 Hermes 的适配方式
Model Context Protocol(MCP)由 Anthropic 于 2024 年底提出,旨在标准化大语言模型与外部工具之间的交互。在传统 Agent 架构中,每接入一个新工具(比如数据库、REST API、浏览器),都需要在 Agent 代码中硬编码调用逻辑、参数转换和错误处理。随着工具数量增长,这种“意大利面条式”的集成很快变成维护灾难。
MCP 将工具提供方抽象为“MCP 服务器”,Agent 作为“MCP 客户端”通过标准协议发现和调用工具。Hermes 原生实现了 MCP 客户端,你只需要在配置文件中声明要连接的 MCP 服务器地址和启动命令,Hermes 就会在启动时自动建立连接并注册其中的全部工具——无需修改 Hermes 源码。
一个典型的数据流如下:
用户提问
→ Hermes Agent(MCP 客户端)
→ 发现工具列表:通过 MCP 协议从服务器获取
→ 规划步骤,决定调用某个工具
→ MCP 请求(JSON-RPC over stdio/HTTP)
→ MCP 服务器执行(例如查询数据库)
← 返回结构化结果
→ Hermes 将结果整合进上下文,生成最终回复
Hermes 的配置文件使用 YAML 格式,顶层可以声明一个 mcp_servers 字段,下面每个条目代表一个 MCP 服务器。典型结构如下(我们将在后续步骤填充实名参数):
mcp_servers:
- name: my-tool-server
command: npx # 或者 python、uvx 等
args:
- "-y"
- "@some-org/mcp-server-package"
- "--some-flag"
env: # 可选环境变量
API_KEY: "${MY_API_KEY}"
allowed_tools: [] # 留空默认全部工具可用;可填写工具名白名单
这就是我们“即插即用”的基础。
2. 启动 PostgreSQL MCP 服务器并验证连通性
首先确保你已经有一个 PostgreSQL 实例。如果你本地没有,可以用 Docker 快速起一个:
docker run --name hermes-pg -e POSTGRES_PASSWORD=hermes123 -p 5432:5432 -d postgres:16
然后创建一张测试表,放入一些供 Agent 查询的示例数据:
-- 通过 psql 或任何客户端执行
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
product VARCHAR(50),
amount DECIMAL(10,2),
sold_at TIMESTAMP DEFAULT NOW()
);
INSERT INTO sales (product, amount, sold_at) VALUES
('Widget A', 150.00, '2026-06-01 10:00:00'),
('Widget B', 90.50, '2026-06-01 11:00:00'),
('Widget A', 200.00, '2026-06-02 09:30:00');
接下来安装并启动 PostgreSQL MCP 服务器。该服务器由 ModelContextProtocol 官方维护,通过 npx 运行。先确保你安装了 Node.js 22+,然后在终端中手动启动一次,验证其能否正常连接数据库:
npx -y @modelcontextprotocol/server-postgres postgres://postgres:hermes123@localhost:5432/postgres
如果成功,你会看到类似 Server started 的日志输出,并且进程保持在前台。此时该 MCP 服务器已准备好为 Hermes 提供以下工具(由 MCP 服务器自行声明):
query: 执行只读 SQL 查询(SELECT)list_tables: 列出所有表describe_table: 查看表结构
踩坑经验:国内用户执行 npx 时可能因为 npm 官方源速度慢导致超时。可在命令前添加 --registry=https://registry.npmmirror.com 或设置全局镜像:
npx --registry=https://registry.npmmirror.com -y @modelcontextprotocol/server-postgres ...
3. 在 Hermes 配置中注册 MCP 服务器
打开 Hermes 的配置文件(通常为 ~/.hermes/config.yaml 或项目内的 hermes.yaml),在 mcp_servers 段落下添加:
mcp_servers:
- name: postgres-db
command: npx
args:
- "-y"
- "@modelcontextprotocol/server-postgres"
- "postgres://postgres:hermes123@localhost:5432/postgres"
# 此处 allowed_tools 我们将在安全控制步骤中配置,先留空表示允许全部
allowed_tools: []
保存后重启 Hermes(如果是桌面版则重启应用,CLI 版则重新执行启动命令)。在启动日志中你应该能看到类似:
[MCP] Connecting to server 'postgres-db'...
[MCP] Successfully connected to 'postgres-db', discovered 3 tools.
此时 Hermes 的工具列表中已经包含了 query、list_tables 和 describe_table 这三个新工具。你可以通过以下对话测试是否生效:
你:今天 Widget A 的总销售额是多少?
Hermes 会自主决定调用 query 工具,发送类似 SELECT SUM(amount) FROM sales WHERE product = 'Widget A' AND sold_at::date = CURRENT_DATE 的查询(实际生成可能不同),并给出结果。
视觉清单:关键配置项说明
| 配置项 | 说明 | 必填 |
|---|---|---|
name |
自定义的服务器名称,用于工具调用时的标识 | 是 |
command |
启动 MCP 服务器的命令(npx、python、uvx 等) |
是 |
args |
传递给命令的参数列表,包含 MCP 包名和服务器启动参数 | 是 |
env |
需要注入的环境变量,如 API Key、数据库密码等 | 否 |
allowed_tools |
工具白名单,留空表示允许全部;填写工具名列表则仅允许这些 | 否 |
4. 构建一个 MCP 技能:将数据库查询封装为可复用的 Skill
Hermes 有一个强大的内置功能:可以从任何成功的工具调用中自动生成 Skill。这意味着你不必手动编写代码来创建一个“查询今日销售总额”的专用工具——让 Agent 自己做一遍,然后保存为 Skill。
具体操作:
-
向 Hermes 发送一个清晰的任务描述,让它使用 MCP 工具完成一次查询:
你:帮我写一个“查询每日销售摘要”的 skill。每天执行时,它会查询 sales 表中当日每种产品的总销售额,并按金额降序排列。
Hermes 会调用
query工具执行如下查询(示例):SELECT product, SUM(amount) as total_sales FROM sales WHERE sold_at::date = CURRENT_DATE GROUP BY product ORDER BY total_sales DESC; -
执行成功后,对 Hermes 说:
你:把这个操作保存为 skill,名字叫 daily-sales-summary。
根据 Hermes 的学习循环机制,它会提取出这次交互中的工具调用模式、参数化和上下文,生成一个可复用的 Skill 并存入 Skill 库。
-
以后你只需说 “运行 daily-sales-summary”,Hermes 就会自动调用该 Skill,而无需重新推理 SQL 写法。
注意:Hermes 生成的 Skill 本质上是“带上下文和执行策略的模板”,它并不将 SQL 硬编码进 Skill 定义,而是保存了“任务目标 + 典型工具调用序列 + 推理约束”。这使得同一 Skill 在未来即使表结构发生变化,也有一定适应能力。这种设计来自 Hermes 的记忆学习与自进化闭环。
此时,你已经成功将外部 MCP 工具转化为一个 Hermes 原生 Skill,复用成本极低。
5. 安全与权限控制:收紧 MCP 工具访问范围
实际应用中,你可能不希望 Agent 拥有对数据库的写权限,甚至只允许它查询特定的表或列。Hermes 提供了两层防护:
-
MCP 服务器侧限制:许多官方 MCP 服务器提供只读模式。对于
server-postgres,启动命令添加--read-only即可(截至当前调研资料,该参数在 readme 中有提及):npx -y @modelcontextprotocol/server-postgres postgres://... --read-only此时任何非 SELECT 语句都会被服务器拒绝。
-
Hermes 配置侧白名单:在
mcp_servers的对应条目中设置allowed_tools,例如:mcp_servers: - name: postgres-db command: npx args: ["-y", "@modelcontextprotocol/server-postgres", "postgres://..."] allowed_tools: - query - list_tables - describe_table # 如果不去掉 list_tables,describe_table,Agent 可枚举表结构,根据安全策略决定如果只想暴露查询功能,可以进一步缩小白名单:
allowed_tools: - query踩坑经验:如果白名单写错工具名(例如写成
execute_query),Hermes 启动时会报错并提示“工具未找到”。请严格使用 MCP 服务器在连接时声明的确切工具名。你可以通过查看 Hermes 启动日志中discovered X tools: [tool1, tool2, ...]的输出来确认正确名称。
另外,可以在 Hermes 的全局设置中启用“敏感操作需二次确认”模式,要求 Agent 在执行任何 MCP 工具前请求人工批准。这在企业环境中尤为重要,不过配置细节不在本教程范围,可参阅官方文档“Tool Execution Policy”章节。
结合以上手段,你可以安全地将生产数据库的只读视图暴露给 Hermes,用于生成日报、分析趋势,而无需担心数据被误改。
安全边界总结表
| 防护层 | 作用 | 典型配置 |
|---|---|---|
| MCP 服务器参数 | 在数据访问层做硬限制 | --read-only |
| Hermes 白名单 | 控制 Agent 可见的工具集合 | allowed_tools: [query] |
| 工具执行策略 | 增加人工审批环节 | execution_policy: require_approval(全局设置) |
回顾
你刚刚完成了一次“从零到 Skill”的 MCP 工具链路打通:
- 理解了 MCP 协议如何将外部系统抽象为标准工具服务器
- 启动了 PostgreSQL MCP 服务器并验证了连通性
- 在 Hermes 中通过 6 行 YAML 配置注册了该服务器
- 让 Agent 执行了一次复杂查询,并将其封装为可复用 Skill
- 应用了双重安全策略,确保 Agent 只能读取、不能写入
整个过程没有编写任何 Python/Node.js 代码来对接数据库,也没有修改 Hermes 源代码。这就是 MCP 工具链带来的价值:工具集成从“定制开发”变成“配置组装”,Agent 的能力边界由外部服务生态决定,而非开发团队的精力瓶颈。
行动清单
- [ ] 在本地或测试环境中创建一个 Hermes 项目,启动一个你常用的 MCP 服务器(如文件系统、GitHub 等),完成一次工具调用。
- [ ] 尝试将一次成功的工具调用保存为 Skill,观察 Skill 库中的条目变化。
- [ ] 为你的 MCP 服务器配置
allowed_tools白名单,验证未知工具名会触发启动报错。 - [ ] 阅读 Hermes 官方 MCP 集成文档的“环境变量与密钥管理”一节,学习如何在配置中安全注入数据库密码等敏感信息。
- [ ] 思考:除了数据库,你团队还有哪些日常操作可以抽象为 MCP 工具并交给 Hermes?列一个清单,下一步就是扩展。
下一章,我们将进入 Hermes 的另一个“反直觉”核心机制:周期性 Nudge。它如何在没有用户主动触发的情况下,让 Agent 自动进行复盘和自我优化?这是 Hermes 实现“自进化”的关键一环,你将会看到 Nudge 信号的产生、处理与闭环逻辑。
Hermes Agent 系统设计与工程落地
关于 LearnKu