Control Rhino 3D via RhinoMCP plugin. Use when creating, modifying, or deleting 3D geometry (spheres, boxes, cylinders, lines, curves, meshes), managing layers and materials (including PBR), boolean operations, transforms, file import/export, groups/blocks, or querying document information. Requires Rhino running on Windows with RhinoMCP plugin started (`tcpstart` command for WSL access).
Control Rhino 3D directly from Clawdbot via TCP socket connection to the RhinoMCP plugin.
tcpstart (for WSL/remote access)Note: Use
mcpstartfor local-only access (Cursor, Claude Desktop),tcpstartfor WSL/Clawdbot.
Edit config.json:
{
"connection": {
"host": "172.31.96.1",
"port": 1999,
"timeout": 15.0
},
"screenshots": {
"linux_dir": "/home/mcmuff/clawd/projects/rhinomcp-dev/captures",
"windows_dir": "\\\\wsl.localhost\\Ubuntu\\home\\mcmuff\\clawd\\projects\\rhinomcp-dev\\captures"
}
}
cd ~/clawd/skills/rhinomcp/scripts
python3 rhino_client.py ping
| Script | Purpose |
|---|---|
rhino_client.py | Base TCP client, raw commands |
geometry.py | Create primitives (box, sphere, cylinder, curves...) |
transforms.py | Move, rotate, scale, copy, mirror, arrays |
booleans.py | Union, difference, intersection |
selection.py | Select by layer, type, name, IDs |
analysis.py | Object info, properties, bounding box, volume |
curves.py | Offset, fillet, chamfer, join, explode |
surfaces.py | Loft, extrude, revolve, sweep |
layers.py | Create, set, list, delete layers |
materials.py | PBR materials, assign to layers |
viewport.py | Views, camera, screenshots |
render.py | Lights, render settings, render to file |
files.py | Open, save, import, export (STEP, OBJ, STL...) |
groups.py | Groups and block definitions |
grasshopper.py | Grasshopper Player automation (run/info/preset with custom params) |
presets.py | Preset & Template manager for GH definitions |
scene.py | Document info, batch operations |
Run Grasshopper definitions with custom parameters directly from CLI.
# Show available parameters in a GH file
python3 grasshopper.py info "C:/path/to/definition.gh"
# Run with default parameters
python3 grasshopper.py run "C:/path/to/definition.gh"
# Run with custom parameters
python3 grasshopper.py run "C:/path/to/definition.gh" --Lichthoehe 2200 --Lichtbreite 1000
# Set insertion point
python3 grasshopper.py run "C:/path/to/definition.gh" --Point 100,200,0
python3 grasshopper.py info "C:/path/to/Rahmentuer_UD4.gh"
# Output:
# Available Parameters (26):
# ----------------------------------------------------------
# --Lichthoehe = 2100.0 [1800.0 - 2600.0] (Number)
# --Lichtbreite = 900.0 [600.0 - 1400.0] (Number)
# --Rahmendicke = 53.0 (Number)
# --Tuerstaerke = 58.0 (Number)
# --DichtNut_Rahmen = True (Boolean)
# ...
GH nicknames are automatically mapped to Player prompt names:
| GH Nickname | Maps to |
|---|---|
| Pt | Point |
| Punkt | Point |
| Position | Point |
| Pos | Point |
Add custom aliases in PARAM_ALIASES dict in grasshopper.py.
info loads the GH file via Grasshopper SDK to extract parameter metadata (names, types, defaults, min/max)run starts Rhino's GrasshopperPlayer command via SendKeystrokes (non-blocking)Lichthoehe <2100> get the custom or default valueGet Point prompts receive the --Point coordinate or default 0,0,0# Door 1: Standard at origin
python3 grasshopper.py run "C:/path/to/Rahmentuer_UD4.gh" \
--Lichthoehe 2100 --Lichtbreite 900 --Point 0,0,0
# Door 2: Wider door offset 1500mm
python3 grasshopper.py run "C:/path/to/Rahmentuer_UD4.gh" \
--Lichthoehe 2100 --Lichtbreite 1000 --Point 1500,0,0
# Door 3: Taller door offset 3000mm
python3 grasshopper.py run "C:/path/to/Rahmentuer_UD4.gh" \
--Lichthoehe 2300 --Lichtbreite 900 --Point 3000,0,0
# Enable verbose logging
export RHINOMCP_DEBUG=1
python3 grasshopper.py run "C:/path/to/file.gh" --Lichthoehe 2200
Quick access to common Grasshopper configurations.
python3 grasshopper.py presets
# Output:
# Available Presets (5):
# ------------------------------------------------------------
# standard_900 Standard Innentür 900mm
# standard_800 Standard Innentür 800mm
# brandschutz_t30 Brandschutztür T30 (EI30)
# nasszelle_750 Nasszelltür 750mm (WC/Bad)
# aussentuer_schwelle Aussentür mit Schwelle
# Run with defaults
python3 grasshopper.py preset standard_900 --Point 0,0,0
# Run with parameter override
python3 grasshopper.py preset standard_900 --Lichthoehe 2200 --Point 1500,0,0
# Show preset details
python3 grasshopper.py preset standard_900 --info
# Validate only
python3 grasshopper.py preset brandschutz_t30 --validate
Templates map friendly names to GH files with defaults and validation:
python3 grasshopper.py templates
Edit config/presets.yaml to add your own: