掘金 人工智能 前天 14:43
MCP协议技术原理拆解:AI如何与MCP实现智能协作
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入解析MCP(Metaverse Content Protocol)的底层原理,通过回顾MCP的快速入门和实践,强调了理解底层原理对于开发者和用户的价值。文章详细阐述了MCP的架构,包括MCP Host、MCP Server和MCP Client之间的关系,并通过Cherry-studio的开源代码分析了工具注册和调用流程。通过时序图和AI IDE的辅助,揭示了大语言模型(LLM)如何发现可用工具以及何时调用这些工具,并为MCP Server开发者和用户提供了重要的启示。

⚙️ MCP遵循Server-Client架构模式,其中MCP Host类似于Cursor/Claude/Cherry-stuido等AI工具,通过MCP访问外部工具或数据;MCP Server是人为编写的应用程序,将tools/prompt/resources注册到MCP Server中;MCP Client与MCP Server是1:1的连接关系,供AI工具获取所有MCP Server的工具列表。

🧩 大语言模型LLM通过两种方式发现可用工具:一是通过系统提示词(System Prompt),将工具信息添加到系统提示词中,包含工具的详细信息,格式化为XML标签结构;二是通过函数调用API,不同AI提供商有不同的工具格式转换函数,工具信息直接通过API调用参数传递给LLM。

🔑 LLM基于其训练和推理能力自行决定是否调用工具。开发者需要提供清晰的工具描述,以便LLM正确理解和调用。同时,MCP Server应输出清晰友好的错误信息,帮助用户理解和解决问题。用户应控制MCP工具的数量,明确请求,以便LLM能够清晰地理解需求并调用合适的工具。

💡 通过分析Cherry-studio调用MCP Server的流程,可以了解到LLM通过系统提示词或函数调用API来获取工具信息,并根据用户需求和工具信息自行决定是否调用工具。开发者应关注工具描述的清晰度和错误信息的友好性,用户应控制工具数量,明确请求,以便更好地利用MCP。

MCP原理解析

回顾

回顾前面两篇文章:

我们通过实践的方式,从浅入深的方式一步步与MCP初相识、学会使用MCP Server、同时也跟着一起编写了第一个MCP Server,到这里你应该对MCP有一定的感知了。

通过实践->反馈这样的正向循环的方式,可以帮助我们快速掌握一门新的技术,这也是学习一个新技术最快的方式之一。如果你还没有跟着一起实践过,那强烈推荐你先从前面两篇开始,然后再来内化MCP的底层原理。

为什么要深入了解MCP的底层原理?上一篇中,我们已经学会了如何开发一个MCP Server,如果你是作为一个开发者,那么了解底层原理可以帮助我们更加有效地开发MCP Server,然后将MCP Server对接到大模型系统中,让大模型正确地调用,这一点非常重要。如果你是非开发者,那么掌握MCP的底层原理,可以让你最大化AI工具以及MCP的价值,当使用异常时,你可以有一定的判断和解决问题的能力。

阅读本篇文章,你将会:

MCP架构解析

大家还记不记得在5分钟快速入门MCP这篇文章里面放过这张图,当时还留了一个小疑问,就是这里的MCP Hosts和MCP Clients是什么关系?

这里使用官网的图就很可以更加清晰地了解它们的关系

从如上这张图可以知道

MCP是遵循Server-Client的架构模式

接下来我们主要围绕两个问题来进行探索底层原理:

1、大语言模型LLM是如何知道有哪些工具可用的?

2、大语言模型LLM怎么知道什么时候调用这些工具的?

MCP源码分析

这里为啥拿cherry-studio来做演示,就是因为cherry-studio的代码都是开源,方便我们用来学习和理解MCP Server调用的深层次原理

下载cherry-studio开源代码

$ git clone https://github.com/CherryHQ/cherry-studio.git$ cd cherry-studio## 使用cursor或者trae打开源代码进行分析$ cursor . # or trae .

这里在使用AI IDE分析代码的时候,发现这里其实可以分为两个流程来进行分析,分别是注册工具和调用工具流程

提示词prompt参考

请阅读这个项目的代码,并梳理出cherryStudio这个AI客户端是如何调用mcp server的工具整个流程,使用markdown mermaid画出这个时序图,请注意不需要过于细节的流程展示,抽象出来主要的组件调用即可    拆分为两个时序图:   1、mcp server 工具注册时序图:大语言模型LLM是如何知道有哪些工具可用的  2、mcp server 工具调用时序图:大语言模型LLM怎么知道什么时候调用这些工具的

然后你可以沿着生成的初版本在AI IDE里面进行提问,得到最终的流程时序图

MCP Server工具注册流程

sequenceDiagram    title MCP Server 工具注册时序图        participant Client as CherryStudio客户端    participant AIProvider as AI Provider    participant MCPService as MCPService    participant MCPClient as MCP Client(SDK)    participant Server as MCP Server    participant Store as 状态管理Store    participant LLM as 大语言模型(LLM)        Client->>MCPService: 初始化MCP服务    MCPService->>MCPClient: 初始化MCP Client(initClient)        alt 内存型服务器        MCPService->>Server: createInMemoryMCPServer        MCPClient->>Server: InMemoryTransport.createLinkedPair        Server-->>MCPClient: 建立内存连接    else 外部服务器(HTTP/SSE)        MCPClient->>Server: 使用SSE/HTTP建立连接        Server-->>MCPClient: 返回连接状态    else 外部进程(STDIO)        MCPClient->>Server: 使用StdioClientTransport创建进程        Server-->>MCPClient: 进程启动成功    end        MCPClient->>Server: listTools请求    Server-->>MCPClient: 返回可用工具列表    MCPClient-->>MCPService: 工具列表返回        MCPService->>Store: 存储工具信息(addMCPServer)        Client->>AIProvider: 准备发送消息给LLM    Client->>Store: 获取可用的MCP工具    Store-->>Client: 返回MCP工具列表

