从一封催款邮件说起:Agent 需要两只手

你手上有个 Hermes Agent,能写文案、能总结报表。但你让它“查一下今天哪些订单超过 7 天没付款,然后给客户发提醒邮件”,它卡住了。LLM 没有手,它看不到你的 MySQL 里有什么数据,也没有发信通道。要让 Agent 真正干活,得给它接上工具。

MCP(Model Context Protocol)就是干这个的。Anthropic 在 2024 年底开源这套协议后,它成了 AI 工具调用的实际标准。Hermes Agent 从 0.4.0 开始内置 MCP 客户端,你可以把数据库、邮件、文件系统、HTTP API 都包装成 MCP 服务器,让 Agent 按需调用。

这篇教程用真实命令走一遍:装 Hermes Agent,接一个 MySQL MCP 服务器,再接一个 SMTP 邮件服务器,写一个技能让 Agent 自动完成“查库→发信”。环境是 Ubuntu 22.04,Python 3.11.6,Hermes 0.4.2。

需求拆成三件事。第一,让 Agent 能执行 SELECT 查询,从 orders 表捞数据。第二,让 Agent 能调 SMTP 发信,把提醒邮件发到客户邮箱。第三,把两个动作串成一个技能,定时跑。MCP 的架构不复杂:Agent 是客户端,MCP 服务器是工具提供方。每个服务器暴露一组工具,比如 mysql 服务器暴露 query 工具,smtp 服务器暴露 send_email 工具。Agent 收到你的自然语言指令后,自己决定调哪个工具、传什么参数。不需要你写代码控制流程。

好处是省事,坏处是工具调用失败时报错信息藏在进程日志里,排查比普通函数调用麻烦。后面我把常见坑都列出来。

装好 Hermes Agent,接上 MySQL 数据库

先装 Hermes。建议用虚拟环境,别怼到系统 Python 里。

python3 -m venv venv
source venv/bin/activate
pip install hermes-agent

装完确认版本:

hermes --version

输出应该是 hermes-agent 0.4.2 或更高。如果看到 0.3.x,是 pip 缓存了旧版,用 pip install --upgrade hermes-agent 强制更新。

MCP 服务器依赖 Node.js 18+。检查一下:

node --version

Ubuntu 22.04 自带 node 12.x,太旧,npx 跑不起来。从 nodesource 装 18.x:

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

Hermes 的配置文件在 ~/.hermes/config.yaml。默认不存在,先运行 hermes init 生成。然后注册 MySQL MCP 服务器。官方包名是 @modelcontextprotocol/server-mysql,用 npx 启动。在 config.yaml 里加:

mcp_servers:
  mysql:
    command: npx
    args:
      - -y
      - @modelcontextprotocol/server-mysql
    env:
      MYSQL_HOST: 127.0.0.1
      MYSQL_PORT: 3306
      MYSQL_USER: root
      MYSQL_PASS: "你的密码"
      MYSQL_DB: shop

env 的值都要是字符串。密码别用纯数字开头,YAML 会解析成整数导致连接失败。保存后跑:

hermes mcp list

正常输出里应该有 mysql 服务器,下面有 query 和 list_tables 两个工具。如果报错 ECONNREFUSED 127.0.0.1:3000,说明你写成了 SSE 地址,MCP 本地工具用 stdio 方式,配置里只写 command 和 args,不写 url。如果连接超时,是 npx 首次下载包太慢,先手动跑 npx -y @modelcontextprotocol/server-mysql --help 缓存包。

测试 Agent 查库:

hermes run "查一下 orders 表里 status='unpaid' 的记录数"

Agent 会调用 query 工具执行 SELECT count(*) FROM orders WHERE status='unpaid'。如果 Agent 说没权限查数据库,检查 YAML 缩进,mcp_servers 和 agent 是平级,别塞进别的段。

接上 SMTP,让 Agent 能发邮件

邮件这块没有官方 MCP 服务器,我用一个 Python 写的轻量 MCP 服务器,代码不到 50 行。建目录:

mkdir -p ~/.hermes/mcp-servers
cd ~/.hermes/mcp-servers

写 mail_server.py,核心逻辑是用 smtplib 发信,包装成 MCP 工具。关键片段:

