mcpField
E
ESP32 MCP Server

ESP32 MCP Server

ローカル
github.com/navadoその他6533 週間前に更新

ESP32 MCP Server について

ESP32 MCP Server は ESP32 上で動作する MCP サーバーで、nRF52840 ではセンサー専用モードになります。WebSocket と JSON-RPC 2.0 を通じて、センサーデータとバスプロトコルの解析結果を AI アシスタントに公開します。AI エージェントから直接ハードウェアを読み取りたい組み込み、船舶、車載データの用途に向いています。

主な機能

  1. 01WebSocket 上の JSON-RPC 2.0 による MCP インターフェース
  2. 02複数ドライバーに対応する I2C センサーの自動スキャン
  3. 03XOR チェックサム検証付きの NMEA 0183 解析
  4. 04NMEA 2000 と OBD-II CAN フレームのデコード
  5. 05MCP から照会できるバス履歴のリングバッファ

活用シーン

  1. 01AI エージェントから I2C の温湿度・気圧センサーを読み取る
  2. 02GPS や海図プロッターが出力する NMEA 0183 データを解析する
  3. 03OBD-II の車両パラメーターと CAN バス履歴を照会する

MCP 対応

このプロジェクトは ESP32 上で動作する MCP サーバーであり、WebSocket 経由でリソースとセンサー・バス関連メソッドを提供します。MCP クライアントはこれらを呼び出し、購読できます。

設定

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

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

ESP32 MCP サーバー

ビルドとテスト

ESP32(センサー専用モードでは Nordic nRF52840 も)上で動作する Model Context Protocol(MCP)サーバーです。WebSocket / JSON-RPC 2.0 を介して、実世界のセンサーデータやバスプロトコルを AI アシスタントや自動化ツールに公開します。

AI エージェントをハードウェアに直接接続できます。I2C センサーの照会、NMEA 0183 GPS/船舶データの解析、NMEA 2000 および OBD-II CAN フレームのデコード、バス履歴の再生を、すべて標準の MCP インターフェースを通じて行えます。

アーキテクチャ


機能

機能詳細
MCP プロトコルWebSocket 上の JSON-RPC 2.0、リソースの検出とサブスクリプション
I2C センサー自動スキャンと、BME280、MPU6050、ADS1115、SHT31、BH1750、INA219 用ドライバー
NMEA 0183GGA、RMC、VTG、GSV、MWV、DBT、DPT、HDG、HDT、XOR チェックサム検証
NMEA 2000 / CAN29 ビット PGN:位置、方位、速度、水深、風、姿勢、水温
OBD-II / CAN標準 11 ビット OBD-II service 01/09 PID のデコード(60 以上の PID)
バス履歴CAN、NMEA、NMEA 2000、OBD-II 用の永続リングバッファ。MCP 経由で照会可能
バスリーダー時間制限付きシリアルおよび CAN 読み取り、 raw または解析済みモード、JSON 出力
WiFiAP セットアップ UI と STA モード。認証情報は NVS に保存
検出mDNS(_mcp._tcp)と UDP 機能ブロードキャスト
メトリクスヒープ、稼働時間、RSSI、起動後も保持されるヒストグラム統計
複数ボード対応ESP32-S3、ESP32-C3、ESP32、Adafruit HUZZAH32、M5Stack、Nordic nRF52840-DK、Adafruit Feather nRF52840
テストネイティブ単体テスト(Unity)、I2C / CAN / Serial / LittleFS のモック

対応ボード

ESP32 ボード — MCP サーバー完全対応(WiFi + WebSocket + CAN)
ボードPlatformIO 環境MCUフラッシュRAMWiFiBLECANRGB LED
ESP32-S3-DevKitC-1esp32-s3-devkitc-1Xtensa LX7 × 2 @ 240 MHz8 MB512 KB + 8 MB PSRAM✓5.0✓GPIO48
ESP32-DevKitC V4esp32-devkitcXtensa LX6 × 2 @ 240 MHz4 MB520 KB✓4.2✓—
ESP32-C3-DevKitM-1esp32-c3-devkitm-1RISC-V @ 160 MHz4 MB400 KB✓5.0✓GPIO8
Adafruit HUZZAH32adafruit-huzzah32Xtensa LX6 × 2 @ 240 MHz4 MB520 KB✓4.2✓—
M5Stack Core ESP32m5stack-coreXtensa LX6 × 2 @ 240 MHz16 MB520 KB✓4.2✗—
nRF52840 ボード — センサー専用(I2C + シリアル、WiFi なし)
ボードPlatformIO 環境MCUフラッシュRAMBLE
Nordic nRF52840-DKnrf52840-dkCortex-M4F @ 64 MHz1 MB256 KB5.0 + 802.15.4
Adafruit Feather nRF52840nrf52840-featherCortex-M4F @ 64 MHz1 MB256 KB5.0

nRF52840 ターゲットは、別の main_nrf.cpp エントリーポイントを実行します。センサー + I2C + シリアル出力のみです。WiFi、MCP WebSocket、LittleFS、バス履歴には対応していません。MCP-over-WiFi のすべての機能を利用するには、UART1 に接続した ESP32-C3 を AT コマンドモードでブリッジとして使用してください。

ボード機能一覧
機能ESP32-S3ESP32 V4ESP32-C3HUZZAH32M5StacknRF52840-DKnRF52840-Feather
WiFi✓✓✓✓✓✗✗
BLE✓✓✓✓✓✓✓
CAN / TWAI✓✓✓✓✗✗✗
I2C✓✓✓✓✓✓✓
UART(外部)✓✓✓✓✓✓✓
LittleFS✓✓✓✓✓✗✗
MCP サーバー✓✓✓✓✓✗✗
バス履歴✓✓✓✓✓✗✗
mDNS / UDP 検出✓✓✓✓✓✗✗

アーキテクチャ

