RustでGoogle CalendarのMCPを実装した話 / Implementing Google Calendar MCP in Rust
by
shuntaka
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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開発楽し過ぎる🎉 以上となります。ご清聴ありがとうございました🙇