iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

FastMCPでMCPアプリを構築して遊んでみる

はじめに

こんにちは!iimonでエンジニアをしているひがです!
個人的な話ですが最近禁煙を始めて1ヶ月が経ちまして、禁断症状などもなく順調に進んで体調も良くなった気がします!
結構面倒くさがりな性格なので、タバコを買うのが面倒くさくて順調に禁煙できています!(あまり自分自身のことは好きじゃないですが、その性格の一部には感謝してます)
ただ禁酒は無理そうです!ビールがすこぶる好きです!!あと猫も好きです!!

ということで、今回はFastMCPを使って簡単にMCPサーバを立ててAPIとAIエージェントを組み合わせた機能を作って遊んでみようと思います!

MCPとは

FastMCPで遊ぶ前に、まずはMCPという言葉について確認しておきましょう。
MCPはModel Context Protocolの略で、簡単にいうとClaudeやChatGPTなどのAIアプリ(LLMやエージェント)と外部システム(APIなど)を繋げるためのオープンソースな規格です。AIのモデルやエージェントは多種多様なので本来であればそれぞれに対応した構築や統合作業などを行う手間が発生するのですが、MCPという一つの規格を設けることでその手間を省いて簡単にAIアプリと外部システムを繋いで便利な機能を素早く提供することができるようになります。神ですね!その特徴から「AI用のUSB-Cポート」みたいな感じで比喩されたりしてます。(USBも色々なデバイスに接続してデータ連携したり充電したりできますよね)
そのMCPを通じてAIを活用した機能を公開するプログラムのことをMCPサーバと呼んだりします。例えばファイルシステムの操作やデータクエリの発行、gitやslackなどの外部APIと連携してAIが自動で仕事するような機能を提供できたりします。
そんなMCPサーバには次の3つのコアな要素があります。

リソース
ファイルやDBなどのコンテキスト情報(リソース)を公開し、AIアプリがそれらの情報にアクセスできるようにします。LLM向けのGetエンドポイントみたいに表現されたりします。
ツール
LLMが呼び出すことのできる関数を指します。DB操作や外部APIの呼び出し、ファイル操作など自由にロジックを組んだ関数を用意してLLMに使ってもらえるようにできます。
プロンプト
プロンプトはあらかじめ入力などをパターン(テンプレート)化し、LLMがそのテンプレート内容に関する処理を実行できるようにします。自由な自然言語での指示とは異なり、ある程度構造化されたテンプレートを用意することで明示的な機能を利用者に提供することができます。

MCPについて詳しく知りたい方は公式サイトを覗いてみると面白いかもです。
引用:What is the Model Context Protocol (MCP)? modelcontextprotocol.io

FastMCPはそのMCPサーバを手軽に立てることができるPythonicなフレームワークです。その名の示す通りFastAPI(Pythonで簡単にWeb APIを立てられるフレームワーク)との連携もスムーズにできるように設計されてたりします。
面倒くさがりな筆者にとっては神のようなフレームワークです!!!
今回はAPIとAIエージェントを組み合わせる機能を見ていきたいので、ツールを主軸にFastMCPで遊んでいこうと思います!

FastMCPで遊んでみる

ではでは早速FastMCPで遊んでいきましょう。
ちなみに今回の記事でご紹介するソースコードは下記で展開しています。
github.com

まずはFastMCPの公式に従い、セットアップしていきます。
github.com
公式ではuvというパッケージマネージャーを利用しているので、最初にuvをインストールします。
maclinuxをご利用の方は下記のコマンドでインストールできるかと思います)
curl -LsSf https://astral.sh/uv/install.sh | sh
本来はそこからfastmcpをuvでpip installしたりしてプロジェクトを構築していくのですが、今回はあらかじめ用意した上記のソースコードを利用するため割愛します。
(ご興味のある方は公式の手順に従いお試しください。)

FastMCPを利用するにあたり、何かしらのLLMモデルやエージェントが必要になりますので、今回はGemini APIを使おうと思います。 Gemini APIを利用するにはAPIキーを発行して環境変数に設定する必要がありますので、Gemini APIの公式ドキュメントに従い設定してください。
ai.google.dev
maczshをお使いであれば.zshrcにAPIキーを設定すればいけるかと思います)
export GEMINI_API_KEY=<YOUR_API_KEY_HERE>

また、FastMCPでMCPサーバを立てたあとにGUIベースで簡単に操作できるようにmcptoolsというライブラリも使えるようにしておきます。
github.com
Macであれば下記のコマンドでインストールできます)

brew tap f/mcptools
brew install mcp

