一文读懂MCP模型上下文协议

article/2025/6/17 1:01:53

前言:MCP(Model Context Protocol,模型上下文协议)作为一个全新的开源协议框架被提出,它试图重塑模型开发、集成与协作的方式。MCP让只能人机交互的大模型转化为了能够快速对接各类业务系统的生产力大脑。传统做法通常是“业务系统 + AI”,即在现有各业务系统中局部融入AI能力;而借助MCP(AI中心平台),则可以实现“AI + 业务”的全新构建方式,将AI作为新业务的核心驱动力。通过将原有系统的功能封装为API并接入MCP,各类新业务可按需调用已有能力,实现快速集成与创新。这种方式无需推翻已有系统重来,成本更低、效率更高,尤其适用于新建一两个以AI为中心的系统场景。对于企业级(To B)和政府(To G)应用而言,这种基于MCP的架构重构更具现实意义和落地价值。


一、MCP简介

1.1、MCP定义

MCP(Model Context Protocol) 是一种由 Anthropic (Claude 大模型母公司)于 2024 年 11 月发布的开源协议,旨在标准化大型语言模型(LLM)与外部数据源和工具的交互。它像“AI的USB-C接口”,通过统一接口让 AI 模型无缝连接数据库、文件、API 等外部资源。MCP 通过客户端-服务器架构(MCP Client 和 MCP Server)实现,广泛应用于 AI 助手、开发工具等场景,助力构建更智能、互联的 AI 应用。

MCP协议的初衷是希望能将大模型的工具调用来做统一,目标是成为 AI 领域的“HTTP 协议”,推动 LLM 应用的标准化和去中心化。简单介绍一些没有MCP之前的痛点问题,帮助大家理解为何需要MCP。

  • 客户端:每个工具暴露出来的对接方式都不一样,客户端为了去对接各类工具,需要做很多开发,比如getWeather工具是一个http服务,getLocation是一个HSF服务,并且两种入参,出参的数据结构都不一样,那这时候的对接开发成本就会很高;

  • 服务端:A平台Agent和B平台Agent所需要服务的约定不一致,同一个服务需要考虑客户端的约定,开发两套接口,开发成本和维护成本都较高;

因此,MCP的出现约定了在AI开发领域客户端和服务端的对接规范,当然未来也许会有更好用的协议也会替代MCP成为一种新的规范。

1.2、MCP 组成

MCP遵循客户端 - 服务器架构,包含以下几个核心部分:

  • MCP 主机(MCP Hosts):发起请求的 AI 应用程序,比如聊天机器人、AI 驱动的 IDE 等。

  • MCP 客户端(MCP Clients):在主机程序内部,与 MCP 服务器保持 1:1 的连接。

  • MCP 服务器(MCP Servers):为 MCP 客户端提供上下文、工具和提示信息。

  • 本地资源(Local Resources):本地计算机中可供 MCP 服务器安全访问的资源,如文件、数据库。

  • 远程资源(Remote Resources):MCP 服务器可以连接到的远程资源,如通过 API 提供的数据。

图片

1.3、模型上下文协议的概述

模型上下文协议 (MCP) 为 AI 模型交互定义了一个标准化的消息传递格式。它促进了不同 AI 模型和平台之间的互操作性。

主要特性

  • 标准化消息格式:MCP 为请求、响应和错误消息定义了一个通用的结构。
  • 模型无关:该协议设计为可与各种类型的 AI 模型(例如,聊天模型、嵌入模型、图像模型)配合使用。
  • 可扩展性:MCP 允许添加自定义元数据和扩展,以支持特定用例。
  • 互操作性:通过遵守 MCP,不同的 AI 系统可以无缝通信。

MCP 消息结构,一个典型的 MCP 消息包含以下组件:

  • 标头 (Headers):包含元数据,如消息 ID、时间戳和模型信息。

  • 正文 (Body):携带实际的有效载荷,如用户输入或模型输出。

  • 上下文 (Context):提供有关对话历史或先前交互的附加信息。

1.4、MCP作用

