基于远程MCP服务器的模型工具调用与安全实践
基于远程MCP服务器的模型工具调用与安全实践
基于远程MCP服务器的模型工具调用与安全实践
概述
本文技术性探讨了如何通过远程 Model Context Protocol(MCP)服务器扩展大语言模型(LLM)的工具调用能力。MCP是一种开放协议,旨在标准化应用程序向模型提供工具定义和上下文信息。通过Responses API中的MCP工具,开发者可以让模型访问托管于远程MCP服务器上的工具,从而实现更丰富的自动化和交互场景。
MCP工具原理
MCP工具仅在Responses API中可用,支持主流模型(如gpt-4o、gpt-4.1及推理模型)。使用时,仅对导入工具定义或调用工具时消耗的token计费,无其他额外费用。
流程总览
- 获取远程MCP服务器工具列表
- 调用远程MCP服务器工具
- 处理审批与安全验证
- 配置身份认证
步骤详解
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服务器为大语言模型提供了灵活调用应用工具的能力,极大丰富了自动化场景。在实际开发中,务必严格把控安全边界,合理配置审批和认证流程,以确保数据安全与合规性。
更多推荐
所有评论(0)