Skip to main content

Claude meets Bob: an AI agent controlling a physical robot via MCP

2 min read By Craig Merry
opencastor mcp physical-ai claude robotics

Something clicked this week that I want to share: I opened Claude Code, typed a question, and a robot in the next room responded. No HTTP client. No curl commands. No custom glue code. Just a conversation.

This is what the OpenCastor MCP integration looks like in practice.

What it looks like

With castor mcp configured in ~/.claude.json, Claude Code gets 14 new tools — discoverable automatically via /mcp:

  • castor__robot_status — live status (LoA 0)
  • castor__robot_telemetry — sensor + system data
  • castor__robot_navigate — navigation commands (LoA 1)
  • castor__robot_estop — emergency stop (always LoA 0)
  • castor__send_command — raw RCAN dispatch
  • castor__get_config / castor__set_config — config read/write (LoA 2)
  • castor__robot_attest — compliance attestation
  • …and 6 more

Here’s a real exchange while debugging a session:

Me: What’s Bob’s current CPU temp and active model?

Claude: [calls castor__robot_telemetry] Bob is running at 48.5°C with claude-opus-4-6 via Anthropic. RAM usage is at 62%, disk at 69%. No thermal concerns.

No context switching. No app. Claude just knew.

Access control that actually ships

Every tool is gated by Level of Assurance (LoA). Claude Code’s token is LoA 3 on my setup — full trust, because it’s me on my own machine. A third-party agent integration would get LoA 1 at most. ESTOP is always LoA 0 — Protocol 66 isn’t optional, not even for Claude.

Why MCP fits Physical AI

REST APIs need you to know the API. MCP tools are self-describing — Claude discovers what Bob can do from the schema and composes calls. When I asked it to “check if Bob is healthy and optimize for current RAM headroom,” it made four sequential tool calls and proposed a config change before asking me to confirm.

That’s a multi-step physical AI workflow with zero custom code on my end.

Every action is signed

Tool calls that mutate robot state produce a RCAN v2.2 envelope: LoA, agent identity, sequence number, ML-DSA-65 signature. castor audit --tail shows the full provenance. Automatic, signed, immutable.

Setup

castor mcp token --name claude --loa 3
castor mcp install --client claude

Requires OpenCastor v2026.3.29.1+. Docs at opencastor.com/docs/mcp.

The thing that surprised me most: I’ve been using this daily. When something breaks on Bob, I just ask Claude — and Claude can check. That’s the shift.