MCP server for natural language control of multiple CAD applications (AutoCAD, ZWCAD, GstarCAD, BricsCAD) via Windows COM
This server has significant definition quality gaps. While tool names generally follow verb conventions (draw_line, delete_entity, create_block), parameter descriptions are inconsistent and often generic. Many tools lack detailed schema documentation. The server groups related tools via registration functions (register_drawing_tools, register_layer_tools) but individual tool definitions show varying quality. Core issues: (1) Parameter types are declared but descriptions are often minimal or repetitive. (2) Output schemas are not documented in the tool definitions provided. (3) Error handling guidance is absent from descriptions. (4) No distinction between destructive operations in the LLM-facing descriptions despite the risk metadata being correct in the listing.
Check if the active document in the CAD application has changed. If it has, update self.document to the new active document.
Connect to the CAD application via COM, initializing COM for this thread. Tries to attach to an already-running instance first. If none is found and only_if_running is False, launches a new instance.
Create a block from specified entities
Create a block from currently selected entities
Delete a drawing entity identified by its COM handle
Disconnect from CAD application with COM cleanup
Draw an arc via COM AddArc()
Registration functions (register_session_tools, register_drawing_tools, etc.) are themselves listed as tools but should not be, they are internal helpers that should appear in the implementation but not in the MCP tool manifest. This inflates tool count and confuses the LLM about what is callable.
Output schemas are not documented. The tool definitions in the provided code show input parameter schemas but nowhere do we see documented return types, fields, or structure. This violates pattern:tool-schema and forces LLMs to guess what fields they will receive.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Draw a circle via COM AddCircle()
Draw an ellipse via COM AddEllipse()
Draw a line between two points via COM AddLine()
Draw a polyline through a sequence of points via COM AddPolyline()
Draw a rectangle from two opposite corner coordinates via a closed polyline
Retrieve common properties of a drawing entity via COM
Insert a block reference in the drawing
Check if connected to CAD application
Register block management tools for creating and inserting block references in drawings
Register drawing operation tools for creating lines, circles, arcs, polylines, text, dimensions, and other geometric entities
Register entity selection and manipulation tools for querying and modifying drawing entities
Register export and data extraction tools for exporting drawings and extracting CAD data
Register file operation tools for opening, saving, and managing CAD drawing files
Register layer management tools for creating, listing, and modifying CAD layers
Register session management tools for CAD connection, view, and history operations
Modify one or more properties of a drawing entity via COM
Destructive operations (delete_entity, disconnect) lack error guidance and do not mention recovery procedures. Tool descriptions should state 'This action is irreversible' and suggest confirmation or dry-run patterns where applicable.
Parameter descriptions are often minimal or generic (e.g., 'The entity handle string as returned by AutoCAD COM'). Descriptions should be 50 - 200 chars and include constraints, valid ranges, and format requirements. Many parameters lack sufficient context for LLM invocation.
The 'properties' parameter in set_entity_properties uses Dict[str, Any] and lists supported keys only in the description ('layer (str), color (str or int ACI index), lineweight (int)'). This should be an enum or discriminated union to enforce valid property names and prevent runtime failures.
The 'color' parameter accepts both 'string|int' but does not document valid color names or ACI index ranges. An LLM must choose between passing 'red' or '256' with no guidance on which is valid or preferred, risking failures.
No pagination or result-limiting guidance for tools that query or list entities (get_entity_properties, create_block_from_entities, etc.). If these return large result sets, they risk exhausting context windows. Caps and pagination info should be in descriptions.
The connect() tool accepts 'only_if_running' but the description does not explain the default behavior (does it launch a new instance by default?). The description should be explicit: 'Pass only_if_running=True to return False if no instance is running; False (default) will launch a new instance.'