当前位置: 首页 > news >正文

Spring AI调用MCP服务 - 指南

在其他地方查看文章:https://blog.liuzijian.com/post/spring-ai/2025/11/08/spring-ai-mcp-client.html

1.MCP概述

MCP(Model Context Protocol),即模型上下文协议,是一种开放标准,使大模型采用统一的标准化的方式与外部的工具和数据等进行通信交互。

之前提到,大模型可以通过Tools(Function calling)来实现一些获取信息和操作数据的功能,如果我们自定义好了一些公共的工具给别人用,例如提供实时日期信息、天气信息,股市交易信息、汇率信息等,想要开放给很多大模型来使用,如果没有标准化的接口,每产生一个大模型应用就要适配一次,MCP协议为解决这一问题而生,现在我们实现的工具只需要面向MCP接口协议进行开发,大模型也遵循MCP规范进行接入使用,这个问题就解决了,我们实现的服务就叫MCP服务端,大模型实现的就是MCP的客户端。

MCP协议产生于2024年,具体协议内容可见:https://modelcontextprotocol.io/docs/getting-started/intro

2.调用MCP

MCP调用方式有三种,SSE,streamable-http和Stdio,SSE和streamable-http以http方式调用部署好的远程MCP服务器上的MCP,Stdio是将MCP的源码下载到本地打成软件包,使用Spring AI驱动npx或uvx命令来本地调用软件包中的MCP,其中TypeScript编写的MCP需要由npx调用,Python编写的MCP需要由uvx调用。

我使用的Spring AI版本好像还不支持streamable-http。

在远程调用modelscope时需要在modelscope上修改接口为SSE模式

以部署在modelscope上面的12306-mcp为例,分别介绍SSE远程调用和Stdio模式本地调用。12306-mcp是一个查询铁路12306平台,返回列车订票信息的MCP应用

  • modelscope https://www.modelscope.cn/mcp/servers/@Joooook/12306-mcp
  • github https://github.com/drfccv/mcp-server-12306

2.1 SSE调用MCP

pom中引入调用MCP需要的spring-ai-starter-mcp-client依赖


4.0.0org.springframework.bootspring-boot-starter-parent3.5.7org.examplespring-ai-mcp1.0-SNAPSHOT2121UTF-8org.springframework.aispring-ai-bom1.0.3pomimportorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.springframework.aispring-ai-starter-model-deepseekorg.springframework.aispring-ai-starter-mcp-clientorg.projectlomboklombok

application.yml中配置一个modelscope上面开放的MCP工具12306-mcp

spring:ai:mcp:client:enabled: truename: spring-ai-agenttype: asyncsse:connections:12306-mcp:url: https://mcp.api-inference.modelscope.net/sse-endpoint: /********/ssedeepseek:base-url: https://api.deepseek.comapi-key: ${DEEP_SEEK_KEY}
logging:level:io.modelcontextprotocol: DEBUGorg.springframework.ai.mcp: DEBUG

配置类中,将外部MCP工具ToolCallbackProvider注入并和ChatClient进行绑定

package org.example.config;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {@Beanpublic ChatClient chatClient(DeepSeekChatModel model, ChatMemory chatMemory, ToolCallbackProvider toolCallbackProvider) {return ChatClient.builder(model).defaultAdvisors(SimpleLoggerAdvisor.builder().build(),MessageChatMemoryAdvisor.builder(chatMemory).build()).defaultToolCallbacks(toolCallbackProvider).build();}
}

对话接口和以往完全一样

package org.example.controller;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("ai")
public class ChatController {@Resourceprivate ChatClient chatClient;//127.0.0.1:8080/ai/chat-stream?msg=你是谁&chatId=001@GetMapping(value = "chat-stream", produces = "text/html;charset=utf-8")public Flux stream(String msg, String chatId) {return chatClient.prompt().user(msg).advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, chatId)).stream().content();}
}

大模型已经能在对话中调用MCP了

2.2 Stdio调用MCP

因为是本地调用,所以需要先将这个MCP的源码clone并安装到本地,因为这个MCP是TS语言编写,因此还需要用npm将其安装到本地。

git clone https://github.com/Joooook/12306-mcp.git
cd 12306-mcp
npm i

运行前,如未安装npx,还需要全局安装npx,用于被Spring AI驱动本地运行MCP

npm i -g npx

根据MCP的标准,Stdio模式将MCP按一定格式配置到JSON文件中