ここまで準備できたら早速MCPサーバを立ち上げて動作を見ていきましょう!
プロジェクト直下で下記のコマンドをたたくとローカルホストでMCPサーバが立ち上がります。
uv run main.py
さらに次のコマンドをたたくとmcptoolsを起動し、ブラウザからMCPサーバにアクセスすることができるようになります。
mcp web http://127.0.0.1:8000/sse
下記はターミナルからコマンドを叩いた結果ですが、localhost:41999にアクセスするとMCPサーバにアクセスできるUIが表示されます!

ブラウザ上の表示

今回は下記5つの機能を用意してみたので、一つずつみていきましょう。
beer、dice、scraping、user_fetch、analyze_user_income

beer(関数の定義ファイル: beer.py)
こちらはビールが飲みたいという一心のコメントを返すだけの機能をGeminiが使えるようになります。
こんな感じでFastMCPを使うことで簡単にMCPサーバのツールを構築することができます。(シンプルですね!)
さっそく質問してみましょう。飲みたいものを聞くとビールが飲みたいと答えてくれます。(お友達になれそうです)
ほかに飲みたいものを聞いてみてもやはりビールが飲みたいそうです(とてもお友達になれそうです)

dice(関数の定義ファイル: dice.py)
次はダイスの機能を見ていきましょう。 こちらは1から6までの数字を指定してダイスを振ってもらって結果を教えてもらうという機能です。 (beerと同様に簡単に設定しているので、ソースの画像は割愛します)
pythonのrandomを使った簡単な機能ですが、このことからpythonで組み立てた機能とAIエージェントの組み合わせを確認することができます。

scraping(関数の定義ファイル: scraping.py)
次はスクレイピング機能について見ていきます。 スクレイピングはサイトによって禁止されてるものが多かったりするので、今回はスクレイピング用の簡単なサイトを用意しました。 スクレイピング機能ではaタグからリンク先とテキストを摘出してCSVに書き出す処理を提供します。 通常のGeminiを利用してスクレイピングしてCSVの出力も出来はするのですが、出力の項目に抜け漏れがあったり意図しないフォーマットで出力されたりするので、その辺りの処理を柔軟に意図したもので実現するにはある程度APIとしてロジックを組むことはとても有効だと思います。

user_fetch(関数の定義ファイル: user_fetch.py)
user_fetchは外部APIとAIエージェントを組み合わせるパターンです。 JSONPlaceholderというダミーのユーザーデータを取得する外部APIがあるのですが、今回はそちらのユーザーIDを指定してAPIを叩いてユーザーデータをsqliteに保存するという一連の流れを実装してみました。 jsonplaceholder.typicode.com

analyze_user_income(関数の定義ファイル: analyze_user_income.py)
analyze_user_incomeではsqliteに保存された情報をもとに分析する機能をAIエージェントに持たせています。 このように、データの確保などは既存のAPIでやりつつ、AIエージェントには特定の処理だけを実行してもらうみたいな感じでメリハリをつけて機能を提供することができます。

以上、簡単にFastMCPで遊んでみましたが、ここから少し注意点についてもお話ししておきます。 まず、Gemini APIについてですが、こちらは無料で利用できるという便利さがある反面、機密情報が流出する可能性があります。 公式の利用規約にも記載がありますが、決してプライベートな情報や機密情報は送信しないようにしてください。
また、FastMCPはまだまだ若いサービスなので、今後も激しい変化があると思います。 ほかのMCPサーバ向けのサービスもそうですが、最新情報については引き続きウォッチしていく必要がありそうです。

最後に、簡単にGoogleADKについて触れておきます。
https://google.github.io/adk-docs/
ADKはAgent Development Kitの略でAIエージェントの開発や公開を柔軟に実現できるフレームワークです。 LLMはGemini, GPT-4o, Claude Sonnetなどマルチに柔軟に利用することができます。
またAIエージェント同士のやり取りを実現するA2A Protocol(Googleが提唱する、AIエージェント同士の連携をスムーズにできるようにする規格)などを利用することで、実用的で多種多様な機能を素早く提供することでできるようになります。 (FastMCPと同様に)ツールの関数を作成してAIを繋げて便利機能を提供したり、セキュアに動作を制御して安全にAIを用いた機能(ガードレール)を提供することもできます。
個人的に気になっているのが人間の行動履歴がデータ分析で重宝されているように、AIの行動履歴も価値が出てきそう(AIがPDCA回せるようにもなりますし)なので、そのあたりの基盤を整えてAIに関するデータを貯める状況も出てくるかもしれません。

正直に言ってできることが多すぎて混乱しますが、今後エンジニアとして価値を出していくにはこのあたりのAIを活用した機能の開発スキル(またはセンス)も必要になってくるのかなと思うこの頃でした。

さいごに

現在弊社ではエンジニアを募集しています!
この記事を読んで少しでも興味を持ってくださった方は、ぜひカジュアル面談でお話ししましょう!
iimon採用サイト / Wantedly / Green