Bagel

by Extelligence (open source) · Claude Desktop, Claude Code, OpenCode, любой MCP-клиент, Python 3.10+, DuckDB, Windows, macOS, Linux

MCP MCP Servers Open Source v2.2.0 · 19.08.2026 активный

Запросы к данным робототехники, дронов и IoT на естественном языке через MCP-сервер, с интеллектуальным edge-пайплайном сокращения данных, оставляющим только значимое.

v2.2.0
19.08.2026 current

Установка
# Требуются Docker Desktop и Claude Code (или другая LLM с поддержкой MCP)
git clone https://github.com/Extelligence-ai/bagel.git && cd bagel
docker compose run --service-ports ros2-kilted
# Порт 8000 занят? Используйте: MCP_SERVER_PORT=8100 docker compose run --service-ports ros2-kilted
claude mcp add --transport sse bagel http://localhost:8000/sse
claude
# Полностью автономный режим (вместо шага с claude mcp add):
brew install ollama && ollama serve &
ollama pull qwen3:8b
uvx ollmcp --mcp-server-url http://localhost:8000/sse --model qwen3:8b
показать оригинал переведено ИИ

Bagel позволяет задавать вопросы о данных робототехники, дронов и Интернета вещей на простом английском языке. Каждое вычисление над вашими данными сообщений — это DuckDB SQL, а не предположения модели, и Bagel показывает вам запрос, чтобы вы могли его проверить.

Не перегревается ли мой IMU-датчик?

Bagel также имеет интеллектуальный конвейер сокращения периферийных данных: опишите событие, и Bagel запускает обнаружение на роботе, сохраняя значимые окна и отбрасывая остальное. MCP-сервер передаёт всё это в руки вашей LLM: Claude Code, Gemini, Cursor или полностью локальной модели.

Bagel был первым MCP-сервером, который предоставил реальный набор инструментов анализа для данных робототехники, и он держит LLM там, где ей место: перед вашими журналами, но никогда в контуре управления роботом.

🥯 Ключевые особенности

  • Задавайте вопросы на простом языке: не требуется глубоких знаний предметной области.
  • Прозрачные вычисления: детерминированные SQL-запросы. Никакой математики на основе «чёрного ящика» LLM.
  • Конвейеры на естественном языке: «Сохранить 10 секунд вокруг каждого резкого торможения, остальное отбросить»: одно предложение превращается в проверяемый конвейер: предпросмотр до записи байта, затем выполнение однократно, на всём парке или постоянно на периферии.
  • Широкая поддержка LLM: Claude Code, Gemini, Cursor, Codex и другие.
  • Docker-среды: не требуется локальных зависимостей.
  • Расширяемые возможности: Bagel может освоить новые трюки.
  • Широкий охват форматов: Не хватает вашего формата данных? Откройте заявку.

⚡️ Быстрый старт

[!TIP] Уже используете Claude Code? Просто вставьте ссылку на этот репозиторий и скажите Claude, какая среда вам нужна:

Настройте https://github.com/Extelligence-ai/bagel для ROS2 Kilted.

Claude склонирует репозиторий, запустит Docker и настроит MCP-подключение за вас.

📋 Предварительные требования

Установите Docker Desktop и Claude Code (или другую LLM с поддержкой MCP).

1. Клонируйте и запустите Bagel

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

[!TIP] Порт 8000 уже занят? Укажите другой MCP_SERVER_PORT, например MCP_SERVER_PORT=8100 docker compose run --service-ports ros2-kilted, и используйте этот порт на шаге 2.

Выберите сервис, соответствующий вашей среде:

Сервис Сценарий использования
ros2-kilted ROS2 Kilted (последняя версия)
ros2-jazzy ROS2 Jazzy
ros2-iron ROS2 Iron
ros2-humble ROS2 Humble
ros1-noetic ROS1 Noetic
ros1-noetic-cv ROS1 Noetic + компьютерное зрение
px4 Полётные журналы PX4
ardupilot Полётные журналы ArduPilot
betaflight Полётные журналы Betaflight
iot IoT / MQTT (в реальном времени)

[!TIP] Чтобы предоставить Bagel доступ к вашим локальным файлам, отредактируйте файл compose.yaml перед запуском Docker: раскомментируйте и обновите раздел volumes для выбранного сервиса.

Дождитесь следующего вывода:

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

2. Подключите Claude Code

В новом терминале:

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

[!ПРИМЕЧАНИЕ] Конечная точка MCP привязана только к localhost (не доступна из локальной сети) из соображений безопасности. Чтобы открыть доступ для других машин, удалите префикс 127.0.0.1 в compose.yaml и поместите перед ней аутентифицирующий прокси: см. SECURITY.md.

3. Промпт

claude

Обобщи метаданные ROS2 bag-файла "./data/sample/ros2/mcap".

Вот и всё: вы общаетесь со своими данными.

🔒 Предпочитаете полностью автономный режим?

Замените шаг 2 на локальную модель: ваши данные и ваша LLM остаются на машине:

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

Выбор модели, ожидания и устранение неполадок: Руководство по локальным LLM.

