MCPとは?Model Context Protocolを理解してAIプロジェクトに統合する方法

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

私はかなり早い段階からAIモデルを使って仕事をしてきましたが、最大の問題はモデルの知能不足ではなく、プロジェクトの実データからモデルが完全に切り離されていることでした。AIにサーバーログを分析させたり、データベーススキーマを読ませたり、configファイルを確認させたりするたびに、手動でコピー&ペーストしなければなりませんでした。MCPはまさにその問題点を解決するために生まれました。

なぜAIモデルにMCPが必要なのか?

ジュニア開発者が初日に働く様子を想像してみてください。基礎知識はあるものの、コードベース、データベーススキーマ、チームの規約については何も知りません。誰かが最初から一つひとつonboardしてあげる必要があります。

AIモデルも同じ状況にあります。Claude、GPT、Geminiはいずれも膨大な知識でtrainされていますが、以下のことは知りません:

  • あなたのマシンのファイルシステムに何があるか
  • 本番データベースがどのようなスキーマを持っているか
  • 社内APIがどのように動作しているか
  • 現在のGitHubリポジトリにどんなファイルがあるか

MCP登場以前は、チームごとに独自の解決策を編み出していました。アドホックなプラグイン、カスタムAPIラッパー、あるいは単純なコピー&ペーストです。標準などありませんでした。AIアプリケーションはそれぞれ異なる統合方法を持ち、再利用できませんでした。

Anthropicはこの問題に気づきました。2024年末、彼らはMCPをオープンプロトコルとしてリリースしました。個々の箇所にパッチを当てるのではなく、根本的な解決を目指して標準化したのです。

MCPとは何か — 最もシンプルな説明

本質的に、MCPはAIモデルと外部データソース・ツールとのやり取りを標準化するプロトコルです。より簡潔に言えば、MCPは「共通言語」——AIとツールが互いに理解し合うためのものです。

Webアーキテクチャに慣れている方なら、MCPをREST APIのようなものとして捉えてください。ただし、HTTPを通じたclient-server間の通信を定義するのではなく、MCPはAIモデル(client)とデータソース(server)の通信方法を定義します。

MCPの強みはmodular性にあります。MCP Serverを一度書けば、MCPをサポートするあらゆるAI clientで使えます。自分のデータベース用のMCP Serverを書けば、Claude Desktop、Cursor、Zedすべてですぐに使えます——書き直し不要です。

MCPアーキテクチャ:押さえるべき3つのコンポーネント

インストールの前に、MCPアーキテクチャの主要3コンポーネントを理解する必要があります:

MCP Host

AIモデルを含み、MCP接続を開始するアプリケーションです。例えば、Claude Desktop、Cursor IDE、または自分でビルドしたアプリケーションなどが該当します。HostはMCP connectionのライフサイクル管理を担当します。

MCP Client

Host内に存在するコンポーネントで、MCP Serverとの1対1の接続を維持します。ClientはプロトコルのネゴシエーションやMCP標準に従ったリクエストの送受信を処理します。

MCP Server

ツールとデータ側の「接続口」です。各MCP Serverは一連のcapabilityを公開します:Resources(読み取り可能なデータ)、Tools(実行可能なアクション)、Prompts(既存のプロンプトテンプレート)。Serverはローカルで動作する独立したprocessでも、ネットワーク経由の接続でも構いません。

基本的な動作フロー:

AI Model (Host) → MCP Client → [stdio / SSE] → MCP Server → Database / Files / API

MCP環境のセットアップ

方法1:Claude Desktopを使う(最も手軽に試せる方法)

Claude Desktopは現在最も普及しているMCP Hostです。インストール後、configファイルにMCP Serverを追加します:

# Claude Desktopのconfigファイルを開く
# macOS:
open ~/Library/Application\ Support/Claude/claude_desktop_config.json

# Windows:
# %APPDATA%\Claude\claude_desktop_config.json

config JSONファイルの構造:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/yourname/projects"
      ]
    }
  }
}

保存後、Claude Desktopを再起動してください。接続が成功すると、チャットインターフェースの下部にMCPアイコンが表示されます。

方法2:Python MCP SDKを使う(開発者向け)

