AutoCAD MCP Pro

Production-grade AutoCAD automation for AI agents — live through COM on Windows, or headless through ezdxf on any platform.

CI PyPI License: MIT Python 3.11+ FastMCP 3 Stars

One typed MCP contract controls two execution engines. Build and edit drawings, query exact geometry, apply engineering standards (ISO 128/129/286/1101), refine quality issues inside transactions, and deliver hashed artifacts with validation evidence.

v1.4 release snapshot: 131 tools · 6 resources · 5 prompt templates · 474 collected tests. Runtime discovery through system_about is authoritative.

Install in 10 seconds

pip install autocad-mcp-pro     # or: uvx autocad-mcp-pro
autocad-mcp                     # stdio MCP server, backend auto-selected

Headless (no AutoCAD required, any OS) or live AutoCAD on Windows:

AUTOCAD_MCP_BACKEND=ezdxf autocad-mcp    # portable DXF engine
AUTOCAD_MCP_BACKEND=com   autocad-mcp    # live AutoCAD (pip install "autocad-mcp-pro[com]")

Extras: [com] live AutoCAD (pywin32 + Pillow), [pdf] PDF/screenshot rendering (matplotlib), [full] everything. Working from a checkout is the same commands with pip install -e ".[full]" and python server.py.

Benchmarks

Every number below is generated by a script in benchmarks/ and rendered to SVG with Python (matplotlib). No hand-edited charts, no adjectives.

The leaderboard — nine public AutoCAD MCP servers, one rubric

Public AutoCAD MCP capability leaderboard

# Project Score Evidence
1 U-C4N/Autocad-MCP (this repo, v1.4.0) 95 A
2 varavista/autocad-mcp 84 A
3 beiming183-cloud/AutoCAD-MCP 83 A
4 LokmenoWer/best-cad-mcp 74 B
5 AnCode666/multiCAD-mcp 73 A
6 puran-water/autocad-mcp 70 A
7 NCO-1986/AutoCAD_mcp 68 B
8 daobataotie/CAD-MCP 35 B
9 zh19980811/Easy-MCP-AutoCad 30 C

Fixed public 100-point rubric — CAD breadth (25), correctness and delivery (20), backends/platforms (15), engineering production (15), tests and maintenance (15), security and operations (10) — applied to the public source and documentation of each project (benchmarks/source_review.json, dated). Stars and raw tool counts score nothing. Evidence grade A = source plus locally executed evidence, B = deep source review without a full live run, C = documented tool surface only. This is a source review, not a shared live run — the lanes below are the runtime evidence.

python -m benchmarks.render_chart

1 · Live-run scores — same harness, pinned competitors

Live benchmark

Server Pinned commit Score Pass Coverage
autocad-mcp-pro (this repo) working tree 100.0 10/10 100%
beiming183-cloud/AutoCAD-MCP 11f7c47 50.0 5/10 50%
puran-water/autocad-mcp 95476a3 45.0 4/10 50%

Ten fixed tasks, one runner, headless ezdxf lane. Competitors are driven black-box over MCP stdio using their own documented tool contracts at the pinned commit, and every geometry claim is verified by re-opening the exported DXF with ezdxf inside the harness — no self-reporting. unsupported scores zero in the fixed matrix; per-task reasons are committed under benchmarks/results/published/. File-IPC (live AutoCAD) lanes run locally, not in CI.

python -m benchmarks.run_competitors --server puran-water-autocad-mcp --backend ezdxf
python -m benchmarks.run_competitors --server beiming183-autocad-mcp --backend ezdxf
python -m benchmarks.render_live_chart

2 · Task matrix — where the score comes from

Task matrix

The single score hides which capabilities exist, so the matrix shows every task against every server: green = verified pass, amber = partial, gray = the server documents no equivalent (planning, refinement, TABLE/MLEADER, hashed delivery), red = attempted but failed verification.

python -m benchmarks.render_matrix_chart

3 · Headless performance — scale evidence

Performance

Workload Wall time Throughput / result
Create 2,000 lines (individual calls) 0.64 s ~3,100 entities/s
10,000 lines: build + DXF export + reopen 13.9 s ~700 entities/s end-to-end
Region query over 10,000 entities 3.4 s 2,500 matched
Premium pass (layers + part + dims + full critique) 0.32 s 0 issues

