For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション
Theme

プラグインや API 連携に使う MCP サーバーの構築

プラグイン、deep research、API 連携で使える MCP サーバーを構築します。

Model Context Protocol(MCP)は、AI モデルにツールや知識を追加するためのオープンプロトコルで、業界標準になりつつあります。リモート MCP サーバーを使うと、モデルはインターネット経由で新たなデータソースに接続し、新しい機能を利用できます。

このガイドでは、非公開のデータソース(ベクトルストア)からデータを読み取るリモート MCP サーバーを構築します。読み取ったデータは、ChatGPT と Codex のプラグイン、ChatGPT の deep research と社内ナレッジ、または API を通じて利用できます。

注:MCP サーバーを使うプラグインを構築する場合は、まずプラグインのドキュメントのクイックスタート、MCP サーバーの構築、プラグインの接続とテスト、認証を参照してください。MCP サーバーに UI が不要な場合は、UI リソースを用意せずにツールを公開できます。

データソースの設定

リモート MCP サーバーでは任意のソースのデータを利用できますが、ここでは手順を簡単にするため、OpenAI API のベクトルストアを使います。まず、新しいベクトルストアに PDF 文書をアップロードします。サンプルには猫について書かれた 19 世紀のパブリックドメインの書籍を利用できます。

ダッシュボードからファイルをアップロードしてベクトルストアを作成できます。API 経由でベクトルストアを作成し、ファイルをアップロードすることもできます。ベクトルストアのガイドに沿ってベクトルストアを設定し、ファイルをアップロードしてください。

後の例で使うため、ベクトルストアの一意の ID を控えておきます。

ベクトルストアの設定

MCP サーバーの作成

次に、ベクトルストアを検索し、指定された ID に対応するファイルの本文を返すリモート MCP サーバーを作成します。

この例では、Python と FastMCP を使って MCP サーバーを構築します。このセクションの最後に、サーバーの実装全体と、ブラウザベースの開発環境で実行する手順を掲載しています。

MCP サーバーの構築には、さまざまなプログラミング言語に対応した他のフレームワークも使えます。どのフレームワークを使う場合も、サーバーのツール定義はここで説明する形式に従う必要があります。

ChatGPT の deep research と社内ナレッジで使うには、MCP サーバーに読み取り専用ツール search と fetch を実装してください。社内ナレッジとの互換性に記載されている互換スキーマを使います。同じインターフェースは、API 経由の調査ワークフローにも役立ちます。

クライアントが結果の形式を検証できるよう、ツールごとに出力スキーマを宣言してください。FastMCP では、戻り値の型を定義したモデルからスキーマを自動生成できます。以下の例では、同じモデルから生成したスキーマを output_schema に明示的に渡します。

search ツール

search ツールは、ユーザーのクエリに関連する項目を MCP サーバーのデータソースから検索し、結果を一覧で返します。

引数:

クエリを表す文字列を 1 つ指定します。

戻り値:

results を唯一のキーとし、その値が検索結果オブジェクトの配列であるオブジェクトを返します。各検索結果オブジェクトには次の項目を含めてください。

  • id:文書または検索結果の項目を一意に識別する ID
  • title:人が読んで理解できるタイトル
  • url:引用に使う正規 URL

MCP では、このオブジェクトを structuredContent として返します。互換性を保つため、同じ値を JSON 形式の文字列にエンコードしてコンテンツ配列にも含めます。

ツールが返す最終的なレスポンスは次のようになります。

{
  "structuredContent": {
    "results": [{ "id": "doc-1", "title": "...", "url": "..." }]
  },
  "content": [
    {
      "type": "text",
      "text": "{\"results\":[{\"id\":\"doc-1\",\"title\":\"...\",\"url\":\"...\"}]}"
    }
  ]
}

fetch ツール

fetch ツールは、検索結果の文書または項目の内容をすべて取得します。

引数:

検索結果の文書を一意に識別する文字列を指定します。

戻り値:

次のプロパティを持つオブジェクトを 1 つ返します。

  • id:文書または検索結果の項目を一意に識別する ID
  • title:検索結果の項目のタイトルを表す文字列
  • 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 を 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 上の MCP サーバーの実装例

Replit でサーバーのサンプルをリミックスして、実際に動作を確認できます。

以下では、FastMCP を使った search ツールと fetch ツールの実装全体も確認できます。

MCP サーバーのテストと接続

gpt-6.1-sol を使って、プロンプトのダッシュボードで 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-6.1-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 に対応しており、パブリッククライアントによるトークン交換(none)と、署名付きクライアントアサーションによるトークン交換(private_key_jwt)を利用できます。動的クライアント登録も、設定すれば引き続き利用できます。プラグインの認証要件については認証を参照してください。プロトコルの詳細については、MCP ユーザーガイドまたは認可仕様を参照してください。

