Skip to main content
Glama
giorgiomoroder

Vectorworks MCP

Vectorworks MCP

Beta. Tested on Vectorworks 2026 (Update 3, English) with Spotlight on macOS only. Other versions, languages and Windows may not work yet. Save your file before asking for edits, and please report what you find. Working under an NDA? Read Your drawing data first.

Let Claude work inside your open Vectorworks drawing. Spotlight first: read and bulk-edit Lighting Devices, check positions, pull paperwork, and run any Vectorworks Python when you need more.

  • Mac-native. Pure Python, no C++ SDK, no compiling. Built and tested on macOS with Vectorworks 2026.

  • Spotlight-first. Channels, addresses, purposes, colors, gobos, positions.

  • Safe edits. Every bulk edit is validated before anything changes, and vw_revert_last undoes exactly the last thing Claude did.

Example asks, once it's set up:

  • "List every device on the 1E with its channel and color."

  • "Which devices have no position? Which position names have no position object?"

  • "Renumber channels on FOH TRUSS 101 to 127 in unit-number order."

  • "Move FOH TRUSS units 1–6 to universe 2, starting at address 1."

  • "Give me a channel hookup as CSV on my Desktop."

  • "Undo that last change."


Install (about 10 minutes, macOS)

You need: Vectorworks 2026, and Claude Desktop and/or Claude Code.

1. Run the installer (2 minutes)

Open Terminal (Applications > Utilities) and paste:

curl -LsSf https://raw.githubusercontent.com/giorgiomoroder/vectorworks-mcp/main/scripts/install-macos.sh | bash

It installs uv if needed, copies the small bridge script into your Vectorworks Plug-ins folder (~/Library/Application Support/Vectorworks/2026/Plug-ins/vwmcp/), and adds Vectorworks to Claude Desktop and Claude Code. Your existing Claude Desktop settings are kept (a backup is saved next to them).

2. Create the "MCP Run Job" menu command in Vectorworks (once, 2 minutes)

Claude reaches into Vectorworks through one menu command. Vectorworks only allows plug-ins like this to be made in its Plug-in Manager:

  1. Tools ▸ Plug-ins ▸ Plug-in Manager… ▸ Custom Plug-ins tab ▸ New…

  2. Choose Command, name it exactly MCP Run Job, click OK.

  3. With it selected, click Edit Script…, set Language: Python, and paste:

    from vwmcp import vwmcp_bridge
    vwmcp_bridge.run_pending()

    Click OK, then Close.

  4. Tools ▸ Workspaces ▸ Edit Current Workspace… ▸ Menus tab. Find MCP Run Job in the left list (under Miscellaneous) and drag it into any menu on the right, e.g. Tools. Click OK.

Test it: choose Tools ▸ MCP Run Job. Nothing visible happens, and no error appears. That's correct; there's no work queued yet.

3. Restart Claude and say hello (1 minute)

Quit and reopen Claude Desktop. With a drawing open in Vectorworks, ask:

Ping Vectorworks.

The first time, macOS asks whether Claude may control Vectorworks. Click Allow. You should get back your Vectorworks version and the name of your open drawing.


Related MCP server: rhino-mcp

Tools

Tool

What it does

vw_ping

Bridge alive? Vectorworks version, open document, bridge version check

vw_document_info

Units, active layer/class, counts, selection size

vw_list_layers, vw_list_classes

Layers (design/sheet, visibility) and classes

vw_get_selection

Selected objects: type, name, class, layer, bbox, records

vw_find_objects

Find by class, layer, type, plug-in, record field value, name

vw_get_record, vw_set_record

Read/write record fields or plug-in parameters

vw_list_symbols, vw_insert_symbol

Symbol definitions by name/folder; place one at x, y(, z)

vw_list_lighting_devices

Every Lighting Device: unit, channel, address, purpose, position, type, color, gobo, focus…

vw_set_lighting_device_fields

Bulk edit by position + unit number, channel, or uuid

vw_list_positions

Positions with their devices, plus unassigned devices and orphan position names

vw_lighting_device_report

Paperwork export (CSV or JSON), naturally sorted

vw_revert_last

Undo exactly the last Claude edit in this drawing (repeatable)

vw_exec_python

