Skip to content

Releases

AutoCAD MCP Pro 1.8.0

Choose a tag to compare

@github-actions github-actions released this 06 Nov 20:15

AutoCAD MCP Pro 1.8.0 — it remembers, finishes a job in one call, and measures itself honestly

1.7 made what the server draws provable. 1.8.0 makes it remember across restarts, finish a whole job in one call, and say what it did not check. Nine tools are added (248 → 257) and two resources (11 → 13); the five prompt templates are unchanged, and system_about stays the runtime authority for the counts.

pip install -U autocad-mcp-pro==1.8.0        # or: uvx autocad-mcp-pro

# as a Claude Code plugin (it pins ==1.8.0)
claude plugin marketplace add U-C4N/Autocad-MCP
claude plugin install autocad-mcp-pro@autocad-mcp

Several defaults changed — read Breaking at a glance below before upgrading a client that depends on 1.7 behaviour. Every change has a switch back where one makes sense.


Highlights

It remembers. The operation journal is durable by default (sqlite in ACADMCP_STATE_DIR): a reopened file continues its document_id and revision, a client operation id replays after a restart, and a call that was running when its server died answers requires_reconcile. Headless drawing_undo steps back to the newest durable checkpoint — also after a restart. Every headless DXF write is atomic (temp file, fsync, verify, replace), and drawing_open(path, recover=True) reads a damaged DXF into a new lineage whose source is protected.

  • New: checkpoint_create · checkpoint_list · checkpoint_restore · drawing_history (finds the value a drawing had in "round 2" in two calls, after a restart)

One call, not hundreds. entity_modify_where is QSELECT + CHPROP with a dry run, layer_rename renames every reference, layer_merge is LAYMRG, and dimension_auto(selector={"layer": "GEOMETRY"}) dimensions a whole part. A cad_batch that writes is all or nothing by default, and a literal handle that names no entity refuses the whole batch before anything runs.

Scripted job 1.7.0 1.8.0
Layer clean-up (six misnamed layers, 300 overridden entities) 124 calls 2
A plate's dimensions 89 calls 2
A value from "round 2", after a restart not answerable 2

Six tools listed, every tool callable. DISCOVERY_MODE=search is the new default: a client lists search_tools, describe_tool, call_tool and three pinned tools (cad_batch, drawing_info, entity_list) for 1,026 prompt tokens idle, against 59,138 for the full 253-tool list — and every tool stays callable by name. Search ranks over a corpus of 207 AutoCAD command names and 1,479 synonym phrases, so FILLET, BPOLY, QSELECT, WBLOCK, OVERKILL and CHSPACE each rank #1.

One error envelope. Every failure on every route is {ok: false, kind, category, retryable, hint, operation_id, ...}, typed by exception class, never by message text — and the text a 1.7 client read is unchanged beside it. A missing handle, path, command or file has its own kind. A failed drawing_finalize returns its score, blocking rows and qa_coverage.

QA that names what it did not check. Every critique lane records checked or not_checked with a reason, and qa_coverage carries them into finalize, delivery and the manifest. The new dimension_truth focus judges a dimension by the text the sheet really shows (dim_override_disagrees, dim_render_stale, dim_value_hidden, …); property_override reports entities that override their layer. A lineweight of -3 is Default, never ByLayer. With summary=True a 500-issue critique is answered in 735 characters. autocad://critique/focuses lists every focus.

Parts revised, P&IDs as projects. mech_part_revise changes a drawn part by its parameters and rebuilds its views in place, keeping its handles; a hand edit refuses it (hand_edited_tagged_entity) and each revision joins a model history that travels with the file. pid_line_draw(route="avoid") routes round the symbols between its ports, checked by the new pid_line_through_symbol focus. pid_project checks off-page links, cross-sheet tags and line continuity across sheet files without modifying any.

DWG opens headlessly. drawing_open on a .dwg converts it through the ODA File Converter, then AutoCAD's accoreconsole. With neither it is a typed dwg_read refusal; when every route fails it is dwg_conversion_failed with its attempts[].

