🗓️ この記事の要点(2026-07-30 実機検証を反映)
  • ESP-IDF 6.0 には idf.py 内蔵の MCP サーバが加わった。AI クライアントからターゲット設定・ビルド・書き込みを直接実行できます
  • 接続・ツール一覧・実機への書き込みまでを実機で確認済み(Windows 11/ESP-IDF v6.0.2/ESP32-S3)。設定手順は公式ドキュメントにもとづきつつ、実際に動かした結果を反映しています
  • ただし現状、重いツール呼び出しは「処理は成功するのに完了応答が返らない」問題があり、Windows での実用は今後のパッチ待ちです。それまでの現実解(eim run でのシェル直行)まで示します

🧭 はじめに:「コマンドを写経する」から「頼んで実行してもらう」へ

ESP-IDF で開発していると、AI アシスタントに聞いた idf.py コマンドをチャットからターミナルへコピペし直す、という往復が地味に多くなります。ターゲットを変えて、ビルドして、書き込んで、ログを見て、また聞く。この「写経」の部分だけは、これまで手作業でした。

ESP-IDF 6.0 で加わった MCP サーバは、この往復を閉じるための仕組みです。Claude Code のような AI クライアントに「ターゲットを ESP32-C6 にしてビルド、つながっているデバイスに書き込んで」と頼むと、クライアントがサーバ経由で idf.py の操作を直接実行する——というのが、この機能のねらいです。

この記事では、何ができて・どう繋ぎ・どこで詰まるのかを、Espressif 公式の手順にもとづいて整理し、接続からツール呼び出し・実機書き込みまでを実機で確かめた結果を反映しました(検証環境と結果は末尾の「🔧 実機で確認した結果(2026-07-30)」にまとめています)。「導入すべきか」という判断の話ではなく、「使うとどこが楽になり、どこは変わらないか」という実務の地図として読んでください。

ESP-IDF 6.0 そのものの変更点(レガシードライバの全廃など)は別記事にゆずり、本記事はその 6.0 で新しく使えるようになった機能の1つ、という位置づけにしぼって進めます。


🔌 そもそも MCP とは

💡 ワード解説:MCP(Model Context Protocol)

MCP(Model Context Protocol) は、AI アシスタントと外部のツールやデータを標準化された方法でつなぐためのプロトコルです。Anthropic が公開し、いまは複数の AI クライアントが対応しています。

構図はシンプルで、AI クライアント(MCP クライアント) と、ツールやデータを提供する MCP サーバの2者に分かれます。

  • クライアント側の例 — Claude Code、Cursor、VS Code の AI 拡張など
  • サーバ側の例 — 今回の idf.py の MCP サーバ、Espressif のドキュメント検索サーバなど

サーバは「このツールが使えます/このデータが読めます」という一覧をクライアントに知らせ、クライアントはユーザーの依頼に応じてそれを呼び出します。接続方式には、ローカルのプロセスと標準入出力でやり取りする stdio と、ネットワーク越しの HTTP があります。

ESP-IDF まわりで公式に用意されている MCP サーバは、大きく2つあります。手元のプロジェクトを操作するローカルサーバと、公式ドキュメントを検索するリモートサーバです。全体像は次のようになります。

flowchart LR U["あなた(自然言語で依頼)"] --> CC["Claude Code / MCP クライアント"] CC -->|"stdio(ローカル)"| S1["idf.py mcp-server"] S1 --> P["ESP-IDF プロジェクト・接続デバイス"] CC -->|"HTTP(リモート)"| S2["mcp.espressif.com/docs"] S2 --> D["Espressif 公式ドキュメント"]

以下、まずローカルの Tools サーバから見ていきます。


🧰 ESP-IDF 6.0 の「Tools ローカル MCP サーバ」でできること

ESP-IDF 6.0 の目玉のひとつが、idf.py に組み込まれた Tools ローカル MCP サーバです。stdio でやり取りするローカルサーバとして動き、プロジェクトの操作と状態を MCP クライアントに公開します。

公開されるものは、実行できるツールと、読み取り専用のリソースに分かれています。

