PyNet Bridge
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PYTHONPATH | No | Path to your src directory |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_active_instancesA | Scans the system for running host processes (Autodesk, Rhino, PyNET for Tekla/Presto) with an active PyNet IPC pipe. |
| check_plugin_statusB | Handshake ping to verify the plugin listener is responsive. |
| send_commandB | Direct script execution in the PyNet engine (Target PID, Script Name, Content). |
| send_command_by_pathA | Executes a script file directly by path in the PyNet engine, without sending content inline. |
| get_output_window_statusB | Checks if the output window is currently available/visible. |
| configure_output_windowC | Toggles the visibility of the PyNet log/output window. |
| get_pynet_ui_layoutC | Fetches the full UI structure (ButtonsModules and ScriptButtons). |
| create_pynet_moduleC | Creates a new custom Tab (ButtonsModule) in the Ribbon. |
| delete_pynet_moduleC | Permanently deletes a module and all its contents. |
| get_buttons_dataA | Lists all script buttons for a specific module ID. |
| deploy_script_buttonB | Installs a new ScriptButton into a specific module (Name, Script, Icon, Tooltip). |
| update_script_buttonB | Updates metadata for an existing ScriptButton or moves it to another module. |
| delete_script_buttonB | Permanently removes a ScriptButton from a module by Id. |
| viewer_statusA | Reports whether a PyNet BIM Viewer is open in VS Code (port, package, data dir). |
| viewer_list_clashesA | 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_packageB | Loads a .pnt into the open viewer and returns a summary read from clashes.json. |
| viewer_highlight_clashA | 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. |
| viewer_fitA | Fits the camera to all models in the open viewer. |
| viewer_clearA | Clears highlights and ghosting in the open viewer. |
| viewer_selectA | 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 |
| viewer_isolateA | Isolates (hides everything except) the given pnt_ids in the open viewer. |
| viewer_isolate_modelsA | 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. |
| viewer_get_stateA | 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_propertiesA | 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 The data source is the .pnt's properties.json, NOT the viewer or IFC. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 24 tools
Most tools have clearly distinct purposes, especially the viewer_* family where select, isolate, highlight_clash, and isolate_models are separated by context. Minor overlap exists between get_buttons_data and get_pynet_ui_layout, and among the several status-checking tools, but descriptions generally resolve the ambiguity.
Names are overwhelmingly snake_case and follow verb_noun or viewer_action patterns, making the set easy to scan. There are small inconsistencies such as deploy_script_button instead of create_script_button and inconsistent resource prefixes outside the viewer_* group.
With 24 tools the server is on the heavy side, but the surface spans several real subdomains: viewer control, script-button management, module management, engine command execution, and diagnostics. Each tool appears to earn its place rather than being redundant.
Core workflows are well covered: viewer package loading and inspection, clash/property lookup, selection and isolation, script-button CRUD, module creation/deletion, command execution, and status checks. Minor gaps exist, such as no explicit module update/rename or viewer package unload/close operation, but these are workable around.