mcpField
E
ESP32 Simulator

ESP32 Simulator

ローカル
github.com開発ツール61 週間前に更新

ESP32 Simulator について

ESP32 Simulator は、ローカルの ESP32 命令レベルエミュレーターでファームウェアを起動・テストするツールです。実機がない組み込み開発向けで、MCP 経由でシリアルログ、クラッシュ情報、画面キャプチャを返し、仮想ハードウェアの操作もスクリプト化できます。

主な機能

  1. 01ローカルエミュレーターで ESP32 ファームウェアを起動
  2. 02UART 出力の確認とログパターンの検証
  3. 03パニック情報とディスプレイ画像の取得
  4. 04ボタン、GPIO、UART、タッチ入力のスクリプト制御
  5. 05仮想 WiFi と複数チップモデルに対応

活用シーン

  1. 01実機なしで ESP32 ファームウェアをテスト
  2. 02起動ログが期待どおりかを確認
  3. 03ボタン入力を模擬して応答をテスト
  4. 04CI でファームウェアのシミュレーション検証

MCP 対応

MCP サーバーはコーディングエージェントに実行、検証、スクリプト操作、画面キャプチャのツールを提供し、コンソールログ、停止理由、パニック情報、PNG を返します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"stramanu-esp32sim": {
"command": "npx",
"args": [
"-y",
"esp32sim-mcp"
]
}
}
}
起動コマンドnpx -y esp32sim-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmesp32sim-mcp0.2.6

ツール

6

掲載時のツール一覧 · 1 週間前に更新

パラメーター型必須説明
chipenumいいえ対象チップの系列。デフォルトは s3(ESP32-S3)です。esp32 | s3 | c3 | c6
wifistringいいえDHCP/DNS/NAT を備えた仮想アクセスポイントを接続します。仕様は 'ssid=demo,psk=secret' の形式です(キー:ssid、psk、chan、bssid)。オープンネットワークの場合は SSID のみを指定します。ステーションには 10.0.2.15 が割り当てられます。
boardstringいいえボードのモデル:S3 は 'atech14'(デフォルト)、'waveshare-lcd4b'、'waveshare-amoled18-v2'、'waveshare-cam';C6 は 'waveshare-c6-lcd147';ESP32 は 'ttgo-tdisplay'、'esp32dev-loopback';ベアモジュールの場合は 'none'。ボードのない C3 では省略してください。sim_list_boards を参照してください。
appBinstringいいえアプリケーションバイナリ(.bin)への直接パス。
consoleenumいいえキャプチャするコンソールソース(デフォルト:both = UART0 + USB-Serial/JTAG)。ESP-IDF が両方のコンソールにミラー出力する行は一度だけ表示されます。uart0 | usb | both | all | none
ptableBinstringいいえpartition-table.bin への直接パス(実際の ROM 起動では appBin とともに必要)。
maxSecondsnumberいいえエミュレーション時間の上限(秒、デフォルト:10s)。エミュレーションは通常、実時間より速く実行されます。
projectDirstringいいえESP-IDF プロジェクトのルートまたはビルドフォルダーへのパス。省略した場合は、現在の作業ディレクトリを使用します。
bootloaderBinstringいいえbootloader.bin への直接パス(実際の ROM 起動では appBin とともに必要)。
stopAfterExceptionsnumberいいえCPU 例外が N 回発生した後に停止します(デフォルトでは未設定)。Xtensa ファームウェアで頻繁に発生するウィンドウオーバーフロー/アンダーフローも含め、すべての例外をカウントするため、クラッシュ検出器ではなくデバッグ補助機能です。panic はログから常に検出されます。

詳細

esp32sim-mcp

エージェントがESP32ファームウェアを作成し、起動してテストします。ボードもアカウントも不要です。

npm CI License: MIT MCP

Claude CodeがESP-IDFプロジェクトにカウンターを追加し、ビルドしてエミュレーターで検証します

