模型上下文协议 (MCP) 是一种开放协议,正逐渐成为通过额外的工具和知识来扩展 AI 模型的行业标准。远程 MCP 服务器可用于通过互联网将模型连接到新的数据源和功能。
在本指南中,我们将介绍如何构建一个远程 MCP 服务器,用于从私有数据源(即 向量存储)中读取数据,并将其作为仅数据应用(以前称为连接器)在 ChatGPT 中提供,用于聊天、深度研究和公司知识,以及 通过 API.
注释: 有关 ChatGPT 应用的设置(开发者模式、连接您的 MCP 服务器以及可选 UI),请从 Apps SDK 文档开始: 快速入门, 构建你的 MCP 服务器, 从 ChatGPT 连接,且 身份验证。如果您正在构建仅数据应用,可以跳过 UI 资源,只需暴露工具即可。
术语更新: As of 2025 年 12 月 17 日, ChatGPT 已将连接器重命名为应用。现有功能保持不变,但当前的文档和产品 UI 均使用“应用”一词。请参阅帮助中心更新: ChatGPT 应用与同步, ChatGPT 中的企业知识,且 应用中的管理员控制、安全与合规.
配置数据源
你可以使用来自任意数据源的数据来驱动远程 MCP 服务器,但为了简便起见,我们将使用 向量存储 在 OpenAI API 中。首先,将一份 PDF 文档上传至新的向量存储—— 你可以使用这本关于猫的公有领域 19 世纪书籍 for an example.
你可以上传文件并创建向量存储 in the dashboard here,或者你也可以通过 API 创建向量存储并上传文件。 请按照向量存储指南 来设置向量存储并上传文件至其中。
记下该向量存储的唯一 ID,以便在接下来的示例中使用。

创建 MCP 服务器
接下来,让我们创建一个远程 MCP 服务器,它将针对我们的向量存储执行搜索查询,并能够根据给定的 ID 返回文件内容。
在本例中,我们将使用 Python 和 FastMCP来构建我们的 MCP 服务器。本节末尾将提供服务器的完整实现代码,以及在 Replit.
请注意,还有许多其他的 MCP 服务器框架可供您在不同的编程语言中使用。但无论您使用哪种框架,服务器中的工具定义都必须符合此处描述的结构。
要使用 ChatGPT 深度研究及公司知识功能(以及通过 API 进行的深度研究),您的 MCP 服务器应当实现两个只读工具: search and fetch,使用兼容性架构,详见 公司知识兼容性.
为每个工具声明一个输出 schema,以便客户端验证结果的结构。在 FastMCP 中,带类型的返回模型可以自动生成此 schema;下面的示例使用相同的模型显式传递了 output_schema 明确来自相同的模型。
search 工具
The search 工具负责根据用户的查询,从您的 MCP 服务器的数据源中返回相关的搜索结果列表。
Arguments:
A single query string.
Returns:
一个具有单一键的对象, results,其值为结果对象数组。每个结果对象应包含:
id- 文档或搜索结果项的唯一 IDtitle- 人类可读的标题。url- 用于引用的规范 URL。
在 MCP 中,将此对象作为 structuredContent 返回,并将相同的值作为 JSON 编码的字符串包含在 content 数组
for compatibility.
最终的工具响应应如下所示:
1
2
3
4
5
6
7
8
9
10
11
{
"structuredContent": {
"results": [{ "id": "doc-1", "title": "...", "url": "..." }]
},
"content": [
{
"type": "text",
"text": "{\"results\":[{\"id\":\"doc-1\",\"title\":\"...\",\"url\":\"...\"}]}"
}
]
}fetch 工具
fetch 工具用于检索搜索结果文档或条目的完整内容。
Arguments:
作为搜索文档唯一标识符的字符串。
Returns:
一个包含以下属性的对象:
id- 文档或搜索结果项的唯一 IDtitle- 搜索结果条目的字符串标题text- 文档或条目的全文url- 文档或搜索结果项的 URL。有助于在研究中引用特定资源。metadata- 关于结果的可选键值对数据
在 MCP 中,将此对象作为 structuredContent 并在 content 数组中包含一个相同的、经 JSON 编码的字符串,以保持兼容性。
最终的工具响应应如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"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\"}}"
}
]
}服务器示例
试用此示例 MCP 服务器的一个简单方法是使用 Replit。您可以使用自己的 API 凭据和向量存储信息来配置此示例应用程序,以便亲自尝试。
在 Replit 上复刻 (Remix) 服务器示例以进行实时测试。
这两个 search and fetch 工具在 FastMCP 中的完整实现如下,以方便您使用。
测试并连接您的 MCP 服务器
您可以使用深度研究模型测试您的 MCP 服务器 in the prompts dashboard。创建一个新提示词,或编辑一个现有提示词,并将新的 MCP 工具添加到提示词配置中。请记住,通过 API 用于深度研究的 MCP 服务器必须配置为无需批准。
如果您在 ChatGPT 中作为应用测试此服务器,请按照以下步骤操作 从 ChatGPT 连接.

