Keystone for Vectorworks
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| VWMCP_SPOTLIGHT | No | Set to 1 to enable the original Spotlight lighting tools. |
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| vw2d_readA | Read 2D objects with their exact geometry and attributes. Scope: uuids, or selection=True, or layer ("*" = all design layers), optionally filtered by class_name. Default: the active layer. Geometry is exact, in document units: polygons/polylines give vertices [x, y, type, radius] (type 0 corner, 3 arc control vertex) plus holes, rects give corners/angle, arcs center/radius/start_angle/sweep, lines p1/p2, texts origin/size/font. Objects inside groups are listed after their group with "parent". bbox [x1, y1, x2, y2] limits the read to an area. |
| vw2d_structureA | Layers and classes of the document and how they are used: objects per layer and class, class attributes, and organisation problems (objects in the none class, unused classes, empty layers, objects with their own attributes instead of 'by class', dimensions/texts outside their classes, inconsistent design layer scales). Read this before drawing so new objects follow the document's structure. |
| vw2d_resourcesB | List hatches or line types (document + Vectorworks default content, imported automatically when used), or classes / layers of the document. query filters by substring, e.g. "Beton", "ISO-02". |
| vw2d_setupA | Create or update classes and design layers so drawings are organised. classes: [{"name": "Wand-Tragend", "attributes": {"pen": "#000000", "fill": "#000000" | "none", "hatch": "Beton SRF", "line_weight": 0.5 (mm), "line_style": "solid" | "ISO-02 Strichlinie", "opacity": 100}}]. Class attributes are what objects use 'by class' (the default for new objects). Use "-" for class hierarchy ("Wand-Tragend"). layers: [{"name": "EG", "scale": 100}] (design layers, scale 1:100). template "architektur": a starting set of German architecture classes (walls, columns, openings, stairs, furniture, axes, dimensions, text...); only use it if the document has no class standard yet and the user agrees. Existing classes keep their name; given attributes are applied. |
| vw2d_drawA | Draw exact 2D objects (all or nothing, one undo step). Each item has a "type" plus geometry; optional "class", "layer", "name", "attributes", "unit" override the call-level defaults:
|
| vw2d_editA | Replace the outline of a polygon/polyline/rect exactly. Give one of: points [[x, y], ...] (corners), path (same format as vw2d_draw paths, lines + true arcs) or raw vertices [[x, y, type, radius]] as returned by vw2d_read. holes: list of point lists or paths. Same vertex count and no holes: edited in place (uuid stays), otherwise rebuilt with the same class, attributes, name, group and stacking position (new uuid returned). One undo step. |
| vw2d_transformA | Move, rotate, mirror or scale objects (copy=True keeps the originals). move: dx/dy, or from_point -> to_point (exact difference, e.g. a corner onto another object's corner); rotate: center + angle (degrees, ccw); mirror: axis [[x1, y1], [x2, y2]]; scale: center + sx (+ sy). One undo step. |
| vw2d_booleanA | Exact area operations (Vectorworks/Parasolid, arcs stay arcs): union (targets + tools become ONE area, e.g. a ring from its pieces), subtract (tools cut out of each target, tools stay unless keep_tools=False), intersect, split (each target cut by the line split_line [[x1, y1], [x2, y2]]). Results keep the first target's class and attributes; floating-point noise is snapped back to the exact input coordinates. One undo step. |
| vw2d_offsetA | Offset a polygon/polyline outline by distance (positive = outwards for counter-clockwise outlines), e.g. wall thickness or a plaster layer. replace=True swaps the original for the result. |
| vw2d_set_attributesA | Change class, layer or graphic attributes of objects. class_name: put the objects into this class (created if missing). layer: move them to this design layer. attributes: pen, fill ("none" | "#rrggbb"), hatch, line_style, line_weight (mm), opacity, name, or {"by_class": true} to make every graphic attribute follow the class (recommended). Any single value "class" = that attribute by class. One undo step. |
| vw2d_deleteB | Delete objects (restorable with vw_revert_last). |
| vw2d_checkA | Check drawing quality on the exact geometry and return a report (and a check image with numbered issues). Finds: overlaps and stacked fills, gaps and slivers between neighbours, points that miss each other or an edge by up to tolerance_mm, duplicates, double lines, open or self-intersecting outlines, duplicate/redundant vertices, slivers and tiny objects, objects without class, attributes not 'by class'. Overlaps/gaps are compared between objects on the same layer (compare="layer"), the same class ("class") or everything ("all"); ignore_classes (e.g. ["Ausstattung*", "Schraffur"]) leaves out classes that overlap on purpose. checks: subset of overlap, duplicate, near, gap, self_intersection, open, double_line, vertices, tiny, classes, attributes, approx. Each issue suggests a vw2d_fix action. bbox [x1, y1, x2, y2] checks only objects touching that area (fast on big drawings). Precision: 0.005 mm; distances are measured on true arcs. |
| vw2d_previewB | Check image of a scope, rendered from the exact geometry with issues marked (red errors, orange warnings, arrows = where vw2d_fix snap would move a point). focus_issue zooms to one issue id from vw2d_check; bbox [x1, y1, x2, y2] shows (and checks) only that area (document units). |
| vw2d_fixA | Fix check issues exactly, then check again (one undo step). snap: points that miss a vertex/edge by <= tolerance_mm move exactly onto
it (gaps and small overlaps disappear); objects in |
| vw2d_selectB | Select objects in Vectorworks (and zoom to them) so the user sees what was drawn or changed. |
| vw_pingA | Check the Vectorworks bridge: returns Vectorworks version, active document and bridge version. Warns if the installed bridge doesn't match this server. |
| vw_exec_pythonA | Run arbitrary Python inside Vectorworks with Returns stdout, the value of the last expression (or of a variable named
|
| vw_vs_lookupA | Search the live vs.* API (names and built-in docs) of the running Vectorworks, e.g. "record field", "symbol insert", "LDevice". Returns function names with their signature/description. |
| vw_document_infoA | Active document: name, path, units, active layer/class, counts, selection size. |
| vw_list_layersB | All layers (design and sheet) with visibility and which one is active. |
| vw_list_classesB | All class names, optionally filtered by a case-insensitive substring. |
| vw_get_selectionB | Selected objects on the active layer: uuid, type, name, class, layer, bbox, attached records, and symbol / plug-in name where relevant. |
| vw_find_objectsB | Find objects by any combination of exact class, layer, type ("Symbol", "Rectangle", "Plug-in Object"...), plug-in name ("Lighting Device"), attached record (optionally with field == value) and object name. |
| vw_get_recordB | All field values of a record (or a plug-in object's parameters, using its plug-in name as the record) on the object with this UUID. |
| vw_set_recordA | Set record fields (or plug-in parameters) on one object; unknown field names are rejected before anything changes. One undo step. Returns the record afterwards. |
| vw_list_symbolsB | Symbol definitions in the document's resource list, with their folder path; filter by name and/or folder substring (e.g. fixture lookup). |
| vw_insert_symbolB | Place a symbol from the document's resources at x, y (document units), optionally at height z, on a layer and in a class. One undo step. |
| vw_revert_lastA | Undo exactly the last MCP write in the active document: deletes what a tool created, restores objects a tool changed or deleted (geometry, attributes, class, name, group and stacking position) and restores record fields. Call repeatedly to step further back. (Vectorworks' own Cmd-Z merges consecutive MCP edits.) Raw vw_exec_python edits can't be reverted this way. Restored objects get new UUIDs (returned in mapping). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| sauber_zeichnen | Exakt und sauber organisiert in Vectorworks zeichnen (2D). |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 28 tools
Most tools have crisp boundaries: draw/edit/transform/boolean/check/fix form a clear pipeline, and the document-query tools (get_selection, find_objects, list_symbols, get_record) are distinguishable. The one fuzzy zone is document structure inspection, where vw_list_layers, vw_list_classes, vw2d_structure and vw2d_resources all report layers/classes and could be picked interchangeably.
Nearly everything follows verb_noun with a stable vw_/vw2d_ namespace prefix (get_selection, list_layers, set_record, draw, offset, boolean). The vw2d_ vs vw_ split is meaningful (2D geometry vs document/general) but is not explicitly documented, so an agent has to infer why vw2d_read and vw_get_selection both exist.
28 tools is on the heavy side for a single CAD bridge, and a few are thin wrappers (vw_ping, vw_document_info, vw_get_selection) that overlap with richer tools. However, most earn their place because the domain (exact 2D drafting, checking and fixing) genuinely needs that many distinct operations.
The surface covers the full lifecycle: document inspection, layers/classes setup, resource listing, exact draw/read/edit/transform/boolean, quality check, preview, fix, selection, undo, plus a documented Python escape hatch and API lookup for anything missing. No obvious dead ends for the stated drafting purpose.