Model Context Protocol(MCP)は、AI モデルにツールや知識を追加して機能を拡張するためのオープンなプロトコルで、業界標準になりつつあります。リモート MCP サーバーを使用すると、インターネット経由でモデルを新たなデータソースや機能に接続できます。
このガイドでは、プライベートなデータソース(ベクトルストア)からデータを読み取り、ChatGPT と Codex のプラグイン、ChatGPT の deep research と社内ナレッジ、および API 経由で利用できるようにするリモート MCP サーバーの構築方法を説明します。
注:MCP サーバーを使ったプラグインを構築するには、まずプラグインのドキュメントの「クイックスタート」、「MCP サーバーの構築」、「プラグインの接続とテスト」、「認証」を参照してください。MCP サーバーに UI が必要ない場合は、UI リソースなしでツールを公開できます。
データソースの設定
リモート MCP サーバーには任意のソースのデータを使用できますが、ここでは簡単にするため、OpenAI API のベクトルストアを使用します。まず、新しいベクトルストアに PDF ドキュメントをアップロードします。サンプルとして、パブリックドメインの、猫に関する 19 世紀の書籍を使用できます。
こちらのダッシュボードでファイルのアップロードとベクトルストアの作成ができます。また、API 経由でベクトルストアを作成してファイルをアップロードすることもできます。ベクトルストアのガイドに従って、ベクトルストアを設定し、ファイルをアップロードしてください。
この後の例で使用するため、ベクトルストアの一意の ID を控えておいてください。

