前言
上一篇主要讲MCP服务端的实现。本篇将通过几个简单例子让大家轻松理解大模型如何调用外部工具并且快速上手MCP客户端开发。
Note:
本文纯人肉手工编写,零AI添加剂,示例代码精心编排,尽量做到由浅入深,大家放心食用!
上手实操前先简单了解以下几个问题:
1. MCP 没出现之前大模型如何调用外部工具?
在 MCP(Model Context Protocol)协议出现之前,大模型(如GPT、Claude等)主要通过 Function Calling(函数调用) 的方式与外部工具交互。
2. 大模型如何获得Function Calling 能力?

大模型通过微调获得 Function Calling 能力的示意图
如上图所示,大模型通过监督微调(SFT)学习识别用户意图并生成结构化函数调用指令:
训练阶段:
模型被输入包含用户请求、可用函数描述及期望输出的数据集,从而学会区分何时调用函数、如何提取参数并格式化输出。
推理阶段:
模型结合实时注入的工具描述(如函数名称、参数格式)动态生成调用指令,再由外部系统执行,最终整合输出结果。
3. MCP和function calling 的关系和区别:
MCP是在Function Calling基础上的标准化工具调用流程。
核心区别:
| 维度 | Function Calling | MCP |
| 作用层面 | 模型内部的工具调用决策 | 模型与外部工具的标准化交互协议 |
| 交互粒度 | 细粒度(单函数调用) | 粗粒度(多工具/服务的统一管理) |
| 实现方式 | 模型原生能力(如 OpenAI 的 JSON 指令) | 独立协议(JSON-RPC 格式) |
| 依赖关系 | 不依赖 MCP | 依赖 Function Calling 生成指令 |
4. Function Calling 具体如何运行?

Function Calling 运行流程图
下面是一个简单示例代码,我们来运行看看。
1. 下载&安装
# 克隆本MCP教程项目代码
git clone git@gitee.com:changelink/mcp-so-easy.git
# 进入项目目录
cd mcp-so-easy
# 安装依赖
npm install
2. API配置
修改client/function-calling.js文件中的API配置(其他client示例文件需要做同样配置才能运行),替换为你的API Key和Base URL,如下:
const client = new OpenAI({
apiKey: "<替换为你的API Key>",
baseURL: "https://api.siliconflow.cn/v1"
});
tips: 本项目示例用的是硅基流动提供的API(详细参考项目中的README.md文件)。
3. 运行示例代码
执行以下命令:
# 运行 Function Calling 示例代码(Windows 用户如运行报错,请将命令中的"/"替换为"\")
node client/function-calling.js

Function Calling 示例代码运行效果图
从上图我们可以看到Function Calling示例代码运行过程可总结为以下三步:
1. 大模型根据用户提问内容结合工具函数信息给出函数调用决策信息。
2. 外部系统根据函数调用决策信息执行函数调用。
3. 大模型整合用户提问内容、函数调用决策信息及函数调用结果给出最终结果。
tips: 更具体实现细节可以细阅function-calling.js代码文件,上面每一行代码都有详细的注释。
5. MCP客户端如何调用MCP服务?
上述下载的项目里还准备了一个MCP客户端简易示例:client/client-simple.js,修改代码中的API配置信息(同上),执行以下命令:
# 运行MCP Client示例代码(Windows 用户如运行报错,请将命令中的"/"替换为"\")
node client/client-simple.js

MCP客户端简易示例代码运行效果图
从上图我们可以看到:MCP客户端连接到了名称为"My-Tool-Box"的MCP服务(不了解的可以看我上一篇MCP服务端实现的文章)并发现了5个工具函数。问题中包含3个子问题,分别调用了3个对应的工具得到3个对应的结果,然后整合输出完整回答。最后断开连接。
整个过程是否有似曾相识的感觉?是不是很像TCP协议三次握手和4次挥手的过程。其实MCP协议就是一个标准的CS(Client-Server)协议。
对比function-calling.js 和client-simple.js的代码可以看出来,前者实现的是简单的大模型调用工具函数的过程。而后者实现了一次完整的MCP协议的交互的过程,其中包含client(客户端)、server(服务器)、connect(连接)等高级抽象概念的应用。
结合第3点MCP和function calling 的关系和区别来看可以更好地理解。
6. 实现一个可通过配置文件加载多个不同类型MCP服务器的MCP客户端
一共3个文件:
1.MCP客户端主程序:client-with-config.js
2.MCP服务配置文件:mcp_settings.json
3.MCP远程服务程序:server-remote.js
1. 运行
# 先启动一个远程MCP服务
node server/server-remote.js
# 然后运行MCP客户端主程序
node client/client-with-config.js
2.效果

client-with-config.js运行效果图
如上示例代码逻辑可总结为以下4步:
1. 🔗连接服务;
2. 🔧调用工具;
3. 🎯 整合结果;
4. 🔌断开连接。
更多细节处理请细阅代码。
7. MCP客户端不一定要使用官方的SDK。
MCP官方提供的SDK是一个实现MCP协议的工具库,不是非得用它不可。
只要你的客户端程序遵循MCP协议的规范你就可以和同样遵循MCP协议的服务器互动起来。
项目里提供了一个纯手搓版的(无官方SDK)MCP客户端示例client-no-sdk.js,以便读者更好的理解MCP客户端的运行原理。
1. 运行
# 运行无官方SDK实现的MCP客户端示例
node client/client-no-sdk.js
无官方SDK实现的MCP客户端示例运行效果图
更多细节处理请细阅代码。
结语
MCP的核心是标准与规范,让大模型通过这个标准的协议可以快速与各种本地或远程网络工具交互起来,实现“万物”智能互动。
关于MCP客户端的内容就先写这些了,希望大家可以更好的理解MCP协议,并动手搞个自己的MCP客户端(* ̄︶ ̄)!
Note:
这篇已经是MCP实操系列的第二篇了,已经把MCP架构中的server和client完成了,还差host。在考虑要不要再出一篇关于host的,其实server和client篇已经涵盖了MCP协议所有内容,host只是一个把这两者协同用起来的载体(如IDE、Cherry Studio及Claude Desktop等大模型交互工具 )。嗯,后面有时间再说吧。
欢迎关注“大虫小呓”(全网同名),获得更多技术分享内容!
如对文中内容有疑问,欢迎留言。如对您有帮助,可一键三连+投币。感谢大家的支持Thanks♪(・ω・)ノ!
732

被折叠的 条评论
为什么被折叠?



