🤖

絶対起こす!目覚ましAIエージェントをMCP連携で作ってみた

に公開

AIエージェントとMCPで作る!カメラ/RPAを活用した見守りシステム開発記

2025年、AIエージェント技術への注目が集まる中、3月にOpenAIのAgent SDKがMCP(Model Context Protocol)に対応しました。MCPは「AI用のUSB-C」とも呼ばれる、AIモデルと外部ツールやデータを繋ぐための標準規格です。これにより、AIエージェントが様々なツールを統一的な方法で観点に統合・操作できるようになりました。

MCPのメリット

MCPの最大の強みは「拡張性」と「標準化」にあります。MCP対応ツールを追加するだけで、AIエージェントは新しい能力を獲得できます。これは、従来の個別API連携やカスタムスクリプトに比べて圧倒的に開発効率が高いです。

LLM単体とMCPサーバーを連携させるチャット形式のデモはいくつか見られますが、AIエージェントがMCPを使うことで、よりダイナミックで実用的なアプリケーション、特に実世界のデバイス操作や複雑なワークフローの自動化が可能になります。

本記事では、AIエージェントとMCP連携の魅力と、実際にそれらを活用して開発した「絶対起こす!目覚ましAIエージェント」についてご紹介します。

AIエージェントとMCP連携の3つの魅力

AIエージェントとMCPを組み合わせることで、以下のような強力なメリットが得られます。

1. AIエージェントによる柔軟なワークフロー制御

AIエージェントは、自然言語で与えられた指示に基づき、状況に応じてツールを使い分け、目的を達成しようとします。従来のワークフローツールやRPAでは、条件分岐が増えるほどフロー図が複雑になり、少しの変更でも修正が大変でした。

しかしAIエージェントなら、「もし〇〇なら△△を実行し、そうでなければ□□を実行する」「〇〇が完了するまで繰り返す」といった判断を自律的に行い、次のアクションを決めてくれます。これにより、非常に柔軟な処理フローが実現できます。MCPとの連携により、AIはローカルファイル操作、Web APIアクセス、そして後述するRPAによるデスクトップ操作など、多種多様なツールを統一的に扱えるため、この柔軟性がさらに向上します。新しいツールが追加されても、多くの場合、AIはそれを理解し、既存のフローに組み込んでくれるため、フロー自体を大幅に組み替える必要がありません。

2. 簡単な機能拡張(プラグアンドプレイ)

MCPサーバー側に新しいツール(機能)を追加するだけで、AIエージェントはその能力をすぐに利用できるようになります。これはまるで、PCに新しいUSBデバイスを接続するような感覚です。

例えば、レストランを検索するAIエージェントがいるとします。このエージェントが利用するMCPサーバーに「天気予報を取得するツール」を追加するだけで、絶対に雨に濡れたくないユーザーが「レストランを探して」と指示すれば、AIエージェントは天気ツールとレストラン検索ツールを組み合わせて、適切な候補を提案できるようになる可能性があります。

3. 物理デバイスとの連携強化(RPAの活用)

MCPサーバーにRPA(Robotic Process Automation)ツールを導入することで、AIエージェントの可能性は大きく広がります。RPAは、人間がPC画面で行うマウス操作やキーボード入力を模倣する技術です。これにより、API(プログラムから機能を呼び出すための仕組み)が提供されていないような既存のデスクトップアプリケーションでも、AIエージェントが間接的に操作できるようになります。

そして、そのアプリケーションがカメラや3Dプリンタといった物理デバイスを制御するものであれば、AIエージェントはRPAを「手足」として、実世界のデバイスを操作できるのです。

単一のデバイスを制御するだけでも便利ですが、このアプローチの真価は、複数のデバイスやツールを連携させるオーケストレーションにあります。AIエージェントは、MCPを通じて得た情報(例:カメラ映像から読み取った状況)に基づいて判断し、RPAツールに指示を出してデバイスを操作します。

例えば、「カメラで複数の3Dプリンタの状態を確認し、空いているプリンタがあれば、指定されたモデルのプリントを開始する」といった、状況判断を伴う複雑な連携が可能です。これは、単なる自動化スクリプトとは異なり、AIが状況に適応しながら自律的にタスクを進める、より高度な自動化と言えます。従来は人間の介入や複雑なカスタム開発が必要だったこのようなワークフローを、より容易に、かつ柔軟に構築できるのが大きなメリットです。

実践!MCP連携AIエージェント:「絶対起こす!目覚ましシステム」開発

これらの特徴を活かして、実際にAIエージェントを開発してみました。名付けて「絶対起こす!目覚ましAIエージェント」です。(実際には、指定時刻に人の状態を確認し、動きがなければ外部に連絡する見守りシステムのプロトタイプです。)

