Sandbox
@U-C4N/Autocad-MCP

MCP server for AutoCAD drawing automation

AutoCAD MCP Pro connects AI agents to AutoCAD through the Model Context Protocol. It exposes drawing, annotation, measurement, validation, and export tools, with either a live COM backend or a headless ezdxf backend.

81 stars22 forksPythonUpdated 1mo ago
Who it's for

Builders who want their agent to work directly with AutoCAD drawings through MCP.

What it delivers

You can delegate CAD drawing, checking, and export work to an agent without retyping every command by hand.

What it does

Dual backends

Runs against live AutoCAD through COM on Windows or against ezdxf headlessly on any platform.

Large tool catalog

Exposes drawing lifecycle, geometry, annotation, selection, hatch, measurement, and delivery tools.

Engineering validation

Checks ISO 1101 GD&T, ISO 129 dimensions, and ISO 286 fits and tolerances.

Tool discovery

Ranks tools from AutoCAD command names and synonym phrases so builders can find the right action faster.

Batch execution

Runs multiple CAD actions in one round trip with `cad_batch` and projected result fields.

Quality loop

Includes preflight, plan, critique, refine, finalize, and delivery steps for repeatable drawing work.

Export and evidence

Produces DXF, PDF, PNG, manifests, and reopen-parity checks for delivered drawings.

How to get it

  1. 1Run
    pip install autocad-mcp-pro     # or: uvx autocad-mcp-pro
    autocad-mcp                     # stdio MCP server, backend auto-selected
  2. 2Run
    AUTOCAD_MCP_BACKEND=ezdxf autocad-mcp    # portable DXF engine, no AutoCAD needed
    AUTOCAD_MCP_BACKEND=com   autocad-mcp    # live AutoCAD (needs the [com] extra)

README

AutoCAD MCP Pro

Production-grade AutoCAD automation for AI agents. Live through COM on Windows, or headless through ezdxf anywhere — one typed contract, two engines.

CI PyPI Downloads Python 3.11+ License: MIT

Install · Tools · Engines · Evidence · Limits · Config · Changelog

ISO A3 sheet: a module-6, 24-tooth spur gear with a keyed bore, its section A-A, ISO 129 dimensions with an H7 bore fit, and an ISO 7200 title block

Not a mockup. Every line on this sheet was drawn by the tools this server exposes — ISO layers, involute gear geometry, DIN 6885 keyway, section A-A, ISO 129 dimensions, an ISO 286 H7 bore fit, ISO 7200 title block — then rendered headlessly by view_screenshot. drawing_critique returns 0 issues on it. Rebuild it with python scripts/render_readme_showcase.py.

v1.5 release snapshot: 154 tools · 6 resources · 5 prompt templates · 1369 collected tests. 154 is the registered count; a default install advertises 149 over tools/list, because ENABLE_3D is unset. system_about is the runtime authority.

Why this exists

A big MCP server is expensive to be connected to. The full catalog costs a client 40,305 tokens before it has asked for anything. Discovery mode replaces it with two tools and costs 356.

A drafter searches for FILLET, not entity_fillet. Those command names appeared in no tool name or description — df = 0 against a stock index, not badly ranked but absent. The fix was data: an authored corpus of 158 AutoCAD command names and 672 synonym phrases covering all 154 tools. A test refuses to let a tool exist without one.

Advertised surfaceTools seenIdle cost
TOOL_PROFILE=full (default)14940,305 tokens
TOOL_PROFILE=lean4712,131 tokens
DISCOVERY_MODE=search2356 tokens

[!NOTE] Offline ratio estimates, not tokenizer counts, and the uncached ratio — prompt caching amortises the idle term. benchmarks/token_suite.py --tokenizer anthropic counts for real.

Install

pip install autocad-mcp-pro     # or: uvx autocad-mcp-pro
autocad-mcp                     # stdio MCP server, backend auto-selected
AUTOCAD_MCP_BACKEND=ezdxf autocad-mcp    # portable DXF engine, no AutoCAD needed
AUTOCAD_MCP_BACKEND=com   autocad-mcp    # live AutoCAD (needs the [com] extra)
ExtraPulls inFor
(none)fastmcp, ezdxf, pydanticHeadless DXF on any OS — no rendering
[com]pywin32, PillowLive AutoCAD control + window capture
[pdf]matplotlibPDF export and headless PNG, any platform
[full]everything aboveDevelopment and CI

[!NOTE] The bare install cannot draw pixelsezdxf.addons.drawing imports Pillow unconditionally, so every render path needs it. Add [pdf] for images on Linux or macOS.