flowchart TD
    Client[AI Agent / MCP Client] -->|WebSocket :9000 JSON-RPC 2.0| MCPServer

    subgraph ESP32
        MCPServer -->|resources/list| Resources
        MCPServer -->|sensors/i2c/scan| SensorMgr
        MCPServer -->|sensors/read| SensorMgr
        MCPServer -->|buses/serial/read| BusReader
        MCPServer -->|buses/can/read| BusReader
        MCPServer -->|bus/history/read| BusHistory
        MCPServer -->|bus/history/config/*| BusHistory

        SensorMgr -->|Wire I2C| I2CSensors[BME280 · MPU6050 · ADS1115\nSHT31 · BH1750 · INA219]
        BusReader -->|UART| NMEAParser[NMEA 0183 Parser]
        BusReader -->|CAN TWAI| CANParser[NMEA 2000 / OBD-II Parser]
        BusReader -->|feed| BusHistory[Bus History\nRing Buffers]
        BusHistory --> LittleFS

        NetworkMgr[Network Manager] --> WiFi
        NetworkMgr --> WebSetup[Setup UI :80]
        DiscoveryMgr[Discovery Manager] -->|mDNS + UDP| Network
        Metrics[Metrics System] --> LittleFS
        uLogger --> LittleFS
    end

    MCPServer --> Metrics
    MCPServer --> uLogger

ハードウェア

ピン割り当て(ESP32-S3-DevKitC-1)
GPIO機能接続先
IO8I2C SDAすべての I2C センサー
IO9I2C SCLすべての I2C センサー
IO16UART1 RXGPS / チャートプロッター TX
IO17UART1 TXGPS / チャートプロッター RX(任意)
IO4CAN RXTJA1050 / SN65HVD230 CRXD
IO5CAN TXTJA1050 / SN65HVD230 CTXD
nRF52840-DK ピン割り当て
ピン機能
P0.26 / D6I2C SDA
P0.27 / D7I2C SCL
P0.06 / TXUART1 TX
P0.08 / RXUART1 RX
部品表
#部品用途
1ESP32-S3-DevKitC-1メイン MCU
1BME280 ブレークアウトボード温度 / 湿度 / 気圧
1MPU6050 ブレークアウトボード6 軸 IMU(任意)
1TJA1050 または SN65HVD230CAN バス・トランシーバー(任意)
1GPS モジュール(3.3 V UART)NMEA 0183 の位置情報 / 時刻(任意)
24.7 kΩ 抵抗I2C プルアップ
—ブレッドボード + ジャンパー線
ESP32-S3-DevKitC-1 の配線
                    ┌──────────────────────────────────────┐
                    │         ESP32-S3-DevKitC-1            │
                    │                                       │
             3V3 ───┤ 3V3                          GND ├─── GND
             GND ───┤ GND                          IO0 ├
                    │                                   │
  I2C SDA ── IO8 ───┤ IO8  ┌──────────┐       IO17 ├─── UART1 TX → GPS
  I2C SCL ── IO9 ───┤ IO9  │  ESP32   │       IO16 ├─── UART1 RX ← GPS
                    │ IO10 │    S3    │       IO15 ├
                    │ IO11 └──────────┘       IO14 ├
                    │ IO12                    IO13 ├
                    │ IO3                      IO4 ├─── CAN RX ← TJA1050
                    │ IO46                     IO5 ├─── CAN TX → TJA1050
                    │                               │
                    │    USB (flash / serial log)   │
                    └───────────────────────────────┘
I2C センサーの配線

すべてのセンサーは 1 つのバスを共有します。SDA と SCL から 3V3 へ 4.7 kΩ のプルアップ抵抗を追加してください。

ESP32-S3      BME280       MPU6050      ADS1115      INA219
─────────     ───────      ───────      ───────      ───────
IO8 (SDA)─────SDA──────────SDA──────────SDA──────────SDA
IO9 (SCL)─────SCL──────────SCL──────────SCL──────────SCL
3V3  ──────────VCC──────────VCC──────────VCC──────────VCC
GND  ──────────GND──────────GND──────────GND──────────GND
               SDO→GND      AD0→GND      ADDR→GND
               (0x76)       (0x68)       (0x48)       (0x40)

その他の対応センサー(同じバス配線):SHT31(0x44)、BH1750(0x23)。

NMEA 0183 の配線(GPS / チャートプロッター)
GPS / chart plotter              ESP32-S3
───────────────────              ────────
TX  (3.3 V TTL NMEA out) ─────── IO16 (UART1 RX)
RX  (optional NMEA in)   ─────── IO17 (UART1 TX)
GND                      ─────── GND
VCC (3.3 V)              ─────── 3V3

デバイスが RS-232 レベルで出力する場合は、MAX3232 レベルシフターを使用してください。RS-232 を ESP32 GPIO に直接接続しないでください。

CAN バスの配線(NMEA 2000 / OBD-II)
TJA1050 / SN65HVD230             ESP32-S3
────────────────────             ────────
CTXD                  ─────────── IO5 (CAN TX)
CRXD                  ─────────── IO4 (CAN RX)
VCC (5 V for TJA1050) ─────────── VIN / external 5 V
GND                   ─────────── GND
CANH ──────────────── NMEA 2000 backbone / OBD-II CANH
CANL ──────────────── NMEA 2000 backbone / OBD-II CANL

NMEA 2000 は 250 kbps で動作します。OBD-II は 500 kbps で動作します。それに応じて、CANBusReader の設定でボーレートを設定してください。


ソフトウェアの前提条件

  • PlatformIO Core の CLI、または VS Code 用 PlatformIO IDE プラグイン
  • Python 3.8+
  • Git
pip install platformio

ビルドと書き込み

# 1. Clone
git clone https://github.com/navado/ESP32MCPServer.git
cd ESP32MCPServer

# 2. Install library dependencies
pio pkg install

# 3. Upload web assets to LittleFS (optional but recommended)
pio run -t uploadfs -e esp32-s3-devkitc-1

# 4. Build firmware
pio run -e esp32-s3-devkitc-1

# 5. Flash
pio run -t upload -e esp32-s3-devkitc-1

# 6. Monitor
pio device monitor --baud 115200
nRF52840
pio run -e nrf52840-dk
pio run -t upload -e nrf52840-dk

初回起動

  1. ボードの電源を入れます。Wi-Fi AP ESP32_XXXXXX(MAC アドレスの末尾 6 桁の 16 進数)をブロードキャストします。
  2. その AP に接続し、http://192.168.4.1 を開きます。
  3. Wi-Fi の認証情報を入力し、「保存」をクリックします。
  4. ボードがネットワークに接続し、シリアルコンソールに IP アドレスを表示します。
  5. MCP クライアントを ws://<IP>:9000 に接続します。

Web ダッシュボード

ブラウザベースのダッシュボードは、フラッシュメモリから http://<IP>/app で配信されます。

タブ機能
センサーI²C バスをスキャンし、検出したデバイスを表示して、値を読み取り、自動更新します
メトリクスすべてのメトリクス、現在の値、スパークライン履歴グラフを表示します
ログメトリクスのログエントリーを照会して消去します
MCP コンソールプリセットリクエストとリアルタイムのメッセージログを備えた、対話型 JSON-RPC コンソールです

HTTP エンドポイント(ポート 80)

メソッドパス説明
GET/Wi-Fi 設定ページ
POST/saveWi-Fi の認証情報を保存します(ssid、password フォームパラメーター)
GET/statusネットワークステータスの JSON
WS/wsリアルタイムのネットワークステータス WebSocket
GET/appブラウザダッシュボード
GET/bus-historyバス履歴設定 JSON を読み込みます
POST/bus-historyバス履歴設定 JSON を更新します

MCP API リファレンス(WebSocket ポート 9000)

すべてのメソッドは、WebSocket 上で JSON-RPC 2.0 を使用します。

プロトコル
メソッドパラメーター説明
initialize—サーバー情報、プロトコルバージョン、機能
resources/list—登録済み MCP リソースを一覧表示します
resources/readuriURI でリソースを読み込みます
resources/subscribeuriリソースのプッシュ更新を購読します
resources/unsubscribeuri購読を解除します
センサー
メソッドパラメーター説明
sensors/i2c/scan—I²C バスをスキャンし、ドライバーを自動検出して初期化します
sensors/readsensorId?1 つのセンサーの全チャンネルを読み取ります(すべて読み取る場合は ID を省略します)
sensors/i2c/scan
{"jsonrpc":"2.0","method":"sensors/i2c/scan","id":1}
{
  "jsonrpc":"2.0","id":1,
  "result":{"devices":[
    {"address":118,"name":"BME280","supported":true,"parameters":["temperature","pressure","humidity"]},
    {"address":104,"name":"MPU6050","supported":true,"parameters":["accel_x","accel_y","accel_z","gyro_x","gyro_y","gyro_z","temperature"]}
  ]}
}
sensors/read
{"jsonrpc":"2.0","method":"sensors/read","id":2,"params":{"sensorId":"bme280_0x76"}}
{
  "jsonrpc":"2.0","id":2,
  "result":{"readings":[
    {"sensorId":"bme280_0x76","parameter":"temperature","value":22.4,"unit":"°C","timestamp":1234567890,"valid":true},
    {"sensorId":"bme280_0x76","parameter":"humidity","value":58.1,"unit":"%RH","timestamp":1234567890,"valid":true},
    {"sensorId":"bme280_0x76","parameter":"pressure","value":101320.0,"unit":"Pa","timestamp":1234567890,"valid":true}
  ]}
}
バス履歴

バス履歴では、CAN フレーム、NMEA 行、デコード済みの NMEA 2000 メッセージ、OBD-II レコードを循環 RAM バッファに蓄積します。バッファのサイズは設定可能な RAM 予算に基づいて決まり、その設定は LittleFS に永続化されます。

メソッドパラメーター説明
bus/history/readtype、limit?履歴バッファに蓄積されたメッセージを読み取ります
bus/history/config/get—現在のバッファサイズ設定を読み取ります
bus/history/config/setconfig fieldsバッファのサイズを変更し、設定を永続化します
bus/history/read

type は can、nmea、nmea2000、obdii のいずれかである必要があります。limit のデフォルトは、保存されているすべてのエントリーです。

{"jsonrpc":"2.0","method":"bus/history/read","id":3,"params":{"type":"can","limit":10}}
{
  "jsonrpc":"2.0","id":3,
  "result":{
    "type":"can",
    "frames":["7E8#0441050300000000","7E8#04410D0000000000"],
    "count":2,
    "capacity":500
  }
}
{"jsonrpc":"2.0","method":"bus/history/read","id":4,"params":{"type":"nmea2000"}}
{
  "jsonrpc":"2.0","id":4,
  "result":{
    "type":"nmea2000",
    "messages":[
      {"pgn":129025,"priority":2,"source":0,"name":"Position Rapid Update",
       "valid":true,"hasPosition":true,"latitude":47.6097,"longitude":-122.3331}
    ],
    "count":1,"capacity":200
  }
}
{"jsonrpc":"2.0","method":"bus/history/read","id":5,"params":{"type":"obdii"}}
{
  "jsonrpc":"2.0","id":5,
  "result":{
    "type":"obdii",
    "records":[
      {"service":1,"pid":12,"name":"Engine RPM","value":1500,"unit":"rpm","valid":true},
      {"service":1,"pid":13,"name":"Vehicle Speed","value":65,"unit":"km/h","valid":true}
    ],
    "count":2,"capacity":300
  }
}
bus/history/config/get
{"jsonrpc":"2.0","method":"bus/history/config/get","id":6}
{
  "jsonrpc":"2.0","id":6,
  "result":{
    "canFrameCount":500,
    "nmeaLineCount":1000,
    "nmea2000Count":200,
    "obdiiCount":300,
    "ramBudgetBytes":1048576,
    "safetyMarginBytes":65536,
    "freeHeapBytes":2097152
  }
}
bus/history/config/set

すべてのフィールドは省略可能です。省略したフィールドは現在の値が保持されます。

{
  "jsonrpc":"2.0","method":"bus/history/config/set","id":7,
  "params":{"canFrameCount":1000,"ramBudgetBytes":2097152}
}
{"jsonrpc":"2.0","id":7,"result":{"ok":true,"canFrameCount":1000,"nmeaLineCount":1000,"nmea2000Count":200,"obdiiCount":300,"ramBudgetBytes":2097152,"safetyMarginBytes":65536}}

canFrameCount、nmeaLineCount、nmea2000Count、obdiiCount をすべて 0 に設定すると、自動サイズ調整が有効になります。サーバーは各レコードタイプのサイズに基づいて、ramBudgetBytes を4種類のバッファに均等に割り当てます。

メトリクス
メソッドパラメーター説明
metrics/listcategory?登録済みのすべてのメトリクス(名前、型、単位、カテゴリ)を一覧表示します
metrics/getname1つのメトリクスの現在値を取得します
metrics/historyname、seconds?1つのメトリクスの過去のサンプルを取得します(デフォルト:直近300秒)
metrics/list
{"jsonrpc":"2.0","method":"metrics/list","id":8,"params":{"category":"system"}}
{
  "jsonrpc":"2.0","id":8,
  "result":{"metrics":[
    {"name":"system.heap.free","type":"gauge","description":"Free heap","unit":"bytes","category":"system"},
    {"name":"system.uptime","type":"counter","description":"Uptime","unit":"s","category":"system"},
    {"name":"system.wifi.rssi","type":"gauge","description":"WiFi signal strength","unit":"dBm","category":"system"}
  ]}
}

メトリクスの型:counter(累積整数)、gauge(現在値)、histogram(最小値/最大値/平均値/件数のオブジェクト)。

metrics/get
{"jsonrpc":"2.0","method":"metrics/get","id":9,"params":{"name":"system.heap.free"}}
{
  "jsonrpc":"2.0","id":9,
  "result":{"name":"system.heap.free","type":"gauge","value":214032,"unit":"bytes","category":"system","timestamp":1234567890}
}

ヒストグラム型メトリクスの場合、value はオブジェクトです:{"mean":…,"min":…,"max":…,"count":…}。

metrics/history
{"jsonrpc":"2.0","method":"metrics/history","id":10,"params":{"name":"system.heap.free","seconds":60}}
{
  "jsonrpc":"2.0","id":10,
  "result":{"name":"system.heap.free","entries":[
    {"ts":1234567800,"val":214100},
    {"ts":1234567830,"val":214032}
  ]}
}
ログ
メソッドパラメーター説明
logs/queryname?、seconds?バイナリメトリクスログを照会します(デフォルト:直近3600秒)
logs/clear—LittleFS からすべてのログエントリーを削除します
{"jsonrpc":"2.0","method":"logs/query","id":11,"params":{"name":"system.heap.free","seconds":120}}
{
  "jsonrpc":"2.0","id":11,
  "result":{"name":"system.heap.free","count":4,"entries":[
    {"ts":1234567810,"val":214100},
    {"ts":1234567840,"val":214032}
  ]}
}
{"jsonrpc":"2.0","method":"logs/clear","id":12}
{"jsonrpc":"2.0","id":12,"result":{"ok":true}}
サブスクリプション
{"jsonrpc":"2.0","method":"resources/subscribe","id":13,"params":{"uri":"sensor://i2c/bme280_0x76"}}

サブスクライブすると、値が変わるたびにサーバーから未要求の notifications/resources/updated がプッシュされます。

{"jsonrpc":"2.0","method":"notifications/resources/updated","params":{"uri":"sensor://i2c/bme280_0x76"}}
TypeScript クライアントの例

型定義済みのクライアント全体については、examples/client/client.ts を参照してください。


I2C センサーリファレンス

センサーアドレスパラメーター単位
BME280 / BMP2800x76, 0x77temperature、pressure、humidity¹°C、Pa、%RH
MPU60500x68, 0x69accel_x/y/z、gyro_x/y/z、temperatureg、°/s、°C
ADS11150x48–0x4Bch0_V、ch1_V、ch2_V、ch3_VV(±4.096 範囲)
SHT310x44, 0x45temperature、humidity°C、%RH
BH17500x23, 0x5Clight_luxlux
INA2190x40–0x4Fbus_voltage_V、shunt_mV、current_mA、power_mWV、mV、mA、mW

¹ BMP280 では humidity を利用できません。


サポート対象の NMEA 0183 センテンス

センテンス説明デコードされるフィールド
GGAGPS 測位データ時刻、緯度、経度、測位品質、衛星数、HDOP、高度、ジオイド高
RMC推奨最小航法情報時刻、有効状態、緯度、経度、速度(kn および km/h)、針路、磁気偏差
VTG対地針路/対地速度針路(真方位および磁方位)、速度(kn および km/h)
GSV可視衛星衛星総数、各衛星の PRN、仰角、方位角、SNR
MWV風速および風向角角度、相対/真、速度、単位(K/M/N)
DBT変換器下の深度深度(フィート/メートル/ファゾム)
DPT水深深度(メートル)
HDG方位-偏差および磁気偏差方位、偏差、磁気偏差(E/W)
HDT真方位方位(真北基準)

解析機能:XOR チェックサム検証、DDMM.MMMM → 符号付き十進度、HHMMSS.SS 時刻、トーカ ID 抽出、空フィールドの適切な処理。


サポート対象の NMEA 2000 PGN

PGN名前主なフィールド
127250船首方位heading、variation
127257姿勢pitch、roll、yaw
128259対水速度speedKnots
128267水深depthMetres、offset
129025位置の高速更新latitude、longitude
129026対地針路および対地速度courseOverGround、speedOverGround
130306風データspeedKnots、angle、見かけ/真風フラグ
130310水温tempCelsius

サポート対象の OBD-II PID(サービス 01)

選択した PID をデコードします。全リストは src/CANParser.cpp にあります。

カテゴリPID
エンジンRPM、負荷、冷却水温、吸気温、MAP、MAF、点火時期
燃料燃圧、燃料補正(短期/長期)、レール圧、噴射時期、燃料流量
排出ガスO2 センサー電圧、EGR、蒸発ガスシステム、DPF 圧力
走行車速、スロットル位置、アクセルペダル位置
温度オイル温度、吸気温、EGR 温度、エンジン排気ガス温度(EGT)
電気系統制御モジュール電圧、バッテリー電圧
ハイブリッドハイブリッドバッテリー残存寿命
トルクドライバー要求トルク、実トルク、基準トルク
車両情報VIN、キャリブレーション ID(サービス 09)

検出

ネットワーク接続時に、サーバーは 2 つの mDNS サービスを登録し、UDP 機能ビーコンを定期的に送信します。

検出方法詳細
mDNS_mcp._tcp および _http._tcp。TXT レコードにはバージョン、機能、検出されたセンサーが含まれます
UDP ブロードキャスト30 秒ごと(設定可能)に 255.255.255.255:5354 へ JSON ビーコンを送信します。センサーマニフェストが含まれます

mDNS と UDP は、ネットワークへの参加、I2C スキャンの完了、MCP サーバーの準備完了、バス履歴設定の変更時に自動的に実行されます。


テスト

テストは Linux 上でネイティブにコンパイルして実行できます。ハードウェアは不要です。

# All tests
pio test -e native

# Specific suites
pio test -e native -f test_nmea_parser
pio test -e native -f test_can_parser
pio test -e native -f test_i2c_sensors
pio test -e native -f test_bus_reader
pio test -e native -f test_mcp_server
pio test -e native -f test_metrics_system

# With coverage (requires lcov)
pio test -e native --coverage
スイートテスト対象
test_nmea_parserGGA、RMC、VTG、GSV、MWV、DBT、DPT、HDG、HDT、チェックサム検証
test_can_parserOBD-II PID、NMEA 2000 PGN 127250/127257/128259/128267/129025/129026/130306/130310
test_i2c_sensorsモック I2C 経由の BME280、MPU6050、ADS1115、SHT31、BH1750、INA219
test_bus_reader時限読み取り、生データ/解析済みモード、タイムアウト処理
test_mcp_serverJSON-RPC ディスパッチ、リソース管理、メソッド登録
test_metrics_systemカウンター、ゲージ、ヒストグラム、LittleFS への永続化

カスタム MCP メソッドの拡張

実行時に JSON-RPC ハンドラーを追加登録します。

mcpServer.registerMethodHandler("myns/doSomething",
    [](uint8_t clientId, uint32_t reqId, const JsonObject& params) {
        StaticJsonDocument<256> doc;
        doc["result"]["ok"] = true;
        std::string out;
        serializeJson(doc, out);
        return out;
    });

// Remove when no longer needed
mcpServer.unregisterMethodHandler("myns/doSomething");

貢献

  1. リポジトリをフォークします
  2. 機能ブランチを作成します:git checkout -b feature/my-feature
  3. 新機能のテストを追加します(pio test -e native が成功する必要があります)
  4. プルリクエストを作成します

コーディングスタイルとガイドラインについては、CONTRIBUTING.md を参照してください。


ライセンス

MIT — LICENSE を参照してください。

コメント

MCP は初めてですか?

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

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