基于远程MCP服务器的模型工具调用与安全实践

概述

本文技术性探讨了如何通过远程 Model Context Protocol(MCP)服务器扩展大语言模型(LLM)的工具调用能力。MCP是一种开放协议,旨在标准化应用程序向模型提供工具定义和上下文信息。通过Responses API中的MCP工具,开发者可以让模型访问托管于远程MCP服务器上的工具,从而实现更丰富的自动化和交互场景。

MCP工具原理

MCP工具仅在Responses API中可用,支持主流模型(如gpt-4o、gpt-4.1及推理模型)。使用时,仅对导入工具定义或调用工具时消耗的token计费,无其他额外费用。

流程总览

  1. 获取远程MCP服务器工具列表
  2. 调用远程MCP服务器工具
  3. 处理审批与安全验证
  4. 配置身份认证

步骤详解

1. 获取远程MCP服务器工具列表

当在API请求中指定远程MCP服务器时,Responses API会首先尝试获取该服务器提供的工具列表。服务器需支持Streamable HTTP或HTTP SSE传输协议。工具列表将以mcp_list_tools类型呈现在响应对象中。

示例代码
from openai import OpenAI

client = OpenAI()
resp = client.responses.create(
    model="gpt-4.1",
    tools=[
        {
            "type": "mcp",
            "server_label": "deepwiki",
            "server_url": "https://zzzzapi.com/mcp",
            "require_approval": "never",
        }
    ],
    input="MCP协议2025-03-26版本支持哪些传输协议?"
)
print(resp.output_text)
响应结构说明

响应对象中的tools属性会展示成功导入的工具定义,如下所示:

{
  "id": "mcpl_xxxxx",
  "type": "mcp_list_tools",
  "server_label": "deepwiki",
  "tools": [
    {
      "name": "read_wiki_structure",
      "input_schema": {
        "type": "object",
        "properties": {
          "repoName": {
            "type": "string",
            "description": "GitHub仓库: owner/repo(如 facebook/react)"
          }
        },
        "required": ["repoName"],
        "additionalProperties": false,
        "annotations": null,
        "description": "",
        "schema": "http://json-schema.org/draft-07/schema"
      }
    },
    // 其他工具定义
  ]
}
工具列表缓存与性能优化

只要mcp_list_tools条目存在于模型上下文中,API不会重复拉取工具列表。建议在每次会话或工作流执行时保留该条目,以优化延迟表现。

2. 工具筛选与调用

部分MCP服务器可能包含大量工具,全部导入可能增加成本与延迟。如果仅需部分工具,可通过allowed_tools参数进行筛选。

工具筛选示例
from openai import OpenAI

client = OpenAI()
resp = client.responses.create(
    model="gpt-4.1",
    tools=[
        {
            "type": "mcp",
            "server_label": "deepwiki",
            "server_url": "https://zzzzapi.com/mcp",
            "require_approval": "never",
            "allowed_tools": ["ask_question"]
        }
    ],
    input="MCP协议2025-03-26版本支持哪些传输协议?"
)
print(resp.output_text)
工具调用响应结构

模型调用工具后,响应对象将生成mcp_call条目,包含调用参数及输出:

{
  "id": "mcp_xxxxx",
  "type": "mcp_call",
  "arguments": {
    "repoName": "modelcontextprotocol/modelcontextprotocol",
    "question": "MCP协议2025-03-26版本支持哪些传输协议?"
  },
  "error": null,
  "name": "ask_question",
  "output": "2025-03-26版MCP规范支持stdio和Streamable HTTP两种传输机制……",
  "server_label": "deepwiki"
}

如果调用失败,error字段会返回协议错误、工具执行错误或连接异常。

3. 工具调用审批机制

默认情况下,API会在数据发送至远程MCP服务器前请求开发者审批,以便控制和记录数据流动。审批请求会生成mcp_approval_request条目,可通过新请求响应进行批准。

批准工具调用示例
from openai import OpenAI

client = OpenAI()
resp = client.responses.create(
    model="gpt-4.1",
    tools=[
        {
            "type": "mcp",
            "server_label": "deepwiki",
            "server_url": "https://zzzzapi.com/mcp"
        }
    ],
    previous_response_id="resp_xxxxx",
    input=[
        {
            "type": "mcp_approval_response",
            "approve": True,
            "approval_request_id": "mcpr_xxxxx"
        }
    ]
)
print(resp.output_text)
跳过审批配置

如需优化延迟,可跳过审批流程。例如,require_approval参数可设置为never或指定工具名的对象:

from openai import OpenAI

client = OpenAI()
resp = client.responses.create(
    model="gpt-4.1",
    tools=[
        {
            "type": "mcp",
            "server_label": "deepwiki",
            "server_url": "https://zzzzapi.com/mcp",
            "require_approval": {
                "never": {
                    "tool_names": ["ask_question", "read_wiki_structure"]
                }
            }
        }
    ],
    input="MCP协议2025-03-26版本支持哪些传输协议?"
)
print(resp.output_text)

4. 身份认证配置

部分远程MCP服务器要求身份认证,常见方式为HTTP头部传递API密钥或OAuth令牌。可在headers参数中指定所需信息。

认证示例
from openai import OpenAI

client = OpenAI()
resp = client.responses.create(
    model="gpt-4.1",
    input="生成20元的支付链接",
    tools=[
        {
            "type": "mcp",
            "server_label": "stripe",
            "server_url": "https://zzzzapi.com/mcp",
            "headers": {
                "Authorization": "Bearer STRIPE_API_KEY"
            }
        }
    ]
)
print(resp.output_text)

注意: API不会存储或返回headers中的敏感值。需在每次请求时明确附带完整的server_url和认证头。

风险与安全实践

  • 仅连接受信任的官方MCP服务器,警惕第三方代理服务器的数据处理方式。
  • 审查所有通过MCP工具共享的数据,必要时启用审批和日志。
  • MCP服务器工具定义可能包含隐蔽指令(Prompt Injection),需评估输入输出内容安全。
  • MCP服务器随时可能更新工具行为,需做好监控与回溯。
  • MCP工具兼容零数据留存(Zero Data Retention)和数据驻留(Data Residency),但发送至MCP服务器的数据受其自身政策约束。

API使用说明

  • API类型:Responses、Chat Completions、Assistants
  • 速率限制:Tier 1: 200 RPM;Tier 2-3: 1000 RPM;Tier 4-5: 2000 RPM
  • 价格、安全及数据政策:详见官方文档

总结

远程MCP服务器为大语言模型提供了灵活调用应用工具的能力,极大丰富了自动化场景。在实际开发中,务必严格把控安全边界,合理配置审批和认证流程,以确保数据安全与合规性。

Logo

更多推荐