今回はOpenAIのAgent SDKを使用し、単一のAIエージェントがMCPサーバー上の複数のツールを使い分ける構成で実装しました。

(注: AIエージェントには、複数のエージェントが協調するマルチエージェントシステムというアプローチもありますが、今回は単一エージェントで十分と判断しました。)

全体像


図: システム概念図

ユーザーからの指示を受けたAIエージェントは、MCPを通じてMCPサーバー上の各種ツールを呼び出します。MCPサーバーが実際に処理(RPAによるアプリ操作、APIアクセス、画像解析など)を行い、結果をエージェントに返します。

Tips: AIエージェントはツールの使い方をDocstring(コード内の説明文)から学習します。そのため、MCPサーバー側でツールを実装する際は、機能や引数、戻り値を分かりやすく記述することが重要です。例えば、waitツールの完了を単に"Finish"と返すより"指定された〇秒間待機しました"のように具体的な情報を返した方が、AIエージェントは状況を正確に理解しやすくなります(これは経験則です)。

AIエージェント側(クライアント)

OpenAIのAgent SDKを利用しました。今回、1回の指示での処理ステップが多いため、max_turnsをデフォルトの10から15に引き上げています。また、各ツールの実行状況をリアルタイム(Stream)で表示させようと試みましたが、すべての処理が終わってから出力したり、逐次出力したりと安定しませんでした。システムプロンプトには「最終結果をまとめて返さず、途中経過を逐次報告する」としていますが、聞いてくれないようです。個別プロンプトで「結果を教えてから次の作業に移って」と入れると逐次出力する確率が上がりました。(今後の改善課題です)。

今回は会話を重ねる処理はせず、1指示ですべての行動をとらせましたが、会話ベースで指示する際にはステート(状態)管理が必要になります。Agent SDKは、先だってOpenAIが発表したAssistants APIのような完全なステート管理は自動では行いませんが、previous_response_id=last_response_idのように前回の応答IDを渡すことで、会話の文脈を引き継がせることが可能です。

MCPサーバー側

Anthropicが提供するMCPサーバーのPythonライブラリを利用して実装しました。MCPサーバーはTools(機能)の他に、Resources(データ)やPrompts(指示テンプレート)も提供できますが、今回はToolsのみを使用しました。

MCPサーバーに登録したツール群

以下のツールを実装し、MCPサーバーに登録しました。

  • wait(seconds: int): 指定された秒数だけ待機するツール。
    これにより、AIエージェントは「〇秒待つ」という時間的な概念を扱えるようになります。
  • capture_camera_image(): IPカメラの画像をキャプチャするツール。
    • 実装: RPA Frameworkを使用し、MCPサーバーが動作しているPC上の「IP Camera Viewer」というアプリを操作してスクリーンショットを取得します。画像データはファイルに保存せず、メモリ上でバイナリデータとして管理し、そのデータにアクセスするためのID(識別子)のみをAIエージェントに返します。
    • 苦労した点: IP Camera Viewerアプリが起動しているかを確認する必要がありましたが、推奨されているRPA.Windowsライブラリでは起動中アプリ名の一覧取得ができず、非推奨となっているRPA.Desktop.Windowsライブラリのメソッドを使う必要がありました。
  • analyze_image_state(image_id: str): キャプチャ画像の人の状態を判断するツール。
    • 実装: 指定されたIDの画像データを取得し、GPT-4o(マルチモーダルLLM)に送信して、「人が写っていない」「起きている」「寝ている」のいずれかの状態を判定させます。
    • 懸念点: 本来はプライバシー保護のため、ローカルで動作するLLMを使用したいところです。
  • compare_images(image_id1: str, image_id2: str): 2枚の画像を比較し、人の動きがあったかどうかを判定するツール。
    • 実装: 2つの画像IDを受け取り、対応する画像データをGPT-4oに送信して比較させ、動きの有無(True/False)を判定します。
    • 開発のきっかけ: ChatGPTアプリで画像比較機能が使えることを知り、これが今回のシステム開発のコアアイデアに繋がりました。
  • check_weather_yahoo(location: str): 指定地点の天気を取得するツール。
    • 実装: Yahoo!天気APIを利用します(別途デベロッパー登録が必要)。APIは緯度経度を要求しますが、AIエージェントは「東京都」のような地名から緯度経度を推定してくれました(これは驚きでした)。デフォルト値に東京都の経度,緯度を設定しました。
    • 工夫: APIの仕様で 緯度, 経度 のようにカンマ後にスペースがあるとエラーになるため、AIエージェントから受け取った緯度経度文字列からスペースやクォーテーションを削除する前処理をツール側で入れています。
  • start_music(weather: str): 天気に応じた音楽を鳴らすツール。
    • 実装: MCPサーバーが動作しているPCで音楽を鳴らします。今回は、天気情報(例: "rainy", "sunny")に応じて異なる音楽ファイル(rainy.mp3, normal.mp3)を再生するようにしました。「雨の日は気分が沈みがちなので、目覚めの音楽を変えたい」という個人的な動機です。天気を取得するツール内で音楽再生まで行うこともできましたが、音楽再生機能を別ツールにすることで、将来的にAIエージェントに「リラックスできる音楽をかけて」といった指示を出すことも可能になります。音楽の再生にはPythonのPygameを使いました。Pygameはデフォルトで非同期処理に対応しているため使い勝手が良かったです。
  • stop_music(): 音楽を停止するツール。
    人が起きたことを検知したら、自動で音楽を止めるために用意しました。
  • call_on_google_meet(): Google Meetで指定ユーザーに通話するツール。
    • 実装: RPA Frameworkを使用し、Webブラウザを操作してGoogle Meetを開き、あらかじめ設定ファイルに記述されたメールアドレス宛に通話を発信します。相手が応答すると、MCPサーバーPCのデスクトップ画面(IP Camera Viewerアプリが映っている画面)が共有されます。
    • セキュリティ考慮: 当初はAIエージェントに通話相手のメールアドレスを指示させることも考えましたが、個人情報であるメールアドレスをAIに渡すのは避けるべきと判断し、MCPサーバー内の設定ファイルで管理する方式にしました。
    • 苦労した点: RPAではWebアプリの要素が取れず安定した挙動を実現するまでに試行錯誤を重ねました。最終的にキー操作(send_key({TAB}{TAB}...))を多用しました。
    • 未実装事項: 現在は10秒後に画面共有を開始していますが、本来は通話開始をトリガーにすべきところです。RPAだけでは状態管理が難しく、実装できませんでした。また、Google Meetは画面共有中はユーザー側から通話を切っても、クライアント側(今回はMCPサーバー側)で通話が切れないため、通話終了を検知して自動で終了する処理を入れる必要がありますが、今回そこまでは実装しませんでした。

RPA実装の試行錯誤について

今回、どうしてもPC上のカメラアプリを操作したかったため、Pythonから制御できるオープンソースのRPAツールとして「RPA Framework」を選びました。

  • 要素特定: RPA Frameworkには操作対象(ボタンや入力欄など)を記録するレコーディング機能がないため、Windows SDK付属の「Inspect.exe」というツールを使って、操作したいUI要素のnameclass idといった属性を一つ一つ調べる必要があり、かなり骨の折れる作業でした。(MicrosoftのPower AutomateがPythonから簡単に呼び出せると嬉しいのですが…)
  • ブラウザ操作の壁 (Google Meet): Google Meetの操作には、RPA Framework内で利用できるブラウザ自動化ツール「Playwright」を使おうとしました。しかし、PlaywrightでChromiumブラウザを起動するたびにGoogleアカウントのログインやCAPTCHA認証(ロボットでないことの証明)を求められてしまい、自動化が困難でした(事前にChromiumを起動し、手動で認証しても、Pythonから起動するとキャッシュがクリアされるようで、毎回認証が必要でした)。代替として「Selenium」も検討しましたが、最終的には、あらかじめ手動でログインしておいた既存のブラウザウィンドウを直接操作するシンプルな方法(OSレベルのウィンドウ操作)を採用しました。(RPA FrameworkのSeleniumにはattach_chrome_browserという、起動中のブラウザに接続する機能がありました)
  • 他のRPA: Power Automateのようなレコーディング機能を持つRPAとしてOpen RPAがあります。OpenRPAのフローベースの管理ツールである、Node-REDを利用するとAPI経由でRPAを呼び出せるようになるので、本格的にMCPと連携するならOpenRPAが良いと思っています。

結果:AIエージェント、動く!

以下のような指示(プロンプト)をAIエージェントに与えました。

「部屋のカメラで部屋の様子を撮影してください。もし人が寝ていたら、1分後に再度チェックし、まっだ寝ていたら天気に合った音楽を再生してください。その後1分待ってから再度状態を確認してください。起きていれば音楽を止めてください。もし動きがなければ、Google Meetで私に連絡し、カメラの映像を見せてください。」

すると、AIエージェントは指示通りに自律的に動き始めました。

  1. カメラアプリを起動し、画像をキャプチャ (capture_camera_image)
  2. 画像から「寝ている」状態を判定 (analyze_image_state)
  3. 10秒待機 (wait)
  4. カメラ画像をキャプチャ (capture_camera_image)
  5. 画像から「寝ている」状態を判定 (analyze_image_state)
  6. 天気を取得 (check_weather_yahoo)
  7. 晴れだったので晴れ用の音楽を再生 (start_music)
  8. 10秒待機 (wait)
  9. 再度カメラ画像をキャプチャ (capture_camera_image)
  10. 最初の画像と比較し、「動きなし」と判定 (compare_images)
  11. Google Meetで私のスマホに通話を発信 (call_on_google_meet)

結果、私のスマートフォンに着信があり、応答すると自宅のPC画面(寝ているふりをしている私の姿が映るカメラアプリ画面)が共有されました。スマホ越しに自分自身に「起きろー!」と声をかけてPCから自分の声が聞こえるところまで確認できました。相手のスマホの電源が切れていたとしても、絶対起こすまで声をかけ続けることができます。

もちろん、想定されるユースケースとしては、遠隔地にいる家族の見守りです。もし本当に動きがなければ、この後、緊急連絡先に電話する、などの対応を追加することも可能です。

アーキテクチャのポイントと本質的価値

この「目覚ましAIエージェント」は、個々の技術要素(カメラ、RPA、音楽再生、通話)を見ると既存技術の組み合わせに過ぎないかもしれません。しかし、その本質的な価値は、これらの要素をMCPサーバーを中心としたマイクロサービスとして構成し、AIエージェントがそれらを自律的に利用して意思決定を行い、実世界に働きかける点にあります。

  • 自律的意思決定システム: 従来のルールベースの自動化システムとは異なり、「状況認識(カメラ映像分析)→ 判断(寝ているか?動きはあるか?)→ 適応的対応(音楽再生、待機、通話)」というサイクルをAIが自律的に実行します。
  • デスクトップRPAとAIの融合: APIがないデスクトップアプリや、それに接続された物理デバイスを、RPAを介してAIエージェントが操作可能にしたことで、AIの活動範囲をPC内部から物理世界へと拡張しました。
  • 時間軸を持つAI: waitツールにより、AIエージェントが「待つ」「一定時間後に再確認する」といった時間的な判断を行えるようになりました。これは、リアルタイム処理や定時実行とは異なる、より柔軟で人間的なワークフローの実現に繋がります。

応用可能性:ヘルスケア・見守り分野への展開

このシステムのアーキテクチャは、特にヘルスケアや高齢者の見守り分野で大きな可能性を秘めていると考えられます。

人感センサーや単純なアラート通知だけでは分からない詳細な状況(例:転倒しているのか、ただ寝ているのか)をカメラとAIで判断し、状況に応じて音楽を流してリラックスを促したり、家族や医療スタッフに映像付きで連絡したりといった、複合的で適切な対応を自動化できます。これにより、介護現場の人手不足緩和や、24時間体制での質の高い見守りの実現に貢献できる可能性があります。

また、本記事で紹介した見守りシステム以外にも、MCPとAIエージェントの組み合わせは、工場の遠隔監視やオフィスの自動化、デザインレビューや書類処理パイプラインなど、さまざまな分野に応用できます。

まとめ:MCP連携AIエージェントが拓く未来

今回開発したシステムは、以下の3つの要素を組み合わせることで、単なるチャットボットを超えたAIエージェントの可能性を示せたのではないでしょうか。

  1. マイクロコンポーネント化されたツール群: 機能ごとにツールを独立させることで、開発・保守・拡張が容易に。
  2. MCPサーバーによる統合: 多様なツールをAIが統一的に利用するための標準インターフェース。
  3. AIによる自律的判断とオーケストレーション: 状況に応じてツールを使い分け、複雑なワークフローを実行する能力。

このアプローチにより、新しいツールを追加するだけでシステムの能力を拡張でき、AIが状況変化に適応し、従来は人間の判断が必要だった複雑なタスクを自動化することが可能になります。MCPはオープンソースであり、今後もコミュニティによるツール追加や改善が期待されています。AIエージェントとMCPの組み合わせは、今後ますます多様な分野で「人間のように状況を判断し、実世界に介入する」システムの実現を加速させるでしょう。

参考資料:

Model Context Protocol (MCP)
公式GitHub
公式ドキュメント
OpenAI Agents SDKによるMCP解説

OpenAI Agents SDK
公式GitHub
公式ドキュメント

RPA Framework
公式GitHub
公式ドキュメント
公式Pythonサンプル

MCPとOpenAI Agents SDKを統合

Discussion