由于 LLM 难以直接访问实时数据源(如企业内部数据库、实时文档、在线服务等),开发者通常需要为每个应用场景定制专用的适配器或插件,这既耗时费力,又缺乏可扩展性。

  • 标准化:MCP 希望通过定义一个标准化的协议,减少为每个工具或数据源编写自定义接口的工作,降低开发复杂性,使开发者在无需重复开发的情况下快速连接模型与数据源,提升模型的通用性和落地效率,降低了模型与多样化数据源之间的连接复杂度。

  • 灵活性:MCP 通过帮助 LLM 直接与数据和工具集成,保证 LLM 切换的灵活性。

  • 开放性:其作为开放协议,允许任何开发者为其产品创建 MCP 服务器。有助于快速扩展生态,形成类似 HTTP 和 REST API 的网络效应,推动模型与应用场景的融合。

  • 安全性:协议内置了严格的权限控制机制,数据源的所有者始终掌握访问权。模型在获取数据时需要经过明确授权,避免数据泄露和滥用问题。

1.5、MCP工具调用流程

用户发送问题 -> LLM 分析可用工具 -> 客户端通过 MCP 服务器来执行所选工具 -> 将结果发送回 LLM -> LLM根据工具返回结果和用户问题进行回答。

1.6、MCP Java SDK 架构

Java MCP 实现遵循三层架构:

  • 客户端/服务器层:McpClient 处理客户端操作,而 McpServer 管理服务器端协议操作。两者都使用 McpSession 进行通信管理。

  • 会话层(McpSession):通过 DefaultMcpSession 实现管理通信模式和状态。

  • 传输层(McpTransport):处理 JSON-RPC 消息的序列化和反序列化,支持多种传输实现。

MCP 客户端

MCP 客户端是模型上下文协议(MCP)架构中的关键组件,负责建立和管理与 MCP 服务器的连接。它实现了协议的客户端部分,处理:

  • 协议版本协商以确保与服务器的兼容性

  • 能力协商以确定可用功能

  • 消息传输和 JSON-RPC 通信

  • 工具发现和执行

  • 资源访问和管理

  • 提示系统交互

  • 可选功能:

    • 根管理

    • 采样支持

  • 同步和异步操作

  • 传输选项:

    • 基于 Stdio 的传输用于基于进程的通信

    • 基于 Java HttpClient 的 SSE 客户端传输

    • WebFlux SSE 客户端传输用于反应式 HTTP 流

Java MCP 客户端架构

MCP 服务器

MCP 服务器是模型上下文协议(MCP)架构中的基础组件,为客户端提供工具、资源和功能。它实现了协议的服务器端,负责:

  • 服务器端协议操作实现

    • 工具暴露和发现

    • 基于 URI 的资源管理

    • 提示模板提供和处理

    • 与客户端的能力协商

    • 结构化日志和通知

  • 并发客户端连接管理

  • 同步和异步 API 支持

  • 传输实现:

    • 基于 Stdio 的传输用于基于进程的通信

    • 基于 Servlet 的 SSE 服务器传输

    • 基于 WebFlux 的 SSE 服务器传输用于反应式 HTTP 流

    • 基于 WebMVC 的 SSE 服务器传输用于基于 Servlet 的 HTTP 流

Java MCP 服务器架构


二、为什么需要MCP?

MCP 存在的意义是它解决了大模型时代最关键的三个问题:数据孤岛、开发低效和生态碎片化等问题。

1.打破数据孤岛,让AI“连接万物”

大模型本身无法直接访问实时数据或本地资源(如数据库、文件系统),传统方式需要手动复制粘贴或定制接口。MCP 通过标准化协议,让大模型像“插USB”一样直接调用外部工具和数据源,例如:

  • 查天气时自动调用气象 API,无需手动输入数据。

  • 分析企业数据时直接连接内部数据库,避免信息割裂。

2.降低开发成本,一次适配所有场景

在之前每个大模型(如 DeepSeek、ChatGPT)需要为每个工具单独开发接口(Function Calling),导致重复劳动,MCP 通过统一协议:

  • 开发者只需写一次 MCP 服务端,所有兼容 MCP 的模型都能调用。

  • 用户无需关心技术细节,大模型可直接操作本地文件、设计软件等。

