MCP プロトコルを自前ライブラリに適合のメモ
背景
猫も杓子も MCP.
自前アプリやサービスで MCP(Model Context Protocol) インターフェイス提供したい
tinyusdz での例を取り上げます.
とりま
メッセージは POST only の JSON-RPC でやりとりします. REST API 知ってれば余裕カモ.
Schema
バイナリは base64 or base122 にしてやり取りするか, サイズ大きければ uri 経由にする.
initialize
初期化 request
Accept はここ最近の MCP server(2025/07 時点)では application/json,text/event-stream 両方指定する必要がある.
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json,text/event-stream" \
-d '{
"jsonrpc": "2.0",
"method": "initialize",
"params": {
"protocolVersion": "2025-03-26",
"capabilities": {
"tools": {},
"resources": {}
},
"clientInfo": {
"name": "curl-client",
"version": "1.0.0"
}
},
"id": 1
}' \
http://localhost:8085/mcp
initialize の response では mcp-session-id(UUID) が HTTP ヘッダについているので, 以後はこの id をリクエストヘッダに付ける(リクエストの時は Mcp-Session-Idだが大文字小文字は区別するんじゃろか)
notifications/initialized を aknowledge する.
サーバからの response は 202 Accept になる
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json,text/event-stream" \
-H "Mcp-Session-Id: 0000000000000000" \
-d '{
"jsonrpc": "2.0",
"method": "notifications/initialized"
}' \
http://localhost:8085/mcp
Protocols
とりあえず tools と resources を提供すればよいでしょう.
Tools
処理コマンドとか.
tools/list で利用可能なツールを列挙し,
tools/call でツール呼び出し.
Resources
リソースの情報を提供. ファイルとか.
ただし Claude for Desktop などでは対応していないのと, セキュリティ関係もあり, あまり使われないかも(Tools で代用できるし)
resources/read ではリソース自体を読んで返す(text or binary)
バイナリの場合は base64 にする.
データサイズ大きい場合は 'resouces/read' ではなく 'tools/call' で uri 返す(+ websocket でバイナリ渡し)などの方がいいかも
resources/write はセキュリティの関係上無い. リソースを追加したい場合は,
tools/call で読んで resources に追加(サーバ側で)となるだろうか.
サーバ側に DB 機能つけるといいかも.
response の構成
text か image(base64 string) しかない. したがって JSON 文字列として返すのが基本となる.
Protocol version 2025-06-18 から structual output に対応して JSON Object で response 結果を返すことができるようになった. outputSchema で定義する.
ただし MCP client 側などでの対応に時間がかかると思われるので普及するのは 2025 秋くらいからだろうか.
LLM との連携
たぶん tools/list での description とかシッカリ記述してあげれば, LLM がよろしく解釈してくれると予想!
Claude for Desktop との連携
Claude for Desktop の MCP では現状(2025/07) Resources は対応していない. ファイル読み書きみたいなことは tools 経由で行う必要がある.
さらなる高みへ
メッセージやコマンドの確認などは Inspector で
Discussion