Self-Describing Firmware
Devices auto-declare their tools via JSON Schema. The client registers tools dynamically — zero hardcoded names.
Self-Describing Firmware
Devices auto-declare their tools via JSON Schema. The client registers tools dynamically — zero hardcoded names.
Universal Transport
Serial, WiFi (TCP), and Bluetooth — one library, one API, any Arduino Stream.
Minimalist Integration
Just add_pin(), add_tool(), begin(). No protocol complexity in your sketch.
Multi-Device Ready
Connect any number of MCUs to a single MCP client. Tools auto-namespaced per device.
┌─────────────────┐ ┌──────────────────────┐ ┌───────────────┐│ Claude / LLM │◄─MCP──►│ mcpu-client (npm) │◄─────►│ MCU Firmware ││ │ stdio │ Dynamic tool regist. │ Serial │ McpIot lib │└─────────────────┘ └──────────────────────┘ /TCP └───────────────┘list_tools — MCU responds with full tool + pin registry (JSON Schema)#include <McpIot.h>
McpDevice mcp("my-device", "1.0.0");
void setup() { mcp.add_pin(2, "led", MCP_DIGITAL_OUTPUT, "Onboard LED"); mcp.add_pin(34, "sensor", MCP_ADC_INPUT, "Analog Sensor"); mcp.begin(Serial, 115200);}
void loop() { mcp.loop(); }claude mcp add mcpu -e SERIAL_PORT=/dev/ttyACM0 -- npx mcpu-client{ "mcpServers": { "mcpu": { "command": "npx", "args": ["mcpu-client"], "env": { "SERIAL_PORT": "/dev/ttyACM0" } } }}Every device running MCP/U exposes these tools automatically:
| Tool | Description |
|---|---|
list_tools | Discovery: tools + pin registry |
get_info | Device name, version, platform |
gpio_write | Set digital output HIGH / LOW |
gpio_read | Read digital level |
pwm_write | PWM output (duty 0–255) |
adc_read | Read ADC value (0–4095) |
Firmware Guide →
Install the McpIot library and learn the full API. Get started
Client Guide →
Set up the TypeScript MCP client and connect to Claude. Get started