Narrowed on request. READ_ONLY, TOOL_ALLOWLIST / TOOL_DENYLIST and MAX_TOOL_COST refuse a call before anything runs (policy_refused) — directly, through call_tool, or as a cad_batch step. A writer takes only its own extensions and never a name AutoCAD or Windows loads (acad*.lsp, .fas, .scr, .dll, acad.pgp, …). Over HTTP an unknown Origin is 403, a foreign Host 421, a body over 8 MiB 413, and MCP_AUTH_TOKEN_READONLY issues a read-only token. system_run_lisp runs an AutoLISP read tier under LISP_POLICY=read.

The live engine draws where it means to. A live seat draws in model space until layout_set_current names a sheet; the tab the operator clicks no longer moves it. system_run_command and live undo / redo wait for the command and can fail command_incomplete. One display refresh per COM job, and entity_batch_create / entity_delete_many run as STA jobs sliced inside COM_CALL_TIMEOUT. A COM message filter retries a call AutoCAD answers "retry later" (after Documents.Add, during a regen) instead of failing it mid-write with RPC_E_CALL_REJECTED.

Four tracker reports, fixed the same day.

  • #17 — view_screenshot captured only the top-left 2/3 of the AutoCAD window at 150 % display scaling. The server now makes itself DPI-aware before reading the window; measured after the fix, the capture equals the window's physical size (2558 × 1526 on a 2560 × 1600 screen at 144 DPI).
  • #18 — page_setup_apply takes the device's full-bleed and expanded media: a canonical name such as ISO_full_bleed_A3_(420.00_x_297.00_MM), or bleed="full_bleed" / "expand" on a catalogue size.
  • #19 — CAD_LAUNCH=never keeps the live engine to the session you opened (cad_not_running instead of starting AutoCAD); with the default auto, a launch that never accepts Visible is retried and then quit, not left as a windowless acad.exe.
  • #20 — a live entity_get on a DIMENSION or HATCH reuses one Document.Export for COM_SNAPSHOT_TTL seconds (default 5) while the drawing stands still, instead of exporting the whole drawing on every call.

Thanks to @danielhernandez-prx and @hampterlegod-eng for measured, reproducible reports.


Breaking at a glance

What changed 1.8.0 default Restore the 1.7.0 behaviour
Tool discovery DISCOVERY_MODE=search (six tools listed) DISCOVERY_MODE=off
Plugin discovery DISCOVERY_MODE=${AUTOCAD_MCP_DISCOVERY:-search} AUTOCAD_MCP_DISCOVERY=off
Long tool descriptions on the wire leading paragraphs + Details: describe_tool. — (describe_tool returns the whole text)
cad_batch(on_error=) auto: a writing batch is all or nothing; an unknown literal handle refuses the batch on_error="stop"
entity_delete_many all of its handles or none; ok: false on any error —
system_status.operations a summary {count, last, unknown_commit} system_status(detail="operations")
strict_critique=True also fails on not_checked lanes strict_critique=False
Headless dimstyle_modify redraws the dimensions using the style rerender=False
LISP_POLICY read (read tier, denylist as a second pass) LISP_POLICY=denylist
Writer output paths own extensions only; loadable names refused —
HTTP Origin 403 / Host 421 / body > 8 MiB 413 HTTP_ALLOWED_ORIGINS, HTTP_ALLOWED_HOSTS, MAX_HTTP_BODY_BYTES=0
Lineweight -3 Default, never ByLayer — (the old answer was a mislabel)
Errors one typed envelope; text content unchanged —
Operation journal durable in ACADMCP_STATE_DIR JOURNAL_DURABLE=off
COM target space model space until layout_set_current layout_set_current
COM commands / undo wait for the command, can fail command_incomplete — (COMMAND_DEADLINE_S bounds the wait)
COM refresh one refresh per job COM_REFRESH_MODE=regen
Headless .dwg open ODA, then accoreconsole ACCORECONSOLE_PATH=off
Critique of parts drawn before 1.8.0 one model_drift unstamped info issue mech_part_revise(..., overwrite=True)

New settings worth knowing: ACADMCP_STATE_DIR, JOURNAL_DURABLE / JOURNAL_ARGS / JOURNAL_SYNC, CHECKPOINT_KEEP / CHECKPOINT_BUDGET_MB, DISCOVERY_PINNED, READ_ONLY, TOOL_ALLOWLIST / TOOL_DENYLIST, MAX_TOOL_COST, LISP_POLICY, COMMAND_DEADLINE_S, COM_REFRESH_MODE, ACCORECONSOLE_PATH, CAD_LAUNCH, COM_SNAPSHOT_TTL. The README's Configuration section lists all 46.


