T-CREATOR

MCP サーバー とは?Model Context Protocol の基礎・仕組み・活用メリットを徹底解説

MCP サーバー とは?Model Context Protocol の基礎・仕組み・活用メリットを徹底解説

AI アシスタントが、あなたのビジネスツールやデータベース、ファイルシステムに直接アクセスして作業できる世界を想像してみてください。これを実現するのが Model Context Protocol(MCP)です。

従来、AI モデルは情報の孤島に閉じ込められていました。どれだけ高性能なモデルでも、外部データにアクセスするには個別のカスタム実装が必要で、システムの統合は困難を極めていたのです。

MCP は、この課題を解決するために Anthropic が 2024 年 11 月に発表したオープンスタンダードのプロトコルです。AI モデルと外部データソースを「統一された方法」で接続し、まるで USB-C のように、様々なシステムを標準化されたインターフェースで繋ぐことができます。

本記事では、MCP サーバーの基礎から仕組み、そして開発者やビジネスにもたらすメリットまで、初心者の方にもわかりやすく徹底解説します。

背景

AI モデルが抱えていた「情報の孤立」という課題

大規模言語モデル(LLM)は、質問応答や文章生成において驚異的な能力を発揮しますが、一つの大きな制約がありました。それは「外部データへのアクセスの難しさ」です。

AI モデルは、学習時に取り込んだ知識のみで回答するため、リアルタイムのビジネスデータや、企業内のドキュメント、データベースといった外部リソースには直接アクセスできませんでした。

個別実装による統合の複雑さ

これまで AI モデルに外部データを提供するには、各データソースごとにカスタムのインテグレーションを開発する必要がありました。例えば、以下のような状況です。

  • Slack のデータを AI に取り込むには Slack 用の連携コードが必要
  • Google Drive のファイルを参照するには別の連携コードが必要
  • 社内データベースへのアクセスにはさらに別の実装が必要

この結果、N 個のデータソースと M 個の AI アプリケーションがある場合、理論上 N × M 通りの統合コードが必要になり、開発コストとメンテナンスの負担が膨大になっていました。

以下の図は、MCP 登場前の統合の複雑さを示しています。

mermaidflowchart TB
    subgraph apps["AI アプリケーション層"]
        app1["Claude Desktop"]
        app2["ChatGPT"]
        app3["カスタム AI アプリ"]
    end

    subgraph datasources["データソース層"]
        ds1["Slack"]
        ds2["Google Drive"]
        ds3["データベース"]
        ds4["GitHub"]
    end

    app1 -.->|個別実装 1| ds1
    app1 -.->|個別実装 2| ds2
    app1 -.->|個別実装 3| ds3
    app2 -.->|個別実装 4| ds1
    app2 -.->|個別実装 5| ds3
    app3 -.->|個別実装 6| ds2
    app3 -.->|個別実装 7| ds4

    style apps fill:#e1f5ff
    style datasources fill:#fff4e1

図で理解できる要点

  • AI アプリケーションごとに、データソースへの個別実装が必要
  • 統合の数が増えるほど、開発とメンテナンスが複雑化
  • 統一された標準がないため、スケーラビリティに欠ける

標準化の必要性

ソフトウェア開発の世界では、Language Server Protocol(LSP)が様々なエディタとプログラミング言語を統合する標準として機能しています。これと同様に、AI とデータの統合にも標準プロトコルが求められていました。

Anthropic は、この課題を解決するために Model Context Protocol を設計しました。MCP は、AI アプリケーションとデータソースの間に「共通言語」を提供することで、統合の複雑さを劇的に削減します。

課題

データソース統合におけるスケーラビリティの欠如

従来の AI 統合では、新しいデータソースを追加するたびに、各 AI アプリケーションで個別の開発が必要でした。これにより、以下のような課題が生じていました。

#課題詳細
1開発コストの増大データソースごとに API 仕様を学び、統合コードを実装する必要がある
2メンテナンスの負担データソースの仕様変更のたびに、統合コードの修正が必要
3再利用性の低さ他の AI アプリケーションで同じデータソースを使う場合、ゼロから実装が必要
4セキュリティリスク各統合で独自の認証・認可を実装するため、脆弱性が生まれやすい

コンテキスト管理の困難さ

AI モデルは、会話の「コンテキスト(文脈)」を理解することで適切な回答を生成します。しかし、外部データを取り込む際、以下のような問題がありました。

  • データフォーマットの不統一:各データソースが異なる形式でデータを提供するため、AI が一貫して理解することが困難
  • 動的なデータ取得の難しさ:AI が必要とするタイミングで、必要なデータを取得する仕組みが標準化されていない
  • ツール実行の制御:AI がデータを読むだけでなく、外部ツールを「実行」する場合、安全性とユーザー制御が課題

エコシステムの分断

各 AI ベンダーやツール開発者が独自の統合方式を採用した結果、エコシステム全体が分断されていました。開発者は、各プラットフォームごとに異なる方法を学ぶ必要があり、統一されたベストプラクティスも存在しませんでした。

以下の図は、MCP 以前のエコシステムの分断状況を示しています。

mermaidflowchart LR
    subgraph vendor1["ベンダー A のエコシステム"]
        vendorA["AI プラットフォーム A"]
        apiA["独自 API"]
    end

    subgraph vendor2["ベンダー B のエコシステム"]
        vendorB["AI プラットフォーム B"]
        apiB["独自 API"]
    end

    subgraph vendor3["ベンダー C のエコシステム"]
        vendorC["AI プラットフォーム C"]
        apiC["独自 API"]
    end

    dev["開発者"] -->|異なる学習コスト| vendor1
    dev -->|異なる学習コスト| vendor2
    dev -->|異なる学習コスト| vendor3

    style vendor1 fill:#ffe1e1
    style vendor2 fill:#e1ffe1
    style vendor3 fill:#e1e1ff
    style dev fill:#fff4e1

図で理解できる要点

  • 各ベンダーが独自の API と統合方式を提供
  • 開発者は複数のプラットフォームを学ぶ必要がある
  • エコシステム間でのツールやデータソースの再利用が困難

解決策

Model Context Protocol(MCP)とは

Model Context Protocol は、AI アプリケーションと外部データソース・ツールを接続するためのオープンスタンダードのプロトコルです。Anthropic が開発し、オープンソースとして公開されています。

MCP は「AI のための USB-C」とも表現されます。USB-C が様々なデバイスを統一されたコネクタで接続できるように、MCP は AI モデルと多様なデータソースを標準化された方法で接続します。

MCP のアーキテクチャ

MCP は、以下の 3 つの主要コンポーネントで構成されています。

#コンポーネント役割
1ホスト(Host)AI アプリケーション本体。Claude Desktop や ChatGPT など
2クライアント(Client)ホスト内で動作する接続コネクタ。MCP サーバーとの通信を担当
3サーバー(Server)データソースやツールを提供するサービス。外部リソースへのアクセスを提供

以下の図は、MCP のアーキテクチャ全体像を示しています。

mermaidflowchart TB
    subgraph host_layer["ホスト層"]
        host["AI アプリケーション<br/>(Claude Desktop, ChatGPT など)"]
        client["MCP クライアント"]
    end

    subgraph server_layer["MCP サーバー層"]
        server1["ファイルシステム<br/>MCP サーバー"]
        server2["データベース<br/>MCP サーバー"]
        server3["Slack<br/>MCP サーバー"]
    end

    subgraph resource_layer["リソース層"]
        res1["ローカルファイル"]
        res2["PostgreSQL"]
        res3["Slack API"]
    end

    host -->|統合| client
    client <-->|JSON-RPC 2.0| server1
    client <-->|JSON-RPC 2.0| server2
    client <-->|JSON-RPC 2.0| server3

    server1 <-->|アクセス| res1
    server2 <-->|アクセス| res2
    server3 <-->|アクセス| res3

    style host_layer fill:#e1f5ff
    style server_layer fill:#f0e1ff
    style resource_layer fill:#fff4e1

図で理解できる要点

  • MCP クライアントは、複数の MCP サーバーと並行して通信可能
  • すべての通信は JSON-RPC 2.0 プロトコルで統一
  • サーバー層がデータソースの違いを吸収し、統一されたインターフェースを提供

MCP サーバーが提供する 3 つの主要機能

MCP サーバーは、AI アプリケーションに対して以下の 3 つの機能を提供します。

1. リソース(Resources)

リソースは、AI がコンテキストとして参照できる読み取り専用のデータオブジェクトです。以下のようなものが該当します。

  • ファイルの内容:ドキュメント、コード、設定ファイル
  • データベースのレコード:顧客情報、商品データ
  • API のレスポンス:外部サービスから取得したデータ
typescript// リソースの概念的な例
interface Resource {
  uri: string; // リソースの一意識別子
  name: string; // 表示名
  mimeType: string; // データ形式
  content: string; // 実際のデータ
}

2. プロンプト(Prompts)

プロンプトは、再利用可能でパラメータ化されたメッセージテンプレートです。AI に対する指示を構造化し、一貫性のある対話を実現します。

typescript// プロンプトの概念的な例
interface Prompt {
  name: string; // プロンプトの名前
  description: string; // 説明
  arguments: PromptArgument[]; // 動的パラメータ
  messages: PromptMessage[]; // メッセージテンプレート
}

例えば、「コードレビュー用プロンプト」や「要約生成用プロンプト」などを定義し、必要に応じて呼び出すことができます。

3. ツール(Tools)

ツールは、AI が実行可能な関数やアクションです。読み取りだけでなく、外部システムへの書き込みや操作が可能です。

typescript// ツールの概念的な例
interface Tool {
  name: string; // ツールの名前
  description: string; // 説明
  inputSchema: object; // 入力パラメータのスキーマ(JSON Schema 形式)
}

ツールの例:

  • ファイル書き込み:新しいファイルを作成
  • データベース更新:レコードの挿入・更新・削除
  • API 実行:外部サービスへのリクエスト送信

JSON-RPC 2.0 による通信

MCP では、クライアントとサーバー間の通信に JSON-RPC 2.0 プロトコルを採用しています。これにより、以下のメリットがあります。

#メリット詳細
1標準化された通信方式既存の実装やライブラリを活用できる
2プログラミング言語に依存しないPython、TypeScript、Go など、どの言語でも実装可能
3シンプルで軽量JSON ベースのため、可読性が高く、デバッグが容易

通信には、以下の 2 つのトランスポート方式がサポートされています。

  • 標準入出力(stdio):プロセス間通信に適している
  • HTTP + Server-Sent Events(SSE):ネットワーク経由の通信に適している

セキュリティとユーザー制御

MCP は、セキュリティとプライバシーを重視して設計されています。以下の原則に基づいています。

#原則内容
1ユーザーの同意すべてのデータアクセスとツール実行には、ユーザーの明示的な承認が必要
2透明性AI が何をしているかをユーザーが理解できる仕組み
3プライバシー保護ユーザーデータの保護を最優先にする

例えば、AI がファイルを削除しようとする場合、ユーザーに確認を求め、承認されて初めて実行されます。

エコシステムの統一

MCP により、AI エコシステム全体が統一されたプロトコルで接続されるようになります。以下の図は、MCP による統合後のエコシステムを示しています。

mermaidflowchart TB
    subgraph clients["MCP クライアント層"]
        c1["Claude Desktop"]
        c2["ChatGPT"]
        c3["Cursor"]
        c4["カスタム AI アプリ"]
    end

    mcp_protocol["Model Context Protocol<br/>(統一プロトコル層)"]

    subgraph servers["MCP サーバー層"]
        s1["ファイルシステム"]
        s2["GitHub"]
        s3["データベース"]
        s4["Slack"]
        s5["Google Drive"]
    end

    clients -->|JSON-RPC 2.0| mcp_protocol
    mcp_protocol -->|JSON-RPC 2.0| servers

    style clients fill:#e1f5ff
    style mcp_protocol fill:#fff4e1
    style servers fill:#f0e1ff

図で理解できる要点

  • すべての AI クライアントは、同じプロトコルで MCP サーバーに接続
  • 新しいデータソースを追加する場合、MCP サーバーを 1 つ実装するだけで、すべての AI クライアントから利用可能
  • 統合の数は N + M に削減され、スケーラビリティが大幅に向上

