Navisworks vs Blender MCP

A side-by-side look at the Navisworks and Blender MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Navisworks logoNavisworksArchitecture & Design · Remote HTTP/SSENavisworks clash detection, 4D simulation, quantity takeoff.51GoodAuth: not declaredBlender MCP logoBlender MCPArchitecture & Design · Local subprocess (stdio)Open-source MCP to use Blender with any LLM67GreatAuth: no auth required

Verdict: choose Navisworks for architecture & design work over a hosted endpoint; choose Blender MCP for architecture & design as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Navisworks logoChoose Navisworks when

  • You need dedicated capabilities in the Architecture & Design domain.
  • You prefer a remote HTTP/SSE transport.
  • You want tools like nwd_upload, nwd_get_clashes, nwd_export_report.
Explore Navisworks

Blender MCP logoChoose Blender MCP when

  • You need dedicated capabilities in the Architecture & Design domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: No auth required.
  • You want tools like get_addon_status, disable_telemetry, get_scene_info.
Explore Blender MCP

Feature & specification comparison

Rows where the two servers differ are marked.

SpecNavisworks logoNavisworksBlender MCP logoBlender MCP
CategoryArchitecture & DesignArchitecture & Design
Quality signal51/100 · Good67/100 · Great
Install commandConfirmedConfirmed
TransportRemote HTTP/SSELocal subprocess (stdio)
AuthNot declaredNo auth required
PricingNot declaredFree
Required env varsNone listedNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars032,267
Directory activity 0 views 0 installs 0 upvotes 10 views 0 installs 0 upvotes
Tools532

Tools & capabilities

