revit-bridge
This server is an MCP bridge that lets an AI operate Autodesk Revit by running confirmed C# code and reusable capability packs.
Check the connection to the Revit add-in (
check/revit://connection-status), reporting host, port, token status, and open document.Inspect the model with read-only snapshots and queries: levels, grids, family types, elements, selection, view elements, units, and counts.
List available capability packs (
list_tools) and discover dynamic parameter choices (get_tool_choices) like real levels or family types before running a tool.Run C# code directly in a running Revit (
execute_code), withdocumentin scope and a transaction already open; returns execution results.Run solidified tools by name with parameters (
run_tool), e.g. creating walls or querying levels.Save working code as a reusable tool (
solidify_tool) with parameters, description, tags, and optional source queries.Enforce a confirmation gate:
execute_codeandrun_toolrequire a one-time token fromconfirm_spec, bound to the exact tool/spec and valid for 10 minutes; can be lifted withREVIT_BRIDGE_ALLOW_UNCONFIRMED=1.Expose MCP resources such as
revit://stats,revit://tools/{name}, andrevit://connection-status.
Executes code in a running Autodesk Revit instance, providing tools for design tasks such as creating walls, querying levels, listing family types, and running arbitrary C# code within Revit's document context.
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-bridgeList all levels in the current Revit project."
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-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 Desktop — claude_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-bridgeThe 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-bridgeAny 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
Start Revit, open a project and make sure the add-in is listening.
Check the connection:
uvx revit-bridge checkPrints host, port, whether a token is set, the open document's title (
document, ordocument_errorwhen the add-in answered but could not read it) and"status": "connected"; the exit code is 0 when the add-in answered, 1 otherwise.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_choiceswith a tool name — Revit returns the real levels, family types or elements for that tool's dynamic parameters.confirm_specwith the TaskSpec the designer confirmed, thenrun_toolwith the chosen values and the returnedtoken.
execute_codetakes arbitrary C# for tasks no pack covers. The code runs inside Revit withdocumentin scope and a transaction already open; end it withreturn <object>;.solidify_toolsaves 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 |
|
| Host where the add-in listens |
|
| TCP port of the add-in |
| (unset) | Pre-shared token, sent with every request when the add-in has one configured |
|
| Seconds to wait for a command to finish |
| (unset) |
|
|
| Seconds a confirmation token stays valid |
| `%LOCALAPPDATA% | |
evit-bridge | Per-user data: solidified packs, | |
|
| 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 checkLicense: MIT. Issues and discussion: https://github.com/revitbridge/revit-bridge/issues.
Available Tools
5 toolsexecute_codeADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| parameters | No | ||
| spec_confirmed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_choicesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_toolsARead-only
List all solidified tools available for execution.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_toolADestructive
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}
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| params | No | {} | |
| spec_confirmed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| name | Yes | ||
| tags | No | ||
| parameters | No | [] | |
| description | No | ||
| source_query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
execute_code - First observed
get_tool_choices - First observed
list_tools - First observed
run_tool - First observed
solidify_tool
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Unified AEC tools: ACC, Revit, Navisworks, Twinmotion, and APS from one endpoint.
Convert Revit files to XKT, IFC, or DWG and query BIM data via natural language.
AI Hub for AEC — 50+ 3D formats, clash detection, ACC integration via Autodesk Platform Services.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Related MCP Servers
- 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.1565 npm1-
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Autodesk Civil 3D, allowing them to retrieve project data, create/modify/delete drawing elements, and execute code to automate Civil 3D operations.332MIT
- AlicenseAqualityDmaintenanceEnables 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.1365 npmMIT
- AlicenseAqualityFmaintenanceEnables AI to interact with Revit via MCP, allowing data retrieval and element creation, modification, and deletion.1365 npmMIT