Run any Vectorworks Python (vs.*) and get stdout, value, traceback

vw_vs_lookup

Search the vs.* API of your Vectorworks, with signatures

Your drawing data and NDAs

What leaves your Mac: whatever Claude reads from your drawing, plus whatever you type, is sent to Anthropic as part of your Claude conversation. That includes fixture lists, channel and address data, position and layer names, venue and show names, and anything else the tools return. The .vwx file itself is never uploaded, but Claude can read most of what's in it if you ask.

What stays local: the bridge runs entirely on your Mac. Requests and results pass through ~/.vwmcp/, and nothing in this project sends data anywhere except through your Claude app.

If a project is under NDA or a client confidentiality clause:

  • Check whether your agreement allows project data to be processed by a third-party AI service. Many NDAs don't address it, and some forbid it. When in doubt, ask the client or producer first.

  • Your Claude plan and privacy settings govern how Anthropic stores conversations and whether they may be used for model training. Review them at claude.ai/settings and in Anthropic's privacy policy. Team and Enterprise plans have different terms from personal plans.

  • Limit what Claude sees: ask about one position or layer rather than the whole drawing, and prefer report tools that return only the columns you need.

  • Don't use it on a confidential drawing if you can't share that drawing's contents with Anthropic.

Good to know

  • Undo. Vectorworks lumps back-to-back Claude edits into a single Cmd-Z, so Cmd-Z may undo several of them at once (never your own work). To undo exactly one Claude edit, ask Claude to "undo that" (vw_revert_last). This works for all typed edit tools. Changes made with raw Python (vw_exec_python) can only be undone with Cmd-Z.

  • Bulk edits are all-or-nothing. If any device in a bulk edit can't be found or any field name is wrong, nothing changes. Unit numbers repeat per position, so give the position too.

  • Addresses. Spotlight treats UniverseAddress (e.g. 2/101) as the source of truth. Edits to Universe or DMX Address are applied through it automatically, and the tool re-reads each device afterwards and reports anything Spotlight overrode.

  • Dialogs block Claude. If a Vectorworks dialog is open, Claude's request waits and then times out with a message saying so. Close the dialog and ask again.

  • Just launched? Claude waits until Vectorworks has been open ~30 seconds. Scripts sent while Vectorworks is still starting can crash it.

  • Log file. Bridge errors and timeouts are logged to ~/.vwmcp/vwmcp.log.

Troubleshooting

When reporting a problem, please use the bug report form.

Symptom

Fix

"did not pick up the job"

Open a drawing, close any dialog, and check MCP Run Job is in a menu (step 2, part 4). Run it once by hand; it should do nothing silently.

"is not running" / "still starting"

Open Vectorworks and wait a few seconds.

A "Script Errors" window in Vectorworks

Usually raw Python calling a vs function with the wrong arguments. Click OK; ask Claude to check the signature with vw_vs_lookup.

vw_ping warns about bridge version

