Skip to main content
Glama
revitbridge

revit-bridge

by revitbridge

revit-bridge

Intent bridge between designers and AI for Autodesk Revit: an MCP server that executes code in a running Revit, keeps a library of reusable capability packs, and refuses to run anything the designer has not confirmed.

The package contains no model SDK, no vector store and no web framework. Your MCP host (Claude Desktop, Claude Code, any MCP client) brings the model; the revit-bridge-addin inside Revit executes the code.

Install

Prerequisites: Python 3.11+ with uv (for uvx), Revit 2026 with the add-in installed and its local TCP listener on (default 127.0.0.1:18080).

Claude Desktopclaude_desktop_config.json:

{
  "mcpServers": {
    "revit-bridge": {
      "command": "uvx",
      "args": ["revit-bridge"]
    }
  }
}

Claude Code - the plugin (skill + MCP server + confirmation hook, recommended):

/plugin marketplace add revitbridge/revit-bridge
/plugin install revit-bridge@revit-bridge

The plugin's .mcp.json starts the server with uvx; its hooks/hooks.json denies execute_code / run_tool calls that carry no confirmation token (uv run executes plugin/hooks/spec_gate.py, so uv must be on PATH). The skill is also installable on its own with npx skills add revitbridge/revit-bridge.

MCP server only, without the skill and hook:

claude mcp add revit-bridge -- uvx revit-bridge

Any MCP client — run uvx revit-bridge as a stdio server. Pass connection settings through environment variables (see Configure), for example in the env block of the host's server entry.

From a checkout: uv sync then uv run revit-bridge.

Related MCP server: Civil3D MCP Server

Use

  1. Start Revit, open a project and make sure the add-in is listening.

  2. Check the connection:

    uvx revit-bridge check

    Prints host, port, whether a token is set, the open document's title (document, or document_error when the add-in answered but could not read it) and "status": "connected"; the exit code is 0 when the add-in answered, 1 otherwise.

  3. In your host, work in three steps:

    • get_project_snapshot — what the model contains (units, levels, grids, family types, selection, …); query(kind, args) answers single read-only questions (levels, grids, family_types, elements, selection, view_elements, units, counts). Neither needs confirmation.

    • list_tools — see the capability packs (create_wall, query_levels, …).

    • get_tool_choices with a tool name — Revit returns the real levels, family types or elements for that tool's dynamic parameters.

    • confirm_spec with the TaskSpec the designer confirmed, then run_tool with the chosen values and the returned token.

    execute_code takes arbitrary C# for tasks no pack covers. The code runs inside Revit with document in scope and a transaction already open; end it with return <object>;. solidify_tool saves code that worked as a new pack.

Confirmation gate. execute_code and run_tool return confirmation_required without a token. A token comes only from confirm_spec(spec): the TaskSpec lists every parameter with its value, source and evidence; the server validates it and issues a one-time token bound to exactly that tool and those parameters (or that code). Running anything else with it, reusing it, or using it after 10 minutes fails with confirmation_invalid. missing_params and reconcile help build the spec. Hosts that run their own confirmation flow can set REVIT_BRIDGE_ALLOW_UNCONFIRMED=1.

Resources: revit://stats, revit://tools/{name}, revit://connection-status.

Configure

Variable

Default

Meaning

REVIT_BRIDGE_HOST

127.0.0.1

Host where the add-in listens

REVIT_BRIDGE_PORT

18080

TCP port of the add-in

REVIT_BRIDGE_TOKEN

(unset)

Pre-shared token, sent with every request when the add-in has one configured

REVIT_BRIDGE_TIMEOUT

60

Seconds to wait for a command to finish

REVIT_BRIDGE_ALLOW_UNCONFIRMED

(unset)

1 lifts the confirmation-token gate (host-internal flows only)

REVIT_BRIDGE_CONFIRM_TTL

600

Seconds a confirmation token stays valid

REVIT_BRIDGE_DATA_DIR

`%LOCALAPPDATA%

evit-bridge(Windows),~/.local/share/revit-bridge` (else)

Per-user data: solidified packs, usage.json, later the evidence ledger

REVIT_BRIDGE_CAPABILITIES_DIR

<data dir>/capabilities