実際のClaude Codeセッションをライブで記録したものです(最後のアイドル時間のみ短縮しています)。ESP-IDFのhello_worldを編集し、ESP-IDFがインストールされていないためDockerでビルドして、エミュレーターのコンソールを確認しています。


コーディングエージェントは組み込みCの作成は得意です。しかし、実行となると手も足も出ません。手元にボードがなければ、「コンパイルできた」でフィードバックループが終わってしまいます。

esp32sim-mcpは、そのループを完結させます。Claude Code、Codex、Cursor、または任意のMCPクライアントにツール一式を提供し、エージェントが作成したファームウェアを、ローカルで動作する命令レベルのESP32エミュレーターであるesp32sim上で起動します。そして、チップが出力した内容、クラッシュの有無、ディスプレイの表示を返します。エージェントは結果を読み、コードを修正して再試行します。実機を手元で使う場合と同じ流れです。

  • 🔌 ハードウェアもクラウドも不要です。 すべてお使いのマシン上で動作します。アカウント、トークン、ボードは必要ありません。
  • 🧬 実際のブートチェーンを使用します。 EspressifのマスクROM、ESP-IDFブートローダー、変更していないアプリを、ESP32-S3、C3、C6、従来のESP32で実行します。
  • 📡 コンソールだけではありません。 DHCP、DNS、NATを備えた仮想WiFiアクセスポイント、ボタン、ロータリーエンコーダー、GPIO、UART入力、タッチ、ディスプレイのスクリーンショットに対応しています。
  • 🧪 雰囲気ではなくアサーションで検証します。 sim_expectは合否と、見つからなかった正確な行を返すため、エージェントは何を修正すべきか把握できます。
  • ⚡ 高速です。 エミュレーションは通常、実時間より速く進みます。Appleシリコンでは、WiFiステーションがネットワークに接続するまでのエミュレーション上の8秒が、約0.6秒で完了します。
  • 🤖 スキルが付属します。 initを実行すると、作成 → ビルド → シミュレーション → 修正の流れをエージェントに教えるスキルがインストールされます。ESP-IDFがインストールされていない場合にDockerでビルドする方法も含まれます。

クイックスタート

npx -y esp32sim-mcp setup                      # emulator + mask ROMs, pinned and SHA-256 verified
cd your-esp-idf-project
npx -y esp32sim-mcp init                       # registers the MCP server and the skill for your agents

次に、シリアルコンソールで確認できるものをエージェントに依頼します。

1秒ごとに出力するカウンターを追加してビルドし、シミュレーターで5まで増えることを確認してください。

必要条件:Node.js 22以上、およびファームウェアのビルドにESP-IDF または Dockerが必要です。エミュレーターのビルド済みバイナリはmacOS(Appleシリコン)とLinux(x64、arm64)に対応しています。詳しくはその他のプラットフォームをご覧ください。

エージェントに見える内容

実際のセッションでは、エージェントは次のように呼び出します。

{
  "tool": "sim_expect",
  "projectDir": ".",
  "chip": "s3",
  "board": "none",
  "maxSeconds": 10,
  "patterns": ["Hello world!", "Counter: 1", "Counter: 2", "Counter: 3", "Counter: 4", "Counter: 5"]
}

すると、次の結果が返ります。

### Expect Test: ✅ PASSED

Matched 6 / 6 patterns.

- ✅ Matched (line 54): `Hello world!`
- ✅ Matched (line 55): `Counter: 1`
  ...
- ✅ Matched (line 65): `Counter: 5`

#### Full UART Logs:
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0xf (SPI_FAST_FLASH_BOOT)
...

問題が発生した場合は、代わりにパニックの情報が返されます(Guru Meditation Error、スタックオーバーフロー、アサーション失敗、ヒープ破損)。そこには、発生までのログと、見つからなかったパターンが明示されます。

ツール