Re-run the installer (or uvx --from git+https://github.com/giorgiomoroder/vectorworks-mcp vwmcp install-plugin).

Nothing happens, no macOS permission prompt

System Settings ▸ Privacy & Security ▸ Automation: allow Claude (or Terminal) to control Vectorworks 2026.

vw_ping warns the Vectorworks version is untested

It may work; save first, check results, and please open an issue either way.

Different Vectorworks version

VW_VERSION=2025 before the installer command, and set VWMCP_APP="Vectorworks 2025" in the server's environment. Only 2026 is tested.

Manual configuration

See docs/claude-config.md for the Claude Desktop and Claude Code config blocks, and the environment variables.

How it works

Claude ──MCP──▶ vwmcp server ──writes──▶ ~/.vwmcp/jobs/<id>.json
                     │
                     └─AppleScript: run VectorScript "DoMenuTextByName('MCP Run Job')"
                                          │
Vectorworks ◀────────────────────────────┘
  MCP Run Job ▶ vwmcp_bridge.run_pending(): exec job with `vs` in scope
              ▶ ~/.vwmcp/results/<id>.json ──▶ server ──▶ Claude

The in-app bridge is a ~120-line "dumb executor" and rarely changes. All logic, including the helper library run inside Vectorworks, is sent from the server with each request. Details and the reasons for this design are in docs/architecture.md; vs.* findings are in docs/vs-notes.md.

Windows

Experimental and untested. scripts/install-windows.ps1 installs the bridge and registers Claude Desktop, but there's no automatic trigger yet: run MCP Run Job yourself to process each request. Contributions welcome.

Development

uv sync
uv run pytest            # bridge round-trips with a fake Vectorworks
uv run vwmcp             # run the server on stdio

Code sent into Vectorworks (src/vwmcp/vwlib.py, vw-plugin/) must stay Python 3.9-compatible: that's what Vectorworks 2026 embeds.

Nothing from the Vectorworks install (stubs, SDK headers, libraries, sample files) is included. Bring your own licensed Vectorworks.

vicquick/vwx-mcp and SRVR-JOE/showcad-mcp (Windows, native palette), BhaveshY/vectorworks-mcp (Windows, architecture), mako-357/vectorworks-mcp (C++ SDK).

License

MIT

Available Tools

17 tools
vw_document_infoA
Read-only

Active document: name, path, units, active layer/class, counts, selection size.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish this as a safe read (readOnlyHint=true, openWorldHint=false). The description adds real value by enumerating the returned payload, which matters because no output schema exists — the agent learns it gets path, units, active layer/class, counts and selection size. It stops short of clarifying what 'counts' actually counts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with no filler — the resource leads and the reported fields follow as a compact list. Every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only tool with no output schema, the field enumeration covers most of what an agent needs to decide whether to call it. The one soft spot is the vague 'counts' entry, which leaves the return payload partially underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. Schema coverage is also 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (the active document) and enumerates what it reports — name, path, units, active layer/class, counts, selection size. That distinguishes it from siblings like vw_list_layers or vw_get_selection, which drill into single categories, though it never explicitly contrasts itself with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no statement of prerequisites or alternatives, and no indication of when a sibling such as vw_get_selection or vw_list_layers would be the better call. The agent must infer usage entirely from the field list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_exec_pythonA

Run arbitrary Python inside Vectorworks with vs in scope.

Returns stdout, the value of the last expression (or of a variable named result), and the traceback if it raised. Vectorworks embeds Python 3.9. Handles are only valid during the call; return UUIDs (vs.GetObjectUuid) to refer to objects later. A wrong vs.* signature can pop a modal "Script Errors" dialog in Vectorworks instead of raising; check with vw_vs_lookup first. Set modifies_document=False for read-only code; otherwise vw_revert_last can't step past this call.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
modifies_documentNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond annotations: return contents (stdout, last expression or `result`, traceback), embedded Python version 3.9, the handle-lifetime constraint with the vs.GetObjectUuid workaround, and the non-obvious failure mode of a modal 'Script Errors' dialog rather than an exception. Nothing in the structured fields conveys any of this.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the essential purpose in the first clause, then each subsequent sentence delivers a distinct operational fact (returns, runtime version, handle lifetime, dialog gotcha, flag semantics). No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description explicitly documents what is returned, and it covers the environment, safety knob, and failure modes an agent needs to invoke this high-variance tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the load. It defines the execution context for `code` (`vs` in scope, returns last expression or `result`) and fully explains the operational meaning of `modifies_document` including its effect on vw_revert_last. Minor gaps: no mention of code size/time limits or argument passing, but the critical semantics are covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run arbitrary Python inside Vectorworks') plus the execution environment ('with `vs` in scope'). It is immediately distinguishable from siblings like vw_vs_lookup (signature checking) and the read-only list/get tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to vw_vs_lookup before calling ('A wrong vs.* signature can pop a modal... check with vw_vs_lookup first'), and tells the agent when to set modifies_document=False versus when not to, citing the vw_revert_last interaction as the consequence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_find_objectsB
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
fieldNo
layerNo
limitNo
valueNo
pluginNo
recordNo
class_nameNo
object_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds nothing behavioral beyond that: it doesn't disclose the default 500 limit, truncation/pagination behavior, ordering, or what happens on a no-match query. With annotations carrying the load, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that opens with the verb and then lists the filter dimensions. No filler, and the parenthetical examples earn their space by disambiguating type and record values. Dense but not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required. However, for a 9-parameter query tool with 0% schema description coverage, the description omits the limit/pagination default and gives no syntax detail for the "field == value" coupling. Adequate but with a clear hole around result-size control.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does for most fields: class_name, layer, object_type (with example values), plugin ("Lighting Device"), record, name, and the coupled field/value pair ("field == value"). That is strong coverage of 8 of 9 parameters. It leaves the limit parameter unmentioned, which is the main gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb+resource ("Find objects") is specific and immediately clarifies that this is a filtered query tool. The enumeration of accepted dimensions (class, layer, type, plug-in name, record, name) makes the scope concrete. It doesn't name any sibling to distinguish itself from, but the purpose itself is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Any combination" implies the filters are composable, which is mild usage context, but there is no explicit when-to-use statement, no exclusions, and no routing to alternatives such as vw_get_selection or vw_get_record. The agent must infer the use case entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_get_recordB
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYes
recordYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, covering the safety profile. The description adds genuine behavioral context by disclosing that a plug-in object's parameters can be retrieved by passing the plug-in name as the record, which the annotations do not convey. It says nothing about missing-record behavior or error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with no filler. The plug-in clarification is somewhat parenthetically buried rather than front-loaded, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and annotations cover the read-only safety profile. For a simple two-parameter getter, the description plus structured fields are sufficient, with only minor gaps around parameter formatting and failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden. It explains the 'record' argument can be either a record name or a plug-in name, which is valuable, but leaves 'uuid' undefined beyond the obvious and gives no format expectations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (all field values of a record) and scopes it to an object UUID, distinguishing it from the sibling vw_set_record by implication of retrieval. It is phrased as a noun clause rather than a verb, but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no mention of the complementary vw_set_record, and no statement of prerequisites. The only actionable hint is that a plug-in name may be passed as the record argument, which is inferable but not framed as usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_get_selectionB
Read-only

Selected objects on the active layer: uuid, type, name, class, layer, bbox, attached records, and symbol / plug-in name where relevant.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description usefully adds the scoping constraint that only the active layer is scanned, but it omits any mention of the default limit of 500, meaning a large selection could be silently truncated with no warning.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with the resource and field list front-loaded and no filler. It is a fragment rather than a sentence, but every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return structure need not be re-explained. However, with an undocumented limit parameter and no routing guidance against 16 siblings, the definition leaves real gaps for an agent deciding whether and how to call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one parameter (limit) with 0% schema description coverage, and the description never mentions it at all. The agent gets no indication that results are capped or how to raise the cap, so the description fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the specific resource ('selected objects on the active layer') and enumerates the fields returned, so an agent knows exactly what this tool surfaces. It lacks an explicit verb and does not distinguish itself from sibling query tools like vw_find_objects, which is the only thing keeping it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus vw_find_objects, vw_get_record, or vw_list_layers. The agent must infer that this reads the current selection while find_objects queries by criteria. No prerequisites or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
zNo
nameYes
layerNo
rotationNo
class_nameNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the mutation/non-destructive profile is partly covered. The description adds genuine value with 'One undo step', telling the agent the operation is reversible, but omits what null layer/class defaults resolve to and how it interacts with the current selection.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, placement details front-loaded, and the undo behavior given as a compact trailing clause. No filler, though 'from the document's resources' is the only hint at prerequisite validity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no output schema and non-destructive annotations, the description covers the core placement contract and reversibility but leaves the rotation parameter and the null-default behavior of layer/class unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the burden. It does explain x, y, z (document units, optional height), layer and class for five of seven parameters, but says nothing about the semantics of 'name' (must it exist in document resources?) or 'rotation', nor what null layer/class means.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (place/insert) and resource (symbol from the document's resources) with the placement coordinates, which is clear and distinct from readers like vw_list_symbols or vw_find_objects. It does not explicitly differentiate itself by name from those siblings, but the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives (e.g., vw_list_symbols to discover valid names). The agent is left to infer that this is the write counterpart to the symbol-listing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_lighting_device_reportA
Read-only

