0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MCPでAIエージェントに「手」を与える — Model Context Protocol入門

0
Last updated at Posted at 2026-08-12

MCPでAIエージェントに「手」を与える — Model Context Protocol入門

AIエージェントの「手と目」の問題

ChatGPTやClaudeを使っていて、こんな不満を感じたことはありませんか?

「ファイルを読んでほしいのに、アップロードしないと見られない」
「データベースのデータを参照してほしいのに、コピペするしかない」
「外部APIを叩いてほしいのに、結果を手動で貼り付けるしかない」

LLM(大規模言語モデル)は優秀な「脳」ですが、外部世界にアクセスする「手」と「目」を持っていません。だから人間が毎回仲介する必要があります。

この問題を解決するプロトコルが**MCP(Model Context Protocol)**です。2024年11月にAnthropic社が公開し、急速にエコシステムが拡大しています。

本記事では、MCPの基本概念から最小限のサーバー実装までを解説します。

MCPとは何か — AIとツールを繋ぐプロトコル

MCPを一言で言えば、AIアプリケーションと外部ツールを繋ぐための標準プロトコルです。

HTTPがWebサーバーとブラウザを繋ぐ標準プロトコルであるように、MCPはAIモデルと外部リソースを繋ぐ標準プロトコルです。

従来の手法: Function Calling

MCP以前は、Function Calling(関数呼び出し)が主な手段でした。各AIアプリが独自に関数を定義し、LLMに「どの関数を呼ぶか」を判断させます。

しかしFunction Callingには問題があります:

  • ツールごとに独自実装が必要: 各AIアプリが各ツール用の統合コードを書く必要がある
  • 再利用性が低い: Claude用に書いた統合コードは、他のAIアプリでは使えない
  • スケールしない: ツールが増えるたびに実装量が膨れ上がる

MCPの解決策: 標準化されたプロトコル

MCPは、ツール側(サーバー)とAI側(クライアント)の間に標準インターフェースを定義します。

AIアプリ(クライアント) ←→ MCPプロトコル ←→ ツール(サーバー)

サーバー側がMCP規格に従ってツールを公開すれば、MCP対応のAIアプリならどれでもそのツールを使えるようになります。Claude Desktop、Cursor、その他のMCP対応クライアントすべてで同じサーバーが動きます。

これが「Write once, run on any MCP-compatible client」の世界です。

MCPの3つのプリミティブ

MCPは3つの機能カテゴリ(プリミティブ)を定義しています。

1. Tools — AIに「手」を与える

AIがアクションを実行するための機能です。

  • ファイルの読み書き
  • APIの呼び出し
  • データベースの操作
  • コマンドの実行

例えば「ファイルを読む」ツールを定義すれば、AIはユーザーの指示に応じて自律的にファイルを読めます。

2. Resources — AIに「目」を与える

AIがデータを参照するための機能です。読み取り専用で、副作用がありません。

  • ドキュメントの内容
  • データベースのクエリ結果
  • ログファイル
  • 設定ファイル

ResourcesはURIで識別されます。例えば file:///project/README.mddb://users/schema のように、どのデータを参照するかを指定します。

3. Prompts — 再利用可能なプロンプトテンプレート

よく使うプロンプトをテンプレート化して保存する機能です。

  • コードレビュー用のプロンプト
  • ドキュメント作成用のプロンプト
  • デバッグ用のプロンプト

引数を取れるので、柔軟なテンプレートが作れます。

最小限のMCPサーバーを実装する

実際にMCPサーバーを作ってみましょう。Python SDKを使います。

セットアップ

pip install mcp

サーバーコード

from mcp.server import Server
from mcp.types import Tool, TextContent
import mcp.server.stdio
import asyncio

app = Server("my-first-mcp-server")

