Skip to main content
Glama
elkhouryrafik-boop

revit-mcp-hardened

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
REVIT_MCP_PROFILENoCapability profile controlling which tools are registered. Options: read, standard, full.standard
REVIT_MCP_ALLOW_CODE_EXECNoSet to '1' to enable the execute_revit_code tool when the profile is full.0

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_revit_statusA

Check if the Revit MCP API is active and responding

get_revit_model_infoB

Get comprehensive information about the current Revit model

get_revit_viewB

Export a specific Revit view as an image

list_revit_viewsA

Get a list of all exportable views in the current Revit model

get_current_view_infoA

Get detailed information about the currently active view in Revit.

Returns comprehensive information including:

  • View name, type, and ID

  • Scale and detail level

  • Crop box status

  • View family type

  • View discipline

  • Template status

get_current_view_elementsA

Get elements visible in the currently active view in Revit.

Returns per element: element_id, name, category, category_id. Also returns category_counts (always for ALL elements, even if truncated).

If the response contains truncated=true, not all elements were returned. Check total_elements vs returned_elements and increase limit if needed.

Args: limit: Maximum number of elements to return (default 5000). include_levels: Include level name and level_id per element. Default false. include_location: Include location geometry (point or curve). Default false.

list_levelsA

Get a list of all levels in the current Revit model

list_familiesA

List loadable family types available in the current model.

Returns family_name, type_name, category and whether the type is activated, for each match. Call this before place_family to get exact names - placement fails on a near-miss.

An empty list means nothing matched the filter, which is a successful answer rather than an error.

Does NOT list system types (walls, floors, ceilings, pipes). Those are reported by the error message of create_line_based_element or create_surface_based_element when a type name does not match.

Args: contains: Case-insensitive substring filter matched against both family and type name. Omit to list everything up to limit. limit: Maximum results (default 50).

list_family_categoriesA

List every family category in the model, with a count per category.

Useful for orienting in an unfamiliar model before drilling into list_families, and for finding the exact category spelling that tag_elements and color_splash expect.

list_category_parametersA

List the parameters available on elements of a category.

Returns each parameter with its type and a sample value. Use this to find a valid parameter_name for color_splash, and to check what modify_elements can set on a category.

Args: category_name: Revit category, e.g. "Walls", "Doors", "Rooms".

get_selected_elementsA

Read what the user currently has selected in the Revit UI.

Use this whenever the user says "these", "the selected ones", or "what I have highlighted" - it is the only way to find out. Returns element_id, name, category, type and level for each, plus category_counts covering the whole selection.

The element_ids returned here are what modify_elements and delete_elements take as input, so this is normally the first call in a select-then-act workflow.

Returns an empty list with total_selected 0 when nothing is selected; that is a successful answer, not an error.

Does NOT change the selection. There is no tool to set the selection - the user must do that in Revit.

Args: limit: Maximum elements described in full (default 500). category_counts stays accurate for the whole selection even when the detailed list is truncated. include_parameters: Also return every readable instance parameter per element. Verbose - leave off unless parameter values are actually needed.

get_revit_security_statusA

Report the security posture of both halves of the bridge.

Answers: is a token required, is arbitrary code execution enabled, is the Revit Routes server reachable from other machines on the network, and is this server in read-only mode.

Use this when the user asks whether the setup is safe, when a call was refused as unauthorized, or before rolling this out to more people.

Never returns the token itself - only whether one is configured.

Reports both sides separately, because they are configured independently and disagreeing settings are the usual cause of confusing auth failures.

place_familyA

Place one instance of a loadable family at a point.

This is the point-based placement tool: furniture, doors, windows, columns, equipment. For walls, beams, pipes, floors and ceilings use create_line_based_element or create_surface_based_element instead.

COORDINATES ARE IN DECIMAL FEET, and rotation is in DEGREES about the vertical axis. Get exact family_name and type_name from list_families first; if the name does not resolve, the error lists what is available.

Returns the new element's id, the location it actually ended up at (which can differ from the request when a level constrains it), and which properties were applied versus rejected.

Does NOT load families that are not already in the project.

Args: family_name: Exact family name, e.g. "Desk". type_name: Exact type name. Defaults to the first type found. x, y, z: Placement point, in feet. rotation: Rotation about the Z axis, in degrees. level_name: Host level. See list_levels. properties: Instance parameters to set on the new element, e.g. {"Mark": "D-01"}.

color_splashA

Colour-code elements of a category by the value of one parameter.

Elements sharing a parameter value get the same colour, which makes this the fastest way to visually audit a model - phasing, fire rating, room department, wall type distribution.

Applies graphic overrides in the ACTIVE view only; other views are untouched. The overrides persist in the view until clear_colors is called. Returns the colour assigned to each distinct value, plus counts.

Use list_category_parameters first to get a valid parameter_name.

Args: category_name: Category to colour, e.g. "Walls". parameter_name: Parameter driving the colours, e.g. "Type Name". use_gradient: Use a continuous gradient instead of distinct colours. Suits numeric parameters; poor for text values. custom_colors: Optional hex colours to use in order, e.g. ["#FF0000", "#00FF00"].

clear_colorsA

Remove colour overrides from a category in the active view.

Reverses color_splash, returning elements to their normal appearance. Only affects the active view.

Args: category_name: Category to clear, e.g. "Walls".

modify_elementsA

Set instance parameters on existing elements, by element id.

Applies the same parameter values to every element in element_ids, in one transaction. Returns which parameters were set and which failed, per element, so a partial success is visible rather than silent.

Get element ids from get_selected_elements or get_current_view_elements first. Use list_category_parameters to find out what parameter names a category actually has.

Lengths are in Revit internal units (decimal feet), not the units shown in the UI. Yes/No parameters accept true/false.

