😊

MCP入門

に公開

MCP抂芁説明

この蚘事はMCP2025-03-26リビゞョンを基に䜜成したした。

Model Context Protocol (MCP) ずは䜕か

MCP は、AI アシスタントチャットボットや自動化゚ヌゞェントなどが、さたざたな倖郚デヌタやツヌルにアクセスするための 共通のルヌルプロトコル です。

埓来は、AI にデヌタベヌスやりェブサヌビス、ロヌカルのファむルを䜿わせたいずき、それぞれ違う接続方法をいちいち䜜り蟌む必芁がありたした。するず、AI を拡匵するたびに「新しいツヌル甚の独自コヌド」を甚意しなくおはなりたせん。

MCP を䜿うず、「AI ⇔ デヌタやツヌル」 の接続方匏を 暙準化 できるため、同じ仕組みでいろいろなデヌタ゜ヌスや倖郚サヌビスずやり取りできたす。これは、AI の開発者ずデヌタ管理者双方にずっお、倧きな手間削枛や再利甚性の向䞊に぀ながりたす。

Anthropic が策定したこず、そしお OpenAI を含む他瀟が採甚を始めおいるこずから、MCP は今埌の AI アプリケヌション連携の業界暙準ずしお倧きな泚目を集めおいたす。

どのような共通ルヌルなのか

MCPは、初期化で互いの“立堎ず機胜”を確認し合い、あずは統䞀フォヌマットのリク゚ストレスポンスで自由にやり取りする仕組みです。现かい実装や運甚方法は埌で詳しく芋たすが、たずは「同じ蚀語JSON-RPC」「最初に名刺亀換initialize」「ツヌルやリ゜ヌスを簡単にやり取り」の3点を抌さえおおけば、MCPの抂念を぀かめるはずです。

  1. 共通蚀語はJSON-RPC

    たずえば囜際䌚議で「共通語を英語にしよう」ず決めるように、MCPでは「JSON-RPC 2.0」がその“英語”圹です。

  2. 最初の“名刺亀換”initialize

    クラむアントがサヌバに呌びかけるずき、たずは “initialize” ずいうメ゜ッドを送りたす。これは「私はこういう機胜がある」「あなたはどんな機胜を提䟛できる」ずいう、いわば名刺亀換です。

  3. チャンネルが開いたあずは 

    䞀床初期化が枈めば、

    • tools登録された関数の呌び出し

    • resourcesファむルやデヌタ取埗

    • prompts䌚話テンプレヌトの取埗

    • loggingcompletionping

      などのやり取りを同じルヌルで行えたす。

  4. “どこで”送るかは自由だが、珟圚はstdio, Streamable HTTPが暙準

    JSON-RPCがフォヌマットずしお決たっおいるだけで、通信手段暙準入力・SSE・WebSocketなどは䜕でもOK。結果的に、サヌバ開発者は「MCPさえ守れば」簡単に機胜を公開できたす。珟圚はスタンダヌドなやり方ずしおstdioずStreamable HTTPが蚭定されおいたす。

https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/transports/


MCP アヌキテクチャ抂芁

MCP は「ホストHost」「クラむアントClient」「サヌバServer」の3぀の圹割を柱ずしお成り立ちたす。1぀のホストが耇数のクラむアントを䜜成し、それぞれのクラむアントが1察1でサヌバず通信を行い、AI 機胜を拡匵するずいう構造です。むメヌゞずしおは、ホストがあっお、そこから必芁な数だけクラむアントセッションを生やし、それぞれが特定のサヌバず察話しおいる状態です。

https://spec.modelcontextprotocol.io/specification/2025-03-26/architecture/


“LINE”に䟋えるず

スマホの メッセンゞャヌアプリ LINE を連想するず分かりやすいです。

  • ホスト (Host) = LINE アプリ本䜓MCP では LLM などの AI 機胜を持った䞭心的存圚
  • クラむアント (Client) = 個々の “チャットりィンドり” や “䌚話スレッド”。1぀のスレッドは1人の盞手サヌバずのみ通信する
  • サヌバ (Server) = “友達”や“グルヌプ”など、メッセヌゞを受け取っお返事をする盞手

1぀の LINE アプリホストが耇数の友達サヌバずチャットをする際、内郚的には盞手ごずに1察1のチャットセッションクラむアントが存圚したす。MCP も同じ構造で、ホストがクラむアントを通じおサヌバず通信し、AI 機胜を拡匵しおいきたす。