3.提升安全性与互操作性

  • 安全性:MCP 内置权限控制和加密机制,比直接开放数据库更安全。

  • 生态统一:类似 USB 接口,MCP 让不同厂商的工具能“即插即用”,避免生态分裂。

4.推动AIAgent的进化

MCP 让大模型从“被动应答”变为“主动调用工具”,例如:

  • 自动抓取网页新闻补充实时知识。

  • 打开 Idea 编写一个“Hello World”的代码。

MCP 的诞生,相当于为AI世界建立了“通用语言”,让模型、数据和工具能高效协作,最终释放大模型的全部潜力。


三、Spring AI MCP 集成

Spring AI MCP 是通过 Spring Boot 集成扩展了 MCP 的 Java SDK(开发工具),它同时提供了 Spring Boot 客户端和服务器的启动器,方便使用 Spring AI MCP 快速开发 AI 应用程序。

Spring AI 通过以下 Spring Boot 启动器提供 MCP 集成:

客户端启动器

  • spring-ai-starter-mcp-client - 提供 STDIO 和基于 HTTP 的 SSE 支持的核心启动器

  • spring-ai-starter-mcp-client-webflux - 基于 WebFlux 的 SSE 传输实现

服务器启动器

  • spring-ai-starter-mcp-server - 具有 STDIO 传输支持的核心服务器

  • spring-ai-starter-mcp-server-webmvc - 基于 Spring MVC 的 SSE 传输实现

  • spring-ai-starter-mcp-server-webflux - 基于 WebFlux 的 SSE 传输实现

Spring AI MCP 实战

当前案例中,我们使用 MCP 实现一个天气查询小助手,其中包含的主要角色有:

  • MCP Server:MCP 服务提供方,提供天气查询功能。

  • MCP Client:MCP 客户端(大模型端)我们对接 DeepSeek LLM 实现对 MCP Server 的调用,从而实现天气预报的查询功能。

具体交互流程如下:

图片

(1)实现 MCP Server 代码编写

MCP Server 主要实现步骤如下:

  1. 添加 MCP Server 依赖。

  2. 设置 MCP 配置信息。

  3. 编写 MCP Server 服务代码。

  4. 将 MCP Server 进行暴露设置。

关键实现代码如下。

添加 MCP Server 依赖
<dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
</dependencies><repositories>
<repository><name>Central Portal Snapshots</name><id>central-portal-snapshots</id><url>https://central.sonatype.com/repository/maven-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots>
</repository>
<repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots>
</repository>
<repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases>
</repository>
</repositories>

MCP Server 依赖有三种类型:

  • 标准输入/输出 (STDIO):spring-ai-starter-mcp-server

  • Spring MVC(服务器发送的事件):spring-ai-starter-mcp-server-webmvc

  • Spring WebFlux(响应式 SSE):spring-ai-starter-mcp-server-webflux

设置 MCP 配置信息

MCP Server 包含以下配置信息:

配置项描述默认值
enabled启用/禁用 MCP 服务器TRUE
stdio启用/禁用 stdio 传输FALSE
name用于标识的服务器名称mcp-server
version服务器版本1.0.0
type服务器类型 (SYNC/ASYNC)SYNC
resource-change-notification启用资源更改通知TRUE
prompt-change-notification启用提示更改通知TRUE
tool-change-notification启用工具更改通知TRUE
tool-response-mime-type(可选)每个工具名称的响应 MIME 类型。例如,将 mime 类型与工具名称相关联spring.ai.mcp.server.tool-response-mime-type.generateImage=image/pngimage/pnggenerateImage()-
sse-message-endpointWeb 传输的 SSE 终端节点路径/mcp/message

其中 MCP Server 又分为以下两种类型。

