Install
$ agentstack add mcp-kenlp-revitmcpserver ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ● Filesystem access Used
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Revit MCP Server
> A custom Model Context Protocol server that lets Claude (Desktop, Code, > or any MCP client) drive Autodesk Revit 2025, 2026 & 2027 — read the model, > create & edit elements, and run multi-step operations as a single undoable > Transaction.
> Author: KenLP
Claude Desktop / Claude Code ──stdio──▶ revit-mcp-server (Node) ──HTTP──▶ RevitMCPAddin ──ExternalEvent + Transaction──▶ Revit 2025/2026/2027
- C# addin (.NET 8 for R2026, .NET 10 for R2027) runs inside Revit,
owns transactions, marshals work onto the main UI thread via IExternalEventHandler. Auto-assigns a unique port per Revit version so multiple versions can run side-by-side.
- TypeScript MCP server is a thin stdio bridge: every tool just forwards
to a small HTTP API on the addin.
- Curated, schema-validated tool surface — no eval-style escape hatch,
every write is a named Transaction you can review and undo.
- Batch transaction pattern — fold N steps into one atomic Revit undo
entry; rollback on first failure.
For the design rationale and the answer to "why not just wrap every Revit API?", read [docs/API_COVERAGE.md](docs/API_COVERAGE.md).
Status
v0.8.35 — 101 C# commands (91 exposed as MCP tools + 10 hidden) + 1 batch tool + 2 workflow recipes = 94 MCP tools. Hidden = create_spot_elevation + the 9-command spatial_* HTTP pack, registered for HTTP /mcp use but off the MCP tool surface. Supports Revit 2025 (.NET 8), Revit 2026 (.NET 8) and Revit 2027 (.NET 10) with auto-port assignment for side-by-side use. Features: dry-run mode, structured diffs, auth token, per-tool risk levels, Family & FamilySymbol rename, linked-file element reading, clash/clearance detection (host + linked-file raycast, multi-point centreline sampling), view image export, view manipulation (duplicate, section-box, isolate), MEP Space listing, element type swapping, view template application, parameter copy across elements, schedule filters/sort/CSV export, level elevation editing, PDF export, room containment (phase-aware FromRoom/ToRoom/Room batch lookup for doors, furniture, fixtures), annotation tagging (tag single element, tag-all-not-tagged by category, list tags in view), model health report (one-shot scorecard: warnings + warning/element ratio, file size, imported/linked CAD, PDF/raster, RVT links, point clouds, in-place families, groups, unused views, purgeable elements), workset audit (per-workset element counts, empty-workset detection). See [docs/ROADMAP.md](docs/ROADMAP.md).
| Layer | Build target | Status | | ------------ | ------------------------- | ------ | | Revit addin | Revit 2025 / .NET 8 | ✅ CI-tested | | Revit addin | Revit 2026 / .NET 8 | ✅ | | Revit addin | Revit 2027 / .NET 10 | ✅ | | MCP server | Node 22 / TypeScript 5 | ✅ |
Tool surface (91 commands + 1 batch + 2 recipes = 94 MCP tools)
Diagnostics (3)
revit_ping | revit_get_version | revit_get_document_info
Inspection / Introspection (31 read-only)
revit_list_elements | revit_get_element_info | revit_find_element_by_unique_id | revit_query_where | revit_find_elements | revit_get_parameter | revit_list_levels | revit_list_wall_types | revit_list_floor_types | revit_list_categories | revit_list_families | revit_list_family_types | revit_list_sheets | revit_list_rooms | revit_list_spaces | revit_list_materials | revit_list_phases | revit_list_view_templates | revit_get_views | revit_get_active_view | revit_get_selected_elements | revit_get_linked_files | revit_get_element_geometry | revit_get_linked_elements | revit_get_view_image | revit_get_element_rooms | revit_export_view_pdf | revit_get_model_health | revit_get_worksets | revit_get_schedule_data | revit_get_doors
Coordination / Clash (1 read-only)
revit_check_clearance
Creation: Architecture (10 write)
revit_create_wall | revit_create_floor | revit_create_level | revit_create_grid | revit_create_room | revit_create_column | revit_create_beam | revit_create_ceiling | revit_create_opening_in_wall | revit_place_family_instance
Creation: Documentation (9 write)
revit_create_sheet | revit_place_view_on_sheet | revit_create_floor_plan_view | revit_create_section_view | revit_create_3d_view | revit_create_perspective_view | revit_create_schedule | revit_tag_element | revit_create_text_note
Annotation & Detailing (5 read/write)
revit_tag_all_in_view | revit_get_tags_in_view | revit_create_aligned_dimension | revit_create_detail_line | revit_create_filled_region
Edit: Parameters, Types & Naming (9 write)
revit_set_parameter | revit_set_parameter_batch | revit_update_where | revit_import_parameters | revit_rename_element | revit_change_element_type | revit_apply_view_template | revit_copy_parameters | revit_configure_schedule
Edit: Levels & Export (1 write)
revit_set_level_elevation
Edit: Transform (5 write)
revit_move_element | revit_rotate_element | revit_copy_element | revit_mirror_element | revit_array_linear
Edit: Delete & Group (3 write)
revit_delete_elements | revit_group_elements | revit_ungroup_elements
Family (2 write)
revit_load_family | revit_duplicate_family_type
View Manipulation (12 write / UI)
revit_open_view | revit_set_view_detail_level | revit_hide_elements_in_view | revit_unhide_elements_in_view | revit_select_elements | revit_zoom_to_elements | revit_apply_view_filter | revit_color_override_by_param | revit_override_element_graphics | revit_duplicate_view | revit_set_section_box | revit_isolate_elements_in_view
Batch (1)
revit_batch — run multiple commands inside ONE Revit Transaction (single undo entry).
Workflow recipes (2)
revit_recipe_model_health_triage — read-only: health scan → prioritized, actionable triage list. revit_recipe_clash_review — read-only: coordination clash sweep across many element-set pairs (host vs host or host vs linked RVT) → consolidated, prioritized clash report. Recipes orchestrate verified kernel commands in the Node layer; they are the P4 workflow surface.
Full schemas and examples: [docs/COMMANDS.md](docs/COMMANDS.md).
Ribbon panel (optional, and inert on its own)
Installing the add-in also adds one ribbon tab, AutoAudit, with a dockable panel. It is not a feature of this add-in by itself: the panel is a WebView2 browser pointed at a local service, so with nothing listening on the port it shows a connection error. That is the service being absent, not the add-in being broken.
| Ribbon tab | Loads by default | Service | Config file (per Revit version) | | ---------- | ---------------- | ------- | ------------------------------- | | AutoAudit | http://127.0.0.1:8601/ui/ | KenLP/autoaudit-bim | revit-mcp-panel.json |
Override the URL by dropping the config file into %APPDATA%\Autodesk\Revit\Addins\\:
{ "url": "http://127.0.0.1:9000/ui/" }
The installer never writes or deletes these files, so a URL you set survives every upgrade. A missing or malformed file falls back to the default above.
A blank panel or a connection error almost always means the service is not running, or its web UI was never built — check the service's own README for the build step before filing anything here.
A second panel of your own (opt-in)
The add-in can host one more dockable panel for any local web UI you run, but only if you ask for it: nothing appears unless revit-mcp-extra-panel.json exists in the same folder and names a URL.
{
"url": "http://127.0.0.1:9000/ui/", // required — http(s) only
"label": "My Tool", // pane + button name (default "Extra Panel")
"tab": "My Tool", // ribbon tab (default = label; "AutoAudit" shares that tab)
"enabled": true // set false to hide it without deleting the file
}
No file, no url, or "enabled": false → no tab, no pane, nothing registered. The add-in ships nothing for this panel to show; it is only a browser onto the URL you give it.
Ignore the tab entirely if you only want the MCP tool surface. Panels are additive: nothing in the tool surface depends on them, and a panel that fails to load cannot take the MCP server down with it.
Tool profiles (token efficiency)
Exposing all 94 tools to every conversation costs tokens and degrades tool-selection accuracy. Set the REVIT_MCP_PROFILE env var to a comma-separated list to expose only the groups you need; core (ping, doc/element info, find, batch) is always included. Unset = all tools (default, backward compatible).
| Profile | Tools | For | | ------- | ----- | --- | | core | 8 (always on) | ping, document/element info, find, batch | | inspection | 23 | list_* / get_* read-only queries (incl. schedule data, door swing) | | model-health | 2 | get_model_health, get_worksets | | recipes | 2 | workflow recipes (model-health triage, clash review) | | coordination | 1 | check_clearance | | architecture | 10 | wall/floor/level/grid/room/column/beam/ceiling/opening/family | | documentation | 16 | sheets, views, schedules, tags, text, PDF, dimensions, detail lines, filled regions | | editing | 17 | parameters, type swap, transform, delete, group, family load/duplicate | | view | 11 | open/hide/isolate/filter/override/section-box |
// e.g. a documentation + view client (a subset instead of all 93):
{ "mcpServers": { "revit": {
"command": "node", "args": ["dist/index.js"],
"env": { "REVIT_MCP_VERSION": "2027", "REVIT_MCP_PROFILE": "documentation,view" }
}}}
Repo layout
RevitMCPServer/
├── README.md ← you are here
├── LICENSE ← MIT
├── CHANGELOG.md
├── docs/
│ ├── ARCHITECTURE.md ← three-layer design, threading, observability
│ ├── COMMANDS.md ← every command's schema + envelope
│ ├── API_COVERAGE.md ← what we wrap, what we don't, why
│ ├── COMPATIBILITY.md ← Revit/.NET/Node support + port matrix
│ ├── SMOKE_TESTING.md ← live-Revit smoke suite + golden fixtures
│ ├── TROUBLESHOOTING.md ← common failures and fixes
│ └── ROADMAP.md ← phase tracker
├── scripts/
│ ├── check-version.mjs ← CI gate: version + tool-count consistency
│ └── smoke-test.ps1 ← live-Revit smoke test
└── src/
├── RevitMCP.Core/ ← portable kernel: dispatcher + 101 commands
│ ├── RevitMCPExternalEventHandler.cs
│ └── Commands/ ← one IRevitCommand per tool
├── RevitAddin/ ← C# addin host (in-Revit, .NET 8/10)
│ ├── App.cs
│ ├── Server/McpHttpServer.cs ← /mcp, /mcp/batch, /commands, /health, /stats
│ ├── Server/RequestLog.cs ← structured request log
│ ├── Server/ServerMetrics.cs ← counters behind /stats
│ ├── RevitMCPAddin.csproj
│ └── RevitMCPAddin.addin
└── McpServer/ ← TypeScript MCP stdio server
├── src/index.ts ← tool declarations + profiles
├── src/revitClient.ts
├── package.json
└── tsconfig.json
Install (recommended) — one-step installer
Everything is in a single download; no cloning or compiling.
- Download
RevitMCPServer-v.zipfrom the
latest release (the combined bundle — not the -R2025/-R2026/-R2027 per-version zips).
- Close Revit (the installer replaces the add-in DLL).
- Extract the zip, then right-click
install.ps1→ Run with PowerShell
(or, in a PowerShell window: .\install.ps1).
- Restart Revit, then restart Claude Desktop.
install.ps1 with no arguments auto-detects which Revit versions (2025 / 2026 / 2027) you have installed, deploys the matching add-in to each, installs the MCP server to %LOCALAPPDATA%\RevitMCPServer, and merges a revit- entry into your Claude Desktop config — backing it up first and leaving every other MCP server untouched.
Only prerequisite: Node.js 18+ on your PATH, for the Claude bridge. (The add-in itself works over its local HTTP API without Node — Node is only needed for Claude Desktop/Code to talk to it, and a missing Node is a warning, not a failure.)
Other MCP clients (Codex, Gemini, Cursor)
By default the installer configures Claude Desktop. Point it at a different client with -Client (one or more of claude, gemini, cursor, codex):
.\install.ps1 -Client codex # OpenAI Codex CLI
.\install.ps1 -Client claude,gemini,cursor,codex # all of them
Each client's config is merged in place (backed up first), leaving its other servers untouched:
| Client | Config file | Format | | ------ | ----------- | ------ | | claude | %APPDATA%\Claude\claude_desktop_config.json | JSON mcpServers | | gemini | %USERPROFILE%\.gemini\settings.json | JSON mcpServers | | cursor | %USERPROFILE%\.cursor\mcp.json | JSON mcpServers | | codex | %USERPROFILE%\.codex\config.toml | TOML [mcp_servers.*] |
The server is the same stdio program for every client — only where each keeps its config differs. Cloud-only clients that can't launch a local process (e.g. web ChatGPT) can't reach the loopback add-in; use a local client (Codex CLI, Claude, Cursor, Gemini CLI) on the same machine as Revit.
Options:
.\install.ps1 -RevitVersions 2027 # only one version
.\install.ps1 -NoClientConfig # don't touch any client config, just print the snippet
.\uninstall.ps1 # remove add-in, server, and the revit- config entries
Verify: open Revit, then run the health check (7890 = R2025, 7891 = R2026, 7892 = R2027):
Invoke-RestMethod http://127.0.0.1:7891/health
# → ok=True, service=revit-mcp-addin, version=0.8.35, authEnabled=True
Then restart Claude Desktop. The server shows up under Connectors (the + menu → Connectors) as revit-2026 / revit-2027, toggled on — open Tool access there to see the 89 revit_* tools per version. (Older Claude builds showed these under a 🔨 tools icon instead.)
Build from source — advanced
Most users should use the one-step installer above. Build from source only to run an unreleased commit or to hack on the code. Every step is copy-paste into PowerShell on Windows.
Step 0 — What you'll install
| Tool | Why | Download | | --------------------- | ------------------------------------------ | -------------------------------------------------------------- | | Autodesk Revit 2025, 2026 or 2027 | The app the addin plugs into | Autodesk account (you already have this) | | .NET 8 SDK (R2025/R2026) or .NET 10 SDK (R2027) | Compiles the C# addin | (or /10.0) | | Node.js 22 (LTS) | Runs the MCP bridge | | | Git | Downloads this repo | | | Claude Desktop (or Claude Code) | Your MCP client | |
Install each of the above with the default options. Reboot is not required, but open a fresh PowerShell window after installing them so the PATH picks up dotnet, node, and git.
Sanity check — paste this in PowerShell:
dotnet --version # should pri
…
## Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [KenLP](https://github.com/KenLP)
- **Source:** [KenLP/RevitMCPServer](https://github.com/KenLP/RevitMCPServer)
- **License:** MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.