4.1 MCP 客户端开发流程
在第 3 章我们通过 3 个实际的案例演示了 MCP 服务器开发的完整流程。用户在大模型客户端配置后即可使用我们开发的 MCP 服务器。
在第 2 章讲解 MCP 架构时,我们了解到 MCP 定义了主机、客户端、服务器三个角色。MCP 客户端是“寄生”在主机中的子进程,用于与 MCP 服务器通信。而主机也就是我们常说的大模型客户端,主要用于与大模型交互。
为了跟 MCP 服务器开发对应,本章的主题叫做 MCP 客户端开发,实际讲述的是大模型客户端的开发流程。在本章后面的内容,统一使用“MCP 客户端”这一表述,不再额外说明。
本章计划通过两个实际的案例,演示 MCP 客户端开发的完整流程。第一个案例,开发一个 AI 对话客户端,读取本地配置的 MCP 服务器列表,由大模型调度工具增强生成;第二个案例,开发一个 AI 搜索智能体,通过程序预置的 MCP 服务器配置,用特定的工具列表编排工作流,实现 RAG(Retrieval-Augmented Generation,检索增强生成)。
MCP 客户端一般为大型项目,不同类型的项目有不同的技术栈。比如开发桌面对话类项目,为了跨端使用,我们可能会选择 react-native、flutter、electron、tauri 等技术栈;而开发智能体类项目,一般是 web 形态为主,我们可能会选择 nextjs、nuxtjs 等技术栈。鉴于篇幅有限,本章的两个案例,都只聚焦讲解服务端实现的核心逻辑,对客户端 / UI 部分不展开讲解。
在讲解这两个案例之前,我们先来梳理一下 MCP 客户端开发的基本流程,主要讲解核心步骤和实现思路,具体实现在后面的案例中再详细讲解。
4.1.1 核心步骤
- 安装 MCP 客户端 SDK
在创建 MCP 客户端项目之后,需要安装对应编程语言的 MCP 客户端 SDK,主要用于创建 MCP 客户端实例,连接 MCP 服务器,发送获取工具列表、调用工具等请求。
以 Typescript 开发为例,安装对应的 MCP 客户端 SDK 命令如下:
npm install @modelcontextprotocol/sdk- 读取 MCP 服务器列表
MCP 客户端需要从配置的 MCP 服务器列表中获取可用的工具,发送给大模型调度。因此在开发 MCP 客户端时,需要先实现读取 MCP 服务器列表的逻辑。不同类型的 MCP 客户端,MCP 服务器列表的配置方式有所不同。
桌面版本的对话类 MCP 客户端,MCP 服务器列表一般配置在本地,由用户根据自身需求填入 MCP 服务器配置。例如在 Mac 操作系统下,Claude 桌面版的 MCP 服务器配置文件为 ~/Library/Application Support/Claude/claude_desktop_config.json,Cursor 编辑器的 MCP 服务器配置文件为 ~/.cursor/mcp.json。
而在开发智能体类的 MCP 客户端时,MCP 服务器列表一般配置在项目文件中,由开发者根据业务需求预置 MCP 服务器配置。
- 从 MCP 服务器列表中选择工具
MCP 客户端获取到 MCP 服务器列表之后,需要通过连接 MCP 服务器以获取其内部定义的工具列表。此处需要用到第 1 步的 MCP 客户端 SDK,创建 MCP 客户端实例,连接 MCP 服务器,并发送 listTools 请求,获得工具列表。
- 发送工具列表给大模型调度
MCP 客户端从配置的 MCP 服务器列表中获取到全部的工具之后,可以过滤掉部分工具,选择其中的部分工具发送给大模型,通过提示词告知大模型挑选合适的工具并返回调用参数。
- 解析大模型返回的工具调用信息
MCP 客户端在上一步通过提示词请求大模型挑选工具,获得大模型的回复。大模型的回复内容是纯文本的,用特殊标签包裹工具调用信息。此步骤中 MCP 客户端需要从大模型的回复内容中提取工具调用信息。
- 调用工具
MCP 客户端根据上一步提取的工具调用信息,对特定的 MCP 服务器发送 callTool 请求,获得工具调用结果。
- 总结输出或继续工具调用循环
MCP 客户端带上上一步工具调用的结果,继续步骤 4,进入工具调用循环。由大模型判断继续调用工具,还是输出最终回复。如果大模型回复内容中不再包含工具调用信息,或者循环已达设置的最大次数,则由 MCP 客户端结束工具调用循环,展示最终回复结果。
用一个序列图来表示上述流程,如图 4-1 所示:
图 4-1 MCP 客户端交互流程
接下来,我们就通过实际的案例来讲解以上流程每个步骤的具体实现。