# RevitMCPServer

> A custom Model Context Protocol server that lets Claude (or any MCP client) drive Revit 2025- 2027 — read the model, query, create & edit elements, and run multi-step operations as a single undoable Transaction.

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

## Install

```sh
agentstack add mcp-kenlp-revitmcpserver
```

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

## 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](https://github.com/KenLP/autoaudit-bim) | `revit-mcp-panel.json` |

Override the URL by dropping the config file into
`%APPDATA%\Autodesk\Revit\Addins\\`:

```jsonc
{ "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.

```jsonc
{
  "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 |

```jsonc
// 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.

1. **Download** `RevitMCPServer-v.zip` from the
   [latest release](https://github.com/KenLP/RevitMCPServer/releases/latest)
   (the combined bundle — **not** the `-R2025/-R2026/-R2027` per-version zips).
2. **Close Revit** (the installer replaces the add-in DLL).
3. **Extract** the zip, then right-click **`install.ps1` → Run with PowerShell**
   (or, in a PowerShell window: `.\install.ps1`).
4. **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+](https://nodejs.org/) 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`):

```powershell
.\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:

```powershell
.\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):

```powershell
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:

```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.

## Pricing

- **Free** — Free

## Security capabilities

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

- **Network access:** yes
- **Filesystem access:** yes
- **Shell / process execution:** no
- **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-kenlp-revitmcpserver
- Seller: https://agentstack.voostack.com/s/kenlp
- 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%.
