MCP プロトコルの基礎

「AIに社内データを見せられない」を打破。MCPプロトコルで実現するセキュアなツール連携の全手順

この記事は急速に進化する技術について解説しています。最新情報は公式ドキュメントをご確認ください。

約18分で読めます
文字サイズ:
「AIに社内データを見せられない」を打破。MCPプロトコルで実現するセキュアなツール連携の全手順
目次

この記事の要点

  • AIと社内データを安全かつ効率的に連携させるMCPの仕組み
  • 個別API開発の課題を解決し、開発工数と保守コストを削減
  • AIガバナンスを強化し、シャドーAIや情報漏洩リスクを低減

社内システムへのAI導入を検討する際、最も高いハードルとなるのが「自社データをいかに安全にAIへ参照させるか」というデータ連携の課題ではないでしょうか。

「クラウド上のAIモデルに機密データや顧客情報を直接送信することは、社内のセキュリティポリシー上許可されない」
「かといって、データを参照できない汎用的なAIでは、業務に直結する具体的な回答が得られず、ROI(投資対効果)が見合わない」

このようなジレンマは、多くのエンタープライズ企業で報告されています。これまでは、各社が独自のAPIゲートウェイを開発し、複雑な認証認可の仕組みを個別に構築する必要がありました。これには莫大な開発コストとセキュリティリスクが伴い、AI導入がPoC(概念実証)の段階で頓挫する大きな要因となっていました。

この課題に対する画期的なブレイクスルーとして注目を集めているのが、Anthropic社が提唱するオープンスタンダード「MCP(Model Context Protocol)」です。

MCPは、AIモデルとデータソース(ローカルファイル、社内データベース、外部SaaSなど)を安全かつ標準化された方法で接続するためのプロトコルです。本記事では、MCPの技術的な基礎から、Claude Desktopを用いた具体的な接続設定、そして自社専用のMCPサーバーを構築する手順まで、IT部門の責任者やエンジニアが実務で活用できるレベルまで深掘りして解説します。

MCP(Model Context Protocol)がAI活用の「接続性」をどう変えるのか

AIを単なる「チャットボット」から、自律的に業務を支援する「エージェント」へと進化させるためには、AIがコンテキスト(文脈や背景情報)となるデータに直接アクセスできる環境が不可欠です。MCPは、このデータアクセスを標準化することで、AIエコシステム全体にパラダイムシフトをもたらしています。

既存のAPI連携との決定的な違い

従来のAIとシステム間の連携は、システムごとに異なるAPI仕様(REST、GraphQLなど)に合わせて、個別のインテグレーションコードを記述する必要がありました。例えば、Slackからメッセージを取得し、Google Driveから関連ドキュメントを検索し、社内のPostgreSQLデータベースと照合するAIエージェントを構築する場合、それぞれのAPIの認証方式、エンドポイントの仕様、エラーハンドリングを個別に実装し、維持管理しなければなりません。

一方、MCPは「AIモデルが外部ツールやデータソースと通信するための共通言語」として機能します。MCPに対応したサーバー(データ提供側)を用意すれば、MCPに対応したクライアント(AIモデル側)は、相手の個別仕様を意識することなく、標準化されたJSON-RPC形式のメッセージをやり取りするだけでデータにアクセスできるようになります。

これにより、実装コストは劇的に削減され、「一度MCPサーバーを構築すれば、様々なAIクライアントから再利用できる」という高い拡張性が得られます。

なぜAnthropicはプロトコルのオープン化に踏み切ったのか

Claude 3シリーズを展開するAnthropic社が、このプロトコルをオープンソースとして公開した背景には、エンタープライズ企業の根強いセキュリティ懸念への解答があります。

従来のクラウド型API連携では、AIプロバイダーのサーバー側にサードパーティツールの認証情報(OAuthトークンやAPIキー)を預ける必要があり、これがセキュリティ上の大きな障壁となっていました。

MCPの設計思想は「データ制御の主導権をユーザーの手元(ローカルまたは自社ネットワーク内)に残す」ことにあります。データソースへの直接的なアクセス権を持つのは、ユーザー環境で稼働するMCPサーバーのみです。AIモデルは、必要な時にMCPサーバーに対して「この条件で検索してほしい」「このファイルの内容を読み取ってほしい」とリクエスト(Tool Use)を送り、MCPサーバーがそれを実行して結果だけを返します。

このアーキテクチャにより、機密データそのものを不必要にクラウドへ送信することなく、かつ認証情報も社内から外に出さないというセキュアな運用が可能になったのです。

MCPの3層アーキテクチャ:ホスト・クライアント・サーバーの役割理解

MCPを正しく導入・運用するためには、その技術的な構造を正確に理解しておく必要があります。MCPは、大きく分けて「ホスト(Host)」「クライアント(Client)」「サーバー(Server)」の3層アーキテクチャで構成されています。

全体構成図:データはどこを通り、どう処理されるか

データフローを可視化すると、以下のようになります。

  1. ホスト(Host):
    ユーザーが直接操作するアプリケーションのインターフェースです。代表的な例として「Claude Desktop」アプリケーションが挙げられます。ホストはユーザーのプロンプトを受け取り、AIモデルと通信し、結果を画面に表示します。

  2. クライアント(Client):
    ホストアプリケーション内部(またはAIモデル側)に組み込まれたコンポーネントで、MCPプロトコルに従ってサーバーと通信を行う役割を担います。AIモデルが「ツールを実行したい」と判断した際、その要求をMCPの仕様に沿ったJSON-RPCメッセージに変換し、サーバーへ送信します。

  3. サーバー(Server):
    実際のデータソース(データベース、ファイルシステム、SaaSのAPIなど)と直接接続し、クライアントからの要求を処理するバックエンドプログラムです。サーバーは、自身がどのような機能(ツール)を提供できるかをクライアントに提示し、要求に応じてデータを取得・操作して結果を返します。

通信の方向として重要なのは、常に「クライアントからサーバーへのリクエスト」で始まるという点です。サーバー側から勝手にデータを送りつけることはありません。これにより、AIが勝手に意図しないデータを読み取るリスクを制御しています。

各コンポーネントの技術要件

MCPの通信は、標準入出力(stdio)またはServer-Sent Events(SSE)を利用したHTTPベースのトランスポート層の上で、JSON-RPC 2.0フォーマットを用いて行われます。

ローカル環境で動作するClaude Desktopを利用する場合、通信は「stdio(標準入出力)」を介して行われるのが一般的です。つまり、Claude Desktop(ホスト/クライアント)がMCPサーバーのプログラムをサブプロセスとして起動し、標準入出力を通じてJSONメッセージをやり取りします。

この仕組みの利点は、ネットワークポートを開放する必要がなく、ファイアウォールの設定変更なしに安全にプロセス間通信ができる点にあります。エンタープライズ環境において、新たなネットワークポートの開放はセキュリティ審査の対象となることが多いため、stdioベースの通信は導入の障壁を大きく下げる要因となります。

導入前の準備:開発環境のセットアップと権限確認

MCPの3層アーキテクチャ:ホスト・クライアント・サーバーの役割理解 - Section Image

MCPを利用したデータ連携を始めるにあたり、まずはローカル環境のセットアップが必要です。ここでは、Claude Desktopをホストとして使用し、公式またはコミュニティから提供されているMCPサーバーを動かすための準備手順を解説します。

必要なランタイム(Node.js / Python)のインストール

現在提供されている多くのMCPサーバーは、TypeScript(Node.js環境)またはPythonで実装されています。そのため、実行環境として以下のいずれか、または両方をインストールしておく必要があります。

  • Node.js: 最新のLTS(Long Term Support)バージョンを推奨します。パッケージマネージャーとして npm および npx コマンドが使用できる状態にしてください。
  • Python: バージョン3.10以上を推奨します。パッケージ管理ツールとして uvpip が利用できる環境を整えます。

企業環境における注意点として、プロキシサーバーを経由してインターネットに接続している場合、npmpip のパッケージインストール時に証明書エラーやタイムアウトが発生するケースが珍しくありません。

このような課題に直面した場合は、各パッケージマネージャーに対して社内プロキシの設定(HTTP_PROXYHTTPS_PROXY の環境変数設定、または .npmrc へのプロキシ記述)を確実に行う必要があります。

APIキーの発行と環境変数の管理

外部のSaaS(Google Drive、Slack、GitHubなど)と連携するMCPサーバーを起動する場合、対象サービスのAPIキーやアクセストークンが必要です。

Claude DesktopからMCPサーバーを起動する際、これらの認証情報は環境変数としてサーバープロセスに渡されます。セキュリティの観点から、これらのAPIキーはソースコードや設定ファイルに直接書き込むのではなく、環境変数として安全に管理することが鉄則です。

