Model Context Protocol(MCP)是一种开放协议,正逐渐成为为 AI 模型扩展工具和知识的行业标准。远程 MCP 服务器可通过互联网将模型连接到新的数据源和功能。
本指南将介绍如何构建远程 MCP 服务器,从私有数据源(向量存储)读取数据,并通过 ChatGPT 和 Codex 中的插件、ChatGPT 的深度研究和公司知识功能,以及 API 提供这些数据。
注意:要使用 MCP 服务器构建插件,请先阅读插件文档:快速入门、构建您的 MCP 服务器、连接并测试您的插件和身份验证。如果您的 MCP 服务器不需要 UI,则无需提供 UI 资源即可开放工具。
配置数据源
您可以使用任意来源的数据来支持远程 MCP 服务器,但为简便起见,我们将使用 OpenAI API 中的向量存储。首先,将 PDF 文档上传到新的向量存储。作为示例,您可以使用这本已进入公有领域的 19 世纪猫咪主题书籍。
您可以在此控制台中上传文件并创建向量存储,也可以通过 API 创建向量存储并上传文件。请按照向量存储指南设置向量存储并向其中上传文件。
请记下向量存储的唯一 ID,以便在后续示例中使用。

创建 MCP 服务器
接下来,我们来创建一个远程 MCP 服务器,用于查询向量存储,并根据给定的文件 ID 返回文档内容。
在此示例中,我们将使用 Python 和 FastMCP 构建 MCP 服务器。本节末尾提供了服务器的完整实现,以及在基于浏览器的开发环境中运行它的说明。
请注意,您还可以使用其他多种 MCP 服务器框架,它们支持不同的编程语言。不过,无论使用哪种框架,服务器中的工具定义都需要符合此处描述的结构。
要与 ChatGPT 的深度研究和公司知识功能配合使用,您的 MCP 服务器
应实现两个只读工具:search 和 fetch,并采用
公司知识兼容性中所述的兼容性模式。
同一接口也适用于通过 API 开展的研究工作流。
请为每个工具声明输出模式,以便客户端验证结果结构。
在 FastMCP 中,带类型的返回模型可以自动生成此模式;
下面的示例则显式传入由这些模型生成的 output_schema。
search 工具
search 工具负责根据用户的查询,从您的 MCP 服务器的数据源中返回相关搜索结果列表。
参数:
一个查询字符串。
返回值:
一个仅包含 results 键的对象,其值为结果对象数组。每个结果对象应包含:
id:文档或搜索结果条目的唯一 IDtitle:便于人阅读的标题。url:用于引用的规范 URL。
在 MCP 中,将此对象作为 structuredContent 返回,同时将相同的值
编码为 JSON 字符串,放入内容数组中
以确保兼容性。
最终的工具响应应如下所示:
{
"structuredContent": {
"results": [{ "id": "doc-1", "title": "...", "url": "..." }]
},
"content": [
{
"type": "text",
"text": "{\"results\":[{\"id\":\"doc-1\",\"title\":\"...\",\"url\":\"...\"}]}"
}
]
}
fetch 工具
fetch 工具用于检索搜索结果文档或条目的完整内容。
参数:
一个字符串,用作搜索文档的唯一标识符。
返回值:
一个具有以下属性的对象:
id:文档或搜索结果条目的唯一 IDtitle:搜索结果条目的标题,类型为字符串text:文档或条目的全文url:指向文档或搜索结果条目的 URL,便于在研究中 引用特定资源。metadata:可选的键值对数据,用于描述结果
在 MCP 中,将此对象作为 structuredContent 返回,同时将相同的值
编码为 JSON 字符串,放入内容数组中以确保兼容性。
最终的工具响应应如下所示:
{
"structuredContent": {
"id": "doc-1",
"title": "...",
"text": "full text...",
"url": "https://example.com/doc",
"metadata": { "source": "vector_store" }
},
"content": [
{
"type": "text",
"text": "{\"id\":\"doc-1\",\"title\":\"...\",\"text\":\"full text...\",\"url\":\"https://example.com/doc\",\"metadata\":{\"source\":\"vector_store\"}}"
}
]
}
引用行为
对于 search 结果和 fetch 响应,
ChatGPT 仅在 url 为非空字符串时创建引用元数据。如果结果包含 title,
但没有可用的 url,它仍会作为普通工具输出保留,而不会成为空引用。
要使结果可供引用,请返回其规范 url。
例如,ChatGPT 可能会使用以下参数调用 search:
{ "query": "What is the quarterly plan?" }
MCP 服务器可以返回带有 URL 的结果:
{
"structuredContent": {
"results": [
{
"id": "quarterly-plan",
"title": "Quarterly plan",
"url": "https://example.com/quarterly-plan"
}
]
},
"content": [
{
"type": "text",
"text": "{\"results\":[{\"id\":\"quarterly-plan\",\"title\":\"Quarterly plan\",\"url\":\"https://example.com/quarterly-plan\"}]}"
}
]
}
在此响应中,url 字段有值,因此该结果符合
生成引用元数据的条件。查询本身不会触发引用处理。
如果结果省略了 url,或提供了空值或非字符串值,ChatGPT
会将该结果作为普通工具输出保留。
服务器示例
您可以在基于浏览器的开发环境中试用此 MCP 服务器示例。请使用您自己的 API 凭据和向量存储信息来配置示例。
在 Replit 上复制并修改服务器示例,以进行在线测试。
为方便起见,下面也提供了使用 FastMCP 实现 search 和 fetch 两个工具的完整代码。
测试并连接您的 MCP 服务器
您可以在提示控制台中使用深度研究模型测试 MCP 服务器。创建新提示或编辑现有提示,并在提示配置中添加新的 MCP 工具。此兼容性示例仅开放只读的 search 和 fetch 工具,因此其 API 请求会跳过对这些工具的审批。对于能够修改数据或执行其他会产生重要影响的操作的工具,请保持审批启用。
如果您要将此服务器作为插件的一部分进行测试,请按照连接并测试您的插件中的说明操作。