服务器类型
  • 同步服务器:默认服务器类型,它专为应用程序中的简单请求-响应模式而设计。要启用此服务器类型,请在您的配置中设置。 激活后,它会自动处理同步工具规格的配置,spring.ai.mcp.server.type=SYNC。

  • 异步服务器:异步服务器实现使用非阻塞作并针对非阻塞作进行了优化。要启用此服务器类型,请使用配置您的应用程序。此服务器类型会自动设置具有内置 Project Reactor 支持的异步工具规范,spring.ai.mcp.server.type=ASYNC。

编写 MCP Server 服务代码

编写天气预报查询伪代码:

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Service;import java.util.Map;@Service
publicclass WeatherService {@Tool(description = "根据城市名称获取天气预报")public String getWeatherByCity(String city) {Map<String, String> mockData = Map.of("西安""晴天","北京""小雨","上海""大雨");return mockData.getOrDefault(city, "抱歉:未查询到对应城市!");}}
将服务暴露出去
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}

这样 MCP Server 就编写完成了。

(2)实现 MCP Client 代码编写

MCP Client 主要实现步骤如下:

  1. 添加 MCP Client 相关依赖。

  2. 设置配置信息。

  3. 设置 ChatClient 对象(调用 MCP Server)。

  4. 编写测试代码调用 MCP Server。

核心实现代码如下:

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
publicclass ClientController {@Autowiredprivate ChatClient chatClient;@RequestMapping("/chat")public String chat(@RequestParam(value = "msg",defaultValue = "今天天气如何?") String msg) {String response = chatClient.prompt().user(msg).call().content();System.out.println("响应结果: " + response);return response;}}

最终执行结果如下:

图片

因为 MCP Server 只配置了 3 个城市,所以查询结果和预期相符:

小结

到这里使用 Spring AI 就实现了 MCP Client 和 Server 的调用了,可以看出 MCP 的推出只是为了增强大模型的能力的,有了 MCP 协议之后,任何大模型就可以调用任意实现了 MCP Server 的服务了,这样就无线扩充了大模型的能力,为 AI 的发展提供了标准的协议和便利的对接。


4、 MCP、A2A 与 Function Calling 的关系

  • Function Calling:模型如何“伸手”操作工具

  • MCP:工具如何“统一接头”对接模型

  • A2A:多智能体如何“互相喊话”分工协作


(1)三者不是替代,而是“工具调用 → 接口标准化 → 智能体协作”的递进演化,演进脉络概览

Image

  1. 2023 Q3 OpenAI — Function Calling

    让 GPT‑4 能在一次对话里发起 API 调用。

  2. 2024 Q4 Anthropic — MCP

    用统一协议把“任意工具 × 任意模型”拆解为线性成本。

  3. 2025 Q2 Google — A2A

    让多个 Agent 形成流水线,共同完成长链路任务。

    (2)三者对比与协同

    维度

    Function Calling

    MCP

    A2A

    聚焦点

    模型 ↔单工具

    模型 ↔多工具

    Agent ↔ Agent

    通信模式

    单次 RPC

    双工 JSON‑RPC / WebSocket

    HTTP + SSE / gRPC‑stream

    扩展成本

    M×NM+NK(Agent 数)

    链式调用

    应用层显式编排

    Server 内部可递归

    原生 Task DAG

    典型角色

    “伸手”

    “接头”

    “喊话”


 参考链接:

MCP,这个AI 开源协议有多大想象空间?

全面剖析 MCP、A2A 与 Function Calling 的架构关系

一文讲透MCP的原理及实践

必看!SpringAI轻松构建MCP Client-Server架构

MCP入门篇: 史上最全MCP市场合集!90%的人都不知道(建议收藏)

从原理到示例:Java开发玩转MCP

Spring AI 1.0 正式发布,属于 Java 开发者的 AI 框架

https://mp.weixin.qq.com/s/qgiV2eQ858NzcEBj16YRMg


http://www.hkcw.cn/article/ZappnAhTYJ.shtml

相关文章

C#数字图像处理(一)

文章目录 1.C#图像处理基础1.1 Bitmap类1.2 Bitmapdata类1.3 Graphics类1.4 Image类 2.彩色图像灰度化1.提取像素法2.内存法3.指针法三种方法的比较4.灰度图像二值化&#xff1a; 3.相关链接 Bitmap类、 Bitmapdata类和 Graphics类是C#图像处理中最重要的3个类,如果要用C# 进行…