MCP サーバーの作成
次に、ベクトルストアに対して検索クエリを実行し、指定された ID のファイルのドキュメント内容を返せるリモート MCP サーバーを作成します。
この例では、Python と FastMCP を使って MCP サーバーを構築します。このセクションの最後に、サーバーの完全な実装と、ブラウザベースの開発環境で実行する手順を掲載しています。
MCP サーバー向けのフレームワークはほかにも多数あり、さまざまなプログラミング言語で利用できます。ただし、どのフレームワークを使用する場合でも、サーバーのツール定義は、ここで説明する形式に準拠する必要があります。
ChatGPT の deep research と社内ナレッジに対応するには、MCP サーバーに
読み取り専用の 2 つのツール、search と fetch を実装する必要があります。その際は、
「社内ナレッジとの互換性」に記載された互換性スキーマを使用します。
同じインターフェースは、API 経由のリサーチワークフローにも役立ちます。
クライアントが結果の構造を検証できるように、各ツールの出力スキーマを宣言します。
FastMCP では、型付きの戻り値モデルからこのスキーマを自動生成できます。
以下の例では、同じモデルから生成した output_schema を明示的に渡しています。
search ツール
search ツールは、ユーザーのクエリに関連する検索結果の一覧を、MCP サーバーのデータソースから返します。
引数:
単一のクエリ文字列です。
戻り値:
results というキーを 1 つだけ持つオブジェクトです。このキーの値は、結果オブジェクトの配列です。各結果オブジェクトには、以下を含める必要があります。
id- ドキュメントまたは検索結果項目の一意の IDtitle- 人が読んで理解できるタイトルurl- 引用用の正規 URL
MCP では、このオブジェクトを structuredContent として返します。
互換性を確保するため、同じ値を JSON エンコードした文字列として
content 配列にも含めてください。
最終的なツールのレスポンスは、次のようになります。
{
"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 エンコードした文字列として content 配列にも含めてください。
最終的なツールのレスポンスは、次のようになります。
{
"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 サーバーのテストと接続
プロンプトダッシュボードで、deep research モデルを使って MCP サーバーをテストできます。新しいプロンプトを作成するか、既存のプロンプトを編集し、プロンプトの設定に新しい MCP ツールを追加してください。この互換性の実装例では、読み取り専用の search ツールと fetch ツールのみを公開しているため、API リクエストではこれらのツールの承認を省略しています。データを変更したり、その他の重大な影響を伴う操作を実行したりできるツールでは、承認を有効にしておいてください。
プラグインの一部としてこのサーバーをテストする場合は、「プラグインの接続とテスト」の手順に従ってください。

MCP サーバーの設定が完了すると、プロンプト UI から、そのサーバーを利用するモデルとチャットできます。

次のようなリクエストで 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 に対応しており、プラグインの作成者がその方式を選択する場合は、クライアント登録に Client ID Metadata Documents を使用する OAuth を推奨します。ChatGPT は、パブリッククライアントのトークン交換(none)または署名付きクライアントアサーションによるトークン交換(private_key_jwt)を用いた CIMD に対応しています。動的クライアント登録も、設定されていれば引き続き利用できます。プラグインの認証要件については、認証を参照してください。プロトコルの詳細については、MCP ユーザーガイドまたは認可仕様を参照してください。
プラグインを通じてカスタムのリモート MCP サーバーに接続すると、ワークスペースのユーザーには、そのサービスの OAuth フローが表示されます。
ChatGPT での接続
- ChatGPT で 設定 → セキュリティとログイン を開き、 開発者モードを有効にします。
- ChatGPT プラグインを開いてプラスボタンを選択し、開発者モードでサーバーの URL に接続します。
- チャットと deep research でプロンプトを実行して、プラグインをテストします。
詳しいセットアップ手順については、プラグインの接続とテストを参照してください。
リスクと安全性
カスタム MCP サーバーを使用すると、ChatGPT ワークスペースを外部アプリケーションに接続し、ChatGPT がそのアプリケーション内のデータにアクセスしたり、データを送受信したりできるようになります。カスタム MCP サーバーは OpenAI が開発または検証したものではなく、独自の利用条件が適用されるサードパーティのサービスである点にご注意ください。
悪意のある MCP サーバーを見つけた場合は、security@openai.com に報告してください。
プロンプトインジェクションに関連するリスク
プロンプトインジェクションは、ウェブページなど、OpenAI のモデルが接する可能性の高いコンテンツに攻撃者が悪意のある指示を埋め込み、ChatGPT の本来の動作を上書きしようとする攻撃です。モデルが埋め込まれた指示に従うと、非公開データを外部に送信するなど、ユーザーや開発者が意図していない行動を取る可能性があります。
たとえば、カレンダーと最近のメールを確認して、グループでの夕食に適したレストランを探すよう ChatGPT に依頼したとします。その調査中に、Gmail からパスワードのリセットコードを取得し、悪意のあるウェブサイトに送信するよう指示するコメントに遭遇する可能性があります。これは、エージェントをだまして意図しない行動を取らせるために作られた有害なコンテンツです。
以下の表に、考慮すべき具体的なシナリオを示します。カスタム MCP を使用するかどうかを判断する際は、この表をよく確認することをお勧めします。
| シナリオ / リスク | MCP の開発者を信頼していれば安全ですか? | リスクを減らすにはどうすればよいですか? |
|---|---|---|
| 攻撃者が何らかの方法で、MCP 経由でアクセスできるデータにプロンプトインジェクション攻撃を仕込む可能性があります。 例: • カスタマーサポート用の MCP の場合、攻撃者がプロンプトインジェクション攻撃を含むサポートリクエストを送ってくる可能性があります。 | MCP の開発者を信頼していても、安全とはいえません。 安全であるためには、 MCP 内でアクセスできるすべてのコンテンツを信頼できる必要があります。 | • MCP の開発者を信頼していても、悪意のある入力や信頼できないユーザー入力が含まれる可能性がある場合は、その MCP を使用しないでください。 • MCP にアクセスできる人数を最小限に抑えるよう、アクセス権を設定してください。 |
| 悪意のある MCP は、読み取りや書き込みのアクションで過剰なパラメーターを要求する可能性があります。 例: • 従業員向けの航空券予約用 MCP が、フライトスケジュールを取得する読み取りアクションを提供しながら、 summaryOfConversation、userAnnualIncome、userHomeAddress などのパラメーターを要求する可能性があります。 | MCP の開発者を信頼していても、必ずしも安全とはいえません。 ユーザーが共有すべきでないと考えるデータでも、MCP の開発者はその要求が妥当だと考えている可能性があります。 | • MCP サーバーを手動でインストールする際は、各アクションが要求するパラメーターを確認し、プライバシーに過度に踏み込むものがないか確かめてください。 |
| 攻撃者がプロンプトインジェクション攻撃で ChatGPT をだまし、カスタム MCP から機密データを取得させ、攻撃者に送信させる可能性があります。 例: • 攻撃者が別の MCP(メールなど)を通じて企業のユーザーにプロンプトインジェクション攻撃を仕掛け、ChatGPT に社内ツールから機密データを読み取らせ、攻撃者へ送信させようとする可能性があります。 | MCP の開発者を信頼していても、安全とはいえません。 新しい MCP 内のすべてが安全で信頼できるとしても、別の悪意のあるソースからの攻撃によって、そのデータが盗まれるリスクがあります。 | • ChatGPT はユーザーを保護するように設計されていますが、攻撃者がデータを盗もうとする可能性があります。このリスクを認識し、受け入れることが妥当かどうか検討してください。 • 特に機密性の高いデータを扱う MCP にアクセスできる人数を最小限に抑えるよう、アクセス権を設定してください。 |
| 攻撃者がプロンプトインジェクション攻撃を利用し、カスタム MCP への書き込みアクションを通じて機密情報を漏えいさせる可能性があります。 例: • 攻撃者が別の MCP を通じてプロンプトインジェクション攻撃を仕掛け、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 に提供した機密データが含まれる可能性もあります。たとえば、deep research やチャットアプリのツールを使用する際に、ChatGPT が MCP サーバーへ送るクエリに、そうしたデータが含まれる場合があります。
信頼できるサーバーへの接続
接続先のアプリケーションを理解し、信頼できる場合を除き、カスタム MCP サーバーには接続しないことをお勧めします。
たとえば、サービスプロバイダー自身がホストする公式サーバーを選んでください。Stripe の場合、サードパーティがホストする非公式の Stripe MCP サーバーではなく、Stripe が mcp.stripe.com でホストするサーバーに接続します。現在は公式の MCP サーバーが少ないため、API を通じて別のサービスへのリクエストを中継する組織がホストするサーバーを検討することもあるでしょう。その組織がデータをどのように利用するかを確認し、サーバーを信頼できると判断してから接続してください。自分で MCP サーバーを構築して接続する場合も、接続先が正しいサーバーであることを再確認してください。OpenAI が MCP サーバーを呼び出す際は、リクエストへの応答として提供するデータと、受信したデータの扱いに注意してください。
リモート MCP サーバーを使用すると、ほかのユーザーが OpenAI をそのサービスに接続でき、OpenAI がサービス内のデータにアクセスしたり、データを送受信したり、アクションを実行したりできるようになります。ツールの JSON には機密情報を含めないでください。また、リモート MCP サーバーにアクセスする ChatGPT ユーザーの機密情報を保存しないでください。
MCP サーバーを構築する際は、ツール定義に悪意のある内容を含めないでください。
