New COM-only Entity Query tool that reads AutoCAD's implied ("pickfirst")
selection set and returns the selected entity handles + EntityInfo, so the AI
can scope work (e.g. dimension_auto) to exactly what the user picked in the
viewport instead of the whole drawing. Resolves #1 — the layer-juggling
workaround is no longer needed.
- backends/base.py: abstract selection_get() returning a status dict
- backends/com_backend.py: reads ActiveDocument.PickfirstSelectionSet, surfaces
the PICKFIRST sysvar, handles the empty-selection case
- backends/ezdxf_backend.py: headless stub (ok=False, empty handles, same shape)
- server.py: @mcp.tool registration (readOnlyHint), SECTION 5 3 -> 4 tools
- README + CHANGELOG + pyproject: 110 -> 111 tools, v1.1.0 -> v1.1.1
Verified live on AutoCAD 2027 (COM): selection_get correctly returned the
user's grip selection across two distinct picks; 318 tests pass, ruff-clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
55 lines
922 B
TOML
55 lines
922 B
TOML
[project]
|
|
name = "autocad-mcp-pro"
|
|
version = "1.1.1"
|
|
description = "Production-grade AutoCAD MCP server — COM API + ezdxf dual engine"
|
|
readme = "README.md"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"fastmcp>=3.0",
|
|
"ezdxf>=1.3",
|
|
"pydantic>=2.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
com = [
|
|
"pywin32>=306",
|
|
"Pillow>=10.0",
|
|
]
|
|
pdf = [
|
|
"matplotlib>=3.8",
|
|
]
|
|
full = [
|
|
"pywin32>=306",
|
|
"Pillow>=10.0",
|
|
"matplotlib>=3.8",
|
|
]
|
|
|
|
[project.scripts]
|
|
autocad-mcp = "server:mcp"
|
|
|
|
[tool.uv]
|
|
dev-dependencies = [
|
|
"pytest>=8.0",
|
|
"pytest-asyncio>=0.23",
|
|
"pytest-cov>=5.0",
|
|
"ruff>=0.8",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|
|
target-version = "py311"
|
|
|
|
[tool.ruff.lint]
|
|
select = ["E", "F", "I", "W", "UP", "B"]
|
|
ignore = ["E501"]
|
|
|
|
[tool.ruff.format]
|
|
quote-style = "double"
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "strict"
|