Slide 1

Slide 1 text

RustでGoogle Calendarの MCPを実装した話 2025/02/27 Osaki.rs shuntaka 1

Slide 2

Slide 2 text

⾃⼰紹介 2 shuntaka/髙橋俊⼀ 業務: TypeScript/AWS/Backend 趣味: Go/Rust/Neovim/Nix 所属: クラスメソッド 製造ビジネステクノロジー部 TypeScriptでライブラリやGo/Rust(new!)でCLIを作るのが好きです ddbrew/gh-p2/oax/s3-concat/preview-asciidoc.vim … shuntaka.dev/who

Slide 3

Slide 3 text

Model Context Protocol(MCP)と は? 3

Slide 4

Slide 4 text

Tool use (function calling) 4 事前にLLMに特定の関数を与え、LLMが 問いに応じて関数を実⾏する機能 エミュレーターでボタン押下の順序を実⾏します。これ はゲームと対話するための主要なツールです。エミュ レーターを使⽤するには、順番に押されるボタンのリス トを提供します。有効なボタンは 'a'、'b'、'up'、 'down'、'left'、'right'、'start'、および 'select' です。 さらに、'wait' ボタンを提供して2秒間のフレームを経過 させることができます。 LLMに渡されるツール

Slide 5

Slide 5 text

Tool use (function calling) 5 = LLMに渡されるツール

Slide 6

Slide 6 text

6 Tool use (function calling) LLMに渡されるツール

Slide 7

Slide 7 text

7 Tool use (function calling) LLMに渡されるツール

Slide 8

Slide 8 text

Model Context Protocol(MCP)とは? 8 LLMに必要なコンテキストを提供するプロトコル (Anthropicが主体で策定) 参考: Model Context Protocol

Slide 9

Slide 9 text

Model Context Protocol(MCP)とは? 9 クラサバ間は標準⼊出⼒ or SSE で通信。メッセージはJSON-RPC 2.0。 参考: Model Context Protocol

Slide 10

Slide 10 text

CLIの機能紹介 github.com/shuntaka9576/cal2prompt 10

Slide 11

Slide 11 text

機能紹介 1/2 11 💡プロンプト作成機能 Googleカレンダー情報(JSON)を LLMプロンプト(テキスト)にする ※ 動画です

Slide 12

Slide 12 text

12 💡MCPサーバー機能 引数MCPでMCPサーバー起動 1. stdinへリクエストJSON読込 2. Googleカレンダーリソース操作 3. stdoutへ結果をJSON出⼒ 機能紹介 2/2 ※ 動画です

Slide 13

Slide 13 text

MCP連携シーケンス 13

Slide 14

Slide 14 text

Claude DesktopとMCP連携例 14 リクエスト レスポンス

Slide 15

Slide 15 text

RustでCLI開発話 15

Slide 16

Slide 16 text

RustでCLI開発話 16 ‧RPC通信 ‧テンプレートエンジン ‧コンフィグファイル ‧OAuth2.0フロー対応 ‧クロスプラットフォーム対応

Slide 17

Slide 17 text

標準⼊出⼒を使ったRPC(JSON RPC 2.0) 17

Slide 18

Slide 18 text

‧RPC通信 ‧テンプレートエンジン ‧コンフィグファイル ‧OAuth2.0フロー対応 ‧クロスプラットフォーム対応 RustでCLI開発話 18

Slide 19

Slide 19 text

テンプレートエンジン 19 プロンプト作成機能のテンプレートエンジンで、minijinjaを採⽤ ‧mitsuhiko製(rye, flask作者) ‧Jinja2テンプレート ‧依存がserdeのみ

Slide 20

Slide 20 text

テンプレートエンジン 20 Jinja2テンプレート Rustレンダリング実装

Slide 21

Slide 21 text

‧RPC通信 ‧テンプレートエンジン ‧コンフィグファイル ‧OAuth2.0フロー対応 ‧クロスプラットフォーム対応 RustでCLI開発話 21

Slide 22

Slide 22 text

コンフィグファイル 22 CLI引数だけだと困難なためコンフィグファイルを検討 😭 ‧GoogleのクライアントID/クライアントシークレット ‧プロンプトのJinja2カスタマイズ → 改⾏がゴリゴリ⼊る... いつもはTOMLだが... WezTermの実装でLuaをvendor可能なmlua-rs/mluaクレートを発⾒ 🤩

Slide 23

Slide 23 text

23 コンフィグファイル コンフィグを実行前にglobalでcal2promptモジュールを定義 テンプレートエンジンのプリセット定義

Slide 24

Slide 24 text

24 コンフィグファイル コンフィグをeval前にLuaの cal2promptモジュールを定義 Luaコンフィグの⾯⽩さ... stdlibが使えるので、ユーザーのカスタマイズ余地が上がる ‧ファイル操作 ‧⽂字列操作 ‧OS周りの操作 コンフィグの分割が可能 → 公開dotfilesユーザーフレンドリー😂

Slide 25

Slide 25 text

‧RPC通信 ‧テンプレートエンジン ‧コンフィグファイル ‧OAuth2.0フロー対応 ‧クロスプラットフォーム対応 RustでCLI開発話 25

Slide 26

Slide 26 text

Google APIとOAuth 2.0フロー実装 26 以下のクレートを活⽤ ‧oauth2   ramosbugs/oauth2-rs ‧webbrowser   amodm/webbrowser-rs

Slide 27

Slide 27 text

‧RPC通信 ‧テンプレートエンジン ‧コンフィグファイル ‧OAuth2.0フロー対応 ‧クロスプラットフォーム対応 RustでCLI開発話 27

Slide 28

Slide 28 text

クロスプラットフォーム対応 28 クロスコンパイルで対応 参考: https://dev.classmethod.jp/articles/shuntaka-rust-cli-with-goreleaser-tagpr-brew-tap/

Slide 29

Slide 29 text

macos runnerでビルドする理由 29 Linux環境だとCoreFoundationとのリンクエラーになる → macのSDKが必要。時間が取れず妥協...

Slide 30

Slide 30 text

OpenSSL周り 30 ‧macos runnerだとx86 linux ビル ド時、openssl周りでエラーになる → openssl = { version = "0.10", features = ["vendored"] } にする → コンパイル時間が増加 → reqwestでrust-tlsを使うようにし て、opensslを削除 openssl(vendored) → rust-tls で6分程度早くなった

Slide 31

Slide 31 text

‧RPC通信 ‧テンプレートエンジン ‧コンフィグファイル ‧OAuth2.0フロー対応 ‧クロスプラットフォーム対応 RustでCLI開発話 31

Slide 32

Slide 32 text

32 RustでCLI開発楽し過ぎる🎉 以上となります。ご清聴ありがとうございました🙇