📚 Используете другую LLM?

Bagel работает с любой LLM, поддерживающей MCP. Инструкции по настройке для протестированных альтернатив:

Не нашли свою LLM? Откройте тикет.

🔌 Плагины для агентов (Claude Code и Codex)

Bagel поставляется с плагином для агентов: четыре навыка, которые обучают агента тому, когда и как управлять сервером (разбор логов, создание конвейеров, живые выходные потоки, экспорт визуализации) плюс MCP-соединение, настраиваемое автоматически. Одна и та же директория plugin/ обслуживает как Claude Code, так и OpenAI Codex.

/plugin marketplace add Extelligence-ai/bagel
/plugin install bagel@bagel

Пользователи Codex и ChatGPT: установите bagel из Каталога плагинов OpenAI (в один клик) или склонируйте репозиторий и добавьте его как маркетплейс плагинов (в репозитории есть .agents/plugins/marketplace.json). Установки из каталога включают только навыки, поэтому также подключите сервер один раз в ~/.codex/config.toml:

[mcp_servers.bagel]
url = "http://localhost:8000/mcp"

Установки из репозитория-маркетплейса и Claude Code настраивают это соединение автоматически.

Затем запустите контейнер для вашего формата данных (см. Краткое руководство): плагин по умолчанию подключается к http://localhost:8000/mcp. Любой другой MCP-клиент может обнаружить те же серверные рабочие процессы через инструмент list_agent_capabilities.

Сохраняйте важное, отбрасывайте остальное

Робот записывает больше данных, чем вы можете себе позволить перемещать. Bagel превращает вопрос в детектор, запускает его там, где записаны данные, и переносит только окна вокруг реальных событий.

Вот это в одном разговоре:

Сессия выше: запись длительностью 20 минут (1200 с) и промпт "сохранить 10 секунд до и после каждого замедления сильнее −10 м/с²". Предпросмотр обнаруживает 7 событий, объединяет их в 4 окна и сохраняет 92 с из 1200 (7,6%); запуск записывает bag-файл размером 2,1 ГБ в 161 МБ. Эти цифры являются иллюстративным демо-выводом, а не измеренным бенчмарком: соотношение — это длительность окна события к общей длительности, поэтому оно полностью зависит от вашей рабочей нагрузки.

✅ Поддерживаемые форматы данных

Отрасль Форматы
Робототехника ROS1, ROS2, MCAP (любой профиль), Copper (через экспорт в MCAP), текстовые логи ROS (~/.ros/log)
Дроны PX4, ArduPilot, Betaflight
Автомобилестроение ASAM MDF4 (.mf4), захваты CAN (.blf/.asc + DBC) · бета
Интернет вещей MQTT (живой режим, Sparkplug B), PostgreSQL / TimescaleDB, InfluxDB 3
Состояние оборудования WaffleForm снимки (.waffleform.yaml), автоопределение через waffle-iron · бета
## 🆚 Bagel и инструменты, которые вы уже используете

У вас уже есть ros2 *, PlotJuggler и grep. Bagel не заменяет их: он отвечает на вопросы, на которые они заставляют вас работать, а затем передаёт им управление:

Вы делаете это сегодня Вместо этого спросите Bagel
ros2 bag info для метаданных «Суммируй этот мешок»: один и тот же запрос работает с PX4, ArduPilot, MCAP, MQTT, Postgres
ros2 topic echo /imu и просмотр сырых значений «Каково пиковое замедление по оси z в /imu? Скользящее среднее за 5 с?» · под капотом настоящий SQL: пики, скользящие средние, процентили, корреляции между темами
Прокрутка временных шкал PlotJuggler в поисках события «Найди каждое замедление ниже −10 м/с² и вырежи фрагменты по ±30 с»: затем откройте результат в PlotJuggler с предварительно подготовленным макетом
rqt_console или grep ~/.ros/log «Прочитай сообщения об ошибках из ~/.ros/log и скажи, что пошло не так»: включая трассировки, мешок не нужен
Эхо двух тем в двух терминалах, корреляция в электронной таблице «Какова корреляция между током и напряжением?»: темы живут в одном SQL-отношении, поэтому объединения и corr() — это один вопрос
ros2 bag record -a и присмотр за диском Постоянный граничный конвейер: записывайте непрерывно, сохраняйте только окна событий, отбрасывайте остальное
Цикл bash по 200 мешкам «Запусти этот конвейер для каждого мешка в папке»: один конвейер, весь парк, с общим отчётом
Скрипты scp/aws s3 sync для выгрузки данных с робота Загрузка в S3, GCS или Azure как шаг конвейера, с пропуском файлов по контрольной сумме, если они уже там
Разные просмотрщики для разных форматов: FlightPlot для PX4, MAVExplorer для ArduPilot, Blackbox Explorer для Betaflight Один и тот же разговор для всех них, а также ROS, MCAP, MQTT, Postgres, InfluxDB
Написание одноразового pandas-скрипта для каждого вопроса Задайте вопрос; Bagel напишет и выполнит запрос

Одно предложение на простом языке, один ответ — вместо конвейера команд и скрипта, который вы удалите завтра.

