Skip to main content

AI-powered Rhino3D MCP bridge — connect Claude to Rhinoceros 3D

Project description

keratin

Connect Claude AI to Rhinoceros 3D.

keratin is a Model Context Protocol bridge for Rhino 7. It lets Claude create geometry, manage layers, run boolean operations, drive Grasshopper, and execute arbitrary RhinoScript — all from a conversation.

Part of the lineforge tool family.


How it works

keratin is two components that talk to each other over a local TCP socket:

Claude ──MCP──▶ keratin (host, Python 3)  ──TCP:9876──▶  rhino_script.py (Rhino, IronPython 2.7)
  1. rhino_script.py runs inside Rhino as an IronPython script. It listens for commands and executes them safely on Rhino's main thread.
  2. keratin (the MCP server) runs on your machine and exposes 40+ tools to Claude via the Model Context Protocol.

Installation

Step 1 — Rhino-side script (via Rhino Package Manager)

In Rhino: Tools → Package Manager → search keratin → Install → Restart Rhino

Step 2 — MCP server (install from source)

git clone https://github.com/aarik/keratin
cd keratin
pip install .

Step 3 — Configure your MCP client

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "rhino": {
      "command": "keratin"
    }
  }
}

Claude Code:

claude mcp add rhino -- keratin

Step 4 — Load the listener in Rhino

In Rhino, run RunPythonScript and select the installed rhino_script.py.

Optional — auto-start on Rhino launch: Tools → Options → General → Startup Commands → add:

RunPythonScript "C:\path\to\rhino_script.py"

Tool surface

Category Tools
Scene get_document_summary, get_rhino_scene_info, get_rhino_layers, capture_rhino_viewport
Objects get_objects, get_object_info, create_object, modify_object, delete_object, select_objects, add_rhino_object_metadata, get_rhino_objects_with_metadata, get_rhino_selected_objects
Layers create_layer, delete_layer, get_or_set_current_layer
Geometry boolean_union, boolean_difference, boolean_intersection, loft, extrude_curve, sweep1, offset_curve, pipe
Curves trim_curve, join_curves, curve_domain, trim_curve_by_fraction
Jewelry ring_blank, head_blank, section_profile, place_head_on_band, edge_selector_presets, safe_boolean_union, safe_boolean_difference, loft_sections
Grasshopper grasshopper_add_components, grasshopper_get_definition_info, grasshopper_run_solver, grasshopper_clear_canvas, grasshopper_list_available_components
Code execution execute_rhinoscript_python_code, execute_rhino_code
Discovery list_rhino_commands, list_rhinoscript_functions, look_up_RhinoScriptSyntax

Requirements

  • Rhinoceros 3D 7 (IronPython 2.7)
  • Python 3.10+ on the host machine
  • Claude Desktop or Claude Code as the MCP client

Web server variant

For HTTP/WebSocket access instead of stdio:

keratin-web --host localhost --port 8000

Endpoints: POST /rhino/command, GET /rhino/scene, WS /ws


Diagnostics

# Check the Rhino TCP connection
python tools/ops/diagnose_rhino_connection.py

# View recent errors across all logs
python tools/ops/log_manager.py --since-minutes 60 --level ERROR

Logs are written to ./logs/ (server / rhino / diagnostics).


Building & publishing

PyPI (MCP server):

python -m build
python -m twine upload dist/*

Yak (Rhino Package Manager):

The Yak package bundles the Rhino-side IronPython listener (rhino_script.py) for distribution via Rhino's built-in Package Manager.

Prerequisites:

Package contents (yak-package/ directory):

File Purpose
manifest.yml Package metadata (name, version, author, description)
rhino_script.py The IronPython listener that runs inside Rhino
icon.png Package icon shown in Package Manager (128×128 px recommended)

Build steps:

  1. Update the version in yak-package/manifest.yml if needed.

  2. Build the .yak archive:

cd yak-package
"C:\Program Files\Rhino 7\System\yak.exe" build

This produces a file named keratin-<version>-any-any.yak in the current directory.

  1. Verify the package contents:
"C:\Program Files\Rhino 7\System\yak.exe" contents keratin-0.1.0-any-any.yak

Publish to the Yak feed:

# First-time login (opens browser for McNeel SSO)
"C:\Program Files\Rhino 7\System\yak.exe" login

# Push the package
"C:\Program Files\Rhino 7\System\yak.exe" push keratin-0.1.0-any-any.yak

The filename suffix any-any means the package targets any platform and any Rhino version. After pushing, the package appears in Rhino's Package Manager within a few minutes.


Attribution

keratin is built on the shoulders of:

  • rhino-mcp by Reer — MIT License
  • rhinomcp by Jingcheng Chen — Apache License 2.0

See THIRD_PARTY_NOTICES.md and the preserved license texts under third_party/.


Disclaimer

Not affiliated with McNeel & Associates. Use at your own risk. Always work on copies of important files.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

keratin-0.1.0.tar.gz (71.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

keratin-0.1.0-py3-none-any.whl (79.1 kB view details)

Uploaded Python 3

File details

Details for the file keratin-0.1.0.tar.gz.

File metadata

  • Download URL: keratin-0.1.0.tar.gz
  • Upload date:
  • Size: 71.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for keratin-0.1.0.tar.gz
Algorithm Hash digest
SHA256 83ee64a20d48cea2307d613351f86589d3cc45324ca1d5a3dca758484b5396e5
MD5 380f20cb15a32ad46bff4c59d39fc9eb
BLAKE2b-256 81bf98f238a9ae58b46f6942027ec245b0f7ea27fc189e4c3bda24c300c148dd

See more details on using hashes here.

File details

Details for the file keratin-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: keratin-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 79.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for keratin-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 50d7d958072e751bccf35385e7331fd6bd5fe1323fc486a2a38a0b072b5b9cbb
MD5 1dc8c0e7612af8c6b88e23ec3cbc631b
BLAKE2b-256 b00ad351213419728f47d57ea638717633fb6c706c12866146091204e64781ad

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page