MCP模型上下文协议以及交互流程

1. MCP 是什么

  • 全称:Model Context Protocol

  • 定位:让大语言模型(LLM)能在“上下文”之外,按统一格式访问外部数据、调用插件、持久化状态。

  • 动机:以前每家框架(LangChain、LlamaIndex 等)都有自己的“工具调用/记忆”规范,很难互通;MCP 就是做一个“HTTP/JSON-RPC”风格的公共协议。

2. 结构 & 概念

MCP 定义了几类对象/消息:

名称作用
resources模型可直接访问的数据(文件、数据库、API、消息流)
prompts可复用的 prompt 模板,外部系统可以动态注入
tools可调用的外部函数或 API,带参数 schema
sessions一次上下文交互(可包含用户消息、模型回复、工具调用)
capabilities服务端声明自己支持哪些功能(资源、工具、订阅、推送等)

协议本质是 JSON-RPC 2.0 风格(双向流),模型和外部“上下文服务器”之间通过 WebSocket 或 HTTP(SSE/gRPC)传递消息。

3. 消息交互流程

角色与数据流(逐步)

  1. 用户 → MCP客户端

    • 用户的输入(语音、文字等)先进到你自己写的“前端/适配层”,这个层里包含 MCP 客户端。

    • MCP 客户端在收到用户输入前,已经向 MCP 服务器拿过一遍 tools/resources/prompts 列表,存着最新的能力元数据。

  2. MCP客户端 → LLM

    • MCP 客户端把用户输入 + 工具/资源描述(以及任何 session 上下文)拼成一份上下文,一起发给 LLM。

    • 对于支持 function-calling 的模型,这一步就是把 functions 参数传进去;对于不支持的模型,就把工具描述写在 system prompt 里。

  3. LLM 推理

    • 如果它觉得自己能直接回答,就直接返回自然语言。

    • 如果它觉得需要外部数据/工具,就按你提供的工具描述生成一条 工具调用请求tool_call 或 JSON)。

  4. LLM → MCP客户端

    • 这个“工具调用消息”不会直接给用户,模型返回给 MCP 客户端。

  5. MCP客户端 → MCP服务器

    • MCP 客户端检查工具名和参数是否合法,然后调用 MCP 服务器的 tools/callresources/read 等 API。

  6. MCP服务器 执行

    • 调后端 API、查数据库、读文件,返回 JSON 结果。

  7. MCP客户端 → LLM(tool_result)

    • MCP 客户端把结果包成 “tool_result” 消息再发回给 LLM,让模型继续推理生成自然语言。

  8. LLM → MCP客户端 → 用户

    • LLM 生成最终的对话文本。

    • MCP 客户端把这个文本转发回给用户界面/设备。

sequenceDiagramparticipant User as 用户participant MCPClient as MCP客户端(含前端)participant LLM as AI(LLM)participant MCPServer as MCP服务器User->>MCPClient: 用户输入MCPClient->>LLM: 用户输入 + 工具/资源描述LLM-->>MCPClient: ①直接回答 或 ②tool_call JSONalt 直接回答MCPClient->>User: 转发 LLM 的自然语言回答else tool_callMCPClient->>MCPServer: 调用工具/资源MCPServer-->>MCPClient: 工具结果MCPClient->>LLM: tool_resultLLM-->>MCPClient: 最终自然语言回答MCPClient->>User: 转发回答end

关键点(回答你的问题)

  • 最后一句话(自然语言回答)总是由 LLM 生成的,因为只有模型能把外部数据变成人能读懂的话。

  • 真正“发回用户”的动作通常由 MCP 客户端来做,因为客户端是“会话的中间人”,它既能调模型、又能调 MCP 服务器、又能跟你的前端交互。

  • 也就是说:

    • 生成者:LLM

    • 发送者:MCP 客户端(它把 LLM 的回答发给用户)

5. 协议格式(简例)

列出工具

{"jsonrpc": "2.0","id": "1","method": "tools/list"
}

响应

{"jsonrpc": "2.0","id": "1","result": {"tools": [{"name": "search_contacts","description": "Search contacts by name","input_schema": {"type": "object","properties": {"query": {"type": "string"}},"required": ["query"]}}]}
}

调用工具

{"jsonrpc": "2.0","id": "2","method": "tools/call","params": {"name": "search_contacts","arguments": {"query": "Alice"}}
}

6. 应用场景

  • 统一模型插件生态(比如 OpenAI Assistant、Claude Workbench、LangChain agent 都能用同一协议)。

  • 本地/企业内部数据(CRM、ERP、数据库、知识库)接入模型。

  • 安全地持久化模型“记忆”。

7.MCP 的标准工作方式

