Revit Model MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| REVIT_MCP_HOST | No | Set to 'local' for local Windows clients using the Revit user's account. For remote clients, configure an SSH tunnel to the workstation's loopback endpoint. | |
| REVIT_MCP_ALLOW_WRITE | No | Set to '1' to allow write actions. Both this and the workstation allow-write file are required for actions. | |
| REVIT_MCP_REDACT_PATHS | No | Set to '1' to hide directories in response path fields. Default is likely '0' (not redacted). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| revit_jobsA | List recent jobs, or wait up to wait_seconds (0 to 50, default 40) for the result of an action jobId. Results stay on the workstation for 24 hours, across server restarts. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_compare_link_datumsA | Compare host grids and levels with one loaded Revit link. Changes nothing. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_pingA | Check the connection to Revit without reading the model. Returns data="pong", even when no document is active. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_nwc_settings_checkA | Parse a Navisworks exporter XML file on the Revit workstation without exporting. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_document_infoA | Read the active model's file name, Revit version, levels (elevations in mm), area schemes, worksets and view count. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_documentsA | List every open document in one Revit process, including background documents. Linked documents are listed only when include_linked is set. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_ui_stateA | Read the active document, open views, selection and open documents. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_model_snapshotA | Read a schema version 1 project snapshot for batch audits. Closed worksets can make the result incomplete. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_model_healthA | Read model quality counts: project metadata, file size, counts, units and the ten most frequent warning groups. Unavailable metrics are null and listed in skipped. output_path also writes an .xlsx health report with up to five snapshots. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_links_statusA | Read RVT, CAD and image link status. Each list is capped at 100 entries; summary counts cover all links. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_shared_coordinatesA | Read project and survey coordinates: base and survey points, active site, project locations and link offsets (mm, degrees). Lists are capped at 100 with total counts. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_parameter_fill_checkA | Count filled, empty and missing parameters per parameter and category, with samples of empty and missing element IDs. Numeric zero counts as filled. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_list_catalogA | List catalog names for one section: categories, family-types, levels, area-schemes, views, worksets, phases or parameters. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_aggregate_elementsA | Summarize matching elements by one or two fields, with optional sum and average. Lengths use mm, areas m2, volumes m3. For area totals, group by level and select the area scheme. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_query_elementsB | Read a page of matching element rows. Lengths use mm, areas m2, volumes m3; optional geometry is in model mm. roomCenterMm is a point inside the room, a bounding-box centre can lie outside it. hasMore=true means further pages exist. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_list_viewsB | List non-template views with id, name, type, level, scale and template. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_view_infoA | Inspect one view's template, display, categories, worksets, filters and links. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_view_summaryA | Read element categories and counts for a selected view. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_schedule_dataA | Read displayed schedule header and body cell text, with paging. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_capture_elementsA | Render a highlighted PNG that marks 1 to 500 elements, for issue evidence. Supports 3d or plan mode over local or SSH transport. The temporary view is rolled back. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_export_viewA | Export a selected view to a PNG file on the MCP client. Does not change the active view or the model. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_view_elementsA | Read one page of elements in a selected view, with IDs, category, family, type, level and measurements (mm, m2, m3). A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_element_detailsA | Read parameters and geometry of an element by Revit ID, with its type parameters and related warnings. Geometry is in model mm; roomCenterMm is a point inside the room. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_view_warningsA | Read warnings involving elements present in a selected view. A warning may also involve elements outside the view. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_list_warningsA | Group model warnings by description text. warning_text with include_elements=true returns the elements of one group. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_list_relationsA | Read model object membership or dependencies. relation is level-rooms, area-scheme-elements or view-template-dependents (with source_name), or group-elements or nested-family (with source_id). A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_list_instancesA | List Revit processes with documentName, documentPath, revitVersion, processId and pluginResponding. Busy or unresponsive processes stay listed with pluginResponding=false. HTTP mode reports only its connected process. |
| revit_family_auditA | Audit an open family or named project families without saving or loading changes. Project mode takes exact family names or ["*"]; family mode takes none. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
| revit_open_documentA | Open a local, UNC or RSN model. Central models open detached by default. Cloud paths are unsupported. A long action can return status=running and jobId when the wait budget expires; it may already have changed the model, and revit_jobs returns its result. Resubmitting repeats the action. |
| revit_activate_documentB | Activate an already open document by title or path reference. |
| revit_activate_viewC | Activate a non-template view. Zoom to fit, preserve zoom, or frame element IDs. |
| revit_close_viewsC | Close open UI views in the active document. |
| revit_new_documentC | Create a project or family from a template on the Revit workstation. |
| revit_close_documentB | Close a background document. Needs confirm_token from a first call, which changes nothing. |
| revit_save_documentB | Save a document. Needs confirm_token from a first call, which changes nothing. |
| revit_sync_documentB | Synchronize a workshared document with central. Needs confirm_token from a first call, which changes nothing. |
| revit_set_view_visibilityB | Change category, workset and filter visibility in one view; dry_run previews. Categories accept the Revit UI name, the BuiltInCategory name (OST_StructuralColumns), the English name or an ID. |
| revit_remove_linksA | Delete selected link types and their instances; dry_run previews. Cannot be undone in Revit. Needs confirm_token from a first call, which changes nothing. |
| revit_execute_codeA | Compile and run C# against the live Revit API on the Revit thread. Accepts a method body or a public static Script class with Execute(ScriptContext ctx). Auto mode owns one transaction and undo entry; transaction="none" is refused by default. Needs confirm_token from a first call, which runs nothing; dry_run needs none. A long action can return status=running and jobId when the wait budget expires; it may already have changed the model, and revit_jobs returns its result. Resubmitting repeats the action. |
| revit_undo_lastA | Undo the last MCP action through Revit's own undo command. Runs only when the target document is active, no command is pending and Revit's last undo entry is the one this session recorded; otherwise the result carries a refusal reason. |
| revit_align_link_datumsB | Align host grids and levels to a loaded link, with optional creation and rollback preview. Does not create a monitor relationship. |
| revit_cancel_jobA | Request cancellation of an action jobId. Process-models stops before the next model and marks unstarted models cancelled; a single running Revit operation finishes, and completed changes stay committed. |
| revit_selectA | Select element IDs for inspection in Revit; an empty list clears the selection. |
| revit_showB | Display elements in Revit, optionally selecting them; opens a level plan or 3D view when needed. |
| revit_isolateB | Temporarily isolate element IDs in the active view; an empty list resets. |
| revit_moveA | Move elements by dx_mm, dy_mm and dz_mm on model axes. dry_run rolls back and returns the verification block. Group members, pinned, hosted and constrained elements are reported in skipped.inGroup, skipped.pinned, skipped.hosted and skipped.constrained and are not changed; the call is refused if every element is a group member. |
| revit_override_graphicsB | Colour elements in selected model views; reset restores overrides saved in this Revit session. |
| revit_rotateA | Rotate elements about a vertical axis through center_mm, or through their combined bounding box center. dry_run rolls back. Group members, pinned, hosted and constrained elements are reported in skipped.inGroup, skipped.pinned, skipped.hosted and skipped.constrained and are not changed; the call is refused if every element is a group member. |
| revit_copyA | Create 1 to 100 successive copies at multiples of the model-axis offset in mm. dry_run rolls back. Group members are reported in skipped.inGroup; the call is refused if every element is a group member. |
| revit_mirrorA | Mirror across a model X or Y parallel line through point_mm; copy keeps originals. dry_run rolls back. Group members, pinned, hosted and constrained elements are reported in skipped.inGroup, skipped.pinned, skipped.hosted and skipped.constrained and are not changed; the call is refused if every element is a group member. |
| revit_change_typeA | Change each element to one compatible type; family resolves duplicate type names. dry_run rolls back. Group members are reported in skipped.inGroup; the call is refused if every element is a group member. |
| revit_update_parametersA | Update a parameter on elements matching the same filters as revit_query_elements. Group members are reported in skipped.inGroup instead of failing the call; dry_run predicts this. |
| revit_place_familyA | Place a loaded unhosted family on a named level. family is a name or Family: Type; a null type_name uses the embedded or first type. XY is in mm, rotation in degrees. |
| revit_load_familyA | Load workstation .rfa files in one undo entry. Existing families are skipped unless overwrite is true. |
| revit_place_familiesC | Load optional families and place instances in one transaction and undo entry. |
| revit_create_wallB | Create a straight wall on a named level. XY endpoints and height are in mm; a null wall_type uses the first basic type. |
| revit_create_mep_runA | Create connected duct, pipe, cable tray or conduit segments from model mm points. A missing Z uses the level elevation plus the kind's default offset. Unplaceable elbows are reported as unjoined pairs. |
| revit_link_cadB | Link or import a DWG into a plan view on the Revit workstation. Returns CAD layers and extents in mm. |
| revit_walls_from_cadB | Bridge openings, pair parallel CAD lines and join basic walls in one undo entry. Dimensions are mm. Joins Revit rejects are left out and reported as unjoinedEnds with unjoinedReasons; dry_run reports the same join numbers. |
| revit_create_viewB | Create a plan, section, 3D or drafting view. Unbounded 3D views show the whole model, shaded, fine detail. Box coordinates are model mm. |
| revit_duplicate_viewC | Duplicate a view, optionally with detailing or as a dependent view. |
| revit_apply_view_templateC | Apply a matching view template to one or more views. |
| revit_create_sheetC | Create a sheet with the first loaded or a named title block. |
| revit_place_views_on_sheetC | Place views and schedules on a sheet. Coordinates are sheet mm. |
| revit_tag_elementsA | Tag elements in a view, chosen by category names or by element IDs (exactly one of the two). Returns created tag IDs in createdElementIds; already tagged elements are skipped unless skip_tagged is false, and untaggable inputs are listed in skipped. tag_type matches a tag type name, a family name or "Family: Type"; the default tag type is used otherwise. Room tags need a plan view. dry_run rolls back and returns the tags that would be created. |
| revit_create_scheduleA | Create a schedule for one category with the named fields in the given order, using Revit UI names such as Mark, Level or Count. filters keep rows by field, operator and value; sort orders and, with header or footer, groups rows. Lengths in mm, areas in m2, volumes in m3. itemized=false collapses identical rows. Returns viewId and the resolved fields; unknown names are listed in skipped. dry_run rolls back. |
| revit_set_parameterA | Set one instance or type parameter. parameter_id selects by BuiltInParameter name, shared GUID or ParameterElement ID; otherwise parameter takes a localized UI name, BuiltInParameter name or English alias, and ambiguous matches are refused. Value is a string, integer or number by storage type; lengths in mm, areas in m2. Group members fail with a clear message. dry_run rolls back and returns the verification block. |
| revit_deleteA | Delete elements and their Revit dependencies; the count includes dependents. dry_run returns the count. Above 500 elements including dependents a confirm_token from a first call is needed; revit_run_actions refuses such deletions. |
| revit_exportA | Export PDF, DWG, IFC or schedule CSV files on the Revit workstation; dry_run returns planned file names. Replacing existing files (overwrite=true) needs a confirm_token from a first call. A long action can return status=running and jobId when the wait budget expires; it may already have changed the model, and revit_jobs returns its result. Resubmitting repeats the action. |
| revit_export_nwcA | Export NWC on the Revit workstation; needs the Navisworks exporter. settings_xml applies exporter XML values, explicit arguments take precedence. Replacing an existing file (overwrite=true) needs a confirm_token from a first call. A long action can return status=running and jobId when the wait budget expires; it may already have changed the model, and revit_jobs returns its result. Resubmitting repeats the action. |
| revit_run_actionsA | Execute up to 50 actions with one undo step; the whole batch rolls back on its first failure. dry_run rolls back and returns the verification block. |
| revit_process_modelsA | Open each model in the interactive session, run steps and C# code, export, save as requested, and close. In-place saves and code need a confirm_token from the preview response. A long action can return status=running and jobId when the wait budget expires; it may already have changed the model, and revit_jobs returns its result. Resubmitting repeats the action. |
| revit_edit_familiesA | Edit an open family in place, or named project families (exact names or ["*"]), one load cycle each. A dry run rolls back all changes. A long action can return status=running and jobId when the wait budget expires; it may already have changed the model, and revit_jobs returns its result. Resubmitting repeats the action. |
| revit_batch_startB | Start a persistent, read-only run over local, UNC or RSN models. open_timeout_minutes is the per-model open deadline (default 30, 45 when upgrading in memory). |
| revit_batch_statusB | Read durable run and model status after the initiating client exits. |
| revit_batch_cancelC | Persist cancellation and prevent unstarted models from running. |
| revit_batch_fetchC | Download completed snapshots to new local files without overwriting. |
| revit_build_reportA | Build a local Excel report from snapshots without contacting Revit. |
| revit_issue_registerB | Write a new local .xlsx issue register with element snapshots and review documents. Takes 1 to 60 issues; captures at most 25 snapshots (by severity) within a 210-second budget, and failed snapshots become cell notes. Snapshots need local or SSH transport. Existing output files are refused. A non-empty skipped list means the result is incomplete; skippedCount counts all skipped entries. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| model_overview | Review one open model: health, warnings, links, coordinates and families, as a findings table. |
| pre_issue_check | Check an open model before issuing it: health, warnings, links, coordinates, parameter fill and families. |
| warnings_triage | Group and prioritize model warnings with affected element IDs. |
| parameter_fill_report | Report how completely the requested parameters are filled for the requested categories. |
| batch_audit | Collect snapshots from many models in the background and build a comparison report. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| coordinator_guide | Guide for reviewing a Revit model: tool order, result fields and reporting conventions. |
TDQS
Scored across 79 tools
The 79 tools have many overlapping read-oriented purposes, especially around views and elements: revit_query_elements, revit_view_elements, revit_element_details, revit_aggregate_elements, revit_view_info, revit_view_summary and revit_capture_elements require careful distinction. Descriptions provide enough detail to tell most apart, but the sheer breadth and similar naming create real misselection risk.
All tool names use a consistent revit_ prefix and snake_case convention, with no camelCase or mixed-style deviations. Although some tools are noun phrases and others verb phrases, the overall naming pattern is highly predictable and readable.
With 79 tools, the server is far beyond the expected 3-15 range and clearly falls into the extreme over-provisioned category. Even for a complex Revit automation surface, the count is excessive and makes discovery and selection burdensome.
The surface covers a very broad lifecycle: reading, editing, family placement, views, sheets, schedules, exports, batch processing and reporting. Some common authoring operations such as floors, roofs, rooms and dimensions are not exposed directly, but revit_execute_code and revit_run_actions provide a workaround.