公网 MCP 服务器在 Responses API 工具中使用 type:"mcp" 和 server_url;私有、本地或防火墙后的服务器使用 Secure MCP Tunnel 与 tunnel_id。首次接入建议显式设置 require_approval:"always",并用 allowed_tools 只导入需要的工具。OAuth Token 由你的服务端获取并在每次新建 Response 时重新提供,不能放到浏览器、提示词或日志中。
官方核对入口:MCP servers、Secure MCP Tunnel、Using tools 与 Responses API migration。核对日期:2026-11-01。
先区分四种接入方式
| 方式 | 配置 | 适用场景 | 主要责任 |
|---|---|---|---|
| Remote MCP | server_url | 公网可访问、支持 MCP 的 HTTPS 服务 | 信任服务器、审批、OAuth、数据最小化 |
| Secure MCP Tunnel | tunnel_id | 本地、内网、机房或防火墙后的 MCP | 隧道生命周期、网络边界和本地服务安全 |
| Function Calling | 应用定义工具 Schema | 你自己的后端函数和业务动作 | 应用执行、参数校验、幂等与回传 |
| 旧 Connector | connector_id | 旧模型兼容集成 | 迁移计划;新模型改用 server_url/tunnel_id |
官方文档已将 connector_id 标为对 2026 年 9 月 1 日之后发布的模型弃用;新集成应优先使用 server_url,私有服务器则使用 tunnel_id。不要为了省事把内网 MCP 直接暴露到公网。
服务器需要满足什么条件?
- Remote MCP 当前需支持 Streamable HTTP 或 HTTP/SSE 传输。
- 公网端点应使用有效 HTTPS、稳定域名和明确超时;重定向目的地也要受控。
- 工具名称、描述、输入 Schema 和注解要准确,但客户端仍不能把服务器自报的“只读”当作唯一安全依据。
- 工具应返回可解析的 MCP 结果和明确错误;失败不能伪装成成功文本。
- 写操作必须实现服务端授权、幂等和审计,不能只依赖模型或前端确认。
Responses API 在请求里看到 MCP 工具后,会先列出服务器工具并生成 mcp_list_tools。真正调用时会产生 mcp_call,其中包含工具名、参数、输出和错误字段。
安全最小请求:先审批,再执行
curl https://api.openai.com/v1/responses \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-astra",
"input": "在官方文档中查找 Responses API streaming 链接",
"tools": [{
"type": "mcp",
"server_label": "openai_docs",
"server_description": "只读搜索 OpenAI 官方开发文档",
"server_url": "https://developers.openai.com/mcp",
"allowed_tools": ["search_openai_docs"],
"require_approval": "always"
}]
}'示例模型与参数来自当前官方文档;模型目录和 MCP 兼容性会变化,上线当天应重新核对。首次接入不要直接复制公开只读示例里的 require_approval:"never" 到生产写入工具。
审批流程如何续接?
当模型准备调用需要审批的工具时,响应中会出现 mcp_approval_request。你的界面应展示服务器、工具名、脱敏后的参数、可能发送的数据和副作用,再由用户或策略引擎决定是否批准。
curl https://api.openai.com/v1/responses \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-6-astra",
"previous_response_id": "resp_123",
"tools": [{
"type": "mcp",
"server_label": "openai_docs",
"server_url": "https://developers.openai.com/mcp",
"allowed_tools": ["search_openai_docs"],
"require_approval": "always"
}],
"input": [{
"type": "mcp_approval_response",
"approval_request_id": "mcpr_123",
"approve": true
}]
}'- 每个审批只对应一次具体工具调用;后续调用可能再次产生审批请求。
- 使用
previous_response_id续接最直观,也可以自行传回必要 Items。 - 拒绝时返回
approve:false,并让产品明确显示“未执行”,不要生成仿真的成功结果。 - 批准前重新校验用户身份、资源范围和参数;模型给出的参数不是业务授权。
怎样设计 require_approval?
| 策略 | 建议使用 | 风险 |
|---|---|---|
"always" | 初次接入、未知服务器、包含敏感数据或副作用 | 延迟更高,但可见性最好 |
按 tool_names 过滤 | 只让已评测的低风险查询跳过,其余审批 | 工具行为变化后需要重新审核 |
按 read_only 注解过滤 | 服务器注解可信且另有服务端权限控制 | 注解错误或恶意时会误判 |
"never" | 仅限高度可信、无敏感数据、无副作用且持续监控的工具 | 参数或服务器变化可能直接造成数据泄露或动作 |
官方默认在向 Remote MCP 共享数据前请求审批。生产配置应显式声明策略,并保证付款、删除、发信、发布、账号修改和写入生产数据等敏感操作始终需要审批。
OAuth 和 authorization:Token 必须由服务端管理
需要认证的 MCP 通常使用 OAuth access token,并把 Token 放在 MCP 工具的 authorization 字段。Responses API 不保存这个值,也不会在 Response 对象中回显,因此每个新的 Responses 创建请求都要重新提供当前有效 Token。
- 用户在你的应用中完成 OAuth,服务端安全保存 access/refresh token。
- 创建 Response 时,服务端按当前用户和最小 scope 注入 access token。
- Token 过期或 scope 不足时,刷新或重新授权;不要让模型自行请求更多权限。
- 撤销授权时同时删除本地 Token,并阻止后续 MCP 请求继续使用旧会话。
不要把 OAuth Token 放进浏览器 JavaScript、用户输入、system prompt、MCP 的普通参数、URL Query、分析事件或错误日志。即使 Response 不保存 authorization,第三方 MCP 仍会收到请求数据并受其自己的保留政策约束。
工具发现、过滤和延迟优化
- 保留
mcp_list_tools:只要该 Item 仍在对话上下文中,API 不必每一轮重新读取工具列表,可减少延迟。 - 使用
allowed_tools:只导入当前业务需要的工具,减少 Token、误调用面和审批噪声。 - 大型服务器考虑
defer_loading:true:配合支持 Tool Search 的模型,按需加载工具定义。 - 缓存要有版本边界:服务器工具发生变更时必须重新发现和评测,不能永久信任旧 Schema。
- 记录实际调用:统计 list tools 时长、每个 mcp_call 的延迟、Token、错误和人工审批耗时。
怎样处理 mcp_call 输出?
- 检查
error字段和协议错误,不能只读取自然语言 output。 - 验证服务器返回的 URL、图片、文件和重定向域名;不要直接嵌入未知 URL。
- 对结构化结果再次做 Schema 校验、资源归属校验和内容安全检查。
- 将工具输出当作不可信数据,防止其中的提示注入改变系统规则或触发其他工具。
- 对写操作查询真实业务状态,避免超时后重复执行。
成本和计费怎么理解?
OpenAI 当前说明 MCP 本身不另外收取每次工具调用费,但导入工具定义、工具调用参数/输出和后续模型处理会消耗 Token,并按所选模型价格计费。第三方 MCP 服务器可能另有订阅、API 或数据传输费用。
- 减少
allowed_tools数量,避免一次导入几十个无关 Schema。 - 控制工具返回大小;大段原始数据先在服务器侧过滤和分页。
- 长工作流设置调用上限、超时和取消路径。
- 按任务记录模型 Token、MCP 调用数、第三方费用和人工审批时间。
安全:Remote MCP 是第三方信任边界
- 优先服务提供商自己托管的官方 MCP;谨慎评估代理、聚合器和转发服务。
- 只给最小 scope、最小资源范围和测试账户;先读后写,先沙箱后生产。
- 提示注入可能藏在用户内容、网页、文件或 MCP 输出里;外部内容不能覆盖系统规则。
- 敏感工具保持审批,批准界面显示实际参数和数据去向。
- 审查服务器隐私政策、数据保留、数据驻留、日志与删除机制;OpenAI 的 ZDR/区域设置不会自动约束第三方服务器。
- 服务器工具行为可能无预警改变,应固定可信版本、定期重新发现、评测并保留回滚。
- 日志记录必要元数据和脱敏参数,不记录完整密钥或无必要的用户数据。
常见失败与排查顺序
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 无法列出工具 | URL/协议/TLS 错误,服务器不支持 Streamable HTTP 或 HTTP/SSE | 先用测试客户端验证初始化与 tools/list,再检查网络和证书 |
| 401/403 | Token 过期、audience/scope/用户错误 | 在服务端刷新授权,核对用户和最小 scope,不在前端重试密钥 |
| 反复出现审批 | 每次都是新的调用,或审批 Response 没有正确续接 | 保存 request ID,传 previous_response_id 和正确 approval_request_id |
| 工具太多、延迟高 | 导入整个服务器 Schema,每轮重复 list tools | allowed_tools、保留 mcp_list_tools,必要时 defer_loading |
| 工具执行两次 | 超时后直接重试写操作 | 服务端幂等键、状态查询和去重,审批不等于幂等 |
| 输出包含可疑链接 | 服务器或数据源返回未验证 URL | 域名允许名单、协议校验、隔离预览,不直接嵌入 |
| connector_id 在新模型不可用 | 继续使用旧 Connector 配置 | 迁移到 server_url 或 Secure MCP Tunnel 的 tunnel_id |
上线前检查清单
- 确认目标模型当前支持 MCP,服务器使用受支持传输和有效 HTTPS。
- 公网服务使用 server_url;私有服务使用 tunnel_id,不为接入而暴露内网。
- allowed_tools 只包含必要工具,工具 Schema、权限和副作用已人工审核。
- require_approval 明确配置,敏感操作始终审批,拒绝路径也经过测试。
- OAuth Token 只在服务端管理,每个新 Response 正确注入,日志不泄露。
- mcp_list_tools、mcp_approval_request、mcp_call 与错误 Items 都有可靠解析。
- 服务器返回 URL、文件、图片和文本均经过验证,不允许提示注入触发额外动作。
- 测试超时、重试、幂等、撤销授权、工具变更、第三方故障和安全降级。
- 记录 Token、延迟、第三方费用、审批率、失败率和异常工具行为。
常见问题
Remote MCP 和 Function Calling 有什么区别?
Function Calling 的工具由你的应用定义并执行;Remote MCP 让 Responses API 连接一个实现 MCP 协议的远程服务器,先发现其工具,再由模型调用。两者都需要权限、参数校验、幂等和审批设计。
公网 Remote MCP 和 Secure MCP Tunnel 怎么选?
公网 HTTPS MCP 使用 server_url;位于本地、内网、机房或防火墙后的服务器应优先使用 Secure MCP Tunnel,并在工具定义中提供 tunnel_id,避免为了接入而把私有服务器直接暴露到互联网。
Responses API 支持哪些 MCP 传输方式?
官方文档当前说明 Remote MCP 支持 Streamable HTTP 和 HTTP/SSE。生产接入前仍应核对服务器协议版本、TLS、超时、重连和工具列表是否兼容。
Remote MCP 默认需要人工审批吗?
是。OpenAI 默认在向远程 MCP 或连接器共享数据前请求审批。生产中应显式设置 require_approval,并让写入、付款、删除、发信等敏感工具始终审批;只有经过验证的低风险只读工具才考虑按名称跳过。
OAuth access token 会保存在 Response 里吗?
不会。Responses API 不保存 authorization 字段的值,也不会在创建的 Response 对象中返回它,因此应用必须在每个新的 Responses 创建请求中重新提供有效 Token,并把 Token 保存在服务端密钥系统。
mcp_list_tools、mcp_approval_request 和 mcp_call 分别是什么?
mcp_list_tools 表示服务器工具已被发现;mcp_approval_request 表示某次调用等待审批;批准后会通过 mcp_approval_response 续接;真正执行后产生 mcp_call,其中包含工具名、参数、输出或错误。
Remote MCP 怎样计费和控制成本?
OpenAI 当前说明 MCP 不另外收取每次工具调用费,但导入工具定义和调用产生的 Token 仍按所用模型计费;第三方 MCP 服务也可能自行收费。应使用 allowed_tools、保留 mcp_list_tools 上下文、必要时 defer_loading,并记录 Token、延迟、失败和第三方费用。
本文核对日期为 2026-11-01。模型兼容性、MCP 参数、审批、OAuth、Connector 兼容和数据政策可能调整;上线前请重新读取官方 MCP servers、Secure MCP Tunnel 与 Responses API 文档。