LangChain4j 开发Java Agent智能体- MCP(模型上下文协议)

大家好,我是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 整体架构

MCP 涉及四个核心角色:

角色在本项目中的对应
Host(宿主)Spring Boot 应用,接收 HTTP 请求
MCP ClientLangChain4j DefaultMcpClient,负责协议通信
MCP Server独立进程,暴露 getWeather 等工具
LLM配置中的 openAiChatModel / Ollama,决定是否调用工具

在这里插入图片描述

三、MCP 工作原理

MCP 基于 JSON-RPC 2.0,典型调用流程如下:

  1. initialize — Client 与 Server 握手,协商协议版本
  2. tools/list — Client 获取 Server 提供的工具列表及参数 Schema
  3. tools/call — LLM 选中工具后,Client 将请求转发给 Server 执行
  4. 回传结果 — 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 ServerDockerMcpTransport

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

package com.java1234.mcp;

import com.java1234.tool.WeatherTool;
import dev.langchain4j.community.mcp.server.McpServer;
import dev.langchain4j.community.mcp.server.transport.StdioMcpServerTransport;
import dev.langchain4j.mcp.protocol.McpImplementation;

import java.util.List;

/**
 * 天气 MCP Server。独立进程运行,通过 stdio 与 Client 通信。
 * 注意:JSON-RPC 走 System.out,日志请输出到 System.err。
 */
public class WeatherMcpServerMain {

    public static void main(String[] args) throws Exception {
        McpImplementation info = new McpImplementation(); // MCP Server 信息
        info.setName("java1234-weather-mcp-server"); // MCP Server 名称
        info.setVersion("1.0.0"); // MCP Server 版本

        McpServer server = new McpServer(List.of(new WeatherTool()), info); // 创建 MCP Server
        new StdioMcpServerTransport(System.in, System.out, server); // 创建 stdio 适配器

        Thread.currentThread().join(); // 阻塞当前线程,等待退出
    }
}

再新建McpConfig

package com.java1234.config;

import dev.langchain4j.mcp.McpToolProvider;
import dev.langchain4j.mcp.client.DefaultMcpClient;
import dev.langchain4j.mcp.client.McpClient;
import dev.langchain4j.mcp.client.transport.McpTransport;
import dev.langchain4j.mcp.client.transport.stdio.StdioMcpTransport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.nio.file.Path;
import java.util.List;

@Configuration
public class McpConfig {

    /**
     * 创建 MCP Client
     */
    @Bean(destroyMethod = "close")
    public McpClient weatherMcpClient() {
        String javaBin = Path.of(System.getProperty("java.home"), "bin", "java").toString();
        String classpath = System.getProperty("java.class.path");

        McpTransport transport = StdioMcpTransport.builder()  // 创建 stdio 适配器
                .command(List.of(
                        javaBin,
                        "-cp", classpath,
                        "com.java1234.mcp.WeatherMcpServerMain"
                ))
                .logEvents(true)
                .build();

        return DefaultMcpClient.builder()  // 创建 MCP Client
                .key("weather-mcp")
                .transport(transport)
                .build();
    }
    
    /**
     * 创建 MCP 工具提供者
     */
    @Bean
    public McpToolProvider weatherMcpToolProvider(McpClient weatherMcpClient) {
        return McpToolProvider.builder()
                .mcpClients(weatherMcpClient)
                .filterToolNames("getWeather")  // 只添加 getWeather 工具
                .build();
    }
}

接着再新建McpWeatherAssistantService,配置上toolProvider

package com.java1234.service;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.spring.AiService;
import dev.langchain4j.service.spring.AiServiceWiringMode;

@AiService(
        wiringMode = AiServiceWiringMode.EXPLICIT,
        chatModel = "openAiChatModel",
        toolProvider = "weatherMcpToolProvider"   // 关键:使用 MCP 工具
)
public interface McpWeatherAssistantService {

    @SystemMessage("""
        你是天气助手。用户询问某地天气时,必须调用 getWeather 工具获取数据,
        再基于工具返回结果用中文简洁回答;不要编造未在工具结果中出现的数值。
        """)
    String chat(String userMessage);
}

最后新建MyMcpWeatherController

package com.java1234.controller;

import com.java1234.service.McpWeatherAssistantService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mcp/weather")
public class MyMcpWeatherController {

    @Autowired
    private McpWeatherAssistantService mcpWeatherAssistantService;

    @RequestMapping("/chat")
    public String chat(String question) {
        return mcpWeatherAssistantService.chat(question);
    }
}

最后编译测试下:

1. 编译

mvn compile

2. 启动应用

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?
  1. 接入第三方/社区工具
    GitHub、文件系统、数据库等已有 MCP Server,不用为每个框架单独写集成。
  2. 工具与 AI 应用解耦
    工具独立部署、独立升级、独立扩缩容;AI 应用只连 MCP Client。
  3. 跨语言复用
    Server 用 Python/Node 写,Java 应用通过 MCP 调用,不必重写一遍。
  4. 多 Client 共享同一套工具
    Cursor、Claude Desktop、你的 Spring Boot 应用都能连同一个 MCP Server。
  5. 安全与隔离
    工具在子进程/容器里跑,权限、资源、崩溃与主应用隔离。
  6. 动态扩展工具
    运行时连上 MCP Server 就能 tools/list 发现新工具,不必改主应用代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值