Navisworks tools 5

  • nwd_uploadUpload a Navisworks file (.nwd/.nwf/.nwc) to Autodesk Platform Services (APS) Object Storage and start an SVF2 translation job so the model becomes queryable by the other nwd_* tools. When to use: at the start of a coordination workflow — e.g. the GC hands off a federated NWD combining MEP + structural + architectural models and the agent needs to stage it for clash review before issuing an RFI, or when a subcontractor publishes a new NWC model revision that must be ingested for weekly BIM coordination. Always the first call in a session for any new model. When NOT to use: do not call for already-translated models (re-use the returned model_id/URN); do not use for raw Revit .rvt, IFC, or DWG — those go through a different MCP. APS scopes required: data:read data:write data:create bucket:read bucket:create viewables:read. The worker acquires a 2-legged client-credentials token; the caller does not supply one. Rate limits: APS default ~50 req/min per app per endpoint; Model Derivative translation job submission ~60 req/min. NWD bundles can be large (hundreds of MB); the upload PUT and translation can take minutes — translation is asynchronous, poll via nwd_export_report (manifest) with exponential backoff (e.g. 5s, 10s, 30s, 60s) before calling clash/properties tools. Errors the agent should handle: 401 invalid/expired APS token (surface as auth failure — do not retry with same creds); 403 missing scope (report scope gap, do not retry); 404 source file_url unreachable (ask user for a fresh public URL); 409 bucket already exists (handled internally, safe to ignore); 413/422 unsupported Navisworks version — APS Model Derivative supports NWD/NWC from Navisworks 2015 and later (state the unsupported version to the user); 429 rate limited (exponential backoff, retry); 5xx APS upstream (retry once, then surface). Side effects: creates a fresh transient OSS bucket (scanbim-nwd-<timestamp>, 24h TTL) and uploads the file as an object, then POSTs a Model Derivative translation job. NOT idempotent — each call creates a new bucket/URN even for the same file_url. Logs usage to the D1 usage_log table.
  • nwd_get_clashesDetect geometric/logical clashes between two element sets in an already-translated Navisworks model. Uses APS Model Derivative property extraction + same-level proximity heuristics, optionally augmented by VDC rules stored in D1 (table vdc_rules). When to use: when coordinating federated MEP + structural + architectural models for clash review before issuing an RFI; e.g. "find duct vs. beam clashes on Level 3 before the Wed coordination meeting" or "sanity-check the latest MEP revision against structure before releasing for fabrication." Pair with nwd_export_report to produce a deliverable. When NOT to use: do not call on a model whose translation is still "inprogress" — call nwd_export_report first and confirm translation_status == "success"; not a substitute for Navisworks Manage Clash Detective for final sign-off (this is a coordination-stage screen, not a regulatory clash report). APS scopes required: viewables:read data:read (read-only — does not create anything in APS). Rate limits: APS default ~50 req/min per endpoint; Model Derivative metadata/properties endpoints are the bottleneck. Properties response may return 202 "isProcessing" on first call — the worker retries once after 3s. For very large models (>50k elements) the worker caps analysis at 50x50 element cross-compare and 100 reported clashes; re-run with tighter category_a/category_b filters for exhaustive coverage. Errors: 401 APS token expired (transient, retry); 403 missing viewables:read/data:read scope (report, do not retry); 404 URN not found or not translated (prompt user to re-run nwd_upload); 409 not applicable; 422 model translated but property index unavailable — typically means source NW version unsupported or translation partially failed (supported: Navisworks 2015+); 429 rate limit (backoff); 5xx APS upstream (retry once). If properties.data.collection is empty the tool returns clash_count: 0 with a note rather than erroring — the agent should treat that as "model not ready" and retry later. Side effects: none in APS. Reads vdc_rules from D1 when both categories are supplied. Logs usage to D1 usage_log. Idempotent — same inputs on a stable model yield the same clash list.
  • nwd_export_reportBuild a coordination report for a translated Navisworks model: translation status/progress, derivative outputs, available views (2D sheets / 3D viewables), total element count, and a per-category element breakdown. Doubles as the canonical way to poll translation status after nwd_upload. When to use: after nwd_upload to check whether translation has completed before calling clash/object tools; at the end of a coordination session to generate a status snapshot for the weekly BIM report; when auditing a model revision to confirm expected element counts per discipline. When NOT to use: do not use for a per-element property dump — use nwd_list_objects; do not use for clash results — use nwd_get_clashes. APS scopes required: viewables:read data:read bucket:read (read-only). Rate limits: APS default ~50 req/min per endpoint; this tool issues up to 4 sequential APS calls (manifest, metadata, properties — two with retry). When polling for translation completion, backoff: 5s, 10s, 30s, 60s, 120s — Model Derivative NWD translation typically completes in 1-10 min but large federated models can take 20+ min. Errors: 401 APS token expired (retry); 403 missing scope (report); 404 URN not found (model was never uploaded or bucket TTL expired); 409 N/A; 422 translation failed permanently — inspect report.translation_status == "failed" and report.derivatives[].status; 429 rate limit (backoff); 5xx APS upstream (retry once). Property extraction may legitimately 202 "isProcessing" — the tool handles retry and then silently swallows to still return manifest/metadata (element_count will be 0 until properties index is built). Side effects: none. Pure read. Idempotent — report reflects current APS state. Logs usage to D1 usage_log.
  • nwd_get_viewpointsList saved viewpoints / camera positions and top-level view containers for a translated Navisworks model. Pulls the metadata view list and enriches each 3D view with its first two levels of the object tree (viewpoint folders typically live there in NWD files). When to use: when preparing a coordination meeting and you need a quick index of every saved viewpoint (e.g. "Level 3 Mech Room", "Clash - duct vs beam gridline C-4") to drive screenshots or BCF-style issues; when an agent needs to deep-link a 2D sheet or 3D camera into the APS Viewer. When NOT to use: does not return camera matrices (position/target/up vectors) — APS Model Derivative does not expose those from the NWD viewpoint XML; for full camera data the source NWD must be opened in Navisworks Manage. APS scopes required: viewables:read data:read. Rate limits: APS default ~50 req/min; this tool fans out one object-tree call per 3D view (capped implicitly by metadata view count, usually <5). For federated models with many sheets this can approach the per-minute quota — cache the result. Errors: 401 token (retry); 403 scope (report); 404 URN not found / translation incomplete; 409 N/A; 422 model returned empty metadata (returns viewpoint_count:0 rather than throwing — agent should verify translation via nwd_export_report); 429 rate limit (backoff); 5xx APS upstream (retry once). Per-view object-tree failures are swallowed so the overall call still returns the metadata-level view list. Side effects: none. Pure read. Idempotent. Logs usage to D1 usage_log. Results are capped at 100 viewpoint entries.
  • nwd_list_objectsList elements (objects) in the translated Navisworks model with their objectid, name, externalId, and full property bag, optionally filtered by a case-insensitive keyword matched against name and Category. When to use: when answering "how many VAV boxes are on Level 3?", "list every steel column with mark C-*", or any per-element question; when dumping a quick takeoff of a discipline before handing off to an estimator; when an agent needs externalIds to cross-reference with a Revit or ACC issue. When NOT to use: not for clash detection (use nwd_get_clashes); not for camera/viewpoint data (use nwd_get_viewpoints); not for full-model exports — results are capped at 100 objects per call, so use the filter argument to narrow. APS scopes required: viewables:read data:read. Rate limits: APS default ~50 req/min; two Model Derivative calls per invocation (metadata guid + properties). Properties endpoint may 202 "isProcessing" on first call after translation — the worker retries once after 3s. For very large models the properties payload can be tens of MB; expect higher latency. Errors: 401 token (retry); 403 scope (report); 404 URN not found; 409 N/A; 422 property index not yet built — returns object_count:0 (poll via nwd_export_report); 429 rate limit (backoff); 5xx APS upstream (retry once). If property collection is legitimately empty the tool returns success with object_count:0 and an empty objects array. Side effects: none. Pure read. Idempotent. Logs usage to D1 usage_log. Response includes a `note` field when the unfiltered collection exceeds the 100-object cap.