種類 名前 何をするか
ツール set_target(target) チップターゲットを設定する(例:esp32c6
ツール build_project() プロジェクトをビルドする
ツール flash_project(port) 実機へファームウェアを書き込む
ツール clean_project() ビルド成果物を削除する
リソース project://config 設定とビルドディレクトリの情報
リソース project://status ビルド状態・ターゲット・IDF バージョン・成果物の有無
リソース project://devices 接続中のシリアルポートの一覧

つまり、AI クライアントは project://status で「いまのターゲットとビルド状態」を読み、set_targetbuild_project で「操作」を行える、という設計です。読む側と実行する側が明確に分かれているのが要点です。

実際に接続すると、Claude Code 側からは公開ツールが次のように一覧できます(実機の表示)。

Claude Code に表示された esp-idf-eim の 4 つのツール(build_project・set_target・flash_project・clean_project)

実機での表示:esp-idf-eim が公開する 4 tools(build_project / set_target / flash_project / clean_project)

⚠️ `flash_project` は実機に書き込みます

公開されているツールのうち、flash_project実際のデバイスにファームウェアを書き込む操作です。AI クライアントに「書き込んで」と頼めば、つながっている実機に書き込みが走ります。試すときは、書き込まれて困らないデバイスをつないでいるかを先に確認してください。読み取り専用のリソース(project://status など)とは影響範囲がまったく違います。


🔗 Claude Code につなぐ

接続は、大きく ①環境を用意する → ②サーバを起動できる状態にする → ③クライアントに登録する → ④依頼する、の流れです。

flowchart TD A["1. EIM で ESP-IDF 6.0 を導入(mcp 機能を有効化)"] --> B["2. プロジェクト直下で MCP サーバを起動できる状態にする"] B --> C["3. Claude Code に stdio サーバとして登録する"] C --> D["4. 自然言語で依頼する(例:ターゲットを C6 にしてビルド)"] D --> E["5. サーバが set_target から build_project を実行する"]

① 環境を用意する(EIM で mcp 機能まで入れる)

Tools ローカル MCP サーバを使うには、ESP-IDF v6.0 以降を「mcp 機能つき」で入れておく必要があります。ここが最初の関門なので、実機(Windows 11 Pro)で確かめた手順を残します。

EIM(ESP-IDF Installation Manager)は 6.0 で導入された新しいインストーラです。Windows では winget で入れるのがいちばん手軽でした。導入されるのは GUI 版(確認時は 0.17.1)ですが、GUI 版は CLI 機能を完全に内蔵しているため、そのまま eim コマンドが使えます(CLI 専用版を別途入れる必要はありませんでした)。

winget install Espressif.EIM
⚠️ `eim install`(引数なし)だと mcp 機能は入らない

eim install を引数なしで実行すると、自動的に非対話モードになって「required features(必須機能)だけ」を選んで進みます。このとき mcp 機能はスキップされます。ESP-IDF v6.0.2 の導入そのものは成功する(初回は約5分)ため、一見うまくいったように見えるのが厄介なところでした。

さらに紛らわしいのが、idf.py mcp-server --help が依存パッケージ未導入でも成功する点です。サブコマンドの登録自体は済んでいるので help は表示され、実際に起動して初めて MCP dependencies not available で失敗します。「help が出たから入っている」とは限りません。

mcp 機能を後付けするには、feature を明示して入れ直します(2回目はツールキャッシュが効いて約3.5分でした)。

eim install --idf-versions v6.0.2 --idf-features mcp --non-interactive true

mcp feature が要求する Python パッケージは tools\requirements\requirements.mcp.txt に定義されていて、中身は mcp[cli] です。

⚠️ ★ 最大の落とし穴:mcp 2.0 が入ると起動できない(実機で遭遇)

mcp 機能を入れても、idf.py mcp-server が同じ MCP dependencies not available で失敗し続けることがあります。実機で追い込んだ原因は、venv に mcp 2.0.0 が入ってしまうことでした。

ESP-IDF v6.0.2 の tools/idf_py_actions/mcp_ext.pyfrom mcp.server.fastmcp import FastMCP を読み込みますが、この import パスは mcp 2.0 で無くなっています。そのため ImportError が起き、それが一律「dependencies not available」という表示にまるめられます。エラーメッセージが実態とズレているわけです(mcp[cli] が mcp のバージョンをピン留めしていない隙間で起きます)。実際に出ていたのは ModuleNotFoundError: No module named 'mcp.server.fastmcp' でした。

対処(実機で解決を確認)は、mcp を 1.x に落とすことです。下の pip install "mcp[cli]<2" で mcp 1.29.0 が入り、import が通って起動できました。ただし EIM で入れ直すと venv が作り直され、また mcp 2.0 に戻ることがある点に注意してください。起動できなくなったら、まずこの mcp のバージョンを疑うのが早道です。

python -m pip install "mcp[cli]<2"

環境構築の全体像は VS Codeで始めるESP-IDF環境構築ガイド|最小構成でHello Worldまで が参考になります(そちらは v5.5.2 前提ですが、拡張機能やステータスバーの考え方は共通です)。

② サーバの起動コマンド

MCP サーバは idf.py のサブコマンドとして起動します。

# ESP-IDF 環境がすでに有効な状態なら
idf.py mcp-server

# EIM 経由で起動する(推奨)
eim run "idf.py mcp-server"

# プロジェクトの外から場所を指定して起動する
idf.py -C /path/to/your/project mcp-server

起動に成功すると、次の1行が出てそのまま入力待ち(待ち受け)になります。無言で固まるわけではないので、この行が出れば起動は成功しています。

MCP Server running on stdio...

③ Claude Code に登録する

Claude Code へは、stdio サーバとして登録します。実機では次のコマンドがそのまま通り、/mcpesp-idf-eimconnected(4 tools) と表示されました。

claude mcp add --transport stdio esp-idf-eim -- eim run "idf.py -C <プロジェクトのパス> mcp-server"

-C <プロジェクトのパス> で対象プロジェクトを明示できます(--help で確認済み。後述の IDF_MCP_WORKSPACE_FOLDER の代わりになります)。eim run に渡した複数の引数は、正しく連結されて idf.py に届きました。

Claude Code の /mcp 画面で esp-idf-eim が connected・4 tools と表示されている

/mcp で esp-idf-eim が connected・4 tools と表示される(実機確認)

⚠️ 登録スコープは実行フォルダに紐づく(local スコープ)

claude mcp add は既定で local スコープ、つまりコマンドを実行したフォルダに紐づいて登録されます。別のフォルダで Claude Code を起動すると、その登録は見えません。プロジェクトフォルダの中で登録するか、どこからでも使いたいなら -s user を付けてユーザースコープで登録してください。

Cursor や VS Code の場合は、設定ファイルに JSON で書きます(Cursor は .cursor/mcp.json、VS Code は .vscode/mcp.json)。

{
  "mcpServers": {
    "esp-idf-eim": {
      "command": "eim",
      "args": ["run", "idf.py mcp-server"],
      "env": { "IDF_MCP_WORKSPACE_FOLDER": "${workspaceFolder}" }
    }
  }
}
⚠️ AI クライアントはシェルの環境変数を引き継がない

上の JSON に出てくる IDF_MCP_WORKSPACE_FOLDER は、対象プロジェクトを指すための指定です。AI クライアントが起動するプロセスは、あなたのシェルの環境変数を引き継がないため、ターミナルで idf.py が通る状態でも、クライアント経由のサーバは「どのプロジェクトを対象にすればいいのか」を知りません。

今回の実機検証では、環境変数の代わりに起動コマンドへ直接 -C <プロジェクトのパス> を渡す方法で対象を明示し、問題なく接続できました。「手元では動くのに、AI クライアントからだと対象が見つからない」ときは、-C かこの環境変数のどちらかで対象を渡せているかを確認してください。

④ 依頼する

登録できたら、あとは自然言語です。たとえば「ターゲットを ESP32-C6 にして、ビルドが通るか確認して」と頼めば、クライアントは set_targetbuild_project を順に呼び出します。実機でも、ツールが呼ばれて処理そのものは最後まで走ることを確認しました。ただし現状は「処理は成功するのに完了応答が返らない」という別の問題があり、この点は後述の「🔧 実機で確認した結果(2026-07-30)」で正直に扱います。どのチップを選ぶかで迷っている場合は、ESP32 シリーズの選び方|S3・C3・C6・H2・P4 の違いと使い分け で用途からモデルを決めてからにすると、ターゲット指定で迷いません。


📚 もう一つの公式サーバ:ドキュメント MCP(リモート)

ローカルの Tools サーバとは別に、公式ドキュメントを検索するためのリモート MCP サーバも用意されています。なお、このリモートサーバは今回の実機検証の対象外で、以下の記載は Espressif 公式ドキュメントにもとづくものです。

  • 種類 — リモートの HTTP サーバ(起動するローカルプロセスはありません)
  • エンドポイントhttps://mcp.espressif.com/docs
  • 公開ツールsearch_espressif_sources(query, language)。最新の Espressif ドキュメント(英語・中国語)に対して意味検索を行います

Claude Code へは HTTP サーバとして登録します。

claude mcp add --transport http espressif-docs https://mcp.espressif.com/docs

これを入れておくと、AI クライアントが当てずっぽうではなく、公式ドキュメントを根拠に答えを組み立てやすくなります。Tools サーバ(操作)とドキュメントサーバ(根拠)は、役割が違うので併用すると相性がいい組み合わせです。

公式が用意している MCP サーバは、ハブページ mcp.espressif.com にまとまっています。上記2つのほか、クラウド側の ESP RainMaker 用サーバなどもここから辿れます。


⚠️ 使う前に知っておきたい注意点

  • 実行できる操作は、サーバが公開しているものだけ — Tools サーバが公開しているのは、いまのところターゲット設定・ビルド・書き込み・クリーンと、状態の読み取りです。デバッグや回路の問題を解決してくれるわけではありません。 便利になるのは「操作の往復」であって、設計判断そのものではない、という線引きが大事です
  • 重いツール呼び出しは、現状 Windows で「完了応答が返らない」ことがある — 実機検証で 4/4 回再現しました。ビルドや書き込みといった処理そのものは成功しているのに、MCP のタスクが完了扱いにならず待ち続ける症状です。詳細と回避策は後述の「🔧 実機で確認した結果(2026-07-30)」にまとめました
  • 書き込みは実機に届く — 前述のとおり flash_project は実デバイスへの書き込みです
  • 環境変数を引き継がないIDF_MCP_WORKSPACE_FOLDER の件。ローカルサーバ特有のつまずきどころです
  • MCP は仕様が動いている最中 — 下のワード解説を参照
💡 ワード解説:MCP 仕様のバージョン(2025-11-25 と 2026-07-28)

MCP の仕様は、後方互換を壊す変更が入った最後の日付YYYY-MM-DD 形式のラベルで表します。

  • 確定版(stable)は 2025-11-25 — 現在の正式な仕様バージョンです
  • 2026-07-28 版は、ローンチ以降で最大規模の改訂とされ、本稿執筆時点(2026年7月)では Release Candidate(最終公開の目標日は 2026年7月28日)です。ステートレス化・拡張フレームワーク・認可の強化などが含まれます

つまり、MCP はまだ活発に動いている仕様です。ここで紹介した接続手順は日常利用にはそのまま使えますが、クライアントとサーバのバージョンは、折を見て更新しておくのが安全です。


🧭 どこで効いて、どこで効かないか

最後に、実務目線での効き所を整理します。

  • 効くところ — ターゲット切り替え・ビルド・書き込み・状態確認といった反復操作の往復。「聞く → コピペ → 実行 → また聞く」の写経が消えます。特に、複数チップを行き来しながら試す局面で楽になります
  • 効かないところ原因究明そのもの。ビルドエラーの本質的な修正や、配線・電源・タイミングの問題は、これまでどおり自分で切り分ける領域です。MCP サーバは「手を動かす部分」を代行してくれるだけで、「考える部分」を肩代わりするものではありません

この線引きさえ押さえておけば、MCP サーバは環境が整っているほど効いてくる道具です(現状の制約は後述の実機結果のとおりで、当面は eim run でのシェル直行が現実解になります)。まだ 6.0 に上げていないなら、レガシードライバの全廃など上げるときの注意点を先に把握してから移行するのが安全です。


🔧 実機で確認した結果(2026-07-30)

ここまでの接続手順を、実機で最後まで通してみました。結論から言うと、方向性は本物で「実処理はもう動く」段階です。ただし Windows では、重いツール呼び出しで「処理は成功するのに完了応答が返らない」問題があり、実用は今後のパッチ待ち、というのがこの時点(2026-07-30)での率直なところです。以下、成功したところ・詰まったところ・回避策を、事実と仮説を分けて残します。

検証環境

  • OS — Windows 11 Pro
  • EIM — 0.17.1(winget Espressif.EIM
  • ESP-IDF — v6.0.2(既定の導入先 C:\esp\v6.0.2\esp-idf
  • mcp(Python パッケージ) — 1.29.0(前述のとおり 2.0 から落としたもの)
  • 実機 — ESP32-S3(PSRAM 8MB)、ポート COM5
  • クライアント — Claude Code(stdio 登録)

動いたところ

手順 結果
EIM 導入(winget) GUI 版 0.17.1 を導入。eim コマンドが使える
mcp 機能の後付け --idf-features mcp で導入。ただし起動には mcp を 1.x へ要ダウングレード
サーバ起動 idf.py mcp-serverMCP Server running on stdio... を出して待ち受け
Claude Code 登録 /mcp で connected(4 tools)を確認
ツール呼び出し(実処理) set_target で sdkconfig 生成、build_project で ninja 完走、hello_world.bin 生成まで成功
実機書き込み bootloader・partition-table・アプリの3イメージが Hash of data verified、Hard resetting via RTS pin でアプリ起動。書き込み自体は約2秒

接続・ツール一覧の取得・実機への書き込みまで、やりたいことは一通り実機で成立しました。

★ 詰まったところ:ツールは動くのに「完了応答」が返らない

いちばんの問題がこれです。set_targetbuild_projectflash_project を MCP 経由で呼ぶと、内部の処理は成功しているのに、MCP のタスクがいつまでも「実行中」のままになり、完了応答がクライアントに返ってきません

  • 再現性 — クリーンな環境を含めて 4/4 回再現しました。使う AI モデルを変えても同じだったため、クライアント側ではなくサーバ側の挙動と考えられます
  • 2つの出方 — (a) 実処理は最後まで走るのに応答だけ返らない/(b) そもそも実処理が始まらずハングする(flash_project の初回。停止して再試行すると、2回目は約2秒で完走しました)
  • 観測 — ビルドが set_target のタスクの中で走るなど、処理が遅れて実行されているように見える場面がありました
💡 原因の仮説(未確定)

ここからはまだ確定していない仮説です。stdio トランスポートでは、JSON-RPC のやり取りに使う標準出力(stdout)と、cmake・ninja・esptool といった子プロセスの大量の出力が、同じ経路でぶつかっている可能性があります(いわゆるパイプ詰まり)。接続やツール一覧の取得のような軽いやり取りは通るのに、重いツール呼び出しだけ応答が返らない、という症状とは整合します。あくまで仮説であり、確定した原因ではありません。

現実解:いまは eim run でシェルに直行する

完了応答の問題があるあいだ、実務でいちばん確実だったのは、MCP を介さずに eim runidf.py を直接実行するやり方でした。

eim run "idf.py -C <プロジェクトのパス> set-target esp32s3"
eim run "idf.py -C <プロジェクトのパス> build"
eim run "idf.py -C <プロジェクトのパス> flash"

set-target → build → flash まで一気通貫で安定して通ります。この一連を Claude Code のスキルにまとめて自然言語から安定して回す方法は、続編の Claude Code スキルで ESP32 開発を自動化|idf.py を直接叩く に、失敗込みの実戦テストとともにまとめました。ただし、この方法にも気をつける点が2つあります。

⚠️ `eim run` の2つの落とし穴
  • eim run は、内側のコマンドが失敗しても終了コードが 0 になることがあります。成否は終了コードではなく、出力の文字列(Hash of data verified などの成功ログ、あるいはエラー行)で判定してください
  • COM ポートの占有 — Tera Term などがポートを掴んだままだと書き込みに失敗します。占有しているプロセスを特定し、解放してから書き込みます

なお、この完了応答の問題は Espressif 側で解消され得る性質のものと見られます。現時点(2026-07-30)では未報告ですが、上流に共有する価値のある挙動です。


✅ まとめ

  • ESP-IDF 6.0 は idf.py に MCP サーバを内蔵。Claude Code などから、自然言語で set_targetbuild_projectflash_project まで呼び出せます
  • 接続は EIM で mcp 機能を有効化 → idf.py mcp-server を起動 → クライアントに登録の流れ。Claude Code なら claude mcp add --transport stdio ... の1行です
  • 実機(Windows 11/ESP-IDF v6.0.2/ESP32-S3)では、接続・ツール一覧・実機書き込みまで成立を確認(2026-07-30)。導入では、eim install(引数なし)が mcp を入れないことと、mcp 2.0 が入ると起動できないこと(mcp[cli]<2 で回避)が要注意です
  • ただし現状、重いツール呼び出しは「処理は成功するのに完了応答が返らない」(4/4 再現)。当面の現実解は eim run でのシェル直行です
  • ドキュメント MCP サーバhttps://mcp.espressif.com/docs)を併用すると、AI が公式ドキュメントを根拠に動けます(こちらは今回未検証)
  • できるのは操作の自動化まで。設計判断や原因究明は、これまでどおり自分の仕事です

関連記事


参考