@app.list_tools()
async def list_tools() -> list[Tool]:
    return [
        Tool(
            name="get_current_time",
            description="現在時刻を取得する",
            inputSchema={
                "type": "object",
                "properties": {
                    "timezone": {
                        "type": "string",
                        "description": "タイムゾーン(例: Asia/Tokyo)",
                        "default": "UTC"
                    }
                }
            }
        ),
        Tool(
            name="calculate",
            description="四則演算を実行する",
            inputSchema={
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": "計算式(例: 2 + 3 * 4)"
                    }
                },
                "required": ["expression"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
    if name == "get_current_time":
        from datetime import datetime
        import zoneinfo
        tz = arguments.get("timezone", "UTC")
        try:
            now = datetime.now(zoneinfo.ZoneInfo(tz))
            result = now.strftime("%Y-%m-%d %H:%M:%S %Z")
        except:
            result = datetime.now().strftime("%Y-%m-%d %H:%M:%S UTC")
        return [TextContent(type="text", text=f"現在時刻: {result}")]

    elif name == "calculate":
        expr = arguments["expression"]
        try:
            result = eval(expr)  # 実運用では安全な評価器を使用
            return [TextContent(type="text", text=f"結果: {expr} = {result}")]
        except Exception as e:
            return [TextContent(type="text", text=f"エラー: {e}")]

async def main():
    async with mcp.server.stdio.stdio_server() as (read, write):
        await app.run(read, write, app.create_initialization_options())

if __name__ == "__main__":
    asyncio.run(main())

このサーバーは2つのツールを提供します:

  • get_current_time: 指定タイムゾーンの現在時刻を返す
  • calculate: 数式を評価して結果を返す

Claude Desktopから接続する

Claude Desktopの設定ファイル(claude_desktop_config.json)に以下を追加します。

{
  "mcpServers": {
    "my-server": {
      "command": "python",
      "args": ["/path/to/your/server.py"]
    }
  }
}

Claude Desktopを再起動すると、ツールが利用可能になります。「今何時?」と聞けば get_current_time ツールが自動的に呼ばれ、「123 * 456を計算して」と聞けば calculate ツールが実行されます。

トランスポート — 通信方式の選択

MCPは2つのトランスポート方式をサポートしています。

  • stdio: 標準入出力で通信。ローカル環境の標準方式。Claude Desktopとの接続はこれを使う
  • HTTP/SSE: HTTPベースの通信。リモートサーバーへの接続に使う。Web上のMCPサーバーにアクセス可能

ローカル開発ならstdio、リモート運用ならHTTP/SSE——用途に応じて選びます。

セキュリティ上の注意点

MCPサーバーはAIに強力な権限を与えるため、セキュリティには注意が必要です。

  • 最小権限の原則: ツールに必要最小限の権限だけを付与する
  • 入力バリデーション: 引数を必ず検証する。eval()の使用は特に危険
  • アクセス制御: 認証を導入し、信頼できるクライアントのみ接続許可
  • ログ記録: ツールの呼び出し履歴を記録し、監査可能にする

まとめ

  • MCP: AIアプリと外部ツールを繋ぐ標準プロトコル。Write once, run on any MCP-compatible client
  • 3つのプリミティブ: Tools(実行)、Resources(参照)、Prompts(テンプレート)
  • 実装: Python/Node.js SDKで数十行のサーバーが作れる
  • 接続: Claude Desktop等のMCP対応クライアントから利用可能
  • セキュリティ: 最小権限・入力バリデーション・アクセス制御が必須

MCPはAIエージェントの能力を劇的に拡張するプロトコルです。「AIが自律的にツールを使う」という未来が、既に動き始めています。


この記事は、著書「MCP実践入門 — AIエージェントを拡張するModel Context Protocol」(¥1,650・Kindle)の内容を再構成したものです。MCPの基本概念からTools/Resources/Promptsの実装、Claude Desktop統合、複数サーバー運用、実践プロジェクト集まで、10章で体系的に解説しています。Kindle Unlimited会員は読み放題対象です。

葉山悠希(はやま ゆうき)— AI×生産性向上の実践書を執筆しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?