Skip to main content
Glama

Unlike cat videos, most data are trapped in the physical world. Bagel unlocks them and lets you chat with your physical data—just like you do with ChatGPT. For example:

Is my IMU sensor overheating?

Can’t wait to try it out? 👉 Check out the Quickstart.

🥯 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.

  • Dockerized environments: No local dependencies required.

  • Extensible capabilities: Bagel can learn new tricks.

  • Wide format coverage: Missing your data format? Open a ticket.

✅ Supported Data Formats

Industry

Formats

Robotics

ROS1, ROS2, MCAP (any profile), ROS text logs (~/.ros/log)

Drones

PX4, ArduPilot, Betaflight

Automotive

ASAM MDF4 (.mf4), CAN captures (.blf/.asc + DBC) — beta

IoT

MQTT (live, Sparkplug B), PostgreSQL / TimescaleDB, InfluxDB 3

🆚 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:

You do this today

Ask Bagel instead

ros2 bag info for metadata

"Summarize this bag" — same prompt works on PX4, ArduPilot, MCAP, MQTT, Postgres

ros2 topic echo /imu and eyeball raw values

"What's the peak z-deceleration in /imu? Running average over 5 s?" — real SQL underneath: peaks, running averages, percentiles, cross-topic correlations

Scrub PlotJuggler timelines hunting for the event

"Find every deceleration under −10 m/s² and cut ±30 s snippets" — then open the result in PlotJuggler with a pre-framed layout

rqt_console, or grep ~/.ros/log

"Read the ERRORs from ~/.ros/log and tell me what went wrong" — tracebacks included, no bag needed

Echo two topics in two terminals, correlate in a spreadsheet

"What's the correlation between current and voltage?" — topics live in one SQL relation, so joins and corr() are one question

ros2 bag record -a and babysit the disk

A standing edge pipeline: record continuously, keep only event windows, drop the rest

A bash loop over 200 bags

"Run this pipeline on every bag in the folder"one pipeline, whole fleet, with a combined report

scp/aws s3 sync scripts to ship data off the robot

Upload to S3, GCS, or Azure as a pipeline step, checksum-skipping files already there

A different viewer per format: FlightPlot for PX4, MAVExplorer for ArduPilot, Blackbox Explorer for Betaflight

The same conversation for all of them — and ROS, MCAP, MQTT, Postgres, InfluxDB

Write a one-off pandas script per question

Ask the question; Bagel writes and runs the query

One sentence of plain language, one answer — instead of a pipeline of commands and a script you'll delete tomorrow. Here's a sentence becoming a data pipeline that reduces a bag around detected events:

Related MCP server: DuckDB MCP Server

💬 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_states topic?

I think the robot hit a pothole. Can you check for sudden deceleration on the z-axis to confirm?

Can you help me tune the PID of my drone?

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.

⚡️ Quickstart

Three commands. That’s it.

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).

1. Clone and start Bagel

git clone https://github.com/Extelligence-ai/bagel.git && cd bagel
docker compose run --service-ports ros2-kilted

Pick the service that matches your environment:

Service

Use case

ros2-kilted

ROS2 Kilted (latest)

ros2-jazzy

ROS2 Jazzy

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

betaflight

Betaflight flight logs

iot

IoT / MQTT (live)

TIP

To give Bagel access to your local files, editcompose.yaml before starting Docker: uncomment and update the volumes section under your chosen service.

Wait for this output:

INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

2. Connect Claude Code

In a new terminal:

claude mcp add --transport sse bagel http://0.0.0.0:8000/sse

3. Prompt

claude

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:

brew install ollama && ollama serve &                                  # or ollama.com
ollama pull qwen3:8b
uvx ollmcp --mcp-server-url http://localhost:8000/sse --model qwen3:8b

Model picks, expectations, and troubleshooting: Local LLMs guide.

Bagel works with any MCP-enabled LLM. Setup runbooks for tested alternatives:

Can’t find your LLM? Open a ticket.

🐶 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 ./src/agent/examples/woof.poml.

<poml>
    <task>
        Count the topics in the data source.
        If the count is odd, say "woof", else say "meow".
    </task>

    <output-format>
        Return the sound, the topic count, and a few cute emojis. Nothing else.
    </output-format>
</poml>

🗣️ Use the capability

Prompt Bagel:

Run the POML capability "./src/agent/examples/woof.poml" on the ROS2 bag "./data/sample/ros2/mcap".

Result:

meow 🐱 4 topics 🐱💤🎯

📚 Guides

📦 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 pointcloud data in pipelines

  • 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

🫶 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.

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
13hResponse time
Release cycle
1Releases (12mo)
Commit activity
Issues opened vs closed

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    -
    quality
    D
    maintenance
    A database-agnostic MCP server that enables natural language queries to your database through Claude or Copilot, automatically writing and executing SQL.
    7
    MIT
  • A
    license
    -
    quality
    D
    maintenance
    A local MCP server enabling AI assistants to query and analyze data via DuckDB SQL engine, supporting local files, memory, S3, and MotherDuck.
    29
    Apache 2.0
  • A
    license
    -
    quality
    D
    maintenance
    MCP server for SQL analytics on DuckDB and MotherDuck databases, enabling AI assistants and IDEs to query data via natural language.
    1
    MIT
  • F
    license
    -
    quality
    C
    maintenance
    MCP server enabling natural-language querying of SQLite databases via schema discovery, GraphRAG retrieval, and safely guarded read-only SQL execution.

View all related MCP servers

Related MCP Connectors

  • GibsonAI MCP server: manage your databases with natural language

  • Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.

  • User-owned memory for AI agents, Copilot, Claude, IDEs, CLIs, and chat apps over remote MCP.

View all MCP Connectors

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/Extelligence-ai/bagel'

If you have feedback or need assistance with the MCP directory API, please join our Discord server