参考 :(2 封私信) AI是如何确定应使用的MCP Server的? - 知乎
MCP的全称是模型上下文协议(Model Context Protocol),是由Anthropic推出的一种开放标准协议。其设计目的在于让大型语言模型(LLMs)能够与外部的数据源和工具实现无缝交互。MCP就像是为AI提供了一个“通用插头”,使得这些智能模型可以像我们使用USB接口一样,轻松连接到各种不同的设备和服务上。
MCP Server Boot Starter :: Spring AI Reference
GitHub - spring-projects/spring-ai-examples
MCP允许AI模型通过标准化的方式连接到外部数据源或服务(比如天气API、数据库查询等)。
Spring MCP Server
Spring MCP Server 提供了三种不同的模式:
- • Standard Input/Output (STDIO) - spring-ai-starter-mcp-server
- • Spring MVC (Server-Sent Events) - spring-ai-starter-mcp-server-webmvc
- • Spring WebFlux (Reactive SSE) - spring-ai-starter-mcp-server-webflux
- •Standard MCP Server适合简单的本地开发和单进程通信。
- •WebMVC Server Transport适合传统的基于 Servlet 的 Web 应用,支持同步模式。
- •WebFlux Server Transport适合高性能、高并发的响应式应用,支持异步模式。
WebFlux Server Transport
- •核心功能:WebFlux Server Transport 是基于 Spring WebFlux 的服务器实现。它提供了响应式 SSE 支持,能够处理高并发的异步流式数据。
- •适用场景:适合需要高性能、非阻塞 I/O 的现代响应式应用,特别是在处理大量并发连接时表现出色。
- •特点:
- • 基于响应式编程模型,支持非阻塞操作。
- • 提供响应式的 SSE 端点,客户端可以通过
text/event-stream协议与服务器进行流式交互。 - • 支持异步模式,适合需要高并发和低延迟的应用。
GitHub - spring-projects/spring-ai-examples
打开项目后,我们先运行 McpServerApplication.java
然后运行测试文件 ClientSse.java ,可以看到终端返回了天气信息。
Dify MCP客户端是指在Dify平台上通过插件安装的能够调用MCP Server的工具。具体来说:
Dify MCP客户端是指Dify平台上的插件,这些插件允许Dify作为客户端与MCP Server进行交互。
它们包括Agent策略和MCP SSE / StreamableHTTP插件,其中Agent策略支持MCP工具,而MCP SSE / StreamableHTTP插件则用于处理基于HTTP和SSE协议的MCP请求。
通过安装这些插件,Dify可以轻松地将任何MCP Server配置为工具,从而调用这些服务中的功能或数据。
这个客户端插件的存在,使得Dify能够与遵循MCP协议的外部服务无缝对接,扩展其功能并利用更多外部资源。
Dify 暂时未使用
参考:必看!SpringAI轻松构建MCP Client-Server架构-腾讯云开发者社区-腾讯云
STDIO是Standard Input/Output(标准输入/输出)的缩写。
在spring-ai-starter-mcp-client这个上下文中,支持STDIO意味着该客户端可以通过进程的标准输入(stdin)和标准输出(stdout)流与另一个进程进行通信。
具体来说:
- 通信方式:它不依赖于网络(如 HTTP),而是通过操作系统提供的标准输入输出流。通常,一个进程(比如你的 Spring Boot 应用)会启动另一个进程(比如一个实现了 MCP 协议的本地工具或服务),然后通过读取该子进程的
stdout来接收数据,并通过向其stdin写入数据来发送指令。 - 应用场景:这种方式常用于与本地运行的、命令行工具风格的进程进行集成。例如,你的 Spring Boot 应用启动一个 Python 脚本,这个脚本负责与某个 AI 模型交互,两者之间通过
STDIO传递 JSON 格式的请求和响应。 - 优点:
- 简单高效:对于本地进程间通信(IPC),
STDIO通常比网络通信开销更小。 - 易于集成:很多脚本语言(Python, Node.js 等)编写的工具天然支持从
stdin读取输入并输出到stdout,便于与主应用集成。 - 跨语言:只要子进程能处理
STDIO流,就可以用任何语言编写。
- 简单高效:对于本地进程间通信(IPC),
- 与 HTTP/SSE 的对比:
HTTP/SSE(Server-Sent Events) 是基于网络的通信,适用于远程服务或需要通过网络 API 访问的场景。STDIO是基于本地进程管道的通信,适用于与同一台机器上运行的辅助进程协作。
总结: 在spring-ai-starter-mcp-client中,STDIO支持允许你的 Spring Boot 应用通过标准输入输出流,与一个本地运行的、实现了 MCP (Model Context Protocol) 的进程进行通信,为集成本地 AI 工具或代理提供了一种轻量级、高效的途径。
参考 SpringAI系列---【MCP协议与AI Agent技术解析】 - 少年攻城狮 - 博客园
一、核心概念与角色定位
1. MCP协议(Model Context Protocol)
- 定义:由Anthropic提出的开放协议,标准化AI模型与外部系统的交互接口
- 三大核心特性:
- 🌀 动态服务发现:自动识别可用设备与服务
- 🧩 协议统一化:屏蔽不同品牌设备的API差异
- 🔄 双向通信:支持状态监控与实时控制
2. AI Agent(智能代理)
- 本质:具备自主决策能力的AI程序
- 核心能力:
- 上下文感知(用户习惯/环境状态)
- 多目标优化(舒适度 vs 节能)
- 异常自愈(设备故障自动切换)
3. FunctionCall(函数调用)
- 传统模式:硬编码调用特定设备API
- 典型缺陷:
- 🔗 设备强耦合(更换品牌需重构代码)
- 📉 扩展性差(新增设备需修改逻辑)
4. Spring AI
- 定位:企业级AI应用开发框架
- 核心价值:
- 🛠️ 封装MCP协议实现细节
- 🔒 提供安全审计与权限控制
- 📈 支持高并发设备管理
------------------------------------------------------------------------------------------------------------------------
MCP 协议深度讲解
口径来源:MCP 官方规范 2026-07-28 版 + 平台落地对照。
一、MCP 一句话定义
MCP(Model Context Protocol)= 给「AI 用工具」定的 USB 标准。
它让 AI 应用能以统一协议连接外部数据源和工具,不管对方是数据库、API、文件系统还是本地脚本。就像 USB 让所有外设插上就能用,MCP 让所有工具服务器接上就能被 AI 调用。
二、三个核心角色
MCP 是Host → Client → Server三层架构:
text
┌─────────────────────────────────────────┐ │ Host(AI 应用) │ │ 例:VS Code Copilot / 你的平台 │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Client A │ │ Client B │ ← 连接器 │ │ └────┬─────┘ └────┬─────┘ │ └────────┼──────────────┼──────────────────┘ │ │ ▼ ▼ ┌──────────┐ ┌──────────┐ │ Server A │ │ Server B │ ← 工具/数据提供方 │ 数据库 │ │ 文件系统 │ └──────────┘ └──────────┘
| 角色 | 职责 | 你的平台对应 |
|---|---|---|
| Host | 发起连接的 LLM 应用 | 北极星平台 |
| Client | Host 内的连接器 | mcp_servers/client.py |
| Server | 提供工具/数据的服务 | drawing-serve / quote-serve / bi-serve |
三、Server 能提供三种能力
MCP Server 向 Client 暴露三类功能:
| 能力 | 是什么 | 谁控制 | 你的平台 |
|---|---|---|---|
| Tools | 可执行函数,模型调用 | 模型控制(模型决定调不调) | draw_parse / bi_query |
| Resources | 上下文数据,只读 | 应用控制(应用决定给不给模型) | 未使用 |
| Prompts | 预置提示模板 | 用户控制(用户选择用哪个) | 未使用 |
你当前只用了Tools这一种,这是最核心也最常用的能力。
四、Tools 的协议细节
4.1 两个核心方法
| 方法 | 作用 | 返回 |
|---|---|---|
tools/list | 发现有哪些工具 | 工具定义数组(含inputSchema) |
tools/call | 执行某个工具 | 执行结果(content数组) |
4.2 工具定义长什么样
json
{ "name": "searchFlights", "description": "Search for available flights", "inputSchema": { "type": "object", "properties": { "origin": { "type": "string", "description": "出发城市" }, "destination": { "type": "string", "description": "到达城市" }, "date": { "type": "string", "format": "date" } }, "required": ["origin", "destination", "date"] } }inputSchema用 JSON Schema 描述参数,默认 dialect 是 2020-12。
4.3 调用返回什么
json
{ "content": [ { "type": "text", "text": "找到 3 个航班..." } ] }也可以返回structuredContent(结构化 JSON),适合机器消费。
五、Tools 的安全机制(官方强调)
MCP 官方规范把Tool Safety列为三大安全原则之一:
Tools 代表任意代码执行,必须谨慎对待。
官方建议的管控手段:
| 机制 | 说明 | 你的平台对应 |
|---|---|---|
| 工具执行前需用户同意 | 每次调用可弹审批 | HIGH_RISK interrupt |
| UI 展示可用工具 | 用户决定哪些工具可用 | skill 白名单 |
| 权限设置 | 预批准安全操作 | 岗位 allow_write |
| 活动日志 | 记录所有工具执行 | workflow_events |
你的三道安全闸(重名先注册者胜 / 占名遮蔽 / skill 白名单)是在 MCP 官方建议之上的平台侧加固,MCP 协议本身不规定这些。
六、协议版本与传输的重要变化
6.1 最新版是「无状态」的
2026-07-28 版做了一个重大变更:从有状态连接改为无状态、自包含请求。
| 维度 | 旧版(≤2025-11-25) | 新版(2026-07-28) |
|---|---|---|
| 会话 | Mcp-Session-Id头 | 移除,无会话 |
| 握手 | initialize/notifications/initialized | 移除,每请求自带信息 |
| 发现 | 无 | 新增server/discover |
| 能力协商 | 握手时协商 | 每请求通过_meta携带 |
| 传输 | SSE / Streamable HTTP | 移除 SSE |
新版每个请求通过_meta字段携带协议版本和客户端能力:
json
{ "jsonrpc": "2.0", "id": "1", "method": "tools/call", "params": { "_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28", "io.modelcontextprotocol/clientInfo": { "name": "polaris", "version": "1.0" }, "io.modelcontextprotocol/clientCapabilities": {} } } }6.2server/discover新方法
服务端必须实现server/discover,让客户端在发任何其他请求前查询服务端支持的版本、能力和身份:
json
// 请求 { "method": "server/discover" } // 响应 { "supportedVersions": ["2026-07-28"], "capabilities": { "tools": {} }, "_meta": { "io.modelcontextprotocol/serverInfo": { "name": "drawing-serve" } } }6.3 你当前用的 SSE 是什么版本
你平台用的是SSE + initialize 握手 + Mcp-Session-Id,这是2025-06-18 或 2025-11-25 版的形态。在 2026-07-28 版中,SSE 和会话已被移除。
对你的影响:
只在内网自用:当前能跑,但未来升级 MCP SDK 时需要迁移
要对接外部生态:外部 MCP server 可能已在往无状态模式演进
七、MCP 的「扩展」机制
MCP 除了核心协议,还定义了可选扩展,需双方在初始化时显式协商支持:
| 扩展 | 作用 |
|---|---|
| Tasks | 长时运行操作的异步执行(轮询、中途输入、持久句柄) |
| Skills over MCP | 通过 MCP 发现和消费 agent 工作流的结构化指令 |
| MCP Apps | 会话内联渲染的交互式 UI(图表、表单、视频) |
你的平台未使用这些扩展,但 Tasks 扩展与你的「有界多轮编排」方向有潜在对齐空间。
八、MCP 与 A2A 的官方分工
MCP 官方定位是AI 应用 ↔ 外部工具/数据的标准化连接。A2A 官方定位是Agent ↔ Agent的任务级互通。两者互补,不冲突:
| 维度 | MCP | A2A |
|---|---|---|
| 连接对象 | AI 应用 ↔ 工具/数据源 | Agent ↔ Agent |
| 核心概念 | Tools / Resources / Prompts | Task / AgentCard / Artifact |
| 方向 | 纵向(智能体伸手用工具) | 横向(系统派活给岗位) |
| 你的平台 | 平台连各 -serve 引擎 | 外部系统派单给平台岗位 |
九、一句话总结
MCP = AI 用工具的 USB 标准。三角色(Host / Client / Server),三能力(Tools / Resources / Prompts),核心方法
tools/list+tools/call,默认 JSON Schema 2020-12 校验。最新 2026-07-28 版移除会话和 SSE,改为无状态自包含请求 +server/discover。你当前用的是 2025 版 SSE 形态,内网够用,对接外部生态时需关注迁移。