Paperwork export of Lighting Devices (channel hookup, instrument schedule...). Default columns: Position, Unit Number, Inst Type, Wattage, Purpose, Channel, UniverseAddress, Circuit Number, Color, Template, Focus. Sorted naturally by sort_by (blank values last). Returns the CSV/JSON text, and also writes it to output_path if given.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNo
formatNocsv
sort_byNoChannel
positionNo
output_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover readOnly, but the description adds real value beyond them: it names the default column set, the sort behavior including blank-values-last, the return type, and the side effect of writing to output_path. That side effect is the key thing an agent needs. Only missing piece is any error/permission behavior when output_path is unwritable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Compact and front-loaded: purpose first, then defaults, sort, return, side effect. No filler sentences, though the fields/position omission slightly hurts density of useful info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return format needn't be over-explained, but two of five parameters (fields, position) are undocumented and the tool-vs-sibling choice isn't covered. Adequate for a read-only exporter, but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry parameter meaning, and it partially does: it documents sort_by (with blank-last semantics), format (CSV/JSON text returned), and output_path (writes file). But fields and position are never explained, leaving two parameters undocumented anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific deliverable: a paperwork export of Lighting Devices with named contents (channel hookup, instrument schedule). Clearly distinct from vw_list_lighting_devices and vw_set_lighting_device_fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (you want a report/hookup export), but it never explicitly contrasts with vw_list_lighting_devices or says when to choose the list tool instead. No exclusions or prerequisites stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_list_classesB
Read-only

