Token导航 LogoToken导航TokenDH.com
Esp32 MCP Server logo
开发工具stdio官方级别未说明来源级核验

Esp32 MCP Server

MCP Server

Allow AI models connect to ESP32 exposed interfaces. AI generated MCP server for ESP32.

工具数

0

提示词数

0

GitHub Stars

42

资源数

0
物联网WebSocketC++

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

作者 / 组织

navado

提供方

navado

最后核验

2026/5/18 02:15

快速接入

先看主来源和安装命令,再打开仓库或文档;下面只保留这个条目的关键接入事实。

命令预览

pip install platformio

详细介绍

ESP32 MCP服务器

![Build & Test](https://github.com/navado/ESP32MCPServer/actions/workflows/build.yml)

A. 模型上下文协议 (MCP)服务器在ESP32上运行(Nordic nRF52840在仅传感器模式下运行),通过WebSocket/JSON-RPC 2.0将真实世界的传感器数据和总线协议暴露给AI助手和自动化工具。

将AI代理直接连接到您的硬件:查询I2C传感器,解析NMEA 0183 GPS/海洋数据,解码NMEA 2000和OBD-II CAN帧,重放总线历史记录——所有这些都是通过标准MCP接口完成的。

architecture

______________________________________________________________________

特性

能力详细信息
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服务01/09 PID解码(60+PID)
巴士历史CAN、NMEA、NMEA 2000、OBD-II的持久环形缓冲区——可通过MCP查询
公交车阅读器有时间限制的串行和CAN读取,原始或解析模式,JSON输出
无线网络AP设置UI+STA模式;存储在NVS中的凭据
发现mDNS(_mcp._tcp)+UDP功能广播
指标堆、正常运行时间、RSSI、带引导持久性的直方图统计数据
多板ESP32-S3、ESP32-C3、ESP32、阿达果HUZZAH32、M5Stack、北欧nRF52840 DK、阿达果羽毛nRF5284O
测试本地单元测试(Unity),模拟I2C/CAN/串行/LittleFS

______________________________________________________________________

支持的板

ESP32板——全MCP服务器(WiFi+WebSocket+CAN)

平台IO环境MCU闪存RAMWiFiBLECANRGB LED
ESP32-S3-DevKitC-1esp32-s3-devkitc-1Xtensa LX7×2@240 MHz8 MB512 KB+8 MB PSRAM5.0GPIO48
ESP32 DevKitC V4esp32-devkitcXtensa LX6×2@240 MHz4 MB520 KB4.2
ESP32-C3-DevKitM-1esp32-c3-devkitm-1RISC-V@160 MHz4 MB400 KB5.0GPIO8
Adafruit HUZZAH32adafruit-huzzah32Xtensa LX6×2@240 MHz4 MB520 KB4.2
M5Stack核心ESP32m5stack-coreXtensa LX6×2@240 MHz16 MB520 KB4.2

nRF52840板——仅传感器(I2C+串行,无WiFi)

平台IO环境MCU闪存RAMBLE
北欧nRF52840 DKnrf52840-dkCortex-M4F@64 MHz1 MB256 KB5.0+802.15.4
阿达果羽毛nRF52840nrf52840-featherCortex-M4F@64 MHz1 MB256 KB5.0
nRF52840目标运行单独的 main_nrf.cpp 入口点:仅传感器+I2C+串行输出。没有WiFi,没有MCP WebSocket,没有LittleFS,没有总线历史记录。对于WiFi上的全MCP,通过连接到UART1的AT命令模式下的ESP32-C3桥接。

电路板特征矩阵

功能ESP32-S3ESP32 V4ESP32-C3HUZZAH32M5堆栈nRF52840 DKnRF52440羽毛
WiFi
BLE
CAN/TWAI
I2C
通用异步收发器(ext)
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/RX3月1日RX

物料清单

#部分目的
1ESP32-S3-DevKitC-1主MCU
1BME280分接温度/湿度/压力
1MPU6050分接头6轴IMU(可选)
1TJA1050或SN65HVD230CAN总线收发器(可选)
1GPS模块(3.3V 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传感器接线

所有传感器共享一条总线。将SDA和SCL的4.7 kΩ上拉电压添加到3V3。

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以500kbps的速度运行。在您的设备中设置波特率 CANBusReader 相应地配置。

______________________________________________________________________

软件先决条件

pip install platformio

______________________________________________________________________

构建和Flash

# 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. 板上的电源。它广播WiFi AP: ESP32_XXXXXX (MAC地址的最后6位十六进制数字)。
  2. 连接到该AP并打开 http://192.168.4.1.
  3. 输入您的WiFi凭据,然后单击“保存”。
  4. 该板加入您的网络,并在串行控制台上打印其IP地址。
  5. 将MCP客户端连接到 ws://:9000.

______________________________________________________________________

Web仪表板

基于浏览器的仪表板由flash提供 http:///app.

选项卡它的作用
传感器扫描I²C总线,显示检测到的设备,读取值,自动刷新
指标列出所有指标、实时值、火花线历史图
日志查询并清除度量日志条目
MCP控制台带有预设请求和实时消息日志的交互式JSON-RPC控制台

______________________________________________________________________

HTTP端点(端口80)

方法路径描述
得到/WiFi设置页面
职位/save保存WiFi凭据(ssid, password 表单参数)
得到/status网络状态JSON
WS/ws实时网络状态WebSocket
得到/app浏览器仪表板
得到/bus-history读取总线历史配置JSON
职位/bus-history更新总线历史配置JSON

______________________________________________________________________

MCP API参考(WebSocket端口9000)

所有方法使用 JSON-RPC 2.0 通过WebSocket。

协议

方法参数描述
initialize--服务器信息、协议版本、功能
resources/list--列出已注册的MCP资源
resources/readuri按URI读取资源
resources/subscribeuri订阅以推送资源的更新
resources/unsubscribeuri取消订阅

传感器

方法参数描述
sensors/i2c/scan——扫描I²C总线;自动检测和初始化驱动程序
sensors/readsensorId?读取一个传感器的所有通道(省略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}
  ]}
}

巴士历史

总线历史记录在循环RAM缓冲区中累积CAN帧、NMEA线路、解码的NMEA 2000消息和OBD-II记录。缓冲区的大小由可配置的RAM预算决定,其配置将持久化到LittleFS。

方法参数描述
bus/history/readtype, limit?从历史缓冲区读取累积消息
bus/history/config/get--读取当前缓冲区大小配置
bus/history/config/setconfig字段调整缓冲区大小并保持配置

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 根据每种记录类型的大小,在四种缓冲区类型之间相等。

指标

方法参数描述
metrics/listcategory?列出所有已注册的指标(名称、类型、单位、类别)
metrics/getname一个指标的当前值
metrics/historyname, seconds?一个指标的历史样本(默认值:过去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
微处理器60500x68、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,相对湿度%
BH17500x23,0x5Clight_lux勒克斯
中国2190x40-0x4Fbus_voltage_V, shunt_mV, current_mA, power_mWV、mV、mA、mW

¹ humidity BMP280上没有。

______________________________________________________________________

NMEA 0183支持的句子

句子描述字段已解码
GGAGPS定位数据时间、纬度、经度、定位质量、卫星、HDOP、高度、大地水准面分离
RMC推荐最小导航时间、活动、纬度、经度、速度(kn和km/h)、航向、磁变化
VTG轨道修复/地面速度航向(真实和磁性),速度(kn和km/h)
GSV视野中的卫星每颗卫星的PRN、仰角、方位角、信噪比
最大工作电压风速和角度角度,相对/真实,速度,单位(K/M/N)
数据库传感器下方深度深度(英尺/米/英寻)
DPT水深深度(米)
HDG航向-偏差和变化航向、偏差、变化(E/W)
高清电视航向–真航向(正北)

解析功能: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
129026COG&SOGcourseOverGround, speedOverGround
130306风力数据speedKnots, angle,明显/真实标志
130310水温tempCelsius

______________________________________________________________________

支持OBD-II PID(服务01)

已解码的选定PID;完整列表在 src/CANParser.cpp:

类别PID
发动机RPM、负载、冷却液温度、进气温度、MAP、MAF、正时提前
燃料燃油压力、微调(短/长)、油轨压力、喷射正时、燃油率
排放氧传感器电压、EGR、蒸发系统、DPF压力
运动车速、油门位置、油门踏板位置
温度机油温度、进气温度、EGR温度、发动机排气温度(EGT)
电的控制模块电压、蓄电池电压
混合混合动力电池剩余寿命
扭矩驾驶员需求、实际扭矩、参考扭矩
车辆信息VIN、校准ID(维修09)

______________________________________________________________________

发现

在网络连接上,服务器注册了两个mDNS服务,并定期发送UDP能力信标:

发现详细信息
多播DNS_mcp._tcp_http._tcp 具有TXT记录:版本、功能、检测到的传感器
UDP广播JSON信标 255.255.255.255:5354 每30秒(可配置);包括传感器清单

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/122757/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 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. 打开拉取请求

贡献.md 关于编码风格和指导原则。

______________________________________________________________________

许可证

麻省理工学院——见 许可证.

目录标签

目录标签

物联网WebSocketC++developer-toolsesp32mcpai-integration本地部署传感器数据AI接口自动化工具嵌入式系统

接入字段

传输方式(transport,传输协议)

stdio

鉴权方式(authType,认证方式)

none

工具数量(toolCount,工具数)

0

资源数量(resourceCount,资源数)

0

提示词数量(promptCount,提示词数)

0

权限和风险

stdionone部署方式未说明

接入前请确认传输方式、认证方式和部署位置,并根据实际工具能力限制访问范围。

安装前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

来源信息

继续浏览同类 MCP