A workspace of pure-Python tools for working with MCAP files, ROS 1/2 messages, and robotics data — built around a fast, batteries-included CLI.
A high-performance Python CLI for slicing, dicing, recovering, and exporting MCAP files. Pure Python, no ROS runtime required.
# Try it without installing
uvx pymcap-cli info data.mcap
# Or add to your project
uv add pymcap-cliWhy pymcap-cli?
- Advanced recovery — repairs corrupt MCAP files via chunk-level recovery and MessageIndex validation
- Smart chunk copying — up to 10× faster filtering by copying compressed chunks without decompressing
- Unified
processcommand — recovery, filtering, and recompression in a single optimized pass - Precise filtering — regex topics, time ranges, and content-type filters with deferred schema/channel writing
- Broad format coverage — converts ROS 1
.bagand ROS 2.db3to MCAP; exports to NDJSON, CSV, Parquet, PCD, GeoJSON / KML / GPX, image folders, and MP4 - Rich terminal output — colored topics, Unicode distribution histograms, tree views, responsive layouts
See the full command reference in pymcap-cli/README.md.
The workspace also ships the libraries pymcap-cli is built on. Each is usable standalone.
| Package | What it does |
|---|---|
small-mcap |
Lightweight MCAP reader/writer. Zero hard deps, high performance. |
mcap-ros2-support-fast |
Pure-Python ROS 2 CDR (de)serialization. 30–60× faster than the reference implementation. |
ros-parser |
Parser for ROS 1 / ROS 2 message definitions and Foxglove message path syntax. |
mcap-codec-support |
Reusable MCAP encoder/decoder factories for video and point-cloud codecs. |
pointcloud2 |
Helpers for sensor_msgs/PointCloud2 access and conversion. |
pureini |
Pure-Python implementation of the Cloudini point-cloud compression format. |
robo-ws-bridge |
Python implementation of the Foxglove WebSocket protocol for streaming robotics data. |
websocket-proxy |
Proxy in front of Foxglove Bridge with just-in-time message conversion, image compression, and point-cloud compression. |
These tools draw inspiration from (and aim to interoperate with):