User pack directory; the packs shipped in the wheel stay visible, a user pack of the same name replaces one

Development:

uv sync
uv run pytest
uv build
uvx --from . revit-bridge check

License: MIT. Issues and discussion: https://github.com/revitbridge/revit-bridge/issues.

Available Tools

5 tools
execute_codeA
Destructive

Send C# code to Revit for execution over the local TCP socket. Refused unless spec_confirmed=true (the designer confirmed the task spec). Returns execution result or error message.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
parametersNo
spec_confirmedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint=false and destructiveHint=true, and the description is consistent with them. It adds value beyond the annotations by disclosing the spec_confirmed refusal behavior and the return contract (execution result or error message), which the annotations do not convey. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the core purpose is front-loaded, followed by the critical gating condition, then the return behavior. Zero fluff or repetition of schema/annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists (covering the return contract) and annotations cover the safety profile (destructive, not read-only), so the description needn't repeat those. It covers purpose and the critical gate. The one notable gap is the parameters array semantics, which remain undefined in both schema and description; however, a correct basic invocation is still achievable with just code and spec_confirmed=true.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains spec_confirmed explicitly ('must be true or the tool refuses') and implies the code parameter (the C# code being sent), but it never clarifies the free-form parameters array — what it contains, whether it maps to method arguments, or its relationship to the code. This is only partial compensation for the absent schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is highly specific: 'Send C# code to Revit for execution over the local TCP socket' names the verb, the resource, and the transport mechanism. This makes it easy to distinguish from siblings like list_tools, get_tool_choices, and run_tool without looking at their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation context by disclosing the refusal gate: 'Refused unless spec_confirmed=true'. This tells the agent when the call will fail and what precondition must be met. However, it does not explicitly contrast with alternatives such as run_tool or say when NOT to use it beyond the gate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tool_choicesA
Read-only

Query Revit for dynamic parameter choices of a solidified tool. Call this BEFORE run_tool to discover available levels, family types, etc. Returns {param_name: [{label, value}, ...]} for parameters that need selection.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals a non-mutating operation, and the description adds useful behavioral detail beyond that: it returns parameter-name-to-options mapping and targets only parameters that need selection. No side effects, permissions, or error behavior are described, but for a read-only query tool with an output schema this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with no filler: the purpose is front-loaded, the sequencing guidance is immediate, and the return format is stated exactly. Every sentence contributes a distinct, useful fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one simple parameter, an output schema, and read-only annotations, the description covers the essential workflow: discover choices before running. The only notable gap is the imprecise parameter meaning, and there is no mention of what happens if the tool is not yet solidified. These are minor given the low complexity and existing output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden of explaining the 'name' parameter. It says 'of a solidified tool' but never explicitly states that name is the solidified tool's name; this is only implied. A clear mapping such as 'name = the name of the solidified tool' would have compensated for the empty schema, and its absence makes the parameter meaning ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pairing ('Query Revit for dynamic parameter choices of a solidified tool') and adds the return shape, so an agent knows exactly what to expect. It also differentiates the tool from siblings by positioning it as the discovery step before run_tool, making its role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'Call this BEFORE run_tool to discover available levels, family types, etc.' This is clear context for the primary use case. It does not enumerate when-not-to-use cases or name multiple alternatives, but the run_tool reference is sufficient for typical agent selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_toolsA
Read-only

List all solidified tools available for execution.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already communicates that this is a safe read operation, and the description adds the scope that only 'solidified' tools are listed. It does not describe any further behavioral traits such as ordering, filtering, or output limitations, but for a simple list tool with an output schema this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no filler or redundant wording. It conveys the core purpose efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with an output schema, the description provides sufficient context for an agent to invoke it correctly. The only minor gap is that it does not clarify how this listing differs from the sibling get_tool_choices.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, and the schema is already complete with 100% coverage. The description reinforces that the tool lists all available tools without requiring inputs, which is consistent with the empty parameter set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('List') and the resource ('all solidified tools available for execution'), making the tool's purpose easy to grasp. However, it does not explicitly distinguish itself from the sibling get_tool_choices, which could plausibly serve a similar listing role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus siblings like run_tool or get_tool_choices. There is no mention of the appropriate context, prerequisites, or why this tool should be selected over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_toolA
Destructive

