java 使用 spring AI 实战MCP

最近在腾讯云edgeone的直播中了解到了MCP,随着了解发现MCP确实是一个未来发展的趋势
MCP :全称 Model Context Protocol 是一种专为人工智能模型设计的通信协议,于2024年11月由Anthropic推出的开放标准。它旨在解决复杂AI系统中多个模型或组件之间的协同、状态管理和资源优化问题,以及AI应用与外部数据源和工具集成中的挑战。
MCP 是一个开放协议,用于标准化应用程序向大语言模型提供上下文的方式。它类似 AI 应用的 USB–C 端口,MCP 连接 AI 模型与不同数据源和工具,能帮助构建基于大语言模型的智能体和复杂工作流,。MCP 具有一系列预构建的集成、可灵活切换 LLM 提供商和遵循客户端 – 服务器架构等特点。

访问地址https://modelcontextprotocol.io/introduction

在这里插入图片描述
githubhttps://github.com/modelcontextprotocol

在这里插入图片描述
解决了什么问题:传统上,AI模型与外部数据源的集成需要为每个数据源开发自定义接口,既耗时又容易出错。MCP通过提供一个统一协议,简化了这一过程,开发者可以轻松连接到多个数据源,而无需重复编写代码。这减少了开发复杂性,并降低了维护和安全风险。

功能

  • 上下文状态管理
  • 动态上下文传递:允许模型在处理请求时保留和共享关键信息(如用户历史对话、当前任务状态),确保连贯性。
  • 版本控制:管理不同模型版本的上下文兼容性,避免因升级导致的逻辑冲突。
  • 分布式处理:支持跨服务器、跨设备并行处理,降低延迟并提高吞吐量。
  • 数据隔离:通过加密通道和访问控制确保敏感数据(如用户隐私信息)仅在授权范围内流动。
  • 审计日志:记录模型交互轨迹,便于合规性检查和责任追溯。
  • 缓存机制:对高频查询结果进行缓存,减少重复计算。
  • 模块化设计:支持插件式扩展(如新增自定义指令处理器或集成特定工具API)。
  • 多模态支持:原生适配文本、图像、音频等多种数据格式,简化多模态应用开发。
  • 上下文融合:将物流结果与用户历史偏好(如偏爱快递公司A)结合,生成个性化回复。
  • 反馈闭环:记录用户对回复的满意度,动态优化后续响应策略。

组件

  • ContextManager:管理用户会话上下文(历史消息、订单号、偏好等)。
  • IntentClassifier:自然语言理解模型,识别用户意图(如查询订单、投诉建议)。
  • ServiceRouter:根据意图路由到对应服务(如订单查询API、天气查询模型)。
  • DialoguePolicy:对话策略模型,决定回复策略(如确认信息、追问细节)。

源码https://github.com/modelcontextprotocol/java-sdk
在这里插入图片描述
源码大家可以拉下来看看做了解,这里偶遇一篇讲MCP Java SDK源码的文章:https://www.51cto.com/article/810408.html

MCP Server 平台 : https://mcp.so/zh

案例:10分钟搞定高德地图MCP!我用AI解决了约会地点选择难题 ,这个案例虽然不是java实现的,但是也很值得大家了解和学习,这个类似的demo我在腾讯云edgeone的直播中有看到相似的案例

在了解MCP信息浏览github时发现一个项目有记录MCP相关
https://github.com/punkpeye/awesome-mcp-servers/blob/main/README-zh.md
在这里插入图片描述
检索java相关发现有个 spring-ai-mcp
在这里插入图片描述
在这里插入图片描述
点进来就到了spring ai 文档中了,原先用过spring ai 调用本地大模型进行聊天,刚好有所了解
在这里插入图片描述
开始 spring aimcp
首先电脑需要有 npx 环境 ,如果没有自行百度进行安装
在这里插入图片描述

MCP Server 平台。找一个现成的server进行使用
在这里插入图片描述
找一个操作文件的server
在这里插入图片描述
找到 NPX 留着备用

在这里插入图片描述

初始化项目
在这里插入图片描述

pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.yxy</groupId>
  <artifactId>spring-ai-mcp</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>spring-ai-mcp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <java.version>17</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>3.2.4</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.ai</groupId>
      <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
      <version>1.0.0-M6</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.ai</groupId>
      <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <version>3.2.4</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>8</source>
          <target>8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-bom</artifactId>
        <version>1.0.0-M6</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>


</project>

在这里插入图片描述

application.yml
配置文件 ollama 配置的我原先本地部署的千问模型 大家自行更改
还有就是一个mcp的配置,需要指定mcpsevers的json文件

spring:
  application:
    name: spring-ai-mcp

  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        options:
          model: qwen2.5-coder:7b

  mcp:
    client:
      enabled: true
      name: mcp-client
      version: 1.0.0
      type: SYNC
      request-timeout: 30s
      stdio:
        servers-configuration: classpath:/mcp-servers-config.json

mcp-servers-config.json
我这里是使用的操作文件的server,大家想测试其他的只需要在这个配置文件进行配置
而我这里是windows上使用,所以将 MCP Server 平台 复制过来的命令做了个调整

{
  "mcpServers": {
    "filesystem": {
      "command": "cmd",
      "args": [
        "/c",
        "npx",
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "F:\\web"
      ]
    }
  }
}


OllamaController

package org.yxy.controller;

