@rui.branco/revit-mcp 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/PRIVACY.md CHANGED
@@ -2,8 +2,7 @@
2
2
 
3
3
  **Effective date:** 21 September 2026
4
4
  **Applies to:** the `revit-mcp` MCP server and its bundled Revit bridge add-in
5
- (the "Software"), distributed as the npm package `@rui.branco/revit-mcp` and as
6
- the Claude Desktop extension `revit-mcp.mcpb`.
5
+ (the "Software"), distributed as the npm package `@rui.branco/revit-mcp` and the `revit` plugin.
7
6
 
8
7
  ## Summary
9
8
 
package/README.md CHANGED
@@ -3,28 +3,47 @@
3
3
  [![Revit](https://img.shields.io/badge/Revit-2025%20%7C%202026%20%7C%202027-006666)](https://www.autodesk.com/products/revit/overview)
4
4
  [![Platform](https://img.shields.io/badge/platform-Windows-0078D4)](#installation)
5
5
  [![Node.js](https://img.shields.io/badge/node-%E2%89%A518-339933)](https://nodejs.org)
6
- [![Tests](https://img.shields.io/badge/tests-507%20passing-success)](#development)
6
+ [![Tests](https://img.shields.io/badge/tests-521%20passing-success)](#development)
7
7
  [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
8
8
 
9
9
  **Drive Autodesk Revit from Claude.** Query the model open on your desktop, edit
10
10
  it, and produce a full drawing set in plain language — levels and elements,
11
11
  sheets and schedules, views and PDF exports.
12
12
 
13
- **Windows · Revit 2025, 2026 or 2027.** The add-in ships precompiled — nothing
14
- to build, no .NET SDK. The Claude Desktop extension needs no Node.js either; the
15
- Claude Code route uses `npx`, so it wants Node 18+.
13
+ **Windows · Revit 2025, 2026 or 2027 · Node.js 18+.** The Revit add-in ships
14
+ precompiled and installs itself on first run nothing to build, no .NET SDK,
15
+ and nothing to copy by hand.
16
16
 
17
17
  ## Installation
18
18
 
19
19
  ### 1. Register the server
20
20
 
21
- Two commands, in **Claude Code or Claude Desktop** same plugin, either app:
21
+ Same plugin either way. Type both lines into the chat box, one after the other.
22
+
23
+ **Claude Desktop** — in any chat:
22
24
 
23
25
  ```
24
26
  /plugin marketplace add rui-branco/revit-mcp
25
27
  /plugin install revit@revit-tools
26
28
  ```
27
29
 
30
+ **Claude Code** — in the CLI:
31
+
32
+ ```
33
+ /plugin marketplace add rui-branco/revit-mcp
34
+ /plugin install revit@revit-tools
35
+ ```
36
+
37
+ <details>
38
+ <summary>Or from your terminal, without opening Claude Code</summary>
39
+
40
+ ```bash
41
+ claude plugin marketplace add rui-branco/revit-mcp
42
+ claude plugin install revit@revit-tools
43
+ ```
44
+
45
+ </details>
46
+
28
47
  That is the whole step. The plugin updates itself from this repo, so there is
29
48
  nothing to re-download when a new version ships; `/plugin update` pulls it
30
49
  early if you do not want to wait.
@@ -44,16 +63,6 @@ claude mcp add revit --scope user -- npx -y @rui.branco/revit-mcp
44
63
  `--scope user` enables it in every project; `--scope project` writes it to the
45
64
  repo's `.mcp.json` instead, to share with a team.
46
65
 
47
- **Claude Desktop, as a Desktop Extension (.mcpb)**
48
-
49
- [Download `revit-mcp.mcpb`](https://github.com/rui-branco/revit-mcp/releases/latest/download/revit-mcp.mcpb),
50
- then **Settings → Extensions → Advanced settings → Install extension…** and
51
- pick the file. It bundles the server, its dependencies and the Revit add-in,
52
- and runs on Claude Desktop's built-in Node runtime, so neither Node.js nor npm
53
- is needed. **A sideloaded extension never auto-updates** — every new version
54
- means downloading and installing the file again, which is why the plugin is
55
- preferred.
56
-
57
66
  **Claude Desktop, by hand**
58
67
 
59
68
  **Settings → Developer → Edit Config** opens
@@ -84,12 +93,22 @@ arguments and needs no environment beyond the optional
84
93
 
85
94
  </details>
86
95
 
87
- ### 2. Install the Revit add-in
96
+ ### 2. Install the Revit add-in — automatic
97
+
98
+ Nothing to do. The server installs the add-in itself the first time it starts:
99
+ it looks for `RevitMcpBridge.addin` in
100
+ `%APPDATA%\Autodesk\Revit\Addins\<version>\` and, when no Revit has it, copies
101
+ the bundled add-in and its manifest into place for every Revit it finds. That
102
+ runs in the background on Windows, so it never delays or breaks the server, and
103
+ once the add-in is there it does nothing at all.
104
+
105
+ **If it is turned off or fails**, ask Claude to **install the Revit bridge**.
106
+ That runs `revit_install_bridge` — the same installer, on demand. Revit need not
107
+ be running, and re-running is safe. Auto-install is off whenever
108
+ `REVIT_MCP_NO_AUTO_INSTALL` is set; see [Configuration](#configuration).
88
109
 
89
- Ask Claude to **install the Revit bridge**. That runs `revit_install_bridge`,
90
- which copies the add-in and its `.addin` manifest into
91
- `%APPDATA%\Autodesk\Revit\Addins\<version>\` for every Revit it finds. Revit
92
- need not be running, and re-running is safe.
110
+ Either way the add-in is only on disk at this point. Revit does not load it
111
+ until it restarts, which is step 3.
93
112
 
94
113
  ### 3. Restart Revit and approve the add-in
95
114
 
@@ -399,6 +418,7 @@ Two habits worth keeping:
399
418
  | `REVIT_MCP_URL` | `http://localhost:48884/revit-mcp` | Bridge base URL. Change it for a second Revit instance. |
400
419
  | `REVIT_MCP_TIMEOUT` | `30000` | Per-request timeout, in milliseconds. |
401
420
  | `REVIT_MCP_BRIDGE_TIMEOUT_MS` | `30000` | Read by the add-in: how long a request waits for Revit's main thread. Clamped to 1–600 s. |
421
+ | `REVIT_MCP_NO_AUTO_INSTALL` | unset | Set it to `1` to stop the server installing the add-in on startup. `revit_install_bridge` still installs it on demand. Either way, Revit must be restarted before it loads. |
402
422
 
403
423
  ## Unattended operation
404
424
 
@@ -475,7 +495,7 @@ npm install
475
495
  npm test
476
496
  ```
477
497
 
478
- `npm test` is `node --test` over `tests/` — 507 tests. It touches no Revit and
498
+ `npm test` is `node --test` over `tests/` — 521 tests. It touches no Revit and
479
499
  opens no socket: the HTTP layer is stubbed and the tools are exercised through a
480
500
  real MCP client over an in-memory transport.
481
501
 
package/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
5
  import { pathToFileURL } from "url";
6
+ import { autoInstallBridge } from "./lib/auto-install.js";
6
7
  import { createBridge } from "./lib/bridge.js";
7
8
  import { registerReadTools } from "./lib/tools/read.js";
8
9
  import { registerWriteTools } from "./lib/tools/write.js";
@@ -111,6 +112,11 @@ async function main() {
111
112
  const transport = new StdioServerTransport();
112
113
  await server.connect(transport);
113
114
 
115
+ // Never awaited: the transport is already up, and a slow or failing install
116
+ // must not delay the handshake or stop the server from serving tool calls.
117
+ // It is startup only, so it stays out of createRevitServer().
118
+ autoInstallBridge();
119
+
114
120
  process.stderr.write("Revit MCP server running on stdio\n");
115
121
  }
116
122
 
@@ -0,0 +1,83 @@
1
+ // Installing the bridge add-in without being asked.
2
+ //
3
+ // The add-in already ships inside this package, so a new user should not have
4
+ // to ask for it to be copied into place: on startup, when no Revit has the
5
+ // manifest, we run the very installer revit_install_bridge runs.
6
+ //
7
+ // Two rules shape everything here. Nothing is awaited and every failure is
8
+ // swallowed — the MCP handshake must never wait on this, and a machine with no
9
+ // Revit on it is not an error. And stdout belongs to the JSON-RPC channel, so
10
+ // every byte written from here goes to stderr instead.
11
+
12
+ import fs from "fs";
13
+ import path from "path";
14
+ import { runInstaller } from "./tools/install.js";
15
+
16
+ // Set it to anything to never auto-install; revit_install_bridge still works.
17
+ export const OPT_OUT_ENV = "REVIT_MCP_NO_AUTO_INSTALL";
18
+
19
+ // Where install.ps1 puts the manifest, and what it calls it. Revit 2024 and
20
+ // earlier load add-ins on .NET Framework 4.8 and the installer refuses them, so
21
+ // a manifest under one of those years is not this add-in installed.
22
+ const MANIFEST_FILE = "RevitMcpBridge.addin";
23
+ const MINIMUM_REVIT_YEAR = 2025;
24
+
25
+ export function isInstalled({ env = process.env, fsImpl = fs } = {}) {
26
+ if (!env.APPDATA) return false;
27
+
28
+ const root = path.join(env.APPDATA, "Autodesk", "Revit", "Addins");
29
+ let years;
30
+
31
+ try {
32
+ years = fsImpl.readdirSync(root);
33
+ } catch {
34
+ // No add-ins folder at all, so nothing is installed.
35
+ return false;
36
+ }
37
+
38
+ return years.some(
39
+ (year) =>
40
+ /^\d{4}$/.test(year) &&
41
+ Number(year) >= MINIMUM_REVIT_YEAR &&
42
+ fsImpl.existsSync(path.join(root, year, MANIFEST_FILE)),
43
+ );
44
+ }
45
+
46
+ async function install(options, write) {
47
+ try {
48
+ const result = await runInstaller({}, options);
49
+
50
+ if (result.ok) {
51
+ write(
52
+ "revit-mcp: installed the Revit bridge add-in. RESTART REVIT to load it — Revit only scans the Addins folder at startup.\n",
53
+ );
54
+ return;
55
+ }
56
+
57
+ write(
58
+ `revit-mcp: could not install the Revit bridge add-in automatically. ${result.explanation || result.message} Run revit_install_bridge to see the full result, or set ${OPT_OUT_ENV}=1 to stop trying.\n`,
59
+ );
60
+ } catch (error) {
61
+ write(
62
+ `revit-mcp: could not install the Revit bridge add-in automatically: ${error.message} Set ${OPT_OUT_ENV}=1 to stop trying.\n`,
63
+ );
64
+ }
65
+ }
66
+
67
+ // Returns as soon as it has decided what to do. The install itself is
68
+ // deliberately left running: its promise is never handed back, so no caller can
69
+ // accidentally wait on it, and nothing it does can fail the server's startup.
70
+ export function autoInstallBridge(options = {}) {
71
+ const {
72
+ env = process.env,
73
+ platform = process.platform,
74
+ write = (line) => process.stderr.write(line),
75
+ } = options;
76
+
77
+ if (platform !== "win32") return "not-windows";
78
+ if (env[OPT_OUT_ENV]) return "opted-out";
79
+ if (isInstalled(options)) return "already-installed";
80
+
81
+ install(options, write);
82
+ return "started";
83
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rui.branco/revit-mcp",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "MCP server for Autodesk Revit: read and edit the open model from an MCP client, via a bundled C# bridge add-in that runs inside Revit",
5
5
  "keywords": [
6
6
  "revit",
@@ -32,7 +32,6 @@
32
32
  "revit-bridge/dist/",
33
33
  "README.md",
34
34
  "LICENSE",
35
- "manifest.json",
36
35
  "PRIVACY.md"
37
36
  ],
38
37
  "engines": {
@@ -44,8 +43,7 @@
44
43
  "scripts": {
45
44
  "test": "node --test tests/*.test.js",
46
45
  "build:bridge": "node scripts/build-bridge.mjs",
47
- "prepublishOnly": "npm run build:bridge && npm test",
48
- "pack:desktop": "npm run build:bridge && npx -y @anthropic-ai/mcpb@2.1.2 pack . revit-mcp.mcpb"
46
+ "prepublishOnly": "npm run build:bridge && npm test"
49
47
  },
50
48
  "dependencies": {
51
49
  "@modelcontextprotocol/sdk": "^1.0.0"
package/manifest.json DELETED
@@ -1,419 +0,0 @@
1
- {
2
- "manifest_version": "0.2",
3
- "name": "revit-mcp",
4
- "display_name": "Revit",
5
- "version": "1.0.2",
6
- "description": "Query and edit the Autodesk Revit model open on your desktop.",
7
- "long_description": "Connects Claude to the Revit model currently open on this Windows machine through a bundled C# bridge add-in. Query levels and elements, read and write parameters, model geometry, and produce a full drawing set: sheets, views, schedules and PDF exports. Requires Autodesk Revit 2025, 2026 or 2027, and a one-time bridge install run from inside Claude.",
8
- "author": {
9
- "name": "rui-branco",
10
- "url": "https://github.com/rui-branco"
11
- },
12
- "homepage": "https://github.com/rui-branco/revit-mcp",
13
- "documentation": "https://github.com/rui-branco/revit-mcp#readme",
14
- "support": "https://github.com/rui-branco/revit-mcp/issues",
15
- "license": "MIT",
16
- "keywords": [
17
- "revit",
18
- "autodesk",
19
- "bim",
20
- "architecture",
21
- "cad"
22
- ],
23
- "server": {
24
- "type": "node",
25
- "entry_point": "index.js",
26
- "mcp_config": {
27
- "command": "node",
28
- "args": [
29
- "${__dirname}/index.js"
30
- ],
31
- "env": {
32
- "REVIT_MCP_URL": "${user_config.bridge_url}",
33
- "REVIT_MCP_TIMEOUT": "${user_config.timeout_ms}"
34
- }
35
- }
36
- },
37
- "user_config": {
38
- "bridge_url": {
39
- "type": "string",
40
- "title": "Bridge URL",
41
- "description": "Where the Revit bridge add-in listens. Change only for a second Revit instance.",
42
- "default": "http://localhost:48884/revit-mcp",
43
- "required": false
44
- },
45
- "timeout_ms": {
46
- "type": "string",
47
- "title": "Request timeout (ms)",
48
- "description": "How long to wait for Revit to answer a single request.",
49
- "default": "30000",
50
- "required": false
51
- }
52
- },
53
- "tools": [
54
- {
55
- "name": "revit_add_text_notes",
56
- "description": "Add text notes to a view — the annotation on a detail, a plan or a section."
57
- },
58
- {
59
- "name": "revit_apply_view_template",
60
- "description": "Put one view template onto many views in a single undo step."
61
- },
62
- {
63
- "name": "revit_assign_material",
64
- "description": "Put an existing material on elements that already exist."
65
- },
66
- {
67
- "name": "revit_capture_view_template",
68
- "description": "Turn a view that is already drawn the way you want into a reusable view template, and state which parameters it controls."
69
- },
70
- {
71
- "name": "revit_close_project",
72
- "description": "Close the active document."
73
- },
74
- {
75
- "name": "revit_configure_schedule",
76
- "description": "Reshape how an EXISTING schedule presents the rows it already has: grouping, totals, column headings and widths."
77
- },
78
- {
79
- "name": "revit_create_3d_view",
80
- "description": "Create a 3D view — an isometric by default, or a perspective camera with perspective: true."
81
- },
82
- {
83
- "name": "revit_create_directshape",
84
- "description": "Create elements from raw geometry, with no family involved."
85
- },
86
- {
87
- "name": "revit_create_drafting_view",
88
- "description": "Create a drafting view: a sheet of linework and notes that is not a view of the model at all."
89
- },
90
- {
91
- "name": "revit_create_floor",
92
- "description": "Create a floor from a closed boundary: paving, a pool deck, a terrace, or an actual building floor."
93
- },
94
- {
95
- "name": "revit_create_floor_type",
96
- "description": "Create a floor type carrying a material and a thickness, by duplicating an existing type and giving it a single structural layer."
97
- },
98
- {
99
- "name": "revit_create_legend",
100
- "description": "Create a legend view by duplicating one the document already has — the only way the Revit API can make a legend."
101
- },
102
- {
103
- "name": "revit_create_levels",
104
- "description": "Create levels in the active document."
105
- },
106
- {
107
- "name": "revit_create_material",
108
- "description": "Create a material with a colour, so the model stops rendering in Revit's default grey."
109
- },
110
- {
111
- "name": "revit_create_pipes",
112
- "description": "Model pipe runs — irrigation, drainage — as geometry, with no MEP family involved."
113
- },
114
- {
115
- "name": "revit_create_plan_view",
116
- "description": "Create a plan view on a level — a floor plan unless 'view_family_type' names another one."
117
- },
118
- {
119
- "name": "revit_create_project_parameter",
120
- "description": "Create a project parameter and bind it to one or more categories — the way to add a field Revit does not have, such as a Phase on sheets tha"
121
- },
122
- {
123
- "name": "revit_create_schedule",
124
- "description": "Create a schedule for a category, with the named fields added in order."
125
- },
126
- {
127
- "name": "revit_create_section_view",
128
- "description": "Create a section view."
129
- },
130
- {
131
- "name": "revit_create_sheets",
132
- "description": "Create sheets in the active document."
133
- },
134
- {
135
- "name": "revit_create_toposolid",
136
- "description": "Create the site surface from a cloud of survey points."
137
- },
138
- {
139
- "name": "revit_create_wall_type",
140
- "description": "Create a wall type carrying a material and a thickness, by duplicating an existing type and giving it a single structural layer."
141
- },
142
- {
143
- "name": "revit_create_walls",
144
- "description": "Create walls on a level from 2D curves."
145
- },
146
- {
147
- "name": "revit_delete_elements",
148
- "description": "Delete elements by id."
149
- },
150
- {
151
- "name": "revit_diagnostics",
152
- "description": "Read what the bridge suppressed: the Revit dialogs it answered automatically and the transaction warnings it resolved, oldest first, plus wh"
153
- },
154
- {
155
- "name": "revit_draw_detail_lines",
156
- "description": "Draw detail lines in a drafting view or a plan — the linework of a construction detail."
157
- },
158
- {
159
- "name": "revit_duplicate_view",
160
- "description": "Duplicate a view."
161
- },
162
- {
163
- "name": "revit_edit_titleblock_family",
164
- "description": "Edit the INSIDE of a title block family and load it back into this same project: remove the stock logo and the literal consultant placeholde"
165
- },
166
- {
167
- "name": "revit_excavate_toposolid",
168
- "description": "Cut a toposolid with the elements that should be sunk into it — a pool, a basement, a sunken path — using Revit's native Toposolid.ExcavateB"
169
- },
170
- {
171
- "name": "revit_export_pdf",
172
- "description": "Export named views and sheets to PDF through Revit's own PDF exporter — vectors, on white paper, at the sheet's real size."
173
- },
174
- {
175
- "name": "revit_export_view_image",
176
- "description": "Export a view to a raster image on disk — the only way anything outside Revit gets to see what the model looks like."
177
- },
178
- {
179
- "name": "revit_flatten_toposolid",
180
- "description": "Flatten a region of the site surface to one elevation, so paving can sit on graded terrain instead of fighting it — this is the fix for Revi"
181
- },
182
- {
183
- "name": "revit_get_browser_organization",
184
- "description": "Inspect how the Project Browser currently groups the Sheets section, and find out honestly what can be done about it."
185
- },
186
- {
187
- "name": "revit_get_elements",
188
- "description": "Read specific elements by id."
189
- },
190
- {
191
- "name": "revit_get_material_appearance",
192
- "description": "Read the appearance asset behind a material — the rendered look, as opposed to the shading colour revit_create_material sets."
193
- },
194
- {
195
- "name": "revit_get_selection",
196
- "description": "Read what the user currently has selected in the Revit UI."
197
- },
198
- {
199
- "name": "revit_get_sheet_layout",
200
- "description": "Measure where everything on a sheet actually is, in feet on the PAPER."
201
- },
202
- {
203
- "name": "revit_get_view_crop",
204
- "description": "Read the crop of one view or a batch of them: whether it is on, whether the rectangle is drawn, and where it actually is."
205
- },
206
- {
207
- "name": "revit_get_view_graphics",
208
- "description": "Read what a view is actually drawn with: display style, detail level, the view template that may be overriding both, the shadow and sunlight"
209
- },
210
- {
211
- "name": "revit_get_view_graphics_command_status",
212
- "description": "What became of the last cast-shadows command revit_set_view_graphics posted: when it was posted, whether Revit has been idle since (which is"
213
- },
214
- {
215
- "name": "revit_get_warnings",
216
- "description": "Read the warnings the model is carrying right now — Revit's own Review Warnings list."
217
- },
218
- {
219
- "name": "revit_hide_elements_in_view",
220
- "description": "Hide elements in ONE view, permanently — the 'Hide in View > Elements' override Revit stores on that view."
221
- },
222
- {
223
- "name": "revit_hide_view_categories",
224
- "description": "Turn whole categories off in one view."
225
- },
226
- {
227
- "name": "revit_inspect_elements",
228
- "description": "Measure elements: everything revit_get_elements leaves out."
229
- },
230
- {
231
- "name": "revit_inspect_titleblock_family",
232
- "description": "Read what is INSIDE a title block family: the only way to find out why a sheet prints a vendor logo, a literal consultant placeholder or a l"
233
- },
234
- {
235
- "name": "revit_install_bridge",
236
- "description": "Install the Revit MCP bridge add-in: copies the add-in that ships with this package into Revit's Addins folder."
237
- },
238
- {
239
- "name": "revit_list_categories",
240
- "description": "List the categories present in the active document with an element count each."
241
- },
242
- {
243
- "name": "revit_list_family_symbols",
244
- "description": "List the family types loaded in the document: id, family name, type name and category."
245
- },
246
- {
247
- "name": "revit_list_legends",
248
- "description": "List the legend views in the document: id, name and scale."
249
- },
250
- {
251
- "name": "revit_list_levels",
252
- "description": "List the levels in the active document: id, name and elevation (Revit internal units, decimal feet)."
253
- },
254
- {
255
- "name": "revit_list_materials",
256
- "description": "List the materials in the document: id, name, colour as {r, g, b}, and the id of its appearance asset when it has one."
257
- },
258
- {
259
- "name": "revit_list_sheet_collections",
260
- "description": "List the sheet collections in the active document — the collapsible groups Revit draws under Sheets in the Project Browser — with each colle"
261
- },
262
- {
263
- "name": "revit_list_sheets",
264
- "description": "List the sheets in the active document: id, sheet number and name, ordered by sheet number."
265
- },
266
- {
267
- "name": "revit_list_titleblocks",
268
- "description": "List the title block family types loaded in the active document: id, family name and type name."
269
- },
270
- {
271
- "name": "revit_list_view_templates",
272
- "description": "List the view templates in the model: id, name, view type, and the parameters each template CONTROLS with their labels."
273
- },
274
- {
275
- "name": "revit_list_views",
276
- "description": "List the non-template views in the document: id, name, view type, and whether each is already placed on a sheet."
277
- },
278
- {
279
- "name": "revit_load_families",
280
- "description": "Load .rfa family files into the project — real trees, benches, bollards, light fittings, doors and windows instead of DirectShape primitives"
281
- },
282
- {
283
- "name": "revit_move_elements",
284
- "description": "Move elements by a vector in feet — lift furniture out of a slab, shift a tree off a path — without rebuilding them."
285
- },
286
- {
287
- "name": "revit_new_project",
288
- "description": "Create a new Revit project from a template and open it, without using the Revit UI."
289
- },
290
- {
291
- "name": "revit_open_project",
292
- "description": "Open an existing .rvt file and make it the active document, without using the Revit UI."
293
- },
294
- {
295
- "name": "revit_override_view_categories",
296
- "description": "Override the graphics of whole categories in ONE view — the other half of the Visibility/Graphics dialog, and what stops a drawing set readi"
297
- },
298
- {
299
- "name": "revit_place_families",
300
- "description": "Place one family instance per point — trees, shrubs, light fittings, furniture."
301
- },
302
- {
303
- "name": "revit_place_openings",
304
- "description": "Place doors and windows IN walls — the tool for family instances that have to cut their host, which is why it is not revit_place_families wi"
305
- },
306
- {
307
- "name": "revit_place_planting",
308
- "description": "Plant trees: one element in the Planting category per point, each a trunk cylinder with a crown sphere sitting on top of it."
309
- },
310
- {
311
- "name": "revit_place_sprinklers",
312
- "description": "Place sprinkler heads: one small element per point, a cylinder standing proud of the ground."
313
- },
314
- {
315
- "name": "revit_place_views_on_sheets",
316
- "description": "Put views on sheets."
317
- },
318
- {
319
- "name": "revit_query_elements",
320
- "description": "Find elements by category and/or level and/or type name."
321
- },
322
- {
323
- "name": "revit_read_schedule",
324
- "description": "Read the text of a schedule, cell by cell."
325
- },
326
- {
327
- "name": "revit_reload_bridge",
328
- "description": "Reload the bridge's endpoint logic from disk without restarting Revit, after rebuilding the add-in."
329
- },
330
- {
331
- "name": "revit_save",
332
- "description": "Save the active document in place."
333
- },
334
- {
335
- "name": "revit_save_as",
336
- "description": "Save the active document to a new path and carry on working in it."
337
- },
338
- {
339
- "name": "revit_scale_perspective_crop",
340
- "description": "Make ONE perspective 3D view bigger or smaller on its sheet, proportions locked."
341
- },
342
- {
343
- "name": "revit_set_auto_dismiss",
344
- "description": "Turn automatic dialog dismissal on or off, and optionally empty the diagnostics buffer."
345
- },
346
- {
347
- "name": "revit_set_material_appearance",
348
- "description": "Edit the appearance asset behind a material by naming the properties to write."
349
- },
350
- {
351
- "name": "revit_set_material_texture",
352
- "description": "Put a real texture bitmap on an existing material, which is the difference between a surface that is green and one that looks like grass."
353
- },
354
- {
355
- "name": "revit_set_parameters",
356
- "description": "Set one parameter to the same value on one or more elements."
357
- },
358
- {
359
- "name": "revit_set_schedule_position",
360
- "description": "Move ONE schedule on its sheet."
361
- },
362
- {
363
- "name": "revit_set_sheet_collections",
364
- "description": "Put sheets into native sheet collections, so the Project Browser shows them as collapsible groups."
365
- },
366
- {
367
- "name": "revit_set_sheet_parameters",
368
- "description": "Write a parameter value per sheet — a different value on each, which is what stamping a phase or a discipline across a set of sheets is."
369
- },
370
- {
371
- "name": "revit_set_view_background",
372
- "description": "Put a sky behind a 3D view."
373
- },
374
- {
375
- "name": "revit_set_view_crop",
376
- "description": "Crop one view or a batch of them to a region of the MODEL, in feet."
377
- },
378
- {
379
- "name": "revit_set_view_graphics",
380
- "description": "Set a view's graphics, including cast shadows — the one thing revit_set_view_style cannot do."
381
- },
382
- {
383
- "name": "revit_set_view_scale",
384
- "description": "Set the view scale on one view or a batch of them."
385
- },
386
- {
387
- "name": "revit_set_view_style",
388
- "description": "Set how a view is drawn, which is most of what decides whether an exported image reads as a model or as a diagram."
389
- },
390
- {
391
- "name": "revit_set_view_sun",
392
- "description": "Move the sun for a view, which is most of what decides whether a shaded export reads as architecture: it sets the direction every face is li"
393
- },
394
- {
395
- "name": "revit_set_viewport_position",
396
- "description": "Move one viewport on its sheet."
397
- },
398
- {
399
- "name": "revit_status",
400
- "description": "Check whether Revit is reachable: version, active document name/path, and whether the model is workshared."
401
- },
402
- {
403
- "name": "revit_uninstall_bridge",
404
- "description": "Remove the Revit MCP bridge add-in: deletes the .addin manifest and the install folder for every Revit version that has it."
405
- }
406
- ],
407
- "compatibility": {
408
- "claude_desktop": ">=0.10.0",
409
- "platforms": [
410
- "win32"
411
- ],
412
- "runtimes": {
413
- "node": ">=18.0.0"
414
- }
415
- },
416
- "privacy_policies": [
417
- "https://github.com/rui-branco/revit-mcp/blob/main/PRIVACY.md"
418
- ]
419
- }