All class names, optionally filtered by a case-insensitive substring.

ParametersJSON Schema
NameRequiredDescriptionDefault
name_containsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds the useful detail that matching is case-insensitive, but says nothing about ordering, result size, or empty-result behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the resource and filter behavior front-loaded and no filler. It errs slightly on the terse side for a tool with a nullable parameter, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing tool with an output schema (so return values need no explanation) and one optional parameter, the description covers the essential behavior. Only the parameter's name/default mapping and any result ordering are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden for the single parameter, and it does add real meaning: matching is a case-insensitive substring rather than an exact or prefixed match. However it never names or maps the parameter or states the default (null = no filter), leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb 'list' and the resource 'class names' with the optional filter behavior, so an agent can distinguish it from siblings like vw_list_layers or vw_list_symbols by resource alone. It stops short of explicitly differentiating itself from those siblings, but the resource is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no prerequisites, and never names an alternative such as a search or find tool. 'Optionally filtered' describes the parameter, not the context in which the tool should be selected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_list_layersB
Read-only

All layers (design and sheet) with visibility and which one is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description contributes the useful fact that both design and sheet layers are included and that visibility plus the active layer are reported, which is real value beyond the annotations, though nothing about ordering or completeness is stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact fragment with no wasted words. It is under-specified rather than verbose, but it is front-loaded and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return structure need not be explained, and a zero-param read tool has few moving parts. Still, the description is a noun phrase rather than a statement of behavior, leaving the agent to guess whether this is a full enumeration or a filtered subset.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4; there is nothing for the description to disambiguate beyond confirming the tool takes no input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The fragment conveys the resource (layers, both design and sheet) and the attributes returned (visibility, active one), so an agent knows roughly what it gets. But there is no verb and no explicit differentiation from siblings like vw_list_classes or vw_get_selection beyond the noun itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use context, no prerequisites, and no mention of alternatives among the many list_* siblings. The agent must infer that this is the read-only enumeration counterpart to any layer-setting tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_list_lighting_devicesA
Read-only

All Spotlight Lighting Devices, sorted by position then unit number.

Default fields: Unit Number, Channel, Dimmer, Universe, DMX Address, UniverseAddress, Absolute Address, Num Channels, Purpose, Position, Inst Type, Wattage, Color, Template (gobo), Template2, Focus, Circuit Number/Name, Mark, Symbol Name, Fixture Mode, GDTF Fixture Name, Device Type, User Field 1-6. Pass fields to choose others (any Lighting Device parameter name). Filter by exact position name or layer. Each row has a uuid.

