list_active_instances
List Active Instances
Scans the system for running host processes (Autodesk, Rhino, PyNET for Tekla/Presto) with an active PyNet IPC pipe.
Takes no parameters.

io.github.RAEN-DTPublished by GitHub account RAEN-DTv1.7.1Updated Oct 30, 2026
MCP implementation to connect AI agents with the PyNet Platform for BIM/Engineering automation.
Local bridge that lets an AI assistant run Python scripts inside desktop BIM tools and drive a BIM viewer, for Navisworks, Revit, Rhino and Tekla automation.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
[Release] [PyPI] [Python] [Windows] [Hosts] [MCP] [License]
PyNet Bridge is the execution layer that allows AI models to control desktop BIM tools in real-time.
It connects Natural Language → Python → desktop BIM tools (Navisworks, Revit, AutoCAD, Rhino, Tekla Structures, RIB Presto), enabling AI to generate, execute, and refine BIM workflows autonomously.
Available integrations include Navisworks Manage, Revit, Civil 3D, Rhino, Tekla Structures (2023–2026) and RIB Presto (budgets, COM API).
This bridge acts as the connective tissue between AI logic and the desktop APIs of those hosts, allowing for dynamic UI creation, script execution, and BIM process automation using natural language.
See PyNet Bridge in action — these recordings show the full natural-language → BIM-action workflow inside live Autodesk models.
In this technical demo, Claude Code connects to Navisworks and Revit at the same time to run a full coordination workflow end-to-end:
PYNET_Classification) before coordinating.This is what turns AI from a chatbot into an execution engine for BIM.
Open PowerShell and run:
This will automatically:
uv if missing, then pynet-mcp-bridge from PyPI with uv (never pip)~/.codex/config.toml)The pynet-mcp-bridge package includes:
Restart your AI client(s) after installation to apply changes.
Install the recommended Python libraries for PyNET scripting:
This installs:
These are the third-party libraries listed under Allowed Python Imports. Standard library modules (
json,sys,re, etc.) are already included with Python.
.mcpb) launches the server with uvx pynet-mcp-bridge, so uv must be installed and on your PATH. Install it with winget install astral-sh.uv. Without uv, the extension will fail to start.1. Install the package:
Use uv only — do not install with pip. A pip copy lands in a different interpreter from the
pynet-bridge launcher, so upgrades and fixes silently miss the environment that actually runs.
2. Configure Claude Desktop:
Add the following to your claude_desktop_config.json:
%APPDATA%\Claude\claude_desktop_config.json%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\claude_desktop_config.json3. Configure Claude Code (VS Code extension):
Add to %USERPROFILE%\.claude.json:
4. Configure Cline:
Add to %APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json:
5. Configure Roo Code:
Add to %APPDATA%\Code\User\globalStorage\rooveterinaryinc.roo-cline\settings\mcp_settings.json:
6. Configure Codex CLI:
Add to %USERPROFILE%\.codex\config.toml:
These tools allow AI to fully control the PyNet environment, from UI creation to script execution and system monitoring. Once connected, the AI will have access to the full suite of PyNet tools:
Drives the PyNet BIM Viewer open in VS Code. Reads clash data from the loaded .pnt package and controls the 3D view over a local (127.0.0.1) connection — nothing leaves your machine.
clashes.json and returns each clash with its pnt_id identifiers..pnt into the open viewer, pushes the models, and returns a summary.pnt_id (element A red, element B green).These are realistic prompts you can give your AI client once PyNet Bridge is connected.
Prompt: "Connect to my open Navisworks model and tell me how many items are in the current selection."
The AI calls list_active_instances to find the running Navisworks process (e.g. Navisworks (PID 12345)), then calls send_command with a short Python script that reads the active document's selection. Expected output: a message like Current selection contains 42 items.
Prompt: "Give me a summary of clash test results in the open model and export the counts as a table."
The AI calls list_active_instances, then send_command with a script that iterates the DocumentClash results using the whitelisted Autodesk.Navisworks.Clash assembly and returns counts per test. Expected output: a table such as Test 'Structure vs MEP': 17 active, 3 resolved.
Prompt: "Create a new ribbon tab called 'QA' and add a button that runs my hide-empty-layers script."
The AI calls create_pynet_module (returns a new module ID), then deploy_script_button with the button name, script path, icon and tooltip. Expected output: Button 'Hide Empty Layers' deployed to module QA. — visible immediately in the Autodesk ribbon.
ℹ️ Every script sent via
send_command/send_command_by_pathis first validated by the built-in static analyzer (see Safe AI Execution). Scripts that violate the import/call whitelist are rejected before reaching Autodesk.
PyNet Bridge includes a built-in validation layer that ensures all AI-generated scripts are safe and controlled before execution.
✔ Prevents unsafe operations
✔ Blocks unauthorized system access
✔ Guarantees controlled interaction with BIM models
AI remains powerful, but within safe boundaries
Starting from v1.1.1, the MCP server includes a built-in static analyzer that validates every script before it reaches the host application. All scripts are parsed and inspected at the bridge level — rejected scripts never leave the MCP server.
Only these .NET references are permitted via clr.AddReference:
System, System.Windows.Forms, System.Drawing, System.Collections.GenericAutodesk.Navisworks.Api, .ComApi, .Interop.ComApi, .ClashRevitAPI, RevitAPIUIAcMgd, AcCoreMgd, AcDbMgd, AecBaseMgd, AecPropDataMgd, AeccDbMgd, ManagedMapApiRhinoCommon, Rhino.UI, EtoTekla.Structures, .Model, .Drawing, .Datatype, .Dialog, .Catalogs, .Plugins__presto__ scope variable (COM)Raen.Core.Pynet.*, Raen.{Product}.Pynet.* (any version — e.g. Raen.Core.Pynet.Resources, Raen.Navisworks.Pynet.2024, Raen.Civil3D.Pynet.2026, Raen.Rhino.Pynet.8, Raen.Tekla.Pynet.2026, Raen.Presto.Pynet)clr, sys, json, re, time, datetime, pathlib, typing, threading, collections, xml, math, pandas, plotly, matplotlib, dash, webbrowser, psutil, functools, openpyxl, uuid, zipfile, io, mimetypes, difflib, csv, ifcopenshell, numpy, shapely, qgis, processing, pypdf, docx, rhinoscriptsyntax, scriptcontext
Some modules are allowed at the submodule level only, preventing access to dangerous siblings:
os, subprocess, shutil, socket, ctypes, pickle, importlib, urllib, signal, multiprocessing, tempfile, glob, inspect, code, codeop
eval, exec, compile, __import__, getattr, setattr, delattr, globals, locals, vars, breakpoint, open
__builtins__, __subclasses__, __globals__, __code__
Any script that violates these rules is immediately rejected with a descriptive error message, without ever being sent to the plugin.
Start building autonomous BIM workflows in minutes.
Install the bridge, connect your AI client, and turn natural language into real actions inside your models.
Have questions about installation, configuration, or usage? Check the full FAQ page:
This MCP is part of a modular system designed to enable AI-driven BIM automation across desktop BIM tools.
This repository is designed to work alongside:
Together, these components enable:
Natural Language → AI → Python Script → PyNet → Host application → BIM Action
PyNet Bridge runs entirely on your local machine. It does not collect, store, or transmit any personal data, telemetry, or analytics.
Full privacy policy: https://privacy.raendt.com/
PyNet Bridge is Windows-only. It relies on Windows-specific local communication facilities and on desktop BIM applications (Navisworks, Revit, Civil 3D, Rhino, Tekla Structures, RIB Presto), which are Windows products. macOS and Linux are not supported.
This project is licensed under the MIT License.
mcp-name: io.github.RAEN-DT/pynet-mcp-bridge
[RAEN Digital Tools]
© 2026 RAEN Digital Tools · Todos los derechos reservados.
Obra inscrita en el Registro de la Propiedad Intelectual de la Comunidad de Madrid.
Source: README.md at commit be418d5
List Active Instances
Scans the system for running host processes (Autodesk, Rhino, PyNET for Tekla/Presto) with an active PyNet IPC pipe.
Takes no parameters.
Check Plugin Status
Handshake ping to verify the plugin listener is responsive.
pidrequiredSend Command
Direct script execution in the PyNet engine (Target PID, Script Name, Content).
pidrequiredcontentrequiredtimeoutrequiredscript_namerequiredSend Command By Path
Executes a script file directly by path in the PyNet engine, without sending content inline.
pidrequiredtimeoutrequiredfile_pathrequiredscript_namerequiredGet Output Window Status
Checks if the output window is currently available/visible.
pidrequiredConfigure Output Window
Toggles the visibility of the PyNet log/output window.
pidrequiredis_availablerequiredGet PyNet UI Layout
Fetches the full UI structure (ButtonsModules and ScriptButtons).
pidrequiredCreate PyNet Module
Creates a new custom Tab (ButtonsModule) in the Ribbon.
pidrequirednamerequiredDelete PyNet Module
Permanently deletes a module and all its contents.
pidrequiredmodule_idrequiredGet Buttons Data
Lists all script buttons for a specific module ID.
pidrequiredmodule_idrequiredDeploy Script Button
Installs a new ScriptButton into a specific module (Name, Script, Icon, Tooltip).
pidrequirednamerequiredtooltipicon_namemodule_idrequiredscript_PathrequiredUpdate Script Button
Updates metadata for an existing ScriptButton or moves it to another module.
pidrequirednamerequiredtooltiprequiredbutton_idrequiredicon_namerequiredmodule_idrequiredscript_Pathrequireddest_module_idDelete Script Button
Permanently removes a ScriptButton from a module by Id.
pidrequiredbutton_idrequiredmodule_idrequiredViewer Status
Reports whether a PyNet BIM Viewer is open in VS Code (port, package, data dir).
Takes no parameters.
Viewer List Clashes
Reads the loaded package's clashes.json — the data source, NOT the viewer/IFC. Returns each clash with the pnt_id identifiers needed to highlight it.
Takes no parameters.
Viewer Load Package
Loads a .pnt into the open viewer and returns a summary read from clashes.json.
pnt_pathrequiredViewer Highlight Clash
Highlights a clash (element(s) A red, element(s) B green) and isolates the rest away. Usually one pnt_id per side (a single clash pair), but either side accepts a list — e.g. one element (A) against every counterpart it clashes with (B), all shown at once.
pnt_id_apnt_id_bViewer Fit
Fits the camera to all models in the open viewer.
Takes no parameters.
Viewer Clear
Clears highlights and ghosting in the open viewer.
Takes no parameters.
Viewer Select
Highlights a set of elements in the open viewer by pnt_id, in neutral colours (yellow / blue) with nothing else hidden — a plain "look at these" pointer. Pass a list of pnt_ids in `pnt_ids` (group A). Optionally pass a second list in `pnt_ids_b` to highlight a second group in a distinct colour. Replaces any previous selection. Use viewer_list_clashes / viewer_get_properties to obtain pnt_ids. For a clash pair (red/green, with the rest of the model isolated away), use viewer_highlight_clash instead.
pnt_idspnt_ids_bViewer Isolate
Isolates (hides everything except) the given pnt_ids in the open viewer.
pnt_idsViewer Isolate Models
Shows only the given model(s)/discipline(s) (by exact name, e.g. "Snowdon Towers Sample HVAC"), hiding every other loaded model. Cheaper than viewer_isolate for "just show me this discipline" requests — no need to resolve every element's pnt_id first. Get the exact model names from viewer_get_state's "models" list. Undo with viewer_clear.
modelsViewer Get State
Reads the viewer's last reported state: loaded models and the pnt_id of whatever the user currently has selected (click in the 3D view or the tree panel — null if nothing is selected). Use the returned pnt_id with viewer_get_properties for its details, or feed it into a clashes.json lookup to find what it clashes with.
Takes no parameters.
Viewer Get Properties
Reads element properties (name, model, psets) from the loaded package's properties.json. Pass one or more pnt_ids to get their full properties (including psets) directly. Called with no pnt_ids, returns a paginated lightweight index (pnt_id, name, model) instead of every element — narrow it with `model` (exact model/discipline name, e.g. "Snowdon Towers Sample HVAC") and/or `search` (case-insensitive substring of the element name), and page through with `limit`/`offset` (default 200 per page, capped at 500). On a federated model the unfiltered index can have tens of thousands of entries — always pass `model` or `search` when you can, and use `offset` to page through the rest. The data source is the .pnt's properties.json, NOT the viewer or IFC.
limitmodeloffsetsearchpnt_ids90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
irm https://raw.githubusercontent.com/RAEN-DT/PyNetBridge/main/install.ps1 | iexirm https://raw.githubusercontent.com/RAEN-DT/PyNetBridge/main/install-libraries.ps1 | iexuv tool install pynet-mcp-bridge{ "mcpServers": { "pynet-bridge": { "command": "pynet-bridge", "args": [] } }}{ "mcpServers": { "pynet-bridge": { "type": "stdio", "command": "pynet-bridge", "args": [] } }}{ "mcpServers": { "pynet-bridge": { "type": "stdio", "command": "pynet-bridge", "args": [] } }}{ "mcpServers": { "pynet-bridge": { "type": "stdio", "command": "pynet-bridge", "args": [] } }}[mcp_servers.pynet-bridge]command = "C:/Users/<user>/.local/bin/pynet-bridge.exe"args = []