10.Spring ai alibaba MCP本地远程
📌 MCP本地&远程调用
🧩 一、概述
🐙1. 两个互联领域的重大挑战
第一、Agent 与 Tools(工具)的交互
Agent需要调用外部工具和APl、访问数据库、执行代码等。 ->mcp
第二、Agent 与 Agent(其他智能体或用户)的交互
Agent 需要理解其他Agent的意图、协同完成任务、与用户进行自然的对话。 ->A2A
🐙2. 如何学智能体
- Java语言
- +
- Spring Al / LangChain / LangChain4J ==> Al智能落地项目
- +
- MCP
🛠️ 二、mcp能干什么
- 举例1:开发部署:开发者通过自然语言指令“部署新版本到测试环境”,触发MCP链式调用GitLab API(代码合并)、Jenkins API(构建镜像)、Slack API(通知团队)。
- 举例2: SQL查询:开发者通过自然语言输入,比如“查询某集团部门上个季度销售额”,就能查询出数据库的数据,并结合大模型进行回答,不再需要编写SQL,MCP自动转换为精准SQL语句并执行。
- 举例3:开发部署:开发者通过自然语言指令“部署新版本到测试环境”,触发MCP链式调用GitLab APl(代码合并)、Jenkins APl(构建镜像)、Slack APl(通知团队)。
- 举例4:旅游规划:当我要去旅行时,旅行规划助手通过MCP同时调用天气APl(获取目的地气象)、交通API(查询航班动态)、地图API(规划路线),AI自动生成带实时数据的行程方案。
- 举例5:联网搜索:我们在与LLM交互时,经常需要联网搜索最新信息以减少幻觉。然而,这里也存在问题:
- ① 并非所有聊天机器人都支持联网功能
- ② 即使支持联网,也可能不包含你习惯使用的搜索引擎。
- 举例6:业绩查询:用户询问“查询上季度营业额”,MCP自动组合调用CRM系统API(获取客户数据)+财务系统API(调取报表)+邮件APl(发送总结报告)。
📚 三、mcp是什么
🐙1. mcp理解
- MCP(Model Context Protocol,模型上下文协议):2024年11月底,由Anthropic推出的一种开放标准。旨在为大语言模型(LLM)提供统一的、标准化方式与外部数据源和工具之间进行通信。
- 传统AI集成的问题:这种为每个数据源构建独立连接的方式,可以被视为一个M*N问题。问题:架构碎片化,难以扩展,限制了A获取必要上下文信息的能力
- MCP解决方案:提供统一且可靠的方式来访问所需数据,克服了以往集成方法的局限性。MCP作为一种标准化协议,极大地简化了大语言模型与外部世界的交互方式,使开发者能够以统一的方式为AI应用添加各种能力
- 官方文档:https://modelcontextprotocol.io/introduction
🐙2. 谁支持了MCP
- 2024年11月底:Anthropic推出了MCP。目标就是能在Agent的开发过程中,让大模型更加便捷地调用外部工具。
- 2025年2月份:Cursor(AI代码编辑器)正式宣布加入MCP功能支持,一举将MCP推到了全体开发人员面前!
- 2025年3月27日:OpenAI智能体支持MCP。OpenAI联合创始人兼首席执行官Sam Altman也特意发文大赞MCP,可见其对Agent的重要性。
🌐 四、mcp那些平台支持
- github
- MCP官方资源:https://github.com/modelcontextprotocol/servers
- MCP热门资源:https://github.com/punkpeye/awesome-mcp-servers
- 其它平台
- MCP.so:https://mcp.so/zh
- 阿里云百炼:https://bailian.console.aliyun.com/?tab=mcp#/mcp-market
- Glama:https://glama.ai/mcp/servers
- Smithery:https://smithery.ai
- cursor:https://cursor.directory
🎯 五、mcp应用场景&通信机制
🐙1. 应用场景
应用领域 | 典型场景 | MCP价值 | 代表实现 |
---|---|---|---|
智能编程助手 | 代码生成、Bug修复、API集成 | 安全访问本地代码库、CI/CD系统 | Cursor、VS Code插件 |
数据分析工具 | 自然语言查询数据库、可视化生成 | 安全查询内部数据库、连接BI工具 | XiYanSQL-MCP、数据库MCP服务器 |
企业知识管理 | 知识库查询、文档生成、邮件撰写 | 安全访问内部文档、保护隐私数据 | 文件系统MCP、Email-MCP |
创意设计工具 | 3D建模、图形生成、UI设计 | 与专业软件无缝集成 | Blender MCP、浏览器自动化 |
工作流自动化 | 多系统协调、事件驱动流程 | 跨系统安全协作 | Cloudflare MCP、AWS自动化套件 |
🐙2. MCP通信机制
MCP的通信机制根据MCP的规范,当前支持两种通信机制(传输方式):
- stdio(标准输入输出):主要用在本地服务上,操作你本地的软件或者本地的文件。比如Blender这种就只能用Stdio因为他没有在线服务。MCP默认通信方式
- ① 优点
- 这种方式适用于客户端和服务器在同一台机器上运行的场景,简单。
- stdio模式无需外部网络依赖,通信速度快,适合快速响应的本地应用。
- 可靠性高,且易于调试
- ② 缺点
- stdio的配置比较复杂,我们需要做些准备工作,你需要提前安装需要的命令行工具。
- stdio模式为单进程通信,无法并行处理多个客户端请求,同时由于进程资源开销较大,不适合在本地运行大量服务。(限制了其在更复杂分布式场景中的使用)
- ① 优点
- SSE(Server-Sent Events):主要用在远程通信服务上,服务本身就有在线的APl,比如访问你的谷歌邮件,天气情况等。
- 场景
- SSE方式适用于客户端和服务器位于不同物理位置的场景。
- 适用于实时数据更新、消息推送、轻量级监控和实时日志流等场景
- 对于分布式或远程部署的场景,基于HTTP和SSE的传输方式则更为合适。
- 优点
- 配置方式非常简单,基本上就一个链接就行,直接复制他的链接填上就行
- 场景
🔧 六、MCP环境安装
🐙1. uvx和npx指令安装
stdio的本地环境安装
stdio的本地环境有两种:
- 一种是Python编写的服务
- uvx命令
- cmd下安装:
pip install uv
- powershell 下安装:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 |iex"
- 验证:
uv --version
/uvx --help
- cmd下安装:
- uvx命令
- 一种用TypeScript编写的服务
- npx命令
- 安装 node.js:https://nodeis.org/zh-cn(傻瓜式安装)
- 验证:
node -v
/npm -v
- npx命令
💻七、MCP本地应用
🐙1.服务端应用
1️⃣导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--mcp-server-webflux--><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency>
2️⃣配置文件
server.port=8013
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
spring.application.name=LocalMcpService# ====mcp-server Config=============
spring.ai.mcp.server.type=async
spring.ai.mcp.server.name=weather-mcp-server
spring.ai.mcp.server.version=1.0.0
3️⃣编写工具类(此处简单模拟)
@Service
public class WeatherService
{@Tool(description = "根据城市名称获取天气预报")public String getWeatherByCity(@ToolParam(description = "城市名称") String city){Map<String, String> map = Map.of("北京", "降雨频繁,其中今天和后天雨势较强,部分地区有暴雨并伴强对流天气,需注意","上海", "多云,15℃~27℃,南风3级,当前温度27℃。");return map.getOrDefault(city, "抱歉:未查询到对应城市!");}
}
4️⃣Tool call暴露给外部
@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService){return MethodToolCallbackProvider.builder().toolObjects(weatherService) //加载服务.build();}
🐙2.客户端应用
1️⃣导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!--spring-ai-alibaba dashscope--><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId></dependency>
2️⃣配置文件
server.port=8014
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
spring.application.name=LocalMcpClientspring.ai.dashscope.api-key=${qwen-api}
spring.ai.mcp.client.type=async
spring.ai.mcp.client.request-timeout=60s
spring.ai.mcp.client.ena
#调用服务端地址bled=true
spring.ai.mcp.client.sse.connections.mcp-server1.url=http://localhost:8013
3️⃣编写工具类
@Beanpublic ChatClient chatClient(ChatModel chatModel, ToolCallbackProvider tools){return ChatClient.builder(chatModel).defaultToolCallbacks(tools.getToolCallbacks()) //mcp协议,配置见yml文件.build();}
}
4️⃣服务调用
@RestController
public class McpClientController
{@Resourceprivate ChatClient chatClient;//使用mcp支持// http://localhost:8014/mcpclient/chat?msg=上海@GetMapping("/mcpclient/chat")public Flux<String> chat(@RequestParam(name = "msg",defaultValue = "北京") String msg){return chatClient.prompt(msg).stream().content();}
🐙3.联调测试
GET http://localhost:8014/mcpclient/chat?msg=上海
GET http://localhost:8014/mcpclient/chat?msg=%E4%B8%8A%E6%B5%B7HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 05 Oct 2025 02:04:57 GMT上海的天气预报如下:多云,气温在15℃到27℃之间,风向为南风,风力3级,当前温度为27℃。请注意适时增减衣物,合理安排出行。Response code: 200; Time: 3137ms (3 s 137 ms); Content length: 63 bytes (63 B)
🌍八、MCP远程调用
🐙1.导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!--spring-ai-alibaba dashscope--><dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId></dependency><!-- 2.mcp-clent 依赖 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client-webflux</artifactId></dependency>
🐙2.百度地图配置文件
mcp地址: https://mcp.so/zh/server/baidu-map/baidu-maps
百度地图api-key地址: https://lbsyun.baidu.com/apiconsole/key
{"mcpServers":{"baidu-map":{"command": "cmd","args": ["/c", "npx", "-y", "@baidumap/mcp-server-baidu-map"],"env": {"BAIDU_MAP_API_KEY": "你自己申请的key"}}}
}
//aq0gJ4CHpajWZ3LS0XtUougbsUfV8MHp
###🐙 3.配置文件
server.port=8015
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
spring.application.name=ClientCallBaiduMcpServer
# ====SpringAIAlibaba Config=============
spring.ai.dashscope.api-key=${qwen-api}
# ====mcp-client Config=============
spring.ai.mcp.client.request-timeout=20s
spring.ai.mcp.client.toolcallback.enabled=true
spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-server.json5
🐙4.编写工具类
@Configuration
public class ClientMcpConfig {@Beanpublic ChatClient chatClient(ChatModel chatModel, ToolCallbackProvider tools) {return ChatClient.builder(chatModel)//mcp协议,配置见yml文件,此处只赋能给ChatClient对象.defaultToolCallbacks(tools.getToolCallbacks()).build();}@Beanpublic RestClient.Builder restClientBuilder() {return RestClient.builder();}
}
🐙5.服务调用
/*** 添加了MCP调用能力* http://localhost:8015/mcp/chat?msg=查询怀柔苏峪口站天气*/@GetMapping("/mcp/chat")public Flux<String> chat(@RequestParam(name = "msg", defaultValue = "查询怀柔苏峪口站天气") String msg) {return chatClient.prompt(msg).stream().content();}
🐙6.测试
GET http://localhost:8015/mcp/chat?msg=%E6%9F%A5%E8%AF%A2%E6%80%80%E6%9F%94%E8%8B%8F%E5%B3%AA%E5%8F%A3%E7%AB%99%E5%A4%A9%E6%B0%94HTTP/1.1 200 OK
transfer-encoding: chunked
Content-Type: text/plain;charset=UTF-8怀柔苏峪口站当前天气为小雨,气温19℃,体感温度20℃,相对湿度86%,北风1级,空气质量良好(AQI 39)。**未来几天天气预报:**
- **10月5日(今天)**:小雨,气温12~21℃,北风转西风<3级。
- **10月6日**:小雨转多云,气温13~17℃,南风转北风<3级。
- **10月7日**:多云,气温7~23℃,南风转东北风<3级。
- **10月8日**:小雨,气温5~14℃,南风转东北风<3级。
- **10月9日**:小雨,气温4~10℃,东北风<3级。**生活指数建议:**
- **穿衣**:较舒适,建议穿薄外套或牛仔裤等服装。
- **感冒**:易发,请注意保暖,避免着凉。
- **运动**:较不宜,有降水,推荐在室内进行休闲运动。
- **洗车**:不适宜,两天内有雨。
- **紫外线**:弱,涂擦SPF12-15、PA+护肤品即可。Response code: 200 (OK); Time: 7039ms (7 s 39 ms); Content length: 393 bytes (393 B)
好记性不如赖笔头
写文档下雨了没注意收鞋子衣服,老妈回来骂了我一顿ε(┬┬﹏┬┬)3