MCP Server工具调用流程

sequenceDiagram    title MCP Server 工具调用时序图        participant User as 用户    participant Client as CherryStudio客户端    participant AIProvider as AI Provider    participant LLM as 大语言模型(LLM)    participant Handler as 工具调用处理器    participant MCPService as MCPService    participant MCPClient as MCP Client(SDK)    participant Server as MCP Server        User->>Client: 发送带有工具需求的请求    Client->>AIProvider: 转发用户请求及可用工具定义        Note over AIProvider: 基于工具数量和模型能力决定<br/>如何向LLM传递工具信息        alt 工具数量超过阈值或模型不支持原生函数调用        AIProvider->>AIProvider: 调用buildSystemPrompt<br/>将工具描述添加到系统提示词        Note over AIProvider: 包含工具名称、描述、<br/>参数结构和使用示例    else 模型支持原生函数调用API        AIProvider->>AIProvider: 将工具转换为模型专用格式<br/>(OpenAI/Claude/Gemini等)    end        AIProvider->>LLM: 准备请求,包含工具定义或系统提示词        LLM->>LLM: 1. 理解用户需求<br/>2. 参考系统提示词中的工具信息<br/>3. 决定是否调用工具        alt LLM决定调用工具        alt 通过系统提示词调用工具            LLM-->>AIProvider: 返回带有工具调用XML格式的文本<br/><tool_use>...<arguments>...</arguments></tool_use>            AIProvider->>Handler: processToolUses处理XML格式工具调用            Handler->>Handler: parseToolUse解析工具调用参数        else 通过函数调用API调用工具            LLM-->>AIProvider: 返回标准函数调用请求            AIProvider->>Handler: processToolCalls处理            Handler->>Handler: 解析工具调用参数        end                Handler->>Handler: 准备MCPToolResponse对象        Handler->>MCPService: callMCPTool调用        MCPService->>MCPClient: 执行callTool        MCPClient->>Server: 发送工具调用请求        Server->>Server: 执行工具逻辑        Server-->>MCPClient: 返回工具执行结果        MCPClient-->>MCPService: 返回执行结果        MCPService-->>Handler: 返回MCPCallToolResponse        Handler->>Handler: 转换工具调用结果(mcpToolCallResponseToMessage)        Handler->>AIProvider: 发送工具调用结果                alt 文本格式工具调用            AIProvider->>LLM: 以<tool_use_result>格式发送工具结果        else 函数API格式工具调用            AIProvider->>LLM: 以函数返回值格式发送工具结果        end                LLM->>LLM: 根据工具调用结果生成回复        LLM-->>AIProvider: 返回最终回复        AIProvider-->>Client: 转发LLM回复    else LLM不需要调用工具        LLM-->>AIProvider: 直接返回生成的回复        AIProvider-->>Client: 转发LLM回复    end        Client-->>User: 显示最终回复

通过如上的时序图,同时向AI IDE提问,我们大致可以知道:

1、大语言模型LLM是如何知道有哪些工具可用的?

LLM通过两种主要方式了解可用工具:

   <tool>     <n>工具ID</n>     <description>工具描述</description>     <arguments>       参数结构     </arguments>   </tool>
// OpenAI API请求示例 - 包含工具定义{  "model": "gpt-4o",  "messages": [    {      "role": "system",      "content": "你是一个有用的助手。"    },    {      "role": "user",      "content": "我想查找北京今天的天气情况"    }  ],  "tools": [    {      "type": "function",      "function": {        "name": "get_weather",        "description": "获取指定城市的天气信息",        "parameters": {          "type": "object",          "properties": {            "location": {              "type": "string",              "description": "城市名称,如北京、上海等"            },            "date": {              "type": "string",              "description": "日期,格式为YYYY-MM-DD。如果不提供,默认为今天"            }          },          "required": ["location"]        }      }    },    {      "type": "function",      "function": {        "name": "search_nearby",        "description": "搜索指定位置附近的设施或服务",        "parameters": {          "type": "object",          "properties": {            "location": {              "type": "string",              "description": "位置名称"            },            "service": {              "type": "string",              "description": "要搜索的服务或设施,如餐厅、医院、酒店等"            },            "radius": {              "type": "number",              "description": "搜索半径,单位为公里"            }          },          "required": ["location", "service"]        }      }    }  ],  "temperature": 0.7,  "max_tokens": 1000}

2、大语言模型LLM怎么知道什么时候调用这些工具的?

工作流程图中明确指出LLM会:

了解这两个问题之后,对我们又有什么启示呢?我们可以基于这个时序图,进一步在AI IDE里面进行提问

作为一名mcp server开发者,基于 @workflow.md 这个时序图,对我们开发mcp server有什么启示吗?

可以看到最核心的两点启示:

如果是非mcp server开发者,对我们又有什么启示?可以进一步提问:

作为一名使用MCP的用户,基于 @workflow.md 这个时序图,对我们用户使用mcp server有什么启示吗?

总的来说,对我们使用MCP的用户来说:

今天这篇文章就分享到这里啦,魔法的乐趣在于寻找的过程✨✨希望大家可以借助AI IDE边学边理解MCP的底层原理和一些关键要点:)

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

MCP 底层原理 LLM AI工具 Cherry-studio
相关文章