MCP(モデルコンテキストプロトコル)— 標準プロトコルでAIと外部システム連携が圧倒的に容易に

この記事の内容

  • MCPはAnthropicが2024年11月に発表した、AIアシスタントと外部システムを繋ぐオープン標準プロトコルです
  • MCPサーバー・MCPクライアント・MCPホストの3コンポーネントで構成されます
  • 従来は個別開発が必要だった外部システム連携を、標準化されたプロトコルで統一できます
  • PythonのChainlitライブラリを使うと、MCPクライアントの実装が比較的シンプルに行えます
  • エコシステムは急速に拡大しており、主要なサービス向けのMCPサーバーがコミュニティから続々と公開されています

MCPとは何か

MCP(モデルコンテキストプロトコル)は、Anthropicが2024年11月26日に発表したオープンソースのプロトコルです。AIアシスタントをデータが存在するシステムに接続するための新しい標準として位置付けられています。

対象となるシステムは幅広く、コンテンツリポジトリ、ビジネスツール、開発環境など、データが存在するあらゆる場所が含まれます。

なぜMCPが必要なのか

AIモデルはどれだけ賢くなっても、インターネット上にない情報や、組織内システムにしか存在しないデータには本質的にアクセスできません。また、外部システムと連携しようとするたびに個別のカスタム実装が必要でした。

MCPはこの課題に取り組むために登場しました。AIシステムとデータソースを接続するための普遍的でオープンな標準を提供し、断片的な統合を単一のプロトコルに置き換えることを目指しています。


MCPのアーキテクチャ

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

MCPホスト

Claude DesktopやClineのような、MCPを通じてデータにアクセスしようとするAIアプリケーションやインターフェイスのことです。MCPホストがデータやアクションの要求を開始します。

MCPクライアント

MCPサーバーと1対1の接続を維持するプロトコルクライアントです。リクエストとレスポンスを転送する仲介役として機能します。

MCPサーバー

MCPを通じて特定の機能を公開し、ローカルまたはリモートのデータソースに接続する軽量なプログラムです。ファイルシステム、データベース、APIなどへの接続を担います。

この構成をUSB-Cに例えるとわかりやすいです。USB-Cのインターフェイスを持つデバイスであれば、USB-Cケーブルで繋ぐだけで機能するように、MCPのインターフェイスを備えたサービスであれば、標準的な方法で繋いで利用できます。


対応するサービスとエコシステム

MCPの登場以来、対応するサービスやツールが急速に増えています。

接続できるサービスの例:

  • Google Drive
  • Slack
  • GitHub
  • PostgreSQL
  • ローカルファイルシステム
  • Gmail
  • 各種Web API

Terraform向けのMCPサーバー(TFMCP)のように、コミュニティが独自のMCPサーバーを開発してオープンソースで公開する動きも活発です。TFMCPを使うと、自然言語でTerraformの操作が可能になります。

TTeMeMrCrCrPrPaaffoorrmmtteerrrraaffoorrmmpalpapnly

MCPサーバーの実装

MCPサーバーの実装はそれほど難しくありません。既存のシステムへの組み込みであれば、比較的少量のコードで対応できます。

実装の基本的な構成要素は以下の3つです。

  • リソース:データの公開
  • ツール:実行可能なアクション
  • プロンプト:AIへの指示テンプレート

プロトコルとしては標準的なJSON-RPC 2.0を使用しており、SDKも提供されているためPythonやその他の言語で実装できます。


ChainlitとAzure OpenAIを使ったMCPクライアントの実装

ChainlitはオープンソースのPythonパッケージで、プロダクション品質の会話AIのUIを手軽に作成できます。MCPサーバーとの連携機能も備えています。

基本的なChainlitアプリの起動

import chainlit as cl

@cl.on_message
async def main(message: cl.Message):
    content = message.content
    # ここにレスポンス処理を記述
    await cl.Message(content=content).send()

MCPサーバーへの接続

MCPサーバーと連携するには、on_mcp_connectハンドラーとon_mcp_disconnectハンドラーを実装します。

@cl.on_mcp_connect
async def on_mcp_connect(connection, session):
    # 利用可能なツールを取得してセッションに保存
    result = await session.list_tools()
    tools = [
        {
            "name": t.name,
            "description": t.description,
            "input_schema": t.inputSchema
        }
        for t in result.tools
    ]
    cl.user_session.set("mcp_tools", tools)

@cl.on_mcp_disconnect
async def on_mcp_disconnect(name, session):
    pass

LLMにツールを渡してメッセージを処理する

async def call_model_with_tools(message_history, tools):
    client = AzureOpenAI(...)
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=message_history,
        tools=tools  # MCPツールを渡す
    )
    return response

ツールを呼び出す際は、MCPサーバーへのリクエストとして処理します。

async def call_tool(tool_name, tool_input, mcp_session):
    result = await mcp_session.call_tool(tool_name, tool_input)
    return result

内部的にはOpenAIのFunction Calling機能を利用してMCPツールを呼び出す仕組みになっています。


接続方式

MCPサーバーとの接続方式は2種類あります。

接続タイプ説明
Standard I/O(ローカル)ローカルコマンドを実行してStandard I/Oで通信するモード
SSE(リモート)Server-Sent Eventsを使ったHTTPによるリモート接続モード

セキュリティ上の注意点

MCPは便利な一方で、セキュリティリスクも存在します。MCPサーバーを闇雲にインストールして様々な場所と連携すると、クレデンシャルが漏洩する可能性があります。

MCPサーバーを導入する際は、以下の点に注意してください。

  • 信頼できるソースのMCPサーバーのみを使用する
  • 各MCPサーバーが持つ権限の範囲を確認する
  • 不要なMCPサーバーは削除する

MCPの今後と広がり

MCPが普及することで、AIエージェントを使った様々なシステム連携が標準的なプロトコルで実現できるようになります。

従来の「WebブラウザをAIが画面認識して操作する」アプローチと比較すると、APIや標準プロトコルを通じた連携の方がはるかに信頼性が高く、拡張性も優れています。

将来的には、Webサイトやサービスが「MCP対応」を標準装備とする世界も考えられます。Web開発者がAPIを提供するのと同様に、AI向けの窓口としてMCPサーバーを用意することが当たり前になるかもしれません。

コミュニティによるMCPサーバーの開発も活発で、主要なサービスへの対応が進んでいます。自社サービスにMCPサーバーがなくても、コミュニティが開発したものが利用できるケースも増えてきています。


まとめ

  • MCPはAnthropicが発表したオープン標準プロトコルで、AIと外部システムを標準的な方法で連携できます
  • MCPホスト・MCPクライアント・MCPサーバーの3層構造で動作し、USB-Cのように様々なサービスをプラグイン感覚で繋げられます
  • 実装は比較的シンプルで、既存のAPIがあればMCPサーバー化は難しくありません
  • ChainlitなどのライブラリがMCP対応しており、Azure OpenAIとの組み合わせでも実装できます
  • エコシステムは急速に拡大しており、主要サービス向けのMCPサーバーがコミュニティから続々と公開されています
  • セキュリティリスクにも注意が必要で、信頼できるMCPサーバーのみを使用することが重要です

MCPの波に乗り、AIと外部システムを連携させた実用的なアプリケーション開発に活かしていきましょう。