ParametersJSON Schema
NameRequiredDescriptionDefault
layerNo
limitNo
fieldsNo
positionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is established. The description still adds real behavioral context beyond that: rows are sorted by position then unit number, each row carries a uuid, and `fields` accepts any Lighting Device parameter name. It omits any note on the 5000 default limit or truncation behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core statement is front-loaded and efficient. The long default-fields enumeration is verbose but defensible because it tells the agent which columns exist without a schema lookup; it is the only part that strains conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be documented, and the description already hints at the uuid key. Read-only safety is covered by annotations, filtering and field selection are covered. The one real gap is the meaning/effect of the limit parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden, and it largely does: `fields` is explained as an override with the allowed value space, `position` as an exact name match, and `layer` as a filter. Only `limit` (default 5000) is left unexplained by either the description or the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource (list all Spotlight Lighting Devices) plus scope and sort order, so the agent knows exactly what comes back. It does not, however, distinguish itself from close siblings like vw_lighting_device_report or vw_find_objects, leaving the agent to infer which listing/query tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the two filterable dimensions (exact position name or layer) and how to override the returned fields, which implies the usage context. But there is no explicit when-to-use or when-not-to-use versus vw_lighting_device_report, vw_get_selection, or vw_find_objects, so routing remains implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_list_positionsA
Read-only

Lighting positions (Light Position Obj, Lighting Pipe, Ladder, Truss, Hanging Position) with the devices whose Position field names them. Also reports how many devices have no position, and position names used by devices that have no matching position object.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_devicesNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds valuable non-obvious behavior: it aggregates devices by position, reports a count of devices with no position, and flags device position names that have no matching position object — that last bit is a data-quality disclosure an agent couldn't guess from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact clauses, each carrying distinct information: what counts as a position, device association, and the two diagnostic reports. Slightly dense parenthetical enumeration but no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with annotations and one param, the description covers outputs conceptually but not the include_devices toggle, and with no output schema the agent has only prose to infer the return shape. Adequate but with clear gaps given output schema is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and there is one boolean parameter, include_devices, defaulting true. The description never explains what setting it false does (presumably skips the device lists and returns just positions), which is the one parameter-level nuance an agent would need. Baseline 3 applies for a single param, but the gap is real.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (lighting positions), and enumerates exactly what object types count as positions (Light Position Obj, Lighting Pipe, Ladder, Truss, Hanging Position). This distinguishes it clearly from the device-oriented siblings like vw_list_lighting_devices and vw_lighting_device_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through its content (you get positions plus the devices naming them), but never says when to prefer this over vw_list_lighting_devices or vw_lighting_device_report. The relationship to those siblings is inferable but not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_list_symbolsB
Read-only

Symbol definitions in the document's resource list, with their folder path; filter by name and/or folder substring (e.g. fixture lookup).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
folderNo
name_containsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description usefully adds that folder paths accompany results and that filters are substring matches, but it says nothing about the 1000-item limit default, truncation behavior, or case sensitivity of the substring match.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence that names the resource first and the filtering behavior second, with no filler. The phrasing 'Symbol definitions in the document's resource list' is slightly noun-heavy but still efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with an output schema (so return shape needs no explanation), the description covers what is listed and how to filter. It is nonetheless incomplete on the limit/pagination behavior and on how 'folder' matching interacts with 'name_contains' when both are supplied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the load. It clarifies the matching semantics for two of three parameters ('name and/or folder substring'), but the 'limit' parameter is entirely unmentioned, leaving the caller with no idea that results can be capped at 1000.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Symbol definitions in the document's resource list') and adds what is returned ('with their folder path'), which distinguishes it from sibling listers like vw_list_layers and vw_list_classes. It never names an alternative tool, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(e.g. fixture lookup)' hints at a use case, and the filter clause implies when the tool is useful. However, there is no guidance on when to prefer this over vw_find_objects or vw_vs_lookup, and no statement of prerequisites (e.g. an open document).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_pingA
Read-only

Check the Vectorworks bridge: returns Vectorworks version, active document and bridge version. Warns if the installed bridge doesn't match this server.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine behavior beyond that: it lists the three returned values and discloses a warning-on-mismatch condition, which is non-obvious diagnostic behavior. It does not cover failure modes (e.g. what happens when the bridge is unreachable), keeping it out of the top band.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler; the purpose and return payload are front-loaded before the warning behavior. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument diagnostic with no output schema, the description sufficiently explains what comes back and the key behavioral signal (version-mismatch warning). An agent has enough to call it correctly, though it doesn't say what output looks like on connection failure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to clarify beyond confirming it is argument-free.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check the Vectorworks bridge') and enumerates what it returns (Vectorworks version, active document, bridge version), which distinguishes it from data-retrieval siblings like vw_document_info. It stops short of explicitly naming the sibling it replaces, so it lands just under the top band.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the mention of warning on a version mismatch suggests this is a connectivity/health check run before other operations, but there is no explicit 'use this when...' or 'do not use this for...' guidance. No alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_revert_lastA

Undo exactly the last MCP write in the active document: restores the previous field values of vw_set_record / vw_set_lighting_device_fields, or deletes the symbol vw_insert_symbol placed. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations confirm a mutating but non-read-only-safe operation (readOnlyHint=false, destructiveHint=false, openWorldHint=false); the description adds real context beyond them: what state is restored, that the effect is scoped to MCP-originated writes only, and that repeated calls step back further. It does not say what happens when there is nothing to revert (error vs no-op), and 'deletes the symbol' sits in mild tension with destructiveHint=false, though the undo framing makes it a restore rather than a destruction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action, then the scope of what gets restored, then the repetition and limitation notes. No filler; every clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema undo operation, the description covers scope, repeatability, and the one major limitation (vw_exec_python edits). Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so 4 is the baseline. The description correctly implies no arguments are needed and adds no misleading parameter talk.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('undo exactly the last MCP write in the active document') and immediately scopes it by naming the sibling tools whose effects it reverses (vw_set_record, vw_set_lighting_device_fields, vw_insert_symbol). An agent can distinguish it from vw_exec_python and the setters without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit invocation guidance ('Call repeatedly to step further back') and explicit exclusions: raw vw_exec_python edits can't be reverted this way, and Cmd-Z merges consecutive MCP edits so this tool is the fine-grained alternative. This is exactly when-to-use plus when-not-to-use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_set_lighting_device_fieldsA

Bulk-edit Lighting Device fields in one undo step.

updates is a list of {selector, "fields": {name: value}} where selector is one of: "uuid"; "position" + "unit_number" (unit numbers repeat per position); "unit_number" alone if unique; or "channel" if unique. Example: [{"position": "1E", "unit_number": "3", "fields": {"Channel": "101", "Color": "R02"}}].

All selectors and field names are validated first; if any fail, nothing changes. Revert exactly this call with vw_revert_last. Universe / DMX Address edits are applied via UniverseAddress (Spotlight's source of truth). Returns before/after per device as re-read from Vectorworks, with not_applied listing anything Spotlight overrode.

ParametersJSON Schema
NameRequiredDescriptionDefault
updatesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the write/non-destructive profile, and the description adds substantial behavior beyond that: validation-first all-or-nothing semantics ('if any fail, nothing changes'), single-step undoability, the UniverseAddress source-of-truth caveat, and the return shape including a not_applied list for overridden values. This is rich context that structured fields do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action in the first sentence, then progressively details selectors, validation, revert, and return behavior. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite a 1-param tool with 0% schema coverage, the description supplies selector syntax, validation semantics, revert path, and return format. Even with an output schema present, it adds enough that an agent could invoke it correctly on the first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the full burden, and it does: it defines the shape of `updates` as {selector, fields}, enumerates every selector variant (uuid, position+unit_number, unique unit_number, unique channel), and gives a concrete example. This fully compensates for the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (bulk-edit), resource (Lighting Device fields), and a distinguishing scope constraint (one undo step). An agent can immediately tell this apart from vw_set_record or vw_list_lighting_devices without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: it routes the agent to vw_revert_last for undoing and notes Universe/DMX edits go via UniverseAddress. However, it never explicitly states when to prefer this over sibling setters like vw_set_record, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
uuidYes
recordYes
valuesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false), so the bar is lower, yet the description adds real value: validation happens before any change (atomicity), the operation is a single undo step, and it returns the record. It is consistent with destructiveHint=false rather than contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, front-loaded with the action and scope, followed by the two behavioral guarantees an agent cares about. No sentence is wasted and nothing is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations cover safety. The remaining gap is the undocumented uuid/values parameters, but overall the definition gives an agent enough to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for three required parameters, so the description must compensate. It clarifies that 'record' names the record/plug-in and 'values' holds field names (unknown ones rejected), but leaves 'uuid' and the shape of the nested values object unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set record fields (or plug-in parameters) on one object'), which clearly separates it from the read-path sibling vw_get_record. It does not, however, name any alternative such as vw_set_lighting_device_fields, so sibling differentiation is only implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what happens during the call but never states when to choose this tool over vw_get_record, vw_set_lighting_device_fields, or vw_revert_last. Usage is only inferable from the verb, with no exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