{"mcpServers": {"12306-mcp": {"args": ["-y","12306-mcp"],"command": "npx"}}
}

modelscope上面给出的JSON格式是Mac/Linux的,如果是Windows系统,需要修改:

{"mcpServers": {"12306-mcp": {"command": "cmd","args": ["/c","npx","-y","12306-mcp"]}}
}

将配置文件放入类路径下,同application.yml放在一级,这里将这个json文件命名为mcp-server.json,并将配置放入spring ai

spring:ai:mcp:client:enabled: truename: spring-ai-agenttype: syncstdio:servers-configuration: classpath:mcp-server.jsondeepseek:base-url: https://api.deepseek.comapi-key: ${DEEP_SEEK_KEY}
logging:level:io.modelcontextprotocol: DEBUGorg.springframework.ai.mcp: DEBUG

启动后,可见日志

2025-11-09T12:15:07.418+08:00  INFO 39432 --- [pool-5-thread-1] i.m.c.transport.StdioClientTransport     : STDERR Message received: 12306 MCP Server running on stdio @Joooook

运行起来是相同的效果

http://www.jsqmd.com/news/341785/

相关文章:

  • 吉林市英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 锚定2026趋势,交大高金MBA助力管理层筑牢资本与技术核心竞争力 - 速递信息
  • 2026年靠谱的门窗定制厂家排名,佛山厦门等地有哪些上榜? - 工业品网
  • 吉林市英语雅思培训辅导机构推荐、2026权威出国雅思课程中心学校口碑排行榜 - 苏木2025
  • 物联网平台赋能可视化数据与决策,打造工厂“智慧大脑”
  • 2026年南京靠谱的Axiomatic来样定制经销商推荐 - 工业品牌热点
  • Prompt脚本化思维:Agent时代的效率加速器
  • 2026卡硕瓷砖性价比高吗,品质好设计感强口碑如何 - 工业设备
  • 靠谱门窗工厂推荐,熊博士好门窗甄选是佳选 - 工业品网
  • 软件测试的基本流程
  • 2026国内最新美缝剂实力厂家TOP5推荐:服务深度覆盖江苏、山东、济南、云南、浙江等地,无醛添加/进口材质/高端定制型美缝剂品牌权威榜单发布,全场景适配赋能品质家装 - 品牌推荐2026
  • 算法学习日记 | 进制转换
  • 收藏!Java程序员转行大模型:机遇、挑战与实操转型指南(小白友好)
  • 2026年西丽彩色打印机租赁靠谱品牌排名 - 工业推荐榜
  • 性能碾压!国产三维微纳加工设备优质品牌推荐 - 品牌推荐大师
  • 必收藏!3种主流RAG技术详细对比(传统RAG+HyDE+Graph RAG),小白也能看懂的大模型学习指南
  • Nodejs计算机毕设之基于nodejs的回忆小书屋小程序nodejs基于微信小程序的书籍销售系统图书商城网上书店(完整前后端代码+说明文档+LW,调试定制等)
  • 海康网口相机不能被flexscan3d识别到MVS版本为4.6.1,flex为3.3.24在MVS中能够检测到,但是在flex中只能看到电脑自带相机,如何解决?
  • UI自动化测试用例管理平台搭建
  • 基于PLC的锅炉控制系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 收藏备用|AI Agent详解(小白/程序员必看):概念、原理+应用+避坑指南
  • 为什么 pyecharts 在 Jupyter Notebook 里显示空白?
  • 2026年AI搜索优化代理加盟公司综合评估与首选推荐 - 2026年企业推荐榜
  • 收藏备用|Java开发者必看!转型大模型/人工智能可行吗?附薪资+学习路线
  • 【毕业设计】基于nodejs的回忆小书屋小程序(源码+文档+远程调试,全bao定制等)
  • win11添加网络凭据
  • 2026年电热风炉/隧道烘烤炉/热风烘烤炉厂家权威推荐:苏州丰上自动化设备有限公司,适配工业烘干、固化、食品加工与连续式产线多场景 - 品牌推荐官
  • 盲人水手Mitsuhiro Iwamoto借助科技,在史无前例的横渡太平洋计划中重新定义可能性边界
  • 【计算机毕业设计案例】nodejs基于微信小程序的书籍销售系统图书商城网上书店基于nodejs的回忆小书屋小程序(程序+文档+讲解+定制)
  • 2026年上海异丙醇厂家推荐:供应链安全趋势评测,涵盖仓储与运输场景核心痛点 - 品牌推荐