各种数据库,行式、列式、文档型、KV、时序、向量、图究竟怎么选?

慕然回首&#xff0c;发现这些年来涌现出了许多类型的数据库&#xff0c;今天抽空简单回顾一下&#xff0c;以便于后面用到时能快速选择。 1. 关系型数据库(行式) 关系型数据库&#xff08;RDBMS&#xff09;&#xff0c;我们常说的数据库就是指的关系型数据库。 它的全称是关…

uView UI的使用

1. uView UI 封装了request.get登方法请求&#xff0c;异步调用。 故需可以使用then, catch, finally uView UI. 是一个专为UniApp设计的跨平台UI框架, 注意这里是跨平台&#xff0c;也就是可以再IOS, ANDROID 机器上运行的框架 2. easycom 词面意思容易使用的组件 在使用…

win32相关(临界区)

临界区 每个线程都有自己的栈&#xff0c;而局部变量是存在在栈中的&#xff0c;这就意味着每个线程都有一份自己的”局部变量“&#xff0c;如果线程仅仅只是使用自己的”局部变量“那么就不会有线程安全问题&#xff0c;那如果多个线程使用一个全局变量呢&#xff1f; 我们用…

UE5蓝图暴露变量,在游戏运行时修改变量实时变化、看向目标跟随目标Find Look at Rotation、修改玩家自身弹簧臂

UE5蓝图中暴露变量&#xff0c;类似Unity中public一个变量&#xff0c;在游戏运行时修改变量实时变化 1&#xff0c;添加变量 2&#xff0c;设置变量的值 3&#xff0c;点开小眼睛&#xff0c;此变量显示在编辑器中&#xff0c;可以运行时修改 看向目标跟随目标Find Look at R…

112 Gbps 及以上串行链路的有效链路均衡

通道均衡已成为当今高速串行链路的关键机制。目前有许多均衡方案&#xff0c;例如发射机加重均衡、接收机CTLE&#xff08;连续时间线性均衡器&#xff09;、FFE&#xff08;前馈均衡器&#xff09;、DFE&#xff08;判决反馈均衡器&#xff09;和FEC&#xff08;前向纠错&…

【LLM相关知识点】关于LangChain框架学习简单整理(三)

【LLM相关知识点】关于LangChain框架学习简单整理&#xff08;三&#xff09; 一、核心模块和协作模式 参考极简LangChain智能体开发入门指南&#xff0c;LangChain官方文档 LangChain核心模块与功能&#xff1a; 核心模块功能描述关键技术点​模型I/O管理大模型输入输出&a…

基于CangjieMagic的RAG技术赋能智能问答系统

目录 引言 示例程序分析 代码结构剖析 导入模块解读 智能体配置详情 提示词模板说明 主程序功能解析 异步聊天功能实现 检索信息展示 技术要点总结 ollama 本地部署nomic-embed-text 运行测试 结语 引言 这段时间一直在学习CangjieMagic。前几天完成了在CangjieMa…

【速通RAG实战:进阶】18、如何利用LLM记忆功能,实现一对一的个性化服务

一、赛博记忆的本质:从数据到数字人格的进化 (一)核心概念与技术定位 赛博记忆(Cyber Memory)是通过AI技术将个人多源数据(文本、图像、生物特征等)转化为可交互的动态记忆系统,其终极目标是构建可进化的数字人格,实现记忆的存储、重构与智能响应。与传统数据存储不…

C++深入类与对象

在上一篇中提到了构造函数&#xff0c;那么这篇再来提一下构造函数&#xff0c;编译器自动生成的默认构造函数对于内置类型不做处理&#xff0c;自定义类型会调用它自己的构造函数。对于自己写的构造函数&#xff0c;之前是在函数体中初始化&#xff0c;当然不止这一种初始化&a…

创新型老年综合评估实训室建设方案:提升评估实训精准性