ツール機能
sim_runファームウェアを起動し、コンソールログ、停止理由、エミュレート時間、パニックがあればその内容を返します。
sim_expectファームウェアを実行し、文字列または正規表現がコンソールに表示されることをデフォルトで順番にアサートします。
sim_scriptエミュレート時刻を指定してハードウェアを操作します:ボタンのpress/release、gpioのレベル、knobの回転、uart/serialの入力、touch、stop。
sim_screenshot指定したエミュレート時刻におけるボードのディスプレイのPNGを返します。
sim_list_boardsチップ、ボード、ディスプレイ、入力を一覧表示します。
sim_doctorエミュレーターとROMを確認し、不足しているものの修正方法を示します。

すべてのツールはprojectDir(ESP-IDFビルドはbuild/flasher_args.jsonから検出されます)、または明示的なappBin/bootloaderBin/ptableBinのパスに加え、chip、board、wifi(例:ssid=demo,psk=secret)を受け取ります。UART0とUSB-Serial/JTAGコンソールの両方がキャプチャされるため、プロジェクトがどちらにログを出力していても、その内容が表示されます。

仕組み

flowchart LR
    A["Coding agent<br/>(Claude Code, Codex, Cursor)"] -- "edits code,<br/>runs idf.py build<br/>(local or Docker)" --> B["ESP-IDF build/"]
    A -- "MCP: sim_expect, sim_run, ..." --> C["esp32sim-mcp"]
    C -- "flasher_args.json" --> B
    C -- "spawns" --> D["esp32sim emulator<br/>mask ROM → bootloader → app"]
    D -- "UART / USB-JTAG, panics,<br/>display, virtual WiFi" --> C
    C -- "pass/fail, logs, PNG" --> A

esp32sim-mcpは、薄くテスト済みのレイヤーです。ビルドを検出し、ツール呼び出しをesp32simのコマンドラインに変換し、2つのコンソールを分離して重複を除去し、パニックを検出して、エージェント向けに結果を整えます。エミュレーション自体はesp32simが担います。

CIでの使用

エージェントなしでも同じチェックを実行でき、成功時は終了コード0、失敗時は1を返します。ファームウェアをビルドし、起動ログをアサートするGitHub Actionsジョブの例:

jobs:
  firmware:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v5
        with:
          node-version: 22
      - name: Build
        run: docker run --rm -v "$PWD:/project" -w /project espressif/idf:v5.5.4 idf.py set-target esp32s3 build
      - name: Install the emulator
        run: npx -y esp32sim-mcp setup
      - name: Boot and check the console
        run: npx -y esp32sim-mcp expect --max-seconds 10 --pattern "app_main" "Counter: 5"

このリポジトリ独自のCIでは、ボタンのスクリプト操作も含め、examples/hello-esp32に対して同様の処理を行います。

すべてのCLIコマンド
esp32sim-mcp setup                 # install emulator + ROMs (or: install-emulator, fetch-roms)
esp32sim-mcp init [--global] [--agent claude-code|codex|cursor|claude-desktop] [--dry-run]
esp32sim-mcp run [-p dir] [--chip s3] [--board none] [--max-seconds 5] [--wifi ssid=x,psk=y]
esp32sim-mcp expect --pattern "a" "b" [--unordered] [--script actions.txt] [...run options]
esp32sim-mcp list [--chip c6]
esp32sim-mcp doctor
esp32sim-mcp serve                 # the MCP server (what agents launch)

対応チップとボード

チップボード(board)
ESP32-S3atech14(デフォルト:ST7735 TFT、ボタン、ロータリーエンコーダー、LEDリング、オーディオ)、waveshare-lcd4b(480×480タッチ)、waveshare-amoled18-v2(368×448 AMOLEDタッチ)、waveshare-cam(OV5640カメラ)、none
ESP32-C3コンソールのみ(ボードモデルなし)
ESP32-C6waveshare-c6-lcd147(172×320 LCD)、none
ESP32(クラシック)ttgo-tdisplay(135×240 TFT)、esp32dev-loopback、none

標準のESP-IDFプロジェクトではnoneを使用してください。仮想WiFiアクセスポイントは、4種類すべてのチップで動作します。

エージェントのセットアップ

initは使用しているエージェントを検出し、それぞれを設定します。デフォルトではファームウェアプロジェクト内で実行されます。--globalを指定すると、ユーザーレベルの設定を書き込みます。

エージェントMCP サーバー(プロジェクト/--global)スキル(プロジェクト/--global)
Claude Code.mcp.json/claude mcp add --scope user.claude/skills//~/.claude/skills/
Codex~/.codex/config.toml(ユーザーのみ).agents/skills//~/.codex/skills/
Cursor.cursor/mcp.json/~/.cursor/mcp.json.cursor/skills//~/.cursor/skills/
Claude Desktop--globalのみ—

既存のエントリーは保持され、再実行しても変更はなく、解析できない設定ファイルには手を加えません。

Claude Codeプラグイン。 initの代わりに、サーバーとスキルをプラグインとして、すべてのプロジェクトにインストールできます:

/plugin install esp32sim --marketplace stramanu/esp32sim-mcp

MCPレジストリ。 サーバーはio.github.stramanu/esp32sim-mcpとして公式MCPレジストリに公開されています。その他のMCPクライアントでは、次のようにします:

{
  "mcpServers": {
    "esp32sim": { "command": "npx", "args": ["-y", "esp32sim-mcp", "serve"] }
  }
}
その他のプラットフォーム

setupはmacOS arm64とLinux x64/arm64に、ビルド済みバイナリをインストールします。これらは、このリポジトリのエミュレータワークフローによって、署名済みビルド来歴(gh attestation verify <archive> -R stramanu/esp32sim-mcp)付きでソースからビルドされます。それ以外の環境では、Cargoを使ってesp32simをビルドしてください(rustup)。このリリースのテスト対象となったコミットに固定されています:

cargo install --locked --git https://github.com/mikroverk/esp32sim --rev f535f3b42293a76ab64c231a0425f35857ab6cf1 esp32sim
npx esp32sim-mcp fetch-roms

ESP32SIM_PATHは別の場所にあるエミュレータバイナリを、ESP32SIM_ROM_DIRは別のROMディレクトリを指定します。ESP-IDFのインストール内にあるROMは自動的に検出されます。

比較

ボードなしで実行可能アカウントまたはトークンが必要エージェント向けに構築
esp32sim-mcp✅ ローカルエミュレーター不要✅ MCP サーバー + スキル
Wokwi CLI MCP✅はい(WOKWI_CLI_TOKEN)⚠️ 実験的
esparagus(Espressif)❌ 実機に書き込み不要✅
esp32sim 単体✅不要❌ CLI と Web UI

esparagus は次の自然なステップです。まず esp32sim-mcp でシミュレーションし、その後、実際のボードで確認します。

制限事項

  • エミュレーターはシリコンではありません。esp32sim がモデル化していない周辺機器、RF のタイミング、Bluetooth は対象外です。出荷前にハードウェアで確認してください。
  • エージェント自身がファームウェアをビルドします(ローカルまたは Docker で idf.py を使用)。MCP サーバーはコンパイルを行いません。
  • Windows でのテストは行われていません。

貢献

Issue やプルリクエストを歓迎します。開発環境のセットアップと、実際のエミュレーターを使ったエンドツーエンドテストの実行方法については CONTRIBUTING.md を、変更内容については CHANGELOG.md をご覧ください。

クレジット

  • Joakim Eriksson、Alice、Mattia Fiumara による esp32sim:実際の処理を担うエミュレーター(MIT)。
  • Espressif:ESP-IDF とマスク ROM の ELF(Apache-2.0)。
  • Model Context Protocol。

ライセンス

MIT © Emanuele Strazzullo

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。