Skip to main content
Give your coding agent the Cerulion CLI, a robot workspace, and the rules for using them. cerulion_mcp is a Model Context Protocol server. Your MCP client starts it over stdio, and it drives the cerulion CLI in a workspace you choose: the agent can create and build nodes, wire and validate graphs, run them, inspect topics, record bags and resimulate, and stop the jobs it starts. Its guide tool teaches the agent how Cerulion works — trigger policies, backpressure, queue depth, process groups — before it touches your graph.
cerulion_mcp is proprietary software distributed as signed binaries. The binaries embed first-party Cerulion crates licensed under AGPL-3.0 (cerulion_core, cerulion_macros, native_ros2_messages, used by the bag-analysis tools); the THIRD_PARTY_NOTICES file in each archive lists them with their source revisions and the licence text, and includes Cerulion’s written offer to provide their source code on request to founders@cerulion.com. The cerulion CLI it drives is separate, open-source software that runs as its own process.

Local server or mcp.cerulion.com

Use the local server to build and run robot code. To connect to the hosted server instead, add its URL to your client:

Install the server

Install the Cerulion CLI

The server is tested against cerulion 1.0.0. Install it as described in Installation, then check:
It prints cerulion 1.0.0. Nodes are shared libraries the CLI loads, so build them with the compiler that built the CLI: rustup toolchain install 1.93.0. Workspaces created with cerulion workspace create pin it in rust-toolchain.toml.

Install cerulion_mcp

On macOS or Linux:

Check the install

It prints cerulion-mcp 0.1.0. Run cerulion_mcp --help for every flag and environment variable.

Configure your client

Use absolute paths for the server, the workspace, and the CLI. GUI clients such as Claude Desktop, Cursor, and VS Code do not inherit your shell PATH, so pass --bin or set CERULION_MCP_BIN. Find the paths with:
node_build and graph_run compile nodes with cargo, which the CLI also finds on PATH. Give a GUI client a PATH whose first entry is the directory that dirname "$(command -v cargo)" prints (~/.cargo/bin with rustup, as in the JSON examples below); otherwise the first build fails with cargo not found. The examples use the Homebrew prefix on Apple Silicon, /opt/homebrew/bin. With Homebrew on Linux it is /home/linuxbrew/.linuxbrew/bin; with the archive installer it is ~/.local/bin.
Ask the agent to call workspace_info first — it reports the workspace and the CLI path and version the server resolved — and then guide, the operating rules it should follow. Then try:
Create a node that publishes a counter at 10 Hz and a node that logs it, wire them into a graph, validate it, run it for five seconds, and show the topic rate.
To investigate a recording instead of driving the CLI, an MCP client such as Claude Code, Cursor, or Claude Desktop can also register Hindsight’s MCP server. Hindsight is a separate server, and it is not open source.

Where calls go

Every tool description ends with a Reach: line. The MCP tools reference lists each one.

Security model

  • The server runs with your user’s permissions. CLI-backed tools run only the cerulion binary it resolved, with argument lists it builds itself. The bag-analysis tools run inside the server instead: they read MCAP bags in the workspace and, when given an https:// source, download it over the internet first. The Cerulion Cloud tools call the Cloud API with your token, and only when it is configured.
  • The workspace is the trust boundary: every path a tool takes must lie inside it unless you start the server with --allow-outside-workspace. The one exception is the CLI’s own state in ~/.cerulion: account_login stores your session there, and robot_pair writes desk.key and robots.toml there.
  • Two tools act on the whole host rather than the workspace: flashback_capture asks every live Cerulion graph on the machine to write its recent history, and system_clean wipes the iceoryx2 shared-memory state that every Cerulion process shares.
  • Deletes need confirm: true. system_clean and bag_migrate preview by default. graph_run rewrites the graph file only when persist_partition is true.
  • The server sends no telemetry of its own.

How tools behave

  • Long-running verbs — graph_run, node_run, bag_play, bag_record, topic_watch — return a job ID instead of blocking. Poll it with job_status and job_logs, and end it with job_stop. Jobs run in their own process groups, are scoped to the workspace that started them, and stop when the server exits.
  • A tool that could not do its job returns isError: true with text that starts with one ERROR: line naming the fix; the CLI’s stderr is in the structured result.
  • resim_run runs cerulion bag play <bag> --resim all and caches verified outcomes under .cerulion-mcp/runs. fresh: false is a cache hit, not a failure.

Troubleshooting

  • cerulion not found or the wrong version. Call workspace_info. Set --bin or CERULION_MCP_BIN to an absolute path to cerulion 1.0.0.
  • A node build fails with a Rust version or ABI error. Build with the CLI’s compiler: rustup toolchain install 1.93.0, and keep the workspace’s rust-toolchain.toml.
  • ERROR: ... outside the workspace. Pass paths inside --workspace, or start the server with --allow-outside-workspace.
  • The client shows no tools. Run the configured command in a terminal. It waits silently on stdin; anything printed to stderr is the reason, and CERULION_MCP_LOG=debug adds detail.
  • The CLI asks you to log in. Run account_login, or cerulion login in a terminal, once per machine.

Upgrade and uninstall

Upgrade with brew upgrade cerulion-mcp, or run a newer archive’s install.sh, then restart your client. Uninstall with brew uninstall cerulion-mcp, or delete ~/.local/bin/cerulion_mcp, and remove the cerulion entry from your client config. A workspace may hold a .cerulion-mcp/ directory with cached resim runs; delete it when you no longer need them.