bagel is a Claude Code plugin with 4 hand-picked skills, indexed on Flowy in the Debugging category.
> /plugin marketplace add Extelligence-ai/bagel> /plugin install bagel@bagel

Bagel by Extelligence lets you ask questions about robotics, drone, and IoT data in plain English. Every calculation over your message data is DuckDB SQL, not model guesswork, and Bagel shows you the query so you can audit it.
Is my IMU sensor overheating?
Bagel also has an intelligent edge data reduction pipeline: describe an event and Bagel runs the detection on the robot, keeping the windows that matter and dropping the rest. An MCP server puts all of it in your LLM's hands: Claude Code, Gemini, Cursor, or a fully local model.
Bagel was the first MCP server to ship a real analysis toolkit for robotics data, and it keeps the LLM where it belongs: in front of your logs, never in your robot's control loop.
Bagel is on PyPI as bagel-mcp. No Docker
and no ROS install needed for recorded data.
Claude Code, one line (needs uv):
claude mcp add bagel -- uvx --from "bagel-mcp[ros]" bagel-mcp --transport stdio
pip, into any Python 3.10 to 3.12 environment:
pip install "bagel-mcp[ros]"
Then point your MCP client at the bagel-mcp command it installed (setup for
Claude Desktop, Cursor and Codex is in the Quickstart).
Open your agent and ask:
Summarize the bag "~/logs/run_42.mcap".
The ros extra reads ROS 1 and ROS 2 bags. Flight logs, CAN / MDF4, live MQTT
and the rest are extras too. Live ROS
robots (rosbridge) and fleet/edge pipelines run in Docker.
pip / uvx for recorded data, Docker images for live robots and the edge.No MCP client, no LLM, no config: run the same deterministic checks against a bundled sample log and get a robot-health report card straight to your terminal.
docker run -it --rm ghcr.io/extelligence-ai/bagel/px4:latest demo
sample.ulg - 41.5s, 2018 messages, 77 topics
Power ⚠️ min 21.07V, largest drop 2.37V at ~t=+4.8s, end 23.45V (battery_status_0)
IMU ✅ accel_z stddev 1.6x the log baseline at ~t=+36.8s (sensor_combined_0)
GPS — skipped: no GPS topic
Data gaps ✅ no gap > 1.05x median interval (checked battery_status_0, sensor_combined_0)
...
The ROS2 images (ros2-kilted, ros2-jazzy, ros2-iron, ros2-humble) run
demo the same way, against a lighter bundled sample (px4 is the one that
ships with a flight log rich enough to show every check). Point it at your
own log with demo /path/to/log (mount it with -v first), or keep reading
for the full MCP setup below.
Two ways to run Bagel. Pick by data:
| You have | Run Bagel with |
|---|---|
Recorded data: ROS 1 .bag and ROS 2 .db3 / .mcap bags, flight logs (PX4, ArduPilot, Betaflight), CAN / MDF4, CSV / JSON / Parquet, ROS text logs; live MQTT robots | uvx or pip, below: no Docker, no ROS install |
| Live ROS robots (rosbridge), fleet and edge deployments | Docker, further down: the images carry the ROS stacks and the standing-pipeline runtime |
Your MCP client launches the server itself over stdio, so there is nothing to
start or keep running. Pick uvx (nothing to manage: it fetches and caches
Bagel on first use) or pip (a normal install you control).
With uvx. Install uv
(curl -LsSf https://astral.sh/uv/install.sh | sh on macOS and Linux), then:
Claude Code:
claude mcp add bagel -- uvx --from "bagel-mcp[ros]" bagel-mcp --transport stdio
Any client that takes a JSON MCP config (Claude Desktop, Cursor, Codex, ...):
{
"mcpServers": {
"bagel": {
"command": "uvx",
"args": ["--from", "bagel-mcp[ros]", "bagel-mcp", "--transport", "stdio"]
}
}
}
With pip. Python 3.10 to 3.12; a virtual environment keeps it tidy:
python3 -m venv ~/.bagel-venv
~/.bagel-venv/bin/pip install "bagel-mcp[ros]"
claude mcp add bagel -- ~/.bagel-venv/bin/bagel-mcp --transport stdio
For a JSON config, use the full path as the command:
"command": "/Users/you/.bagel-venv/bin/bagel-mcp", "args": ["--transport", "stdio"].
Apple Silicon Macs: use an ARM Python, not an Intel Python running through
Rosetta. Check with python3 -c "import platform; print(platform.machine())";
it should print arm64. If it prints x86_64, create a separate native environment:
uv venv --seed --python cpython-3.12-macos-aarch64-none ~/.bagel-arm-venv
~/.bagel-arm-venv/bin/python -m pip install "bagel-mcp[ros]"
claude mcp add bagel -- ~/.bagel-arm-venv/bin/bagel-mcp --transport stdio
This avoids the cryptography source build: upstream removed Intel macOS
support in version 49.
Fresh installs currently select MCP 1.30.0, whose dependency chain is
bagel-mcp → mcp → pyjwt[crypto] → cryptography. This applies to the
base package and bagel-mcp[ros], even without the upload extra.
On an Intel Mac, if installation fails while building cryptography, use the
Docker path below. Do not downgrade cryptography to restore an old wheel;
its older releases miss security fixes.
Format support comes as extras, so that a PX4 user never downloads the
automotive parsers. List the ones you need, comma-separated:
uvx --from "bagel-mcp[ros,px4,automotive]" bagel-mcp --transport stdio, or
pip install "bagel-mcp[ros,px4,automotive]". If you ask about a format whose
extra is missing, Bagel's error names the exact command to add it.
| Extra | Adds |
|---|---|
ros | ROS 1 .bag and ROS 2 .db3 bags (reading, and the reduce / snippet writers), in pure Python |
px4 | PX4 .ulg |
ardupilot | ArduPilot .bin |
betaflight | Betaflight .bbl / .bfl |
automotive | CAN captures (.blf, .asc + DBC) and ASAM MDF4 |
iot | Live MQTT (incl. Sparkplug B) and InfluxDB sources |
viz | Rerun export |
upload | GCS and Azure Blob upload tasks |
cloudini | Cloudini point-cloud tasks |
MCAP, CSV / JSON / Parquet, ROS text logs, PlotJuggler / Lichtblick / LeRobot exports and S3 upload need no extra.
PX4 log parsing does not require Git. Git and network access are used only for
optional field descriptions; pass download_description: false in the tool's
args to skip fetching those descriptions.
To upgrade, repeat the extras you installed with, so their dependencies
update too. uvx picks up new releases on its own (force it with
uvx --refresh --from "bagel-mcp[ros,px4]" bagel-mcp --help); with pip, run
pip install -U "bagel-mcp[ros,px4]", using your own list of extras.
Then prompt, pointing at your own file:
Summarize the metadata of the MCAP bag "~/logs/run_42.mcap".
[!NOTE] No ROS installation is needed for bag files: the
rosextra reads and writes them with the pure-Python rosbags library (sqlite3 and MCAP storage, zstd / bz2 / lz4 compression, message types from the bag itself or from the bundled interface definitions of every distro from Humble on). Live ROS topics (rosbridge) and the fleet/edge runtime stay with Docker.
[!TIP] Already have Claude Code? Just paste the link to this repo and tell Claude what environment you want:
Set up https://github.com/Extelligence-ai/bagel for ROS2 Kilted.
Claude will clone the repo, start Docker, and wire up the MCP connection for you.
Install Docker Desktop and Claude Code (or another MCP-enabled LLM).
[!NOTE] arm64 hosts (Apple Silicon, Raspberry Pi, Jetson, Graviton):
ros2-kilted— the default service, and the oneserver.jsonpins — ships as a multi-arch image, so Docker pulls a native arm64 build. No extra setup.The other services are published for amd64 only. Docker Desktop emulates them automatically, so they run on Apple Silicon (slower, but they work). On arm64 Linux with plain Docker Engine there is no emulation by default and they fail immediately with
exec format error— install QEMU/binfmt first:docker run --privileged --rm tonistiigi/binfmt --install amd64
git clone https://github.com/Extelligence-ai/bagel.git && cd bagel
docker compose run --service-ports ros2-kilted
[!TIP] Port 8000 already in use? Set
MCP_SERVER_PORTto something else, for exampleMCP_SERVER_PORT=8100 docker compose run --service-ports ros2-kilted, and use that port in step 2.
Pick the service that matches your environment:
| Service | Use case |
|---|---|
ros2-kilted | ROS2 Kilted (latest) |
ros2-jazzy | ROS2 Jazzy |
ros2-jazzy-jev | ROS2 Jazzy + on-robot decision model (GPU, beta) |
ros2-iron | ROS2 Iron |
ros2-humble | ROS2 Humble |
ros1-noetic | ROS1 Noetic |
ros1-noetic-cv | ROS1 Noetic + CV |
px4 | PX4 flight logs |
ardupilot | ArduPilot flight logs |
bagel is a Claude Code plugin with 4 hand-picked skills, indexed on Flowy in the Debugging category. Install it with the command on its page. It includes authoring-pipelines, exporting-visualizations, operating-live-sinks. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it