Execute a solidified tool by name with given parameters. IMPORTANT: Call get_tool_choices first for parameters with choices_from / source: query:*. Refused unless spec_confirmed=true (the designer confirmed the task spec). params: JSON object of parameter values, e.g. {"level_name": "L1", "height": 3000}

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
paramsNo{}
spec_confirmedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses a refusal gate (spec_confirmed=true) and a required preceding call for dynamic params. The destructiveHint annotation already covers destructiveness, and the description adds concrete behavioral constraints without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences; the main verb+object, the most important warning, and a concrete parameter example are packed with no filler. The critical prerequisites are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential invocation path: call get_tool_choices for generated params, set spec_confirmed=true, and supply params JSON. With an output schema present and annotations covering safety, remaining gaps such as where names come from are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The example of params as a JSON object and spec_confirmed=true adds meaning to the otherwise bare schema, which has 0% coverage. However, it calls params a 'JSON object' while the schema declares a string type, which can mislead an agent into passing an object instead of a JSON-encoded string.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States 'Execute a solidified tool by name with given parameters.' This names a specific verb and target and clearly differentiates from siblings like solidify_tool (creation), list_tools, and get_tool_choices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit prerequisites: call get_tool_choices first for parameters with choices_from / source: query:*, and notes the tool is refused unless spec_confirmed=true. It does not explicitly compare with execute_code or list_tools, but the required conditions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

solidify_toolB

Save a successful code execution as a reusable named tool. parameters: JSON array of {name, type, description, source?, default?, choices_from?} tags: comma-separated tags

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
nameYes
tagsNo
parametersNo[]
descriptionNo
source_queryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the outcome (saving a reusable named tool) but does not disclose side effects, overwrite behavior, persistence, what counts as 'successful,' or how the tool relates to prior execution state. For a mutation-like tool, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, stating the core purpose in the first sentence and following with useful parameter format hints. There is no filler or redundant restating of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, no annotations, and an output schema that covers return values, the description still leaves important gaps: what 'source_query' means, how a successful code execution is identified, and any prerequisites. The agent has enough to attempt a call, but not to confidently ensure correct invocation. An output schema does not excuse missing parameter context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds meaningful format details for 'parameters' ('JSON array of {name, type, description, source?, default?, choices_from?}') and 'tags' ('comma-separated tags'), which the schema does not provide. However, it leaves 'source_query' and the top-level 'description' field unexplained, and code/name are only self-evident from their names. Partial compensation only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Save a successful code execution as a reusable named tool.' This clearly distinguishes it from sibling tools like execute_code (executes), run_tool (runs a tool), and list_tools (lists tools). An agent can immediately understand what this tool accomplishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'successful code execution' implies the tool should be used after code has been executed successfully, providing some contextual guidance. However, the description does not explicitly say when to use this tool over alternatives, nor does it mention exclusions or prerequisites. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedexecute_code
    • First observedget_tool_choices
    • First observedlist_tools
    • First observedrun_tool
    • First observedsolidify_tool

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation4/5

Most tools have clearly distinct roles: execute_code runs raw C#, run_tool runs saved tools, solidify_tool creates them, and list_tools/get_tool_choices support discovery. However, execute_code and run_tool both perform execution, which could cause an agent to misselect when only one is appropriate.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern: execute_code, solidify_tool, list_tools, get_tool_choices, run_tool. The naming is predictable and makes the surface easy to navigate.

Tool Count5/5

Five tools is well-scoped for a Revit bridge: execute raw code, solidify it, list solidified tools, query parameter choices, and run a solidified tool. Each tool earns its place with no unnecessary redundancy.

Completeness3/5

The set covers creating, listing, querying, and running solidified tools, but lacks update and delete operations for those tools. There is also no way to view a single tool's details, leaving the lifecycle partially incomplete.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to interact with Autodesk Revit to query project data, manage elements, and execute generated code via the Model Context Protocol. It provides full compatibility with GitHub Copilot and Claude to automate BIM modeling workflows.
    13
    65 npm
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    Enables AI to interact with Revit via MCP, allowing data retrieval and element creation, modification, and deletion.
    13
    65 npm
    MIT