Blender MCP tools 32

  • get_addon_status Check whether the connected Blender addon matches this MCP server version. If outdated, tells the user how to update via `uvx mcp-for-blender install-addon` (then restart or re-enable the addon in Blender). `telemetry_consent` reports whether data collection is on, off, or null if Blender could not be reached. Use it to answer telemetry status questions.
  • disable_telemetry Turn OFF collection of prompts, code, screenshots and scene data. Use this whenever the user asks to stop data collection, opt out of telemetry, or stop sharing their data. Takes effect immediately. This tool can only turn collection OFF. Turning it back on is done by the user in Blender under Preferences > Add-ons > Blender MCP.
  • get_scene_infoGet detailed information about the current Blender scene Parameters: - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged. Required.
  • get_object_info Get detailed information about a specific object in the Blender scene. Parameters: - object_name: The name of the object to get information about - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
  • get_viewport_screenshot Capture a screenshot of the current Blender 3D viewport. Parameters: - max_size: Maximum size in pixels for the largest dimension (default: 800) - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged. Returns the screenshot as an Image.
  • execute_blender_code Execute arbitrary Python code in Blender. Make sure to do it step-by-step by breaking it into smaller chunks. Parameters: - code: The Python code to execute - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
  • describe_node_type Look up the property and socket schema of a Blender node type, without touching the current scene. Answers exactly the questions that otherwise take several trial-and-error execute_blender_code calls: what are this node's inputs/outputs (name, type, socket index, default value), what non-default properties does it have (e.g. data_type, blend_type, sky_type), and what enum values are valid for each. Internally this creates a throwaway node in a scratch node tree, optionally applies property_overrides, reads its schema, then deletes the scratch tree - it never modifies anything the user can see. Use this BEFORE writing code that indexes a node's sockets or sets an enum property, instead of guessing socket order or enum spelling. Parameters: - bl_idname: The node's bl_idname, e.g. "ShaderNodeMix", "ShaderNodeTexSky", "ShaderNodeBsdfPrincipled". - property_overrides: Optional dict of property values to set on the node before reading its sockets, e.g. {"data_type": "RGBA"} for a Mix node. Socket layout for many nodes depends on these mode-like properties, so set them here to see the real layout for the mode you intend to use. - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
  • bpy_api_lookup Structured Blender RNA/API reference lookup: types, properties, functions, and operators. Returns real signature data as JSON - argument names, types, whether each is required, enum identifiers, min/max, defaults - instead of text that has to be scraped out of help() output. Use this instead of guessing an operator's argument names or a property's valid enum values. Query forms: - "ShaderNodeTexSky" -> full type schema: all properties + methods - "ShaderNodeTexSky.sky_type" -> one property's type, enum items, default - "Object.ray_cast" -> one method's parameters and return values - "bpy.ops.mesh.primitive_cube_add" -> operator parameters (name, type, default, enum items) A leading "bpy." / "bpy.types." is optional and stripped automatically. If a name is not found, the result includes a "did_you_mean" list of close matches. Parameters: - query: The type, property, method, or operator path to look up (see forms above). - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
  • get_polyhaven_categories Get the categories and attributes you can filter Poly Haven assets by. Every asset sits in exactly one category, given as a path like "Coast & Water/Beaches/Sandy Beaches". Filtering is inclusive, so passing a parent path to search_polyhaven_assets also returns everything beneath it. Categories describe what an asset IS. Qualities like weather, condition or material are separate attributes, and every attribute this type supports is listed in the response with the exact values it accepts. Pass those to search_polyhaven_assets's `attributes`. Parameters: - asset_type: hdris, textures, models, or all. Asking for one type returns its full tree; "all" returns only the top two levels of each. - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
  • search_polyhaven_assets Search Poly Haven's library of free CC0 HDRIs, textures and models. Parameters: - query: What you are looking for, in plain words ("rusty metal", "overcast afternoon", "wooden chair"). Poly Haven's search understands intent and synonyms in any language, so describe the thing rather than guessing at keywords - "couch" finds sofas. Leave it out to browse the most downloaded assets instead. - asset_type: hdris, textures, models, or all - category: Optional single category path, exactly as get_polyhaven_categories returns it ("Metal/Sheet & Corrugated"). Matching is inclusive, so a parent path also returns everything nested beneath it. - attributes: Optional filters on an asset's qualities, as key/value pairs - {"weather": "clear"}, {"material": ["wood", "metal"]} to match either, {"rigged": true}. Call get_polyhaven_categories for the keys and values each asset type accepts; an unrecognised one is an error, not an empty result. - min_size_m: Optional floor on an asset's real-world size, in metres. A texture covers a fixed real-world area, so a 0.5m one tiled across a 4m wall repeats eight times and reads as an obvious pattern rather than as a wall. Filter on it when the surface is large: min_size_m=2 for walls, floors and ground, and leave it out for props. Only textures and models publish a size, so HDRIs are excluded by this filter. - limit: How many results to return (default 20, maximum 50) - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged. Results are returned in ranked order, most relevant first. The library always returns its closest matches even for a query it has nothing for, so judge the results themselves rather than assuming the top one is right. Two things worth reading in the results before picking one. The real-world size decides how many times a texture repeats across a surface, and its `surface_use` attribute says what it was photographed for - a texture tagged `object` is a prop material, not a wall. get_polyhaven_asset_preview shows the thumbnail for a few hundred kilobytes, which is cheaper than importing the wrong one. Returns each asset's id, name, type, author, category, tags and page URL.
  • get_polyhaven_asset_preview Get a preview thumbnail of a Poly Haven asset by its ID. Use this to check an asset looks right before downloading it. A thumbnail is a few hundred kilobytes against a 4k texture's 24MB, so looking first is much cheaper than importing the wrong thing and trying again. Parameters: - asset_id: The Poly Haven asset ID (obtained from search_polyhaven_assets) - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged. Returns the asset's thumbnail as an Image.
  • download_polyhaven_asset Download and import a Polyhaven asset into Blender. Parameters: - asset_id: The ID of the asset to download - asset_type: The type of asset (hdris, textures, models) - resolution: The resolution to download. Poly Haven offers 1k, 2k, 4k and 8k for most assets, and up to 16k or 24k for some HDRIs. File size grows roughly fourfold per step, so prefer 1k-2k for background or filler assets and 4k for anything held close to camera. If a resolution is unavailable, the error names the ones that are. - file_format: Optional. hdr (default) or exr for HDRIs; jpg (default), png or exr for textures. Models are always imported from .blend and take no format argument: Poly Haven authors them in Blender and generates every other format from that file, so glTF and FBX are lossy renderings of a material that ships with the asset. - user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged. Returns a message indicating success or failure.
  • +20 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Navisworks

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "navisworks": {
      "url": "https://navisworks-mcp.itmartin24.workers.dev/mcp"
    }
  }
}

Blender MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "ahujasid-blender-mcp": {
      "command": "uvx",
      "args": [
        "blender-mcp"
      ]
    }
  }
}

Frequently asked questions

Navisworks is categorized under Architecture & Design and uses a remote HTTP/SSE transport. Blender MCP belongs to Architecture & Design and uses a local stdio subprocess. Pick Navisworks for architecture & design work and Blender MCP for architecture & design.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Navisworks has no declared pricing — check the project's own site. Blender MCP is listed as free. Auth: no auth required. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add navisworks and ahujasid-blender-mcp as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Navisworks has a quality signal of 51/100 (Good) with 0 views, 0 installs and 0 GitHub stars. Blender MCP has 67/100 (Great) with 10 views, 0 installs and 32,267 GitHub stars.