目录
-
[引言:为什么需要“人-大模型-工具”协作?](#引言)
-
[MCP SDK:让工具“被看见、被调用”](#mcp-sdk)
-
工具注册与元信息自动生成
-
工具信息的传递与发现
-
运行机制与在线要求
-
远程调用工具
-
-
[OpenAI SDK:让大模型“理解意图、自动决策”](#openai-sdk)
-
客户端构建方式的演变
-
function calling 能力
-
判断大模型是否建议调用工具
-
工具调用与二次推理
-
-
[MCP SDK 与 OpenAI SDK 的协作全流程](#协作流程)
-
[总结对比:两大 SDK 的分工与优势](#总结对比)
-
[实用技巧与常见问题](#实用技巧)
-
[哪些 OpenAI 模型支持 function calling?](#模型支持)
-
[支持MCP客户端的主流IDE与工具]
一、引言:为什么需要“人-大模型-工具”协作?
随着大语言模型(LLM)能力的提升,越来越多的场景需要:
-
用户自然语言提问
-
大模型理解意图
-
自动决定是否调用某个“工具”或“插件”
-
返回最终答案
这背后涉及到“工具的注册与发现”“大模型的 function calling 能力”“人-机-工具三方协作”等关键技术。
二、MCP SDK:让工具“被看见、被调用”
“工具”对应到编程实现上,其实就是一个个的函数,比如我们在函数addition()中写入return a+b,则addition()函数就扮演了一个加法运算工具的角色。
如果是传统的项目结构,我们想要使用加法运算工具的功能,只需要直接在代码中调用addition()这个函数就可以了。但在MCP项目中,工具能力的开发者和使用者往往不是同一个人、不在同一生产环境中,那我如何使用别人写好的工具、又如何把我写好的工具提供给别人使用呢?这都依赖于MCP SDK提供的一些标准化方法。
1. 工具注册与元信息自动生成
- 在服务端(server)用
@mcp.tool()装饰器注册工具。
- 只需写好函数和注释,无需手动填写工具名称、描述、参数类型。
- MCP 框架自动解析函数名、docstring、参数类型,生成工具元信息。
示例:
-
工具名称(name):自动用
query_weather -
工具描述(description):自动用 docstring
-
输入参数结构(input_schema):自动根据
city: str生成
2. 工具信息的传递与发现
-
MCP 服务器启动后,自动收集所有注册工具的信息。
-
客户端通过
await self.session.list_tools()实时向服务器请求工具列表。 -
服务器返回所有工具的详细信息,客户端可直接用于 function calling。
代码片段:
3. 运行机制与在线要求
- 服务端和客户端必须同时在线、都在运行。
-
客户端每次获取工具列表或调用工具,都是“实时”向服务器请求。
-
工具信息不会被永久保存,服务器关闭后客户端无法获取工具信息,也不能调用工具。
-
类比:就像访问网站,网站关了你就访问不到内容。
4. 远程调用工具
- 客户端通过 MCP SDK 的
call_tool方法,远程调用服务端注册的工具。
更多MCP SDK讲解及项目实战:brmes.xet.tech/s/272wjp。
三、OpenAI SDK:让大模型“理解意图、自动决策”
在很多MCP demo中,你可以看到客户端以这样的方式创建:
为什么这样一行代码就可以实现客户端的构建?这其实是因为OpenAI SDK除了大模型调用外,还封装提供了一些其他方法。
1. 客户端构建方式的演变
-
早期:开发者用
requests、httpx等 HTTP 客户端库,手动拼接 URL、设置请求头、管理 API Key、处理 JSON 数据,直接与 OpenAI 或其他 AI 服务的 RESTful API 通信。 -
例如:
-
这种方式需要开发者自己处理所有底层细节,包括错误处理、重试、参数格式、API 版本兼容等。
-
现代:用 OpenAI SDK 创建大模型客户端,封装了所有底层 HTTP 通信、鉴权、参数校验、错误处理等细节。
-
你只需像操作本地对象一样,直接调用方法即可,无需关心底层协议和格式。
-
SDK 支持更高级的功能(如 function calling、流式输出、自动重试等),并且接口设计更贴合大模型的能力和用法。
-
代码更简洁、健壮、易维护。
对比总结:
| 方式 | 优点 | 缺点 |
|---|---|---|
| 传统 HTTP 客户端 | 灵活、通用,适合所有 REST API | 代码繁琐,易出错,需手动处理所有细节 |
| OpenAI SDK | 简洁、自动化、功能丰富 | 仅适用于支持的模型和 API |
结论:
-
推荐优先使用官方 SDK 构建大模型客户端,除非有特殊需求(如自定义底层协议、兼容特殊 API 等)。
-
SDK 让你专注于业务逻辑和大模型能力的发挥,而不是底层通信细节。
代码示例:
2. function calling 能力
-
你可以把用户输入和工具列表一起发给大模型:
-
大模型会自动判断:
-
直接回复文本?
-
还是建议调用某个工具?
-
3. 判断大模型是否建议调用工具
-
看返回结果的
finish_reason字段:-
"tool_calls":大模型建议调用工具 -
"stop"或其他:只是普通文本回复
-
-
看
message.tool_calls字段是否有内容
4. 工具调用与二次推理
- 如果大模型建议调用工具,客户端用 MCP SDK 调用工具,拿到结果后再发回大模型,让其生成最终回复。
完整流程代码片段:
零门槛上手OpenAI/DeepSeek 或本地部署的国产大模型系统教程:brmes.xet.tech/s/272wjp。
四、MCP SDK 与 OpenAI SDK 的协作全流程
1. 服务端用 MCP SDK 注册工具并启动服务器。
2. 客户端用 MCP SDK 连接服务器,获取工具列表。
3. 客户端用 OpenAI SDK 把用户输入和工具列表发给大模型。
4. 大模型(通过 OpenAI SDK)决定是否需要调用工具。
5. 如果需要,客户端用 MCP SDK 远程调用服务端工具,拿到结果。
6. 客户端再用 OpenAI SDK 把工具结果发给大模型,生成最终回复。
一句话总结:
-
MCP SDK 让“工具”能被远程发现和调用。
-
OpenAI SDK 让“大模型”能理解意图并自动决策是否用工具。
-
两者结合,实现了“人-大模型-工具”三方智能协作。
五、总结对比:两大 SDK 的分工与优势
| SDK | 主要作用 | 关键功能 |
|---|---|---|
| MCP SDK | 工具注册、发现、远程调用、通信 | @mcp.tool()、list_tools、call_tool |
| OpenAI SDK | 与大模型对话、推理、function calling | OpenAI(...)、chat.completions.create |
六、实用技巧与常见问题
-
想看实际的工具信息,可以在客户端打印
response.tools。 -
MCP 框架让你专注于业务逻辑,底层的工具注册、发现、调用都自动帮你搞定了。
-
是否传递
tools参数,决定了大模型是否有“自动调用工具”的能力。 -
通过
finish_reason和message.tool_calls字段判断本次回复是否涉及工具调用。 -
服务端和客户端必须都在运行,才能实现完整的智能协作。
-
如果用不支持 function calling 的模型传递
tools参数,API 会直接报错。 -
推荐优先使用官方 SDK,除非有特殊需求。
七、支持MCP客户端的主流IDE与工具
随着MCP协议的普及,越来越多的AI IDE和平台支持作为MCP客户端,极大提升了工具集成和用户体验。相比传统的代码demo方式,现代AI IDE如Cursor、Claude Desktop等为开发者和非开发者都带来了全新的交互体验。
以Cursor为例,你只需启动自己的MCP服务器(如server_demo.py),在Cursor的“插件/工具”管理界面配置好MCP服务器的连接信息,Cursor便会自动发现、展示并调用所有MCP工具。此时,你可以在Cursor的聊天窗口用自然语言与大模型对话,模型会自动决定是否调用MCP工具,整个过程图形化、无缝衔接,无需手写任何MCP客户端代码。这种方式极大降低了集成门槛,让产品经理、业务人员、开发者都能轻松体验和利用MCP工具生态。
与之相比,代码demo方式则更适合需要深度定制、自动化和二次开发的场景。你可以完全掌控MCP客户端的逻辑,实现复杂的业务流程和自动化脚本。两种方式可以并行使用:开发调试时用代码demo,交付和演示时用IDE提升体验。
MCP 服务端的定义
MCP 服务端(Server)是指实现了 MCP 协议、对外暴露工具/资源/提示词等能力的后端服务,通常由你用 Python、TypeScript 等语言开发,并通过 MCP SDK 注册工具。服务端负责实际的业务逻辑、数据处理、工具执行等。
为什么 Cursor 不能作为 MCP 服务端?
-
Cursor 没有对外暴露 MCP 协议接口,也不支持注册自定义工具让其他 MCP 客户端发现和调用。
-
Cursor 的“插件”或“工具”本质上是消费端,不是生产端。
-
你无法让其他 MCP 客户端(如别的 IDE、MCP Inspector、定制客户端)去“发现”和“调用” Cursor 里的工具。
典型场景对比
| 角色 | 是否支持 | 说明 |
|---|---|---|
| Cursor 作为 MCP 客户端 | ✅ | 可以连接 MCP 服务器,发现并调用工具 |
| Cursor 作为 MCP 服务端 | ❌ | 不能对外暴露 MCP 工具,不能被其他 MCP 客户端发现和调用 |
| 你自定义的 MCP 服务器 | ✅ | 可以作为服务端被 Cursor、Inspector、定制客户端等发现和调用 |
值得注意的是,Cursor等IDE只能作为MCP客户端,不能作为MCP服务端。也就是说,Cursor无法对外暴露MCP协议接口,不能让其他MCP客户端发现和调用Cursor里的工具。如果你希望自己的工具被Cursor或其他MCP客户端发现和调用,仍需自己实现MCP服务端。
除了Cursor,Claude Desktop、Windsurf、LibreChat、MCP Inspector等也都可以作为MCP客户端。它们支持自动发现和调用MCP服务器上的工具,适合不同的团队协作和AI工作流场景。未来还会有更多AI IDE和平台支持MCP协议,MCP工具生态将更加繁荣。
这种“零代码集成”的方式,极大提升了MCP工具的可用性和传播力,让更多人能够专注于业务创新,而不是底层协议和集成细节。
更多热门MCP客户端快速上手,学习和工作提效教程:brmes.xet.tech/s/272wjp。
如何让 Cursor 和 client_demo.py 发现异地云端的 MCP 服务?
在实际企业应用中,MCP 服务端往往部署在云端,客户端(无论是 IDE 还是代码 demo)都需要远程发现和连接这些服务。下面分别说明:
1. Cursor 发现云端 MCP 服务
- 定位方式:Cursor 需要知道 MCP 服务端的公网 IP 或域名及端口(如 `http://123.123.123.123:3000\`)。
- 操作入口:在 Cursor 的“插件”或“工具”管理界面,手动添加 MCP 服务端的连接信息。
- 步骤:
-
打开 Cursor,进入“插件”或“工具”设置。
-
选择“添加 MCP 服务器”,填写云端 MCP 服务的地址和端口。
-
保存后,Cursor 会自动拉取工具列表并展示。
- 前提:云端 MCP 服务端口需对外开放,公网 IP/域名可达。
2. client_demo.py 发现云端 MCP 服务
- 定位方式:通过命令行参数传入云端 MCP 服务的地址和端口。
- 操作入口:在命令行运行时指定,如:
- 代码实现:`StdioServerParameters` 或相关参数会用到这个地址,建立远程连接。
- 前提:云端 MCP 服务端口需对外开放,公网 IP/域名可达。
3. 注意事项
-
云端 MCP 服务端口必须对外开放(安全组/防火墙放行)。
-
公网 IP 或域名必须可达。
-
协议类型(HTTP/WS/STDIO)需与客户端参数匹配。
4. 场景举例
-
你在云服务器部署了 MCP 服务,监听 3000 端口,公网 IP 为 8.8.8.8。
-
Cursor 添加 MCP 服务时,填写
http://8.8.8.8:3000。 -
运行
client_demo.py时,命令为python client_demo.py http://8.8.8.8:3000。
MCP Inspector 调试工具使用指南
前文提到了在代码中调用远程MCP服务外,还有其他方式可以使用MCP服务,一些IDE工具支持通过图形页面访问远程MCP服务,Cursor就是其一,除此之外,MCP Inspector也是一个常用的工具。MCP Inspector 是 Model Context Protocol 官方提供的开源可视化调试工具,专为开发者测试和调试 MCP 服务器设计。它提供了图形化界面,方便你实时查看、测试和调试 MCP 工具、资源和提示词。
1. 快速启动
无需安装,直接用 npx 一键启动:
-
例如:
-
Inspector 会自动启动本地 UI(默认端口 5173)和 MCP 代理服务器(默认端口 3000)。
-
可通过环境变量自定义端口:
-
启动后,浏览器访问
http://localhost:5173(或你自定义的端口)即可进入 Inspector 界面。
2. Inspector 的主要功能
- Server Connection:实时显示服务器连接状态、能力、元数据。
- Tools(工具):
-
查看所有已注册工具及其 schema、描述。
-
支持自定义输入参数,直接测试工具并查看返回结果。
- Resources(资源):
-
浏览服务器暴露的所有资源,查看元数据。
-
测试资源内容获取、订阅等功能。
- Prompts(提示词):
-
查看所有 prompt 模板。
-
支持输入参数,预览大模型生成的消息。
- History(历史):
- 查看所有交互的 JSON-RPC 消息、输入输出、错误信息。
3. 常见用法与开发流程
1. 开发初期
-
用 Inspector 启动并连接你的 MCP 服务器,验证基本连通性。
-
检查所有工具、资源、提示词是否被正确注册和识别。
2. 迭代测试
-
修改服务器代码后,重启 Inspector 或刷新页面,快速验证新功能。
-
在 Tools/Resources/Prompts 标签页直接测试各种输入和边界情况。
3. 调试与排错
-
利用 History 面板查看每一次请求和响应的详细内容。
-
发现错误时,结合服务器日志和 Inspector 的错误提示定位问题。
4. 常见问题与解决方案
- 工具未显示/找不到:
- 检查工具是否正确导出、命名是否一致、服务器是否加载了该工具。
- 资源错误:
- 检查资源 URI 格式、实现是否正确、订阅是否有清理机制。
- 提示词异常:
- 检查 prompt 参数、消息生成逻辑、资源引用。
- 连接失败:
- 检查服务器是否正常运行、端口是否冲突、协议兼容性。
5. 最佳实践
- 善用日志:
-
在服务器端用 logger 记录关键事件、错误、性能指标。
-
Inspector 支持实时查看日志,便于定位问题。
- 结构化调试:
- 充分利用 Inspector 的各个标签页,系统性测试工具、资源、提示词。
- 安全与环境:
-
注意日志中不要泄露敏感信息。
-
使用绝对路径、显式配置环境变量,避免路径和权限问题。