
Bagel
io.github.Extelligence-ai由 GitHub 帳號 Extelligence-ai 發布v2.4.1更新於 Oct 27, 2026
Plain-English analysis of robotics, drone, and IoT data, with intelligent edge data reduction.
概覽
Bagel 讓助理用自然語言分析機器人、無人機與物聯網日誌,底層執行可稽核的 DuckDB SQL,並可建立事件視窗資料精簡流程。
- 可以做什麼
- 彙總與檢視錄製資料:ROS 1/2 bag、MCAP、PX4、ArduPilot、Betaflight、CAN/MDF4、CSV/JSON/Parquet 及 ROS 文字日誌
- 以確定性的 DuckDB SQL 查詢主題資料:峰值、移動平均、百分位、跨主題相關性,並顯示查詢語句供稽核
- 把一句話變成資料精簡流程:保留事件前後的視窗、捨棄其餘資料,先預覽再寫入,可單次執行、批次執行或部署到邊緣
- 將事件視窗匯出到 Rerun、MCAP 版面、PlotJuggler、LeRobot 等檢視器與格式,並上傳到 S3、GCS 或 Azure
- 儲存並重複使用能力腳本,也可讀取即時 MQTT、PostgreSQL/TimescaleDB 或 InfluxDB 資料來源
- 適用情境
- 適合手上有機器人、無人機或物聯網錄製資料,希望不必寫解析腳本、也不必為每種格式學一套檢視器就能提問的情況。也適合需要先把龐大錄製資料裁剪成關鍵視窗再搬離機器人的團隊。
- 執行需求
- 以 stdio 方式在本機執行,從 PyPI 安裝 bagel-mcp,可用 uvx 或 pip,需 Python 3.10 至 3.12;格式支援以 extras 形式安裝,例如 ros、px4、ardupilot、betaflight、automotive、iot、viz、upload、cloudini。即時 ROS 機器人、車隊與邊緣部署改用 Docker 映像,於本機 8000 埠提供 SSE 端點(可用 MCP_SERVER_PORT 變更)。未宣告任何驗證機制。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Bagel,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
Bits to atoms.
Atoms to bits.
If you still have a script called parse_bag_final_v7.py, we need to talk.
[圖片] [圖片] [圖片] [圖片] [圖片] [圖片]
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.
📦 Install
Bagel is on PyPI as bagel-mcp. No Docker
and no ROS install needed for recorded data.
Claude Code, one line (needs uv):
pip, into any Python 3.10 to 3.12 environment:
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.
🥯 Key Features
- Ask in plain language: No deep domain expertise needed.
- Transparent calculations: Deterministic SQL queries. No black-box LLM math.
- Natural-language pipelines: "Keep 10s around every hard brake, drop the rest": one sentence becomes an auditable pipeline: previewed before a byte is written, then run once, across a fleet, or standing at the edge.
- Broad LLM support: Claude Code, Gemini, Cursor, Codex, and more.
- Installs your way:
pip/uvxfor recorded data, Docker images for live robots and the edge. - Extensible capabilities: Bagel can learn new tricks.
- Wide format coverage: Missing your data format? Open a ticket.
🥯 Try it in 60 seconds
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.
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.
⚡️ Quickstart
Two ways to run Bagel. Pick by data:
🐍 Install with uvx or pip (no Docker)
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:
Any client that takes a JSON MCP config (Claude Desktop, Cursor, Codex, ...):
With pip. Python 3.10 to 3.12; a virtual environment keeps it tidy:
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:
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.
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.
🐳 Run with Docker (live robots, fleet and edge, distro-specific ROS)
[!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.
📋 Prerequisites
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:
1. Clone and start Bagel
[!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:
The -jev image (beta) adds PyTorch for running a decision model on the robot
(backend: local in the anomaly gate). Build any
other service the same way with --build-arg JEV_MODE=true. CPU-only robots don't need
it: the hosted Jev backend works in every image.
[!TIP] To give Bagel access to your local files, edit
compose.yamlbefore starting Docker: uncomment and update thevolumessection under your chosen service.
Wait for this output:
2. Connect Claude Code
In a new terminal:
[!NOTE] The MCP endpoint is bound to
localhostonly (not exposed to the LAN) for security. To share it with other machines, drop the127.0.0.1prefix incompose.yamland put an authenticated proxy in front: see SECURITY.md.
3. Prompt
Summarize the metadata of the ROS2 bag "./data/sample/ros2/mcap".
That’s it: you’re chatting with your data.
🔒 Prefer fully offline?
Swap step 2 for a local model: your data and your LLM stay on the machine:
Model picks, expectations, and troubleshooting: Local LLMs guide.
📚 Using a different LLM?
Bagel works with any MCP-enabled LLM. Setup runbooks for tested alternatives:
- Claude Code (detailed guide)
- Gemini CLI
- Codex
- Cursor
- Copilot
Can’t find your LLM? Open a ticket.
🔌 Agent plugins (Claude Code and Codex)
Bagel ships an agent plugin: four skills that teach the agent when and how
to drive the server (log triage, pipeline authoring, live sinks, visualization
export) plus the MCP connection, wired automatically. The same plugin/
directory serves both Claude Code and OpenAI Codex.
Codex and ChatGPT users: install bagel from the
OpenAI Plugins Directory
(one click), or clone the repo and add it as a plugin marketplace (the repo
carries .agents/plugins/marketplace.json). Directory installs bundle the
skills only (the directory accepts only public HTTPS MCP servers, and
Bagel's runs on your machine), so also connect the server once with
codex mcp add bagel --url http://localhost:8000/mcp, or in
~/.codex/config.toml:
Repo-marketplace and Claude Code installs wire this connection automatically.
Maintainers build the directory ZIP with
uv run python scripts/package_codex_directory.py.
Then start the container for your data format (see Quickstart): the plugin
connects to http://localhost:8000/mcp by default. Any other MCP client can
discover the same workflows server-side via the list_agent_capabilities tool.
Keep what matters, drop the rest
A robot records more data than you can afford to move. Bagel turns a question into a detector, runs it where the data is recorded, and ships only the windows around real events.
Here it is in one conversation:
Don't know the event in advance? The anomaly gate (beta) learns what normal looks like on the robot, asks Jev to name whatever isn't, and keeps only those slices, each with a JSON label, for any bucket: S3, GCS, Azure, MinIO or R2.
The session above: a 20-minute (1,200 s) recording and the prompt "keep 10 seconds before and after every deceleration harder than −10 m/s²". The preview detects 7 events, merges them into 4 windows, and keeps 92 s of the 1,200 (7.6%); the run writes a 2.1 GB bag down to 161 MB. These figures are illustrative demo output, not a measured benchmark: the ratio is event-window duration over total duration, so it depends entirely on your workload.
✅ Supported Data Formats
🆚 Bagel vs. the Tools You Already Use
You already have ros2 *, PlotJuggler, and grep. Bagel doesn't replace them: it
answers the questions they make you work for, then hands off to them:
One sentence of plain language, one answer, instead of a pipeline of commands and a script you'll delete tomorrow.
💬 What Can I Prompt?
You can ask Bagel almost anything. For example:
What’s the correlation between current and voltage in the
/spot/status/battery_statestopic?
I think the robot hit a pothole. Can you check for sudden deceleration on the z-axis to confirm?
Every time the drone decelerates harder than -10 m/s², keep 10 seconds before and after. Drop everything else.
Did anything change on this robot since last week?
Time to put Bagel to the test: can it catch a drone doing barrel rolls? Spoiler: 🎉 It totally can.
💡 How Bagel Works
When you ask a question, Bagel analyzes your data source’s metadata and topics to build a high-level understanding.
Based on your prompt, if further inspection is needed, Bagel identifies the most relevant topics and interprets their meaning and structure. Bagel then writes the relevant topic messages to an Apache Arrow file and uses DuckDB to generate and execute queries against it.
This process is repeated as needed, running new queries until Bagel finds the best answer to your question.
LLMs excel at language but struggle with math. Bagel overcomes this by generating deterministic DuckDB SQL queries. These queries are displayed for you to audit, and you can guide Bagel to correct any errors.
🐶 Teach Bagel a New Trick
Bagel learns new capabilities through POML files: a structured set of instructions that describe a “trick,” such as computing latency statistics.
✍️ Create a .poml file
For example, let’s define ./bagel_mcp/agent/examples/woof.poml.
🗣️ Use the capability
Prompt Bagel:
Run the POML capability "./bagel_mcp/agent/examples/woof.poml" on the ROS2 bag "./data/sample/ros2/mcap".
Result:
Teach it your own tricks (no rebuild)
Bagel discovers your own capabilities from ~/.bagel/capabilities/:
- In conversation: do a workflow once, then say "save that as a
capability called battery-triage" — Claude calls
save_agent_capabilityand it's reusable in any future session. - As a file: drop a markdown file with your steps (or a
POML file, if you want parameterized
templates — see
bagel_mcp/agent/compose/pipeline.pomlfor the house style) into~/.bagel/capabilities/.
Either way it shows up in list_agent_capabilities as user/<name> and runs
with run_poml_capability — from Claude Code, Claude Desktop, or any MCP
client. Teams: keep the directory in your own git repo and sync it to every
robot; it's just files. On Linux, run mkdir -p ~/.bagel/capabilities once
before starting the container so the mount is owned by you, not root.
📚 Guides
- Natural-language pipelines · the model: a cadence, gates, and tasks; preview → run → save → batch → standing at the edge
- Event-driven data reduction · detect events, keep windows around them (snippets or one reduced bag), batch across fleets, upload to the cloud
- Anomaly detection with Jev (beta) · learn normal on
the robot, ask Jev to label what isn't, upload only those slices with a JSON label;
preview_anomaliesdry-runs the screen first - Live ROS2 robots over rosbridge · a step-by-step tutorial
- ROS text logs · inspect
~/.ros/logerrors and warnings without opening a bag - MQTT · live IoT topics, Sparkplug B, edge recording
- PostgreSQL / TimescaleDB · every table is a topic
- InfluxDB 3 · every measurement is a topic
- Automotive MDF4 & CAN (beta) · channel groups and DBC messages are topics; units ride along
- Local LLMs · fully offline with Ollama: your data and your model never leave the machine
📦 Integrations
- Rerun · "show me that event in Rerun": any time window as a ready-to-open recording
- Lichtblick / Foxglove · event windows as MCAP + pre-framed layouts for either viewer
- PlotJuggler · open Bagel's MCAP outputs directly; one-sentence pre-framed sessions, flattened CSV/Parquet exports
- Cloudini · decode cloudini-compressed pointclouds, or compress a bag's PointCloud2 topics into CompressedPointCloud2
- Slack · pipelines post to your ops channel when they fire: "🚨 hard brake on {asset}"
- LeRobot (beta) · detected events become training episodes: a LeRobotDataset v3.0
🚧 Limitations
Rough edges we know about, so you don't find them the hard way:
- Two formats are beta. The automotive MDF4/CAN readers are verified against
files we generate with the same libraries that read them (
asammdf,python-can); real CANape/INCA/Vector-produced captures haven't crossed our test bench yet. LeRobot exports load-test clean with the reallerobotpackage, but no policy has been trained from a Bagel export yet. - The Jev integration is beta, and stays beta while we learn from real
deployments. That covers the
anomalyanddecidegates (recorded logs and live subscriptions),preview_anomalies, the on-robotlocalbackend and theros2-jazzy-jevimage. Its Jev backend has been run against live Jev through Vercel AI Gateway on a real drive, a synthetic fault log and a live MQTT stream; a direct TypeSafe key is not yet exercised, and detection quality has not been measured on logs with known incidents. On a live subscription the flagged window is kept as Parquet (write_topics_to_file); MCAP/rosbag snippets need a recorded log and are refused there. The baseline is learned per run and restarts with the process, so in screen mode the first minutes of each run are never flagged. Labels, settings and defaults may change between releases. - Reduction ratios are workload-dependent, and unbenchmarked. The ratio is event-window duration over total duration: quiet recordings reduce dramatically, eventful ones much less. The figures in this README are illustrative demo output, not a measured benchmark.
- No authentication on the MCP endpoint. By design it binds to localhost only; treat it like a database socket and see SECURITY.md before sharing it beyond your machine.
- Small local models struggle with multi-step pipelines. A 4-8B model handles tool selection and simple SQL; event-windowed reduction and multi-topic joins want a bigger model. See the Local LLMs guide.
- Live-database end-to-end tests run outside CI. The InfluxDB and Postgres suites' pure tests run in CI; their live end-to-end cases only execute against an instance you point them at. Everything else, including the ROS bag write paths, runs in CI.
🫶 Contributing
We’d love your help! The easiest way to support the project is by giving it a ⭐ on GitHub.
Other great ways to contribute:
- Request new features
- Report bugs
- Improve documentation
- Add new capabilities
Before contributing, please review the guidelines.
Join the conversation in our Discord server. We hang out there regularly.
📄 License
Bagel is open source under the Apache License 2.0.
Agent discovery and reproducible workflows
For maintainers: discovery audits and evaluation, listing maintenance, and reproducible user reports.
來源:README.md,提交 9a176b6
工具
0版本歷史
5- v2.4.1最新Oct 6, 2026
- v2.4.0Sep 26, 2026
- v2.3.1Sep 25, 2026
- v2.3.0Sep 25, 2026
- v2.2.3Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分