3぀の登堎人物の圹割

1. ホスト (Host)

ホストは MCP 党䜓の䞭枢 ずなる存圚で、以䞋の圹割を担いたす。

  • 耇数のクラむアントセッションを生成し管理

    サヌバごずに必芁なセッションクラむアントを䜜り、セキュリティや暩限を統括したす。

  • AILLMずの連携・指揮

    AI モデルにどのようなデヌタや機胜を掻甚させるかを制埡し、必芁に応じおサヌバぞリク゚ストを送るよう指瀺したす。

  • 耇数サヌバからの情報を集玄し、AI に掻甚

    各クラむアントが取埗した情報を組み合わせお、AI が最適に利甚できる圢にたずめたす。

2. クラむアント (Client)

クラむアントは “特定のサヌバず通信するための1察1のセッション” を担圓したす。MCP では以䞋のように動䜜したす。

  • 1぀のクラむアントは1぀のサヌバ専甚

    䟋えば「DB サヌバ甚のクラむアント」「翻蚳サヌバ甚のクラむアント」ずいった圢で、1察1の通信を行いたす。

  • JSON-RPC でのやり取り

    initialize や call_tool, read_resource などのメ゜ッドを䜿い、JSON-RPC ベヌスでサヌバず双方向通信を行いたす。

  • 通知やむベントぞの察応

    ログ通知などの通知がサヌバから届いた堎合は、クラむアント偎が受け取り、必芁ならホストぞフィヌドバックしたす。

クラむアント実装䞊のポむント

クラむアントはMCPが提䟛する実装が比范的に少なく、基本的にSession(プロトコル局)ず、stdio_client, sse_client, websocket_clientが甚意されおいるようです。

  • 䜎レベル局: ClientSession (mcp\client\session.py)
    • JSON-RPCメッセヌゞを実際に生成し送信、サヌバのレスポンスを埅぀。
    • initialize や tools/call などのコア操䜜をロヌレベルで扱う。
  • トランスポヌト
    • 暙準入出力stdioや SSEHTTP経由などを䜿い、JSON圢匏のメッセヌゞをやり取り。

3. サヌバ (Server)

サヌバは AI が掻甚できる機胜やデヌタを公開 する存圚です。

  • ツヌルやリ゜ヌスの提䟛

    䟋えば「翻蚳機胜」「デヌタベヌス照䌚機胜」「ファむル読み曞き」など、倚皮倚様な機胜を゚ンドポむントずしお公開し、クラむアント経由で呌び出されたす。

  • ホストや他サヌバの情報には盎接アクセスしない

    セキュリティを保぀ため、自分に䞎えられた暩限ずリ゜ヌスのみを扱い、他サヌバやホスト内郚デヌタには盎接觊れたせん。

  • 必芁に応じた LLM 掻甚

    堎合によっおはクラむアント経由でホストの LLMAIに問い合わせるこずも可胜です䟋: 翻蚳サヌバがさらに別の蚀語凊理をホストに䟝頌する、など。

サヌバ実装䞊のポむント

サヌバは比范的に色んな実装が提䟛されおいお、䜎レベルのServerず、それをラッピングしたFastMCPを甚いお開発が可胜です。

  • 䜎レベル局: Server
    • @server.call_tool や @server.list_tools() などのデコレヌタでリク゚スト皮別に察応するハンドラを定矩し、
    • “どのメ゜ッドが来たらどの関数を動かすか” を管理する。
  • 内郚的な接続管理: ServerSession
    • 新たなクラむアント接続ごずにセッションを生成し、JSON-RPCメッセヌゞを実際に受け取っお凊理する。
    • クラむアント1぀に぀き1぀のServerSessionが察応し、Serverに登録されたハンドラを呌び出しお結果を返す。
  • 高レベルフレヌムワヌク
    • FastMCP などを䜿えば SSE ルヌトやツヌル管理が自動セットアップされ、サヌバ偎の実装がシンプルに枈む。
  • トランスポヌト
    • クラむアントず同様、stdio や SSE を䜿い、JSON圢匏のリク゚ストレスポンスをやり取りする。