自分のPythonアプリケーションにMCPを統合したい場合は、公式SDKをインストールしてください:

pip install mcp
# またはuv(推奨)を使う
uv add mcp

PythonからToolに接続して呼び出す:

import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def main():
    server_params = StdioServerParameters(
        command="npx",
        args=["-y", "@modelcontextprotocol/server-filesystem", "/tmp/data"],
    )

    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()

            # 利用可能なtoolsの一覧を確認
            tools = await session.list_tools()
            print("Available tools:", [t.name for t in tools.tools])

            # ファイル読み取りtoolを呼び出す
            result = await session.call_tool(
                "read_file",
                arguments={"path": "/tmp/data/config.txt"}
            )
            print(result.content)

asyncio.run(main())

詳細な設定 — 実際のデータへの接続

MCP経由でPostgreSQLに接続する

私はこの方法を本番環境で適用して安定稼働しています。AIがスキーマをクエリし、explain planを確認し、各テーブルを手動で説明することなくindexを提案できます。

pip install mcp-server-postgres

claude_desktop_config.jsonの設定:

{
  "mcpServers": {
    "postgres": {
      "command": "python",
      "args": ["-m", "mcp_server_postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://user:pass@localhost:5432/mydb"
      }
    }
  }
}

MCPのセキュリティ — 見落とされがちな点

MCP Serverはログイン中のユーザーの権限で動作します。見落としやすいポイントがいくつかあります:

  • Filesystem:必要なディレクトリのみを公開し、/やホームディレクトリ全体~は絶対に公開しない
  • Database:MCP用の読み取り専用ユーザーを別途作成し、superuserは使用しない
  • Network MCP:ネットワーク経由でSSE transportを使用する場合、HTTPSと認証を必ず使用すること
-- MCP専用の読み取り専用ユーザーを作成する
CREATE USER mcp_readonly WITH PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE mydb TO mcp_readonly;
GRANT USAGE ON SCHEMA public TO mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;

MCP connectionの検証とデバッグ

MCP Inspectorを使う

Anthropicは公式のデバッグツールを提供しています。コードを書き始める前にこれを使ってください:

npx @modelcontextprotocol/inspector npx @modelcontextprotocol/server-filesystem /tmp/test

Inspectorはhttp://localhost:5173でwebインターフェースを開き、以下のことが可能になります:

  • serverが公開するResources、Tools、Promptsの一覧を確認
  • toolを直接呼び出してraw responseを確認
  • プロトコルメッセージをステップごとに追跡

Claude DesktopでMCPログを確認する

# macOS — リアルタイムでログを確認
tail -f ~/Library/Logs/Claude/mcp-server-filesystem.log

# すべてのMCPログを確認
ls ~/Library/Logs/Claude/mcp-*.log

接続を素早くテストするスクリプト

import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def test_connection():
    params = StdioServerParameters(
        command="npx",
        args=["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
    )
    try:
        async with stdio_client(params) as (read, write):
            async with ClientSession(read, write) as session:
                await session.initialize()
                tools = await session.list_tools()
                print(f"OK: {len(tools.tools)} tools available")
                for tool in tools.tools:
                    print(f"  - {tool.name}: {tool.description}")
    except Exception as e:
        print(f"FAIL: {e}")

asyncio.run(test_connection())

まとめ

私がMCPに時間を投資するよう本当に説得してくれたのは、protocolそのものではなく、その周囲で急成長するecosystemでした。Anthropicがオープンソースにしてからすぐに、コミュニティはわずか数ヶ月でSlack、GitHub、Google Drive、Notion、AWS、Jiraなど数百ものMCP Serverをリリースしました。

MCPを無視してAIアプリを構築すると、車輪の再発明をすることになります——独自の方法で、誰とも互換性がない形で。各data sourceのためにintegration layerを自分で書く代わりに、そのecosystemに直接接続するだけで解決します。

今すぐ試してみてください:Filesystem MCP Serverをプロジェクトフォルダに向けてdeployし、Claude Desktopを開いて、「このプロジェクトでauthenticationを処理しているファイルはどれ?」と聞いてみてください。contextなしでチャットしたときとはまったく違う回答が得られるはずです。

Share: