rpine lab Tech Blog

趣味のプログラミング(Web系・バックエンド)や自宅ラボ(Homelab)構築・マイコンを使った電子工作などを雑多に扱った技術ブログです。

🤖M5StackChanのAI.AGENTに任意のMCPツールを接続する

M5StackChanのAI.AGENTに任意のMCPツールを接続する
目次

はじめに

前回の記事では、StackChan(M5Stack公式版)の初期設定とAI.AGENTチャットでの動作確認を解説しました。

この記事では、StackChanのAI.AGENTに任意のMCPサーバーを繋ぎこむことで、音声操作による複数MCPツール連携を実現します。

完成イメージ

👱ユーザー:「AWSの〇〇のサービスについて調べてメモしておいて。」

🤖StackChan: 「わかりました。」

  1. AWS Knowledge MCPでAWS公式ドキュメントを検索
  2. サービス概要の生成
  3. Notion MCPでNotion DBに保存

StackChanの純正(出荷時)ファームウェアに搭載されているAI.AGENT機能は、公式マニュアルにはスマート家電操作のためのHome AssistantをMCPサーバーとして接続できるとの記載がありますが、それ以外のMCPを繋ぐ方法は書かれていません。

試してみたところ、GitHubで公開されているXiaozhi AI用のサンプル実装である78/mcp-calculatorというリポジトリに含まれるmcp_pipe.pyを使えば、純正ファームウェアのAI.AGENTに、任意のMCPサーバーを追加で組み込めることがわかりました。

そこで今回はMCPサーバーをAI.AGENTに追加して、StackChanからNotionにAWSのサービスに関するメモを取ってもらえるようにします。

利用機材・開発環境

  • StackChan(M5Stack公式版)
    • M5Stack公式版の純正ファームウェア(バージョン v1.2.6)
    • 初期設定完了済(初期セットアップは前回記事を参照)
  • PC
    • Windows 11(他のOSでも可)
    • uv(Python仮想環境作成・MCPサーバー実行用)
    • Node.js(Notion MCPサーバー実行用)
  • StackChan公式アプリ
    • セットアップに利用したM5Stackアカウントでログイン済
    • MCPエンドポイントURL取得用
  • Notionアカウント
    • MCP接続用インテグレーション作成
    • 専用メモDB(Notion上に事前作成)

MCPサーバー追加の仕組み

StackChanのAI.AGENTは、Xiaozhi AI(小智AI)というサービス上でLLMを実行してAIエージェント機能を実現しています。

全体構成

接続構成図
接続構成図

StackChanがXiaozhi AIと通信し、Xiaozhi AIがローカルPC上のMCPブリッジ(mcp_pipe.py)とWebSocketで繋がります。mcp_pipe.pyはローカルで動くMCPサーバーを中継する役割を担います。

ローカルで起動しているMCPサーバーをブリッジする仕組み上、AI.AGENTの利用中はMCPブリッジの常時稼働が必須です。

AI.AGENTでのツール実行

StackChanのAI.AGENTには、何をせずとも天気・ニュース・音楽といったリモートのMCPツールや、カメラ・リマインダー・LED・画面の明るさといった本体機能を使った内部ツールが組み込まれていて、音声で各ツールを呼び出せるようになっています。

本体機能を使った内部ツールはファームウェア上でMCPツールの形で直接定義されていますが、それ以外の外部ツールについてはリモートから追加できるようになっています。

今回の方法では、これらの既存ツールにMCPブリッジ経由でツールを追加で組み込みます。

任意MCPを追加する方法:mcp_pipe.py(MCPブリッジ)

Xiaozhi AIを使ったAIエージェントにMCPツールを追加するための公式サンプル実装として78/mcp-calculatorというリポジトリがあります。サンプルの内容としては、PythonのFastMCPで書かれた簡易的な計算機MCPツール(calculator.py)をAIエージェントに追加するというものです。

一番重要なファイルが、エントリポイントとして使っているmcp_pipe.pyです。mcp_pipe.pyは、MCPクライアント兼プロキシとして動作し、Xiaozhi AIが提供するWebSocketエンドポイントと、ローカルで動作するMCPサーバーとの橋渡しを行います。ローカルに定義したカスタムMCPに限らず、stdio/sse/http形式の任意のMCPサーバーに対応しています。

mcp_config.jsonに定義を追加することで複数MCPを同時起動でき、1コマンドで複数ツールを展開できます。

今回はこのmcp_pipe.pyを用いることで、AI.AGENTに任意のMCPツールを追加します。

通信方式について

LLM自体はXiaozhi AIのサーバー上で実行されていて、このクラウドサーバーとESP32マイコンが通信し、AIチャットボットとして機能しています。

このXiaozhi AIのサーバーが提供するエンドポイントへのWebSocket通信によって、ローカルマシンからMCPツールが追加できるようになっています。必要なエンドポイントURLはStackChan公式アプリから取得します。

使用するMCPの選定

Xiaozhi AIとプライバシー上の懸念点

前述の通り、StackChanのAI.AGENTとMCPサーバーとはXiaozhi AIサーバーを介して接続されます。このXiaozhi AIサーバーは中国で運用されているとみられるのですが、その運営情報や利用規約、プライバシーポリシーなどの詳細の把握には限界があるため、AI.AGENTモードで遊ぶ際にはデータの取り扱いには十分注意が必要です。

仕組み上MCPツールで取得したデータはXiaozhi AIのサーバーを経由するため、本記事ではあくまで「流出しても困らないデータしか扱わない」ことを前提で利用するMCPを選定しました。

⚠️
外部MCPサービスとの接続は自己責任で行ってください。接続するMCPを通じて取得・送信されるデータはXiaozhi AIのサーバーを経由します。どのMCPを接続するかは各自の判断と責任のもとで慎重に選定・設定してください。

接続するMCP

以下の2つのMCPを接続します。

MCPサーバー スコープ 権限 リスク
Notion MCP
suekou/mcp-notion-server
専用メモDBのみ Read + Write 限定的(会話内容のみ)
AWS Knowledge MCP
aws-knowledge-mcp-server
AWS公式ドキュメント(公開情報) Read(認証不要)

AWS Knowledge MCPを経由することで、LLMの学習データにない最新の公式ドキュメントを参照した回答が得られます。

この2つを組み合わせることで、「AWSのあるサービスについて調べてNotionにメモしておいて」といった複数MCPを連動した会話が実現できます。

データの取り扱いと権限設計

設計ポリシーとして以下の3点を基準にしています。

  • スコープを最小化: 読み書きに必要な最低限の権限のみ付与
  • 共有リソースの最小化: Notionのインテグレーション接続は専用メモDBの1箇所のみ
  • 取り扱うデータ自体を選別: 公開情報、またはユーザーとの会話内容のみ

Notion APIは明示的にインテグレーションを追加してあるページ・DBのみアクセス可能であることから、専用DBのみにインテグレーションを追加すれば、他のワークスペース全体の閲覧は不可能です。

Notionインテグレーションの作成と権限スコープ設定

専用メモDBのみにアクセス可能なNotion APIインテグレーションを作成します。

専用のメモDBを作成

私的な情報へのアクセスを防ぐため、StackChan専用のデータベースを作成しておきます。

AIエージェントの性能の関係でプロパティは最低限にすることを推奨します。

Image in a image block

インテグレーション作成

  1. Notionの内部コネクトを開き、新規の内部コネクトを作成
  2. コネクト作成画面:コネクト名を適宜設定し、対象ワークスペースを選択
    Image in a image block
  3. 必要な権限を選択:コンテンツ関連(読み取り・更新・挿入)全てを有効化して、他(コメントやユーザ情報)は無効化
    Image in a image block
  4. コンテンツへのアクセス:事前作成したDBのみをアクセス権限に追加
    Image in a image block
  5. インストールのアクセストークンをコピーしておく。(MCPサーバー設定時に使用)

WebSocketエンドポイントの取得

ここでのエンドポイントはXiaozhi AIクラウドサーバー側のWebSocket URLとなっていて、mcp_pipe.pyがこのURLに接続することで、Xiaozhi AIとローカルのMCPブリッジが確立されます。

  1. StackChan World(公式アプリ)を起動
  2. Settingsタブ→MCPを開く
  3. Access point address(wss://から始まる)をコピー
⚠️
ここで取得したエンドポイントは絶対に共有・公開しないこと
WebSocketエンドポイントの取得(StackChan公式アプリ)
WebSocketエンドポイントの取得(StackChan公式アプリ)

mcp-calculatorリポジトリの導入

mcp-calculatorはXiaozhi AIにカスタムMCPを追加するためのサンプルプロジェクトです。まずこのサンプルをそのまま動かし、計算ツールをStackChanから呼び出せるようにします。

  1. https://github.com/78/mcp-calculatorをクローン
  2. Pythonの仮想環境を作成してrequirements.txtから依存関係をインストール(今回はuvを使用)
  3. (サンプルが正常に動かなかったため)fastmcpライブラリを明示的にインストール
    git clone https://github.com/78/mcp-calculator
    uv pip sync requirements.txt
    uv pip install fastmcp
  4. .envファイルを新規作成し、MCP_ENDPOINTに公式アプリから取得したエンドポイントを設定
    MCP_ENDPOINT=wss://......(取得したエンドポイントURL
    .env
  5. uvを使用するようにmcp_config.jsonを編集
    {
      "mcpServers": {
        "local-stdio-calculator": {
          "type": "stdio",
          "command": "uv",
          "args": ["run", "python", "-m", "calculator"],
          "disabled": false
        },
    //(他MCPの定義)
      }
    }
    mcp_config.json
  6. MCPブリッジを起動し、エラー等が出ていないことを確認(テスト完了までは起動したままにしておく)
    内部でmcp_config.jsonに定義されているlocal-stdio-calculatorMCP(サンプル)が起動して、MCPブリッジを経由してAI.AGENTからツールとして利用可能になります。
    uv run python mcp_pipe.py
  7. StackChanのAI.AGENT機能を起動し、計算機MCPが動作するか確認
    例:「ツールを使って3足す5を計算して」「0~100の数字からランダムな数を選んで」
  8. StackChanの画面に% calculator…と表示されてから結果が出ていれば正常に動作
  9. StackChan公式アプリのSettingsMCPから、追加されたツール名一覧を確認
ツールの実行を示す「% tool_name…」形式でのMCPツール名表示
ツールの実行を示す「% tool_name…」形式でのMCPツール名表示
ローカルMCPを利用した乱数の取得
ローカルMCPを利用した乱数の取得

複数MCPの起動設定

Notion MCPとAWS Knowledge MCPをローカルPC上で起動してAI.AGENTから利用できる状態にします。

Xiaozhi AIのボディサイズ制限とMCPサーバーの選定

Xiaozhi AIはWebSocketメッセージにボディサイズ制限があります。公式の@notionhq/notion-mcp-serverはツール数が多すぎて、MCPブリッジ起動後に以下のエラーが出て動作しませんでした。恐らくMCPツール一覧定義のメッセージ送信に失敗するようで、ツール数を削る必要があります。

MCP_PIPE - WARNING - [notion] Connection closed (attempt 3): received 1009 (message too big); then sent 1009 (message too big)

今回はツール数を絞り込めるコミュニティ製のsuekou/mcp-notion-serverを使い、--enabledToolsオプションで必要なツールだけを指定することで解決しました。

mcp_config.jsonの編集

mcp_config.jsonにMCP定義を追加します。

transportの種別はstdioを使用します。AWS Knowledge MCPについてもhttpでの接続が上手く動作しなかったため、fastmcpを使ったstdioプロキシ経由で接続します。

notion MCPについては必要なツールだけを--enabledToolsで指定しています。

{
  "mcpServers": {
// 既存のMCP定義の末尾に追加
	  "aws-knowledge-mcp-server": {
		  "command": "uvx",
		  "args": ["fastmcp", "run", "https://knowledge-mcp.global.api.aws"],
		  "disabled": false
		},
		"notion": {
		  "command": "npx",
		  "args": ["-y", "@suekou/mcp-notion-server", "--enabledTools", "notion_find,notion_read_page,notion_inspect_data_source,notion_create_data_source_item_from_values,notion_append_content,notion_append_markdown,notion_update_content,notion_update_block,notion_delete_block"],
		  "env": {
		    "NOTION_API_TOKEN": "NOTIONのアクセストークンをここに設定"
		  },
		  "disabled": false
		}
	}
}
mcp_config.json

また、不要であればサンプルのcalculator MCPを無効化します。(disabledプロパティをtrueに設定)

起動と登録確認

MCPブリッジを実行し、公式アプリからNotion MCPとAWS Knowledge MCPのツール一覧がXiaozhi AI側に登録されることを確認します。

uv run python mcp_pipe.py

AIエージェントの調整

動作確認の前にAIエージェントの設定を変更します。

StackChan公式アプリのSettingsタブ→AI Agent ConfigからAIエージェントの細かい設定ができます。以下の通りに変更します。

  • LLM Model: DeepSeek V3.1に変更
    • 複雑なツール呼び出しに対応するために少しでも高機能なモデルに変更
  • Personality:
    • 本来はAIチャットの人格定義の場所だが、今回はシステムプロンプト的な指示を入力し、チャットに事前情報を持たせるために使用
    • 例えば本記事の構成の場合、無駄な会話やツール呼び出しの回数を減らすために、次のようにNotionのデータベース名やIDを書いておく
      例:ユーザーからメモの参照や追加を依頼された際は、ツールを使いNotionの「○○○(事前作成したDB)」データベースにアクセスすること。
    • その他、AIエージェントに守らせたいことを記述
  • Memory: OFFを選択
    • 余分な過去の会話履歴(短期記憶)の参照を防ぐため
    • 過去のツール呼び出し失敗時のコンテキストなどが混入すると面倒で、再現性の観点からも試行錯誤中はOFFを推奨
StackChan公式アプリのAgent Setting設定画面
StackChan公式アプリのAgent Setting設定画面

特にPersonalityに設定する文言は試行錯誤が必要な箇所のため、スクリーンショットのものは参考程度に留めてください。あまり長く記述してしまうと忘却の可能性があるので、最低限の指示にしたほうが良いはずです。

また、AIエージェントの設定の反映にはAI.AGENTモードの再起動が必要なので注意してください。

実際に動かす

ここからは動作確認として、追加したMCPツールを使って音声でStackChanに色々させてみます。

Notionへのメモ

「ツールを使って○○をメモして」のように話しかけ、専用DBにページが追加されることを確認します。

🧑
(以降、会話例はこの形式で示します)

あなた自身の自己紹介を考えてメモに追加して。

(エージェントへの指示を追加していない場合は、「ツールを使ってNotionの〇〇という名前のDBに自己紹介のページを追加して。」のように具体的に言う。)

Notionページ追加ツールを実行中
Notionページ追加ツールを実行中
StackChanが作成した自己紹介ページ
StackChanが作成した自己紹介ページ

存在しないURLを使うハルシネーションや、誕生日を勝手に今日ということにしていること以外は特に破綻はなさそうでした。

また、ページへの追記もテストします。あらかじめ「買い物リスト」ページを中身が空でいいのでNotionのDBに作成しておき、次のように話しかけます。

🧑
カレーの一般的な材料を買うものリストページに追加して。
ツール実行前の会話
ツール実行前の会話

Notionのコンテンツ追記ツール呼び出し
Notionのコンテンツ追記ツール呼び出し

追記されたページの内容
追記されたページの内容

AWSドキュメントで最新のサービスを調べさせる

2026年4月に発表されたサービス「Amazon S3 Files」の解説をさせてみます。知識カットオフの時期を考えるとLLMの知識にはない情報のはずなので、MCPを使う意義があります。

ここでは次のように話しかけてみます。

🧑
最近発表されたAWSのAmazon S3 Filesというサービスについてツールで調べて。

(「ツールで」「最近発表された」と入れることで、LLMの知識だけで「そのようなサービスはAWSに存在しません」のように言われるのを防ぐ)

AWS公式ドキュメント参照ツールを実行
AWS公式ドキュメント参照ツールを実行
サービスの解説
サービスの解説

調べたAWSサービスの解説をNotionにメモ

複数MCPの連携テストとして続けてNotion MCPでのメモへの追加を依頼します。

🧑
(S3 Filesの解説をしてもらった後に)その解説をメモに追加して。
Notionに追加されたサービス解説
Notionに追加されたサービス解説

1回の会話で複数のツールを自律的に連続して呼べるので、次のように話せば一気にドキュメントを調べてNotionにページを追加するところまでやってくれます。

🧑
AWSのAmazon S3 Filesというサービスについてツールで調べて、解説をメモに追加して。

まとめ

StackChanのAI.AGENTモードに、MCPを使ったNotionへのメモ保存とAWS公式ドキュメントの参照機能を追加してみました。

mcp_pipe.pyを使えば任意のMCPツールを追加可能で、工夫次第で多様な拡張の可能性を秘めています。

純正ファームウェアを使う上での制約

本記事で紹介した構成はあくまで純正ファームウェアを使う前提であり、そのまま使うのであればXiaozhi AIの利用が必須となります。規約の詳細を把握できていない現状では個人データの接続を避けるのが妥当と判断しました。

Xiaozhi AIサーバーへのデータ送信を回避するには、以下のいずれかが必要です。

  • コミュニティで公開されている別のAIエージェント対応ファームウェアへの書き換え
  • 純正ファームウェアのソースを書き換えて別のAIサービスに置き換え
  • AIエージェント実行環境(Xiaozhi AIクラウドサーバー)を含めたバックエンドのセルフホスト

より私的なデータを扱いたい場合は、現状はこれらのいずれかのアプローチが必要だと考えます。

今後の展開

ファームウェアを直接書き換えることで、本体機能を使ったMCPツールを追加できます。本体に搭載されている未使用の各種センサー(赤外線・NFCなど)を使った機能拡張などを今後取り組みたいです。

検証時点では古いバージョンのファームウェアしか上がっていなかったのですが、本記事の執筆中にStackChanのOSSリポジトリに最新ファームウェア(v1.3.0)のソースコードが公開されたので、これを使って引き続き検証予定です。

参考サイト

前回記事

この記事が役に立ったら是非ご支援をお願いします!

支援する

※Squareの決済ページに移動します