💬 Что я могу запросить?

Вы можете спросить Bagel почти всё что угодно. Например:

Какова корреляция между током и напряжением в теме /spot/status/battery_states?

Я думаю, робот наехал на яму. Можешь проверить резкое замедление по оси z, чтобы подтвердить?

Каждый раз, когда дрон замедляется сильнее, чем -10 м/с², сохраняй 10 секунд до и после. Всё остальное отбрасывай.

Изменилось ли что-нибудь на этом роботе с прошлой недели?

Пришло время испытать Bagel: сможет ли он поймать дрон, выполняющий бочки? Спойлер: 🎉 Он точно может.

💡 Как работает Bagel

Когда вы задаёте вопрос, Bagel анализирует метаданные и темы вашего источника данных, чтобы сформировать высокоуровневое понимание.

Если на основе вашего запроса требуется дальнейшее изучение, Bagel определяет наиболее релевантные темы и интерпретирует их смысл и структуру. Затем Bagel записывает сообщения соответствующих тем в файл Apache Arrow и использует DuckDB для генерации и выполнения запросов к нему.

Этот процесс повторяется по мере необходимости: выполняются новые запросы, пока Bagel не найдёт наилучший ответ на ваш вопрос.

LLM отлично справляются с языком, но испытывают трудности с математикой. Bagel преодолевает это, генерируя детерминированные SQL-запросы DuckDB. Эти запросы отображаются для вашей проверки, и вы можете направлять Bagel для исправления любых ошибок.

🐶 Научите Bagel новому трюку

Bagel осваивает новые возможности с помощью файлов POML: структурированных наборов инструкций, описывающих «трюк». такие как вычисление статистики задержек.

✍️ Создайте файл .poml

Например, определим ./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>

🗣️ Используйте возможность

Запросите Bagel:

Запустите POML-возможность "./src/agent/examples/woof.poml" на мешке ROS2 "./data/sample/ros2/mcap".

Результат:

meow 🐱 4 topics 🐱💤🎯

📚 Руководства

📦 Интеграции

  • Rerun · «покажи мне это событие в Rerun»: любое временное окно как готовую к открытию запись
  • Lichtblick / Foxglove · окна событий в формате MCAP + готовые макеты для любого из просмотрщиков
  • PlotJuggler · открывать выходные MCAP Bagel напрямую; готовые сеансы в одно предложение, плоские экспорты CSV/Parquet
  • Cloudini · декодировать облака точек, сжатые cloudini, или сжимать темы PointCloud2 мешка в CompressedPointCloud2
  • Slack · конвейеры публикуют в ваш канал эксплуатации при срабатывании: «🚨 резкое торможение на {asset}»
  • LeRobot (бета) · обнаруженные события становятся обучающими эпизодами: LeRobotDataset v3.0

🚧 Ограничения

Известные нам шероховатости, чтобы вы не столкнулись с ними на собственном опыте:

  • Два формата находятся в бета-версии. Читатели автомобильных MDF4/CAN проверены на файлах, которые мы генерируем с помощью тех же библиотек, которые их читают (asammdf, python-can); реальные записи, созданные CANape/INCA/Vector, ещё не прошли наш тестовый стенд. Экспорт LeRobot проходит нагрузочное тестирование с настоящим пакетом lerobot, но ни одна политика ещё не была обучена на экспорте Bagel.
  • Коэффициенты сокращения зависят от рабочей нагрузки и не измерены. Коэффициент — это отношение длительности окна событий к общей длительности: спокойные записи сокращаются значительно, насыщенные событиями — гораздо меньше. Цифры в этом README являются иллюстративным выводом демо, а не измеренным эталоном.
  • Нет аутентификации на конечной точке MCP. По замыслу он привязан только к localhost; относитесь к нему как к сокету базы данных и ознакомьтесь с SECURITY.md перед тем, как предоставлять доступ за пределами вашей машины.
  • Небольшие локальные модели с трудом справляются с многошаговыми конвейерами. Модель 4-8B справляется с выбором инструментов и простым SQL; сокращение по окнам событий и объединение по нескольким темам требуют модели побольше. См. руководство по локальным LLM.
  • Сквозные тесты с живой базой данных выполняются вне CI. Чистые тесты наборов InfluxDB и Postgres выполняются в CI; их живые сквозные сценарии выполняются только против экземпляра, на который вы их укажете. Всё остальное, включая запись мешка ROS, paths, runs in CI.

🫶 Вклад

Мы будем рады вашей помощи! Самый простой способ поддержать проект — поставить ему ⭐ на GitHub.

Другие отличные способы внести вклад:

  • Запросить новые функции
  • Сообщить об ошибках
  • Улучшить документацию
  • Добавить новые возможности

Прежде чем вносить вклад, пожалуйста, ознакомьтесь с рекомендациями.

Присоединяйтесь к обсуждению на нашем Discord-сервере. Мы регулярно там бываем.

📄 Лицензия

Bagel — это open-source проект на условиях лицензии Apache 2.0.

Войдите, чтобы оставить комментарий