# Rhino Mcp

> MCP Server for Rhino and Grasshopper

- **Type:** MCP server
- **Install:** `agentstack add mcp-easehee-rhino-mcp`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [EaseHee](https://agentstack.voostack.com/s/easehee)
- **Installs:** 0
- **Category:** [Integrations](https://agentstack.voostack.com/c/integrations)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [EaseHee](https://github.com/EaseHee)
- **Source:** https://github.com/EaseHee/rhino-mcp

## Install

```sh
agentstack add mcp-easehee-rhino-mcp
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# rhino-mcp

**Drive McNeel Rhino 8 and Grasshopper from Claude through the Model Context Protocol.**

     

[English](./README.md) · [한국어](./README.ko.md)

---

## Overview

`rhino-mcp` is a Model Context Protocol server that lets Claude (or any MCP client) drive Rhino 8 — creating geometry, manipulating layers and materials, baking Grasshopper output, exporting STEP/IGES/STL/OBJ — through plain natural-language tool calls.
It runs in two modes:

- **Standalone** (default): backed by [`rhino3dm`](https://github.com/mcneel/rhino3dm) for headless `.3dm` file authoring; works without Rhino installed and exposes **~242 tools** (geometry, file-I/O, transform, layer, material, analysis, RhinoScript docs, composition, document hygiene, geometry validation, GH template catalogue, freeform skin / panelisation / curvature / fields, drawing-set sheet + title block, schedule / quantity, block definition, sun-position + shadow projection, BIM metadata tagging, 19 physical material presets, BRE daylight factor + Bird DNI clear-sky model, and multi-Rhino announcement-file discovery).
- **Bridge**: when the C# bridge plugin is loaded in a live Rhino 8 session, the server transparently forwards every call (booleans, lofts, sweeps, viewport image capture + zoom-to-object / zoom-to-layer, render, scripting (Python and gated Roslyn C# with timeouts and extra references), deformation, NURBS editing, SubD, paneling, freeform analysis with true Gaussian curvature, drawing-set view placement + section cuts + PDF export, accurate Brep-area schedules, block explode/redefine, ray-cast solar exposure + Brep ray probe, IFC / gbXML import-export, HDRI environment, camera / light / render / turntable automation, layer-material binding, *and* every Grasshopper operation including batched `connect_many` wiring and slider placement) to RhinoCommon and Grasshopper.Instances, exposing **~245 tools**.

## Features

- **Full geometry catalogue** — points, lines, polylines, arcs, circles, ellipses, polygons, helixes, NURBS curves, rebuilds.
- **Solids and meshes** — boxes, spheres, cylinders, cones, tori, mesh boxes; booleans / sweeps / lofts / fillets via the bridge.
- **Transforms** — move, rotate, scale, mirror, plane-to-plane orient, linear/polar/rectangular arrays.
- **Script execution** — run arbitrary RhinoScript Python (IronPython) or RhinoCommon C# (Roslyn) code in a live Rhino session, with built-in RhinoScript API documentation search (899 functions).
- **Advanced modeling** — deformation (bend/twist/taper/flow), NURBS editing (rebuild/unroll/evaluate), SubD, surface matching, extraction (dup edge/border/isocurve/Make2D), control points, and paneling tools.
- **Drawing-set authoring** — sheet / title block / north arrow / scale bar in standalone; multi-view placement, section cuts, and PDF export through the bridge.
- **Quantity & schedule** — per-layer / per-material / per-`user_text` aggregation with CSV export; bridge mode uses `AreaMassProperties` / `VolumeMassProperties` for accurate Brep area + volume.
- **Block / instance reuse** — define / insert / list blocks in standalone; explode / redefine in bridge mode for synchronized component edits.
- **Environmental analysis** — sun position + monthly sun-path polylines + shadow projection (NOAA SPA approximation); ray-cast solar exposure in bridge mode. Daylight precision adds Bird DNI clear-sky model with Kasten-Young air mass and Linke turbidity, plus BRE simplified daylight factor.
- **BIM interchange** — IFC2x3 / IFC4 / IFC4x3 import & export, gbXML export, and IFC PropertySet metadata tagging that round-trips through `user_text`.
- **Material presets + HDRI** — 19 bundled physical presets (concrete / brick / steel / aluminium / glass / timber / stone / plaster / fabric / landscape) keyed by category; HDRI environment for rendering.
- **Render automation** — camera / light / render-engine setup, render-to-file, and parametric turntable sequences (bridge mode).
- **Undo / redo and batch operations** — every bridge operation is wrapped in undo records; batch modify changes many objects in a single call.
- **Layers, materials, blocks, groups** — full attribute control on the document.
- **File I/O** — open/save `.3dm`, export OBJ/STL standalone; STEP/IGES/DXF and screenshots via the bridge.
- **Inline base64 screenshots** — `rhino_screenshot(as_base64=True)` returns the PNG payload inline for visual verification by the LLM.
- **Rich object selection** — `rhino_object_select` filters by glob name pattern, layer, RGB color, object type, and user-text key/value pairs.
- **Pagination on bulk queries** — `rhino_list_objects` returns a `pagination: {total, offset, limit, returned, has_more}` block so large documents stay manageable.
- **Scene composition shortcuts** (v0.2) — `rhino_place_grid`, `rhino_stack_floors`, `rhino_scatter`, `rhino_replicate_along_curve` collapse "loop + transform" into a single tool call.
- **Document hygiene tools** (v0.2) — query/set units, tolerances, and base point (`rhino_document_units_*`, `rhino_tolerance_*`, `rhino_origin_set`); `rhino_document_summary` exposes them so the LLM can verify scale before issuing geometry calls.
- **Geometry validation** (v0.2) — `rhino_validate_brep`, `rhino_report_mesh_health`, `rhino_curve_continuity`, plus `rhino_check_naked_edges` (bridge) for explicit topology diagnostics before booleans / exports.
- **Grasshopper template loader** (v0.2) — `gh_template_list` reads a manifest of pre-wired definitions; `gh_load_template`, `gh_bind_template_parameter`, `gh_run_template` (bridge) load, parameterise, and bake them.
- **Free-form architecture toolkit** — `rhino_skin_from_sections`, `rhino_uv_grid_panels`, `rhino_panel_planarity`, `rhino_panel_curvature_classify`, `rhino_surface_developable_score`, `rhino_attractor_displace_points`, `rhino_smooth_polyline`. Bridge mode adds true Gaussian / mean / principal curvature, world-axis slicing, and waffle ribs.
- **Strategy prompts for the LLM** — seven `@mcp.prompt()` guides (`general_strategy`, `rhinoscript_workflow`, `viewport_workflow`, `parametric_workflow`, `bim_authoring_workflow`, `design_dialogue_workflow`, `freeform_workflow`) help Claude pick the right tool, avoid hallucinated APIs, and keep the user in the loop on design decisions.
- **Async-capable tools** — read-only query tools run on `async def` so concurrent bridge round-trips don't stall the MCP transport.
- **Robust connection layer** — JSON-RPC over named pipe / Unix socket / TCP with `MSG_PEEK` liveness probes and exponential backoff with jitter on reconnect.
- **Grasshopper automation** — open `.gh` files, drop components, wire them, set sliders/panels/toggles, run, bake, read DataTrees.
- **Three transports** — stdio (Claude Desktop), Streamable HTTP, Docker/TCP.
- **Capability-aware registration** — bridge-only tools are simply not registered when no bridge is reachable; no stub functions, ever.
- **Actionable errors** — every failure carries a category, a remediation hint, and details the agent can act on.

## Architecture

```
┌──────────────┐     stdio | HTTP     ┌────────────────┐
│  Claude /    │ ◀──────────────────▶ │   rhino-mcp    │
│  MCP client  │                      │   (Python)     │
└──────────────┘                      └─────┬──────────┘
                                            │
                              JSON-RPC 2.0  │   (named pipe / unix socket / TCP)
                                            │
                                  ┌─────────▼──────────┐
                                  │  C# Bridge Plugin  │
                                  │  (inside Rhino 8)  │
                                  │  ────────────────  │
                                  │  RhinoCommon       │
                                  │  Grasshopper       │
                                  │  Roslyn (C# exec)  │
                                  │  IronPython (Py)   │
                                  └────────────────────┘
```

In **standalone** mode the right-hand side is replaced by an in-process `rhino3dm.File3dm` document; bridge-only tools are unregistered.

## Requirements

- Python 3.11 or newer
- `rhino3dm >= 8.9`, `mcp[cli] >= 1.2`, `pydantic >= 2.6` (installed automatically)
- Optional: McNeel Rhino 8 (any platform) — needed only for bridge mode
- Optional: .NET 8 SDK — to build the C# bridge plugin (`dotnet build`)
- Optional: `pywin32` on Windows for the named-pipe transport

## Installation

### Using uv (recommended)

```bash
uv tool install rhino-mcp
# or, from a checkout:
uv sync && uv run rhino-mcp
```

### Using pip

```bash
pip install rhino3dm-mcp
rhino-mcp --version
```

### One-shot Claude Desktop wiring

After installing the package, register the server with Claude Desktop in a single command instead of editing `claude_desktop_config.json` by hand:

```bash
rhino-mcp install                         # auto-detect launcher (uvx / rhino-mcp / python)
rhino-mcp install --mode bridge           # force bridge mode in the env block
rhino-mcp install --force                 # overwrite an existing entry
rhino-mcp install --dry-run               # preview the JSON without writing
```

The command writes a timestamped `.bak.*` copy of the existing config before saving, and is idempotent — re-running with the same flags is a no-op.
Restart Claude Desktop afterwards to pick up the change.

#### From inside Rhino — `_McpInstall`

If the bridge plugin is loaded, type `_McpInstall` on the Rhino command line.
The command is non-interactive: it locates `uvx` / `rhino-mcp` / `python` on `PATH` (with `~/.local/bin`, `~/.cargo/bin`, `/opt/homebrew/bin`, and `/usr/local/bin` searched on macOS so the GUI-app `PATH` is enough), runs the same install pipeline as `rhino-mcp install`, and streams the outcome to the Rhino command line.
The MCP server is registered with `--mode auto` so Claude Desktop attaches to the bridge when Rhino is running and falls back to standalone (rhino3dm) when it is not.

### Docker

```bash
docker compose -f docker/docker-compose.yml up --build
```

The container exposes the server over Streamable HTTP on TCP `:8765`.

## Running the server

`rhino-mcp` is normally launched by an MCP client (Claude Desktop / Cursor / claude.ai connector) via the `command + args` you put into the client's config.
You can also run it manually for debugging.

### Launch modes

| Use case                                | Command                                                                        |
|-----------------------------------------|--------------------------------------------------------------------------------|
| Stdio (Claude Desktop default)          | `uvx rhino3dm-mcp` *or* `rhino-mcp`                                            |
| Streamable HTTP (local dev / Cursor)    | `rhino-mcp --transport http --host 127.0.0.1 --port 8765`                      |
| Streamable HTTP (claude.ai connector)   | `rhino-mcp --transport http --host 0.0.0.0 --port 8765 --allow-external --stateless` |
| Docker (HTTP on `:8765`)                | `docker compose -f docker/docker-compose.yml up --build`                       |
| Force standalone (no Rhino needed)      | `RHINO_MCP_FORCE_MODE=standalone rhino-mcp`                                    |
| Force bridge (fail fast if Rhino down)  | `RHINO_MCP_FORCE_MODE=bridge rhino-mcp`                                        |
| Force bridge with HTTP fallback         | `RHINO_MCP_FORCE_MODE=bridge RHINO_MCP_BRIDGE_OPTIONAL=1 rhino-mcp --transport http` |
| Show all CLI flags                      | `rhino-mcp --help`                                                             |

The HTTP endpoint is `http://:/mcp`.
Use `--allow-external` only when exposing the server through ngrok / Cloudflare Tunnel / etc.
— it disables DNS-rebinding protection.

### Claude Desktop (stdio)

`claude_desktop_config.json` lives at:

| OS      | Path                                                                                    |
|---------|-----------------------------------------------------------------------------------------|
| macOS   | `~/Library/Application Support/Claude/claude_desktop_config.json`                       |
| Windows | `%APPDATA%\Claude\claude_desktop_config.json`                                           |
| Linux   | `~/.config/Claude/claude_desktop_config.json`                                           |

Paste this entry under `mcpServers`:

```json
{
  "mcpServers": {
    "rhino-mcp": {
      "command": "uvx",
      "args": ["rhino3dm-mcp"],
      "env": {
        "RHINO_MCP_TRANSPORT": "stdio",
        "RHINO_HOST": "127.0.0.1",
        "RHINO_PORT": "4242",
        "RHINO_MCP_LOG_LEVEL": "INFO"
      }
    }
  }
}
```

Prefer a checkout?
Point `command` at `uv` and run from the repo:

```json
{
  "mcpServers": {
    "rhino-mcp": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/rhino-mcp", "run", "rhino-mcp"],
      "env": { "RHINO_MCP_LOG_LEVEL": "DEBUG" }
    }
  }
}
```

Restart Claude Desktop; the rhino-mcp tools and the three strategy prompts (`general_strategy`, `rhinoscript_workflow`, `viewport_workflow`) appear in the palette.

### Cursor IDE

Cursor reads `~/.cursor/mcp.json` (global) or `/.cursor/mcp.json` (per-project):

```json
{
  "mcpServers": {
    "rhino-mcp": {
      "command": "uvx",
      "args": ["rhino3dm-mcp"],
      "env": { "RHINO_MCP_FORCE_MODE": "bridge" }
    }
  }
}
```

### claude.ai remote connector (Streamable HTTP)

1. Run the server with HTTP + external access:

   ```bash
   rhino-mcp --transport http --host 0.0.0.0 --port 8765 --allow-external --stateless
   ```

2. Tunnel it (e.g. `ngrok http 8765`) and grab the public HTTPS URL.

3. In claude.ai → Settings → Connectors → *Add custom connector*, set the URL to `https:///mcp`.

### Generic stdio MCP clients

Any MCP-compatible client (mcp-inspector, Continue, Claude Code, etc.) that can spawn a subprocess will work — give it `uvx rhino3dm-mcp` or the path to your `rhino-mcp` entry-point and inherit env vars from the table below.

### Rhino-side bridge plugin (C# — recommended)

Build and install the C# plugin for full 235 tool support.
The included helper script wraps `dotnet build` and verifies the post-build install location:

```bash
./scripts/build-plugin.sh             # debug build + install
./scripts/build-plugin.sh --release   # release build
./scripts/build-plugin.sh --clean     # clean + rebuild

# Or invoke dotnet directly:
dotnet build rhino_plugin/csharp/RhinoMCPPlugin.csproj -c Release
```

Post-build targets copy the `.rhp`:

| OS      | Path                                                                                  |
|---------|---------------------------------------------------------------------------------------|
| macOS   | `/Applications/Rhino 8.app/Contents/PlugIns/rhino-mcp.rhp`                       |
| Windows | `%APPDATA%/McNeel/Rhinoceros/8.0/Plug-ins/rhino-mcp/rhino-mcp.rhp`           |

Restart Rhino 8 — the bridge starts automatically on load (TCP `:4242` by default).
Then restart `rhino-mcp` (or set `RHINO_MCP_FORCE_MODE=bridge`) and the bridge-only tools become available.

## Quick start

```python
# After "rhino-mcp" is configured in Claude Desktop, ask Claude:
#   "Create a 10-unit sphere at the origin and save the document to /tmp/demo.3dm"
# Behind the scenes Claude calls rhino_sphere → rhino_save.
```

### Strategy prompts

Three MCP prompts are registered automatically and surfaced in the client's prompt picker:

| Prompt                  | When to use                                                                                  |
|-------------------------|----------------------------------------------------------------------------------------------|
| `general_strategy`      | Decision tree for orienting in a document → choosing the right tool → best practices.        |
| `rhinoscript_workflow`  | Mandatory steps **before** invoking `rhino_execute_python` so the LLM doesn't hallu

…

## Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [EaseHee](https://github.com/EaseHee)
- **Source:** [EaseHee/rhino-mcp](https://github.com/EaseHee/rhino-mcp)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** yes
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-easehee-rhino-mcp
- Seller: https://agentstack.voostack.com/s/easehee
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
