首页 抖音热门文章正文

Spring Boot整合DeepSeek+MCP实践详解

抖音热门 2025年08月14日 09:34 1 admin

C MCP快速入门指南

  • 什么是MCP?

MCP 是一种开放协议,通过标准化的服务器实现,使 AI 模型能够安全地与本地和远程资源进行交互。用大白话讲,MCP 就是一项约定,比如前后端开发接口,需要先定义好 json 数据结构,MCP 就类似于这个定义好的数据结构,但是具体如何生成这个 json 数据结构,不同的人,不同的语言会有不同的实现方式;

  • 解决了什么问题?

Spring Boot整合DeepSeek+MCP实践详解

解决了 AI 大模型因数据孤岛限制无法发挥潜力的难题。举个例子,以前我们想要 AI 大模型使用我们的数据,要么自己复制粘贴,要么上传下载,其中都需要人参与,MCP 就是 AI 大模型与数据资源中间的一座桥梁,通过 MCP 服务和 MCP 客户端,只要遵循这套协议,就能实现万物互联;

  • MCP核心架构 #技术分享

MCP 遵循 CS 架构(客户端-服务端),有三个核心概念:MCP HOST :发起请求的 LLM 应用程序,可以理解为用户请求入口;MCP Client :在应用程序内部,专门与 MCP Server 进行交互的工具,类似 HttpClient 的作用,提供调用本地 MCP Server 和远程 MCP Server 的能力;MCP Server :为 MCP Client 提供各类服务,比如文件操作,数据库操作等资源服务,可本地部署,也可远程部署;

-

MCP Client 的基本工作流程如下:

  • 当HOST项目初始化的时候,也会触发MCP Client初始化;
  • MCP Client首先会先与所有的MCP Server建立连接,并从MCP Server获取可以使用的工具列表(每个MCP Server都会告诉MCP Client自己具备的能力);
  • 当用户请求进来后,LLM大模型会根据用户的具体请求分析是否可以使用工具来解决用户的问题,并最终决定使用哪些工具来处理;
  • 如果需要使用工具,那么LLM大模型会通过MCP Client来调用MCP Server处理;
  • 最终调用工具的结果会经过LLM大模型处理后返回给用户;
  • MCP Server

MCP Server 主要提供三种类型的功能:

  • 资源(Resources):比如文件,数据库等,可以被客户端读取;
  • 工具(Tools):比如地图定位服务,实时公交查询等;
  • 提示(Prompts):比如如果需要 AI 定制化地返回某些格式化内容时,可以提供自定义的 prompts;

以上功能可以为 AI 应用提供丰富的上下文信息和操作能力,从而增强 LLM 大模型的实用性和灵活性。

目前已经出现了很多好玩的 MCP Server,有兴趣的小伙伴可以访问 官方 MCP Server 列表 、MCP.so 、阿里云 MCP 或者 Awesome MCP Server 。

  • 通信机制

MCP Client 与 MCP Server 通信采用以下两种方式,并且都是使用 JSON-RPC 2.0数据格式进行消息通信:

  • 本地通信:通过操作系统标准输入输出stdio传输,适用于MCP Client和MCP Server部署在同一台机器上进行通信;
  • 远程通信:使用 SSE(Server-Sent Events) 与Http结合,实现跨网络的数据传输,适用于需要访问远程资源或分布式部署的场景;

C 如何使用MCP

目前市面上有很多工具可以支持调用 MCP Server,比如 Cursor ,Cline 等,大家有兴趣的可以去了解一下:

Spring Boot集成DeepSeek+MCP Client调用MCP Server

  • 前置工作

安装 nodejs 环境:请安装 nodejs 18+ 以上版本,并保证以下命令生效:

node -vnpm -vnpx -v

安装 python 环境:建议安装 python-3 11 或以上版本 ;

说明 :目前 MCP Server 基本都是使用 Nodejs 或者 Python 编写的,想要使用官方或者第三方的 MCP Server 需要保障本地有对应的运行环境;

接下里开始创建 SpringBoot 项目

  • maven依赖

pom.xml:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories>
  • 配置LLM大模型

application.yml:

spring:  ai:    openai:      chat:        options:          model: "deepseek-chat"      api-key: "xxxxxxxxxxxxxxxxxxxxxxxx"      base-url: "https://api.deepseek.com"

上面的 api-key 需要去 deepseek 官网 获取,创建 api-key 后需要充值,否则调用的时候会返回余额不足,影响使用效果;

  • 配置调用的MCP Server

目前我在 demo 中接了两款 MCP Server,且都在本地运行。

  • filesystem:用于管理文件系统,可以执行文件的增删查改等操作。
  • mysql:用于mysql数据库的数据查询和分析操作。

执行以下命令安装对应的 MCP Server 到机器上:

npm install mysql-mcp-servernpm install @modelcontextprotocol/server-filesystem

application.yml 相关配置如下:

spring:  ai:    mcp:      client:        stdio:          connections:            mysql:              # Windows操作系统使用npx.cmd,Linux和MacOS使用npxcommand: "npx.cmd" args: # mcp server 名称- "mysql-mcp-server"              env:                # 数据库ip"MYSQL_HOST": "127.0.0.1" # 数据库服务端口"MYSQL_PORT": "3306" # 数据库用户名"MYSQL_USER": "xxxx" # 数据库密码"MYSQL_PASSWORD": "xxxx" # 数据库名称"MYSQL_DATABASE": "xxxx" filesystem: # Windows 操作系统使用 npx.cmd,Linux 和 MacOS 使用 npxcommand: "npx.cmd" args: - "-y" - "@modelcontextprotocol/server-filesystem" # 在此文件夹内进行文件操作,需根据具体需求调整目标文件夹- "E:\\mcp_test"
  • Java Bean配置
import org.springframework.ai.chat.client.ChatClient;import org.springframework.ai.chat.model.ChatModel;import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration public class McpClientConfiguration { @Bean ChatClient chatClient(ChatModel chatModel, SyncMcpToolCallbackProvider toolCallbackProvider) { return ChatClient .builder(chatModel) .defaultTools(toolCallbackProvider.getToolCallbacks()) .build(); } }
  • McpClientController实现与用户交互
import jakarta.annotation.Resource;import org.springframework.ai.chat.client.ChatClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/api/mcp") public class McpClientController {@Resource private ChatClient chatClient;@GetMapping("/ai") String generation(String userInput) { return this.chatClient.prompt() .user(userInput) .call() .content(); } }

至此我们的 demo 项目就搞定了,下面咱们来看看效果如何:

http://127.0.0.1:8081/api/mcp/ai?userInput=请帮我创建一个ai.txt,并在里面写入hello ai!
http://127.0.0.1:8081/api/mcp/ai?userInput=帮我查一下courier.user表中有多少条数据

遇到的问题

  • maven依赖难找

虽然现在有很多文章聊 MCP 的,但是大多数都是科普文,即使是实战的,也很少有 java 或者 spring 相关的。另一个就是 spring ai 目前还没有 release 版本的 mcp jar 包,很多 LLM 实现上没有完全支持 mcp,导致想要找到合适的 maven 比较困难。

  • 配置MCP Server报错

一开始按照网上资料在 application.yml 中配置 MCP Server,一启动项目就报错:

其实是因为 Windows 环境下 npx 命令需要有后缀 cmd:npx.cmd ,不能完全参照网上资料直接写 npx 。也就是说,调用命令需要根据操作系统环境进行调整。

  • 如何转换MCP Server配置为yml配置

一般在网上找到的 MCP Server 配置如下,以 百度地图 MCP Server 为例:

{    "mcpServers": {        "baidu-maps": {            "command": "python",            "args": [                "-m",                "mcp_server_baidu_maps"            ],            "env": {                "BAIDU_MAPS_API_KEY": "<YOUR_API_KEY>"            }        }    }}

或者

{    "mcpServers": {        "baidu-map": {            "command": "npx",            "args": [                "-y",                "@baidumap/mcp-server-baidu-map"            ],            "env": {                "BAIDU_MAP_API_KEY": "{您的AK}"            }        }    }}

如果是 python 环境的话,根据文档,需要先安装 MCP Server

pip install mcp-server-baidu-maps

上面的两类配置最终转换为 application.yml 如下:

Python 版本

spring:  ai:    mcp:      client:        stdio:          connections:            baidu-maps:              command: "python.cmd"              args:                - "-m"                - "mcp_server_baidu_maps"              env:                "BAIDU_MAPS_API_KEY": "<YOUR_API_KEY>"

Nodejs 版本

spring:  ai:    mcp:      client:        stdio:          connections:            baidu-maps:              command: "npx.cmd"              args:                - "-y"                - "@baidumap/mcp-server-baidu-map"              env:                "BAIDU_MAP_API_KEY": "<YOUR_API_KEY>"
  • 多轮对话上下文丢失问题

第一轮对话:请帮我生成查询 user 表总共有多少条的 sql 语句

返回结果:select count(*) from user; 需要我帮你执行嘛?

第二轮对话:是的,请帮我执行这条查询语句

返回结果:请告诉我你需要执行哪条语句?

上面的示例就是多轮对话上下文丢失的问题,这个问题的处理结果很快在 deepseek 官方文档 找到了解决方案:

也就是说,如果需要保持上下文不丢失,那么需要把所有的历史问答全部发给 deepseek 大模型,这样将带来两个明显的问题:

  1. 过长的对话会导致token使用量上涨很快;
  2. 应用程序需要自己保存历史问答数据;

结语

未来,MCP 有望成为企业数字化转型的核心枢纽 ——从“数据搬运工”进化为“智能决策大脑”。期待这一技术组合持续迭代,为开发者带来更极致的体验,为行业树立高可用、高智能的集成范式标杆。

发表评论

泰日号Copyright Your WebSite.Some Rights Reserved. 网站地图 备案号:川ICP备66666666号 Z-BlogPHP强力驱动