MCP（モデルコンテキストプロトコル）とは何か、そしてその動作原理

> 本記事は元々 [blog.logto.io](https://blog.logto.io/ja/what-is-mcp) に掲載されたものです。

## MCPとは何か？

[MCP（モデルコンテキストプロトコル）](https://modelcontextprotocol.io/) は、大規模言語モデル（LLM）にコンテキスト情報をどのように提供するかを標準化するオープンでユニバーサルなプロトコルです。

簡単に言えば、HTTPプロトコルが異なるウェブサイトやブラウザが同じルールに従って情報を交換できるようにするのと同様に、MCPはAI世界のHTTPプロトコルのようなものです。MCPは、異なるAIモデルがさまざまなデータソースやツールに標準化された方法で接続できるようにします。この標準化により、開発者はモデルやデータソースごとに専用のインターフェースを作成せずにAIアプリケーションを構築しやすくなります。

## なぜMCPが必要なのか？

大規模言語モデル（LLM）は強力ですが、いくつかの重要な制限に直面しています：

- **知識の限界と更新の課題**: LLMは、トレーニングデータに含まれる情報しか知りません。たとえば、GPT-4の知識は2023年4月で終了しています。大規模言語モデルのトレーニングには莫大な計算リソースと時間が必要で、新しいバージョンを完成させるのには通常6か月以上かかります。このため、モデルの知識は常に「古い」状態になり、更新には非常に高い費用と時間がかかります。新しいモデルがトレーニングを終了したときには、既にその知識が遅れ始めているのです。

- **専門領域の知識の欠如**: LLMは公に利用可能な一般データを使用して訓練されています。特定のビジネスシナリオにおける専門データや情報を深く理解することはできません。たとえば、医療機関の内部プロセス、企業の製品カタログ、組織の特許知識はモデルの訓練範囲には含まれていません。

- **外部データへのアクセスに関する統一基準がない**: 現在、RAG（Retrieval-Augmented Generation）、ローカルナレッジベース、インターネット検索など、LLMに追加情報を提供するための多くの方法があります。異なる開発チームが異なる統合ソリューションを提供し、システム間の統合コストが高くなっています。専門領域のデータを含むシステム（CRM、ERP、医療記録システムなど）は、LLMとシームレスに統合するのが難しいです。統合にはカスタム開発が必要で、共通の標準化された方法が欠けています。

これがMCPが必要な理由です。MCPは、LLMが一貫した方法で外部情報やツールにアクセスできる標準化されたプロトコルを提供し、上記の問題をすべて解決します。MCPを通じて、次の重要な利点を得ることができます：

- **豊富なプリビルド統合**: MCPは、ファイルシステム、データベース（PostgreSQL、SQLite）、開発ツール（Git、GitHub、GitLab）、ネットワークツール（Brave Search、Fetch）、生産性ツール（Slack、Google Maps）など、多くの準備されているサーバー統合を提供します。これにより、これらの統合をゼロから構築する必要はなく、これらのプリビルトコネクタを使用して、LLMにこれらのシステムのデータにアクセスさせることができます。

- **LLMプロバイダー間の柔軟な切り替え**: 今日はGPT-4を使用している場合、明日はClaudeやGeminiを試したくなるか、異なるシナリオで異なるLLMを使用したいかもしれません。MCPを使用すれば、アプリケーションの統合ロジックをすべて書き直す必要はありません。基礎となるモデルを変更するだけで、すべてのデータとツールの統合がそのまま維持されます。

- **高度なAIワークフローの構築**: 複数のデータベースにクエリを実行し、ドキュメントを比較するための特定のツールを使用してレポートを生成する必要がある法的文書解析システムをイメージしてください。MCPを使用すると、LLMをベースにこのような複雑なエージェントやワークフローを構築することができます。

## MCPの動作原理

MCPでは、MCPサーバー（ツールとデータアクセスを提供）、MCPクライアント（LLMに組み込まれ、MCPサーバーと通信する）、およびMCPホスト（Claude Desktop、Cursorなど、LLMとクライアントを統合するアプリケーション）という3つの主要な役割があります。これら3つの役割がどのように連携するかを詳しく見てみましょう。

### MCPサーバー

MCPサーバーは、LLMが使用できるツールとデータアクセス機能を提供するプログラムです。伝統的なリモートAPIサーバーとは異なり、MCPサーバーはユーザーのデバイス上でローカルアプリケーションとして動作することも、リモートサーバーにデプロイされることもできます。

各MCPサーバーは、ローカルデータまたはリモートサービスから情報を取得するために特定のツールセットを提供します。LLMがタスクを処理する際に特定のツールを使用する必要があると判断した場合、MCPサーバーが提供するツールを使用して必要なデータを取得し、LLMに返します。

```mermaid
graph LR
    subgraph "MCP Server"
        Tool1[Tool: ファイルリーダー]
        Tool2[Tool: バックエンドサービスからのリソースリクエスト]
    end
    
    Tool1 <--> LocalData[ローカルデータ: ファイル]
    Tool2 <--> RemoteService[リモートサービス: リソースサーバーAPI]
```

### MCPクライアント

MCPクライアントは、LLMとMCPサーバーをつなぐ橋渡し役です。LLMに組み込まれたものであり、以下の役割を負っています：
- LLMからのリクエストを受け取る
- 適切なMCPサーバーにリクエストを転送する
- MCPサーバーからの結果をLLMに返す

```mermaid
graph LR
    subgraph "AIアプリケーション"
        LLM[大規模言語モデル] --> MCPClient[MCPクライアント]
    end
    MCPClient <--> MCPServer[MCPサーバー]
```

[MCPクライアントを開発する](https://modelcontextprotocol.io/quickstart/client) を参照して、MCPクライアントのLLM統合についてさらに学ぶことができます。

### MCPホスト

Claude Desktop、IDEs（Cursorなど）、またはMCPを通じてデータにアクセスしたいAIツールなどのプログラムです。これらのアプリケーションは、LLMとのやり取りのインターフェースをユーザーに提供し、MCPクライアントを統合してMCPサーバーに接続し、MCPサーバーが提供するツールを使用してLLMの機能を拡張します。

```mermaid
graph TD
    subgraph "MCPホスト"
        subgraph "LLM"
            Model[言語モデル]
            MCPClient[MCPクライアント]
        end
    end
    
    MCPClient <--> MCPServer[MCPサーバー]
```

### MCPワークフロー

上記の3つの役割が最終的にMCPを基にしたAIアプリケーションを形成します。

```mermaid
graph LR
    subgraph "MCPホスト"
        UI[ユーザーインターフェース]
        subgraph "MCP統合を含むLLM"
            IntegratedLLM[大規模言語モデル]
            IntegratedClient[MCPクライアント]
            IntegratedLLM <--> IntegratedClient
        end
        UI <--> IntegratedLLM
    end
    
    subgraph MCPサーバー
        Tool1[Tool: ファイルリーダー]
        Tool2[Tool: バックエンドサービスからのリソースリクエスト]
    end

    IntegratedClient <--> MCPサーバー
    
    
    Tool1 <--> LocalData[ローカルデータ: ファイル]
    Tool2 <--> RemoteService[リモートサービス: リソースサーバーAPI]
```

このシステムの例となるワークフローは次のようになります：

```mermaid
sequenceDiagram
    participant User as ユーザー
    participant Host as MCPホスト
    participant LLM as 大規模言語モデル
    participant Client as MCPクライアント
    participant Server as MCPサーバー
    participant Data as データソース/サービス
    
    User->>Host: 質問をする
    Host->>LLM: 質問を転送
    LLM->>LLM: 外部データ/ツールが必要かを分析
    
    alt 外部データ/ツールが必要
        LLM->>Client: 特定のツールの使用をリクエスト
        Client->>Server: ツール呼び出し
        Server->>Data: データ取得
        Data->>Server: データ返却
        Server->>Client: 処理済みの結果返却
        Client->>LLM: ツール実行結果の提供
    end
    
    LLM->>Host: 回答の生成（ツール結果の組み合わせ）
    Host->>User: 回答表示
```

## MCPサーバーの構築方法

MCPサーバーはMCPシステムの最も重要なリンクです。LLMがどのデータにアクセス可能かを決定し、AIアプリケーションの機能の境界と能力に直接影響を与えます。

MCPサーバーの構築を開始するには、先ず公式MCP [クイックスタートガイド](https://modelcontextprotocol.io/quickstart/server) を読むことをお勧めします。このガイドには、環境設定からMCPサーバーの実装および使用までのプロセスが詳細に説明されています。ここでは、核心となる実装詳細のみ説明します。

### MCPサーバーが提供するツールの定義

MCPサーバーの核心機能は、server.tool() メソッドを通じてツールを定義することです。これらのツールはLLMが外部データを取得したり、特定の操作を行ったりするために呼び出すことができる関数です。Node.jsを使用した簡単な例を見てみましょう：

```javascript
// 会社のナレッジベースを検索するためのツールを定義します
server.tool(
  "search-documents",
  "会社のナレッジベースで文書を検索",
  {
    query: z.string().describe("検索キーワードまたは質問"),
    max_results: z.number().default(5).describe("返す結果の最大数")
  },
  async ({ query, max_results }) => {
    // 実際の実装はナレッジベースシステムに接続します
    // 簡易例を返します
    const results = [
      "製品マニュアル v2.1",
      "よくある質問",
      "技術仕様"
    ].slice(0, max_results);
    
    const formattedResults = results.map((title, index) => 
      `${index + 1}. ${title}`
    ).join("\n");
    
    return {
      content: [
        {
          type: "text",
          text: `'${query}' の結果:\n${formattedResults}`
        }
      ]
    };
  }
);
```

この例では、`search-documents`というツールを定義しています。これは、問い合わせ文字列と最大結果数をパラメータとして受け取ります。ツールの実装はナレッジベースシステムに接続し、クエリ結果を返します。

LLMはユーザーの質問に基づいてこのツールの定義を使用するかどうかを決定します。必要な場合、LLMはこのツールを呼び出して結果を得て、その結果をユーザーの質問と組み合わせて回答を生成します。

### ツール定義のベストプラクティス

このようなツールを構築する際は、以下のベストプラクティスに従うことができます：

- **明確な説明**: 各ツールに詳細で正確な説明を提供し、その機能、適用シナリオ、制限をはっきりと述べます。これにより、LLMが適切なツールを選びやすくなるだけでなく、開発者がコードを理解・保守しやすくなります。
- **パラメータのバリデーション**: Zodや類似のライブラリを使用して入力パラメータを厳密に検証し、正しい型、妥当な値の範囲、および非準拠の入力を拒否します。これは、バックエンドシステムへのエラーの伝播を防ぎ、全体の安定性を向上させます。
- **エラーハンドリング**: 包括的なエラーハンドリング戦略を実装し、考えられる例外をキャッチし、ユーザーフレンドリーなエラーメッセージを返します。これにより、ユーザーエクスペリエンスが向上し、LLMはエラー条件に基づいて意味のある応答を提供できるようになり、単に失敗するのではなくなります。
- **データアクセス制御**: バックエンドリソースAPIに堅牢な認証および認可のメカニズムを実装し、許可範囲を慎重に設計して、MCPサーバーがユーザーが承認されたデータのみをアクセス・返却できるように制限します。これにより、機密情報の漏洩を防ぎ、データセキュリティを確保します。

## MCP（AIモデル）と外部システム間のデータ交換のセキュリティを確保する方法

AIモデルと外部システムを接続するMCPサーバーを実装する際、MCP実装における2つの重要なセキュリティ課題があります：

- **認証**: 伝統的なアプリケーションとは異なり、MCP環境では、ユーザーが伝統的なログインフロー（ユーザー名/パスワード、メール/認証コードなど）で外部システムにアクセスすることはできません。
- **MCPサーバー要求に対するアクセス制御**: AIツールを通じてシステムにアクセスするユーザーは、直接的にあなたのシステムを使用する可能性のある同じ個人です。MCPサーバーはAIツールを通じてユーザーが操作する際の代理として動作します。MCPサーバーに適合するためにアクセス制御メカニズム全体を再設計することは、大幅な労力とコストがかかります。

これらの課題への主要な解決策は、[Personal Access Tokens (PATs)](https://blog.logto.io/api-authentication-with-personal-access-token) を実装することです。PATsは、ユーザーが資格情報を共有したり、対話的なサインインを要求したりせずにアクセス権を与える安全な方法を提供します。

このワークフローは次のように機能します：

```mermaid
sequenceDiagram
    actor User as ユーザー
    participant AITools as AIツール
    participant MCPServer as MCPサーバー
    participant Service as あなたのサービスAPI
    
    User->>Service: 個人アクセストークン（PAT）を作成
    Service-->>User: 生成されたPATを返す
    User->>MCPServer: PATを設定
    
    User->>AITools: リクエスト
    AITools->>MCPServer: MCPサーバーからツール呼び出し
    MCPServer->>Service: PATを用いたAPI呼び出し
    Service->>Service: PATを検証し、権限を確認
    Service-->>MCPServer: ユーザーの権限に基づいたデータを返却
    MCPServer-->>AITools: 結果を処理し返却
    AITools-->>User: 結果を表示
```

このアプローチにより、既存のサービスはその認証メカニズムを維持しながら、安全にMCP統合を可能にします。

ブログ記事：[ビジネスを強化：アクセス制御を持つAIツールを既存のサービスに接続](https://blog.logto.io/connect-ai-tools-to-your-service) には、Logtoの [Personal Access Tokens (PAT)](https://docs.logto.io/user-management/personal-access-token) と [ロールベースのアクセス制御 (RBAC)](https://docs.logto.io/authorization/role-based-access-control) を組み合わせて、MCPがバックエンドサービスからアクセス可能なリソースを制限する方法の完全な[ソースコード例](https://github.com/logto-io/rbac-sample) が記載されています。

## まとめ

MCP（モデルコンテキストプロトコル）は、大規模言語モデルと特定のビジネスの組み合わせに画期的な変化をもたらします。これは、大規模言語モデルの知識の限界、専門領域知識の欠如、外部データへのアクセスに関する非統一基準の問題を解決します。

MCPを使用して独自のサービスを接続することで、ビジネスに新たな可能性が生まれます。MCPはAIとビジネス価値をつなぐ橋渡し役です。あなたの会社の内部知識を真に理解するAIアシスタントを作成したり、最新データにアクセスするインテリジェントツールを開発したり、業界特有のニーズに対応するプロフェッショナルなアプリケーションを構築することができます。