Evidence

Gate Result
Correctness A/B against v1.7.0 83 / 83 against v1.7.0's 61 / 83 — 22 fixed, 0 regressed
Task matrix v9 (49 tasks, each able to fail) 47 / 47 of the tasks the headless engine attempts (lisp_read_tier needs AutoCAD, std_tables_b40 has no rows yet)
Full headless suite 7,583 collected — 7582 passed, 1 xfailed
Release pipeline Linux 3.11, Linux 3.12 and Windows 3.11 lanes green; A/B, document-number and plugin gates green
Headless performance against v1.7.0 ok: true, ratios 0.96 – 1.06 (the 1.06 is the durable journal's commit per mutating call)
Token budget default surface 1,026 prompt tokens idle (ceiling 1,500); server instructions 199 tokens
Live smokes on AutoCAD 2026 all 14 / 14 passed at da2d7f6, the release tree before the four tracker fixes

Published reports: benchmarks/results/published/ab-v1.7.0-vs-v1.8.0.json, perf-v1.7.0-vs-v1.8.0.json, token-cost.json, lanes-v9/, and benchmarks/results/live/1.8.0/matrix.json.


What...

Read more

AutoCAD MCP Pro 1.7.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 10:39

AutoCAD MCP Pro 1.7.0 — what it draws is provable, what it runs is safe

A source requirement ("Ø40 bore, six holes on a Ø120 circle") is now bound to the real CAD feature, measured on the geometry — never on a label, a stored model or the numbers that were typed in — and measured again on the saved file after it is reopened, with a pass / fail / unknown verdict per requirement and the evidence behind it. A cancelled call, a big drawing or a hostile text cell can no longer produce a silent wrong answer.

Highlights

  • drawing_verify_requirements — typed requirements (distance, radius, diameter, angle, counts, concentric, parallel, tangent, …) bound to features, measured, and re-verified on the saved artifact; drawing_finalize / drawing_deliver(requirements=) report geometry acceptance, and a failed acceptance blocks delivery.
  • Cancel-safe execution — a cancelled or timed-out call keeps the document until its worker really ends; rollbacks are shielded and verified.
  • Complete QA scans — critique and validator read every entity in every space (no 5,000 / 10,000 cap), off the event loop, and a check that fails says check_failed instead of passing.
  • Safe exports — CSV / XLSX text cells can no longer become spreadsheet formulas.
  • Bound document and live revision — a live session refuses to write into a document it did not open; the revision also counts the operator's own hand edits in AutoCAD, so a stale preview is refused.
  • Change previews, operation records, task recipes, a standards coverage manifest and describe_tool for DISCOVERY_MODE=search.
  • Claude Code plugin — the premium skill ships as autocad-mcp-pro from this repository's marketplace.

Install

pip install -U "autocad-mcp-pro[full]==1.7.0"

Claude Code plugin:

claude plugin marketplace add U-C4N/Autocad-MCP
claude plugin install autocad-mcp-pro@autocad-mcp

Evidence

Gate Result
Correctness A/B vs v1.6.0 61 / 61 (v1.6.0: 48 / 61), 13 fixed, 0 regressed
Benchmark matrix v8 31 / 31
Live COM harness, AutoCAD 2026 129 / 129 checks over eight smokes
Performance vs v1.6.0 ratios 0.62 – 1.02, none slower beyond the measured noise
Test suite 6,060 collected, green on Windows and Linux
Surface 248 tools (+1), 11 resources (+3), 5 prompts

Records: benchmarks/results/published/ and benchmarks/results/live/.


Full changelog

Added

  • Requirement verification - drawing_verify_requirements (SECTION 26,
    4 → 5; pack core, in the lean profile).
    One engine under
    engineering/verification/:
    • Typed requirements (requirements.py, types.py): id, quantity
      (distance, radius, diameter, angle, concentric, coincident, parallel,
      perpendicular, horizontal, vertical, tangent, count, absence), target with
      its unit, feature selectors, provenance, source, datum, and a
      manufacturing tolerance kept apart from the verification epsilon. Every
      bad value is refused by its path; conflicting provenance and two targets
      for one feature are kept and reported, never collapsed. A legacy
      dimensions object is carried read-only and verifies nothing.
    • Observed geometry (observe.py): INSERTs exploded with their
      block_path (a circle under a non-uniform scale is an ellipse and says
      so, a mirrored insert keeps an arc's true sweep, every MINSERT cell is
      its own element), HATCH loops with their depth and filled area, DIMENSION
      fields with the geometric measurement, the dimension's own measurement,
      the displayed text and DIMLFAC kept apart. entity_get reports HATCH
      loops and full DIMENSION fields on both engines (capability
      hatch_loops).
    • Binding (binding.py): by handle, feature tag, architectural element,
      geometric predicate or DIMENSION. Every binding keeps its candidates and
      its reason; two equal candidates are ambiguous with both listed, never a
      pick. The mechanical generators tag each entity they draw with an
      ACADMCP_MECH feature record in the create call itself
      (entity_create_line/circle/arc/polyline/text/hatch take xdata= on
      both engines). Held-out evidence on raw-ezdxf plates no fixture uses:
      733 of 760 eligible bindings attempted, all 733 correct, the 27 that had
      to abstain abstained.
    • Evaluators (measure.py): every quantity measured from CAD-read
      geometry with value, unit, method, residual and status; lengths
      converted with exact factors in the drawing's declared unit ($INSUNITS;
      an inferred unit is recorded beside it, never applied); splines and tilted
      planes unsupported, degenerate cases unknown with the reason.
    • The acceptance report (report.py): one row per requirement - target,
      measured, delta, tolerance basis, status, handles, source - with
      denominators that always add up, as JSON (schema 1) and Markdown. No
      silent pass: unbound or unmeasured is unknown. A DIMENSION whose text or
      DIMLFAC disagrees with the geometry is a blocking dimension_mismatch
      finding beside the geometry row. Evidence turns stale when the document's
      revision moves or an artifact's sha256 changes.
    • The saved file (artifact.py): verify_artifact reads the saved DXF
      fresh (a DWG on a live seat through a private read-only copy) and
      re-binds every feature - by handle while handles are stable, then by
      feature tag, then by geometry - with the before / after comparison; a
      count or absence is counted afresh on the file.
    • drawing_plan(persist_requirements=True) writes the set into the drawing
      (an ACADMCP_REQUIREMENTS XRECORD, both engines), so a reopened file
      carries it; drawing_verify_requirements(use_stored=True) reads it back.
      drawing_finalize(requirements=) and drawing_deliver(requirements=)
      add geometry_acceptance, drafting_quality (the unchanged score),
      artifact_integrity and coverage: a requirement that does not pass
      blocks them (failed_acceptance) whatever the drafting score.
      drawing_verify_requirements(manifest_path=) re-hashes a delivery's
      artifacts and lists the stale and missing ones.
  • Document identity and revisions (B11). Every open document has a
    document_id and a content revision (system_status, drawing_info,
    document_list). Headless, the revision moves on every mutation, undo,
    redo and rollback, never on a save, export, finalize or delivery; live, on
    each of the 98 content-changing ComBackend methods once the call hands
    work to AutoCAD (an argument refusal before that moves nothing, as
    headlessly). The live engine binds the document a call chose, and a call
    made after the operator switched AutoCAD's active document is refused
    active_document_changed (naming the bound and the active document) before
    anything is read or written - view_screenshot included, checked again
    after the capture - and the QA readers (validator, critique, delivery) pass
    the refusal on typed instead of reporting a failed check;
    transaction_commit / transaction_rollback address the bound document.
    A document belongs to one running AutoCAD: after a restart even an unsaved
    Drawing1.dwg is a new document with a new id (application_changed).
    The live revision also moves, once per gap between two server calls, when
    the operator edited database objects of the bound document by hand: a
    transient AutoLISP database reactor counts them in the document's own
    namespace and the server reads it through VL.Application.16 - no COM
    event sink, no SendCommand, nothing saved into the drawing, 0.6-1.2 ms
    per read (median, two live runs) and two reads per guarded call. A preview or precondition check reads
    it first, so a stale expected_revision is refused by the revision itself;
    system_status.operator_edits reports whether it is counting. Two servers
    bound to one document (two clients on one seat) each keep their own id in
    the shared namespace, so a read by one never moves the other's revision; a
    write by one is an outside edit to the other.
  • Operation records and client ids (B12). One record per call in a
    bounded in-memory journal (operation id, tool, request hash, state,
    document id, revision before and after, error kind); states committed,
    partial, failed, refused, quarantined, cancelled,
    unknown_commit. A client id (cad_batch(operation_id=), or
    _meta.operation_id on any tool) replays the recorded result for the same
    request, refuses operation_conflict for a different one and
    requires_reconcile after an unknown_commit. system_status lists the
    recent operations.
  • Change previews (B14 residue). cad_batch, drawing_refine,
    text_find_replace and pid_from_spec return an exact preview on a dry
    run (entity and region fingerprints over the exported DXF tags); an apply
    with expected_revision / preconditions runs only if nothing moved and is
    refused stale_revision with nothing changed otherwise. The apply reports
    revision {checked, after, interleaved}.
  • Task recipes (B51). Five versioned recipes under engineering/recipes/
    • dimensioned part → verify → deliver, foreign P&ID → instrument index /
      line list / equipment list, revision pair → takeoff delta, A3 sheet
      delivery, foreign-drawing audit - each with preconditions, cad_batch-ready
      steps, the evidence each step leaves and postconditions a script checks;
      served as autocad://recipes/index and autocad://recipes/{recipe_id}, and
      each run end to end on ezdxf in a test.
  • Standards coverage manifest (B39). Every registered table's standard,
    edition, locator, unit, implemented sizes, coverage range and SOURCE, in
    std_part_list(...).coverage and the resource autocad://standards/coverage.
    A size outside a table is refused with the nearest transcribed sizes.
  • **describe_tool ...