また、Claude Desktop自体を利用するには、Anthropicの公式ドキュメント等に記載されている通り、適切なアカウントと必要に応じてAPIの利用権限(場合によっては課金設定)が必要です。最新の利用条件は、Anthropicの公式サイトで確認してください。

実践:Claude DesktopにGoogle Driveとローカルファイルを接続する

環境が整ったら、実際にClaude DesktopにMCPサーバーを接続し、AIに自社データを参照させてみましょう。ここでは、ビジネスニーズが最も高い「ローカルファイルシステムの参照」と「Google Driveの検索」を例に、具体的な設定手順を解説します。

ステップ1:config.jsonの編集とパス設定

Claude DesktopにMCPサーバーを認識させるには、特定の設定ファイル(claude_desktop_config.json)を編集します。

設定ファイルの配置場所はOSによって異なります。

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

ファイルが存在しない場合は、新規に作成します。以下は、ローカルの特定のディレクトリ(例:/Users/username/Documents/Projects)をAIに読み取らせるための「Filesystem MCP Server」を設定する例です。

{
  "mcpServers": {
    "local-filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/username/Documents/Projects"
      ]
    }
  }
}

この設定により、Claude Desktopは起動時に npx コマンドを使用してファイルシステム用MCPサーバーを立ち上げ、指定されたディレクトリへのアクセス権を付与します。ここで指定したディレクトリ以外のファイルには、AIはアクセスできません。これが、ローカル実行によるアクセスコントロールの基本です。

ステップ2:MCPサーバーの起動と接続確認

設定ファイルを保存したら、Claude Desktopアプリケーションを完全に終了(Quit)し、再起動します。

再起動後、Claude DesktopのUI上で、入力ボックスの付近に「プラグ(コンセント)」や「ハンマー」のようなアイコン(ツール連携を示すアイコン)が表示されていれば、MCPサーバーの起動と接続に成功しています。

もしアイコンが表示されない場合は、設定ファイルのJSON構文エラー(カンマの抜けなど)や、指定したディレクトリパスの記述ミス、あるいは npx コマンドへのパスが通っていないことが原因として考えられます。エラーの原因を特定するには、Claude Desktopのログファイル(macOSの場合は ~/Library/Logs/Claude/mcp*.log)を確認することが有効なデバッグ手法となります。

ステップ3:AIによるデータ参照のテスト実行

接続が確認できたら、実際にプロンプトを入力して動作をテストします。

プロンプト例:
/Users/username/Documents/Projects フォルダ内にある Q3_Report.md の内容を読み取って、主要な課題を3つ箇条書きで要約してください。」

この指示を受けると、Claude Desktopは背後でMCPサーバーに対して「ファイル読み取りツール」の実行を要求します。ユーザーの画面には、AIがツールを使用している(ファイルを読み込んでいる)状態が視覚的に表示され、その後、ファイルの内容に基づいた正確な要約が出力されます。

このように、AIモデル自身はファイルの中身を事前学習しているわけではありませんが、MCPを通じてリアルタイムにデータを取得し、それをコンテキストとして処理することで、自社の最新情報に基づいた回答を生成できるのです。

独自MCPサーバーの構築:社内データベースをAIのナレッジにする方法

実践:Claude DesktopにGoogle Driveとローカルファイルを接続する - Section Image

公式提供されているMCPサーバーだけでなく、自社の独自システムやデータベースと連携するためのカスタムMCPサーバーを構築することで、AIの活用範囲は無限に広がります。ここでは、TypeScriptを用いた独自MCPサーバーの実装アプローチを解説します。

サーバー実装の基本テンプレート

Anthropicは、MCPサーバーを容易に開発できるよう、公式のSDK(Software Development Kit)を提供しています。以下は、TypeScriptを用いた非常にシンプルなMCPサーバーの骨格です。

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";

// サーバーインスタンスの初期化
const server = new Server(
  {
    name: "custom-database-server",
    version: "1.0.0",
  },
  {
    capabilities: {
      tools: {},
    },
  }
);

// 利用可能なツール(AIが実行できる関数)の定義
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "query_customer_data",
        description: "顧客データベースから特定の顧客情報を検索します",
        inputSchema: {
          type: "object",
          properties: {
            customerId: {
              type: "string",
              description: "検索する顧客のID",
            },
          },
          required: ["customerId"],
        },
      },
    ],
  };
});

