MCP(模型上下文协议)¶
AgentScope Java 提供对模型上下文协议(MCP)的完整支持,使智能体能够连接到外部工具服务器并使用 MCP 生态系统中的工具。
什么是 MCP?¶
MCP 是用于将 AI 应用程序连接到外部数据源和工具的标准协议。它支持:
统一的工具接口:通过单个协议访问各种工具
外部工具服务器:连接到专门的服务(文件系统、git、数据库等)
生态系统集成:使用不断增长的 MCP 生态系统中的工具
灵活的传输:支持 StdIO、SSE 和 HTTP 传输
前置条件¶
Maven 依赖¶
要使用 MCP 功能,您需要在项目中添加 MCP SDK 依赖:
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp</artifactId>
<version>0.14.1</version>
</dependency>
注意:MCP SDK 不会自动包含在 AgentScope 中。您必须显式地将其添加到 pom.xml 中。
Gradle 依赖¶
对于 Gradle 项目:
implementation 'io.modelcontextprotocol.sdk:mcp:0.14.1'
传输类型¶
AgentScope 支持三种 MCP 传输机制:
传输 |
使用场景 |
连接方式 |
状态 |
|---|---|---|---|
StdIO |
本地进程通信 |
启动子进程 |
有状态 |
SSE |
HTTP Server-Sent Events |
HTTP 流式 |
有状态 |
HTTP |
可流式 HTTP |
请求/响应 |
无状态 |
快速开始¶
1. 连接到 MCP 服务器¶
import io.agentscope.core.tool.mcp.McpClientBuilder;
import io.agentscope.core.tool.mcp.McpClientWrapper;
// StdIO 传输 - 连接到本地 MCP 服务器
McpClientWrapper mcpClient = McpClientBuilder.create("filesystem-mcp")
.stdioTransport("npx", "-y", "@modelcontextprotocol/server-filesystem", "/tmp")
.buildAsync()
.block();
2. 注册 MCP 工具¶
import io.agentscope.core.tool.Toolkit;
Toolkit toolkit = new Toolkit();
// 注册 MCP 服务器的所有工具
toolkit.registerMcpClient(mcpClient).block();
3. 在智能体中配置 MCP¶
import io.agentscope.core.ReActAgent;
import io.agentscope.core.memory.InMemoryMemory;
ReActAgent agent = ReActAgent.builder()
.name("Assistant")
.model(model)
.toolkit(toolkit) // MCP 工具现已可用
.memory(new InMemoryMemory())
.build();
传输配置¶
StdIO 传输¶
用于本地进程通信:
// 文件系统服务器
McpClientWrapper fsClient = McpClientBuilder.create("fs-mcp")
.stdioTransport("npx", "-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir")
.buildAsync()
.block();
// Git 服务器
McpClientWrapper gitClient = McpClientBuilder.create("git-mcp")
.stdioTransport("python", "-m", "mcp_server_git")
.buildAsync()
.block();
// 自定义命令
McpClientWrapper customClient = McpClientBuilder.create("custom-mcp")
.stdioTransport("/path/to/executable", "arg1", "arg2")
.buildAsync()
.block();
SSE 传输¶
用于 HTTP Server-Sent Events:
McpClientWrapper sseClient = McpClientBuilder.create("remote-mcp")
.sseTransport("https://mcp.example.com/sse")
.header("Authorization", "Bearer " + apiToken)
.timeout(Duration.ofSeconds(60))
.buildAsync()
.block();
HTTP 传输¶
用于无状态 HTTP:
McpClientWrapper httpClient = McpClientBuilder.create("http-mcp")
.streamableHttpTransport("https://mcp.example.com/http")
.header("X-API-Key", apiKey)
.buildAsync()
.block();
工具过滤¶
控制要注册哪些 MCP 工具:
启用特定工具¶
// 仅启用特定工具
List<String> enableTools = List.of("read_file", "write_file", "list_directory");
toolkit.registration().mcpClient(mcpClient).enableTools(enableTools).apply();
禁用特定工具¶
// 启用除黑名单外的所有工具
List<String> disableTools = List.of("delete_file", "move_file");
toolkit.registration().mcpClient(mcpClient).disableTools(disableTools).apply();
同时使用启用和禁用¶
// 白名单与黑名单结合
List<String> enableTools = List.of("read_file", "list_directory");
List<String> disableTools = List.of("write_file");
toolkit.registration().mcpClient(mcpClient).enableTools(enableTools).disableTools(disableTools).apply();
工具组¶
将 MCP 工具分配到组以进行选择性激活:
// 创建工具组并激活
Toolkit toolkit = new Toolkit();
String groupName = "filesystem";
toolkit.createToolGroup(groupName, "Tools for operating system files", true);
// 将 MCP 工具注册到组中
toolkit.registration().mcpClient(mcpClient).group("groupName").apply();
// 创建仅使用特定组的智能体
ReActAgent agent = ReActAgent.builder()
.name("Assistant")
.model(model)
.toolkit(toolkit)
.build();
配置选项¶
超时设置¶
import java.time.Duration;
McpClientWrapper client = McpClientBuilder.create("mcp")
.stdioTransport("npx", "-y", "@modelcontextprotocol/server-filesystem", "/tmp")
.timeout(Duration.ofSeconds(120)) // 请求超时
.initializationTimeout(Duration.ofSeconds(30)) // 初始化超时
.buildAsync()
.block();
HTTP 头¶
McpClientWrapper client = McpClientBuilder.create("mcp")
.sseTransport("https://mcp.example.com/sse")
.header("Authorization", "Bearer " + token)
.header("X-Client-Version", "1.0")
.header("X-Custom-Header", "value")
.buildAsync()
.block();
同步 vs 异步客户端¶
// 异步客户端(推荐)
McpClientWrapper asyncClient = McpClientBuilder.create("async-mcp")
.stdioTransport("npx", "-y", "@modelcontextprotocol/server-filesystem", "/tmp")
.buildAsync()
.block();
// 同步客户端(用于阻塞操作)
McpClientWrapper syncClient = McpClientBuilder.create("sync-mcp")
.stdioTransport("npx", "-y", "@modelcontextprotocol/server-filesystem", "/tmp")
.buildSync();
管理 MCP 客户端¶
列出 MCP 服务器的工具¶
// 注册后,工具会出现在工具包中
Set<String> toolNames = toolkit.getToolNames();
System.out.println("可用工具: " + toolNames);
移除 MCP 客户端¶
// 移除 MCP 客户端及其所有工具
toolkit.removeMcpClient("filesystem-mcp").block();
完整示例¶
查看完整的 MCP 示例:
examples/src/main/java/io/agentscope/examples/McpToolExample.java
运行示例:
cd examples
mvn exec:java -Dexec.mainClass="io.agentscope.examples.McpToolExample"