Workloads call the same backend methods the MCP tools call, so server-side overhead is included. Self-measurement only — competitor servers would pay an extra stdio serialization cost that in-process runs do not, so no cross-server timing claims are made. Numbers move with hardware; the machine fingerprint is recorded in the report.

python -m benchmarks.perf_suite --out benchmarks/results/published/perf-ezdxf.json
python -m benchmarks.render_perf_chart

4 · Version A/B — every release re-proves correctness

compare_versions.py runs the same 21 deterministic, headless correctness checks against the previous release tag and the current tree — each check in its own subprocess, so a hard crash counts as a miss instead of killing the run.

v1.4.0 release gate (baseline v1.3.0, report: ab-v1.3.0-vs-v1.4.0.json):

Version Checks passing Pass rate Fixed Regressed
v1.3.0 (baseline) 21 / 21 100 %
v1.4.0 (this release) 21 / 21 100 % 0 0

v1.4.0 added CI, packaging, benchmarks, tool profiles, paper space, ISO 286 fits and opt-in 3D solids without breaking a single correctness check. For contrast, the same suite caught the v1.0.0 → v1.1.0 jump:

Version Checks passing Pass rate
v1.0.0 (first public release) 8 / 21 38.1 %
v1.1.0 21 / 21 100 %
python benchmarks/compare_versions.py v1.3.0 --json ab.json

Full rubric, caveats, method and boundaries for every lane: benchmarks/README.md.

What ships in v1.4

Area Tools
Drawing lifecycle create, open, save, export DXF/PDF, audit, purge, undo/redo
Geometry lines, arcs, polylines, splines, hatches, trim/extend/fillet/chamfer, handle-preserving edits
Annotation ISO 129 toleranced dimensions, ISO 286 fits (fit="H7"), TABLE, MLEADER, GD&T frames + datums (ISO 1101)
Engineering generators involute gears (front + section A-A), DIN 6885 keyed bores, ISO A3 titleblock
Paper space (new) layout_list/create/set_current, scaled viewport_create, drawing_export_pdf(layout=...)
3D solids (new, opt-in) solid_box/cylinder/extrude/revolve/boolean on live AutoCAD (ENABLE_3D=true)
Quality loop drawing_preflightdrawing_plandrawing_critiquedrawing_refinedrawing_finalize (0-100 score)
Delivery drawing_deliver: DXF/PDF/PNG + SHA-256 manifest + reopen-parity checks
Discovery tool profiles (new): TOOL_PROFILE=lean (~46 tools) / core / full for clients with tight tool caps

The tool surface evolves — ask system_about for the live grouped inventory and system_capabilities for per-backend support modes instead of copying lists from this README.

Architecture

flowchart LR
  A[MCP host / AI agent] --> B[FastMCP server]
  B --> C[Error - audit - timing - logging middleware]
  C --> D[Typed tool contract + tool profiles]
  D --> E[COM backend]
  D --> F[ezdxf backend]
  E --> G[Live AutoCAD]
  F --> H[Headless DXF]
  E --> I[Engineering quality + delivery]
  F --> I
  • server.py — FastMCP surface, lifespan, middleware, resources, prompts.
  • backends/base.py — shared typed contract + capability model.
  • backends/com_backend.py — single-STA-thread COM executor with per-call timeouts.
  • backends/ezdxf_backend.pyasyncio.to_thread-wrapped DXF engine with snapshot transactions.
  • engineering/ — standards-aware planning, generators, critique, scoring, fits, refinement, validation, delivery.
  • security.py — path validation and command/AutoLISP sanitization.

Backend capabilities

Capability COM backend ezdxf backend
Live AutoCAD document control
Headless DXF creation and editing
Cross-platform execution
Transactions and rollback
Paper-space layouts + viewports
Viewport model-content rendering
TABLE and MLEADER semantics Native Portable composite
3D solids (opt-in) — (no headless ACIS)
Screenshots AutoCAD window Matplotlib render
Raw AutoCAD commands / AutoLISP Opt-in

system_capabilities returns this machine-readably (native, composite, rendered, snapshot, shared, unsupported) — use it at runtime instead of assuming.

