MCPとUSBエニュメレーションで読み解く「AIにとってのUSB-C」比喩

MCPとUSBエニュメレーションで読み解く「AIにとってのUSB-C」比喩 数値計算
MCPとUSBエニュメレーションで読み解く「AIにとってのUSB-C」比喩

その他のエッセイはこちら

USB-Cは“口”の比喩であり、本文は“列挙手順(エニュメレーション)”の話です。
MCPは、AIアプリが外部機能を「列挙してから呼び出す」ための共通手順を提供します。
USBのエニュメレーション(記述子を読み、機能を把握する流れ)と並べると、MCPの initialize / list_* がどこを標準化しているか見えます。

USB-Cという言い方は本来、コネクタ/ケーブル(加えてUSB PDやAlt Mode)を強く連想させます(仕様配布の起点: https://www.usb.org/documents )。
一方で本記事の説明軸は、USB“プロトコル一般”の話としてのエニュメレーション(接続後に正体と機能を読み取る手順)です(USB 2.0仕様: https://www.usb.org/document-library/usb-20-specification )。
つまり「USB-C=統一された口」という比喩を借りつつ、技術説明はUSBエニュメレーション(プロトコル手順)で行います。


  1. PC・スマホ体験に見る同一性と乖離
    1. 体験レベルの同一性
    2. 体験レベルの乖離
  2. USBエニュメレーションとMCPライフサイクル
    1. USBエニュメレーション概要
    2. MCP初期化・機能発見・運用開始
    3. 対応づけ(インターフェースディスクリプタ相当の感覚)
  3. Streamable HTTP transportと旧HTTP+SSEの差分
  4. 動的な更新の扱い
    1. リストが変わる(listChanged)
    2. 個別の対象が更新される(subscribe)
  5. 電文例で見るUSBとMCP
    1. USB電文例(制御転送Setupパケット)
    2. MCP電文例(JSON-RPC)
  6. Authorizationと認証・権限
  7. MCP Registryとサーバ発見
  8. USBとMCPの比較表
    1. 比較表(全体像)
    2. 比較表(ライフサイクル対応)
  9. それでも乖離するもの
  10. FAQ
    1. USB-Cの話なのにUSBエニュメレーションを中心にする理由
    2. MCPのinitializeの後に必要な手順
    3. Streamable HTTPと旧HTTP+SSEの関係
    4. resourcesの動的更新はlistChangedだけか
    5. 認証・権限がUSB比喩を崩す最大要因なのはなぜか
  11. 参考文献
  12. まとめ
  13. USBプロトコル・エニュメレーション(列挙手順の芯)
  14. USB Type-C / USB PD / Alt Mode(“口”の比喩の世界)
  15. OS・ドライバ(USBドライバ/デバイスモデルの側)
  16. API設計(MCPのtools/resourcesを“設計対象”として見る)
  17. 認証・認可(USB比喩が最も崩れる要因の補強)
  18. APIセキュリティ(“ツール呼び出し”の安全側)
  19. サービス発見・レジストリ(“挿したら増える”体験の上位レイヤ)
  20. ざっくりの読み順(迷ったとき)

PC・スマホ体験に見る同一性と乖離

PCやスマホにUSB機器を挿す体験を軸にすると、「AIにとってのUSB-C」という比喩が何を指すかがつかみやすくなります。MCPの役割分担(Host / Client / Server)は https://modelcontextprotocol.io/docs/learn/architecture にまとまっています。

体験レベルの同一性

USBとMCPには「つないだ後に使えるものが増える」という共通の手触りがあります。

  • 接続後の機能増加
  • 正体の後追い判定
  • 1つの口で多様な相手

USBではOSがデバイスを認識し、記述子を読み、ドライバを当てて使える状態にします。MCPではHostがServerに接続し、初期化して、tools/resources/promptsを列挙してから利用に入ります(Lifecycle: https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle )。

体験レベルの乖離

体験としては、次の違いが分かれ目になります。

  • OS標準体験 / アプリ設計依存
  • 自動化(ドライバ選択) / 確認・統制(実行許可・監査)
  • 静的な機能(記述子) / 動的に変化しうる提供物(list結果)

MCPはOS機能ではなく、基本的にAIアプリ(MCP Host)が主役です。そのため、どこまで自動化するか、どこでユーザー確認を入れるかが実装や運用方針に強く依存します。


USBエニュメレーションとMCPライフサイクル

ここではUSBのエニュメレーション概要を押さえたうえで、MCPの initialize と list_*、そして通知や購読(subscriptions)を対応づけます。

USBエニュメレーション概要

USBではホストが段階的に情報を取得し、デバイスがどんな構成・インターフェース・エンドポイントを持つかを把握します。USB記述子(Device/Configuration/Interface/Endpointなど)の整理は、Microsoft Learnの説明が掴みやすいです。
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/usbcon/standard-usb-descriptors
https://learn.microsoft.com/en-us/windows-hardware/drivers/usbcon/usb-configuration-descriptors

流れのイメージは次の通りです。

  • 接続検知・初期状態確立
  • Device Descriptor 取得
  • アドレス付与(SET_ADDRESS)
  • Configuration/Interface/Endpoint 取得
  • 構成選択(SET_CONFIGURATION)
  • ドライババインド、通常転送へ

USB 2.0仕様の配布ページは https://www.usb.org/document-library/usb-20-specification です。

MCP初期化・機能発見・運用開始

MCPは接続後に initialize を実施し、プロトコルバージョンやcapabilitiesをすり合わせます(Lifecycle: https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle )。
ポイントは、initialize が成功した後に、クライアントが notifications/initialized を送って「通常運用に入れる」ことを明示する点です(同じくLifecycleに記載があります)。
その後、サーバが提供できるものを列挙して、ホストが利用可能状態にします。

対応づけ(インターフェースディスクリプタ相当の感覚)

USBでホストが記述子を読んで「どう扱えるか」を決めるのと同様に、MCPでもホストが list_* を通じて「何が呼べるか」を確定していきます。

  • GET_DESCRIPTOR(機能の自己申告) / list_*(提供物の自己申告)
  • SET_CONFIGURATION → ドライババインド(扱い方の確定) / Hostがツール定義をLLM/tool-callingに接続し、実行制御へ組み込み
  • 通常転送(endpoint) / tools/call 等のRPC呼び出し

Streamable HTTP transportと旧HTTP+SSEの差分

MCPのHTTP系transportは、2025-06-18仕様では Streamable HTTP が中心です(Transports: https://modelcontextprotocol.io/specification/2025-06-18/basic/transports )。
Streamable HTTP は 2024-11-05の HTTP+SSE transport を置き換える位置づけです(同じくTransportsに記載があります)。

差分の要点は次の通りです。

  • Streamable HTTP: 単一の “MCP endpoint” がPOST/GETの両方を受ける
  • クライアント→サーバ: JSON-RPC 1通につきHTTP POST 1回
  • サーバ→クライアント: 応答が application/json の1発返しの場合も、text/event-stream(SSE)でストリームする場合もある
  • 旧HTTP+SSE互換: 古い方式は「POST用のエンドポイント」と「SSE用のエンドポイント」が別で、互換のために両方ホストする指針が書かれている

USB比喩で言うなら「物理層の話」ではなく「運搬手段の整理」です。USBのendpointと1対1対応させるより、MCPは“呼び出し規約の上に運搬手段が載る”と捉えたほうが混乱が少ないです。


動的な更新の扱い

MCPで「動的に変わりうる提供物」を説明するなら、2種類に分けると整理しやすいです(resources仕様: https://modelcontextprotocol.io/specification/2025-06-18/server/resources )。

リストが変わる(listChanged)

tools/resources/promptsの“一覧”が変わる場合、listChangedの宣言と list_changed 通知が軸になります。
toolsのリスト変更通知は tools仕様に記載があります(Tools: https://modelcontextprotocol.io/specification/2025-06-18/server/tools )。

  • リスト変更: notifications/tools/list_changed

個別の対象が更新される(subscribe)

resourcesは、一覧とは別に「個別リソース更新」を購読できます。capabilitiesで subscribe を宣言し、クライアントが resources/subscribe を送ると、更新時に notifications/resources/updated を受け取れます(Resources: https://modelcontextprotocol.io/specification/2025-06-18/server/resources )。

  • 購読: resources/subscribe
  • 更新通知: notifications/resources/updated

USB側にも「構成を読む→構成を選ぶ」という意味で選択肢はありますが、MCPのsubscribe/listChangedは“差分を押し出す”設計要素として明示されている点が大きく異なります。

USBエニュメレーションとMCPのinitialize・list・通知・購読の流れを並べた対応図
図1:USBエニュメレーションとMCP初期化・機能発見・通知/購読の対応

電文例で見るUSBとMCP

「列挙」を手触りに落とすために、超簡単な“電文例”を並べます。USBは制御転送のSetupパケット、MCPはJSON-RPCメッセージとして見ます。

USB電文例(制御転送Setupパケット)

標準デバイス要求の要約としては、Microsoft Open Specificationsの説明も参考になります。
https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-gipusb/1d54ceb1-8c6d-4941-ab74-547f1d715add

GET_DESCRIPTOR(Device) の例です。

Setup (8 bytes)
bmRequestType: 80
bRequest:      06
wValue:        0100
wIndex:        0000
wLength:       0012

SET_ADDRESS の例です。

Setup (8 bytes)
bmRequestType: 00
bRequest:      05
wValue:        0005
wIndex:        0000
wLength:       0000

MCP電文例(JSON-RPC)

初期化は initialize →(成功後)notifications/initialized の順番が明示されています(Lifecycle: https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle )。

initialize の最小イメージです。

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-06-18",
    "capabilities": {
      "tools": {},
      "resources": {},
      "prompts": {}
    },
    "clientInfo": {
      "name": "example-host",
      "version": "0.1.0"
    }
  }
}

運用開始通知です。

{
  "jsonrpc": "2.0",
  "method": "notifications/initialized"
}

resources購読の例です(Resources: https://modelcontextprotocol.io/specification/2025-06-18/server/resources )。

{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "resources/subscribe",
  "params": {
    "uri": "file:///project/src/main.rs"
  }
}

更新通知の例です。

{
  "jsonrpc": "2.0",
  "method": "notifications/resources/updated",
  "params": {
    "uri": "file:///project/src/main.rs"
  }
}

Authorizationと認証・権限

USB比喩が崩れる最大要因は、認証・権限が体験の中心に出てくる点です。MCPはAuthorizationをtransportレベルの仕様として持ち、HTTP系transport向けの認可フローを定義します(Authorization: https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization )。

仕様上の整理を最小の表にすると、こうなります。

transport推奨される扱い理由の要点
HTTP系(Streamable HTTP)Authorization仕様に従うことを推奨認可フローをHTTPベースで定義
STDIOAuthorization仕様に従うべきではない環境から資格情報を取得する方針

Authorization仕様は、OAuth 2.1(ドラフト)や関連RFCを前提にしています(仕様内の一覧を参照)。ここはUSBの「挿すだけ体験」と決定的に違うため、比喩を使う場合は早めに釘を刺すほうが誤解が減ります。


MCP Registryとサーバ発見

「機能発見(list_*)」のもう一段上として、そもそも“どのサーバをつなぐか”という発見があります。ここで登場するのが Registry です(概要: https://modelcontextprotocol.io/registry/about )。

MCP Registryは「公開MCPサーバのメタデータを集約する公式の集中リポジトリ」で、サーバ作者が server.json 形式のメタデータを公開し、REST APIで発見できるようにする位置づけです。
メタデータには、サーバの所在(パッケージ名やURL)や実行手順(引数、環境変数)などが含まれます(同ページに記載があります)。
実装リポジトリは https://github.com/modelcontextprotocol/registry です。

注意点として、公式Registryはホストアプリが直接叩く前提ではなく、下流のマーケットプレイス/集約サービスが消費する想定が書かれています。USB比喩で言うなら、これは「USB機器そのもの」ではなく「周辺機器のカタログ/流通」に近い層です。


USBとMCPの比較表

比較表(全体像)

観点USB(PC/スマホ ↔ 周辺機器)MCP(Host ↔ Server ↔ LLM)補足
目的周辺機器との通信標準化外部ツール/データ接続標準化“統一された口”の比喩の射程
主役OS/ホストコントローラMCP Host(オーケストレータ)アプリ設計の影響度
機能の自己申告記述子(Descriptor)tools/resources/prompts 定義接続後に機械可読で可視化
機能の列挙GET_DESCRIPTORlist_*(tools/list等)インターフェースディスクリプタ相当の感覚
使い方の確定ドライババインドLLMの選択+Hostの実行制御意思決定の性格差
通信路の位置づけendpoint/転送方式が中心transportは別レイヤStreamable HTTPが中心(Transports: https://modelcontextprotocol.io/specification/2025-06-18/basic/transports
動的更新再列挙寄りlistChanged/subscribeで差分反映resourcesのsubscribeが典型(Resources: https://modelcontextprotocol.io/specification/2025-06-18/server/resources
認証・権限体験の中心になりにくい比喩が崩れる最大要因Authorization仕様(https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization

比較表(ライフサイクル対応)

フェーズUSBMCP似る点ズレる点
接続開始物理接続transport確立(stdio/Streamable HTTP)セッション開始物理層 / アプリ層
初期化resetinitialize → notifications/initialized前提条件の確立運用開始合図の明示
機能発見GET_DESCRIPTORlist_*(tools/resources/prompts)機能セット列挙入力スキーマという高レベル情報
動的更新再列挙寄りlist_changed / subscribe変化への追従差分通知と購読
通常運用endpoint転送tools/call 等実処理往復USBは転送方式、MCPは呼び出し規約
USB記述子階層とMCPのlistChanged/subscribeを比較した図
図2:USB記述子階層とMCPのlistChanged/subscribeの比較

それでも乖離するもの

USB比喩が便利でも、どうしても対にならない領域があります。

  • 意思決定の性格差(決定的 / 確率的)
  • 認証・権限の中心性(物理中心 / 外部連携中心)
  • 動的更新の押し出し(再列挙寄り / listChanged・subscribe)
  • サーバ発見の層(ローカル接続 / Registry・マーケットプレイス)

MCPはツール実行が外部システムに作用しうるため、Host側の許可、検証、監査、出力整形が重要になります。HTTP系ではOrigin検証なども論点になります(Transports: https://modelcontextprotocol.io/specification/2025-06-18/basic/transports )。


FAQ

USB-Cの話なのにUSBエニュメレーションを中心にする理由

USB-Cは主にコネクタ/ケーブル(加えてUSB PDやAlt Mode)を連想させます(起点: https://www.usb.org/documents )。一方で「挿したら相手の機能が分かって使える」という体験の芯は、USBプロトコル一般のエニュメレーション(記述子取得)で説明しやすいです(記述子: https://learn.microsoft.com/ja-jp/windows-hardware/drivers/usbcon/standard-usb-descriptors )。

MCPのinitializeの後に必要な手順

initializeが成功した後、クライアントが notifications/initialized を送って通常運用開始を通知します(Lifecycle: https://modelcontextprotocol.io/specification/2025-06-18/basic/lifecycle )。

Streamable HTTPと旧HTTP+SSEの関係

2025-06-18仕様ではStreamable HTTPが中心で、2024-11-05仕様のHTTP+SSE transportを置き換える位置づけです(Transports: https://modelcontextprotocol.io/specification/2025-06-18/basic/transports )。

resourcesの動的更新はlistChangedだけか

listChangedは一覧の変化です。個別リソースの変化は subscribe で購読し、notifications/resources/updated で更新通知を受け取れます(Resources: https://modelcontextprotocol.io/specification/2025-06-18/server/resources )。

認証・権限がUSB比喩を崩す最大要因なのはなぜか

HTTP系transportではAuthorization仕様に従うことが推奨され、STDIOではAuthorization仕様を使わず環境から資格情報を取得する方針です(Authorization: https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization )。


参考文献


まとめ

USB-Cは“口”の比喩であり、本文はUSBエニュメレーション(列挙手順)を軸にMCPのinitialize/list/通知・購読・認可を比較しました。
MCPはStreamable HTTPが中心で、旧HTTP+SSEとの差分を押さえると仕様読み替えが楽になります。
動的更新はlistChangedだけでなくresourcesのsubscribe/updatedも使えるため、USBの再列挙との差がよりはっきりします。

  • 比喩の射程: USB-C=統一された口
  • 本文の技術軸: 列挙手順(USB)と機能発見・動的更新(MCP)
  • 最大の乖離: 認証・権限とサーバ発見(Registry)

その他のエッセイはこちら


USBプロトコル・エニュメレーション(列挙手順の芯)

USBコンプリート 第3版(Jan Axelson 著/邦訳)
エニュメレーション(コントロール転送)を含め、USBデバイス開発を横断的に整理できる

Amazon.co.jp : USBコンプリート Jan Axelson

USB 3.0設計のすべて(CQ出版)
物理層~リンク/プロトコル、バス・エニュメレーションまで含めて「規格の読み方」を鍛えやすい

Amazon.co.jp : USB 3.0設計のすべて(CQ出版)

USB Type-C / USB PD / Alt Mode(“口”の比喩の世界)

USB Type-Cのすべて(CQ出版)
Type-Cのメカニズム、PD、Alternate Modeまでを規格ベースで整理

Amazon.co.jp : USB Type-Cのすべて(CQ出版)

OS・ドライバ(USBドライバ/デバイスモデルの側)

Linuxデバイスドライバ 第3版(O’Reilly Japan)
カーネル2.6世代の内容だが、USBドライバを含む「デバイスモデルの考え方」を掴む用途で強い

Amazon.co.jp : Linuxデバイスドライバ 第3版(O’Reilly Japan)

API設計(MCPのtools/resourcesを“設計対象”として見る)

Web APIの設計(翔泳社)
APIのゴール設計、表現、一貫性、進化、ドキュメントまでを設計目線で通せる

Amazon.co.jp : Web APIの設計(翔泳社)

APIファースト Postmanで学ぶ効率的かつ柔軟な開発アプローチ(翔泳社)
ライフサイクルに沿って設計・ドキュメント・テスト・公開/ディスカバリまで扱う

Amazon.co.jp : APIファースト Postmanで学ぶ効率的かつ柔軟な開発アプローチ(翔泳社)

認証・認可(USB比喩が最も崩れる要因の補強)

OAuth徹底入門 セキュアな認可システムを適用するための原則と実践(翔泳社)
OAuthを「実装・脆弱性・拡張」まで含めて体系化。MCPのAuthorization章を読む前後に効く

Amazon.co.jp : OAuth徹底入門 セキュアな認可システムを適用するための原則と実践(翔泳社)

実践 Keycloak(O’Reilly Japan)
OIDC/OAuth 2.0の基礎も押さえつつ、実運用のIAMとしての落とし所が見える

Amazon.co.jp : 実践 Keycloak(O’Reilly Japan)

APIセキュリティ(“ツール呼び出し”の安全側)

ハッキングAPI ―Web APIを攻撃から守るためのテスト技法(O’Reilly Japan)
REST中心だが、APIをどう壊されるか→どう守るかを実践で掴める

Amazon.co.jp : ハッキングAPI ―Web APIを攻撃から守るためのテスト技法(O’Reilly Japan)

セキュア・バイ・デザイン―安全なソフトウェア設計(邦訳)
設計にセキュリティを組み込む発想。認可・境界設計の考え方の補強に使える

Amazon.co.jp : セキュア・バイ・デザイン―安全なソフトウェア設計(邦訳)

サービス発見・レジストリ(“挿したら増える”体験の上位レイヤ)

マイクロサービスパターン 実践的システムデザインのためのコード解説(インプレス)
外部API/通信/トランザクション/運用などをパターンで整理。Registry的な話題とも相性が良い

Amazon.co.jp : マイクロサービスパターン 実践的システムデザインのためのコード解説(インプレス)

絵で見てわかるマイクロサービスの仕組み(翔泳社)
クラウドネイティブ全体像を掴む用途。サービス発見・メッシュの話に入る前の地ならし

Amazon.co.jp : 絵で見てわかるマイクロサービスの仕組み(翔泳社)

ざっくりの読み順(迷ったとき)

  • USB列挙の芯: USBコンプリート → USB 3.0設計のすべて
  • “口”の比喩: USB Type-Cのすべて
  • MCP側の設計: Web APIの設計 → APIファースト
  • 最大の乖離(認証・権限): OAuth徹底入門 → 実践 Keycloak → ハッキングAPI

コメント

This website stores cookies on your computer. These cookies are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to to opt-out of any future tracking, a cookie will be setup in your browser to remember this choice for one year.

Accept or Deny
タイトルとURLをコピーしました