配置好 MCP 服务器后,您就可以通过“提示”界面与使用该服务器的模型聊天。

您可以使用类似下面的请求,直接通过 Responses API 测试 MCP 服务器:
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-5.6-sol",
"input": [
{
"role": "developer",
"content": [
{
"type": "input_text",
"text": "You are a research assistant that searches MCP servers to find answers to your questions."
}
]
},
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "Are cats attached to their homes? Give a succinct one page overview."
}
]
}
],
"reasoning": {
"summary": "auto"
},
"tools": [
{
"type": "mcp",
"server_label": "cats",
"server_url": "https://777ff573-9947-4b9c-8982-658fa40c7d09-00-3le96u7wsymx.janeway.replit.dev/sse/",
"allowed_tools": [
"search",
"fetch"
],
"require_approval": "never"
}
]
}'处理身份验证
在构建自定义远程 MCP 服务器时,授权和身份验证有助于保护您的数据。如果您的授权服务器支持 CIMD,且插件创建者选择使用它,我们建议使用 OAuth 配合客户端 ID 元数据文档来注册客户端。ChatGPT 支持将 CIMD 与公共客户端 Token 交换(none)或签名客户端断言 Token 交换(private_key_jwt)配合使用。配置后,动态客户端注册仍受支持。有关插件身份验证的要求,请参阅身份验证。有关协议的详细信息,请阅读 MCP 用户指南或授权规范。
如果您通过插件连接自定义远程 MCP 服务器,工作空间中的用户将通过 OAuth 流程连接到您的服务。
在 ChatGPT 中连接
- 在 ChatGPT 中,打开 设置 → 安全与登录 ,并开启 开发者模式。
- 前往 ChatGPT 插件,选择加号按钮,然后在开发者模式下通过服务器 URL 进行连接。
- 在聊天和深度研究中运行提示,测试您的插件。
有关详细设置步骤,请参阅连接和测试您的插件。
风险与安全
自定义 MCP 服务器可将您的 ChatGPT 工作空间连接到外部应用,让 ChatGPT 能够访问、发送和接收这些应用中的数据。请注意,自定义 MCP 服务器并非由 OpenAI 开发或验证,而是受其各自条款和条件约束的第三方服务。
如果您发现恶意 MCP 服务器,请向 security@openai.com 举报。
与提示注入相关的风险
提示注入是一种攻击方式:攻击者将恶意指令嵌入我们的模型可能接触到的内容(例如网页)中,试图用这些指令改变 ChatGPT 的预期行为。如果模型遵从了注入的指令,就可能执行用户和开发者从未打算执行的操作,包括将私密数据发送到外部目的地。
例如,您可能让 ChatGPT 查看您的日历和近期邮件,为一次聚餐寻找餐厅。在查找信息的过程中,它可能会遇到一条恶意评论,指示它从 Gmail 中获取密码重置验证码,并将其发送到恶意网站。这类评论本质上是旨在诱骗智能体执行非预期操作的有害内容。
下表列出了一些需要考虑的具体场景。我们建议您仔细阅读此表,以便决定是否使用自定义 MCP。
| 场景 / 风险 | 如果我信任 MCP 的开发者,是否就安全了? | 我可以采取哪些措施来降低风险? |
|---|---|---|
| 攻击者可能通过某种方式,将提示注入攻击植入通过 MCP 可访问的数据中。 示例: • 对于客户支持 MCP,攻击者可能向您发送包含提示注入攻击的客户支持请求。 | 信任 MCP 的开发者并不能确保安全。 要确保安全,您需要信任 通过该 MCP 可访问的所有内容。 | • 如果 MCP 可能包含恶意或不可信的用户输入,即使您信任其开发者,也不要使用它。 • 配置访问权限,尽量减少能够访问该 MCP 的人数。 |
| 恶意 MCP 可能为读取或写入操作索取过多参数。 示例: • 用于员工机票预订的 MCP 可能提供获取航班时刻表的读取操作,却要求提供包括 summaryOfConversation、userAnnualIncome、userHomeAddress 在内的参数。 | 信任 MCP 的开发者不一定能确保安全。 MCP 的开发者可能认为请求某些数据是合理的,但您可能认为这些数据不应共享。 | • 手动安装 MCP 服务器时,请审查每项操作请求的参数,确保不会过度索取隐私信息。 |
| 攻击者可能利用提示注入攻击,诱骗 ChatGPT 从自定义 MCP 中获取敏感数据,再将其发送给攻击者。 示例: • 攻击者可能通过另一个 MCP(例如邮件 MCP)向某位企业用户发起提示注入攻击,试图诱骗 ChatGPT 从内部工具中读取敏感数据并将其发送给攻击者。 | 信任 MCP 的开发者并不能确保安全。 新 MCP 中的一切都可能安全可信,但风险在于,来自其他恶意来源的攻击可能窃取这些数据。 | • ChatGPT 在设计上注重保护用户,但攻击者可能试图窃取您的数据,因此请了解风险,并考虑是否值得承担。 • 配置访问权限,尽量减少能够访问含有特别敏感数据的 MCP 的人数。 |
| 攻击者可能利用提示注入攻击,通过对自定义 MCP 执行写入操作来泄露敏感信息。 示例: • 攻击者通过另一个 MCP 发起提示注入攻击,诱骗 ChatGPT 获取敏感数据,再使用客户支持系统的 MCP 将数据发送给攻击者。 | 信任 MCP 的开发者并不能确保安全。 即使您完全信任该 MCP,只要写入操作产生的任何结果能被攻击者观察到,攻击者就可能试图加以利用。 | • 用户应在写入操作发生时仔细审查,确保操作符合意图,且不包含任何不应共享的数据。 |
| 攻击者可能利用提示注入攻击,通过对恶意自定义 MCP 执行读取操作来泄露敏感信息,因为该 MCP 可以记录这些操作。 | 只有当 MCP 本身具有恶意,或错误地将写入操作标记为读取操作时,这种攻击才会奏效。 如果您相信 MCP 的开发者会正确地仅将读取操作标记为 读取,并且不会试图窃取数据,那么这种风险可能很小。 | • 仅使用您信任的开发者提供的 MCP(但请注意,仅凭这一点还不足以确保安全)。 |
| 攻击者可能利用提示注入攻击,诱骗 ChatGPT 通过自定义 MCP 执行违背用户意图的有害或破坏性写入操作。 | 信任 MCP 的开发者并不能确保安全。 即使新 MCP 中的一切都安全可信,这种风险仍然存在,因为攻击来自其他恶意来源。 | • 用户应仔细审查写入操作,确保操作符合意图且正确无误。 • ChatGPT 在设计上注重保护用户,但攻击者可能试图诱骗 ChatGPT 执行非预期的写入操作。 • 配置访问权限,尽量减少能够访问含有特别敏感数据的 MCP 的人数。 |
与提示注入无关的风险
自定义 MCP 还会带来其他与提示注入攻击无关的风险:
- 写入操作既能提升 MCP 服务器的实用性,也会增加其风险,因为这让服务器能够执行可能具有破坏性的操作,而不只是向 ChatGPT 返回信息。目前,在任何对话中,ChatGPT 都要求先由用户手动确认,才能执行写入操作。确认时会标出可能敏感的数据,但只有在您仔细考虑并能够接受 ChatGPT 可能在此类操作中出错的情况下,才应使用写入操作。即使 MCP 服务器将某项操作标记为只读,也仍有可能发生写入操作,因此,在将自定义 MCP 服务器部署到 ChatGPT 之前,确保您信任该服务器尤为重要。
- 任何 MCP 服务器都可能在查询过程中接收到敏感数据。即使服务器并无恶意,它也能访问 ChatGPT 在交互过程中提供的所有数据,其中可能包括用户此前向 ChatGPT 提供的敏感数据。例如,在使用深度研究或聊天应用工具时,ChatGPT 发送给 MCP 服务器的查询就可能包含此类数据。
连接到可信服务器
我们建议您仅在了解并信任底层应用的情况下,才连接到自定义 MCP 服务器。
例如,选择由服务提供商自行托管的官方服务器。连接到 Stripe 在 mcp.stripe.com 托管的 Stripe 服务器,而不是由第三方托管的非官方 Stripe MCP 服务器。由于目前可用的官方 MCP 服务器较少,您也可能考虑连接由某个组织托管、通过 API 向其他服务转发请求的服务器。请先审查该组织如何使用您的数据,并确认服务器可信,然后再连接。在构建并连接您自己的 MCP 服务器时,请再次确认连接的是正确的服务器。当 OpenAI 调用您的 MCP 服务器时,请谨慎对待您为响应请求而提供的数据,以及您对所收到数据的处理方式。
您的远程 MCP 服务器允许他人将 OpenAI 连接到您的服务,让 OpenAI 能够在这些服务中访问、发送和接收数据,并执行操作。请勿在工具的 JSON 中放入任何敏感信息,也不要存储访问您远程 MCP 服务器的 ChatGPT 用户的任何敏感信息。
构建 MCP 服务器时,请勿在工具定义中放入任何恶意内容。