角色作用
AI(LLM)只做推理:理解用户话 → 生成自然语言或工具调用请求(JSON)。它本身不知道“天气 API 在哪”。
MCP 客户端嵌在 AI 运行环境里的适配层。负责:- 向 MCP Server 拉取工具列表、资源列表- 把 LLM 生成的“工具调用 JSON”包装成协议请求发出去- 把响应结果再送回给 LLM。
MCP 服务器工具/资源的实际托管地,负责执行真正的 API/数据库操作,并按 MCP 协议返回结果。

时序(以查天气为例)

sequenceDiagram
participant User as 用户
participant AI as LLM
participant MCPClient as MCP客户端
participant MCPServer as MCP服务器

    User->>AI: “帮我查一下北京的天气”
Note right of AI: LLM推理<br>发现自己不能回答
AI->>MCPClient: 生成工具调用JSON {name:"get_weather",args:{"city":"北京"}}
MCPClient->>MCPServer: tools/call(get_weather,{"city":"北京"})
MCPServer-->>MCPClient: {"result":"晴 28℃"}
MCPClient-->>AI: 返回工具结果
AI->>User: “北京今天晴,28℃”

LLM 的“工具调用消息”是什么样子

在 MCP/Assistants 框架里,模型输出的其实是一个 结构化消息,类似这样:

{"type": "tool_call","name": "get_weather","arguments": {"city": "北京"}
}

这个消息不会直接给用户,而是交给 MCP 客户端去执行。

然后客户端执行工具 → 把结果打包成一条 “tool_result” 消息送回模型;模型再在上下文里用这个结果生成给用户的自然语言回复。


MCP调用流程可以简化为一句话:

LLM 只“决定要不要用哪个工具 + 怎么调用”,真正执行工具和返回结果都是 MCP 客户端+服务器干的

流程是这样的 llm可以请求的除了工具 还可以请求资源、提示词等其他东西

所以标准交互模式:

  1. LLM → MCP客户端:list_tools / list_resources / list_prompts

  2. MCP客户端 → MCP服务器:按 JSON-RPC 发请求

  3. MCP服务器 → MCP客户端:返回可用项列表

  4. LLM 决定用哪个 → 发起具体调用

  5. MCP服务器执行 → 把结果返回给 LLM

总的来说,MCP 给模型开放了“资源/提示词/工具/上下文”等一整套统一接口,模型并不需要知道背后是数据库、API 还是文件,只管按 MCP 协议去“列/读/调”。用户只看见 MCP 客户端,模型负责生成回答或工具调用,客户端负责把所有东西串起来并最终把模型回答送回用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922129.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQLTransactionRollbackException

问题描述mysql部署1主3从&#xff0c;昨天发现主库有大量报警错误&#xff1a;Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ; Deadlock found when trying to get lock; …

Redis环境搭建指南:Windows/Linux/Docker多场景安装与配置

Redis环境搭建指南&#xff1a;Windows/Linux/Docker多场景安装与配置 1. Redis安装方式概览 1.1 安装方式对比 安装方式适用场景优点缺点难度Windows直接安装开发调试安装简单&#xff0c;Windows兼容好性能不如Linux&#xff0c;生产不推荐⭐Linux源码编译生产环境性能最佳…

leetcode.80删除有序数组中的重复项2

题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。…

运动卡新手入门及常见问题处理

1.新手入门1.1 插卡打开包装&#xff0c;拿出PCI板卡&#xff0c;如下图&#xff1a;打开电脑机箱盖&#xff0c;找到PCI插槽&#xff0c;如下图&#xff08;红色框部分是PCI槽&#xff0c;有些主板上PCI槽是白色或其他颜色&#xff09;&#xff1a;插入板卡&#xff0c;如下图…

PRINCE2与PMP项目管理体系对比

在全球范围内&#xff0c;PRINCE2与PMP是两大最具影响力的项目管理体系。PRINCE2注重流程和治理结构&#xff0c;强调“控制”与“规范”&#xff1b;而PMP基于PMBOK指南&#xff0c;强调知识体系和方法论的全面性&#xff0c;更关注“工具”与“实践”。 不同体系的侧重点&…

在UniApp跨平台开发中实现相机自定义滤镜的链式处理架构

以下是进阶方案&#xff1a;架构核心设计分层结构$$Pipeline Capture \otimes Filter_1 \otimes Filter_2 \otimes \cdots \otimes Filter_n \otimes Render$$ 其中&#xff1a;$\otimes$ 表示链式处理操作符$Capture$ 为原始图像采集层$Filter_n$ 为可插拔滤镜单元$Render$ 为…

Mark5 穿越机电调深度解析:设计、选型、控制与实战(下)

TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+​ break;​ case 3:​ // U - 导通,V - 导通,W + 导通​ TIM_SetCompare1 (TIM1, T0); // U-​ TIM_SetCompare2 (TIM1, T0); // V-​ TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+​ break;​ case 4:​ // U - 导通…

背包问题从入门到入土

我在这里介绍4种常见的背包问题&#xff0c;这里我想按易 --> 难程度从01背包&#xff0c;完全背包&#xff0c;分组背包&#xff0c;多重背包的顺序介绍。&#xff08;封面附在最后&#xff09;一&#xff0c;01背包问题&#xff08;后面三个背包问题的基础&#xff09;01背…

Leetcode 18 java

​​​​​1​​​​​​​141. 环形链表1 题目 ​​​​​1​​​​​​​141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表…

Linux 正则表达式详解(基础 + 扩展 + 实操)

Linux 正则表达式详解&#xff08;基础 扩展 实操&#xff09; 正则表达式&#xff08;Regular Expression&#xff0c;简称 RE&#xff09;是 Linux 文本处理的核心工具&#xff0c;用于定义字符匹配模式&#xff0c;配合 grep、sed、awk 等工具可实现文本过滤、查找、替换等…

Json-rpc通信项目(基于C++ Jsoncpp muduo库)

一、介绍RPC RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;一种通过网络从远程计算器上请求服务&#xff0c;而不需要了解底层网络通信细节&#xff0c;RPC可以使用多种网络协议进行通信&#xff0c;并且在TCP/IP网络四层模型中跨越了传输层和应…

RL【9】:Policy Gradient

系列文章目录 Fundamental Tools RL【1】&#xff1a;Basic Concepts RL【2】&#xff1a;Bellman Equation RL【3】&#xff1a;Bellman Optimality Equation Algorithm RL【4】&#xff1a;Value Iteration and Policy Iteration RL【5】&#xff1a;Monte Carlo Learnin…

Redis是什么?一篇讲透它的定位、特点与应用场景

Redis是什么&#xff1f;一篇讲透它的定位、特点与应用场景 1. Redis的定义与核心概念 1.1 什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09; 是一个开源的、基于内存的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息代理。Redis由…

一款免费开源轻量的漏洞情报系统 | 漏洞情报包含:组件漏洞 + 软件漏洞 + 系统漏洞

工具介绍 bug_search一款免费开源轻量的漏洞情报系统 基于python3 Amis2.9 开发&#xff0c;仅依赖Flask,requests&#xff0c;无需数据库&#xff0c;Amis是百度开源的低代码前端框架漏洞情报包含&#xff1a;组件漏洞 软件漏洞 系统漏洞 增加邮件发送消息报警功能增加钉钉…

详解在Windows系统中生成ssl证书,实现nginx配置https的方法

目录一、下载安装OpenSSL二、证书生成三、修改nginx配置总结Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;在进行web项目开发时&#xff0c;大多都是使用nginx对外提供web服务。HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure [5]&#xf…

AI视觉算法中的OpenCV API (二)

视频写入 (FourCC, VideoWriter)​ 1. VideoWriter_fourcc - 视频编码器四字符代码 # OpenCV 3.x, 4.x fourcc cv2.VideoWriter_fourcc(M,J,P,G)fourcc cv2.VideoWriter_fourcc(*H264)fourcc cv2.VideoWriter_fourcc(*MJPG) ​FourCC​&#xff1a; 代表 ​Four ​Charac…

分享| 2025年版AIGC数字人实验室解决方案教学资源解析

AIGC数字人实验室解决方案构建了涵盖基础层、平台环境层与资源层的多层次教学架构&#xff0c;依托150平方米的实体空间与60人并行授课的规模化支持&#xff0c;为学生提供了技术实践与创新的高效平台。其教学资源体系覆盖AIGC文本生成、图像生成、数字人应用与智能体开发四大核…

内存大(巨)页

一、大&#xff08;巨&#xff09;页 大&#xff08;巨&#xff09;页&#xff0c;很好理解&#xff0c;就是的大的页。说这个大页前&#xff0c;得先把计算机中内存的管理简单说明一下&#xff0c;否则可能对于一些新手或者把操作系统中内存管理的方法的开发者不太友好。最早的…

langgraph astream使用详解

langgraph中graph的astream&#xff08;stream&#xff09;方法分别实现异步&#xff08;同步&#xff09;流式应答&#xff0c;在langgraph-api服务也是核心方法&#xff0c;实现与前端的对接&#xff0c;必须要把这个方法弄明白。该方法中最重要的参数是stream_mode&#xff…

【C++】模板进阶:非类型参数、模板特化与分离编译

目录 1. 非类型模板参数 2. 模板的特化 3. 分离编译 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板…