大家好,我是Java1234_小锋老师,最近更新《2027版本 LangChain4j 开发Java Agent 智能体 视频教程》专辑,感谢大家支持。
本课程主要介绍和讲解 LangChain4j 简介,阿里云百炼大模型 平台接入,Ollama简介以及安装和使用,HelloWorld 实现,日志配置,集成SpringBoot,Ai Service 使用,对话与提示词工程(Prompt),结构化输出,会话记忆,工具调用(Function Calling),嵌入模型 与向量数据库,RAG(检索增强生成),MCP(模型上下文协议),多模态支持
视频教程+课件+源码打包下载:
链接:https://pan.baidu.com/s/1o-zRfndo1HHrS_uFroOiCw?pwd=1234
提取码:0000
LangChain4j 开发Java Agent智能体- MCP(模型上下文协议)
一、什么是 MCP?
MCP(Model Context Protocol,模型上下文协议)是一项开放标准,用于在大语言模型应用与外部工具、数据源之间建立统一、可互操作的通信方式。
可以把它理解为 AI 世界的USB 接口:
| 传统方式 | MCP 方式 |
|---|---|
| 每个框架单独集成 GitHub、数据库、天气 API | 只要提供 MCP Server,任何 Client 都能接入 |
| 工具代码与应用强耦合 | 工具运行在独立进程,通过协议调用 |
| 跨语言复用困难 | Server 可用 Java/Node/Python 实现,Client 统一消费 |
官方资源:
- MCP 规范:https://modelcontextprotocol.io/
- LangChain4j 教程:MCP Tutorial
二、MCP 整体架构
MCP 涉及四个核心角色:
| 角色 | 在本项目中的对应 |
|---|---|
| Host(宿主) | Spring Boot 应用,接收 HTTP 请求 |
| MCP Client | LangChain4jDefaultMcpClient,负责协议通信 |
| MCP Server | 独立进程,暴露getWeather等工具 |
| LLM | 配置中的openAiChatModel/ Ollama,决定是否调用工具 |
三、MCP 工作原理
MCP 基于JSON-RPC 2.0,典型调用流程如下:
- initialize— Client 与 Server 握手,协商协议版本
- tools/list— Client 获取 Server 提供的工具列表及参数 Schema
- tools/call— LLM 选中工具后,Client 将请求转发给 Server 执行
- 回传结果— Server 返回执行结果,LLM 生成自然语言回答
LangChain4j MCP 模块分层
AI Service(@AiService) ← 业务接口,与 Controller 对接 ↓ McpToolProvider ← 将 MCP 工具适配为 LangChain4j Tool ↓ DefaultMcpClient ← JSON-RPC 协议、缓存、健康检查 ↓ McpTransport(stdio / HTTP 等) ← 进程间或网络通信常见传输方式
| 传输方式 | 适用场景 | LangChain4j 类 |
|---|---|---|
| stdio | 本地子进程(最常见) | StdioMcpTransport |
| Streamable HTTP | 远程 HTTP 服务 | StreamableHttpMcpTransport |
| Docker stdio | 容器化 MCP Server | DockerMcpTransport |
Windows 开发环境下,stdio最为常用。
四、与本项目现有实现的对比
本项目已有天气助手,使用的是本地@Tool方式:
WeatherTool— 带@Tool注解的工具类,运行在 Spring 容器内WeatherAssistantService—@AiService(tools = {"weatherTool"})MyWeatherController— 暴露/weather/chat接口
MCP 方式则将工具放到独立进程,通过协议远程调用,架构解耦程度更高:
五、具体天气MCP实例
首先pom.xml里加下mcp server和client依赖:
<!-- MCP Client --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-mcp</artifactId><version>1.15.0-beta25</version></dependency><!-- MCP Server(社区版) --><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-community-mcp-server</artifactId><version>1.15.0-beta25</version></dependency>接着 创建mcp server WeatherMcpServerMain
packagecom.java1234.mcp;importcom.java1234.tool.WeatherTool;importdev.langchain4j.community.mcp.server.McpServer;importdev.langchain4j.community.mcp.server.transport.StdioMcpServerTransport;importdev.langchain4j.mcp.protocol.McpImplementation;importjava.util.List;/** * 天气 MCP Server。独立进程运行,通过 stdio 与 Client 通信。 * 注意:JSON-RPC 走 System.out,日志请输出到 System.err。 */publicclassWeatherMcpServerMain{publicstaticvoidmain(String[]args)throwsException{McpImplementationinfo=newMcpImplementation();// MCP Server 信息info.setName("java1234-weather-mcp-server");// MCP Server 名称info.setVersion("1.0.0");// MCP Server 版本McpServerserver=newMcpServer(List.of(newWeatherTool()),info);// 创建 MCP ServernewStdioMcpServerTransport(System.in,System.out,server);// 创建 stdio 适配器Thread.currentThread().join();// 阻塞当前线程,等待退出}}再新建McpConfig
packagecom.java1234.config;importdev.langchain4j.mcp.McpToolProvider;importdev.langchain4j.mcp.client.DefaultMcpClient;importdev.langchain4j.mcp.client.McpClient;importdev.langchain4j.mcp.client.transport.McpTransport;importdev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjava.nio.file.Path;importjava.util.List;@ConfigurationpublicclassMcpConfig{/** * 创建 MCP Client */@Bean(destroyMethod="close")publicMcpClientweatherMcpClient(){StringjavaBin=Path.of(System.getProperty("java.home"),"bin","java").toString();Stringclasspath=System.getProperty("java.class.path");McpTransporttransport=StdioMcpTransport.builder()// 创建 stdio 适配器.command(List.of(javaBin,"-cp",classpath,"com.java1234.mcp.WeatherMcpServerMain")).logEvents(true).build();returnDefaultMcpClient.builder()// 创建 MCP Client.key("weather-mcp").transport(transport).build();}/** * 创建 MCP 工具提供者 */@BeanpublicMcpToolProviderweatherMcpToolProvider(McpClientweatherMcpClient){returnMcpToolProvider.builder().mcpClients(weatherMcpClient).filterToolNames("getWeather")// 只添加 getWeather 工具.build();}}接着再新建McpWeatherAssistantService,配置上toolProvider
packagecom.java1234.service;importdev.langchain4j.service.SystemMessage;importdev.langchain4j.service.spring.AiService;importdev.langchain4j.service.spring.AiServiceWiringMode;@AiService(wiringMode=AiServiceWiringMode.EXPLICIT,chatModel="openAiChatModel",toolProvider="weatherMcpToolProvider"// 关键:使用 MCP 工具)publicinterfaceMcpWeatherAssistantService{@SystemMessage(""" 你是天气助手。用户询问某地天气时,必须调用 getWeather 工具获取数据, 再基于工具返回结果用中文简洁回答;不要编造未在工具结果中出现的数值。 """)Stringchat(StringuserMessage);}最后新建MyMcpWeatherController
packagecom.java1234.controller;importcom.java1234.service.McpWeatherAssistantService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/mcp/weather")publicclassMyMcpWeatherController{@AutowiredprivateMcpWeatherAssistantServicemcpWeatherAssistantService;@RequestMapping("/chat")publicStringchat(Stringquestion){returnmcpWeatherAssistantService.chat(question);}}最后编译测试下:
1. 编译
mvn compile2. 启动应用
mvn spring-boot:run启动时McpConfig会自动拉起WeatherMcpServerMain子进程并完成 MCP 握手。
3. 调用 MCP 接口
GET http://localhost:8080/mcp/weather/chat?question=北京今天天气怎么样?六、为什么有了@Tool还要 MCP?
不是因为@Tool不够用,而是因为场景不同。
用@Tool就够了(大多数业务代码)
- 工具是你自己写的 Java 代码
- 和业务服务在同一个 Spring Boot 里
- 逻辑简单、团队只用 LangChain4j/Java
- 追求简单、稳定、少运维
例如:查订单、算价格、调内部 Service——直接@Tool最合适。
什么时候该用 MCP?
- 接入第三方/社区工具
GitHub、文件系统、数据库等已有 MCP Server,不用为每个框架单独写集成。 - 工具与 AI 应用解耦
工具独立部署、独立升级、独立扩缩容;AI 应用只连 MCP Client。 - 跨语言复用
Server 用 Python/Node 写,Java 应用通过 MCP 调用,不必重写一遍。 - 多 Client 共享同一套工具
Cursor、Claude Desktop、你的 Spring Boot 应用都能连同一个 MCP Server。 - 安全与隔离
工具在子进程/容器里跑,权限、资源、崩溃与主应用隔离。 - 动态扩展工具
运行时连上 MCP Server 就能tools/list发现新工具,不必改主应用代码。