Read more

v1.6.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 21:57

Full Changelog: v1.5.1...v1.6.0

v1.5.1

Choose a tag to compare

@github-actions github-actions released this 07 Aug 06:14

Full Changelog: v1.5.0...v1.5.1

v1.5.0

Choose a tag to compare

@github-actions github-actions released this 06 Aug 07:26

Full Changelog: v1.4.0...v1.5.0

v1.4.0

Choose a tag to compare

@github-actions github-actions released this 23 Jul 12:38

Full Changelog: v1.3.0...v1.4.0

AutoCAD MCP Pro 1.3.0 — Closed-Loop Drawing Quality

Choose a tag to compare

@U-C4N U-C4N released this 17 Jul 12:51

AutoCAD MCP Pro 1.3.0 — Closed-Loop Drawing Quality

Version 1.3.0 turns drawing production into a more deliberate, verifiable
workflow: clarify the requirements, commit the plan, build, critique, repair,
and deliver an auditable artifact bundle.

Highlights

  • Preflight before geometry — drawing_preflight normalizes requirements,
    surfaces missing or conflicting inputs, and binds the accepted plan to a
    deterministic SHA-256 spec hash.
  • Bounded refinement — drawing_refine runs critique → repair →
    re-critique rounds inside owned transactions, rolling back regressions and
    refusing to interfere with an existing caller transaction.
  • Production annotations — native TABLE/MLEADER support on COM and portable
    standard-entity composites on ezdxf.
  • Capability discovery — system_capabilities reports native, composite,
    rendered, shared, snapshot, and unsupported behavior per backend.
  • Auditable delivery — drawing_deliver exports artifacts, validates the
    drawing, reopens DXF for parity checks, verifies complete entity inventory,
    hashes outputs, and writes manifest.json plus validation.json.
  • Reproducible benchmark evidence — a fixed ten-task runtime runner plus a
    Python/Matplotlib source-review chart with named projects and explicit
    evidence boundaries. Unsupported tasks count as zero in the fixed-matrix
    score, with coverage reported separately.
  • Installable CLI — the packaged autocad-mcp command now targets a tested
    callable entry point and provides standard --help output.

Verification

  • 415 tests passed
  • Ruff lint passed
  • 10/10 fixed runtime tasks passed on the ezdxf reference backend (100.0)
  • sdist and wheel built successfully
  • the wheel was installed in a clean environment and autocad-mcp --help
    completed successfully

Install or upgrade

pip install -U "autocad-mcp-pro[full]"

For headless DXF workflows:

pip install -U autocad-mcp-pro
autocad-mcp --help

The source-review chart is not presented as a shared live AutoCAD run. Runtime
comparisons are published only when an adapter executes the same fixed task
matrix against another project.

See CHANGELOG.md and the benchmark documentation for the full technical
details and evidence boundaries.