Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin で始める MCP 入門

Kotlin で始める MCP 入門

Kyoto.kt #3

Avatar for rokuosan

rokuosan

May 10, 2025
Tweet

More Decks by rokuosan

Other Decks in Technology

Transcript

  1. About me (5.0s) • id:rokuokun / rokuosan / ろくお •

    Kotlin はいいなって思ってます。 • https://x.com/rokuosan_dev • AI ツールチェーン使いこなせてない • Kyoto.kt やっていき
  2. 自分が知っている MCP • Model Context Protocol • Anthropic が去年の11月に突然言い出した。 •

    LLM がアプリケーションを操作するための プロトコル → インタフェースの置き換え
  3. 自分が知っている MCP • Model Context Protocol • Anthropic が去年の11月に突然言い出した。 •

    LLM がアプリケーションを操作するための プロトコル → インタフェースの置き換えが起きる 若者としてコレはイカンでしょ
  4. MCP Core Concepts (For Server) • Resources ◦ File-like data

    that can be read by clients (like API responses or file contents) • Tools ◦ Functions that can be called by the LLM (with user approval) • Prompts ◦ Pre-written templates that help users accomplish specific tasks
  5. MCP Core Concepts をゆるく読むと • Resources ◦ URI でデータを表現して提供できる(OS API

    以外にも Web API とかも呼べる) • Tools ◦ LLMから呼び出しできる関数 • Prompts ◦ プロンプトのテンプレートを記述できる
  6. 感想と疑問 • これだけ読むと Resources は Tools として使えるのでは? ◦ 通常の関数呼び出しのほか API

    呼び出しもできる ◦ “事実上” Tools と同じ役割を果たすことができそう ◦ Tools は実行にユーザー承認が必要だが、Resources はそうでない ◦ つまり許可なしでなんでも実行できちゃう!?!?
  7. Resources をよく読んでみる • そもそも LLM にコンテキストとして情報を渡す目的 • Resources は application-controlled(あるいは

    application-driven) ◦ ユーザーが「添付ファイル」としてLLMに投げるみたいなユースケース ◦ 例: MCP の最新の Specification をいつでもサッと取り出す ▪ https://modelcontextprotocol.io/llms-full.txt にアクセスして常に最新の spec を保った状態で質問ができる ▪ HTTP Scheme の場合、その URL にユーザーがアクセスできるべき(SHOULD) • LLM からではなく、人間からの呼び出しを想像すると良い
  8. Resources 裏ワザ(?) • mcp 入門で UUID 作成する程度なら実は Resources でもできたりする ◦

    Claude Desktop はResourceをキャッシュするわけじゃないので、 添付するごとにUUIDが更新される
  9. Tools / JSON Schema https://modelcontextprotocol.io/docs/concepts/tools • データ構造は→ • annotation で

    メタデータ付与が できる openWorldHintが 個人的にいい名前で好き
  10. Kotlin の MCP SDK 事情 • Kotlin 向け MCP 公式

    SDK があるのでそれを使う • 元々 JetBrains が作っていたものを公式側に取り入れたぽい空気を感じる • https://github.com/modelcontextprotocol/kotlin-sdk • 対応 Transport ◦ Stdio (標準入出力) ◦ Server-Sent Event (SSE)
  11. Streamable HTTP は未対応(2025/05/10時点) • 新しい Transport として Streamable HTTP が追加されたが...

    • 現在の Kotlin SDK (v0.5.0)では使えない • コントリビューションチャンスかと思ったらすでに取り組まれていた ◦ https://github.com/modelcontextprotocol/kotlin-sdk/pull/87 ◦ まだもう少しかかりそう
  12. UUID 生成 MCP サーバー • 雰囲気を知るにはちょうどいいって Twitter でみた • ちなみに

    Kotlin の UUID 事情 ◦ Kotlin 2.0 から標準 API に kotlin.uuid.Uuid が追加された ◦ まだ Experimental なので @OptIn(ExperimentalUuidApi::class) アノテーションが必須 ◦ UUIDv4 のみ生成可能 • 標準入出力と SSE の両方を試してみる
  13. Server-Sent Event Transport (1/2) • Ktor MCP Plugin を使うとこれだけで OK

    • embeddedServer を CIO をエンジンとして起動する • mcp {} では MCP Server のインスタンスを返すだけ
  14. Claude Desktop で使ってみる • 温かみのある JSON 手書き • Settings >

    Developer をみる • 登録したら Restart • command は絶対パスにしておく • stdio しか対応していない?
  15. Resource から MCP Spec をとる • MCP の SDK に

    Ktor Client がある • 素直に fetch して値を返す
  16. Resource から MCP Spec をとる • Claude Desktop でやってみる •

    できた • 無料枠だと長さ制限に達する
  17. テスト方法 • 1. クライアントから実際に呼び出す • 2. Handler だけテスト • 3.

    Handler の中のロジックだけテスト 2, 3 やっておけばまぁ安心でしょ (クラアントも SDK で作れるので1もやれる)
  18. MCP with Kotlin のまとめ • サンプルコードを見つつ実装した • 苦しさはない • 今後の主流になる

    Streamable HTTP は今後実装されるぽいので期待 • 割とサッとかけて嬉しい • Resources を使いこなすとインスタント NotebookLM ぽいことができる • MCP開発は思ったより快適にできる