カスタムのリモート MCP サーバーをプラグイン経由で接続すると、ワークスペースのユーザーは OAuth フローを通じてサービスへのアクセスを許可できます。

ChatGPT での接続

  1. ChatGPT のプラグインを開き、プラスボタンを選択してから、カスタム MCP サーバーを追加を選択します。
  2. サーバーの URL と認証情報を入力します。リスクに関する警告を確認し、理解したうえで続行、プラグインとして作成の順に選択します。
  3. プラグインをインストールし、チャットと deep research でプロンプトを実行してテストします。

詳しい設定手順については、プラグインの接続とテストを参照してください。

リスクと安全性

カスタム MCP サーバーを使うと、ChatGPT のワークスペースを外部アプリケーションに接続できます。これにより、ChatGPT は外部アプリケーションのデータにアクセスし、データを送受信できるようになります。カスタム MCP サーバーは第三者が提供するサービスであり、OpenAI による開発や検証は行われていません。各サービスの利用規約が適用されます。

悪意のある MCP サーバーを見つけた場合は、security@openai.com まで報告してください。

プロンプトインジェクションに伴うリスク

プロンプトインジェクションとは、ChatGPT を本来想定されている動作から逸脱させるために、攻撃者がウェブページなど、OpenAI のモデルが読み取る可能性の高いコンテンツに悪意のある指示を埋め込む攻撃です。モデルがその指示に従うと、非公開データを外部に送信するなど、ユーザーも開発者も意図していない操作を実行するおそれがあります。

たとえば、ChatGPT にカレンダーと最近のメールを確認して、グループでの夕食に適したレストランを探すよう依頼したとします。調査の途中で、Gmail からパスワードのリセットコードを取得して悪意のあるウェブサイトに送信するよう指示するコメントを読み取るかもしれません。これは、エージェントをだまして意図しない操作を実行させるために仕込まれた有害なコンテンツです。

以下の表に、考慮すべき具体的なシナリオを示します。カスタム MCP サーバーを使うかどうかを判断する際は、各シナリオをよく確認してください。

シナリオとリスク MCP サーバーの開発者を信頼していれば安全ですか? リスクを減らすにはどうすればよいですか?
攻撃者が何らかの方法で、MCP サーバーからアクセスできるデータにプロンプトインジェクションを仕込むおそれがあります。

例:
• カスタマーサポート用の MCP サーバーでは、攻撃者が悪意のある指示を含む問い合わせを送ってくる可能性があります。
MCP サーバーの開発者を信頼していても、この攻撃は防げません。

安全に利用するには、MCP サーバーからアクセスできるすべてのコンテンツを信頼できる必要があります。
• 悪意のある入力や信頼できないユーザー入力が含まれる可能性がある場合は、開発者を信頼していても、その MCP サーバーを使用しないでください。
• アクセス権を設定し、MCP サーバーを利用できる人を必要最小限に絞ってください。
悪意のある MCP サーバーが、読み取りや書き込みに必要な範囲を超えてパラメータを要求するおそれがあります。

例:
• 社員向けの航空券予約用 MCP サーバーが、フライトスケジュールを取得する読み取り操作を提供しながら、summaryOfConversation、userAnnualIncome、userHomeAddress などのパラメータを要求する場合があります。
MCP サーバーの開発者を信頼していても、安全とは限りません。

利用者が共有すべきではないと考えるデータでも、開発者は要求してよいと判断している場合があります。
• MCP サーバーを手動でインストールする際は、各操作で要求されるパラメータを確認し、プライバシーを侵害するような過剰な要求がないことを確かめてください。
攻撃者がプロンプトインジェクションで ChatGPT をだまし、カスタム MCP サーバーから機密データを取得させて、攻撃者に送信させるおそれがあります。

例:
• 攻撃者が別の MCP サーバー(メール用など)を通じて企業のユーザーに悪意のある指示を送り、ChatGPT に社内ツールから機密データを読み取らせて、攻撃者に送信させようとする場合があります。
MCP サーバーの開発者を信頼していても、この攻撃は防げません。

新しい MCP サーバー内のすべてのコンテンツが安全で信頼できても、別の悪意のあるソースからの攻撃によってデータが盗まれるおそれがあります。
• ChatGPT はユーザーを保護するよう設計されていますが、攻撃者がデータを盗もうとする可能性があります。このリスクを理解し、受け入れられるかを検討してください。
• アクセス権を設定し、特に機密性の高いデータを扱う MCP サーバーを利用できる人を必要最小限に絞ってください。
攻撃者がプロンプトインジェクションを使い、カスタム MCP サーバーへの書き込み操作を通じて機密情報を漏えいさせるおそれがあります。

例:
• 攻撃者が別の MCP サーバーを通じて悪意のある指示を送り、ChatGPT に機密データを取得させたうえで、カスタマーサポートシステム用の 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 サーバーを構築する際は、ツール定義に悪意のある内容を含めないでください。