第 06 期 | MCP 工具生态:连接外部世界的桥梁
🎯 学习目标
- 深入理解 Model Context Protocol (MCP) 的核心概念、设计哲学及其在 Hermes Agent 中的关键作用。
- 掌握如何在 Hermes Agent 中配置和管理 MCP Server,使其能够连接并操作外部资源。
- 通过实战演练,学习如何利用社区或自定义的 MCP Server(如文件系统、Web API)赋能 Agent 访问和修改外部数据。
- 理解 MCP 如何与 Hermes Agent 的 Skills (技能) 和 Memory (记忆) 系统协同工作,构建更强大、更具操作性的 AI 代理。
📖 核心概念讲解
6.1 Model Context Protocol (MCP) 概览:Agent 与外部世界的接口
在之前的课程中,我们已经了解了 Hermes Agent 如何通过 Skills (技能,第三期) 实现自我进化,以及如何通过 Memory (记忆,第四期) 维持跨会话的持久性。然而,一个真正强大的 AI 代理,不仅需要学习和记忆,更需要具备与外部世界进行交互和操作的能力。这就是 Model Context Protocol (MCP) 登场的原因。
什么是 MCP?
Model Context Protocol (MCP) 是一种标准化的通信协议,旨在弥合大型语言模型 (LLM) 与外部工具、服务和数据源之间的鸿沟。简单来说,它定义了一种统一的方式,让 LLM 能够理解和调用各种外部功能,而无需关心这些功能的底层实现细节。想象一下,LLM 就像一个大脑,它能思考、规划,但它需要“手”和“脚”去执行物理世界的任务。MCP 就是这些“手脚”的操作系统和接口规范。
在 Hermes Agent 的语境下,MCP 允许 Agent 不仅仅停留在“思考”层面,而是能够:
- 读取外部信息:例如,从文件系统读取文件内容、从数据库查询数据、调用天气 API 获取实时天气预报。
- 写入或修改外部状态:例如,向文件写入数据、更新数据库记录、通过 API 发送邮件或触发自动化流程。
- 执行复杂操作:通过集成各种外部工具,Agent 可以执行更复杂的任务,如代码编译、图片处理、甚至是控制智能家居设备。
MCP 的设计哲学
MCP 的核心设计理念是抽象化和标准化。它将外部工具或服务的功能封装成一套统一的、LLM 友好的接口描述。这意味着,无论底层工具是 Python 脚本、RESTful API、SQL 数据库还是命令行工具,MCP Server 都会将其转化为 LLM 能够理解的“能力清单”和“调用方式”。
这种抽象带来了几个显著优势:
- 降低 LLM 理解难度:LLM 不需要学习特定工具的复杂语法或 API 结构,只需理解 MCP 提供的标准化描述。
- 提高可扩展性:开发者可以轻松地将新工具或服务包装成 MCP Server,而无需修改 Agent 的核心逻辑。
- 增强互操作性:不同的 Agent 即使使用不同的 LLM,只要它们都理解 MCP,就可以共享和调用相同的外部工具。
我们可以用一个简单的 ASCII 图来表示 MCP 在 Agent 架构中的位置:
+-------------------+ +-------------------+ +-----------------------+
| Hermes Agent | | MCP Server | | External Resources |
| (LLM Core) | | (Tool Adapter) | | (Filesystem, DB, API) |
+-------------------+ +-------------------+ +-----------------------+
^ ^ ^
| (MCP Calls) | (Native Protocol) |
+---------------------------+-----------------------------+
Agent 通过发出符合 MCP 规范的请求,与 MCP Server 进行通信。MCP Server 接收到请求后,会将其翻译成对应外部资源(如文件系统、数据库、Web API 等)能够理解的原生协议,并执行操作。操作结果再通过 MCP Server 翻译回 Agent 能够理解的格式。
6.2 MCP Server 类型与 Hermes Agent 集成
MCP Server 是实现 MCP 协议的具体服务,它充当了 Hermes Agent 与外部世界之间的翻译官和执行者。根据所连接的外部资源类型,MCP Server 可以有多种形式。Hermes Agent 通过配置来发现和使用这些 MCP Server。
常见的 MCP Server 类型
文件系统 MCP Server (Filesystem MCP Server):
- 功能: 允许 Agent 读取、写入、创建、删除文件和目录。这是最基础也是最常见的 MCP Server 类型,对于需要处理本地文件或配置文件、日志的 Agent 任务至关重要。
- 实现: 通常通过一个简单的 HTTP 服务暴露文件操作接口,Agent 通过 HTTP 请求调用这些接口。
- 使用场景: 编写文档、生成报告、处理数据文件、管理代码库。
数据库 MCP Server (Database MCP Server):
- 功能: 允许 Agent 执行 SQL (结构化查询语言) 或 NoSQL (非结构化查询语言) 查询,进行数据的增删改查。
- 实现: 通常是一个服务,封装了特定数据库(如 PostgreSQL, MySQL, MongoDB, Redis)的客户端库,提供统一的 API 接口。
- 使用场景: 数据分析、信息检索、业务流程自动化(如订单管理、用户管理)。
API/Web Service MCP Server (API/Web Service MCP Server):
- 功能: 允许 Agent 调用外部的 RESTful API、SOAP 服务或其他网络服务。这是连接几乎所有 SaaS (软件即服务) 应用和自定义服务的通用方式。
- 实现: MCP Server 封装了对外部 API 的认证、请求构建和响应解析逻辑。
- 使用场景: 获取实时信息(天气、股票、新闻)、发送通知(邮件、短信)、集成第三方服务(GitHub, Jira, Salesforce)。
自定义工具 MCP Server (Custom Tool MCP Server):
- 功能: 允许 Agent 调用任何通过脚本或程序实现的自定义工具。
- 实现: 开发者将自定义逻辑包装成一个可执行的服务,并定义其 MCP 接口。
- 使用场景: 运行特定算法、执行复杂计算、与特定硬件交互。
Hermes Agent 如何集成 MCP Server?
Hermes Agent 通过其配置系统来管理 MCP Server。核心是通过 hermes config set 命令来指定 MCP Server 的地址。当 Agent 需要执行一个依赖外部工具的 Skill 时,它会向配置的 MCP Server 发送请求。
MCP Server 的发现与能力声明
一个 MCP Server 在启动时,通常会向 Hermes Agent 注册自己,或者 Hermes Agent 会主动查询 MCP Server 来获取其提供的能力清单。这个清单包含了 MCP Server 能够执行的所有操作(例如,read_file, write_file, query_database, send_email),以及每个操作所需的参数和预期返回值。这个过程通常遵循 OpenAPI (以前的 Swagger) 规范或类似的结构化描述。
当 Agent 接收到一个任务时,它会首先解析任务,然后根据自身已有的 Skills (技能) 和通过 MCP Server 了解到的外部工具能力清单,来规划执行步骤。如果某个步骤需要外部工具,Agent 就会构造一个符合 MCP 规范的请求,并发送给相应的 MCP Server。
Mermaid 流程图:Agent 如何使用 MCP
graph TD
A[用户提出任务] --> B(Hermes Agent)
B --> C{任务需要外部工具?}
C -- 是 --> D[Agent 查找可用 MCP Server 能力]
D --> E{找到匹配的工具能力?}
E -- 是 --> F[Agent 构造 MCP 请求]
F --> G[向 MCP Server 发送请求]
G --> H(MCP Server)
H --> I[MCP Server 执行原生操作]
I --> J[外部资源 (文件/DB/API)]
J --> I
I --> K[MCP Server 返回结果]
K --> L[Agent 接收并处理结果]
L --> B
E -- 否 --> M[Agent 报告无法完成或尝试其他策略]
C -- 否 --> B
B --> N[Agent 返回任务结果给用户]这个流程图清晰地展示了 Agent 如何在任务执行过程中,通过 MCP Server 与外部世界进行交互。MCP Server 就像一个翻译层,将 Agent 的高层意图转化为底层系统可执行的操作,并将结果反馈给 Agent。这使得 Hermes Agent 不再是一个封闭的系统,而是一个能够真正“连接外部世界”的强大实体。
在下一节的实战演示中,我们将具体配置一个文件系统 MCP Server,并让 Hermes Agent 实际操作文件,以加深对这一核心概念的理解。
💻 实战演示
在本节中,我们将通过两个实战场景来演示如何配置和使用 MCP Server。首先,我们将启动一个简单的文件系统 MCP Server,然后配置 Hermes Agent 使用它进行文件操作。
前提条件:
- Hermes Agent 已按照 第 01 期 | 认识 Hermes Agent:架构总览与极速安装 的说明安装。
- 你有一个可用的 LLM 配置(参见 第 02 期 | 模型切换与 Provider 配置实战)。本文假设你已配置好
OPENROUTER_API_KEY或其他模型提供商。
场景一:启动并配置一个简易文件系统 MCP Server
我们将使用一个简单的 Python HTTP 服务器来模拟一个文件系统 MCP Server。这个服务器将允许 Hermes Agent 读取和写入指定目录下的文件。
步骤 1: 创建一个工作目录和测试文件
首先,创建一个用于 MCP Server 的工作目录,并在其中放置一个示例文件。
# 创建 MCP 服务器的工作目录
mkdir -p hermes_mcp_fs_server
cd hermes_mcp_fs_server
# 创建一个用于测试的文件
echo "Hello from Hermes Agent tutorial!" > test_file.txt
# 验证文件内容
cat test_file.txt
预期输出:
Hello from Hermes Agent tutorial!
步骤 2: 编写并启动简易文件系统 MCP Server
我们将编写一个简单的 Python Flask 应用作为 MCP Server。这个服务器将提供 /read 和 /write 两个端点,分别用于读取和写入文件。
创建一个名为 mcp_fs_server.py 的文件,内容如下:
# mcp_fs_server.py
from flask import Flask, request, jsonify
import os
app = Flask(__name__)
# 定义服务器将操作的文件系统根目录
# 在实际生产环境中,需要更严格的权限控制和路径验证
FILE_SYSTEM_ROOT = os.path.abspath(os.path.dirname(__file__))
@app.route('/')
def index():
return "Hermes Agent Filesystem MCP Server is running!"
@app.route('/read', methods=['POST'])
def read_file():
data = request.json
filename = data.get('filename')
if not filename:
return jsonify({"error": "filename is required"}), 400
filepath = os.path.join(FILE_SYSTEM_ROOT, filename)
# 简单的路径验证,防止路径遍历攻击 (生产环境需更健壮)
if not os.path.abspath(filepath).startswith(FILE_SYSTEM_ROOT):
return jsonify({"error": "Access denied. File outside allowed directory."}), 403
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
return jsonify({"filename": filename, "content": content}), 200
except FileNotFoundError:
return jsonify({"error": f"File '{filename}' not found"}), 404
except Exception as e:
return jsonify({"error": str(e)}), 500
@app.route('/write', methods=['POST'])
def write_file():
data = request.json
filename = data.get('filename')
content = data.get('content')
if not filename or content is None:
return jsonify({"error": "filename and content are required"}), 400
filepath = os.path.join(FILE_SYSTEM_ROOT, filename)
# 简单的路径验证,防止路径遍历攻击 (生产环境需更健壮)
if not os.path.abspath(filepath).startswith(FILE_SYSTEM_ROOT):
return jsonify({"error": "Access denied. File outside allowed directory."}), 403
try:
with open(filepath, 'w', encoding='utf-8') as f:
f.write(content)
return jsonify({"filename": filename, "status": "success", "message": "File written successfully"}), 200
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
# 确保在 mcp_fs_server.py 所在的目录下运行
app.run(port=5000, debug=True)
现在,安装 Flask 并启动服务器:
# 确保在 hermes_mcp_fs_server 目录下
pip install Flask
python mcp_fs_server.py
预期输出(服务器启动信息):
* Serving Flask app 'mcp_fs_server'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: ...
让这个终端保持运行,服务器会监听 http://127.0.0.1:5000。
步骤 3: 配置 Hermes Agent 连接 MCP Server
在一个新的终端中,配置 Hermes Agent 指向我们刚刚启动的 MCP Server。
# 配置 Hermes Agent 的 MCP Server 地址
hermes config set core.mcp_server_url http://127.0.0.1:5000
预期输出:
Configuration updated: core.mcp_server_url = http://127.0.0.1:5000
现在,Hermes Agent 已经知道在哪里找到 MCP Server 了。
场景二:Hermes Agent 通过 MCP Server 进行文件读写操作
现在,我们将通过与 Hermes Agent 对话,让它利用配置的 MCP Server 进行实际的文件操作。
步骤 1: 启动 Hermes Agent 并与其对话
# 启动 Hermes Agent 交互模式
hermes
预期输出(Hermes Agent 启动信息):
... (Agent 启动信息,可能提示加载模型、记忆等) ...
>
步骤 2: 让 Agent 读取文件
在 Hermes Agent 的提示符 > 后输入指令,让它读取 test_file.txt 的内容。
> Read the content of 'test_file.txt'.
Hermes Agent 将会思考并决定使用 MCP Server 来执行文件读取操作。 预期输出(可能包含思考过程,最终会输出文件内容):
Thinking...
Action: Calling tool 'read_file' with args: {'filename': 'test_file.txt'}
Observation: {'filename': 'test_file.txt', 'content': 'Hello from Hermes Agent tutorial!\n'}
I have successfully read the content of 'test_file.txt'. It says: "Hello from Hermes Agent tutorial!"
注意: 这里的 read_file 是 Agent 根据 MCP Server 提供的能力描述(或者通过内置的默认 MCP 工具集)自动映射到的操作。如果 Agent 默认不知道 read_file 这个工具,你可能需要先定义一个 Skill 来封装这个 MCP 调用,但 Hermes 通常会智能地发现并利用这些基础的文件操作。
步骤 3: 让 Agent 写入新文件
接下来,让 Agent 创建一个新文件并写入内容。
> Create a new file named 'new_message.txt' with the content "This is a new message from Hermes Agent."
Hermes Agent 将会再次思考,并决定使用 MCP Server 来执行文件写入操作。 预期输出:
Thinking...
Action: Calling tool 'write_file' with args: {'filename': 'new_message.txt', 'content': 'This is a new message from Hermes Agent.'}
Observation: {'filename': 'new_message.txt', 'status': 'success', 'message': 'File written successfully'}
I have successfully created 'new_message.txt' with the specified content.
步骤 4: 验证新文件是否创建成功
切换回你的 hermes_mcp_fs_server 目录所在的终端(或者打开一个新的终端),检查文件是否确实被创建。
# 确保在 hermes_mcp_fs_server 目录下
ls
cat new_message.txt
预期输出:
mcp_fs_server.py new_message.txt test_file.txt
This is a new message from Hermes Agent.
恭喜!你已经成功地配置了一个简易的 MCP Server,并让 Hermes Agent 通过它与外部文件系统进行了交互。这仅仅是 MCP 强大能力的冰山一角。通过集成更复杂的 MCP Server,Hermes Agent 可以连接到数据库、调用各种 Web API,从而实现更广泛、更复杂的自动化任务。
当你完成测试后,可以通过 Ctrl+C 退出 Hermes Agent 和 MCP Server。
🔧 涉及的命令与工具
| 命令/工具 | 描述 | 示例 |
|---|---|---|
hermes |
Hermes Agent 的主命令,用于启动交互式会话或执行其他子命令。 | hermes |
hermes config set |
配置 Hermes Agent 的各项参数,包括 MCP Server 地址。 | hermes config set core.mcp_server_url http://127.0.0.1:5000 |
mkdir -p |
创建目录。 | mkdir -p hermes_mcp_fs_server |
cd |
切换当前工作目录。 | cd hermes_mcp_fs_server |
echo |
输出字符串到标准输出或文件。 | echo "Hello" > test.txt |
cat |
查看文件内容。 | cat test.txt |
ls |
列出目录内容。 | ls |
pip install Flask |
Python 包管理器,用于安装 Flask 库。 | pip install Flask |
python mcp_fs_server.py |
运行 Python 脚本,在此处用于启动简易的 Flask MCP Server。 | python mcp_fs_server.py |
Flask |
一个轻量级的 Python Web 框架,本教程中用于快速搭建模拟 MCP Server。 | from flask import Flask |
os 模块 |
Python 标准库,提供与操作系统交互的功能,如文件路径操作。 | import os |
📝 本期要点回顾
- MCP 是 Agent 连接外部世界的桥梁:Model Context Protocol (MCP) 定义了 AI 代理与外部工具、服务和数据源进行交互的标准方式,使其能够执行读写文件、查询数据库、调用 API 等实际操作。
- 抽象化与标准化是 MCP 核心:MCP 通过抽象底层工具的实现细节,为 LLM 提供统一、易于理解的接口描述,降低了 Agent 使用外部工具的复杂性。
- MCP Server 是执行者:MCP Server 是 MCP 协议的具体实现,它接收 Agent 的请求,将其翻译为外部资源(文件系统、数据库、Web API 等)的原生操作,并返回结果。
- Hermes Agent 通过配置集成 MCP Server:通过
hermes config set core.mcp_server_url命令,Hermes Agent 可以指定要连接的 MCP Server 地址,从而发现并利用其提供的能力。 - Agent 智能规划与执行:当接收到需要外部操作的任务时,Hermes Agent 会结合其 Skills (技能) 和 MCP Server 提供的工具能力,智能地规划并调用相应的 MCP 操作来完成任务。
🔗 参考资料
- Hermes Agent 官方文档: 深入了解 Hermes Agent 的各个模块和配置选项。
- NousResearch/hermes-agent GitHub 仓库: 查阅项目源码、贡献指南和最新进展。
- Flask 官方文档: 如果你对构建自己的 Web 服务或 MCP Server 感兴趣,Flask 是一个很好的起点。