vw_vs_lookupA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine context beyond that by emphasizing 'live' and 'of the running Vectorworks', telling the agent it queries dynamic in-process state and requires an active instance. It does not mention indexing/refresh behavior, result volume, or what happens for a query with no matches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the action and scope front-loaded and examples used efficiently as illustration. Slightly more compactness is possible (the parenthetical and example list could be tightened), but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and the description already summarizes the return shape (function names with signatures/descriptions), and annotations cover safety, so the main gaps are the undocumented `limit` semantics and the absence of guidance on when to reach for this tool versus vw_exec_python. For a read-only lookup tool that is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load. The example queries ('record field', 'symbol insert', 'LDevice') usefully convey that `query` is a natural-language/keyword search over names and docs, but the `limit` parameter is left entirely unexplained in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (the live vs.* API / built-in docs of the running Vectorworks) and gives three concrete example queries. This clearly separates it from the domain-action siblings like vw_insert_symbol or vw_get_record, which operate on objects rather than the scripting API surface.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The examples imply how the tool is used (finding function names before scripting), but there is no explicit when-to-use or when-not-to-use statement, and no mention of its relationship to vw_exec_python, the sibling an agent would most plausibly pair it with. Usage is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 17 tool updatesv0.1.0
    • First observedvw_document_info
    • First observedvw_exec_python
    • First observedvw_find_objects
    • First observedvw_get_record
    • First observedvw_get_selection
    • First observedvw_insert_symbol
    • First observedvw_lighting_device_report
    • First observedvw_list_classes
    • First observedvw_list_layers
    • First observedvw_list_lighting_devices
    • First observedvw_list_positions
    • First observedvw_list_symbols
    • First observedvw_ping
    • First observedvw_revert_last
    • First observedvw_set_lighting_device_fields
    • First observedvw_set_record
    • First observedvw_vs_lookup

TDQS

A3.6/5.0

Scored across 17 tools

Disambiguation4/5

Most tools target clearly distinct resource/action pairs, but there is some overlap between vw_set_record (single object or plug-in parameters) and vw_set_lighting_device_fields (bulk lighting device edits), and between vw_list_lighting_devices and vw_lighting_device_report, which both surface device data. The detailed descriptions clarify when each should be used, so ambiguity is limited.

Naming Consistency4/5

All tool names share a consistent vw_ prefix and snake_case formatting, with predictable patterns such as vw_list_*, vw_get_*, and vw_set_*. A few names are noun-based (vw_document_info, vw_lighting_device_report) rather than strict verb_noun, but the set remains readable and mostly consistent.

Tool Count4/5

17 tools is slightly above the typical 3-15 range, but each covers a distinct capability in a complex CAD/lighting bridge: bridge check, Python execution, API lookup, document/layer/class inspection, records, symbols, undo, and lighting workflows. The set does not feel padded with redundant tools.

Completeness4/5

The surface covers introspection, generic execution, document/layer/class queries, object finding, record read/write, symbol insertion, undo, and lighting-specific workflows including reports. Dedicated create/delete/modify-object tools are absent, but vw_exec_python provides a workaround, leaving only minor gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables Claude to control AutoCAD—draw, edit, query, layers, blocks, annotations, screenshots, plot to PDF—using plain language.
    8
    6
    MIT
  • A
    license
    C
    quality
    C
    maintenance
    Drive McNeel Rhino 8 and Grasshopper from Claude through the Model Context Protocol.
    500
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude to work inside Autodesk Civil 3D 2027 through natural language, reading and drawing geometry, modeling roads with alignments, profiles, assemblies, corridors and superelevation, computing earthwork volumes and mass haul, and managing styles, label sets, blocks and hatches.
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude to analyze, edit, quality-check, and generate Final Cut Pro FCPXML timelines through 30 tools, including marker management, editing, QC grading, and EDL/CSV export. Also provides AppleScript and GUI automation to move timelines in and out of Final Cut Pro without manual menu clicks.
    MIT