from mcp.server import Server
from mcp.types import Tool
import smtplib
import os

app = Server("mail-server")

@app.list_tools()
async def list_tools():
    return [Tool(
        name="send_email",
        description="发送邮件,参数:to, subject, body",
        inputSchema={
            "type": "object",
            "properties": {
                "to": {"type": "string"},
                "subject": {"type": "string"},
                "body": {"type": "string"}
            },
            "required": ["to", "subject", "body"]
        }
    )]

实现函数里用 smtplib.SMTP_SSL 连服务器,端口 465。我这里用 QQ 邮箱 SMTP:smtp.qq.com,端口 465。QQ 邮箱不能用登录密码,要在设置里开启 SMTP 服务,生成 16 位授权码。call_tool 函数里,先构建 MIMEText 对象,再 SMTP_SSL 连接、login、sendmail。

在 config.yaml 里注册:

  mail:
    command: python3
    args:
      - /home/你的用户名/.hermes/mcp-servers/mail_server.py
    env:
      SMTP_HOST: smtp.qq.com
      SMTP_PORT: "465"
      SMTP_USER: "你的邮箱@qq.com"
      SMTP_PASS: "你的16位授权码"

测试发信:

hermes run "给 test@example.com 发一封测试邮件,主题是 MCP 测试,正文写 你好"

常见报错一:

smtplib.SMTPAuthenticationError: (535, b'login fail')

授权码不对或 SMTP 服务没开。去邮箱设置里确认。常见报错二:

smtplib.SMTPConnectError: (421, b'connect to smtp.qq.com timeout')

网络问题。海外服务器连 QQ 邮箱经常超时,换 SendGrid 或阿里云邮件推送,改 SMTP_HOST 和端口就行。

还有个小坑:Agent 生成的正文可能带 \n 转义字符而不是真换行,邮件显示成一行。在实现里加 body.replace("\\n", "\n") 解决。

写个技能,把查库和发信串起来

工具都通了,写一个技能把“查未付款订单→生成提醒邮件→发信”串起来。技能文件放 ~/.hermes/skills/,YAML 格式。我建 dunning.yml:

name: dunning
description: 查询未付款订单并发送催款邮件
steps:
  - action: tool
    server: mysql
    tool: query
    params:
      sql: "SELECT id, customer_email, amount FROM orders WHERE status='unpaid' AND created_at < NOW() - INTERVAL 7 DAY"
  - action: loop
    for_each: row
    steps:
      - action: tool
        server: mail
        tool: send_email
        params:
          to: "{{ row.customer_email }}"
          subject: "订单 {{ row.id }} 付款提醒"
          body: "您好,您的订单 {{ row.id }} 金额 {{ row.amount }} 元已逾期 7 天,请尽快付款。"

这是简化写法,实际 Hermes 技能格式略有差异,但结构是这样。加载技能:

hermes skill load dunning

手动跑一次:

hermes run "执行 dunning 技能"

你会看到 Agent 先调 mysql 的 query 工具,拿到结果后逐条调 mail 的 send_email。日志会打印每次工具调用的参数和返回。有个翻车点:数据库里 amount 是 Decimal 类型,转字符串会变成 Decimal('99.00')。在技能里加一步清洗,或让 Agent 用 round(float(amount), 2) 处理。

用 memory 命令记录客户信息,方便后续跟进:

hermes memory add --key customer_1001 --value "王总,订单 1001 逾期 9 天,已发两次提醒,电话 13800138000"
hermes memory get customer_1001

记忆存在 ~/.hermes/memory/ 下的 SQLite 里,重启不丢。

手动跑通后上定时任务:

hermes cron create --name dunning_daily --schedule "0 9 * * *" --skill dunning

每天早上 9 点执行。如果没触发,查时区。Hermes 默认 UTC,你写 0 9 实际是北京时间下午 5 点。在 config.yaml 里设:

timezone: Asia/Shanghai

改完重启 hermes 服务生效。查看任务列表用 hermes cron list,删任务用 hermes cron delete dunning_daily。

常见报错和排查清单

按频率排序,对照排查。

第一位:MCP 服务器启动超时。症状是 hermes mcp list 卡住,或 Agent 说“工具不可用”。原因是 npx 首次下载包太慢。手动 npx 跑一次缓存包,或用国内镜像:

