MCP简介
MCP(Model Context Protocol,模型上下文协议 ),24年11月初的时候Anthropic发了一篇技术博客,推出了他们的模型上下文协议MCP,介绍了一种规范:应用如何为LLM提供上下文。官网称MCP为AI应用的USB-C端口,提供一种将AI模型连接到不同数据源、工具的标准化方法。
官网:
Introduction - Model Context Protocol
MCP遵循CS(客户端-服务端)架构,一个AI应用可以连接到多个MCP服务器:
- MCP Hosts(MCP 应用):如Claude Desktop、IDE、AI应用等,希望通过MCP访问数据或工具。
- MCP Clients(MCP 客户端):与一对一与服务端进行连接,相当于我们应用中实现数据库交互需要实现的一个客户端。
- MCP Servers(MCP 服务端):基于MCP协议实现特定功能的程序。
- Local Data Sources:本地数据源,提供MCP服务器进行本地访问。
- Remote Services:远端服务,供MCP服务器访问远端访问,例如api的方式。
MCP演变过程
MCP 框架在 AI 代理与数据源和工具的通信方式方面提供了一致性,使整个生态系统更高效、更易于构建,最终创建一个连接性更强、功能更强大的 AI 环境。这一切都始于传统的 LLM,到 RAG,再到 Agent 系统,再到 MCP。
AI两年半:模型上下文协议(MCP)的演进过程,共分为四个阶段:
第一阶段:传统大型语言模型(Traditional LLMs) 在这个阶段,用户直接与大型语言模型(LLM)进行交互。用户提出查询(Query),LLM 返回响应(Response)。这是最基础的交互模式,此阶段最明显的特点是没有使用新信息增强响应的机制,传统LLM(如早期GPT系列)依赖预训练的静态知识库,响应基于模型在训练数据中学到的模式。它们缺乏实时外部数据访问能力,输出受限于训练时的知识范围。
第二阶段:检索增强生成(RAG) 在 RAG 阶段,LLM 的能力得到了增强。除了直接处理用户查询外,LLM 还可以访问外部数据(External Data)。模型可以从文档、数据库和 API 中检索信息,这意味着 LLM 可以根据外部信息来生成更丰富、更准确的响应。
第三阶段:AI Agent 这个阶段引入了 AI Agent 的概念。用户不再直接与单个 LLM 交互,而是与一个编排器 Agent(Orchestrator Agent)交互。这个编排器 Agent 引入协调多个专用代理的 Orchestrator 代理,不同的代理处理特定任务(研究、计划、执行), 由 AI 管理的复杂工作流程,职责分散,通过专门的代理协作提高解决问题的能力,这使得系统能够处理更复杂、需要多步骤的任务。
第四阶段:模型上下文协议(MCP) 这是演进的最终阶段,引入了模型上下文协议(MCP)。用户与 MCP 进行交互,MCP 能够整合 AI Agent 和各种服务(Services),AI 模型与外部工具/服务之间的无缝集成, 改进了整个 AI 生态系统的互作性。
LLM、Prompt、RAG、Agent
LLM 与 LLM指令
大型语言模型(LLM)是一种人工智能技术,利用深度学习方法,通过在大量文本数据上进行自监督学习,理解和生成人类语言。它们可以执行多种自然语言处理任务,如问答、文档摘要、语言翻译和句子完成。
LLM通常采用Transformer神经网络架构,具有自注意力机制,能够并行处理序列数据,显著减少训练时间。它们拥有数百亿级别的参数,训练于庞大数据集如Common Crawl(500亿网页)和维基百科(5700万页面),并能自学语法、语言和知识,无需人工标注数据。
核心联系:指令是LLM的“操作界面”
- 基础LLM(未微调):
-
- 本质是一个“文本补全模型”,根据上下文预测下一个词,无法直接理解指令。
- 例如输入“法国的首都是”,它会补全“巴黎”;但若输入“告诉我法国的首都”,可能生成无关内容。
- 指令微调的LLM(如ChatGPT):
-
- 通过人工标注的指令数据(如“问:法国的首都是?答:巴黎”)进行微调,学会将用户输入解析为指令并执行。
- 此时输入“告诉我法国的首都”,它会明确识别这是问答指令,输出精准答案。
联系:指令是用户与LLM交互的“桥梁”,而指令微调让LLM从“文本生成器”升级为“任务执行者”。
Prompt提示词工程
- 类比:像对助手说“帮我写一封辞职信”或“用Java写一个冒泡排序”,Prompt就是你对AI的“任务指令”。
- 技术角度:Prompt是模型的输入文本,模型通过分析其语义和上下文生成后续内容。
Prompt的常见类型
类型 | 特点 | 示例 |
指令型 | 直接给出任务要求 | “总结这篇文章的核心观点” |
角色扮演型 | 指定模型身份 | “假设你是莎士比亚,写一首十四行诗” |
示例型 | 提供输入-输出样例引导 | “将‘你好’翻译成法语:Bonjour → 现在翻译‘谢谢’” |
链式思考 | 要求分步骤推理 | “解方程2x+3=7,请逐步解释” |
结构化输出 | 指定格式(JSON/表格等) | “列出中国三大城市,格式:{城市:人口}” |
角色扮演
你好,就是我们的提示词,但是现实生活中,当我们和不同人聊天时,即便是完全相同的话,对方也会根据自己的经验给出不同的答案。
所以我们一般会这么会增加一个系统的prompt,作用是为了描述AI的角色与性格
RAG
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与大语言模型(LLM)生成能力结合的技术,旨在提升AI回答的准确性、时效性和可解释性。
RAG解决的核心问题
- LLM的局限性:
-
- 知识固化:传统LLM依赖训练时的静态数据,无法实时获取新知识(如2024年新闻)。
- 幻觉风险:可能生成看似合理但错误的内容。
- 专业领域不足:对细分领域(如最新医学研究)缺乏深度知识。
- RAG的应对:通过动态检索外部知识库,为LLM提供实时、准确的参考信息。
RAG的工作原理
流程分为两步:
- 检索(Retrieval):
-
- 用户提问后,RAG从外部知识库(数据库、文档、网页等)中检索相关片段。
- 例如:提问“2024年诺贝尔奖得主是谁?” → 检索最新新闻或官网数据。
- 生成(Generation):
-
- 将检索到的信息与用户问题一起输入LLM,生成最终回答。
- 例如:模型结合检索到的“2024年诺贝尔化学奖得主:XXX”和问题,生成完整回复。
RAG的小demo
https://cloud.dify.ai/apps
AI Agent
AI Agent(人工智能代理)是指一种能够自主执行任务、与环境交互并做出决策的AI系统。例如,聊天机器人(如我,Grok)、虚拟助手或自动化工作流中的AI工具都可称为AI Agent。这些代理通常基于机器学习或大语言模型,能够处理自然语言、分析数据或执行特定任务。
- 大语言模型是AI Agent的核心组件之一:
- 许多AI Agent以大语言模型为基础,利用其自然语言处理能力来理解用户输入、生成回复或执行任务。例如,我(Grok)是一个AI Agent,基于xAI的大语言模型技术。
- LLM提供语义理解、对话生成和知识推理能力,使AI Agent能够与人类进行智能交互。
- AI Agent利用LLM实现复杂功能:
- AI Agent通常结合LLM与其他技术(如强化学习、规则引擎或外部工具)来完成特定任务,比如搜索、规划、自动化工作流等。
- 例如,LLM可以帮助AI Agent理解用户意图(如“帮我订机票”),并通过调用外部API或工具完成任务。
Function Calling
举个例子,假设我想让AI帮我打开并且管理电脑文件
与用户之间的交互,假设说我要让AI帮我找原神的安装目录
此时AI->解析用户的User prompt生成system prompt函数去调用ai agent,ai agent将调用结果返回给ai,ai再将结果进行语言组织返回给我们用户。
存在的问题
有些些Tool的功能其实挺通用的,比如说一个浏览网页的工具,可能多个Agent都需要,那我总不能在每个Agent面都拷贝一份相同的代码吧,太麻烦了,也不优雅,于是大家想到了一个办法
引出MCP
MCP模型上下文协议
MCP的几种通讯模式
Stdio(标准输入输出)
- 描述:通过操作系统的标准输入(stdin)和标准输出(stdout)管道进行进程间通信(IPC)。客户端与服务器以JSON-RPC 2.0格式交换消息,消息以换行符(\n)分隔。
- 适用场景:主要用于本地通信,适合客户端和服务器运行在同一台机器上的场景,例如本地命令行工具、开发环境或调试。
- 特点:
-
- 优点:实现简单,低延迟,无需网络配置,适合本地批处理任务或简单工具调用。
- 缺点:仅限于本地进程通信,不支持分布式部署或远程访问,同步阻塞式通信,发送方需等待接收方处理完毕。
SSE(Server-Sent Events,服务器发送事件)
- 特点:基于 HTTP 的单向通信协议,服务器可主动向客户端推送数据。
-
- 使用长连接(Long Polling),通过事件流(
text/event-stream
)传输数据。 - 轻量级,适合实时性要求较高的场景(如状态更新、日志流)。
- 使用长连接(Long Polling),通过事件流(
- 适用场景:
-
- Web 应用中服务器向浏览器实时推送数据(如股票行情、聊天消息)。
- Agent 作为服务端向监控端推送连续状态(如训练进度、传感器数据)。
Streamable HTTP(可流式传输的HTTP)
- 特点:
-
- 基于 HTTP 的流式数据传输,支持分块编码(
Transfer-Encoding: chunked
)。 - 允许逐步发送/接收数据,无需等待完整响应(如大文件传输、AI 生成的逐步输出)。
- 双向或单向流式通信,兼容 RESTful 接口。
- 基于 HTTP 的流式数据传输,支持分块编码(
- 适用场景:
-
- 大模型逐词生成文本(如 ChatGPT 的流式回复)。
- 代理间传输大型文件或实时流数据(如视频流分析)。
Spring AI
项目要求:选JDK> 17
依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.6</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webflux</artifactId><version>${spring-ai.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency></dependencies>
Tools注册
@Configuration
public class ToolConfig {@Resourceprivate ApplicationContext applicationContext;@Beanpublic ToolCallbackProvider toolCallbackProvider() {// 获取所有工具Bean(假设都在tools包下且有ToolBean注解)Map<String, Object> toolBeans = applicationContext.getBeansWithAnnotation(ToolBean.class);return MethodToolCallbackProvider.builder().toolObjects(toolBeans.values().toArray()).build();}}
函数调用
package com.springai.mcp.jdbc;import com.springai.mcp.annotation.ToolBean;
import jakarta.annotation.Resource;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;@Component
@ToolBean
public class DBTool {@Resourceprivate JdbcTemplate jdbcTemplate;private final String sql = "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'hwsj_activity'";private final String schemaSql = "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS " +"WHERE TABLE_SCHEMA = 'hwsj_activity' AND TABLE_NAME = ?";@Tool(name = "getTables", description = "获取所有可用的表名")public List<String> getTables() {List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);return maps.stream().map(map -> {String tableName = String.valueOf(map.get("TABLE_NAME"));String tableComment = String.valueOf(map.get("TABLE_COMMENT"));return tableName + " (" + tableComment + ")";}).collect(Collectors.toList());}@Tool(name = "getTableSchema", description = "根据表名获取Schema")public String getTableSchema(@ToolParam(description = "表名") List<String> tables) {return tables.stream().filter(t -> !t.isBlank()).map(tableName -> {List<Map<String, Object>> columns = jdbcTemplate.queryForList(schemaSql, tableName);String tablePrompt = columns.stream().map(map -> {String name = String.valueOf(map.get("COLUMN_NAME"));String type = String.valueOf(map.get("DATA_TYPE"));String comment = String.valueOf(map.get("COLUMN_COMMENT"));return String.format("%s (%s) - %s", name, type, comment);}).collect(Collectors.joining(", \n"));return String.format("Table: %s (%s)\n", tableName, tablePrompt);}).collect(Collectors.joining("\n"));}@Tool(name = "runSql", description = "执行SQL查询结果")public List<Map<String, Object>> runSql(@ToolParam(description = "sql") String sql) {if (sql.contains("DELETE") || sql.contains("UPDATE") || sql.contains("INSERT")) {throw new RuntimeException("执行SQL仅限于查询语句!");}return jdbcTemplate.queryForList(sql);}
}
MCP调试
https://github.com/modelcontextprotocol/inspector介绍
本地启动
访问
常见的MCP 客户端介绍
Claude、Cline、Cursor,Trae等,这边介绍下trae,crusor有时候会经常抽风
MCP通用配置格式
{"mcpServers": {"spring-ai-mysql": {"command": "java","args": ["-jar","/Users/taqu/IdeaProjects/spring-ai-mcp-demo/target/mcp-0.0.1-SNAPSHOT.jar"]}}
}
mcpServers服务器集合
spring-ai-mysql:mcp服务名称
command:服务器启动命令
args:启动参数
实现效果
讨论环节
参考文档
下一代企业IT架构:MCP中台和软件的进化_mcp架构-CSDN博客
10分钟讲清楚 Prompt, Agent, MCP 是什么_哔哩哔哩_bilibili
https://zhuanlan.zhihu.com/p/1903594795324118469