// ツールが呼び出された際の実処理
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "query_customer_data") {
    const customerId = request.params.arguments?.customerId;
    
    // ここで実際のデータベース検索処理を実行する
    // const data = await db.query('SELECT * FROM customers WHERE id = ?', [customerId]);
    const dummyData = { id: customerId, name: "株式会社サンプル", status: "Active" };

    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(dummyData, null, 2),
        },
      ],
    };
  }
  throw new Error("Tool not found");
});

// サーバーの起動(標準入出力での通信を待機)
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("Custom Database MCP Server is running");
}

main().catch(console.error);

このコードのポイントは、ListToolsRequestSchema でAIに対して「自分(サーバー)は何ができるか」をスキーマ定義として教え、CallToolRequestSchema で実際のデータ取得ロジックを実装している点です。AIは提供されたスキーマを読み解き、ユーザーの質問に応じて自動的に適切なツールと引数(この場合は customerId)を決定してリクエストを送ってきます。

データベース(PostgreSQL/SQLite)とのマッピング設計

社内データベースをAIに公開する場合、データベースの構造(スキーマ)をそのままAIに見せるのではなく、AIが理解しやすい形に抽象化したツールを提供することが成功の鍵です。

例えば、「SQLを直接実行できるツール」をAIに与えることは、柔軟性が高い一方で、意図しないデータ破壊(DROP TABLEなど)や、権限外のデータへのアクセスを引き起こす重大なセキュリティリスクとなります。

そのため、実践的なアプローチとしては、「特定部門の売上サマリーを取得するツール」「指定した期間のログを抽出するツール」といったように、用途を限定した安全な関数(Stored Procedureや特定のSELECTクエリのみを実行するラッパー)をMCPのツールとして定義します。これにより、AIの動作を予測可能な範囲に収めることができます。

エンタープライズ導入におけるセキュリティとガバナンスの設計

エンタープライズ導入におけるセキュリティとガバナンスの設計 - Section Image 3

技術的な実装が可能であることと、企業システムとして本番導入できることは別問題です。AIに社内データへのアクセス権を付与する以上、厳格なセキュリティとガバナンスの設計が不可欠です。

データ露出を防ぐアクセスコントロール

前述の通り、MCPの最大の利点は「データがローカル環境に留まる」ことです。AIモデル(クラウド)に送信されるのは、「ユーザーのプロンプト」と「ツールの実行結果(取得したデータの一部)」のみであり、データベース全体がクラウドに同期されるわけではありません。

しかし、これだけでは不十分です。MCPサーバー側で、以下のアクセスコントロールを実装する必要があります。

  1. 最小権限の原則 (Principle of Least Privilege):
    MCPサーバーがデータベースやAPIにアクセスする際に使用する認証情報(サービスアカウントなど)は、必要最低限の「読み取り専用(Read-Only)」権限のみを付与します。AIにデータの更新や削除を許可する場合は、人間による承認プロセス(Human-in-the-loop)を挟む設計を強く推奨します。

  2. プロンプトインジェクションへの対策:
    悪意のあるユーザーが、プロンプトを巧妙に操作してAIに想定外のツール実行を促す「プロンプトインジェクション」のリスクが存在します。これを防ぐため、MCPサーバー側で受け取った引数(パラメータ)を厳格にバリデーション(入力チェック)し、不正な文字や想定外のフォーマットを弾く処理を実装しなければなりません。

実行ログの監視と監査対応

エンタープライズ環境では、「いつ、誰が、AIを通じてどのデータにアクセスしたか」を追跡できる監査証跡(Audit Trail)の確保が求められます。

MCPサーバーの実装において、ツールが呼び出された際のパラメータと実行結果を、社内のログ管理システム(Splunk、Datadog、Elasticsearchなど)に転送する仕組みを組み込むことが重要です。

// ログ出力のイメージ
logger.info("Tool Executed", {
  toolName: request.params.name,
  arguments: request.params.arguments,
  user: currentUser,
  timestamp: new Date().toISOString(),
});

このようなログ基盤を整備することで、情報漏洩の疑いが生じた際の調査が可能になるだけでなく、AIがどのデータを頻繁に参照しているかを分析し、業務プロセスの改善に役立てることも期待できます。

