Almond MCP
Almond MCP is a semantic design layer for Rhino 8 that enables AI-assisted architectural and structural design with spatial awareness, curated asset libraries, and validated layouts.
Rhino Script Execution
Send C# RhinoCommon scripts directly to Rhino 8 for execution, returning created object GUIDs.
IKEA Furniture Library
Browse, search, and retrieve IKEA furniture with real-world dimensions; place models into Rhino as reusable block instances.
Architectural Drawing Assets
List, search, and place entourage/graphic proxy assets (trees, people, symbols); import AutoCAD-style
.pathatch patterns.
Diagram Assets
List, search, and place vector/CAD diagram assets (SVG, DWG, DXF) such as people and symbols.
Drawing Recipes & Styles
List and apply audited layer hierarchies, plot weights, colors, and linetypes for architectural drawings.
Grasshopper / Karamba Structural Analysis
Discover and run audited Grasshopper capsules with typed input/output contracts; validate AI-generated geometry against Karamba3D structural analysis (beam, truss, shell, frame, canopy, gridshell, membrane, highrise).
Scene Ledger & Layout Management
Create persistent design scenes and rooms with 3D bounding boxes; register/move asset instances; run R-tree broad-phase collision and room-containment checks before committing layouts.
Generation Planning
Create, retrieve, and update dependency-ordered generation plans for house, interior, structure, or drawing tasks.
Publishing to Chestnut
Export selected Rhino objects as GLB with physics metadata (body type, collider, mass, scale) to the Chestnut platform, with semantic defaults or granular control.
System Status
Check diagnostics for the local SQLite structured retrieval system (FTS5 full-text search + R-tree spatial indexes).
Allows searching and placing IKEA furniture assets in Rhino, using a library of curated IKEA Singapore products with dimensional metadata.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Almond MCPsearch IKEA furniture for compact sofa"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Almond MCP for Rhino
Almond exposes Rhino 8 and a semantic design layer as MCP tools: curated furniture/drawing/diagram libraries with spatial contracts, audited Karamba capsules, structured retrieval (SQLite FTS5 + R-tree scene ledger), script execution over a TCP bridge, and publishing into Chestnut.
What Almond is
Most Rhino MCP servers give the model a single power: run a script. That demos well, but generation is blind — the model has no memory of what is already in the scene, no real-world dimensions, no constraints, and no way to check its own work. The result is geometry that looks plausible and measures wrong.
Almond is a semantic layer around Rhino, built so a language model can design with spatial awareness and produce high-detail, high-fidelity output:
A persistent scene ledger (SQLite) — scenes, rooms, placed instances, delta-based revisions. The model queries the current state instead of guessing it.
Curated asset libraries with spatial contracts — every furniture and drawing asset carries its real catalogue dimensions plus an authored contract: anchor point, floor footprint, functional clearances (e.g. 900 mm in front of a bookcase), collision shape, placement priority. Placement respects ergonomics, not just bounding boxes.
Structured retrieval — FTS5 natural-language search and R-tree spatial indexes, isolated per library, returning compact asset cards sized for a model's context window.
Layout validation — an R-tree broad-phase overlap and room-containment check the model can run before committing a layout.
Audited Karamba capsules — typed input/output contracts (
ALMOND_IN_*/ALMOND_OUT_*) over structural Grasshopper definitions, so generated structures get real displacement/utilization feedback.Drawing recipes — layer hierarchies, plot weights, and linetype standards applied as one command, so output reads as an architectural drawing rather than raw curves.
Script execution and GLB publishing — the raw
execute_rhino_scriptpower is still there, plus one-call publishing of selected geometry into Chestnut with physics metadata.
The design goal: the model composes from verified parts and validated layouts instead of hallucinating geometry.
Two pieces work together:
almond-mcp(this Python package, on PyPI) — the MCP server Claude talks to. Holds the semantic layer; needs no Rhino SDK.almondbridge(a Rhino 8 plugin, on the Rhino Package Manager) — listens on127.0.0.1:5000(local only) inside Rhino and executes what the server sends. Starts automatically with Rhino.
Related MCP server: GH_mcp_server
Setup, step by step
Fresh machine to working in about five minutes. You need Rhino 8 on Windows and a Claude that supports MCP (Claude Desktop or Claude Code).
Install the bridge. In Rhino 8 run
_PackageManager, searchalmondbridge, install, restart Rhino. You should seeRhinoAlmondBridge: TCP listener started on port 5000in the command history — no command needed. (AlmondMCPStatuschecks it any time.)Install uv (Python not required — uv manages everything):
winget install astral-sh.uvRegister the server with Claude.
Claude Desktop: edit
%APPDATA%\Claude\claude_desktop_config.json:{ "mcpServers": { "Almond": { "command": "uvx", "args": ["almond-mcp"] } } }Claude Code:
claude mcp add Almond -- uvx almond-mcp
Restart Claude. The Almond tools (
execute_rhino_script,search_ikea_furniture,create_design_scene, …) appear in the tool list. First run creates%LOCALAPPDATA%\Almondwith the library manifests and the scene database.Check the plumbing (Rhino open):
uvx almond-mcp doctorPopulate the asset libraries (optional — everything except model placement works without it). The manifests ship with the package, but the model files are 3D Warehouse content that cannot legally be redistributed (see
THIRD-PARTY-NOTICES.md), so each user downloads them from the original source pages:uvx almond-mcp fetch-assets --open # opens each missing model's source page uvx almond-mcp fetch-assets # re-run to verify sha256 checksumsSave each download into the library's
models/folder under the exact file name shown; the command verifies every checksum.Optional extras: Karamba3D 3.1 enables
validate_structure(found at runtime — never bundled); pointRHINO_MCP_LIBRARY_DIRat your own Grasshopper definition library to expose it vialist_library.
CLI
almond-mcp start the MCP server (also: almond-mcp serve)
almond-mcp fetch-assets report missing/invalid model files and their sources
almond-mcp doctor check directories, manifests, state DB, bridge port
almond-mcp paths print every resolved directoryDirectory resolution order: RHINO_MCP_* environment variable → repository
checkout (development) → %LOCALAPPDATA%\Almond (installed). Overridable
locations:
Environment variable | Default folder |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rhino to Chestnut
After execute_rhino_script returns the GUIDs it created, publish only those
objects with:
publish_to_chestnut(
guids=[...],
asset_name="Timber Pavilion"
)This preferred tool applies semantic defaults automatically. Its optional
behavior presets are architecture, object, and animated. Use the
lower-level tool only when explicit physics control is needed:
publish_objects_to_chestnut(
guids=[...],
asset_name="Timber Pavilion",
asset_id="timber-pavilion-01",
body_type="static",
collider="box",
preserve_scale=true,
mass=0
)The tool:
asks Rhino 8 to export the supplied GUIDs as GLB;
explicitly maps Rhino Z-up to glTF Y-up;
uploads the GLB and its source/physics metadata to Chestnut;
creates or updates the stable
asset_id; andremoves the temporary GLB after publishing.
Reusing an asset_id updates the geometry while Chestnut placements continue
to reference the same asset URL.
Chestnut defaults to the deployed service at
https://chestnut-mnvo.onrender.com. Override it before starting the MCP
server when local development is required:
$env:CHESTNUT_URL = "http://127.0.0.1:3000"
almond-mcpIKEA furniture library
Almond exposes a controlled IKEA Singapore furniture library:
list_ikea_furniture(category="chair")
search_ikea_furniture(
query="compact living room sofa",
max_width_mm=2000,
exact_dimensions_only=true
)
place_ikea_furniture(
asset_id="ikea-sg-klippan-s49010615",
x=0,
y=0,
z=0,
rotation_degrees=90
)SketchUp files are resolved from the furniture library's manifest.json.
Claude cannot provide arbitrary import paths. Rhino imports each asset once
as a block definition and creates lightweight instances for subsequent
placements. Almond is not affiliated with Inter IKEA Systems B.V.; product
names identify the real products whose catalogue dimensions the manifest
records.
Architectural drawing asset library
Representation-only entourage and graphic proxies live in the independent drawing asset library. They never appear in IKEA searches:
search_drawing_assets(query="landscape tree")
get_drawing_asset(asset_id="context-tree-chinese-elm-a708cff4")
place_drawing_asset(
asset_id="context-tree-chinese-elm-a708cff4",
x=12000,
y=8000
)Audited drawing recipes are stored separately in DrawingRecipes. The first
recipe creates a technical-axon layer hierarchy with plot weights and custom
hidden/overhead linetypes:
list_drawing_recipes()
get_drawing_recipe(recipe_id="technical_axon_v1")
apply_drawing_style(recipe_id="technical_axon_v1")
create_generation_plan(
goal="Produce a technical axonometric",
scope="drawing"
)Structural validation with reports
validate_structure(guids, structure_type, load_kn, material) checks
generated geometry through three pathways in strict order of confidence —
real Karamba 3.1 FEA (api, high), audited capsule templates (medium),
or span-rule heuristics (rule_based, low) — and always labels which one
ran. Pass criteria: deflection ≤ span/250 and utilization below yield.
Every run is recorded in the local state database;
export_structural_report() renders the history to a Markdown report
(inputs, pathway, span/deflection/utilization/reactions, warnings,
PASS/FAIL). Details: docs/structural-validation.md.
Karamba capsules
Audited capsule manifests (capsules/*.capsule.json) declare typed
input/output contracts for structural Grasshopper definitions using reserved
ALMOND_IN_* / ALMOND_OUT_* nicknames — beams, trusses, frames, shells,
gridshells, membranes, canopies, and high-rises. See capsules/AUTHORING.md
to bind your own definitions. Karamba3D itself is user-installed; the bridge
finds it at runtime via reflection.
Structured retrieval and scene state
Almond builds a local SQLite database from the asset manifests at startup. The database provides:
library-isolated dimensional and category filters;
FTS5 natural-language retrieval;
R-tree asset and scene-instance spatial indexes;
stable scene, room, asset, and instance handles;
delta-based scene revisions; and
dependency-ordered generation plans.
Search and list tools return compact asset cards. Full provenance,
footprints, clearances, and source metadata are returned only by
get_ikea_furniture. Geometry and Grasshopper files remain local.
Useful tools:
get_retrieval_status()
create_design_scene(name="Apartment test")
upsert_design_room(
scene_id="scene_...",
name="Living room",
bounds_mm=[0, 0, 0, 6000, 4500, 2800]
)
register_scene_instance(
scene_id="scene_...",
room_id="room_...",
asset_id="ikea-sg-klippan-s49010615",
x_mm=3000,
y_mm=3900
)
validate_scene_layout(scene_id="scene_...")
create_generation_plan(
goal="Generate and furnish a compact house",
scope="house",
scene_id="scene_..."
)The current spatial validator is an R-tree world-AABB broad phase plus room containment. Oriented-footprint, functional-clearance, and automatic resolution passes can build on the same persistent scene ledger.
Development
git clone <repo> almond-mcp
cd almond-mcp
uv run pytest # 23 tests, no Rhino required
uv run almond-mcp doctorOn OneDrive-synced folders set UV_LINK_MODE=copy (OneDrive rejects uv's
hardlinks). Licensing: LICENSE (MIT), THIRD-PARTY-NOTICES.md, and
docs/licensing-audit.md for what may and may not be distributed.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/liangjunglj-cpu/almond-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server