Does NOT: create elements, change an element's type, or edit type parameters (these are instance parameters only). Read-only and computed parameters are reported as failures rather than being forced.

Args: element_ids: Element ids to modify. Must be non-empty. parameters: Parameter name to value, e.g. {"Mark": "A1", "Comments": "checked"}. Must be non-empty.

delete_elementsA

Delete elements from the model, by element id.

Destructive. Prefer calling once with dry_run=True first: that returns exactly what would be removed without touching the model, which is worth doing whenever the ids came from a filter rather than from an explicit user selection.

Deleting one element can cascade - removing a wall also removes the doors and windows hosted in it - so deleted_count can exceed the number of ids supplied. The dry run cannot predict cascades.

Does NOT accept a category or a filter, only explicit ids: use reset_model for category-wide clearing, which has its own confirmation guards.

Elements that are pinned, owned by another user in a workshared model, or structurally required (such as the last level) cannot be deleted and are reported as failures.

Args: element_ids: Element ids to delete. Must be non-empty. dry_run: When True, report what would be deleted and change nothing.

create_line_based_elementA

Create a wall, structural beam, or pipe running between two points.

ALL LENGTHS ARE IN DECIMAL FEET - this is the Revit API's internal unit and is unaffected by the project's display units. To work in millimetres, divide by 304.8 before calling (3000mm -> 9.843).

Returns the new element's id, name and category.

Use list_levels to see valid level_name values, and list_families for beam types. When level_name is omitted the lowest level is used; when type_name is omitted the first available type is used. If a name does not match, the error lists what is available - read that rather than guessing again.

Does NOT create ducts, cable trays, curved walls, or anything that needs a non-straight curve. Use execute_revit_code for those.

Args: element_kind: One of "wall", "beam", "pipe". start_x, start_y, start_z: Start point, in feet. end_x, end_y, end_z: End point, in feet. level_name: Host level. Defaults to the lowest level. type_name: Wall/beam/pipe type name. Defaults to the first found. height: Wall height in feet. Walls only, ignored otherwise. offset: Base offset from the level, in feet. Walls only. structural: Mark the wall as structural. Walls only. diameter: Pipe diameter in feet. Pipes only.

create_surface_based_elementA

Create a floor or ceiling from a closed boundary outline.

ALL COORDINATES ARE IN DECIMAL FEET (see create_line_based_element).

The boundary is an ordered list of at least three points that trace the outline. Do not repeat the first point at the end - the closing segment is added automatically. The outline must be planar and must not self-intersect.

Returns the new element's id, name and category.

Does NOT support openings, sloped floors, or boundaries built from arcs. Use execute_revit_code for those.

Ceiling creation requires Revit 2022 or newer.

Args: element_kind: Either "floor" or "ceiling". boundary: Ordered points, e.g. [{"x": 0, "y": 0, "z": 0}, {"x": 20, "y": 0, "z": 0}, {"x": 20, "y": 15, "z": 0}, {"x": 0, "y": 15, "z": 0}] level_name: Host level. Defaults to the lowest level. type_name: Floor/ceiling type name. Defaults to the first found. structural: Mark the floor as structural. Floors only.

tag_elementsA

Place tags on all elements of one category in the ACTIVE view.

Tags land in whichever view is currently active in Revit - check with get_current_view_info first if that matters. Returns how many were tagged and, for anything skipped, why.

Tagging requires a tag family for that category to be loaded in the project. If none is loaded, nothing is tagged and the response says so; that is a loaded-content problem, not something to retry.

Does NOT: tag across multiple views, position tags intelligently (each one lands at its element's centre and they will overlap in dense areas), or choose between multiple loaded tag families.

Args: category_name: Revit category to tag, e.g. "Walls", "Doors", "Windows", "Rooms". Singular or plural both resolve. limit: Maximum tags to place in one call (default 1000). skip_tagged: Skip elements that already have a tag in this view. Leave True to make repeat calls idempotent. leader: Give each tag a leader line.

open_documentA

Open a Revit document file in the running Revit instance.

Supports workshared (central) files with options to detach from central or audit the file on open.

Args: file_path: Absolute path to a .rvt, .rfa, or .rte file. detach: If True, open detached from central (workshared files only). Preserves worksets but severs the link to the central model. audit: If True, audit the file on open to check for corruption.

close_documentA

Close the active Revit document.

Args: save: If True, save the document before closing. If False (default), close without saving.

save_documentA

Save the active Revit document.

If file_path is omitted, saves the document in place. If file_path is provided, performs a Save As to the new location.

Args: file_path: Optional path for Save As. If omitted, saves in place.

sync_with_centralA

Synchronize the active workshared document with central.

Only works with workshared (central model) documents. For non-workshared documents, use save_document instead.

Args: comment: Sync comment visible in the worksharing log. compact: If True, compact the central model during sync. relinquish_all: If True (default), relinquish all borrowed elements and worksets after sync.

list_revit_installationsA

Discover all Revit versions installed on this system.

Returns a list of installed Revit versions with their executable paths. Use this to check what's available before calling launch_revit.

launch_revitA

Launch Revit on this machine, optionally opening a file.

Finds installed Revit versions automatically. After launching, polls the pyRevit Routes health endpoint until Revit is ready for MCP tools.

For workshared (central model) files, Revit will show its native worksharing dialog on open. Use the open_document tool after launch for more control over worksharing options like detach from central.

Args: file_path: Path to a .rvt, .rfa, or .rte file to open. Optional. version: Revit version year (e.g. "2025"). Uses latest if omitted. language: Language code (e.g. "ENU", "FRA"). Optional. timeout: Seconds to wait for Revit readiness (default 120).

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/elkhouryrafik-boop/revit-mcp-hardened'

If you have feedback or need assistance with the MCP directory API, please join our Discord server