AutoCAD MCP Pro
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_LEVEL | No | Standard Python logging level. | INFO |
| ALLOWED_PATHS | No | Comma-separated absolute paths the server may read/write. | |
| MAX_DXF_BYTES | No | Reject DXF files larger than this on drawing_open. 0 to disable. | 52428800 |
| MAX_LIST_LIMIT | No | Hard cap for entity_list and analysis_select_* responses. | 5000 |
| MAX_UNDO_STACK | No | Maximum number of in-flight transaction snapshots. | 5 |
| MCP_AUTH_TOKEN | No | Required when ALLOW_REMOTE_HTTP=true. Bearer token for HTTP clients. | |
| COM_CALL_TIMEOUT | No | Per-call timeout for COM operations in seconds. | 60 |
| ALLOW_REMOTE_HTTP | No | Permit HTTP transport on non-loopback hosts. | false |
| AUTOCAD_MCP_BACKEND | No | Backend selection (auto, com, ezdxf). | auto |
| DANGEROUS_COMMANDS_ENABLED | No | Disable command and AutoLISP sanitization. Loud warning at startup. | false |
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": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| drawing_infoA | Get comprehensive metadata for the current drawing. Returns: name, path, entity_count, layer_count, block_count, extents (min/max), units, version, backend name. |
| drawing_newA | Create a new drawing, optionally from a template. A bundled name resolves to On the live engine only a genuine Refused before anything is replaced: a bare name that is not in the
catalogue (the message lists the five), a template path that does not
exist, and a path outside the allowed directories. With |
| drawing_openA | Open an existing DXF drawing file (DWG too, on the live COM backend). T0.2: a .dwg path is refused up front when the active backend has no |
| drawing_saveB | Save the current drawing. Optionally specify a new path. |
| drawing_save_asA | Save current drawing to a new path/format (DWG, DXF, or DWT template). The on-disk format is derived from the file extension so the bytes always
match the name (N2) — e.g. 'part.dxf' writes DXF, not DWG. |
| drawing_export_dxfA | Export the current drawing as a DXF file. |
| drawing_export_pdfA | Export the current drawing (or a paper-space layout) to PDF. |
| drawing_purgeA | Purge all unused objects (layers, blocks, linetypes, styles) from the drawing. |
| drawing_auditA | Audit the drawing: repair every fixable structural problem, and report it. This mutates the drawing. |
| drawing_closeA | Close the active document. If save is True (default), the drawing is
saved to its current path before closing; an untitled document is closed
and |
| drawing_undoA | Undo the last drawing operation. On the live COM backend this is AutoCAD's own undo. The headless backend has
no journal, so a step is a full DXF snapshot and history is off by
default — set Drawing something after an undo discards the redo branch, as in AutoCAD. |
| drawing_redoA | Reapply the operation you just undid. Same history as |
| entity_create_lineA | Create a line from (x1,y1) to (x2,y2). Returns entity info with handle. |
| entity_create_circleA | Create a circle at (cx, cy) with given radius. |
| entity_create_arcA | Create a circular arc. Angles are in degrees, measured counter-clockwise from the positive X axis. |
| entity_create_polylineA | Create a lightweight 2D polyline through the given points. Example: points=[[0,0],[100,0],[100,100],[0,100]], closed=true → rectangle |
| entity_create_rectangleA | Create a closed rectangular polyline between two corner points. Convenience wrapper around entity_create_polyline. |
| entity_create_textA | Create a single-line text entity (DTEXT/TEXT). |
| entity_create_mtextA | Create a multi-line text entity (MTEXT) with word-wrap at the specified width. |
| entity_create_tableB | Create a native COM table or an explicitly-labelled ezdxf composite table. |
| leader_create_mleaderC | Create a native COM MLeader or an explicitly-labelled ezdxf composite. |
| entity_create_hatchB | Create a hatch fill pattern inside a closed boundary polygon. |
| entity_create_splineA | Create a NURBS spline curve passing through the specified fit points. |
| entity_create_ellipseA | Create an ellipse. major_x/major_y define the major axis vector from the center. |
| entity_create_pointB | Create a point marker entity at (x, y). |
| entity_create_block_refA | Insert a block reference (instance of an existing block definition). Refused before any write, on both engines: a name that is not a block
definition in this drawing ( |
| hatch_set_gradientA | Fill a hatch with a gradient instead of a pattern. |
| hatch_editA | Edit an existing hatch in place. Omitted parameters are left alone — a partial edit that resets the rest is
data loss. |
| hatch_add_boundaryA | Add one boundary path built from typed edges - an island inside the hatch. Typed edges exist because a boundary that only accepts vertex lists silently straightens every curve it is given. Every edge is validated before any is written, so a malformed list refuses instead of leaving a half-built path. Both engines: headlessly the edges become an edge path; on a live seat each becomes a temporary LINE, true ARC or ELLIPSE appended as an inner loop and then deleted (a chain of lines becomes one polyline). A loop that does not close is refused by AutoCAD and nothing is added. |
| entity_create_wipeoutA | Create a WIPEOUT that hides drawing content behind its outline. Refuses fewer than three points: a zero-area mask hides nothing while reporting success. |
| entity_create_revcloudA | Draw a revision cloud: a polyline whose every segment carries an arc. A |
| dimension_linearB | Create a linear dimension, optionally toleranced (ISO 129 or ISO 286 fit). |
| dimension_alignedA | Create an aligned dimension that measures the true distance between two points. |
| dimension_angularA | Create an angular dimension measuring the angle between two lines from a vertex. |
| dimension_radiusA | Create a radius dimension for a circle or arc, optionally toleranced. |
| dimension_diameterA | Create a diameter dimension for a circle, optionally toleranced (e.g. ⌀20 H7). |
| entity_moveA | Move an entity by the specified displacement vector (dx, dy, dz). |
| entity_copyA | Copy an entity and move the copy by (dx, dy, dz). Returns info of the new copy. |
| entity_rotateA | Rotate an entity around a base point by the specified angle. |
| entity_scaleA | Scale an entity uniformly from a base point. |
| entity_mirrorA | Mirror an entity across a line defined by two points. Returns the mirrored copy. |
| entity_offsetB | Create a parallel copy of a line, circle, or polyline at the given distance. |
| entity_trimA | Trim V1 supports LINE+LINE only. Cutter is treated as an infinite ray (AutoCAD's default 'implied extend' trim mode). Raises if the lines are parallel. |
| entity_extendA | Extend V1 supports LINE+LINE only. Raises if the lines are parallel. |
| entity_filletA | Round a corner with a tangent arc. Returns info on the new ARC entity (or the first source line for radius=0). V1 supports LINE+LINE only. |
| entity_chamferA | Bevel a corner with a chamfer line. Returns info on the new chamfer LINE. V1 supports LINE+LINE only. |
| entity_deleteA | Permanently delete an entity by its handle. |
| entity_array_rectangularA | Create a rectangular array of copies. Returns info of all created copies. rows x cols is unbounded, so this is a result-heavy tool despite being a create: a 40x40 grid hands back 1600 full records. fields=["handle"] is usually all a caller needs from it. |
| entity_array_polarA | Create a polar (circular) array of copies around a center point.
|
| entity_set_propertiesA | Change one or more properties of an entity (layer, color, linetype, lineweight, visibility). |
| entity_edit_textA | Edit an existing text label in place — change its content, height, or rotation. Use this to rename/relabel without deleting and recreating (which would lose the handle). Works on both TEXT and MTEXT. |
| text_set_backgroundA | Mask what is behind an MTEXT so it stays readable over hatch or geometry. MTEXT only: TEXT has no background-fill attribute, so setting one on it would report success and change nothing. |
| text_find_replaceA | Replace text in TEXT, MTEXT and block attributes (ATTRIB and ATTDEF).
|
| entity_edit_geometryA | Edit the defining geometry of an existing entity in place (no delete/recreate). CIRCLE: cx/cy/radius · LINE: x1/y1/x2/y2 · ARC: cx/cy/radius/start_angle/end_angle. Any argument left out is unchanged; the handle is preserved. |
| selection_windowA | AutoCAD's ssget window/crossing selection. Corners may be given in any order. Selection is by drawn position, so an
entity in a mirrored frame is found where |
| selection_polygonA | Window or crossing selection against a polygon rather than a rectangle. |
| selection_filterA | AutoCAD's QSELECT: filter the drawing by properties. Named parameters rather than a query string, deliberately — a mistyped
attribute name in a query language comes back as an empty result, which is
indistinguishable from "no matches". |
| entity_getA | Get all properties of a specific entity by its handle. |
| entity_listA | List entities in the drawing with optional type and layer filters. Returns handle, type, layer, color, and type-specific properties. Use handles with entity_get, entity_move, entity_delete, etc. This is the most expensive result on the server — the full record runs
~250 characters per entity, and Paging honesty: a plain list has nowhere to say that more entities followed
the page, so |
| entity_delete_manyA | Delete multiple entities in one call. Returns count of deleted entities. |
| selection_getA | Read the entities the user pre-selected in the AutoCAD viewport (COM backend only). Returns the implied "pickfirst" selection — the entities highlighted with grips before invoking the AI — so work can be scoped to exactly those entities instead of the whole drawing. Typical use:: Result keys: ok — True on the COM backend (even for an empty selection) count — number of selected entities handles — list of entity handles (hex strings) to act on entities — full per-entity info (type, layer, color, ...) pickfirst — state of the PICKFIRST sysvar (None if unknown) message — guidance when nothing is selected On the ezdxf headless backend there is no viewport, so this returns ok=False with an empty handles list.
|
| entity_get_xdataC | Extended entity data as {app: [values]}. An app with no XDATA is simply absent. |
| entity_set_xdataA | Replace the named app's XDATA on one entity; an empty list removes it. Limits are AutoCAD's and are enforced before writing: 255 characters per string and 16 KB per entity. |
| layer_listA | List all layers with their properties (color, linetype, frozen, locked, visibility). Never truncated — a drawing's whole layer table is returned — so a compact envelope here always reports truncated=false. |
| layer_createB | Create a new layer with specified properties. |
| layer_deleteA | Delete a layer. The layer must have no entities. Layer '0' cannot be deleted. |
| layer_set_currentA | Set the active/current layer for new entities. |
| layer_modifyA | Modify an existing layer's color, linetype, and/or lineweight. |
| layer_freezeA | Freeze a layer (makes it invisible and unselectable, faster regeneration). |
| layer_thawA | Thaw a frozen layer, making it visible and selectable again. |
| layer_lockA | Lock a layer (entities visible but cannot be selected or modified). |
| layer_unlockA | Unlock a layer to allow entity selection and modification. |
| layer_hideA | Turn off a layer (entities invisible but still processed in regeneration). |
| layer_showA | Turn on a layer that was previously turned off. |
| layer_isolateA | Hide all layers except the specified one (layer isolation). |
| linetype_listA | Return the names of all linetypes currently loaded in the active drawing. |
| linetype_loadA | Load a single linetype safely. Use this instead of |
| block_listA | List all block definitions in the drawing (name, origin, attribute count, entity count). Never truncated — the whole block table is returned — so a compact envelope here always reports truncated=false. |
| block_insertA | Insert a block and optionally set attribute values. Refused before any write, on both engines: an undefined or layout block
name, and an attribute value that is not text — a string is written as
is (one line), an int or finite float as its plain digits ( |
| block_explodeA | Explode a block reference into its component entities, keeping its attribute text (the Express Tools BURST rule, on both engines). Every attached ATTRIB becomes a TEXT with the same value, placement,
height, rotation and layer (an invisible attribute becomes an invisible
TEXT; a multi-line attribute becomes an MTEXT carrying every line), and
a constant attribute (which has no ATTRIB) becomes a TEXT of its value
too; AutoCAD's plain EXPLODE would keep only the tag-name placeholders
and drop the values. Everything lands in the layout that owns the
reference (model space or its paper-space sheet), whichever tab is
current. Returns |
| block_get_attributesA | Get all attribute values from a block reference as {TAG: value} dict. A multi-line attribute reports its whole content with |
| block_set_attributesA | Update attribute values in a block reference. Same value rule as A multi-line attribute takes |
| block_create_from_entitiesA | Create a new block definition from existing entities in the drawing. Works on both engines. The originals stay in model space — this defines a
reusable block from them rather than consuming them the way AutoCAD's BLOCK
command does; use Handles that do not resolve are listed in |
| block_defineA | Create a block definition with attribute definitions from typed specs. The whole request is validated before anything is written: one malformed
entry refuses the call and leaves no definition behind. Refusals: a
malformed primitive or ATTDEF (names |
| block_find_referencesA | Find all insert references to a specific block definition. Bounded by the backend's own default entity_list page (200 INSERTs scanned),
which is a pre-existing limit, not a new one: the compact envelope's |
| boundary_traceA | AutoCAD's BOUNDARY/BPOLY: create a closed polyline around a seed point. Returns the nearest enclosing loop, so a seed inside an island gives the island rather than the outer region. Straight edges are split where they cross, so a line drawn across a shape divides it the way it looks like it should. A seed with no enclosing loop is refused, and the error names the gap when the edges nearly close. |
| boundary_from_entitiesA | Chain the given entities into one closed polyline. The handles may arrive in any order — putting them in chain order is the tool's job. A chain that does not close is refused, and the error names the coordinates of the gap. |
| analysis_list_propertiesA | AutoCAD's LIST: the full DXF attribute set for one handle.
|
| analysis_entity_statsA | Analyze the drawing and return entity counts grouped by type and by layer. Returns: total_entities, by_type (sorted by count), by_layer (sorted by count). This is unique to AutoCAD MCP Pro – no other MCP server provides this! |
| analysis_find_in_regionA | Find all entities within a rectangular region (crossing selection). Uncapped: a window over a busy drawing returns every hit. Project with
|
| analysis_measure_distanceA | Measure the Euclidean distance between two points. |
| analysis_measure_areaA | Area and perimeter of a polygon you supply the vertices for. This measures the numbers in the call, NOT the drawing. To measure something
that exists, use Straight-edged polygons are exact. Pass a third |
| analysis_measure_entityA | Measure something already in the drawing, by handle. Reads the real geometry, so polyline bulges (arc edges) are included — reading vertices back and shoelacing them yourself loses 28% of the area on a semicircular edge, silently. Measurable: LWPOLYLINE, 2D POLYLINE, CIRCLE, ELLIPSE, SPLINE, HATCH, SOLID,
TRACE, 3DFACE. REGION and 3DSOLID need the live COM backend (their area is
in ACIS data ezdxf cannot evaluate) and refuse with
The payload states its own accuracy: |
| analysis_bounding_boxA | Get the bounding box (extents) of all entities in the drawing. |
| analysis_select_by_layerA | Get all entities on a specific layer. Returns entity list with handles. Capped at MAX_LIST_LIMIT (default 5000). The plain list cannot say it was
capped — the warning goes to the log stream, which most clients never show
the model — so use |
| analysis_select_by_typeA | Get all entities of a specific type. Returns entity list with handles. Capped at MAX_LIST_LIMIT (default 5000); as with analysis_select_by_layer,
|
| analysis_layer_statsA | Return detailed statistics for each layer: entity count, types present. |
| cad_batchA | Execute an ordered list of tool calls in ONE round trip. N calls collapse into one request/response pair, and Successful steps report only their handle; pass verbose=True for the full result. Anything without a handle is returned whole. VALIDATION runs first, always: an unknown tool, a schema-invalid argument or
a reference no earlier step binds refuses the whole batch before anything
executes. ERRORS are typed, never text: each failed step carries error.kind - one of
unsupported (with the backend ATOMICITY is reported, not assumed. Read the NOT CALLABLE from a batch: the raw command/LISP escape hatches, and cad_batch itself. Call those directly. For a few hundred entities of the same kind, entity_batch_create is denser still (no per-step tool name) - and it can be one step of a cad_batch. |
| entity_batch_createA | Create multiple entities in a single call for better performance. Each entity dict must have a 'type' key and the parameters for that type. Example: [{"type": "line", "x1": 0, "y1": 0, "x2": 100, "y2": 0}, {"type": "circle", "cx": 50, "cy": 50, "radius": 25}] Denser than cad_batch for many entities of the same kind (no per-step tool name), and usable as one step of a cad_batch. Use cad_batch when the calls differ, must be ordered, or must feed each other. |
| entity_batch_modifyA | Apply multiple modifications in a single call. Example: [{"handle": "1A", "action": "move", "dx": 10, "dy": 20}, {"handle": "2B", "action": "delete"}] Covers move/rotate/scale/delete/set_properties only. For anything else, for ordering, or to feed one step's result into the next, use cad_batch. |
| template_apply_layersA | Apply a standard layer set from a predefined template. Available templates: architectural, mechanical, electrical, piping. Creates all layers defined in the template with standard colors and lineweights. |
| template_listA | List all available layer templates and their contents. |
| validation_checkA | Run quality checks on the current drawing. Available checks:
|
| view_zoom_extentsA | Zoom to show all entities in the drawing (fit drawing in viewport). |
| view_zoom_windowA | Zoom to display the specified rectangular window region. |
| view_screenshotA | Capture a screenshot of the current drawing view. COM backend: captures live AutoCAD window at current view. ezdxf backend: renders via matplotlib to PNG. With Returns an Image content block with the PNG data. |
| view_zoom_and_screenshotA | Zoom to extents (or window if coordinates given), then capture a screenshot. The most useful tool for visually inspecting drawing state. |
| transaction_beginA | Begin a transaction (undo mark). COM backend: Sets AutoCAD undo mark. All subsequent operations can be rolled back to this point with transaction_rollback. ezdxf backend: Saves a DXF snapshot. Rollback restores the full document state to this point. Always pair with transaction_commit or transaction_rollback. |
| transaction_commitA | Commit the current transaction. COM: Ends the undo mark (changes are permanent but still undoable via drawing_undo). ezdxf: Discards the rollback snapshot (changes are kept). |
| transaction_rollbackA | Rollback the current transaction to the point of transaction_begin. COM: Undoes all operations back to the UNDO Mark transaction_begin set;
refused ( WARNING: This is destructive – all changes since transaction_begin are lost. |
| system_statusA | Get full status of the AutoCAD MCP Pro server and backend connection. Returns backend name, connection status, capabilities, document info. |
| system_capabilitiesA | Return machine-readable support modes for the active backend. |
| system_get_variableB | Get an AutoCAD system variable value. |
| system_set_variableA | Set an AutoCAD system variable (e.g. DIMSCALE, LTSCALE, MEASUREMENT). Refusals, before anything is written: a value outside the catalogued
range or enum of a known variable, or a write to a read-only variable
(DIMSTYLE, CANNOSCALEVALUE, DWGNAME, …), is refused with the catalogue's
message — |
| drawing_settingsA | Read or change common AutoCAD drawing settings by friendly name. A convenience facade over the system variables (INSUNITS, LUPREC, LTSCALE,
DIMSCALE, DIMTXT, DIMASZ, DIMDEC, DIMDSEP, DIMZIN, TEXTSIZE, OSMODE, LIMMIN/
LIMMAX, GRIDMODE/GRIDUNIT, SNAPMODE/SNAPUNIT, ORTHOMODE, AUTOSNAP/POLARANG,
PSLTSCALE, CANNOSCALE, LUNITS, AUNITS, DIMSTYLE, TEXTSTYLE) so the user can
say "set units to mm, limits to A3 and the grid on" without memorising
sysvar names. Call with no argument for a full snapshot; a write returns
Refusals, per key, nothing else rolled back: an unknown key; a value outside
its range (grid/snap spacing > 0, polar_angle 0–360, precision 0–8, …); a
malformed |
| system_run_commandA | Execute an AutoCAD command string directly (COM backend only). Append \n for Enter. Example: '_LINE 0,0 100,0 \n'. IMPORTANT: commands that finish at an option menu (e.g. -LINETYPE, -LAYER, -STYLE return to '[?/Create/Load/Set]:' after their action) need an EXTRA blank line or 'X\n' to exit, otherwise AutoCAD stays at a prompt and the next COM call will deadlock. Example: '-LINETYPE _LOAD CENTER acad.lin\n\n'. A verb denylist refuses obviously destructive commands, but it is a guardrail
against issuing |
| system_run_lispA | Execute an AutoLISP expression (COM backend only). Example: '(setvar "DIMSCALE" 1.0)' A symbol denylist refuses the known code-execution and file-I/O channels; text inside double quotes is treated as data, so drawing notes are not mistaken for code. It is a guardrail, NOT a security boundary — AutoLISP has more write channels than any denylist enumerates. Prefer the typed tools. |
| system_aboutB | Get detailed information about AutoCAD MCP Pro capabilities and available tools. |
| gear_draw_helical_front_viewA | Deterministic helical gear front view: full involute outline (40 pts/flank), pitch/base/outer/root circles, helix symbol, optional bore + keyway. Returns a handle bundle plus 'metadata' for downstream gear_draw_section_aa. |
| gear_draw_spur_front_viewB | Deterministic spur gear front view (no helix symbol). |
| gear_draw_section_aaA | Deterministic side cross-section of a gear created by gear_draw_*_front_view. Includes top/bottom/left/right boundaries, bore lines, keyway notch, ANSI31 hatch. |
| keyway_draw_keyed_boreA | Bore + DIN 6885 keyway in front view. Auto-sizes keyway from bore if width/depth omitted. |
| keyway_draw_sectionC | Side cross-section view of a keyed bore. |
| titleblock_apply_iso_a3A | ISO 7200 / A3 (420x297 mm) title block. Title text is used verbatim. Pass |
| drawing_finalizeA | Premium completion gate: runs BOTH the 8-step validator AND the premium critique focuses (iso128, layer_color, dim_overlap, untrimmed_corner, duplicate_entities, construction_left, gdt, plus the P&ID focuses pid_dangling_line, pid_duplicate_tag, pid_incompatible_connection, pid_untagged_instrument, pid_illegal_tag, pid_unconnected_equipment — silent on a sheet with no P&ID symbols, plus the mechanical focuses mech_missing_centreline, mech_unhatched_section, mech_view_misaligned, mech_duplicate_dimension, mech_thread_unrepresented, mech_bom_balloon_mismatch — silent on a sheet with no mechanical part, plus the architectural focuses arch_room_unlabelled, arch_wall_gap, arch_opening_clash — silent on a sheet with no ACADMCP_ARCH record, plus the topology focuses topo_dangling_endpoint, topo_near_miss, topo_interior_crossing — on network layers no P&ID or architectural focus reads, silent on every sheet this server draws), then saves to disk, exports a screenshot, and returns the DWG path. Raises ToolError if any validator 'error' finding is present, or if critique reports an 'error' (or, with strict_critique=True, any critique issue). Critique warnings are surfaced under payload['critique'] without failing the gate by default. |
| drawing_deliverA | Create a hashed, validated delivery bundle and verify DXF save/reopen parity. The result status is |
| drawing_preflightA | Validate and normalize requirements before committing a drawing plan. |
| drawing_planA | Commit a PlanSpec before any geometry is created. The PlanSpec is stored on the backend and surfaced for reference during the workflow (it is not replayed as a critique). Always call this FIRST in a premium workflow. |
| drawing_critiqueA | Run premium-quality checks. Returns zero issues for a clean drawing. Standard production gate: must return [] before |
| drawing_refineB | Run a bounded, transaction-safe critique/repair/re-critique loop. |
| point_from_snapA | Compute a deterministic snap point on an entity. Use this INSTEAD OF guessing coordinates — eliminates the most common LLM drawing error. |
| point_intersectionA | Compute the intersection of two geometry entities (LINE-LINE, LINE-CIRCLE, CIRCLE-CIRCLE). When two candidates exist, ref_x/ref_y selects the nearest. Returns {x, y}. |
| point_tangentA | Compute the tangent point on a circle from an external point. Returns {x, y}. Raises if the from-point is inside the circle. |
| construction_xlineA | Create an infinite construction line on the CONSTRUCTION layer.
Use as scaffolding; call |
| construction_clearA | Delete every entity on the CONSTRUCTION layer. Idempotent.
Must be called before |
| drawing_apply_iso_layersA | Bootstrap a full ISO-conformant layer set with correct colors and lineweights. Idempotent — existing layers are not modified. Refused by name: a standard that is not one of mech, pid, iso13567, arch. |
| dimension_autoA | Generate ISO 129 dimensions across the listed entities in the chosen style. V1 supports LINE entities only. |
| entity_select_smartA | Select entities by semantic predicate instead of memorising handles. Uncapped. The usual next step is dimension_auto(handles), so fields=["handle"] is normally all this needs to return. |
| gd_frameA | Draw an ISO 1101 feature control frame from LINE + TEXT primitives. Renders identically on COM and ezdxf. Referenced datums are recorded so the
|
| datum_featureA | Place a datum feature symbol (filled triangle + boxed letter). Establishes the datum so a feature control frame referencing this letter
passes the |
| layout_listA | List all layout tabs (Model + paper-space layouts) and the current one. |
| layout_createA | Create a new paper-space layout tab. |
| layout_set_currentB | Activate a layout tab. |
| viewport_createA | Place a scaled model-space viewport on a paper-space layout. The viewport window shows the model region centered at (view_center_x, view_center_y); view height = height / scale. |
| layout_deleteA | Delete a paper-space layout and every entity on it. Refuses model space, a blank name, and the last remaining sheet. If the
deleted tab was the current one, the returned |
| layout_renameA | Rename a paper-space layout. Entity handles are unaffected. |
| layout_copyA | Copy a paper-space layout: page setup, plot settings and all geometry.
|
| viewport_listA | List paper-space viewports: handle, geometry, scale and lock state. The layout's own main viewport is included with |
| viewport_set_scaleA | Rescale a viewport by adjusting its view height. Geometric scale only: annotative text and dimensions do not resize with it. Refuses the layout's main viewport, whose view height is the tab's own pan/zoom state rather than a drafting scale. |
| viewport_lockA | Lock or unlock a viewport's display scale. |
| viewport_deleteA | Delete a viewport. The layout's main viewport needs |
| entity_change_spaceA | AutoCAD's CHSPACE: move entities across spaces, rescaled by the viewport. Geometry is transformed by the viewport's own matrix so it stays the same size on screen — a move without that transform would leave a 100 mm feature as 100 mm of paper inside a 1:2 viewport. Refused per entity for dimensions (unless |
| pid_symbol_listA | The symbols Authored from ISO 10628-2 (equipment, valves) and ISA-5.1 (instrumentation);
each row's |
| pid_symbol_insertA | Insert a catalogue symbol as a real block with TAG attributes and named ports. Defines the block on first use ( |
| pid_line_drawA | Connect two ports with one LWPOLYLINE on the class's layer. Ports come from |
| pid_graphA | Connectivity of the drawing as it is, not as it was drawn. Nodes: symbol INSERTs classified by catalogue name (confidence 1.0),
ACADMCP_PID payload (0.95), tag attributes / block-name keywords (0.6) or
a line touching an unknown INSERT (0.3); every node reports its |
| pid_instrument_indexA | Every instrument bubble with its ISA-5.1 reading and what it connects to. Rows come from |
| pid_line_listA | Every P&ID line with its number, class, size/service/spec/insulation and endpoints. Rows come from |
| pid_equipment_listA | Every equipment, valve and connector node with its ports and how many lines reach them. Rows come from |
| pid_from_specA | Equipment, valves, instruments and connectors placed, then every line
drawn port-to-port, inside one transaction: any bad item rolls the whole
sheet back and the error names it ( |
| pid_tag_parseA | ISA-5.1-2009 Table 4.1 as a grammar: first letter, modifier, readout and output functions, trailing high/low, loop number and suffix — with the standard's description ("Flow Indicating Controller") or the first offending letter. Equipment prefixes are not standardised, so the default map (P pump, V vessel, E exchanger, ...) can be replaced per call. |
| dimstyle_listA | Every DIMSTYLE table entry with the seventeen preset variables (DIMTXT, DIMASZ, DIMEXE, DIMEXO, DIMGAP, DIMTAD, DIMTIH, DIMTOH, DIMDEC, DIMDSEP, DIMLUNIT, DIMZIN, DIMBLK, DIMTXSTY, DIMLWD, DIMLWE, DIMSCALE). Headless, |
| dimstyle_createA | Create a dimension style: preset values first, then Refuses, before anything is written: an unknown preset; an override key
outside the 33-variable whitelist (the 17 preset variables plus DIMTOL,
DIMTP, DIMTM, DIMTOLJ, DIMTFAC, DIMLFAC, DIMRND, DIMATFIT, DIMTMOVE,
DIMCLRD/E/T, DIMSAH, DIMBLK1/2, DIMCEN); a value outside its range
(DIMDEC 0-8, sizes > 0, DIMTAD 0-4, DIMDSEP one character, lineweights an
AutoCAD code); a name that already exists (use |
| dimstyle_modifyA | Change variables on an existing dimension style.
|
| dimstyle_set_currentA | Set |
| textstyle_listC | Every STYLE table entry and the one new TEXT/MTEXT will use. |
| textstyle_createA | Create a text style. Headlessly a font nobody can find is written and reported
|
| textstyle_set_currentA | Set |
| mleaderstyle_listA | Every MLEADERSTYLE with its four values on both engines
( |
| mleaderstyle_createA | Create a multileader style: preset values first, then Headless it lands on |
| drawing_apply_standardA | One call for the common case: the standard's dimension style (created
if missing, then current), its text style (created if missing, then
current), the shared units, and with Every item reports |
| page_setup_listA | The page setup stored on each paper-space layout.
|
| page_setup_applyA | AutoCAD's PAGESETUP as one call, on both engines. Paper sizes are ISO 216 / ANSI Y14.1; the media is written in AutoCAD's own
spelling ( Refused before anything is written: an unknown paper, orientation, scale
or plot_area, an empty device or plot_style, margins that leave no
printable area, The proof is the PDF: |
| plot_style_listA | The ctb files AutoCAD ships ( |
| batch_plotA | AutoCAD's PUBLISH for a PDF set, through One row per sheet: Refused before any file is written: a format other than pdf, an empty
|
| drawing_template_listA | The templates Each row: |
| drawing_template_saveA | AutoCAD's SAVEAS → Drawing Template, on both engines. Live AutoCAD writes a real Pack: core · lean: no ( |
| document_listA | Every open document with Headless, the server keeps its own registry: |
| document_activateA | Make one open document the active one; reports Matches the full path first, then the file name; an ambiguous name is
refused with the candidates, an unknown one with the list of open
documents. Headless, a document quarantined after an abandoned call cannot
be switched away from — |
| document_closeA | Close a document and report Refusals, all before anything is closed: unsaved changes with neither
|
| layer_state_saveA | Snapshot every layer's on/frozen/locked/color/linetype/lineweight/plot flags plus the current layer as a named state stored in the drawing. These are the server's own portable layer states: JSON chunks in an XRECORD
under the |
| layer_state_restoreA | Apply a saved state to the layers that still exist.
|
| layer_state_listA | Every state under |
| layer_state_deleteA | Remove the named state's XRECORD. Layers themselves are untouched. Refusal: an unknown name (lists the saved ones). Pack: settings · lean: no. |
| view_named_saveA | Store a VIEW table entry (AutoCAD's VIEW command). Same name replaces
( |
| view_named_restoreA | Live: zooms the active viewport to the saved window the way |
| view_named_listB | Every VIEW table entry with centre, height and width. No refusals. Pack: settings · lean: no. |
| ucs_listB | The |
| ucs_setA | Store a UCS table entry and make it current (AutoCAD's UCS command). Axes are normalised to unit vectors. Every tool keeps taking and
returning WCS coordinates — the repository rule; a UCS is for the
operator's own drafting, and no tool starts interpreting inputs in it.
Refusals, before any write: a name of |
| ucs_restoreB | Live: |
| system_launchA | Connect to the application named by |
| system_preferences_getA | The whitelisted |
| system_preferences_setA | Write one preference and report Refusals, all before any write: a read-only key ( |
| user_pick_pointA |
ESC is an answer, not an error: |
| user_selectA | Returns |
| system_prompt_messageB |
|
| system_variable_describeA | What an AutoCAD system variable means, from an authored catalogue of 90. With |
| drawing_properties_getA | The DWGPROPS dialog as data: On the live engine the summary comes from the document's SummaryInfo. The
headless engine cannot read that stream, so the five summary fields are
|
| drawing_properties_setA | Write DWGPROPS fields. Only the arguments given are touched; returns
Refusals, before anything is written: a summary field on the headless
engine ( |
| mech_part_drawA | One part model - a turned profile or a plate outline plus typed features - drawn as views. The model is written onto the drawing as Refused before anything is drawn, by path: a non-finite or non-positive
number ( |
| mech_view_addA | Another view of a part already on the drawing, laid out on its projection axis. The part model comes back out of the drawing's Refused by name: a section without a plane, or with a plane of zero length,
a plane that misses the part, or one that grazes an outline vertex so its
crossings cannot be paired; a half or offset section on the wrong kind of
plane (the message names the style that does apply); a detail without a
radius or with a scale of zero; an unknown part_id, and |
| mech_dimension_partA | Every dimension the part and its features ask for, laid out without overlaps. Axial lengths are chained, stacked from a baseline or measured from an
origin; diameters stack outside the silhouette; fillets get a radius. Each
measurement appears once (ISO 129-1): every view record carries a
Refused by name: a fit together with an explicit tolerance, a fit outside
the authored ISO 286 range (over 1 mm to 500 mm, IT4-IT11), a fit on an
intent with no measurable nominal, an unknown style, an unknown part_id, a
call when every view is already dimensioned (the message lists them), and
|
| mech_hole_patternA | A hole pattern on any drawing - the part model is not required. The same expansion Refused before anything is drawn: an unknown pattern, a count below 1 (below 2 for polar), a linear pattern with no spacing, a grid with more than one column or row and no pitch for it, a polar pattern with no pitch-circle diameter, and a non-finite or non-positive diameter. |
| mech_part_from_specA | Several parts, their views and their dimensions, drawn inside one transaction. Every part is validated before the transaction opens, so a refusal leaves
the drawing untouched and names the offending path ( Refused by name: an empty |
| mech_part_inspectA | The Never modifies the drawing. Returns the part model exactly as
Refused by name: an unknown part_id, a handle that carries no
|
| std_part_listA | Catalogue rows with the dimensions a drawing needs, and their provenance. Every row is transcribed from the named standard's own table and carries
its |
| std_part_insertA | Define the part's block once, insert it, and write its The block carries DESIG / STD / SIZE / MAT attributes and an ACADMCP_MECH payload, so a parts list is a read of the drawing rather than a naming convention. Refusals, all before any write: a designation outside the transcribed tables (named, with the nearest catalogue entries - nothing is drawn approximately), a malformed designation, a missing or stray nominal length, a view the family does not have, an attribute tag the block does not carry, and a non-finite coordinate or rotation. |
| std_feature_drawA | Add a standard feature to geometry that already exists - a foreign drawing being finished. Local frame: |
| surface_textureA | Draw the 60° surface-texture vee with its annotation in the standard positions. Refusals, all before the first entity reaches the drawing: a text height
outside the seven ISO 1302 rows (2.5/3.5/5/7/10/14/20 mm — never
interpolated), a |
| weld_symbolA | Draw an ISO 2553 weld annotation: reference line, identification line, symbol, dimensions. Refusals, all before the first entity reaches the drawing: a |
| centre_marksA | Centre marks on the CENTER layer, whose linetype carries ISO 128-23's dash pattern. Pass |
| section_lineA | Draw the cutting-plane line and hand back the plane a section view consumes. Wide segments at the ends on GEOMETRY, the thin long-dash-dot middle on
CENTER, an arrow at each end whose head sits on the line end and points the
way the section is viewed, and the same letter beyond both arrows.
|
| hatch_materialA | Section-hatch a cut face with the pattern ISO 128-50 gives its material. Refusals: an unknown material (named, with the full list, before anything
is drawn), neither The payload states its own accuracy, as |
| sheet_frameA | ISO 5457 drawing frame for A4-A0: a 20 mm filing margin, 10 mm on the other three edges, the grid reference system and the centring/trimming marks. Borders, rules and marks land on TITLEBLOCK; the zone lettering on TEXT.
Refusals, all before the first entity is drawn: a size outside A4-A0 is
refused by name and the five covered sizes are listed; an orientation that
is neither 'landscape' nor 'portrait'; a |
| titleblock_applyA | ISO 7200 title block, 180 mm wide, in the lower-right corner of any A4-A0 sheet. The title text is used verbatim. Carries the ISO 128-30 projection-angle symbol: 'first' draws the cone on
the left and the concentric circles on the right, 'third' is its mirror.
Refusals, all before the first entity: an unknown size (the five covered
sizes are listed), an unknown orientation, a projection that is not
'first'/'third'/'', a |
| revision_addA | Append one row to the revision block, creating the block on first use. Idempotent per revision code: a code the drawing already carries returns
|
| bom_extractA | Walk the INSERTs and return the ISO 7573 item rows. Never modifies the
drawing. Each row's source is reported: The whole drawing is read by default — |
| bom_tableA | Draw the ISO 7573 item list as a real TABLE entity, 180 mm wide (the title-block width), growing upwards from directly above the title block. With |
| balloon_addA | One ISO 6433 item reference: a numbered balloon, a leader, and a dot on the item. The balloon carries an ACADMCP_MECH payload naming its targets, so running
the balloon pass again after the bill of materials is regrouped renumbers
the existing balloon ( |
| xref_attachA | Attach an external reference and insert it once. Both engines. The block takes the referenced file's stem as its name. Refusals, all
before anything is written: a |
| xref_manageA | One operation on one external reference.
|
| image_attachA | Attach a raster underlay at the file's own aspect ratio. Both engines.
|
| data_extractA | The same rows Refusals: a format that is not 'csv' or 'xlsx'; a drawing with nothing to
itemise (nothing is written); and |
| drawing_export_dwgA | Write a real DWG — not a DXF under a .dwg name. On a live AutoCAD seat this is |
| arch_wallA | Add walls to the plan network already on the drawing and resolve every junction. Two ends at one point mitre into a clean L; an end inside another wall is a
T (the stem stops on the crossing wall's near face, which is cut there); two
axes crossing are an X (all four faces cut). A drawn wall whose outline the
new walls change is taken back out and redrawn with its openings - the
result lists it under Refused before anything is drawn or erased, by path: a wall id already on the drawing or used twice, an axis of fewer than two points or with a zero-length segment, a non-positive thickness, an unknown justification or material (the list is named), two walls meeting at less than 5° (the mitre would run away), a wall corner lying inside another wall off its axis, an end inside a wall whose axis only meets it past that wall's end, and a new wall that would leave a drawn opening uncuttable. A curved wall is not supported: an axis is straight segments only. |
| arch_openingA | A door or a window in a wall already drawn, found by its id; the wall is redrawn cut. The opening removes its width from both wall faces and each edge is closed
by a jamb. A door is drawn open at 90° - its leaf as long as the opening is
wide, hinged on Refused before anything is drawn or erased: a wall id not on the drawing (the drawn ids are named), an opening id already drawn, an opening that runs past its wall segment or straddles an axis vertex, one overlapping another opening on the same wall (both ids named), one that runs into a junction (the solid stretch it must fit in is named), an unknown kind, swing, hand or language. |
| arch_stairA | A stair in plan: every riser as a line, the outline, the walking line with its arrow. The label ("UP" / "ÇIKIŞ") sits on the first tread at 2.5 mm × Refused before anything is drawn: a stair id already on the drawing, a non-positive width, riser height or going, fewer than 2 risers (4 for an L or a U - two per flight), a non-integer riser count, an unknown kind, turn or language. |
| arch_dimension_chainsA | The three exterior chains an architectural plan carries, as real DIMENSIONs. Nearest first: the openings row (every jamb in that facade), the walls row
(both faces of every wall meeting it - wall thickness, clear width, wall
thickness, ...) and the overall row. The points come from the wall engine's
own faces, read back from the plan on the drawing. A row that would only
restate a farther one is not drawn (ISO 129-1: each measurement once).
The row spacing defaults (10 mm, then 8 mm on paper) are this server's
drafting choices, not standard values. Text, arrows and gaps follow the
plot scale: each chain is drawn at DIMSCALE = Refused by name: a drawing with no walls, an unknown or repeated side, a non-positive scale, offset or step. |
| arch_roomA | Label the room around (x, y) with its name, number and MEASURED area. The area is never typed: the tool reads the wall faces on the Refused before anything is drawn: an unknown |
| arch_rooms_detectA | Read the rooms of a plan - ours or a foreign one made of plain lines. Every LINE and lightweight polyline on the layers is split where lines
cross or touch, and the closed faces they bound are measured (mm², net of
nested pieces).
Faces under Never modifies the drawing. Arcs and bulged polyline edges, old-style
POLYLINEs and block references are listed in |
| arch_scheduleA | Draw a door, window or room schedule as a real TABLE - a read of the drawing. The rows come from the Refused before anything is drawn: an unknown |
| arch_catalogue_listA | Catalogue rows: name, family, both labels, nominal size [w, d] in mm, block name, layer. Sizes are nominal catalogue dimensions - what a furniture or appliance
catalogue lists as a common size - and every row says so in |
| arch_catalogue_insertA | Define the item's block ARCH_ once, insert it on the furniture or sanitary layer. The block carries an invisible ITEM attribute with the catalogue name. Its
size is a nominal catalogue dimension (reported with |
| arch_gridA | Axis lines on the arch grid layer (its CENTER linetype comes from the layer) and a 5 mm bubble with its label at both ends of each axis, on the symbol layer. Numbers run along x and letters along y (A..Z, then AA, AB - no letter is
skipped) unless |
| arch_symbolA | Draw one architectural symbol on the arch symbol layer. Sizes are this server's declared drafting sizes in paper millimetres times
|
| arch_plan_from_specA | A whole plan drawn inside one transaction: walls with their hosted doors and windows, stairs, room labels whose areas are measured off the walls just drawn, the exterior dimension chains and the door / window / room schedules. Every item is validated before the transaction opens, so a refusal leaves the
drawing untouched and names its path ( Refused by name: an unknown key, no walls, an unknown language or material, a
non-finite or non-positive number, an arc segment in a wall axis, an opening
that overlaps another or runs past its wall segment (both ids named), a typed
room |
| drawing_understandA | One report on a drawing somebody else made, every claim with its evidence
and a confidence. Never modifies the drawing: a file is read as it is, and
the current document through a snapshot (headless: the document in memory;
live: a
Refused before anything is read: a |
| drawing_scale_checkA | Is the drawing to scale against the reference - or a schematic whose lengths are lengths of drawn line, not of pipe? Read-only on both drawings. Equipment tags are matched between the two (a Cyrillic look-alike such as
Refused before anything is read: a |
| drawing_diffA | Compare two revisions of one drawing by geometric signature (spec §10). Entities are matched exactly first (type, layer, geometry rounded to Read-only unless Refused before anything is read: |
| drawing_topology_checkA | Topology of a line network (spec §11): dangling ends, near misses (end to end and
end to line within An end that touches another network line, any curve on another layer (a tank outline) or the box of any block reference (a valve, a pump) is connected. Arcs and bulged polyline segments are measured as true arcs; arcs are not tested for crossings. The default layers come with their classification as evidence. Refused before any work: a |
| pipe_takeoffA | A pipe takeoff: topology from the P&ID, lengths from the layout, rows by room x service x diameter. The P&ID gives the runs (junctions merged, tees split, a line drawn twice
counted once, valves and reducers bridged), each run's service (the layer,
overridden by a supply / return word near the line), its diameters exactly
as labelled (direct, carried by continuity - never across a reducer - or
unassigned) and the equipment tags at its ends. The length comes from the
layout unless the scale check calls the P&ID to scale: the rectilinear
minimum spanning tree of the run's tag positions on the layout, each
connection along x first then y, plus Read-only on both drawings. With Refused before a drawing is read: |
| cable_takeoffA | A cable takeoff: one row per electrical load, the shop's cable method made repeatable. Power, phases, voltage, neutral and VFD come from the P&ID's electrical
texts near each tag (Russian, Turkish and English spellings). Power is
never invented: a load with no stated kW keeps an empty cell and an open
item. The panel comes from the layout's wiring callouts ('Wiring to CP1'
and its variants, normalised to CP-1), else from the P&ID ('к CP1'); a load
neither places takes the nearest panel on the layout, flagged
Read-only on both drawings. With Refused before a drawing is read: |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| prompt_floor_plan | Generate a prompt for creating a floor plan drawing. |
| prompt_pid_diagram | Generate a prompt for creating a P&ID (Piping and Instrumentation Diagram). |
| prompt_electrical_schematic | Generate a prompt for creating an electrical schematic diagram. |
| prompt_mechanical_drawing | Generate a prompt for creating a mechanical engineering drawing. |
| prompt_quick_drawing | Generate step-by-step instructions for creating a drawing from a description. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Current Drawing Info | Metadata for the currently open drawing |
| Layer List | All layers in the current drawing with properties |
| Block Library | All block definitions in the current drawing |
| Entity Statistics | Entity counts by type and layer |
| Server Status | AutoCAD MCP Pro server and backend status |
| P&ID Symbol Catalogue | Every P&ID symbol pid_symbol_insert can place: families, variants, ports, parameters |
| ISA-5.1 Identification Letters | ISA-5.1-2009 Table 4.1 letter tables, the tag grammar and its disambiguation rules |
TDQS
Scored across 242 tools
With 242 tools, many share domains and some explicitly overlap (e.g., block_insert vs entity_create_block_ref, drawing_save vs drawing_save_as vs drawing_export_dwg). While descriptions are thorough, the sheer volume makes misselection likely, though most tools are conceptually distinct.
Tool names are predominantly snake_case with domain prefixes (entity_, layer_, drawing_), but verb placement varies (entity_create_line vs layer_unlock) and a few lack a domain prefix (cad_batch, point_from_snap). Still readable, but not fully consistent.
242 tools is an extreme mismatch for any server's purpose; even a comprehensive CAD suite would rarely need this many. This forces agents to navigate an unwieldy surface and increases cognitive load.
The surface is remarkably comprehensive across entity types, layers, blocks, dimensions, layouts, and specialized domains (mechanical, architectural, P&ID), with few obvious gaps. Minor gaps exist (e.g., layer rename) but are workaround-able.