Wire it to an MCP client
{
  "mcpServers": {
    "autocad": {
      "command": "autocad-mcp",
      "env": {
        "AUTOCAD_MCP_BACKEND": "auto",
        "ALLOWED_PATHS": "C:\\Users\\you\\Documents\\AutoCAD",
        "TOOL_PROFILE": "full",
        "DISCOVERY_MODE": "off"
      }
    }
  }
}

Claude Desktop, Cursor, or any stdio MCP host. For HTTP: autocad-mcp --transport http --port 8000 — loopback only unless remote HTTP is explicitly enabled and a bearer token is set.

What you get

AreaWhat it does
Drawing lifecyclecreate, open, save, export DXF/PDF, audit (repairs), purge, undo/redo
Geometrylines, arcs, polylines, splines, hatches, trim/extend/fillet/chamfer, handle-preserving edits
AnnotationISO 129 toleranced dimensions, ISO 286 fits (fit="H7"), TABLE, MLEADER, GD&T frames and datums (ISO 1101)
Engineering generatorsinvolute gears (front + section A-A), DIN 6885 keyed bores, ISO A3 title block
Discoverysearch_tools ranked over an AutoCAD command and synonym corpus — FILLET, BPOLY, QSELECT, WBLOCK, OVERKILL, CHSPACE each rank #1 of the 149-tool advertised catalog
Batchingcad_batch runs a step list in one round trip; fields= projects 11 result-heavy tools
Paper spacetab lifecycle, viewports, entity_change_space (CHSPACE), drawing_export_pdf(layout=…)
Selectionwindow vs crossing stated back to the caller; a polygon tested against its own shape, not its bounding box
Boundariesboundary_trace (BOUNDARY/BPOLY) chains loose edges into one closed polyline, arcs kept as bulges (headless)
Measurementanalysis_measure_entity measures what is in the drawing, by handle
Hatch depthgradients, in-place edits, typed edge boundaries (headless), island styles
Annotation objectsWIPEOUT, REVCLOUD, MTEXT background masks (headless), text find/replace
3D solidssolid_box/cylinder/extrude/revolve/boolean on live AutoCAD (ENABLE_3D=true)
Quality loopdrawing_preflightdrawing_plandrawing_critiquedrawing_refinedrawing_finalize (0–100 score)
Deliverydrawing_deliver: DXF/PDF/PNG + SHA-256 manifest + reopen-parity checks