A production drawing workflow

drawing_preflight → drawing_plan → drawing_apply_iso_layers
→ deterministic create/edit tools → dimension_auto (+ fit="H7" callouts)
→ drawing_critique → drawing_refine
→ layout_create + viewport_create → drawing_finalize → drawing_deliver

Connect an MCP client

Claude Desktop / Cursor / any stdio host

{
  "mcpServers": {
    "autocad": {
      "command": "autocad-mcp",
      "env": {
        "AUTOCAD_MCP_BACKEND": "auto",
        "ALLOWED_PATHS": "C:\\Users\\you\\Documents\\AutoCAD",
        "TOOL_PROFILE": "full"
      }
    }
  }
}

After pip install autocad-mcp-pro the autocad-mcp command is on PATH; from a checkout use "command": "python", "args": ["path/to/server.py"]. The model vendor is not part of the server contract.

Local HTTP

autocad-mcp --transport http --port 8000

Loopback only by default; a non-loopback bind is refused unless remote HTTP is explicitly enabled and a bearer token is configured.

Configuration

Variable Default Purpose
AUTOCAD_MCP_BACKEND auto auto, com, or ezdxf
TOOL_PROFILE full lean (~46 curated tools), core (hides escape hatches), full
ENABLE_3D false Expose the opt-in solid_* tools (COM backend)
LOG_LEVEL INFO Python logging level
ALLOWED_PATHS empty Comma-separated absolute paths the server may access
MAX_UNDO_STACK 5 Maximum retained undo snapshots
MAX_DXF_BYTES 52428800 Reject larger DXF input; 0 disables
MAX_LIST_LIMIT 5000 Bound list/selection response sizes
COM_CALL_TIMEOUT 60 Per-call live AutoCAD timeout (seconds)
DANGEROUS_COMMANDS_ENABLED false Allow blocked commands/LISP; reported as unsafe mode
ALLOW_REMOTE_HTTP false Permit a non-loopback HTTP bind
MCP_AUTH_TOKEN empty Bearer token required for remote HTTP

Security model

Tool input is treated as untrusted:

  • every path passes traversal + allowed-root validation;
  • dangerous AutoCAD commands and AutoLISP channels are blocked by default, with regression tests for known bypass patterns;
  • remote HTTP requires explicit opt-in plus a bearer token;
  • DXF size, response sizes, undo history and COM call duration are bounded;
  • audit middleware records tool timing and failures;
  • system_status / system_about expose unsafe_mode when dangerous operations are enabled.

Please report vulnerabilities privately via GitHub rather than public issues.

Development

pip install -e ".[full]"
pip install pytest pytest-asyncio pytest-cov ruff build
python -m pytest              # 474 tests
python -m ruff check . && python -m ruff format --check .
python -m build

CI runs the same gates on Linux (3.11/3.12), Windows (mocked-COM suite), plus package, Docker and MCP-registry-schema jobs. Releases are tag-driven: git tag vX.Y.Z && git push origin vX.Y.Z builds, publishes to PyPI and cuts the GitHub Release. See docs/RELEASE-DISTRIBUTION.md.

Repository map:

server.py        FastMCP surface and orchestration
config.py        Environment-driven settings
security.py      Path, command, and AutoLISP guards
version.py       Canonical package version
backends/        COM and ezdxf implementations
engineering/     Standards, generators, critique, fits, delivery
benchmarks/      Runners, adapters, published reports, chart renderers
tests/           Headless, mocked-COM, contract, and security tests

Roadmap (1.5)

Screenshot overlay + handle grounding, ezdxf redo (forward snapshots), COM block_create_from_entities, ISO 286 transition/interference hole letters (delta rule), titleblock on paper-space layouts. Features are published when their contracts and limitations are testable — not when they make a longer checklist.

Contributing

Pull requests are welcome — especially reproducible competitor adapters, mocked/live COM coverage, engineering standards, and backend parity. For a large change, open an issue first so the tool contract and evidence plan can be agreed before implementation.

Author

Umutcan Edizsalan · Mechanical engineering work at Anka-Makine · GitHub @U-C4N

Built from production drawing work, then made model-agnostic through MCP.

License

MIT

mcp-name: io.github.u-c4n/autocad-mcp