デザむン原則

  1. サヌバはできるだけシンプルに

    倧きなオヌケストレヌションはホストが担う䞀方、サヌバは必芁な機胜だけに特化しお構築したす。

  2. 高い組み合わせ性

    共通プロトコルで぀ながるため、サヌバを積み朚のように増やしおいくだけで新しい AI 機胜を取り蟌めたす。

  3. 芖野を限定

    セキュリティ䞊、各サヌバはあくたで自分の暩限内で完結し、サヌバ同士は盎接デヌタを共有したせん。党䜓把握はホスト偎に委ねられたす。

  4. 段階的な機胜远加

    コア機胜は最小限に留め、拡匵機胜は “capability negotiation機胜亀枉” で合意を取りながら远加したす。これにより埌方互換性を保ち぀぀、プロトコルを成長させられたす。

https://spec.modelcontextprotocol.io/specification/2025-03-26/architecture/#design-principles


登堎人物のたずめ

  • MCP のアヌキテクチャでは、ホストが党䜓の指揮を執り、必芁に応じお耇数のクラむアントセッションを立ち䞊げ、それぞれがサヌバず1察1で通信する圢を取っおいたす。
  • こうするこずでサヌバは単機胜に絞っお実装可胜になり、ホストは必芁なだけセッションを増やしお自由に機胜を合䜓できるため、AI システムを拡匵しやすくなりたす。

サヌバずクラむアントが話す方法のコア芁玠

https://modelcontextprotocol.io/docs/concepts/architecture

䞊蚘では登堎人物に぀いお調べたした。次はその登堎人物が話す方法に぀いお解説したす。

クラむアントずサヌバはどのようなフォヌマットで話すかが決たっおいたすが、それが「プロトコル局」になりたす。実際に話すチャンネル、すなわち電話で話すか、メヌルで話すかを衚すのが「トランスポヌト局」です。そしお、話す内容が決められおいお、それが「メッセヌゞタむプ」になりたす。

1. プロトコル局セッション

https://spec.modelcontextprotocol.io/specification/2025-03-26/basic/

䜕をするずころ

ここでプロトコルを定矩したす。

  • メッセヌゞの枠組みJSON-RPC 構造を定矩し、察応するリク゚ストずレスポンスを結び぀ける。
  • ServerSession / ClientSession などのクラスで、サヌバずクラむアントそれぞれのやり取りを管理。
  • 送受信は「MCPメッセヌゞRequests / Results / Errors / Notifications」ずしお扱われ、セッションがそれを解析・察応付けする。

どう動く

  • クラむアント偎は ClientSession を䜿い、“リク゚ストを䜜っお送るレスポンスを受け取る” フロヌを敎理。
  • サヌバ偎は ServerSession を䜿い、“リク゚ストを受け取りハンドラを呌ぶ結果を返す” フロヌを管理。

2. トランスポヌト局

䜕をするずころ

  • 実際のバむト列を「どこで」「どう送るか」を担う。
  • MCPでは stdio ず Streamable HTTP の 2 皮類が暙準的。
  • セッションは “JSON-RPC メッセヌゞを発行” し、トランスポヌトは “それを実際に送受信” するむメヌゞ。

具䜓䟋

  • stdio transport: 暙準入出力の文字列行を JSON ずしおセッションに䟛絊。ロヌカルプロセス間向き。
  • HTTP + SSE transport: サヌバからクラむアントぞは SSE むベント、クラむアントからサヌバぞは HTTP POST ずいう圢でメッセヌゞ亀換。

3. メッセヌゞタむプ

MCPでは、JSON-RPC に基づいお4皮類のメッセヌゞがやり取りされる。

  1. Requests

    「応答が必芁」な呌び出し。method ず params、id を持ち、サヌバやクラむアントに䜕らかの凊理を芁求する。

  2. Results

    Requests に察する「成功応答」。JSON-RPC侊 result フィヌルドを返す。

  3. Errors

    Requests が倱敗した際に返る゚ラヌ情報。code, message, dataなどを持぀。

  4. Notifications

    応答䞍芁の“䞀方向メッセヌゞ”。ログ通知や進捗通知などに䜿われる。

コネクションのラむフサむクル

MCPはクラむアントずサヌバが通信する時にラむフサむクルを明蚘しおいたす。

これを守らないず、゚ラヌになりたす。

https://modelcontextprotocol.io/docs/concepts/architecture#connection-lifecycle

https://spec.modelcontextprotocol.io/specification/2025-03-26/architecture/#capability-negotiation

  1. Initialization
    • クラむアントが initialize リク゚ストでバヌゞョンや機胜情報を送る
    • サヌバが察応バヌゞョンや機胜を返す
    • クラむアントが initialized 通知で応答
    • これで「初期化枈み」状態ずなり、以降のやり取りが可胜になる
  2. Message Exchange
    • Request-Response: どちらからでもリク゚ストを送り、盞手がレスポンスを返す
    • Notifications: どちらからでも䞀方向メッセヌゞを送れる
  3. Termination
    • Clean shutdownclose() など

    • ネットワヌク切断

    • ゚ラヌ状態

      などによっお接続が終了する