154 tools in 19 groups. Plus 6 resources that cost nothing in the tool budget (autocad://drawing/info, layers, blocks, entities/stats, entities/{layer_name}, system/status) and 5 prompt templates.

Two rules worth knowing. Every coordinate in and out of a tool is WCS on both engines — the one exception is TEXT rotation, which stays in the entity frame because a mirrored TEXT is mirror-imaged and no scalar angle expresses that. And never read vertices back and shoelace them: that loses 28.2% of the area on a semicircular edge, silently. analysis_measure_entity(handle) reads the real geometry and states its own accuracy.

The two engines

One contract across 19 modules in backends/contracts/. @capability(key, reason=…) supplies a default that refuses, and a test holds both backends' capability key sets equal. There are 27 capability keys; read system_capabilities at runtime rather than trusting the table — five of them depend on how the machine is set up.

CapabilityCOM (live AutoCAD)ezdxf (headless)
Live document control
Cross-platform, no AutoCAD
Transactions and rollback
Paper-space layouts + viewports
Viewport model-content rendering✅ ᵐ (no borders)
Selection window / crossing / polygon
Entity area by handleActiveX .AreaAnalytic, bulges included
HATCH filled area (islands subtracted)AutoCAD's own numberLoops walked, hatch_style reported
REGION / 3DSOLID areaACIS is opaque to ezdxf
3D solidswith ENABLE_3D=true
DWG write
WIPEOUT · MTEXT background colourverified absent, AutoCAD 2026
REVCLOUD · BPOLY · typed hatch edgesno ActiveX member
CHSPACEunverified on a live seat✅ ᶜ
Undo historyopt-in — EZDXF_UNDO_DEPTH
TABLE and MLEADERNativePortable composite
Screenshots and PDFWindow captureMatplotlib ᵐ

ᵐ Needs matplotlib ([pdf]/[full]); without it png, pdf, viewport_render and handle_overlay report unsupported headlessly.
ᶜ Headless CHSPACE carries four named restrictions in its capability reason: top-view untwisted viewports only, dimensions refused unless frozen, ACIS/proxy/table refused, viewport clipping reported rather than applied.

[!IMPORTANT] Every COM path added in v1.5 was executed against a live AutoCAD 2026. That run found four defects reading could not — the largest being that AcadPViewport has no ViewCenter member, so the line setting it had been silently swallowed by a bare except since v1.4.

Evidence

Self-measurement, produced by scripts in benchmarks/.

Correctness — every release re-proves itself

26 deterministic headless checks against the previous tag and the current tree, each in its own subprocess so a hard crash counts as a miss rather than killing the run.

VersionChecks passingPass rateFixedRegressed
v1.5.0 (baseline)24 / 2692.3 %
v1.5.1 (this release)26 / 26100 %20

Against the older v1.4.0 baseline the same suite reports 21 / 26 → 26 / 26, five fixed, zero regressed. Three of the five are new capability (miss → pass); two are repaired defects (fail → pass) — the diameter and radius callouts, which measured the leader as geometry and dimensioned a 40 mm bore as 60 at default settings.

The task matrix — five tasks that can fail

An earlier matrix scored this server 10/10, which carried no information: every task in it exercised something the server was built around. Five were added because they can fail, and three did while being written.

TaskVerified against
tool_discoverysix AutoCAD command names, each ranking #1
token_budget40,305 → 356 tokens, against a ceiling fixed in advance
hatch_islands300 filled with the island, 400 ignoring it
selection_filterwindow 1, crossing 2, bounding box 3, polygon 1
measure_from_handle139.2699 against the 100.0 a vertex shoelace gives

Headless performance

Performance across four headless workloads

Workloads call the same backend methods the MCP tools call, so server-side overhead is included. Numbers move with hardware; the report records the machine fingerprint. Read the next section before quoting them — this release is slower than v1.4.0 at creating entities, on purpose.

What this release is bad at

A page that only lists strengths is a page that has not been measured.

Entity creation is slower than v1.4.0. Median of three runs on one machine and interpreter: 2,000 lines 1.4× slower, the 10,000-line roundtrip 2.3× slower. Attributed — setting EZDXF_CALL_TIMEOUT=0 returns creation to v1.4.0's numbers. The cost is the per-call asyncio.wait_for wrapped around every headless call so one hung call can no longer wedge a server whose document lock is a single asyncio.Lock. Deliberate trade, documented knob, on the 1.6 roadmap. The premium quality pass went the other way — 3.7× faster.

Wave A shipped 13 tools of a planned 39. Every cut is backed by a measurement. The REGION and 2D-boolean family went because add_region() produces a REGION with zero ACIS bytes, and the greiner_hormann substitute loses 28.2% of the area on a square with one semicircular edge.

system_run_command / system_run_lisp are a guardrail, not a security boundary — the rejection message says so in those words. A 36-verb denylist refuses the obvious cases, but AutoCAD accepts hundreds of commands and DANGEROUS_COMMANDS_ENABLED=true switches it off entirely.

Path validation is per-tool, and unscoped until you scope it. With ALLOWED_PATHS empty — the default — the only positive bound is a ten-entry system-directory denylist that does not include C:/Users, /home, /root or /var. Set ALLOWED_PATHS.

Non-AutoCAD ProgIDs are unverified. CAD_PROGID changes which COM application the backend attaches to; nothing beyond the connection has been tested against BricsCAD, ZWCAD or GstarCAD.

Configuration

Nothing loads a .env file — export these, or set them in your MCP client's env block.

All 16 environment variables
VariableDefaultPurpose
AUTOCAD_MCP_BACKENDautoauto, com, or ezdxf
CAD_PROGIDAutoCAD.ApplicationCOM ProgID the live backend attaches to
TOOL_PROFILEfulllean (47 curated tools) or full
DISCOVERY_MODEoffsearch replaces the catalog with search_tools + call_tool
ENABLE_3DfalseExpose the opt-in solid_* tools (COM)
LOG_LEVELINFOPython logging level
ALLOWED_PATHS(empty)Comma-separated absolute paths the server may access
MAX_UNDO_STACK5Maximum retained undo snapshots
EZDXF_UNDO_DEPTH0Headless undo history depth; 0 disables it
MAX_DXF_BYTES52428800Reject larger DXF input; 0 disables
MAX_LIST_LIMIT5000Bound list/selection response sizes
COM_CALL_TIMEOUT60Per-call live AutoCAD timeout (s); 0 disables
EZDXF_CALL_TIMEOUT120Per-call headless timeout (s); 0 disables
DANGEROUS_COMMANDS_ENABLEDfalseAllow blocked commands/LISP; reported as unsafe mode
ALLOW_REMOTE_HTTPfalsePermit a non-loopback HTTP bind
MCP_AUTH_TOKEN(empty)Bearer token required for remote HTTP

Architecture

flowchart LR
  A[MCP host / AI agent] --> B[FastMCP 3 server]
  B --> C[Error · audit · timing · logging · capability-refusal middleware]
  C --> D[Typed contract · 19 modules · 27 capabilities]
  D --> E[COM backend<br/>single-STA thread]
  D --> F[ezdxf backend<br/>asyncio.to_thread]
  E --> G[Live AutoCAD]
  F --> H[Headless DXF]
  E --> I[Engineering · critique · scoring · delivery]
  F --> I
The drawing at the top of this page, as tool calls

The sequence in scripts/render_readme_showcase.py, which produced the hero sheet:

drawing_new()                                    ISO linetypes + layers bootstrapped
drawing_apply_iso_layers("mech")                 ISO 128 lineweights per layer
drawing_settings({units: "mm", linear_precision: 2})

gear_draw_spur_front_view(                       involute flanks, not a decorated circle
    module=6, teeth=24, center=[135, 172],
    bore_diameter=40, keyway_width=12, keyway_depth=3.3)
gear_draw_section_aa(x_offset=300, face_width=46)

dimension_linear(...)                            ISO 129
dimension_diameter(..., fit="H7")                deviations from authored ISO 286 tables
titleblock_apply_iso_a3(title="SPUR GEAR m6 z24", material="C45E", ...)

drawing_critique(focus=None)                     -> []  must be empty before finalize
view_screenshot()                                -> PNG

The full production loop adds drawing_preflight and drawing_plan at the front, drawing_refine after the critique, and layout_create + viewport_create + drawing_deliver at the end.

Development

uv sync --locked --all-extras
uv run pytest
uv run ruff check . && uv run ruff format --check .

uv.lock pins the whole transitive graph, so this reproduces CI exactly. CI runs Linux (3.11 / 3.12), Windows (mocked-COM), plus package, Docker and MCP-registry jobs; the release gate runs the same three test lanes before anything reaches PyPI. Releases are tag-driven: git tag vX.Y.Z && git push origin vX.Y.Z.

Roadmap (1.6)

Give back the creation throughput the per-call timeout costs — arm it only for calls that can actually block. ISO 286 interference shafts r/s/t/u. HATCH boundary geometry in entity_get (1.5 measures a hatch's filled area but does not hand back its loops). REGION/3DSOLID area headlessly, which needs a modelling kernel ezdxf does not have. An allowlist of permitted AutoLISP heads, replacing the denylist — enumerating dangerous symbols does not terminate. ezdxf.recover as a fallback on drawing_open.

Features ship when their contracts and limitations are testable — not when they make a longer checklist.

Star History

Star History Chart

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

Files in the repo

Repository payload24 top-level entries
  • .github
  • backends
  • benchmarks
  • discovery
  • docs
  • engineering
  • scripts
  • tests
  • .env.example
  • .gitattributes
  • .gitignore
  • .pre-commit-config.yaml
  • CHANGELOG.md
  • CLAUDE.md
  • config.py
  • Dockerfile
  • LICENSE
  • pyproject.toml
  • README.md
  • security.py
  • server.json
  • server.py
  • uv.lock
  • version.py

Discussion (0)

Ask about usage, or say what you built with it

Sign in to join the discussion.

No comments yet. Be the first to say what this is good for.

More connectors

High-performance code intelligence MCP server. Indexes codebases into a persistent knowledge graph — average repo in milliseconds. 158 languages, sub-ms queries, 99% fewer tokens. Single static binary, zero dependencies.

43k

Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code

14k
okf-memory/
okf-agent-memory

Git-native persistent memory for AI coding agents. Implements Google OKF v0.2 with sub-300µs in-memory BM25 search, embedded MCP server, and progressive disclosure. Slashes token bloat by 80% with zero external databases or dependencies. Built in pure Go.

547
tirth8205/
code-review-graph

Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.

31k
2akouwu/
reverify

Stop your AI from making things up — it proposes, deterministic tools decide, every claim checked against ground truth with evidence. Grounded facts and context survive resets. Reverse engineering is the proving ground. MCP server + CLI.

1.1k
t8y2/dbxConnectors

20 MB lightweight cross-platform database client for 90+ databases, including MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, SQL Server, and Dameng. Built-in AI, MCP Server, CLI, desktop and Docker. | 轻量级跨平台数据库管理工具,支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 90+ 数据库,提供桌面端、Docker、CLI、内置 AI 助手和 MCP Server。

19k