返回博客
AI AgentsMCPTroubleshooting

Hermes Agent MCP 工具加载失败:快速修复

MCP 服务器已配置,会话里却看不到任何工具。五种沉默故障与逐一解决的诊断路径。

作者:Hermify Team||阅读约 2 分钟
深色技术场景,展示一个断开的 MCP 连接和文字 MCP Not Loading

你在 ~/.hermes/config.yaml 里加了一个 MCP 服务器,重启网关,让 Hermes 列出可用工具。什么新东西都没有。没有报错,没有告警,gateway.log 一片沉默。这篇文章就是从这份沉默走到会话中能真正调用 mcp_<server>_<tool> 的最短路径。

几乎所有报告过的问题都可以归为五种故障模式,每一种都藏在不同的位置。好消息是:hermes mcp listhermes mcp test 加一个日志级别开关,能在两分钟内告诉你自己遇到的是哪一种。

为什么会出现沉默故障

MCP 配置是 Hermes 里日志覆盖最差的一块。当加载器无法启动服务器、导入 Python 的 mcp 额外包,或者解析 mcp_servers 块时,失败信息只会写在 DEBUG 级别,默认安装下永远不会进入 gateway.log。在你这边看起来就像配置被接受了,只是工具本来就不存在。

修复的第一步是先提高可见性,然后再动其他任何东西。用详细日志重启 Hermes,让加载器直接告诉你它为什么放弃:

hermes serve --verbose
# 或者,如果通过 docker compose 启动:
HERMES_LOG_LEVEL=DEBUG docker compose up

现在再跑一次 hermes mcp list。如果服务器出现在列表里但下面没有挂着工具,说明连接建立了但发现失败。如果服务器根本不在列表里,说明加载器压根没注册它。这两条岔路能告诉你下面哪个修复才对。

原因一:Python 额外包 mcp 没装

如果你是从源码构建 Hermes,或者把版本固定在某个特定 tag 上,mcp 是一个可选额外包,默认安装并不会带上它。少了它,mcp_servers 下面的每一条都会被静默忽略。这是自定义安装中最常见的原因。

用带上 extra 的方式重新安装:

cd ~/.hermes/hermes-agent
uv pip install -e ".[mcp]"
hermes serve --verbose

如果网关现在能启动并尝试去连服务器,那你之前就是缺 SDK。如果日志还在说 mcp module not available,说明 extra 没有装到 Hermes 实际使用的解释器里:检查 hermes --version 找到 venv 路径,然后在里面重新安装。

原因二:YAML 缩进偏了一个空格

YAML 会静默丢弃任何缩进和父级不匹配的块。一个跑掉的 tab、一个错误深度的 - 、命令字符串里没有加引号的冒号,都会让整个 mcp_servers 映射消失,不会给你一行提示。

安全的写法是:两个空格的缩进,凡是含冒号的字符串都加引号,列表用 - 表示:

mcp_servers:
  filesystem:
    command: "npx"
    args: ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
    enabled: true
  stripe:
    url: "https://mcp.stripe.com/v1/sse"
    enabled: true

两个快速检查:先跑 python -c "import yaml; yaml.safe_load(open('$HOME/.hermes/config.yaml'))" 确认文件本身能被解析,再跑 hermes mcp list 确认名字有出现。如果文件能解析、但从 Hermes 视角看这个块是空的,那就是缩进错了,虽然 YAML 语法本身合法。

原因三:宿主机上没有 nodenpx

社区里大多数 MCP 服务器都以 npm 包发布,用 npx -y @modelcontextprotocol/server-<name> 启动。如果宿主机的 PATH 里没有 Node.js,子进程还没打印任何东西就退出了,而 Hermes 只会在 DEBUG 级别记录这个失败。这在极简 Docker 容器里最常见。

先在 Hermes 之外把启动命令跑一遍:

node --version
npx --version
npx -y @modelcontextprotocol/server-filesystem /tmp

如果三条命令里有任何一条失败,就在 Hermes 运行的同一个环境里安装 Node.js。在 Docker 里意味着往镜像里加 nodejsnpm,或者选一个已经带这些的基础镜像。Hermes 没法启动一个根本不存在的 Node 二进制。

原因四:服务器连上了,但工具从未进入会话

你在 hermes mcp list 里看到服务器,hermes mcp test <server> 也能发现它的工具,可会话里就是没有任何新的可调用项。这就是 issue #51587issue #71736 记录的故障:发现成功了,但工具从未被注入到会话工具集中。

可靠的绕过方式:

  • 在 Hermes 会话里执行 /reload-mcp,或者干脆重启整个网关。有些构建只在启动时填充一次工具集,会漏掉稍晚启动的服务器。
  • 检查会话上的 enabled_toolsets 字段。如果它被约束得很紧(例如 ACP 会话把它硬编码成 ["hermes-acp"]),MCP 工具会被设计上排除掉,需要把工具集放宽。
  • 确认你的服务商真的支持工具调用。Ollama 模型必须用与 Hermes 兼容的工具模板启动;较老的本地模型会报告发现了工具,但从来不会真的调用。

原因五:你的服务商悄悄丢掉了 tool call

即便服务器在跑、工具都注册好了,某些服务商也会在模型看到 tool payload 之前把它剥掉。表现出来的症状和 MCP 出问题一模一样:工具存在,但你请求时什么都不会发生。

两分钟自检:把会话切换到一个已知支持工具调用的服务商(任何较新的 Anthropic、OpenAI 或 Groq 模型),问同一个问题。如果在那边工具能触发,问题就出在你的服务商或模型选择上,不在 MCP。如果依然不触发,回到原因四。

按顺序执行的诊断路径

按下面的顺序执行,一旦某一步改变了你看到的现象就停下:

  1. hermes serve --verbose - 现在故障会打到 stdout。
  2. python -c "import yaml; yaml.safe_load(open('$HOME/.hermes/config.yaml'))" - 确认文件至少能被解析。
  3. hermes mcp list - 展示加载器实际接受了什么。
  4. hermes mcp test <server> - 展示连接和发现是否成立。
  5. hermes mcp health - 需要交接给别人时的每个服务器状态快照。
  6. 在会话里执行 /reload-mcp,或者完整重启网关。
  7. 换成另一个服务商跑两分钟,做一次 A/B。

想要更完整地熟悉这套诊断面,可以看 Hermes 调试与可观测性指南,它讲了 gateway.log、按工具追踪调用以及如何清爽地 tail 一切。如果你还在搭第一个 MCP 服务器,MCP 配置指南 会带你走一遍配置文件形状,让上面这些故障根本没机会出现。

直接跳过整个这层表面

这篇文章里的每一种故障,都源自 Hermes 与其宿主之间的错配:缺失的 Python 额外包,缺失的 Node 二进制,配置文件上写错的权限,会话启动顺序的 bug。Hermify 会替你把这整层表面都跑起来。

开始使用 Hermify,在 Telegram 上运行一个托管的 Hermes Agent,MCP 已经接好,mcp 额外包已装,宿主机上有 npx,改配置自动重载也是出厂就能用的。你的 MCP 配置还在你手里,记忆还在你手里,也不用在周二晚上再去调 YAML 缩进。

来源

运行你自己的 Hermes Agent

自带 API 密钥,连接 Telegram,60 秒内即可上线一个自我改进的 AI 智能体。

立即开始