几个简单示例手上开发MCP客户端 | MCP实操系列 (附源

前言

上一篇主要讲MCP服务端的实现。本篇将通过几个简单例子让大家学会使用nodejs实现MCP客户端并从中理解大模型是如何调用外部工具的以及MCP的价值。

Note:
本文纯人肉手工编写,0AI添加剂,耗时3天整(历史最长),包括代码示例都是精心编排,由浅入深,大家大胆放心食用!


上手实操前先简单了解以下几个问题:

1. MCP 没出现之前大模型如何调用外部工具?

MCP(Model Context Protocol)协议出现之前,大模型(如GPT、Claude等)主要通过 Function Calling(函数调用) 的方式与外部工具交互。


2. 大模型如何具备Function Calling 能力?


如上图所示,大模型通过监督微调(SFT)学习识别用户意图生成结构化函数调用指令:
1. 训练阶段:
模型被输入包含用户请求、可用函数描述期望输出的数据集,从而学会区分何时调用函数、如何提取参数格式化输出
2. 推理阶段:
模型结合实时注入的工具描述(如函数名称、参数格式)动态生成调用指令,最终由外部系统执行并整合结果。


3. MCP和function calling 的关系和区别:

MCP是在Function Calling基础上的标准化工具调用流程

核心区别:


4. 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示例代码运行过程可总结为以下三步:

  1. 1. 大模型根据用户提问内容结合工具函数信息给出函数调用决策信息
  2. 2. 外部系统根据函数调用决策信息执行函数调用
  3. 3. 大模型整合用户提问内容函数调用决策信息函数调用结果给出最终结果。

tips: 更具体实现细节可以细阅function-calling.js代码文件,上面每一行代码都有详细的注释。


5. MCP客户端如何调用MCP服务?

上述下载的项目里我还准备了一个MCP客户端简易示例代码文件:client/client-simple.js,修改代码中的API配置信息(同上),执行以下命令:

# 运行MCP Client示例代码(Windows 用户如运行报错,请将命令中的"/"替换为"\")
node client/client-simple.js

从上图我们可以看到,MCP客户端连接到了名称为"My-Tool-Box"的MCP服务(不了解的可以看我上一篇MCP服务端实现的文章)并发现了5个工具函数。问题中包含3个子问题,分别调用了对应的工具得到对应的结果。最后给出了整合后的完整回答。

对比client-simple.jsfunction-calling.js 的代码可以看出二者调用工具的模式是一致的。

差异的处在于MCP客户端使用了MCP官方的SDK提供的StdioClientTransport类来构造MCP服务传输信息对象,Client类的connect方法来完成客户端和服务的连接,listTools方法获取MCP服务的工具信息及callTool方法执行工具函数的调用。结合文章前面提到的第4点: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.效果

如上示例代码逻辑可总结为以下4步:

  1. 1. 连接服务;
  2. 2. 调用工具;
  3. 3. 整合结果;
  4. 4. 断开连接。

更多细节处理请细阅代码。


7. MCP客户端不一定要使用官方的SDK。

MCP官方的提供SDK的是一个实现MCP协议的工具,不是非得用它不可。

MCP的核心是标准与规范,让大模型通过这个标准的协议可以快速与各种工具交互起来,实现万物智联。

项目里提供了一个本人纯手工搓的(无官方SDK)MCP客户端示例client-no-sdk.js,以便读者更好的理解MCP客户端的运行原理。

1. 运行

# 运行无官方SDK实现的MCP客户端示例
node client/client-no-sdk.js 


结语

关于MCP客户端的内容就先写这些了,希望大家可以更好的理解MCP协议,并动手搞个自己的MCP客户端(* ̄︶ ̄)!

Note:
这篇已经是MCP实操系列的第二篇了,已经把MCP架构中的server和client完成了,还差host。纠结还要不要再出一篇关于host的,其实server和client篇已经涵盖了MCP协议所有内容,host只是一个把这两者协同用起来的图形化工具。等大家的反馈吧,呼声高的话就再出一篇,i will be right here waiting for you

如对文中内容有疑问题,欢迎留言。如对您有帮助,可一键三连+投币。感谢大家的支持Thanks(ω)ノ!