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.
无需输入参数。

io.github.RAEN-DT由 GitHub 账号 RAEN-DT 发布v1.7.1更新于 Oct 30, 2026
MCP implementation to connect AI agents with the PyNet Platform for BIM/Engineering automation.
本地桥接服务,让 AI 助手在 Navisworks、Revit、Rhino、Tekla 等桌面 BIM 软件中执行 Python 脚本并操控 BIM 查看器。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
参照 仓库 中的启动说明。
[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.
来源:README.md,提交 be418d5
List Active Instances
Scans the system for running host processes (Autodesk, Rhino, PyNET for Tekla/Presto) with an active PyNet IPC pipe.
无需输入参数。
Check Plugin Status
Handshake ping to verify the plugin listener is responsive.
pid必填Send Command
Direct script execution in the PyNet engine (Target PID, Script Name, Content).
pid必填content必填timeout必填script_name必填Send Command By Path
Executes a script file directly by path in the PyNet engine, without sending content inline.
pid必填timeout必填file_path必填script_name必填Get Output Window Status
Checks if the output window is currently available/visible.
pid必填Configure Output Window
Toggles the visibility of the PyNet log/output window.
pid必填is_available必填Get PyNet UI Layout
Fetches the full UI structure (ButtonsModules and ScriptButtons).
pid必填Create PyNet Module
Creates a new custom Tab (ButtonsModule) in the Ribbon.
pid必填name必填Delete PyNet Module
Permanently deletes a module and all its contents.
pid必填module_id必填Get Buttons Data
Lists all script buttons for a specific module ID.
pid必填module_id必填Deploy Script Button
Installs a new ScriptButton into a specific module (Name, Script, Icon, Tooltip).
pid必填name必填tooltipicon_namemodule_id必填script_Path必填Update Script Button
Updates metadata for an existing ScriptButton or moves it to another module.
pid必填name必填tooltip必填button_id必填icon_name必填module_id必填script_Path必填dest_module_idDelete Script Button
Permanently removes a ScriptButton from a module by Id.
pid必填button_id必填module_id必填Viewer Status
Reports whether a PyNet BIM Viewer is open in VS Code (port, package, data dir).
无需输入参数。
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.
无需输入参数。
Viewer Load Package
Loads a .pnt into the open viewer and returns a summary read from clashes.json.
pnt_path必填Viewer 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.
无需输入参数。
Viewer Clear
Clears highlights and ghosting in the open viewer.
无需输入参数。
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.
无需输入参数。
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_ids已满足适用检查项的 90%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
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 = []