Langchain4j-7-MCP
基本概念
MCP 让模型可以调用远程或本地的各种工具与资源,如果模型是大脑,MCP 则赋予了大脑手脚,使它可以与外界世界进行交互。
MCP协议指定了两种传输类型:
HTTP
:客户端请求一个 SSE 通道来接收来自服务器的事件,然后通过 HTTP POST 请求发送命令。stdio
:客户端可以将 MCP 服务器作为本地子进程运行,并通过标准输入/输出直接与其通信。
用户与 MCP 和大模型的交互方式如下图所示(出处):
使用示例
- 本地启动 mcp 服务端(stdio 方式)
- 构建 mcp 客户端
- 构建工具集
- 挂载到 AIService
- 发送请求返回结果(流式返回)
//Controller.java
@Autowired
private StreamingChatModel streamingChatModel;
@GetMapping("/mcp/chat")
public Flux<String> chat(@RequestParam("question") String question) throws Exception
{
// 1.本地启动mcp服务端(stdio)
String baiduApiKey = System.getenv("BAIDU_MAP_API_KEY");
if (baiduApiKey == null) {
throw new IllegalArgumentException("请设置环境变量 BAIDU_MAP_API_KEY");
}
System.out.println("使用的百度地图API Key: " + baiduApiKey);
McpTransport transport = new StdioMcpTransport.Builder()
.command(List.of("npx", "-y", "@baidumap/mcp-server-baidu-map"))
.environment(Map.of("BAIDU_MAP_API_KEY", baiduApiKey))
.build();
// 2.构建McpClient客户端
McpClient mcpClient = new DefaultMcpClient.Builder()
.transport(transport)
.build();
// 3.创建工具集和原生的FunctionCalling类似
ToolProvider toolProvider = McpToolProvider.builder()
.mcpClients(mcpClient)
.build();
// 4.通过AiServivces给我们自定义接口McpService构建实现类并将工具集和大模型赋值给AiService
McpService mcpService = AiServices.builder(McpService.class)
.streamingChatModel(streamingChatModel)
.toolProvider(toolProvider)
.build();
// 5.调用我们定义的HighApi接口,通过大模型对百度mcpserver调用
Flux<String> result = mcpService.chat(question);
// 在流式响应完成后关闭 MCP 客户端
return result.doFinally(signalType -> {
try {
mcpClient.close();
} catch (Exception e) {
// 记录关闭异常但不影响响应
System.err.println("Error closing MCP client: " + e.getMessage());
}
});
}
返回结果