運用フェーズの保守:アップデート対応とエラーハンドリング

MCPシステムを導入した後、安定して稼働させ続けるための運用保守(Day 2 Operations)の視点も欠かせません。AIモデルの進化やプロトコルのアップデートは非常に早いため、継続的なメンテナンス計画が必要です。

サーバーの死活監視

Claude Desktopを利用したローカルでのstdio通信の場合、MCPサーバーはサブプロセスとして起動するため、プロセスが予期せずクラッシュした場合、AIは突然データにアクセスできなくなります。

運用上のベストプラクティスとして、MCPサーバーのコード内に適切なエラーハンドリング(try-catch ブロックによる例外の捕捉)を実装し、プロセス全体がダウンすることを防ぐ設計が必要です。また、エラーが発生した場合は、AIモデルに対して「データの取得に失敗しました。管理者に連絡してください」といった、人間が理解できる明確なエラーメッセージを返すようにツールを設計します。

プロトコルアップデート時の互換性チェック

MCPは進化を続けているプロトコルです。公式ドキュメントやコミュニティの動向を定期的に監視し、SDKのバージョンアップに伴う破壊的変更(Breaking Changes)がないかを確認する体制を整えることをおすすめします。

特に、オープンソースとして公開されているサードパーティ製のMCPサーバーを利用する場合、そのリポジトリのメンテナンス状況やセキュリティパッチの適用状況を定期的に監査することが、サプライチェーンリスクを軽減する上で重要です。

結論:MCP導入による業務自動化のROI最大化に向けて

Anthropicが提唱するMCP(Model Context Protocol)は、AIと社内データの間の「分断」を、セキュアかつ標準化された手法で橋渡しする強力な技術です。複雑なAPI開発を不要にし、データ制御の主導権を自社に保ちながら、AIのポテンシャルを最大限に引き出すことができます。

スモールスタートから始めるAIツール連携のロードマップ

全社的なAIデータ連携を一度に実現しようとすると、セキュリティ審査やシステム要件の定義でプロジェクトが停滞するリスクがあります。成功の鍵は、影響範囲を限定したスモールスタートにあります。

まずは、特定の部門(例えば、社内規定を頻繁に検索する人事部門や、過去の設計書を参照する開発部門)にターゲットを絞り、ローカルファイルや特定の社内Wikiのみを読み取れる限定的なMCPサーバーを構築してみてください。そこでの成功体験とROIの算出が、次なる全社展開への強力な推進力となります。

確認クイズ:MCP導入の重要ポイント

最後に、本記事の要点を確認するためのクイズです。自社での導入を検討する際のチェックポイントとしてご活用ください。

  1. MCPの通信において、データソースに直接アクセスする権限を持っているコンポーネントはどれですか?
  2. エンタープライズ環境でMCPサーバーを構築する際、SQLを直接実行できるツールをAIに提供すべきでない最大の理由は何ですか?
  3. Claude DesktopとMCPサーバー間の通信に「stdio(標準入出力)」を使用するセキュリティ上のメリットは何ですか?

(解答:1. サーバー層 / 2. プロンプトインジェクション等による意図しないデータ破壊や不正アクセスのリスクが高いため / 3. 外部へのネットワークポートを開放する必要がなく、ファイアウォールの設定変更が不要なため)

自社環境への適用を検討する際は、実際の動作を体験することで導入のイメージがより明確になります。個別の状況に応じた効果的な導入アプローチを見つけるために、まずはテスト環境での実装や、専門家との対話を通じて、システムの価値を体感することをおすすめします。

参考リンク

「AIに社内データを見せられない」を打破。MCPプロトコルで実現するセキュアなツール連携の全手順 - Conclusion Image

参考文献

  1. https://www.anthropic.com/engineering/april-23-postmortem
  2. https://app-liv.jp/articles/155944/
  3. https://www.youtube.com/watch?v=Pczg8sbkxMo
  4. https://iot.dxhub.co.jp/articles/ojjhsizn4x39
  5. https://note.com/tothinks/n/nd9228c8d0888
  6. https://japan.zdnet.com/article/35247263/
  7. https://prtimes.jp/main/html/rd/p/000000249.000034654.html
  8. https://www.qes.co.jp/media/claudecode/a925
  9. https://liftbaseinc.com/column/claude-code-getting-started

コメント

コメントは1週間で消えます
コメントを読み込み中...