Repository navigation
Releases
AutoCAD MCP Pro 1.8.0
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-mcpSeveral 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_screenshotcaptured 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_applytakes the device's full-bleed and expanded media: a canonical name such asISO_full_bleed_A3_(420.00_x_297.00_MM), orbleed="full_bleed"/"expand"on a catalogue size. - #19 —
CAD_LAUNCH=neverkeeps the live engine to the session you opened (cad_not_runninginstead of starting AutoCAD); with the defaultauto, a launch that never acceptsVisibleis retried and then quit, not left as a windowlessacad.exe. - #20 — a live
entity_geton a DIMENSION or HATCH reuses oneDocument.ExportforCOM_SNAPSHOT_TTLseconds (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...
AutoCAD MCP Pro 1.7.0
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_failedinstead 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_toolforDISCOVERY_MODE=search. - Claude Code plugin — the premium skill ships as
autocad-mcp-profrom 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-mcpEvidence
| 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; packcore, 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
dimensionsobject 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 andDIMLFACkept apart.entity_getreports 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 areambiguouswith both listed, never a
pick. The mechanical generators tag each entity they draw with an
ACADMCP_MECHfeature record in the create call itself
(entity_create_line/circle/arc/polyline/text/hatchtakexdata=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
planesunsupported, degenerate casesunknownwith 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 isunknown. A DIMENSION whose text or
DIMLFACdisagrees with the geometry is a blockingdimension_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_artifactreads 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
(anACADMCP_REQUIREMENTSXRECORD, both engines), so a reopened file
carries it;drawing_verify_requirements(use_stored=True)reads it back.
drawing_finalize(requirements=)anddrawing_deliver(requirements=)
addgeometry_acceptance,drafting_quality(the unchanged score),
artifact_integrityandcoverage: 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.
- Typed requirements (
- Document identity and revisions (B11). Every open document has a
document_idand a contentrevision(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-changingComBackendmethods 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_screenshotincluded, 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_rollbackaddress the bound document.
A document belongs to one running AutoCAD: after a restart even an unsaved
Drawing1.dwgis 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 throughVL.Application.16- no COM
event sink, noSendCommand, 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 staleexpected_revisionis refused by the revision itself;
system_status.operator_editsreports 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); statescommitted,
partial,failed,refused,quarantined,cancelled,
unknown_commit. A client id (cad_batch(operation_id=), or
_meta.operation_idon any tool) replays the recorded result for the same
request, refusesoperation_conflictfor a different one and
requires_reconcileafter anunknown_commit.system_statuslists the
recent operations. - Change previews (B14 residue).
cad_batch,drawing_refine,
text_find_replaceandpid_from_specreturn an exactpreviewon a dry
run (entity and region fingerprints over the exported DXF tags); an apply
withexpected_revision/preconditionsruns only if nothing moved and is
refusedstale_revisionwith 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 asautocad://recipes/indexandautocad://recipes/{recipe_id}, and
each run end to end on ezdxf in a test.
- dimensioned part → verify → deliver, foreign P&ID → instrument index /
- Standards coverage manifest (B39). Every registered table's standard,
edition, locator, unit, implemented sizes, coverage range and SOURCE, in
std_part_list(...).coverageand the resourceautocad://standards/coverage.
A size outside a table is refused with the nearest transcribed sizes. - **
describe_tool...
v1.6.0
v1.5.1
v1.5.0
v1.4.0
AutoCAD MCP Pro 1.3.0 — Closed-Loop Drawing Quality
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_preflightnormalizes requirements,
surfaces missing or conflicting inputs, and binds the accepted plan to a
deterministic SHA-256 spec hash. - Bounded refinement —
drawing_refineruns 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_capabilitiesreports native, composite,
rendered, shared, snapshot, and unsupported behavior per backend. - Auditable delivery —
drawing_deliverexports artifacts, validates the
drawing, reopens DXF for parity checks, verifies complete entity inventory,
hashes outputs, and writesmanifest.jsonplusvalidation.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-mcpcommand now targets a tested
callable entry point and provides standard--helpoutput.
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 --helpThe 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.