pymcuprog-mcp
Enables AI tools to program Microchip AVR microcontrollers via natural language by wrapping pymcuprog, supporting USB HID debuggers and serial UART UPDI adapters.
README
pymcuprog-mcp
MCP server wrapping pymcuprog so AI tools (Claude Code, Claude Desktop, etc.) can program Microchip AVR microcontrollers via natural language.
Supports USB HID debuggers (nEDBG, PICkit 4, Atmel-ICE, MPLAB Snap, …) and serial UART UPDI adapters.
Installation
No installation needed if you use uvx — it runs the server directly from PyPI on demand (see .mcp.json examples below).
To install as a persistent tool:
uv tool install pymcuprog-mcp
Or with pip:
pip install pymcuprog-mcp
From source:
git clone https://github.com/lucasgerads/pymcuprog-mcp
cd pymcuprog-mcp
pip install -e .
Configuration
The server is configured via environment variables. The two most important ones are PYMCUPROG_DEVICE (target MCU name, e.g. atmega4808) and PYMCUPROG_TOOL (debugger type, e.g. nedbg).
| Variable | Description | Default |
|---|---|---|
PYMCUPROG_DEVICE |
Target device name (e.g. atmega4808, attiny416) |
— |
PYMCUPROG_TOOL |
Debugger type (nedbg, pickit4, atmelice, snap, …) |
any connected |
PYMCUPROG_SERIALNUMBER |
USB serial number substring (to pick a specific tool) | — |
PYMCUPROG_SERIALPORT |
Serial port for UART UPDI mode (e.g. /dev/ttyUSB0, COM3) |
— |
PYMCUPROG_BAUDRATE |
Baud rate for serial UPDI mode | 115200 |
PYMCUPROG_PROJECT_DIR |
Default project directory for the build_and_flash tool |
— |
Setting PYMCUPROG_SERIALPORT switches the server into serial UPDI mode (uses a plain USB-serial adapter instead of a Microchip debugger).
.mcp.json examples
All examples use uvx, which downloads and runs the server directly from PyPI with no prior installation step.
USB HID debugger (nEDBG / Curiosity Nano)
{
"mcpServers": {
"pymcuprog": {
"command": "uvx",
"args": ["pymcuprog-mcp"],
"env": {
"PYMCUPROG_DEVICE": "atmega4808",
"PYMCUPROG_TOOL": "nedbg"
}
}
}
}
PICkit 4 or MPLAB Snap
{
"mcpServers": {
"pymcuprog": {
"command": "uvx",
"args": ["pymcuprog-mcp"],
"env": {
"PYMCUPROG_DEVICE": "attiny416",
"PYMCUPROG_TOOL": "pickit4"
}
}
}
}
Serial UART UPDI (cheap USB-serial adapter)
{
"mcpServers": {
"pymcuprog": {
"command": "uvx",
"args": ["pymcuprog-mcp"],
"env": {
"PYMCUPROG_DEVICE": "avr128da48",
"PYMCUPROG_SERIALPORT": "/dev/ttyUSB0",
"PYMCUPROG_BAUDRATE": "115200"
}
}
}
}
Multiple tools on the same machine (select by serial number)
{
"mcpServers": {
"pymcuprog-board-a": {
"command": "uvx",
"args": ["pymcuprog-mcp"],
"env": {
"PYMCUPROG_DEVICE": "atmega4808",
"PYMCUPROG_TOOL": "nedbg",
"PYMCUPROG_SERIALNUMBER": "MCHP0001"
}
},
"pymcuprog-board-b": {
"command": "uvx",
"args": ["pymcuprog-mcp"],
"env": {
"PYMCUPROG_DEVICE": "atmega4808",
"PYMCUPROG_TOOL": "nedbg",
"PYMCUPROG_SERIALNUMBER": "MCHP0002"
}
}
}
}
Claude Code (via CLI)
claude mcp add pymcuprog -e PYMCUPROG_DEVICE=atmega4808 -e PYMCUPROG_TOOL=nedbg -- uvx pymcuprog-mcp
Available tools
| Tool | Description |
|---|---|
list_supported_devices |
All device names pymcuprog knows (no hardware needed) |
list_connected_tools |
USB HID debuggers currently attached |
ping |
Read device ID bytes to verify connectivity |
erase |
Chip erase or erase a specific memory area |
flash |
Erase + write + verify + release in one call (recommended) |
build_and_flash |
Run make in a project directory, then flash the resulting .hex |
write_hex |
Program a .hex file with manual control over erase/verify steps |
verify_hex |
Compare target memory to a .hex file |
read_memory |
Read raw bytes from flash, EEPROM, fuses, etc. |
write_memory |
Write raw hex bytes to fuses, EEPROM, user_row, etc. |
hold_in_reset |
Hold target in reset |
release_from_reset |
Release target from reset |
disconnect |
Close the persistent debugger session |
read_target_voltage |
Measure target VCC |
read_supply_voltage |
Read debugger supply setpoint |
set_supply_voltage |
Set debugger supply voltage output |
read_tool_info |
Read debugger firmware/hardware info |
Typical workflow: ping → flash or ping → build_and_flash
All programming tools accept optional device, tool, serialport, etc. parameters to override the environment variables on a per-call basis.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.