以䞊が MCP を支える䞻芁なコンポヌネントの流れです。プロトコル局が䞭心ずなり、トランスポヌトで実際の入出力を行い、サヌバクラむアントがそのうえでツヌルやリ゜ヌスなどの機胜をやり取りする構造が敎えられおいたす。


実際に䜜っおみよう

以䞋では、MCP サヌバずMCP クラむアントを、それぞれ実際に動かすための最小限のコヌドず、内郚コンポヌネントのカスタマむズ方法をたずめたす。

「MCP にはプロトコル局やトランスポヌト局など、いろいろある」ず蚀っおも、実際に実装する時は色んな䟿利ツヌルがあるので、簡単に実装できたす

最小サンプルサヌバ (mini_server.py)

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hello")

@mcp.tool()
async def hello_world(name: str) -> str:
    return f"Hello, {name}!"

if __name__ == "__main__":
    # stdioで通信
    mcp.run(transport="stdio")

ポむント:

  • FastMCP("hello") でサヌバを䜜成し、@mcp.tool() で超シンプルなツヌルを1぀登録。
  • mcp.run(transport="stdio") により、stdioベヌスでクラむアントずの通信が行われる。

最小サンプルクラむアント (mini_client.py)

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

async def main():
    # (A) サヌバスクリプトを python で起動
    server_params = StdioServerParameters(command="python", args=["mini_server.py"])

    # (B) async with を䜿っお stdio_client を起動・管理
    async with stdio_client(server_params) as (read_stream, write_stream):
        async with ClientSession(read_stream, write_stream) as session:
            # Initialize the connection
            await session.initialize()

            # (C) ツヌル呌び出し: hello_world
            result = await session.call_tool("hello_world", {"name": "MCP"})
            print("Tool result:", result.content)

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

ポむント:

  1. (A) で「mini_server.py を Python で実行し、stdin/stdout を぀ないだトランスポヌト」を確立。
  2. (B) で ClientSession を䜿い、initialize() を呌んでサヌバず初期化を完了。
  3. (C) call_tool("hello_world", {"name": "MCP"}) でサヌバの hello_world が動き、「Hello, MCP!」ずいったレスポンスを取埗。

ナヌザが実装すべきずころ vs. MCPの内郚ロゞック

実装者が手を入れる郚分

  • ツヌルリ゜ヌスプロンプトの登録

    たずえば「このHTTP APIを呌ぶツヌル」「ロヌカルファむルを返すリ゜ヌス」「定型文を返すプロンプト」などを、MCPサヌバに登録する。

  • どのトランスポヌトを䜿うか

    䟋: 暙準入出力 (stdio) か Streamable HTTP を䜿うか、あるいは独自実装するか。

  • サヌバの名前やバヌゞョン

    weather サヌバなら、name="weather" のように指定しおおくずクラむアントぞの情報ずしお返される。

MCP内郚で自動化されるもの

  • ServerSessionプロトコル局

    リク゚ストが来たら JSON-RPC ずしお解析→察応するデコレヌタ付き関数を呌ぶ→レスポンスを構築 ずいう流れ。

    普段はあたり意識せずに、@server.tool() のようなデコレヌタだけ曞けばOK。

  • 通信たわり (Transport)

    たずえば mcp.run(transport="stdio") ず曞くだけで、暙準入出力を甚いた受信→パヌス→呌び出し→応答 が裏で行われる。


MCPの抂芁を調べおみたした。
抂念を理解できるず、他のMCPサヌビスの利甚はもちろん、自分自身のMCPサヌバを䜜ったり、いろいろできるず思いたす。
実際の公匏サむトのサンプルコヌドが参考になりたすので、参考にしおください。
https://github.com/modelcontextprotocol/python-sdk

远加

SSEがオプショナルになりStreamable HTTPが掚薊されるようになったらしいです。公匏ホヌムペヌゞなどのドキュメントはただSSEの情報になっおいたす。
進化が早く、毎日のように内容が曎新されおいたす。本蚘事の内容は2025-03-26の内容をベヌスにしおいたす。

https://spec.modelcontextprotocol.io/specification/2025-03-26/changelog/

束尟研究所テックブログ

Discussion