随着人口老龄化加剧&#xff0c;老年综合评估人才需求激增&#xff0c;建设创新型老年综合评估实训室&#xff0c;是提升评估实训精准性、培育专业人才的关键路径。点击获取实训室建设方案 一、建设背景与意义 &#xff08;一&#xff09;行业发展需求 1、老龄化社会对老年综…

凤凰古城举行端午抢鸭子活动 欢乐江中庆佳节

5月31日,湖南凤凰古城沱江上举行了一场备受期待的“抢鸭子”大赛。500只精心挑选的鸭子被投入江中,其中一些鸭子颈项间系着鲜艳红绸带,象征好运。随着一声悠长的吆喝声响起,早已准备好的参赛者们纷纷跃入清凉的江水中。现场瞬间变成了欢乐的海洋,游客和市民一同沉浸在浓厚…

【深度学习】16. Deep Generative Models:生成对抗网络(GAN)

Deep Generative Models&#xff1a;生成对抗网络&#xff08;GAN&#xff09; 什么是生成建模&#xff08;Generative Modeling&#xff09; 生成模型的主要目标是从数据中学习其分布&#xff0c;从而具备“生成”数据的能力。两个关键任务&#xff1a; 密度估计&#xff0…

卢伟冰:诋毁本身就是一种仰望 小米汽车成功之道

小米集团合伙人、总裁卢伟冰昨晚谈到了小米汽车的成功。他表示,无论是SU7的热销还是YU7获得更高关注和期待,都基于强大的产品力。小米以“十倍投入做一辆好车”的决心,赢得了千万网友的认可。卢伟冰强调,小米汽车的成功体现了小米的价值观、模式和方法论。他还引用了莫言的…

西安交大原校长徐通模逝世 沉痛悼念与缅怀

沉痛悼念并深切缅怀徐通模同志。中国共产党优秀党员、西安交通大学原校长、我国动力工程与工程热物理领域著名专家、西安交通大学能源与动力工程学院热能工程系徐通模教授,因病医治无效,于2025年5月31日下午14时16分在西安逝世,享年86岁。徐通模同志1939年11月生于江苏如皋,…

性能优化 - 理论篇:常见指标及切入点

文章目录 引言一、 Java 性能优化的核心思路二、为什么要度量&#xff1f;三、常用性能衡量指标详解3.1 吞吐量与响应速度3.2 响应时间的具体度量&#xff1a;平均响应时间与百分位数3.3 并发量3.4 秒开率&#xff08;页面秒开&#xff09;3.5 正确性&#xff08;功能可用性&am…

Java代码重构:如何提升项目的可维护性和扩展性?

Java代码重构&#xff1a;如何提升项目的可维护性和扩展性&#xff1f; 在Java开发领域&#xff0c;随着项目规模的不断扩大和业务需求的频繁变更&#xff0c;代码的可维护性和扩展性逐渐成为了项目成功的关键因素。代码重构作为一种优化代码质量的重要手段&#xff0c;能够在…

【数据集】全球无缝高分辨率1 km 月均地表温度和气温(2001-2020)

目录 数据概述一、输入数据(Input Data)二、模型处理(Modeling and Processing)2.1 清空缺值重建(Clear-sky Ts Reconstruction)2.2 多云条件下地表温度重建(Cloudy-sky Ts Reconstruction)2.3 近地表气温估算(Ta Estimation)2.4 准确性验证与对比三、输出结果与产品…

Vue能启动但访问空白?并报”export ‘default’ (imported as ‘Vue’) was not found in ‘vue’

场景 如图&#xff0c;vue项目的node_modules下载顺利&#xff0c;启动也顺利&#xff0c;但是访问却为空白页面 虽然页面是空白&#xff0c;但是通过浏览器控制台可以看出并非简单的空白&#xff0c;确实有不兼容问题在里面 分析问题 从上图浏览器控制台可以看出&#xff0c…

go|channel源码分析

文章目录 channelhchanmakechanchansendchanrecvcomplieclosechan channel 先看一下源码中的说明 At least one of c.sendq and c.recvq is empty, except for the case of an unbuffered channel with a single goroutine blocked on it for both sending and receiving usin…