revit-mcp
Provides tools for interacting with Autodesk Revit, enabling querying and editing models, managing levels, elements, parameters, sheets, views, schedules, and exporting drawings to PDF.
Click on "Deploy 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., "@revit-mcpWhat doors are in the current Revit model?"
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.
revit-mcp
Drive Autodesk Revit from Claude. Query the model open on your desktop, edit it, and produce a full drawing set in plain language — levels and elements, sheets and schedules, views and PDF exports.
Windows · Revit 2025, 2026 or 2027 · Node.js 18+. The Revit add-in ships precompiled and installs itself on first run — nothing to build, no .NET SDK, and nothing to copy by hand.
Installation
Do this on the PC that has Revit. Takes about a minute.
1. Add the plugin
Claude Cowork and Claude Code — type these two lines:
/plugin marketplace add rui-branco/revit-mcp
/plugin install revit@revit-toolsClaude Desktop
Settings → Plugins → Add → Add marketplace → Add from a repository
Paste
rui-branco/revit-mcpClick Install on Revit
2. Restart Revit
Revit shows a security warning about an unsigned add-in the first time. Click Always Load. If you click Do Not Load, Revit remembers it and nothing will work.
3. Check it
Open a model and ask Claude: "run revit_status". It should answer with your Revit version and the open file.
That's it. The plugin updates itself, so you never download anything again.
It only works on the PC running Revit. Claude talks to Revit through your own computer, so it cannot reach a Revit on another machine. That also means a normal Claude Desktop chat cannot use it — use Cowork or Claude Code, which run on your PC.
The Revit add-in installs itself the first time the server starts, so
there is no separate install step. If that ever fails, ask Claude to install
the Revit bridge and it will do it on demand. To turn the automatic install
off, set REVIT_MCP_NO_AUTO_INSTALL=1.
The plugin above is the supported path, and the only one that updates on its own.
Claude Code, without the plugin
claude mcp add revit --scope user -- npx -y @rui.branco/revit-mcp--scope user enables it in every project; --scope project writes it to the
repo's .mcp.json instead, to share with a team.
Claude Desktop, by hand
Settings → Developer → Edit Config opens
%APPDATA%\Claude\claude_desktop_config.json. Add the revit entry, keeping
any servers already there:
{
"mcpServers": {
"revit": {
"command": "npx",
"args": ["-y", "@rui.branco/revit-mcp"]
}
}
}Then quit Claude Desktop from the system tray — closing the window is not
enough — and reopen it. If the server shows as failed, Claude Desktop could not
find npx on its PATH: use an absolute path (where.exe npx.cmd prints
yours).
Any other MCP client
Run npx -y @rui.branco/revit-mcp as the server command. It takes no
arguments and needs no environment beyond the optional
configuration.
Related MCP server: Revit MCP Server
Usage
With a model open in Revit, ask in plain language:
What levels are in this model?
How many walls are there, and what types?
Add a level at 3 m and a second at 6 m.
Set Comments to "reviewed" on everything I have selected.
Create sheets L.02.001 through L.02.010 with the A0 title block.
Make a plan of each level at 1:100 and place it on its sheet.
Schedule the planting by type, with quantities, and put it on L.09.017.
Export every sheet to one PDF.Two habits worth keeping:
Ask for one phase per call — all ten sheets in one request, not ten requests. Each call is one undo step.
After a batch of writes, ask for
revit_diagnostics. Warnings the bridge resolved silently are recorded there and nowhere else.
Features
Query the model — levels, categories, element filters, selection, and parameters, with paging and total counts.
Edit the model — create levels, walls, floors, toposolids and pipes, place families, planting and openings, set parameters, delete elements.
Build drawings — sheets, views, sections, plans, legends, schedules, title blocks, and sheet collections.
Control graphics — view templates, category overrides, crop regions, display styles, sun and background settings.
Export — view images and native multi-sheet PDFs.
Runs unattended — modal dialogs and transaction warnings are answered by the bridge and recorded for you to read back.
Hot reload — rebuild the C# endpoints and reload them into a running Revit with the model still open.
One call, one undo step — every write is a single transaction group.
Tools
88 tools, grouped below; every write is one undo step.
Conventions
Units are Revit internal units (decimal feet) in both directions, unconverted: a level at 3 m is
9.8425.revit_query_elementscaps at 500 rows (default 100) and always returns the total match count.revit_get_elementsreturns only the parameters named inparams; without it, identity fields only.One tool call is one undo step: each write is a transaction group, assimilated on success, rolled back on failure.
revit_create_sheetsskips sheet numbers that already exist rather than failing, so re-running is safe.A view lives on exactly one sheet; a placed view returns
VIEW_ALREADY_PLACED, so userevit_duplicate_view.
Tool | Description |
| Returns bridge status, Revit version, units, user, and the active document ( |
| Lists dialogs the bridge answered and warnings it resolved; check after a batch of writes. |
| Toggles dialog auto-dismiss at runtime, optionally clearing the diagnostics buffer. |
| Reads the warnings the model carries right now — Revit's own Review Warnings list. |
Tool | Description |
| Lists every level in the model as |
| Lists every category present in the model with its element count, busiest first. |
| Filters elements by category, level and type name with |
| Returns rows for specific element ids, carrying only the parameters named in |
| Returns what the user currently has selected in the Revit UI. |
| Measures elements: geometry, bounds and placement that |
Tool | Description |
| Creates and opens a project from an |
| Opens an existing |
| Saves the active document in place; a never-saved model returns |
| Saves the active document to a new path; refuses an existing file unless |
| Closes the active document, activating another first; discards changes unless |
Tool | Description |
| Sets one named instance parameter to one value across a batch of element ids. |
| Creates a project parameter and binds it to categories; an existing binding is reported, not an error. |
| Writes a different parameter value per sheet in one call; sheets missing it come back as |
| Deletes elements by id; Revit may remove dependents, so the count can exceed the request. |
| Moves elements by a vector in feet without rebuilding them. |
Tool | Description |
| Creates levels from a list of |
| Creates walls on a level from a wall type, a height and a list of |
| Builds the site surface from survey points, as a Toposolid or a legacy TopographySurface. |
| Levels a region of the site surface to one elevation and reports the residual error. |
| Creates a floor from a closed boundary at the level's elevation; |
| Builds elements from raw solids with no family: cylinder, box, sphere, cone, extrusion. |
| Creates one Planting element per point, a trunk cylinder with a crown sphere; no family needed. |
| Models pipe runs as geometry, one element per run and a cylinder per segment; no MEP family. |
| Places one sprinkler head element per point and reports the category Revit allowed. |
| Cuts a toposolid with the elements sunk into it — a pool, a basement — via |
Tool | Description |
| Loads |
| Lists the family types loaded in the model, filtered by |
| Places one family instance per point; |
| Places doors and windows in walls; without |
Tool | Description |
| Lists every material as |
| Creates a material with colour, transparency, shininess and an optional |
| Puts a bitmap on a material with |
| Assigns an existing material through the type's compound structure or a material parameter. |
| Creates a wall type carrying a material and a thickness by duplicating an existing type. |
| Creates a floor type carrying a material and a thickness by duplicating an existing type. |
| Reads the appearance asset behind a material — the rendered look, not the shading colour. |
| Edits a material's appearance asset by naming the properties to write. |
Tool | Description |
| Lists every non-template view with its type, sheet placement and direction vectors. |
| Creates a plan on a level; |
| Creates a drafting view: linework and notes, no model geometry. |
| Creates an isometric or perspective 3D view from |
| Creates a section from an origin, a look direction, and width/height/depth in feet. |
| Lists the legend views as |
| Creates a legend by duplicating an existing one, else |
| Duplicates a view as Duplicate, WithDetailing or AsDependent. |
| Sets 1:X on one view or a batch; a perspective view returns |
| Resizes a perspective view on its sheet with proportions locked; the camera is untouched. |
Tool | Description |
| Sets a view's display style and detail level, both read back off the view. |
| Sets a 3D view's background to |
| Hides categories in one view; |
| Overrides category line colour, weight and transparency in one view; |
| Moves the sun by |
| Returns style, detail level, template, shadow sliders, background and a cast-shadows probe. |
| Sets style, detail level, shadow/sunlight intensity and cast shadows in one undo step. |
| Reports what became of the last posted shadows command, with a fresh parameter probe. |
| Turns a view into a view template controlling |
| Applies or assigns one template to many views, validated first; |
| Lists view templates with id, name, view type, and the parameters each one controls. |
| Reads the crop of one view or a batch: whether it is on, drawn, and where it sits. |
| Crops one view or a batch to a region of the model, in feet. |
| Hides elements permanently in one view — the 'Hide in View > Elements' override. |
Tool | Description |
| Lists the title block family types loaded in the model, the source of the title block id. |
| Reads what a title block prints: logo, placeholders, labels and their paper sizes. |
| Edits a title block family: strip logos and placeholders, retext, resize labels, add notes. |
| Lists every sheet as |
| Creates sheets from |
| Places views on sheets in one batch, handling schedules as schedule instances. |
| Measures where everything on a sheet actually sits, in feet on the paper. |
| Moves one viewport on its sheet. |
| Lists the sheet collections — the collapsible groups under Sheets in the Project Browser. |
| Puts sheets into native sheet collections so the browser shows collapsible groups. |
| Inspects how the Project Browser currently groups the Sheets section. |
Tool | Description |
| Creates a schedule for a category with named fields; unknown names are skipped and listed. |
| Sets itemisation, grouping, sorting, totals, headings and widths; |
| Moves a schedule instance on a sheet by its top-left corner; |
| Draws detail lines in a drafting view or plan; an unknown line style falls back and is reported. |
| Adds text notes to a view; |
| Reads the text of a schedule, cell by cell. |
Tool | Description |
| Exports views to PNG/JPEG; Revit renames the file, so open the returned |
| Exports named views and sheets through Revit's own PDF exporter — vector, at real sheet size. |
Tool | Description |
| Installs the bundled add-in into Revit's Addins folder; works with Revit closed. |
| Reloads the add-in's endpoint logic from disk without restarting Revit. |
| Removes the add-in and its manifest from Revit's Addins folder. |
Configuration
Variable | Default | Purpose |
|
| Bridge base URL. Change it for a second Revit instance. |
|
| Per-request timeout, in milliseconds. |
|
| Read by the add-in: how long a request waits for Revit's main thread. Clamped to 1–600 s. |
| unset | Set it to |
Unattended operation
A modal dialog parks Revit's main thread, and the bridge can only run work when that thread goes idle — so with nobody at the keyboard, one dialog would fail every call from then on. The bridge therefore answers them itself:
Dialogs are auto-dismissed (on by default). Ordinary dialogs get OK; anything that sounds destructive — delete, remove, overwrite, discard, unload, save, close — gets Cancel.
Transaction warnings are resolved by a failure preprocessor: Revit's own resolution where one exists, otherwise the warning is deleted. Genuine errors are never suppressed — they fail the transaction and roll it back.
revit_diagnostics is the other half of that trade. A silently resolved
warning often means the model did something you did not ask for. Every
dismissed dialog and resolved warning goes to a 200-entry ring buffer, readable
only there. Check it after a batch of writes; revit_set_auto_dismiss with
clear: true empties it first so the next read covers only that batch.
Turn auto-dismiss off (revit_set_auto_dismiss, enabled: false) when
someone is working in Revit at the same time. Calls then fail with REVIT_BUSY
until the dialog is answered by hand.
Troubleshooting
Symptom | Cause | Fix |
| Revit is not running, or is running without the add-in. | Start Revit. Check |
| Manifest present, assembly failed to load. | The DLL was blocked by Windows (file properties → Unblock), or a stale install. Reinstall, restart Revit. Log: |
| Revit is busy or showing a modal dialog. | Check |
| Revit is on the start page or between documents. | Open a model and retry. |
Privacy Policy
This software collects no data. It has no backend, no account, no telemetry and no analytics, and it makes no outbound internet request of its own. Model data is processed locally, in memory, and over loopback only.
Model content leaves your machine only if your MCP client sends it onward — when that client is Claude, under Anthropic's privacy policy, not this one.
Written locally and never transmitted: the bridge log at
%LOCALAPPDATA%\RevitMcpBridge\bridge.log, the add-in under
%APPDATA%\Autodesk\Revit\Addins\, an in-memory 200-entry diagnostics buffer,
and any image or PDF you ask a tool to export.
Full policy — collection, storage, third-party sharing, retention and contact: PRIVACY.md.
Security
The add-in runs inside
Revit.exewith full Revit API access. It can read, modify and delete anything in the open model, and open, save or close documents. There is no read-only mode.It opens an HTTP listener bound to the
127.0.0.1literal (not a wildcard) on port48884. Not reachable from the network, but unauthenticated: any local process can drive your Revit session.The add-in is not code-signed, hence Revit's unsigned add-in dialog.
Auto-dismiss answers Revit's dialogs for you. Turn it off when you are at the keyboard, and read
revit_diagnosticsafter writes.Work on a copy of any model you care about.
Report a vulnerability privately through GitHub security advisories.
Development
git clone https://github.com/rui-branco/revit-mcp.git
cd revit-mcp
npm install
npm testnpm test is node --test over tests/ — 521 tests. It touches no Revit and
opens no socket: the HTTP layer is stubbed and the tools are exercised through a
real MCP client over an in-memory transport.
The C# side needs the .NET SDK (end users do not):
npm run build:bridge # dotnet build -c Release, then refresh revit-bridge/dist/
cd revit-bridge && .\install.ps1 -Build # install that local buildrevit-bridge/dist/ is the compiled add-in that ships with the package, and is
committed on purpose — that is what spares end users the SDK. prepublishOnly
re-runs build:bridge and the tests, so a stale binary cannot be published.
The add-in is two assemblies: RevitMcpBridge.dll is the loader Revit pins
for the session (HTTP listener, main-thread pump, dialog handling), and
RevitMcpBridge.Handlers.dll is the routing and endpoint logic, loaded into a
collectible AssemblyLoadContext from a shadow copy. One build produces both.
That split is what makes hot reload work: rebuild, call
revit_reload_bridge, and the new logic is live with the model still open. If
the response reports unloadedPrevious: false the new logic is still live, but
the old context is leaking and is worth a look.
Further reading
Document | Covers |
Add-in internals: the | |
Sheets, schedules and drawing-set production. | |
View templates, category overrides, display styles. | |
Warnings, bounds and drawing-set QA. |
Contributing
Issues and pull requests are welcome. Please run npm test before opening a PR,
and npm run build:bridge as well if you changed the C# side.
License
MIT — see LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
Token-free MCP server for structured RevoGrid Core, Pro, and Enterprise knowledge retrieval.
MCP server for generating rough-draft project plans from natural-language prompts.
Built-environment forecasts, public benchmarks, and permit or zoning readiness through remote MCP.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- AlicenseAqualityFmaintenanceAllows AI to interact with Autodesk Revit via the MCP protocol, enabling retrieval of project data and automation of tasks like creating, modifying, and deleting elements.13123 npm461MIT
- AlicenseBqualityNot gradedmaintenanceAllows AI assistants to interact with Autodesk Revit through the MCP protocol, enabling the AI to create, modify, and delete elements in Revit projects.15123 npm1-
- AlicenseNot gradedqualityAmaintenanceMCP server for Autodesk Revit (BIM) with 705+ API endpoints. Enables AI agents to create walls, place doors/windows, generate sheets, manage views, and produce construction documents via the Model Context Protocol. Uses named pipes for zero-crash Revit integration.22MIT
- AlicenseAqualityFmaintenanceEnables AI to interact with Revit via MCP, allowing data retrieval and element creation, modification, and deletion.13123 npmMIT