panda-mcp
Provides tools for connecting to and controlling a comma.ai Panda device to reverse-engineer car CAN bus data, including capturing, analyzing, transmitting frames, and cracking CRCs.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@panda-mcpRecord bus, flip blinker, then diff the captures."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
๐ผ panda-mcp
Reverse-engineer your car's CAN bus by talking to Claude.
An MCP server that turns a comma.ai Panda into a conversational CAN reverse-engineering rig โ record โ diff โ find the signal โ confirm โ send it back โ without writing a line of glue code.
Why this exists
Finding the one CAN frame that controls your blinker โ or your steering angle, or your door locks โ is a slow, fiddly loop: log traffic, do the thing, log again, diff bytes by hand, guess the CRC, replay it, repeat. Every step lives in a different script.
panda-mcp collapses that loop into a conversation. You tell Claude "record the bus, I'll flip the blinker, now find what changed" and it drives the Panda, runs comma.ai's own diff heuristics, cracks the CRC, and replays the candidate frame โ all through 26 typed MCP tools.
And because it ships with a full mock CAN bus, you can learn the entire workflow on your laptop on the train home, with no Panda and no car.
You: Connect in mock mode, record a baseline, then record again โ I'll toggle the blinker.
Claude: [device_connect โ capture_start โ capture_stop ร2]
You: Which bits only showed up while blinking?
Claude: [analyze_diff_new_bits] โ 0xE1, byte 0 bit 0 flipped 0โ1. That's your blinker.
You: Prove it. Send it back.
Claude: [device_set_safety_mode('alloutput') โ send_frame 0xE1 ...] โ sent 20ร. ๐๐กRelated MCP server: ClaudeX
โจ Features
๐๏ธ Background capture โ non-blocking recording with bus / arbitration-ID / duration / frame-count filters
๐ Two diff engines, straight from comma.ai โ
can_bit_transition(clean 0โ1/1โ0 flips across a split) andcan_unique(bits that appear only against a baseline)๐ฏ Signal hunting โ pin a known number (speed, RPM, steering angle) to an exact ID + byte offset + endianness
๐ธ Snapshots โ freeze the bus state before/after an action and XOR-diff it
๐ค Transmit & fuzz โ single frame, bulk, single-byte sweep, or full timed replay of a recording
๐งฎ CRC toolkit โ a catalogue of real automotive CRCs (J1850, AUTOSAR, CCITTโฆ), brute-force identification with per-message magic-init sweep, and automatic CRC-field detection across a whole capture
๐งช Mock mode โ a deterministic synthetic bus that exercises every tool, so dev & tests need zero hardware
๐ Safe by default โ listen-only until you explicitly unlock transmission
๐พ Interop โ export to candump
.logfor Cabana / SavvyCAN / can-utils
๐ Table of contents
๐ Quickstart
git clone https://github.com/<you>/panda-mcp.git
cd panda-mcp
py -m venv .venv
.venv/Scripts/python -m pip install -e . # mock mode only
.venv/Scripts/python -m pip install -e ".[panda]" # + real hardware (pandacan)Register the server with Claude Code by pointing it at the bundled claude.json:
{
"mcpServers": {
"panda": {
"command": ".venv/Scripts/python.exe",
"args": ["-m", "panda_mcp.server"],
"env": { "PYTHONPATH": "src" }
}
}
}Then just ask Claude to device_connect(mock=true) and start exploring.
๐งช Mock mode
No Panda? No car? No problem. device_connect(mock=true) spins up a deterministic synthetic CAN stream designed to make every analysis tool light up:
Arb ID | Rate | Payload | Demonstrates |
| 20 Hz | rolling counter nibble + J1850 CRC8 over bytes 0โ6 |
|
| 10 Hz | static | baseline noise for diffs |
| 50 Hz | int16 "steering angle" sweeping via |
|
| 1 Hz | one toggle bit driven by a virtual "blinker" |
|
Everything you learn in mock mode maps 1:1 onto real hardware โ only the mock=true flag changes.
๐ How it works
โโโโโโโโโโโโโโโโ MCP tools โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Claude โ โโโโโโโโโโโโโโบ โ panda_mcp.server โ
โ (you, chat) โ โโโโโโโโโโโโโโ โ FastMCP ยท 26 tools โ
โโโโโโโโโโโโโโโโ results โโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโ
โผ โผ โผ โผ
โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ
โ device.py โ โ session.py โ โ analysis.py โ โ crc.py โ
โ Panda + โ โ bg-threaded โ โ bit-state โ โ automotive โ
โ MockPanda โ โ capture storeโ โ diff engines โ โ CRC engine โ
โโโโโโโฌโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโ
โ USB
โผ
โโโโโโโโโโโโโโ
โ Panda Red โ STM32H725 ยท CAN/CAN-FD
โ ๐ car โ
โโโโโโโโโโโโโโModule | Responsibility |
| FastMCP entry point โ all 26 tools, argument parsing, safety gating |
| Panda abstraction + |
| Background-threaded capture store and snapshots (all in-memory) |
| Bit-state tracking, the two diff engines, |
| CRC catalogue, brute-force identification, CRC-field detection |
| The |
๐ Tool reference
๐งญ Workflows
Hunt down a control frame (the blinker)
device_connect(mock=true)
capture_start() โ cap-aaaa # baseline: do nothing
capture_stop(cap-aaaa)
capture_start() โ cap-bbbb # now toggle the blinker
capture_stop(cap-bbbb)
analyze_diff_new_bits(cap-bbbb, [cap-aaaa]) # bits unique to "blinking"
# โฆor, if you toggled mid-capture:
analyze_diff_transition(cap-bbbb, split_ts=5.0)
device_set_safety_mode('alloutput')
send_frame(arb_id='0xE1', data='01000000000000', bus=0, count=20, interval_ms=50)Pin a numeric signal (speed / RPM / steering)
analyze_find_value(cap-xxxx, value=2000, bit_length=16)
# โ 0x3C0, byte_offset 0, little-endian, 14 matchesCrack a CRC
crc_detect_field(cap-xxxx, arb_id='0x1A0')
# โ crc_index 7, confirmed: crc8_sae_j1850 (init 0xFF) across 30 frames โ
crc_brute_force(frame='10123456780000CC') # single-frame identification
crc_compute(data='10123456780000', algorithm='crc8_sae_j1850')โก Sending frames vs. flashing firmware
You do not need custom firmware to send frames. Transmission is unlocked in software via the safety mode:
device_set_safety_mode('alloutput')device_flash / device_recover exist only for firmware updates, custom on-device safety logic, or un-bricking:
device_flash()โ build & flash the stock firmware (the Panda's ownflash())device_flash('/path/fw.bin')โ flash a custom binarydevice_recover()โ DFU recovery for an unresponsive device
The Panda Red is an STM32H725; flashing runs over USB DFU (VID 0x0483, PID 0xdf11). The device reboots afterward โ call device_connect again.
๐ Safety
Injecting frames onto amoving vehicle's powertrain bus can disable brakes, steering, or throttle. People can get hurt.
The server boots listen-only (
silent). Transmission requires an explicitdevice_set_safety_mode('alloutput')โ there is no way to send by accident.Only unlock output on a bench harness or a vehicle you own and have immobilized.
This project is for education, research, and tinkering on hardware you control. You are responsible for how you use it.
๐งฐ Development
.venv/Scripts/python -m pytest -q # 7 hardware-free end-to-end testsThe whole test suite runs against MockPanda โ capture, both diff engines, find_value, CRC detection, the safety gate, and replay โ so CI never needs a device.
src/panda_mcp/
server.py FastMCP entry point ยท all 26 tools
device.py Panda abstraction + MockPanda synthetic stream
session.py background-threaded capture store + snapshots
analysis.py bit-state diffing + find_value + per-ID stats
crc.py automotive CRC catalogue + brute force + field detection
model.py CanFrame
tests/
test_smoke.py hardware-free end-to-end tests๐บ Roadmap
DBC decoding via
cantoolsโ decode/encode against a.dbcPersistence โ auto-save captures to disk, reload
.candump/CSV as sessionsCAN-FD โ widen bit arrays to 64-byte payloads
Multi-message CRC counters โ auto-derive counter + checksum pairs
SavvyCAN/Cabana import alongside the existing export
Contributions welcome โ open an issue or PR. If you add a tool, add a mock signal that exercises it so the test suite stays hardware-free.
๐ Credits & license
The two diff engines are faithful ports of comma.ai's own examples โ can_bit_transition.py and can_unique.py. Hardware access is via the pandacan library. Huge thanks to comma.ai for open-sourcing the Panda.
Released under the MIT License โ same as panda.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lkathke/Comma-Panda-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server