配置好 MCP 服务器后,您可以通过 Prompts UI 使用它与模型进行对话。

您可以直接使用 Responses API 测试 MCP 服务器,请求示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
curl https://api.openai.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "o4-mini-deep-research",
"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 服务器的开发者,授权和身份验证有助于保护您的数据。我们建议使用 OAuth 配合 客户端 ID 元数据文档 在您的授权服务器支持 CIMD 且连接器创建者选择使用它的情况下,用于客户端注册。ChatGPT 支持带有公开客户端令牌交换(none)或签名客户端断言令牌交换(private_key_jwt)的 CIMD。动态客户端注册在配置后仍受支持。有关 ChatGPT 应用身份验证要求,请参见 身份验证。有关协议详情,请阅读 MCP 用户指南 or the 授权规范.
如果您在 ChatGPT 中作为应用连接自定义远程 MCP 服务器,您工作区中的用户将获得一个通往您应用程序的 OAuth 流程。
在 ChatGPT 中连接
- 在以下位置导入您的远程 MCP 服务器: ChatGPT 设置.
- 在以下位置创建并配置您的应用: 应用与连接器 使用您的服务器 URL。
- 通过在聊天和深度研究中运行提示来测试您的应用。
有关详细的设置步骤,请参见 从 ChatGPT 连接.
风险与安全
自定义 MCP 服务器允许您将 ChatGPT 工作区连接到外部应用程序,从而使 ChatGPT 能够在这些应用程序中访问、发送和接收数据。请注意,自定义 MCP 服务器并非由 OpenAI 开发或验证,属于第三方服务,受其自身条款和条件的约束。
如果你遇到恶意的 MCP 服务器,请向 security@openai.com.
提示注入相关风险
提示注入是一种攻击形式,攻击者将恶意指令嵌入到我们的模型可能遇到的内容(例如网页)中,意图使这些指令覆盖 ChatGPT 的预期行为。如果模型服从了注入的指令,它可能会执行用户和开发者从未意图的操作——包括将私人数据发送到外部目的地。
例如,您可能会要求 ChatGPT 通过检查您的日历和最近的电子邮件来为集体聚餐寻找一家餐厅。在研究过程中,它可能会遇到一条恶意评论——本质上是一段旨在欺骗智能体执行意外操作的有害内容——该评论指示它从 Gmail 中检索密码重置代码并将其发送到恶意网站。
下面是一个需要考虑的具体场景表格。我们建议仔细查阅此表格,以便为您决定是否使用自定义 MCP 提供参考。
| 场景 / 风险 | 如果我信任 MCP 的开发者,这安全吗? | 我可以采取什么措施来降低风险? |
|---|---|---|
| 攻击者可能通过某种方式将提示注入攻击插入到可通过 MCP 访问的数据中。 Examples: • 对于客户支持 MCP,攻击者可能会向您发送包含提示注入攻击的客户支持请求。 | 信任 MCP 的开发者并不能保证其安全。 要确保安全,您需要信任 可通过 MCP 访问的所有内容. | • 即使您信任 MCP 的开发者,如果 MCP 可能包含恶意或不受信任的用户输入,也不要使用。 • 配置访问权限以尽可能减少有权访问该 MCP 的人员数量。 |
| 恶意 MCP 可能会为读取或写入操作请求过多的参数。 Example: • 一个员工航班预订 MCP 可能会公开一个用于获取航班时刻表的读取操作,但请求的参数包括 summaryOfConversation, userAnnualIncome, userHomeAddress. | 信任 MCP 的开发者并不一定能保证其安全。 MCP 的开发者可能认为请求某些数据是合理的,而您认为共享这些数据是不可接受的。 | • 在旁加载 MCP 时,请仔细检查为每个操作请求的参数,并确保不存在隐私过度收集的情况。 |
| 攻击者可能会利用提示注入攻击欺骗 ChatGPT 从自定义 MCP 中获取敏感数据,然后将其发送给攻击者。 Example: • 攻击者可能会通过不同的 MCP(例如用于电子邮件的 MCP)向某位企业用户发送提示注入攻击,该攻击试图欺骗 ChatGPT 从某个内部工具 MCP 读取敏感数据,然后尝试将其窃取。 | 信任 MCP 的开发者并不能保证其安全。 新 MCP 中的所有内容都可能是安全且受信任的,因为风险在于这些数据会被来自不同恶意源的攻击窃取。 | • ChatGPT 旨在保护用户, 但攻击者可能会试图窃取您的数据,因此请务必注意此风险,并权衡是否值得冒险。 • 配置访问权限以尽可能减少有权访问包含特别敏感数据的 MCP 的人员数量。 |
| 攻击者可能会利用提示注入攻击,通过对自定义 MCP 的写入操作窃取敏感信息。 Example: • 攻击者利用提示注入攻击(通过不同的 MCP)欺骗 ChatGPT 获取敏感数据,然后通过欺骗 ChatGPT 使用客户支持系统的 MCP 将其发送给攻击者来进行窃取。 | 信任 MCP 的开发者并不能保证其安全。 即使您完全信任该 MCP,如果写入操作具有攻击者可以观察到的任何后果,他们也可能试图利用这一点。 | • 用户在执行写入操作时应仔细审查(以确保这些操作是预期的,并且不包含不应共享的任何数据)。 |
| 攻击者可能会利用提示注入攻击,通过对恶意自定义 MCP 的读取操作窃取敏感信息(因为这些操作可以被 MCP 记录)。 | 此攻击仅在 MCP 为恶意,或者 MCP 错误地将写入操作标记为读取操作时才会奏效。 如果您信任 MCP 的开发者能正确地仅将读取操作标记为 阅读, 并且信任该开发者不会试图窃取数据,那么这种风险可能微乎其微。 | • 仅使用您信任的开发者的 MCP(但请注意这并不足以确保安全)。 |
| 攻击者可能会利用提示注入攻击,欺骗 ChatGPT 通过自定义 MCP 执行用户非预期的有害或破坏性写入操作。 | 信任 MCP 的开发者并不能保证其安全。 新 MCP 中的所有内容都可能是安全且受信任的,并且这种风险依然存在,因为攻击来自不同的恶意来源。 | • 用户应仔细审查写入操作,以确保其是预期且正确的。 • ChatGPT 旨在保护用户,但攻击者可能会试图欺骗 ChatGPT 执行非预期的写入操作。 • 配置访问权限以尽可能减少有权访问包含特别敏感数据的 MCP 的人员数量。 |
非提示注入相关风险
自定义 MCP 还有其他与提示注入攻击无关的额外风险:
- 写操作可能会同时增加 MCP 服务器的实用性和风险, 因为它们使服务器能够采取潜在的破坏性操作,而不是仅仅将信息返回给 ChatGPT。在执行写入操作之前,ChatGPT 目前在任何对话中都需要人工确认。该确认会标记潜在的敏感数据,但您只应在经过仔细考虑并且能够接受 ChatGPT 可能在此类操作中犯错的情况下才使用写入操作。即使 MCP 服务器已将该操作标记为只读,也有可能发生写入操作,这使得在部署到 ChatGPT 之前信任自定义 MCP 服务器变得更加重要。
- 任何 MCP 服务器在执行查询时都可能接收到敏感数据。即使服务器没有恶意,它也能访问 ChatGPT 在交互过程中提供的所有数据,其中可能包含用户先前提供给 ChatGPT 的敏感数据。例如,当使用深度研究或聊天应用工具时,此类数据可能包含在 ChatGPT 发送给 MCP 服务器的查询中。
连接到受信任的服务器
我们建议您在了解并信任底层应用之前,不要连接自定义的 MCP 服务器。
例如,始终选择服务提供商自己托管的官方服务器(例如,连接到由 Stripe 自己在 mcp.stripe.com 上托管的 Stripe 服务器,而不是由第三方托管的非官方 Stripe MCP 服务器)。由于目前官方的 MCP 服务器并不多,您可能会倾向于使用由不运营该服务器的组织托管的 MCP 服务器,这类服务器仅仅通过 API 将请求代理到该服务。我们不建议这样做——您只应在仔细审查 MCP 服务器如何使用您的数据,并确认可以信任该服务器后,再进行连接。在构建并连接您自己的 MCP 服务器时,请仔细核实其是否为正确的服务器。请格外谨慎地处理您在响应 MCP 服务器请求时所提供的数据,以及您对待 OpenAI 调用您的 MCP 服务器时发送给您的数据的方式。
您的远程 MCP 服务器允许他人将 OpenAI 连接到您的服务,并允许 OpenAI 访问、发送和接收数据,以及在这些服务中执行操作。请避免在工具的 JSON 中放入任何敏感信息,并避免存储访问您远程 MCP 服务器的 ChatGPT 用户的任何敏感信息。
作为 MCP 服务器的构建者,请不要在您的工具定义中放入任何恶意内容。
