ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MCP工作流程全拆解:从一次请求到数据返回AI

MCP工作流程全拆解:从一次请求到数据返回AI MCP最近真是火得不行从Figma到蓝湖从Playwright到IDA凡是叫得上名字的工具都在往MCP上靠。我自己的几个项目也正在从“每个工具单独写集成代码”切换到“MCP一把梭”的模式。今天不聊概念直接拆MCP的工作流程——从一次完整的请求发出到数据返回AI手里中间到底发生了什么。1. MCP的架构本质为什么需要一套“AI的外设协议”1.1 没有MCP之前AI接入工具有多痛苦先回忆一下以前的集成方式。比如我想让AI直接操作Figma切图常见做法是先看Figma开放了哪些REST API然后自己在代码里写鉴权逻辑、封装HTTP请求、处理分页和错误码最后再把这些函数一股脑塞给模型当工具函数。每接一个新工具这套流程就要重来一遍。我接过三个工具之后就受不了了。每个工具的鉴权方式不一样有的用OAuth有的用个人Token有的还要搞签名每个工具的返回格式也不一样有的是JSON有的是XML有的是二进制流。代码里全是if-else来兼容不同平台的差异后期维护简直是噩梦。MCP解决的就是这个“适配器地狱”问题。它把AI和外部工具之间的交互抽成了一个标准协议类似USB-C统一了充电口——不管你是手机、显示器还是硬盘只要支持USB-C插上就能用。MCP也是这样工具方只要实现MCP Server这一层标准接口任何支持MCP的AI客户端如Trae、Cursor、Claude Desktop都能直接调用不需要为每个AI单独写适配代码。1.2 MCP的核心组成Host、Server和协议层MCP的架构其实就三个角色MCP Host运行AI模型的主程序也就是你平时用的AI客户端。它负责理解用户的意图决定要不要调用外部工具以及怎么使用工具返回的结果。MCP Server工具方提供的一个轻量服务把工具的能力“翻译”成MCP标准协议。它内部封装了具体的业务逻辑比如连接Figma API、操作本地文件、控制浏览器等。MCP ProtocolHost和Server之间通信的语言规范基于JSON-RPC 2.0。所有请求、响应、通知都按这个格式走跨语言、跨平台都能互通。用生活化的类比来说Host是大脑Server是手和脚MCP Protocol就是连接大脑和手脚的神经信号标准。大脑不用关心手具体是怎么弯曲的只要发出标准信号手就知道该干什么。这种分离带来的好处很明显——工具方只需要维护一个Server所有AI客户端都能用AI客户端也不用为每个工具写死代码动态发现Server提供的能力就行。这也是为什么现在MCP Server生态爆发得这么快因为边际成本实在太低了。2. MCP工作流程的核心机制一次完整调用是怎么走通的2.1 第一阶段初始化握手建立信任关系MCP的工作流程不是从“调用工具”开始的而是从“建立连接”开始的。就像两个人合作先得互相认识、确认各自的能力边界才能开始干活。当MCP Host启动时如果配置了MCP Server它首先会向Server发送一个initialize请求。这个请求里包含三样东西协议版本号、Host的名称和版本、以及Host支持的能力列表。Server收到后会检查协议版本是否兼容然后返回自己的信息——Server名称、版本、它支持的协议版本、以及Server的能力列表。这个握手的核心意义在于“能力协商”。打个比方Host和Server像是两个初次合作的同事先各自亮出自己的技能树你擅长数据分析我擅长文件操作确认没有重叠和冲突再划分工作边界。协议版本不匹配时双方还能协商降级到共同支持的版本不至于一上来就崩溃。握手完成后双方还要通过notifications/initialized通知确认初始化完成。注意这个通知是单向的Host发给Server不需要Server回复。从这一刻起连接正式进入可工作状态。2.2 第二阶段能力发现动态拉取工具清单连接建立后Host面临一个问题这个Server到底能干什么这就是能力发现阶段的核心工作。Host会发送一个tools/list请求向Server询问工具清单。Server返回一个工具列表每个工具都带着完整的描述信息工具名称、功能说明、输入参数的JSON Schema结构、以及输出格式说明。这些信息非常关键因为Host会把它直接塞给大模型当“使用说明书”。我实际在项目里看到的返回结构大概长这样{ tools: [ { name: get_layer_info, description: 获取Figma图层的详细信息包括位置、尺寸、颜色等属性, inputSchema: { type: object, properties: { file_key: { type: string, description: Figma文件的唯一标识 }, node_id: { type: string, description: 图层节点的ID } }, required: [file_key, node_id] } } ] }这个过程是动态发现的。也就是说Server端后续如果新增了工具Host不需要更新代码下次拉取清单时自然就能拿到新工具。这跟以前写死函数注册表的方式相比灵活太多了。除了工具清单MCP还定义了另外两种能力的发现方式resources/list用于发现可读的资源比如本地文件、数据库记录prompts/list用于发现可复用的提示词模板。这三是MCP协议的三大原语Primitives——Tools对应“能做什么”Resources对应“能读什么”Prompts对应“怎么做得更好”。2.3 第三阶段意图解析与工具选择工具清单拿到后工作流程进入最核心也最“智能”的环节——由大模型决定到底调用哪个工具。这个阶段发生在Host内部不涉及网络通信但对整个流程的成功率影响最大。具体来说用户输入“帮我把Figma文件里所有按钮的尺寸整理成表格”后Host会把这个需求连同工具清单一起交给大模型。模型通过理解每个工具的描述和参数Schema判断出“这个任务需要先调用get_file_structure拿到文件结构再对每个按钮节点调用get_layer_info获取尺寸信息”。这个过程就像人类在工具箱前挑工具一样——你看到一堆螺丝刀、扳手、钳子根据任务需要选择最合适的那个。痛点在于如果Server提供的工具描述写得含糊不清或者参数Schema有歧义模型就容易选错或不知道该怎么填写参数。这也是为什么我在下一篇会专门讲MCP Server开发规范工具描述的质量直接决定了AI的调用成功率。这里有个关键细节tools/call请求发出后Host会对返回结果进行数据提取和格式化然后再次交给大模型进行下一步推理。这意味着一个复杂的任务往往需要多次工具调用才能完成——模型根据第一次结果决定是否还需要第二次、第三次调用逐步逼近最终答案。3. 从Figma切图到本地文件处理MCP的完整实路流程3.1 选型思路我先从一个实际需求开始光讲协议原理不够直观我用一个自己实际做过的场景来演示完整工作流程让AI通过MCP直接读取我的Figma设计稿分析其中的颜色规范然后输出一份样式表文件保存到本地。这个场景看起来简单实际上要跑通两个MCP Server——一个连接Figma的Server负责读取设计稿数据一个本地文件系统的Server负责把结果写到磁盘上。正好把MCP的多种能力都覆盖了。工具选择上Figma侧我用的是Figma官方出的Figma MCP Server基于TypeScript写的支持读取文件结构、图层信息、导出图片等核心能力。本地文件侧我用了modelcontextprotocol/server-filesystem官方提供的标准实现支持读文件、写文件、列目录等操作。3.2 配置与启动MCP Server是怎么跑起来的MCP Server本质上是一个独立的进程Host通过标准输入输出stdio或HTTPSSE流来跟它通信。本地用stdio比较多因为启动简单直接Child Process拉起子进程就行远程部署则用SSE这样多台机器可以共享一个Server。配置方式根据Host不同略有差异。以Trae为例在设置里找到MCP配置入口填一份JSON配置{ mcpServers: { figma: { command: npx, args: [-y, figma-mcp-server], env: { FIGMA_API_KEY: figd_xxxxx } }, filesystem: { command: npx, args: [-y, modelcontextprotocol/server-filesystem, /Users/me/design-tokens] } } }这段配置的含义是启动两个MCP Server一个叫figma通过npx执行figma-mcp-server包一个叫filesystem把/Users/me/design-tokens目录暴露给AI操作。配置好后重启Host它就会自动拉起这两个子进程并在启动日志里显示连接成功。这里的command和args必须写清楚。很多新手卡在这一步npx后面少了-y导致交互式确认卡住进程或者env里的环境变量名跟Server文档不一致导致鉴权失败。这些都是我实际踩过的坑。3.3 工具发现与调用链路一次请求的完整生命线配置好之后我在AI对话里输入分析Figma文件里的颜色规范整理成CSS变量保存到本地。接下来发生的事情就是MCP工作流程最完整的体现。第一步Host把这句话连同之前拉到的工具清单一起交给大模型。模型判断需要先找到Figma文件于是发出一条tools/call请求{ method: tools/call, params: { name: get_projects, arguments: {} } }Server收到请求后通过Figma API获取项目列表返回结果。Host把结果交给模型模型发现项目列表太粗需要进入具体文件于是继续调用get_file_structure传入文件Key。Server再次拉取Figma数据返回文件的完整结构树。模型从结构树中定位到设计规范页面再调用get_layer_info获取具体的颜色节点数据。这一连串看起来像“多轮对话”的过程底层就是多次tools/call请求的循环。每次调用都遵循同一个流程模型决定调用哪个工具 - Host发送JSON-RPC请求 - Server执行具体逻辑 - 返回结果 - 模型分析结果并决定下一步。当颜色数据收集齐后模型开始准备输出CSS变量。它发现需要写文件于是调用filesystem Server的write_file工具把生成的内容写入/Users/me/design-tokens/colors.css。Server响应写入成功模型最后向用户确认“已完成”。整个过程用户感知就是一句自然语言指令底层实际上走了六七次工具调用。MCP把这一切串成了标准化的流程让AI像人一样“看着结果做下一步决策”。3.4 Figma的MCP切图能力实测很多人问Figma MCP能不能直接切图。实测结果是可以的但不是通过“切图”这个工具名而是通过export_image之类的导出能力。你需要先通过get_file_structure定位到要导出的图层节点拿到节点的ID再调用导出接口指定格式和缩放比例Server会返回图片的二进制数据或可下载链接。这个路径比手拖导出要绕但优势在于可以批量操作——让模型遍历所有图标节点一次性导出多张图再自动重命名保存到本地。如果配合本地文件MCP Server整个“从设计稿到前端资源”的流程都可以自动化。3.5 多Server协作时的流程编排更复杂一点的需求会同时用到多个MCP Server比如让AI读Figma设计稿、用Playwright打开浏览器验证设计还原度、再把结果写入表格。这种场景下Host需要管理多路连接并在一次对话中按需调度不同Server的工具。我遇到的一个实际问题当两个Server都返回了内容模型有时会混淆上下文把A Server的数据当作B Server的。排查后发现某些MCP客户端在把结果交给模型时没有标注清楚结果来自哪个Server。处理办法是让Server在返回内容里带上自己的命名空间前缀或者在向模型描述工具时加上明确的边界说明。这也是MCP生态目前尚未完全统一的地方遇到时要知道怎么规避。4. 工作流程中的常见故障连接超时、调用失败与返回异常4.1 Server进程启动失败的排查清单MCP工作流程中最让人抓狂的问题不是调用逻辑不对而是Server根本起不来。根据我自己的经验90%的启动失败都集中在三个原因命令写错、环境变量缺失、网络不通。命令写错多见于npx拼写不对或包名写错解决方式是先在终端手动执行一遍npx命令确认能正常运行再配置到Host里。环境变量缺失则表现为Server启动后直接退出没有输出任何日志——很多Server为了安全会把Token放在环境变量里漏配了它起不来很正常。网络不通则是远程Server的特有问题检查防火墙和代理设置确保Host能访问到Server的SSE地址。这里强烈建议在配置文件中加上transport: stdio之类的显式声明避免Host用默认的HTTP方式连接本地Server导致端口冲突。4.2 调用超时30秒限制与重试策略我在搜索热词里看到一条很典型的错误信息codex apps timed out after 30 seconds这个问题我遇到过不下五次。本质原因是MCP Host通常对单次工具调用设置超时上限常见30秒而某些工具本身执行就很慢——比如大文件搜索、复杂网络请求、批量导出图片。解决办法有三个方向。第一在Server端把耗时操作改成异步任务先快速返回“任务已开始”的状态再通过 notifications 机制推送结果。第二在Host端调大超时时间有些客户端支持在MCP配置里增加timeout参数。第三优化Server内部逻辑比如对Figma这种有API频控的服务加上缓存和批量请求合并把响应时间压到超时阈值以内。如果你是开发MCP Server的人一定要把“响应时间预算”考虑进设计里——慢操作要么切异步要么明确告诉调用方“我需要时间”而不是让客户端干等着超时。4.3 工具调用返回非预期格式MCP协议规定Server返回的数据必须是JSON结构但返回“能解析”和“能直接用”完全是两码事。我遇到最多的情况是Server返回了嵌套很深的JSON模型在解析时出错或者某个字段是null模型不知道怎么处理。遇到这类问题首先在Server端统一返回结构尽量扁平化避免多层嵌套其次如果某个字段可能缺失必须显式返回null并在description里说明“该字段可能为空请处理此情况”最后Host端可以在交给模型前做一层数据清洗把无关字段过滤掉减小模型的理解负担。4.4 权限与安全边界的权衡MCP工作流程中还容易忽略的是权限控制。由于Host会把工具能力完全暴露给模型如果Server没有做权限校验就可能导致模型执行了不该执行的操作——比如文件Server把整个根目录暴露了模型直接删了系统文件。安全实践上有几个底线Server只暴露最小必要权限的目录或资源所有写操作写文件、发送消息必须在Server内部记录日志涉及敏感操作时Server可以在参数里要求一个确认标记由Host引导用户手动确认后再执行。很多生产环境还会在Server层做白名单校验只允许调用预设的工具其他一律拒绝。5. 从Workflow到AgentMCP工作流程的设计演进5.1 单工具调用到多步骤自主决策传统MCP工作流程中“下一个调用什么工具”由模型在每一步自行决定。这种方式灵活但也有代价多步任务容易出错浪费时间在无效调用上而且模型的决策路径不可控。现在更先进的做法是引入“Agent工作流”或“Skill机制”。你可以在MCP Server中定义一种特殊的工具它内部封装了一个完整的子流程——比如“执行Figma设计还原检查”这一个工具内部已经编排了好几个步骤对比设计稿、打开浏览器、逐个检查样式、生成报告。模型只需要调用这一个工具内部流程由Server自己控制。这种设计把“工作流程”从Host端下沉到了Server端好处是决策质量稳定响应变快坏处是丧失了灵活性模型不能介入中间步骤。实际项目中需要平衡——对于确定性强的流程适合封装对于探索性的任务让模型自己编排更合适。5.2 MCP与RAG的分工边界经常有人混淆MCP和RAG的边界。简单区分RAG解决的是“从知识库中检索并注入上下文”的问题MCP解决的是“调用外部工具执行动作”的问题。它们不是竞争关系而是互补关系。实际项目中我常用的组合方式是RAG负责把文档切块、向量化、检索最相关内容MCP负责把检索到的内容写入文件、同步到表格、或者触发其他操作。前者是“怎么想”后者是“怎么做”。把二者串起来才能形成完整的智能体闭环。5.3 工作流的Reminder与Skill融合现在很多MCP客户端还加入了“Skill”机制——把优秀的工作流程沉淀为可复用的提示词或程序模块。比如你成功调试过IDAMCP的过程可以整理成一个Skill包含工具安装、配置、调用示例、常见报错处理。下次遇到类似场景直接加载这个Skill模型就知道完整的操作步骤不用从零摸索。从这个角度看MCP工作流程正在从“点对点调用”向“流程沉淀与复用”演进。MCP Server提供基础能力Skill组织出高级工作流用户在两者之上构建自己的自动化解决方案。以我个人的体验来说MCP这块现在还在早期生态变化非常快但不影响它值得现在投入。先从一个最简单的场景跑通闭环比如让AI通过MCP Server读本地文件、再写回处理结果你会对整个工作流程产生非常直观的理解。之后再去接Figma、接Playwright、接各种外部服务思路都是同一套——理解流程比背工具API有价值得多。
返回列表