MCPAgent 是一种专门的 Agent,旨在与遵循模型上下文协议 (Model Context Protocol, MCP) 的外部系统进行交互。它充当一座桥梁,允许您的 AIGNE 应用程序连接到远程 MCP 服务器,并利用其功能——例如工具、提示和资源——就好像它们是框架的原生组件一样。
这使得与各种外部服务的无缝集成成为可能,从数据库连接器、Web 自动化工具到专有的企业系统,只要它们暴露了符合 MCP 的接口。
主要功能包括:
- 多种传输协议:通过标准 I/O (
stdio)、服务器发送事件 (sse) 或streamableHttp连接到 MCP 服务器。 - 自动发现:自动发现并注册所连接 MCP 服务器上可用的工具、提示和资源。
- 稳健的连接管理:为基于网络的传输提供自动重连功能,以处理暂时的连接问题。
MCPAgent 如何工作
MCPAgent 封装了连接到 MCP 服务器并将其提供的功能转换为 AIGNE 构造的逻辑。当 MCPAgent 初始化时,它会连接到指定的服务器,并查询其可用的工具、提示和资源。然后,这些功能会分别作为 skills、prompts 和 resources 动态附加到 Agent 实例上,使其在您的 AIGNE 工作流中可以直接访问。

创建 MCPAgent
您可以使用静态 MCPAgent.from() 方法创建一个 MCPAgent 实例。这个工厂方法支持多种配置模式,具体取决于您需要如何连接到 MCP 服务器。
1. 通过标准 I/O (Stdio) 连接
这种方法非常适合将 MCP 服务器作为本地子进程运行。MCPAgent 通过其标准输入和输出流与服务器通信。
- command
string(required) — 执行以启动 MCP 服务器进程的命令。 - args
string[]— 传递给命令的字符串参数数组。 - env
Record<string, string>— 为子进程设置的环境变量。
连接到本地文件系统服务器
import { MCPAgent } from "@aigne/core";
// 通过运行命令行服务器创建一个 MCPAgent
await using mcpAgent = await MCPAgent.from({
command: "npx",
args: ["-y", "@modelcontextprotocol/server-filesystem", "."],
});
console.log('Connected to:', mcpAgent.name);
// 访问文件系统服务器提供的技能
const fileReader = mcpAgent.skills.read_file;
if (fileReader) {
const result = await fileReader.invoke({ path: "./package.json" });
console.log(result);
}2. 通过网络 (SSE 或 StreamableHTTP) 连接
这是通过网络连接到远程 MCP 服务器的标准方法。您可以选择两种传输协议:
sse:服务器发送事件,一种简单且广泛支持的流式传输协议。streamableHttp:一种更先进的双向流式传输协议。- url
string(required) — 远程 MCP 服务器端点的 URL。 - transport
'sse' | 'streamableHttp'(default:sse) — 要使用的传输协议。默认为 sse。 - opts
object— 传递给底层传输客户端的附加选项(例如,用于请求头和身份验证)。 - timeout
number(default:60000) — 请求超时时间(毫秒)。 - maxReconnects
number(default:10) — 如果连接丢失,尝试重新连接的最大次数。设置为 0 可禁用。 - shouldReconnect
(error: Error) => boolean— 一个函数,根据收到的错误返回 true 以决定是否应尝试重新连接。
通过 StreamableHTTP 连接
import { MCPAgent } from "@aigne/core";
// 使用 StreamableHTTP 服务器连接创建一个 MCPAgent
await using mcpAgent = await MCPAgent.from({
url: `http://localhost:3000/mcp`,
transport: "streamableHttp",
});
console.log('Connected to:', mcpAgent.name);
const echoSkill = mcpAgent.skills.echo;
if (echoSkill) {
const result = await echoSkill.invoke({ message: "Hello, World!" });
console.log(result);
}3. 使用预配置的客户端
如果您已经实例化并配置了一个 MCP Client 对象,您可以直接传递它来创建一个 MCPAgent。这对于需要对客户端配置进行精细控制的高级场景非常有用。
- client
Client(required) — 一个预配置的 MCP 客户端实例。 - prompts
MCPPrompt[]— 一个可选的预定义 MCP 提示数组。 - resources
MCPResource[]— 一个可选的预定义 MCP 资源数组。
从客户端实例创建
import { MCPAgent } from "@aigne/core";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
// 手动创建和配置客户端
const client = new Client({ name: "test-client", version: "1.0.0" });
const transport = new StdioClientTransport({
command: "bun",
args: ["./mock-mcp-server.ts"],
});
await client.connect(transport);
// 从现有的客户端实例创建一个 MCPAgent
await using mcpAgent = MCPAgent.from({
name: client.getServerVersion()?.name,
client,
});
console.log('Connected to:', mcpAgent.name);访问服务器功能
一旦 MCPAgent 连接成功,它会通过其属性暴露服务器的工具、提示和资源。
访问技能
服务器端的工具作为 skills 暴露在 MCPAgent 实例上。您可以通过名称访问它们并使用其 invoke 方法。这些技能可以传递给其他 Agent,例如 AIAgent,以赋予它们新的能力。
使用 MCPAgent 的技能
// 假设 `mcpAgent` 是一个已初始化的 MCPAgent
const echoSkill = mcpAgent.skills.echo;
if (echoSkill) {
const result = await echoSkill.invoke({ message: "Hello from AIGNE!" });
console.log(result);
// 预期输出:
// {
// "content": [
// { "text": "Tool echo: Hello from AIGNE!", "type": "text" }
// ]
// }
}访问提示
服务器定义的提示可在 prompts 属性下找到。这对于从服务器检索预定义的复杂提示结构非常有用。
访问服务器端提示
// 假设 `mcpAgent` 是一个已初始化的 MCPAgent
const echoPrompt = mcpAgent.prompts.echo;
if (echoPrompt) {
const result = await echoPrompt.invoke({ message: "Hello!" });
console.log(result);
// 预期输出:
// {
// "messages": [
// {
// "content": { "text": "Please process this message: Hello!", "type": "text" },
// "role": "user"
// },
// ...
// ]
// }
}访问资源
服务器托管的资源或资源模板可以通过 resources 属性访问。这允许您通过扩展 URI 模板从服务器读取数据。
读取服务器端资源
// 假设 `mcpAgent` 是一个已初始化的 MCPAgent
const echoResource = mcpAgent.resources.echo;
if (echoResource) {
const result = await echoResource.invoke({ message: "Hello!" });
console.log(result);
// 预期输出:
// {
// "contents": [
// { "text": "Resource echo: Hello!", "uri": "echo://Hello!" }
// ]
// }
}连接拆卸
正确关闭与 MCP 服务器的连接以释放资源非常重要。
手动关闭
您可以显式调用 shutdown() 方法。
手动关闭 Agent
const mcpAgent = await MCPAgent.from({
url: `http://localhost:3000/mcp`,
});
// ... 使用 Agent
await mcpAgent.shutdown();使用 using 自动关闭
对于支持 using 声明 (ES2023) 的环境,当 Agent 超出作用域时,其连接将自动关闭。这是管理 Agent 生命周期的推荐方法。
使用 'using' 自动关闭
async function connectAndUseAgent() {
await using mcpAgent = await MCPAgent.from({
url: `http://localhost:3000/mcp`,
});
// 在这里使用 Agent...
const echo = mcpAgent.skills.echo;
if (echo) await echo.invoke({ message: "Test" });
} // <-- mcpAgent.shutdown() 会在这里自动调用。总结
MCPAgent 是通过与外部系统集成来扩展 AIGNE 框架能力的关键组件。通过抽象连接和通信逻辑,它允许您将外部工具和数据源视为代理工作流中的一等公民。
有关如何使用 MCPAgent 提供的技能的更多信息,请参阅 AI Agent 文档。