npm config set registry https://registry.npmmirror.com

第二位:工具参数类型不匹配。Agent 调用 send_email 时把 to 传成数组,MCP 校验失败:

Error: Invalid params: to must be string

在 inputSchema 的 description 里写清楚“收件人邮箱,必须是单个字符串,不要传数组”,能显著减少这类错误。

第三位:MySQL 查询结果太大。几十万行数据拉回来,MCP 传输层内存溢出。技能里 SQL 加 LIMIT 100,或让 Agent 先做聚合统计。

第四位:发信频率限制。QQ 邮箱每天有上限,超了返回 550 错误:

smtplib.SMTPDataError: (550, b'Daily limit exceeded')

只能等第二天,或换企业邮箱服务。生产环境用阿里云邮件推送,单日配额 1000 封。

第五位:YAML 语法错误。最常见是缩进不对或密码含冒号没加引号。Hermes 启动时报:

yaml.parser.ParserError: while parsing a block mapping

用 python3 -c "import yaml; yaml.safe_load(open('/root/.hermes/config.yaml'))" 检查语法。

日志在 ~/.hermes/logs/ 目录,按日期滚动。MCP 服务器输出以子进程日志记录。排查时先 tail:

tail -f ~/.hermes/logs/hermes.log

另外提醒一句:MCP 工具给了 Agent 执行能力,权限要收紧。MySQL 账号只给 SELECT 权限,别用 root。SMTP 授权码单独申请。这样即使 Agent 被提示词注入攻击,破坏范围也有限。

💬 你用过哪些AI工具?

这套 MCP 配置你跑通了吗?我花了整整一个下午才搞定 SMTP 授权码的坑,后来发现是 QQ 邮箱设置里没开“允许弱密码登录”。你平时给 Agent 配过哪些工具?数据库、邮件还是爬虫?配 MCP 时遇到最离谱的报错是什么?

如果你在选模型搭 Agent,可以去 AI House 排行榜(aibunkhouse.com/rankings/)看看最新模型排名,上面有社区实时投票。你用的 Claude、GPT、文心、通义都在榜上,给用得顺手的模型投一票,帮其他人少走弯路。

常见问题 / FAQ

从一封催款邮件说起:Agent 需要两只手

你手上有个 Hermes Agent,能写文案、能总结报表。但你让它“查一下今天哪些订单超过 7 天没付款,然后给客户发提醒邮件”,它卡住了。LLM 没有手,它看不到你的 MySQL 里有什么数据,也没有发信通道。要让 Agent 真正干活,得给它接上工具。 MCP(Model Context Protocol)就是干这个的。Anthropic 在 2024 年底开源这套协议后,它成了 AI...

装好 Hermes Agent,接上 MySQL 数据库

先装 Hermes。建议用虚拟环境,别怼到系统 Python 里。 python3 -m venv venv source venv/bin/activate pip install hermes-agent 装完确认版本: hermes --version 输出应该是 hermes-agent 0.4.2 或更高。如果看到 0.3.x,是 pip 缓存了旧版,用 pip instal...

接上 SMTP,让 Agent 能发邮件

邮件这块没有官方 MCP 服务器,我用一个 Python 写的轻量 MCP 服务器,代码不到 50 行。建目录: mkdir -p ~/.hermes/mcp-servers cd ~/.hermes/mcp-servers 写 mail_server.py,核心逻辑是用 smtplib 发信,包装成 MCP 工具。关键片段: from mcp.server import Server ...

写个技能,把查库和发信串起来

工具都通了,写一个技能把“查未付款订单→生成提醒邮件→发信”串起来。技能文件放 ~/.hermes/skills/,YAML 格式。我建 dunning.yml: name: dunning description: 查询未付款订单并发送催款邮件 steps: - action: tool server: mysql tool: query params: ...

常见报错和排查清单

按频率排序,对照排查。 第一位:MCP 服务器启动超时。症状是 hermes mcp list 卡住,或 Agent 说“工具不可用”。原因是 npx 首次下载包太慢。手动 npx 跑一次缓存包,或用国内镜像: npm config set registry https://registry.npmmirror.com 第二位:工具参数类型不匹配。Agent 调用 send_email ...