具体例

MCP サーバーの実装例:ファイルシステムサーバー

実際に MCP サーバーを実装する例を見ていきましょう。ここでは、ローカルファイルシステムへのアクセスを提供する簡単な MCP サーバーを TypeScript で実装します。

1. 必要なパッケージのインストール

まず、MCP の公式 SDK をインストールします。

bashyarn add @modelcontextprotocol/sdk

2. MCP サーバーの基本構造

MCP サーバーは、Server クラスを使って実装します。以下のコードは、サーバーの初期化部分です。

typescriptimport { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

// MCP サーバーのインスタンスを作成
const server = new Server(
  {
    name: 'filesystem-server', // サーバーの名前
    version: '1.0.0', // バージョン
  },
  {
    capabilities: {
      resources: {}, // リソース機能を有効化
      tools: {}, // ツール機能を有効化
    },
  }
);

このコードでは、filesystem-server という名前の MCP サーバーを作成し、リソースとツールの機能を有効化しています。

3. リソースの定義

次に、ファイルを読み取るリソースを定義します。クライアントがリソース一覧を取得したり、特定のリソースを読み取ったりできるようにします。

typescriptimport * as fs from 'fs/promises';
import * as path from 'path';

// リソース一覧を返すハンドラ
server.setRequestHandler('resources/list', async () => {
  return {
    resources: [
      {
        uri: 'file:///example.txt',
        name: 'Example Text File',
        mimeType: 'text/plain',
      },
    ],
  };
});

このハンドラは、AI クライアントが「どのようなリソースが利用可能か」を問い合わせたときに、リソースのリストを返します。

typescript// 特定のリソースの内容を返すハンドラ
server.setRequestHandler(
  'resources/read',
  async (request) => {
    const uri = request.params.uri as string;

    // URI からファイルパスを抽出
    const filePath = uri.replace('file://', '');

    // ファイルの内容を読み取る
    const content = await fs.readFile(filePath, 'utf-8');

    return {
      contents: [
        {
          uri: uri,
          mimeType: 'text/plain',
          text: content,
        },
      ],
    };
  }
);

このハンドラは、AI クライアントが特定のリソース(ファイル)の内容を要求したときに、ファイルを読み取って返します。

4. ツールの定義

次に、ファイルを書き込むツールを定義します。ツールは AI が「実行」できるアクションです。

typescript// 利用可能なツールの一覧を返すハンドラ
server.setRequestHandler('tools/list', async () => {
  return {
    tools: [
      {
        name: 'write_file',
        description:
          '指定されたパスにファイルを書き込みます',
        inputSchema: {
          type: 'object',
          properties: {
            path: {
              type: 'string',
              description: '書き込むファイルのパス',
            },
            content: {
              type: 'string',
              description: 'ファイルに書き込む内容',
            },
          },
          required: ['path', 'content'],
        },
      },
    ],
  };
});

このハンドラは、AI クライアントが「どのようなツールが利用可能か」を問い合わせたときに、ツールのリストと各ツールの入力スキーマを返します。

typescript// ツールを実行するハンドラ
server.setRequestHandler('tools/call', async (request) => {
  const { name, arguments: args } = request.params;

  if (name === 'write_file') {
    const { path: filePath, content } = args as {
      path: string;
      content: string;
    };

    // ファイルに内容を書き込む
    await fs.writeFile(filePath, content, 'utf-8');

    return {
      content: [
        {
          type: 'text',
          text: `ファイル ${filePath} に書き込みました`,
        },
      ],
    };
  }

  throw new Error(`未知のツール: ${name}`);
});

このハンドラは、AI クライアントがツールの実行を要求したときに、実際にファイルを書き込み、結果を返します。

5. サーバーの起動

最後に、サーバーを起動します。標準入出力(stdio)を使ってクライアントと通信します。

typescript// 標準入出力トランスポートを作成
const transport = new StdioServerTransport();

// サーバーを起動
async function main() {
  await server.connect(transport);
  console.error('Filesystem MCP Server が起動しました');
}

main().catch((error) => {
  console.error('サーバー起動エラー:', error);
  process.exit(1);
});

このコードは、サーバーを標準入出力経由でクライアントに接続し、通信を開始します。

MCP クライアントの実装例

次に、上記の MCP サーバーに接続する簡単なクライアントを実装します。

typescriptimport { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';

// MCP クライアントのインスタンスを作成
const client = new Client(
  {
    name: 'example-client',
    version: '1.0.0',
  },
  {
    capabilities: {},
  }
);

このコードでは、example-client という名前の MCP クライアントを作成しています。

typescript// サーバーに接続
async function connectToServer() {
  const transport = new StdioClientTransport({
    command: 'node', // サーバーを起動するコマンド
    args: ['dist/filesystem-server.js'], // サーバーのスクリプト
  });

  await client.connect(transport);
  console.log('サーバーに接続しました');
}

この関数は、MCP サーバーのプロセスを起動し、標準入出力経由で接続します。

typescript// リソースの一覧を取得
async function listResources() {
  const response = await client.request(
    { method: 'resources/list' },
    { uri: '' }
  );

  console.log('利用可能なリソース:', response.resources);
}

この関数は、サーバーに対して「リソースの一覧を返してください」というリクエストを送信し、レスポンスを表示します。

typescript// ツールを実行
async function callTool() {
  const response = await client.request(
    { method: 'tools/call' },
    {
      name: 'write_file',
      arguments: {
        path: '/tmp/output.txt',
        content: 'Hello from MCP!',
      },
    }
  );

  console.log('ツール実行結果:', response.content);
}

この関数は、write_file ツールを実行し、ファイルに内容を書き込みます。

実際の動作フロー

以下の図は、クライアントとサーバー間の通信フローを示しています。

mermaidsequenceDiagram
    participant Client as MCP クライアント
    participant Server as MCP サーバー
    participant FS as ファイルシステム

    Client->>Server: 初期化リクエスト
    Server->>Client: サーバー情報とサポート機能

    Client->>Server: resources/list リクエスト
    Server->>Client: 利用可能なリソースのリスト

    Client->>Server: resources/read リクエスト<br/>(uri: file:///example.txt)
    Server->>FS: ファイル読み取り
    FS->>Server: ファイル内容
    Server->>Client: リソースの内容

    Client->>Server: tools/call リクエスト<br/>(write_file, path, content)
    Server->>FS: ファイル書き込み
    FS->>Server: 書き込み完了
    Server->>Client: ツール実行結果

図で理解できる要点

  • クライアントとサーバーは、リクエスト・レスポンス形式で通信
  • サーバーは、実際のリソース(ファイルシステム)とクライアントの橋渡し役
  • すべての通信は JSON-RPC 2.0 プロトコルで標準化

実際の利用シーン:Claude Desktop との統合

MCP サーバーを Claude Desktop と統合することで、AI があなたのローカルファイルにアクセスできるようになります。

Claude Desktop の設定ファイル(claude_desktop_config.json)に、以下のように MCP サーバーを登録します。

json{
  "mcpServers": {
    "filesystem": {
      "command": "node",
      "args": ["/path/to/filesystem-server.js"]
    }
  }
}

この設定により、Claude Desktop は起動時に自動的に MCP サーバーに接続し、以下のようなことが可能になります。

  • 「プロジェクトの README.md を読んで要約して」 → Claude が MCP 経由でファイルを読み取り、要約を生成
  • 「新しい設定ファイルを作成して」 → Claude が MCP のツールを使ってファイルを作成

実際の活用例:データベースアクセス

MCP サーバーは、データベースへのアクセスも提供できます。例えば、PostgreSQL に接続する MCP サーバーを作成すると、AI が自然言語でデータベースを操作できるようになります。

typescript// PostgreSQL MCP サーバーのツール定義例
server.setRequestHandler('tools/list', async () => {
  return {
    tools: [
      {
        name: 'execute_query',
        description: 'SQL クエリを実行します',
        inputSchema: {
          type: 'object',
          properties: {
            query: {
              type: 'string',
              description: '実行する SQL クエリ',
            },
          },
          required: ['query'],
        },
      },
    ],
  };
});

このツールを使うことで、AI に「売上トップ 10 の商品を教えて」と尋ねると、AI が適切な SQL クエリを生成し、MCP サーバー経由で実行して結果を返すことができます。

MCP の活用メリット

1. 開発コストとメンテナンスの大幅削減

MCP を採用することで、N × M の統合コストが N + M に削減されます。新しいデータソースを追加する場合、MCP サーバーを 1 つ実装するだけで、すべての MCP 対応 AI アプリケーションから利用可能になります。

#従来の方法MCP を使った方法
1データソースごとに各 AI アプリで個別実装MCP サーバーを 1 つ実装
2統合数:N × M統合数:N + M
3メンテナンス:各統合ごとに必要メンテナンス:MCP サーバーのみ

2. エコシステムの拡大と相互運用性

MCP はオープンスタンダードであるため、様々なベンダーやツール開発者が MCP サーバーやクライアントを提供しています。これにより、エコシステム全体が成長し、開発者は豊富なツールやデータソースを活用できます。

2025 年 3 月には OpenAI が MCP を正式に採用し、ChatGPT や OpenAI の Agents SDK に統合することを発表しました。さらに、Google DeepMind の CEO も Gemini モデルでの MCP サポートを表明しており、業界標準としての地位を確立しつつあります。

3. AI のコンテキスト理解能力の向上

MCP により、AI は必要なときに必要なデータを取得できるようになります。これにより、以下のようなメリットがあります。

  • リアルタイムデータの活用:最新のビジネスデータや外部 API の情報を参照
  • 大規模データセットへのアクセス:AI のコンテキストウィンドウに収まらない大量のデータも扱える
  • 動的なツール実行:AI が状況に応じて適切なツールを選択・実行

4. セキュリティとプライバシーの向上

MCP は、ユーザーの同意と制御を重視した設計になっています。すべてのデータアクセスとツール実行には、ユーザーの明示的な承認が必要です。

#セキュリティ機能詳細
1ユーザー承認データ読み取り、ツール実行には承認が必要
2透明性AI が何をしているかをユーザーが確認できる
3細かい権限制御リソースやツールごとにアクセス権限を設定可能

5. 開発者体験の向上

MCP は、開発者にとって以下のようなメリットをもたらします。

  • 学習コストの削減:統一されたプロトコルを一度学べば、様々なデータソースに対応可能
  • 豊富な SDK とツール:公式 SDK(TypeScript、Python など)や開発ツールが充実
  • コミュニティのサポート:オープンソースプロジェクトとして、活発なコミュニティが存在

6. ビジネス価値の最大化

MCP を活用することで、AI を既存のビジネスシステムと深く統合し、以下のような価値を生み出せます。

  • 業務自動化の加速:AI が社内データベースやツールに直接アクセスし、業務を自動化
  • 意思決定の迅速化:リアルタイムデータに基づいた AI の分析と提案
  • カスタマーサポートの向上:顧客データや過去の対応履歴を参照した AI アシスタント

まとめ

Model Context Protocol(MCP)は、AI アプリケーションと外部データソース・ツールを統一的に接続するためのオープンスタンダードです。

従来の個別実装による統合の複雑さを解消し、N × M の統合コストを N + M に削減することで、開発者とビジネスに大きなメリットをもたらします。

MCP サーバーは、リソース(読み取り専用データ)、プロンプト(メッセージテンプレート)、ツール(実行可能なアクション)の 3 つの機能を提供し、AI がコンテキストを理解して適切に動作できるようにします。

JSON-RPC 2.0 による標準化された通信、ユーザーの同意を重視したセキュリティ設計、そしてオープンソースによるエコシステムの成長により、MCP は AI 開発の未来を形作る重要なプロトコルとなるでしょう。

OpenAI や Google DeepMind などの主要 AI ベンダーも MCP を採用し、業界標準としての地位を確立しつつあります。今後、ますます多くのツールやデータソースが MCP に対応し、AI の可能性が広がっていくことが期待されます。

開発者の皆さんは、ぜひ MCP を活用して、より強力で柔軟な AI アプリケーションを構築してみてください。

関連リンク