import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OllamaController {



    @Resource
    private OllamaChatModel ollamaChatModel;

    @Resource
    private SyncMcpToolCallbackProvider toolCallbackProvider;

    @GetMapping("/ai/ollama")
    public String ollama(@RequestParam(value = "msg") String msg) {
        ChatClient chatClient = ChatClient.builder(ollamaChatModel)
                .defaultTools(toolCallbackProvider.getToolCallbacks())
                .build();
        String content = chatClient.prompt(msg).call().content();
        System.out.println(content);
        return content;
    }



}

运行后浏览器直接访问
在这里插入图片描述

如果半天没有响应大家稍等下,本地环境有限,会有点慢
在这里插入图片描述
在这里插入图片描述
简易版demo已实现了,进行下一步
在这里插入图片描述
当我们配置的type是同步使用时就使用同步的依赖,这个可以在多client时进行使用
在这里插入图片描述
所有注册的MCP工具通过ToolCallbackProvider实例以ToolCallback列表的形式提供
在这里插入图片描述
就是我们这里的demo使用的是操作file的Server,这里可以看到其提供的工具
在这里插入图片描述
我让其帮我创建一个文件夹
在这里插入图片描述

在这里插入图片描述
在我打断点请求查看时发现创建成功了
这里的 toolCallbackProvider.getToolCallbacks()[9]是 list_allowed_directories方法所在数组中的位置,本想查看来着,结果创建成功了

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<think>好的,我现在需要帮助用户找到使用Java实现MCP功能的解决方案或示例代码。根据用户的问题,他们可能已经查阅过一些引用资料,但需要更具体的指导。首先,我需要回顾用户提供的引用内容,看看是否有可用的信息。 引用[1]提到MCP在微服务架构中的应用,使用Spring Boot结合RabbitMQ或Kafka。引用[2]指出Java SDK的存在,引用[3]展示了一些代码片段,比如加载环境变量和客户端会话的创建。这些信息是关键,但可能需要整合和扩展。 用户需要的是具体的Java示例代码,所以应该基于这些引用构建一个完整的示例。首先,确认MCPJava SDK是否存在,用户提到的引用[2]和[3]都提到了Java SDK,因此需要假设用户已经可以访问这些库,或者需要指导如何获取。 接下来,考虑如何组织代码。通常,使用Spring Boot是常见的做法,结合消息中间件如RabbitMQ。但根据引用[3],示例代码中使用mcp.ClientSession和加载环境变量,这可能是SDK的一部分。因此,可能需要分步骤说明:环境准备、依赖配置、客户端初始化和消息处理。 需要确保示例代码符合Java的语法,正确使用SDK中的类和方法。同时,要处理可能的环境变量配置,如API密钥和服务地址,这可以通过.env文件或应用属性设置。 此外,用户可能遇到依赖管理的问题,比如如何添加SDK到项目中。引用[2]提到MCP官方支持Java SDK,所以应指导用户如何通过Maven或Gradle引入依赖,尽管具体的groupId和artifactId可能需要用户查阅官方文档。 还要考虑异常处理和资源释放,比如关闭ClientSession,确保代码的健壮性。同时,消息的发送和接收是核心功能,需要展示基本的发送和监听示例。 最后,根据用户可能的需求,生成相关问题,例如SDK的获取方式、配置方法或与Spring Boot的整合,帮助用户进一步探索。</think>根据引用内容中关于Java实现MCP的线索,结合微服务架构开发经验,整理MCP功能实现的核心步骤及示例代码: ### 一、基础环境准备 1. 添加MCP Java SDK依赖(需根据实际SDK版本调整) ```xml <dependency> <groupId>com.mcp.sdk</groupId> <artifactId>mcp-client</artifactId> <version>1.2.0</version> </dependency> ``` ### 二、核心代码实现 ```java import mcp.ClientSession; import mcp.client.stdio.StdioServerParameters; public class McpJavaDemo { // 初始化客户端会话 private ClientSession createSession() { StdioServerParameters params = new StdioServerParameters.Builder() .apiKey(System.getenv("MCP_API_KEY")) .baseUrl("mcp://api.example.com:8080") .build(); return ClientSession.create(params); } // 消息发送示例 public void sendMessage(String payload) { try (ClientSession session = createSession()) { session.send(payload.getBytes()); System.out.println("消息发送成功"); } catch (Exception e) { e.printStackTrace(); } } // 消息监听示例 public void startListener() { ClientSession session = createSession(); session.setMessageHandler(bytes -> { String message = new String(bytes); System.out.println("收到消息: " + message); return true; // 确认消息处理成功 }); session.startListening(); } } ``` ### 三、Spring Boot集成方案 ```java @Configuration public class McpConfig { @Value("${mcp.api-key}") private String apiKey; @Bean public ClientSession mcpClientSession() { return ClientSession.create( new StdioServerParameters.Builder() .apiKey(apiKey) .baseUrl("mcp://prod-server.example.com") .build() ); } } @Service public class McpService { @Autowired private ClientSession session; @Async public void processMessage(byte[] payload) { // 业务逻辑处理 session.sendResponse(generateResponse()); } } ``` ### 四、环境配置建议 1. 创建`.env`文件: ```properties MCP_API_KEY=your_api_key_here MCP_BASE_URL=mcp://api.example.com:8080 ``` 2. 使用`load_dotenv()`加载配置(参考引用[3])
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值