Rhino
NURBS modelling in Rhino 8, through RhinoMCP.
Kind: App MCP · Document: model.3dm · Install: brew install --cask rhino · Override: CXDDIE_RHINO
Cxddie drives Rhino through RhinoMCP and serves the usual CAD session on the workspace's port, so agents get the same tools as everywhere else.
One-time setup
- In Rhino 8, open Tools → Package Manager, install rhinomcp and restart Rhino.
- Run the
mcpstartcommand in Rhino. - Install uv (
brew install uv, orwinget install astral-sh.uvon Windows). Cxddie runs RhinoMCP withuvx.
If Rhino isn't running, Start launches it and waits for the plugin.
One document per workspace
Every workspace gets its own Rhino document, tagged with the workspace's id and made active before every call. Workspaces using Rhino take turns, so several agents can share one Rhino safely. save writes model.3dm to the worktree, and an existing .3dm in the repo is opened when the workspace starts.
What agents get
run_code runs RhinoScript-Python in the workspace's document. These are in scope:
rs(rhinoscriptsyntax)sc(scriptcontext), withsc.docset to this workspace's documentRhino(RhinoCommon) anddoc
print() output is returned. RhinoMCP's other tools are offered too, as rhino_<tool>. That includes its RhinoScript docs lookup, object queries and the Grasshopper tools.
Conventions agents are told
- Use the document's model units (millimetres for new documents).
- Name objects and put them on meaningful layers.
import rhinoscriptsyntax as rs
corners = [(0, 0, 0), (60, 0, 0), (60, 30, 0), (0, 30, 0),
(0, 0, 6), (60, 0, 6), (60, 30, 6), (0, 30, 6)]
plate = rs.AddBox(corners)
hole = rs.AddCylinder((40, 15, -1), 8, 2.5)
rs.BooleanDifference(plate, hole)Rhino support is new and has been tested against a stand-in server, not yet against every Rhino release. If something doesn't work, please let us know.