# Bimwright DWG (nuget · Bimwright.Dwg.Server)

MCP gateway for AutoCAD 2022-2027: DWG text, layers, entities, views and automation.

- Trust score: 68/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- nuget · `Bimwright.Dwg.Server`: 68/100 (this document), [markdown](https://verifymcp.io/servers/bimwright-dwg-mcp/bimwright-dwg-server.md), [page](https://verifymcp.io/servers/bimwright-dwg-mcp/bimwright-dwg-server)

## Channel facts

- Registry: `nuget`
- Package: `Bimwright.Dwg.Server`
- Version: `2.1.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 48/100
  - Source repository is publicly reachable at the declared URL.
  - Build provenance not yet verified.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 5 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 62/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 11651 tokens (~258/item across 45 items; 45 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 99% of tool parameters carry a description.
- **Tool Safety**: 92/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 2 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "dwg_send_code" implies "send" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 46 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Bimwright DWG MCP server?

Bimwright DWG runs locally as a NuGet package, launched with dnx Bimwright.Dwg.Server@2.1.1 --yes. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add bimwright-dwg-mcp -- dnx Bimwright.Dwg.Server@2.1.1 --yes
```

### Cursor

```json
{
  "mcpServers": {
    "bimwright-dwg-mcp": {
      "command": "dnx",
      "args": [
        "Bimwright.Dwg.Server@2.1.1",
        "--yes"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "bimwright-dwg-mcp": {
      "command": "dnx",
      "args": [
        "Bimwright.Dwg.Server@2.1.1",
        "--yes"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add bimwright-dwg-mcp -- dnx Bimwright.Dwg.Server@2.1.1 --yes
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bimwright-dwg-mcp": {
      "type": "local",
      "command": [
        "dnx",
        "Bimwright.Dwg.Server@2.1.1",
        "--yes"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  bimwright-dwg-mcp:
    command: "dnx"
    args: ["Bimwright.Dwg.Server@2.1.1", "--yes"]
```

### Netclaw

```json
{
  "McpServers": {
    "bimwright-dwg-mcp": {
      "Transport": "stdio",
      "Command": "dnx",
      "Arguments": [
        "Bimwright.Dwg.Server@2.1.1",
        "--yes"
      ]
    }
  }
}
```

### Other

```json
{
  "mcpServers": {
    "bimwright-dwg-mcp": {
      "command": "dnx",
      "args": [
        "Bimwright.Dwg.Server@2.1.1",
        "--yes"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-31 (score 68, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-30 (score 53)

First indexed and scored.

## MCP tools (45)

### `dwg_update_texts` (~180 tokens)

Write new text to AutoCAD entities identified by handle. Input is a JSON array of {handle, new_text} objects. Returns per-item {handle, ok, error} - failures do not abort siblings. Handles are hex strings as returned by dwg_get_selected_texts. All items are written in a single transaction so one Ctrl+Z undoes the batch. If applyUnicodeStyle=true, the same call also reassigns successfully updated entities to the Unicode text style. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `applyUnicodeStyle` (boolean): When true, apply the Unicode text style to successfully updated entities in the same tool call.
- `items` (string, required): JSON array: [{"handle":"2A4F","new_text":"..."}]

### `dwg_batch_execute` (~181 tokens)

Run multiple internal DWG commands sequentially as a logical batch. commands must be a JSON array of {cmd, params}. run_lisp is blocked in this build, including batches; use dwg_inspect_lisp for analysis only. Each step reports index, command_ok, effective ok, outcome and nullable mutation_applied; file-output steps also report output_verified. Read nested results/file_receipt and output_artifact for omitted details. May change drawing data or files; disabled in read-only mode even when a particular batch only contains reads. Commands are sequential, not one atomic transaction: earlier effects can remain after a later failure. Use AutoCAD UNDO for drawing edits and backups for file changes.

Input parameters:

- `commands` (string, required): JSON array: [{"cmd":"get_selected_texts","params":{}}]. Wire command names are unprefixed.

### `dwg_get_current_target` (~37 tokens)

Return this gateway's binding state, PID, process start, generation, selection confirmation and drawing identity. No discovery or drawing changes.

### `dwg_open_drawing` (~343 tokens)

Open an existing .dwg from an absolute drive/UNC path on the AutoCAD machine, not the MCP client. This is the tool to use when no drawing is open. Ask the user which recent path to open first. activate=true (default) makes it active; false requires an existing active drawing and restores that drawing after opening (not a viewless background database). read_only=false (default) requests writable access; true requests read-only access. Reuses an already-open drawing without reopening it; an access-mode mismatch is refused rather than closing or changing it. Never saves, closes or overwrites drawings. Runs in application context without a document lock, requires idle multi-document mode (SDI=0), and is not supported inside batch/baked drawing workflows. DWG only: no DXF, templates, cloud URLs, audit or recovery. Native AutoCAD dialogs may require the user. timeout_seconds: 1-900, default 600; timing out does not cancel an Open already running, so inspect AutoCAD before retrying. Returns opened, was_already_open, title, path, actual read_only, activated and active_document. Opening an older DWG does not write upgraded bytes unless subsequently saved.

Input parameters:

- `activate` (boolean): Make the drawing active; false keeps an existing drawing active.
- `path` (string, required): Absolute .dwg path reachable by the AutoCAD process.
- `read_only` (boolean): Request read-only access to the file (not the gateway --read-only mode).
- `timeout_seconds` (integer): Plugin response wait in seconds, 1-900; default 600. Does not cancel host work.

### `dwg_create_arc` (~191 tokens)

Create an Arc in the current AutoCAD space. center is a JSON point object. radius must be positive and finite. start_angle and end_angle are degrees. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `center` (string, required): JSON point object, e.g. {"x":0,"y":0,"z":0}.
- `color_index` (integer|null): Optional ACI color index for the new entity, and for creating a supplied missing layer. Valid range: 1-256.
- `end_angle` (number, required): End angle in degrees.
- `layer` (string): Optional target layer name. If supplied, the layer is ensured using color_index or default 7.
- `radius` (number, required): Arc radius. Must be positive and finite.
- `start_angle` (number, required): Start angle in degrees.

### `dwg_create_ellipse` (~207 tokens)

Create an Ellipse in the current AutoCAD space. center is a JSON point object. major_radius and minor_radius must be positive and finite. rotation is degrees. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `center` (string, required): JSON point object, e.g. {"x":0,"y":0,"z":0}.
- `color_index` (integer|null): Optional ACI color index for the new entity, and for creating a supplied missing layer. Valid range: 1-256.
- `layer` (string): Optional target layer name. If supplied, the layer is ensured using color_index or default 7.
- `major_radius` (number, required): Major radius. Must be positive and finite.
- `minor_radius` (number, required): Minor radius. Must be positive, finite, and less than or equal to major_radius.
- `rotation` (number, required): Major-axis rotation in degrees.

### `dwg_apply_unicode_style` (~213 tokens)

Ensure the 'Bimwright_Unicode' text style exists (using Open Sans Condensed Light font, using the bundled font or a checksum-validated fallback download) and reassign target entities to it. Height normalization is smart and idempotent: SHX sources are reduced more than TrueType sources, while entities already on the Unicode style keep their current height instead of shrinking again. Targets: if 'handles' is a non-empty JSON array, those entities are used; otherwise falls back to the current pickfirst selection. MUST be called after translating text to Vietnamese or any non-ASCII language on drawings that use SHX fonts lacking the required glyphs (otherwise text renders as '?'). Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `handles` (string): Optional JSON array of target handles, e.g. ["7F5AD","2A4F"]. Omit or pass "" to use the current pickfirst selection.

### `dwg_zoom_extents` (~21 tokens)

Zoom to the extents of the drawing viewport.

### `dwg_get_drawing_info` (~42 tokens)

Return small JSON-safe metadata for the current AutoCAD drawing: drawing name when available, current layer, current space/layout, and database unit scalars.

### `dwg_change_layer` (~176 tokens)

Move entities identified by handle to an existing layer. If create_layer=true, the layer is ensured first using color_index or default 7. Returns one result record per handle; bad handles do not abort siblings. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `color_index` (integer|null): Optional ACI color index used only when create_layer=true creates a missing layer. Valid range: 1-256. Default: 7.
- `create_layer` (boolean): When true, ensure the target layer before moving entities.
- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].
- `layer` (string, required): Target layer name. Must exist unless create_layer=true.

### `dwg_query_entities` (~544 tokens)

Query model-space AutoCAD entities with optional filters for entity type, layer, and ACI color index. Existing calls retain their legacy fields, geometry option and order. Set paged=true or supply spatial/field options for bounded numeric-handle pages. Paged defaults are handle/type/layer and 16384 final MCP UTF-8 bytes. Content reports omissions and next_calls; echo their filters/fields with the signed cursor. BBox tests inclusive WCS 3D axis-aligned extents, not exact geometry clipping, in selected-space drawing units without INSUNITS conversion. Unavailable bbox-filter extents/population read failures are counted and block continuation; changed drawing/filter/fields rejects the cursor. Requires matching plugin support; unconfirmed legacy replies are refused. Call directly, outside batches, for paged reads. Use fields=["handle"] for paged spatial handles without changing selection.

Input parameters:

- `bbox` (string): Optional JSON object {min:[x,y,z],max:[x,y,z]}, finite ordered WCS drawing-unit bounds.
- `bbox_mode` (string): intersects (default with bbox) or contains; closed AABB boundaries. Requires bbox.
- `color_index` (integer|null): Optional ACI color index filter. Valid range: 1-256.
- `cursor` (string): Opaque cursor from output.next_calls. Echo the same matching/field options; changed snapshots refuse continuation.
- `entity_type` (string): Optional managed type name, case-insensitive. TEXT/INSERT/LWPOLYLINE aliases are supported. Exact uppercase POLYLINE is refused; use Polyline/LWPOLYLINE, Polyline2d or Polyline3d explicitly.
- `fields` (string): JSON array from handle,type,runtime_type,layer,color_index,text,position,extents. Default handle/type/layer; handle always included. Unsupported field values are null with unavailable_fields.
- `include_geometry` (boolean): Legacy only: include full existing geometry output. Paged reads use fields instead.
- `layer` (string): Optional layer name filter. Case-insensitive.
- `limit` (integer|null): Optional maximum number of returned entities. The plugin clamps this to 1-5000.
- `max_output_bytes` (integer|null): Paged final MCP byte cap, default 16384, range4096..65536; lower global cap still applies.
- `paged` (boolean): Opt in to bounded stable pages, even without spatial or field filters.
- `space` (string): model (default) or layout:<exact human layout name>, case-insensitive. Top-level entities only; no block/xref expansion.

### `dwg_restore_view` (~168 tokens)

Return to the camera of a recent supported capture and return a fresh inline image plus JSON. Changes the visible view and writes a PNG, not drawing geometry. Requires the same unchanged drawing, layout and single top-down model viewport. Use an ancestor capture_id to return to the overview. Returns a new capture_id; use that new ID for subsequent region navigation. History expires after 30 minutes or 64 captures or host restart. Writes a new image file; disabled in read-only mode. Return to another captured camera and delete the generated image to undo these effects.

Input parameters:

- `pixel_size` (integer|null): Requested longer image dimension, default 1600; clamped to 64..8192.
- `source_capture_id` (string, required): ID of the supported capture whose camera should be restored.

### `dwg_offset_entities` (~127 tokens)

Offset curve entities identified by handle by distance. handles is a JSON array of AutoCAD handle strings. Only Curve entities are supported. Returns per-item {handle, ok, created_handles, error}; bad handles and unsupported entities do not abort siblings. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `distance` (number, required): Offset distance. Must be finite and non-zero.
- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].

### `dwg_zoom_window` (~49 tokens)

Zoom viewport to a window defined by two corner points.

Input parameters:

- `corner1` (object, required): First corner of the zoom window.
- `corner2` (object, required): Second corner of the zoom window.

### `dwg_inspect_view_region` (~279 tokens)

Look closer at a rectangle in a previous capture: zoom in AutoCAD, regenerate, verify the camera and capture a NEW image. Changes the visible view and saves a PNG, but does not edit geometry or save the DWG. Requires a current source capture in the same unchanged drawing: single model-space viewport, top-down, zero twist, orthographic, no clipping. Returns inline image and JSON with a new capture_id and parent_capture_id. Use the new ID for the next zoom; use dwg_restore_view to go back. History is limited to 64 captures / 30 minutes in the current AutoCAD process. Stale or unsupported sources are refused before zoom. Writes a new image file; disabled in read-only mode. Restore the prior camera with dwg_restore_view and delete the generated image to undo these effects.

Input parameters:

- `pixel_size` (integer|null): Requested longer image dimension, default 1600; clamped to 64..8192.
- `region` (object, required): Rectangle on that exact image: {left,top,right,bottom}, normalized 0..1, origin top-left. Ordered bounds, at least 4 image pixels per axis. Entire region is fitted with 10% surrounding context, prese…
- `source_capture_id` (string, required): capture_id returned by the current supported capture.

### `dwg_create_point` (~164 tokens)

Create a Point in the current AutoCAD space. point is a JSON point object with numeric x, y, and optional z fields. Optional layer is ensured before assignment; optional color_index sets the entity ACI color. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `color_index` (integer|null): Optional ACI color index for the new entity, and for creating a supplied missing layer. Valid range: 1-256.
- `layer` (string): Optional target layer name. If supplied, the layer is ensured using color_index or default 7.
- `point` (string, required): JSON point object, e.g. {"x":0,"y":0,"z":0}.

### `dwg_scale_entities` (~173 tokens)

Scale entities identified by handle around basePoint. handles is a JSON array of AutoCAD handle strings. basePoint is a JSON point object. scale must be finite, positive, and less than or equal to 1000. Returns per-item {handle, ok, error}; bad handles do not abort siblings. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `basePoint` (string, required): JSON base point object, e.g. {"x":0,"y":0,"z":0}.
- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].
- `scale` (number, required): Scale factor. Must be finite, positive, and <= 1000.

### `dwg_translate_and_rewrite` (~355 tokens)

PREFERRED translation tool. Writes translated text back to AutoCAD. Input is a JSON array of {id, new_text, render_mode?, width_policy?} where id matches a cluster from dwg_get_selected_texts. The tool handles everything automatically: anchor selection, fragment deletion, MText conversion (when safe), Unicode font style, and height scaling. Optional render_mode='mtext' lets the caller force a safe single DBText or top-level cluster to end up as MText. Simply provide the translated text for each cluster. If a cluster needs no translation (pure numbers, elevation markers), omit it - the tool will still apply the Unicode style to it. Per-cluster response includes an 'action' field: update | collapse | rewrite_in_block | style_only. final_text_height measures the resulting entity's stored height after normalization/scaling, or null if unavailable; style_only reports the anchor and block definitions use local units. Workflow: dwg_get_selected_texts -> translate each cluster -> dwg_translate_and_rewrite. Use dwg_collapse_and_rewrite (low-level) only for expert control or replaying call-log scenarios. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `finalScale` (number): Optional per-request final text-height multiplier. Default 0.80; clamped to [0.5, 0.9]. Values outside the range snap to the nearest bound; 0 or NaN fall back to default.
- `translations` (string, required): JSON array: [{"id":0,"new_text":"translated text","render_mode":"mtext","width_policy":"preserve"}]

### `dwg_list_layers` (~33 tokens)

List layers in the current AutoCAD drawing with small scalar properties such as color index, locked/frozen/off state.

### `dwg_create_rectangle` (~184 tokens)

Create a Rectangle as a closed Polyline in the current AutoCAD space. corner1 and corner2 are JSON point objects with numeric x, y, and optional z fields. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `color_index` (integer|null): Optional ACI color index for the new entity, and for creating a supplied missing layer. Valid range: 1-256.
- `corner1` (string, required): JSON point object, e.g. {"x":0,"y":0,"z":0}.
- `corner2` (string, required): JSON point object, e.g. {"x":1000,"y":500,"z":0}.
- `layer` (string): Optional target layer name. If supplied, the layer is ensured using color_index or default 7.

### `dwg_create_polyline` (~181 tokens)

Create a 2D Polyline in the current AutoCAD space. points is a JSON array of point objects with numeric x, y, and optional z fields. At least two points are required. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `closed` (boolean): When true, close the polyline.
- `color_index` (integer|null): Optional ACI color index for the new entity, and for creating a supplied missing layer. Valid range: 1-256.
- `layer` (string): Optional target layer name. If supplied, the layer is ensured using color_index or default 7.
- `points` (string, required): JSON point array, e.g. [{"x":0,"y":0},{"x":1000,"y":0}].

### `dwg_send_code` (~475 tokens)

Execute a C# snippet through dwg_send_code against the AutoCAD .NET API as an escape hatch. Enabled by default on the meta toolset; the AutoCAD MCPDISABLECODE command disables it for the session (MCPENABLECODE re-enables). WARNING: send_code runs arbitrary code with full access to the AutoCAD process and local filesystem. Only use with trusted agents. This is not a sandbox. Never use it to bypass a run_lisp refusal or execute untrusted LISP. Globals available: Document doc, Database db, Editor ed. The script runs on the document-lock thread; end with 'return <expr>;' or a trailing expression to return a JSON-safe DTO value in the result field; AutoCAD/COM objects, including nested objects, are rejected. Only inline synchronous snippets are supported: async/await and #load directives are rejected before execution. Do not move AutoCAD API calls to Task.Run or other threads. Use System.Console.WriteLine for stdout output. Execution has cooperative 30s cancellation. An active drawing is required: when none is open, use dwg_list_recent_drawings and dwg_open_drawing first; the host refuses before executing code. doc, db and ed are supplied from that active drawing. Put database writes in one using transaction from db.TransactionManager.StartTransaction(), and Commit only after validation succeeds. Return host warnings and handled errors in your DTO. AutoCAD UNDO can reverse drawing edits; filesystem writes are outside it, and the gateway does not roll back earlier committed transactions after a later script error. Default namespaces: System, System.Collections.Generic, System.Linq, Autodesk.AutoCAD.ApplicationServices, Autodesk.AutoCAD.DatabaseServices, Autodesk.AutoCAD.EditorInput, Autodesk.AutoCAD.Geometry. Large result/stdout is stored as complete UTF-8 JSON before the 10 MiB plugin cutoff, with output_artifact path/bytes/SHA-256/preview when storage permits. The final MCP budget may store a second artifact of the full MCP result it received; inspect scope and upstrea…

Input parameters:

- `code` (string, required): C# code to execute

### `dwg_zoom_to_entity` (~42 tokens)

Zoom viewport to the extents of a specific drawing entity identified by handle.

Input parameters:

- `handle` (string, required): AutoCAD handle of the entity to zoom to.

### `dwg_select_by_layer` (~145 tokens)

Return handles for model-space entities on a required layer, with optional type/color filters. This does not change AutoCAD pickfirst selection.

Input parameters:

- `color_index` (integer|null): Optional ACI color index filter. Valid range: 1-256.
- `entity_type` (string): Optional managed type name, case-insensitive. Exact uppercase POLYLINE is refused; use Polyline/LWPOLYLINE, Polyline2d or Polyline3d explicitly.
- `layer` (string, required): Required layer name filter. Case-insensitive.
- `limit` (integer|null): Optional maximum number of returned handles. The plugin clamps this to 1-5000.

### `dwg_get_drawing_profile` (~287 tokens)

Profile top-level entities in all spaces (default), model only or one named layout. Reports exact managed runtime type, layer and per-space counts with source/coverage; incomplete reads report observed counts and null exact totals. Block inserts count once; nested block contents, uninserted definitions and xref contents are not expanded. The default final MCP output cap is 16384 UTF-8 bytes, independent of the global response budget. Content identifies omitted groups and next_calls for types/layers/spaces. Each page rescans; pass expected_snapshot from the previous result when offset is positive. A changed document/revision refuses continuation. No geometry, selection or drawing changes.

Input parameters:

- `expected_snapshot` (string): Snapshot token from a previous profile result. Required for positive offsets; mismatches require restarting at offset zero.
- `max_output_bytes` (integer): Maximum final MCP result bytes, default 16384; supported range 4096..65536. A smaller global budget still applies.
- `offset` (integer): Ordinal group offset for the selected table, default 0; positive offsets require expected_snapshot.
- `section` (string): summary (default), types, layers or spaces. Summary starts all tables at offset zero.
- `space` (string): all (default), model or layout:<exact layout name>. Model snapshots ignore viewport navigation; layout/all snapshots track it.

### `dwg_create_line` (~192 tokens)

Create a Line in the current AutoCAD space. start and end are JSON point objects with numeric x, y, and optional z fields. Optional layer is ensured before assignment; optional color_index sets the entity ACI color. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `color_index` (integer|null): Optional ACI color index for the new entity, and for creating a supplied missing layer. Valid range: 1-256.
- `end` (string, required): JSON point object, e.g. {"x":1000,"y":0,"z":0}.
- `layer` (string): Optional target layer name. If supplied, the layer is ensured using color_index or default 7.
- `start` (string, required): JSON point object, e.g. {"x":0,"y":0,"z":0}.

### `dwg_create_layer` (~107 tokens)

Ensure an AutoCAD layer exists. If the layer already exists, its existing color and state are left unchanged and the response reports created=false. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `color_index` (integer|null): Optional ACI color index used only when creating a missing layer. Valid range: 1-256. Default: 7.
- `name` (string, required): Layer name to ensure.

### `dwg_collapse_and_rewrite` (~385 tokens)

LOW-LEVEL rewrite primitive. PREFER translate_and_rewrite for the standard translation workflow - this tool exists for expert control, regression replay from mcp-calls.jsonl, and future non-translation orchestrators. Accepts explicit per-cluster instructions {anchor_handle, new_text, delete_handles, convert_to_mtext, mtext_width}. For each cluster: anchor_handle is the fragment to keep (typically topmost-leftmost), new_text is the full rewritten sentence (may contain \\P line breaks for multi-line), delete_handles are all other fragments in the cluster (will be erased), convert_to_mtext=true upgrades DBText->MText for natural word wrap (only safe in model space, not inside blocks), mtext_width is the cluster bounding box X-span (only used if convert_to_mtext). Each cluster runs in its own transaction (one failure does not roll back siblings). Response per cluster includes an 'action' field: update | collapse | rewrite_in_block. If applyUnicodeStyle=true, the same call reassigns surviving entities to the Unicode text style and scales height. final_text_height measures the resulting entity's stored height after normalization/scaling, or null if unavailable; block definitions use local units. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `applyUnicodeStyle` (boolean): When true, apply the Unicode text style to surviving entities in the same tool call.
- `clusters` (string, required): JSON: {"clusters":[{"anchor_handle":"...","new_text":"...","delete_handles":["..."],"convert_to_mtext":true,"mtext_width":0}]}
- `finalScale` (number): Optional per-request final text-height multiplier. Default 0.80; clamped to [0.5, 0.9].

### `dwg_run_lisp` (~151 tokens)

Unavailable: LISP execution is blocked in this build. Retained for compatibility; all file/code/command inputs are refused locally without reading files or contacting AutoCAD. There is no isolated executor or approved-script trust mechanism. Use dwg_inspect_lisp for static analysis only; clean/caution/dangerous never authorize execution. MCPENABLECODE does not override this restriction. Do not bypass refusal through dwg_send_code, batch, ToolBaker, or reformatted payloads.

Input parameters:

- `code` (string): Legacy source input; execution is blocked
- `command` (string): Legacy command input; execution is blocked
- `file` (string): Legacy file input; execution is blocked

### `dwg_get_selected_texts` (~446 tokens)

Read and cluster text. Existing two-argument calls use AutoCAD pickfirst selection and legacy rewrite IDs. Supply handles or bbox to read without selecting anything; choose exactly one explicit source. Explicit-source mode reads top-level DBText/MText/MLeader, does not expand blocks/xrefs, clusters the full declared source before paging whole clusters, and returns read-only cluster_key values. It leaves legacy rewrite state unchanged. For per-entity writes use includeEntities=true then dwg_update_texts by handle; cluster rewrite still requires manual selection. Cursor, content omissions and next_calls follow the bounded query pattern (default16384 final MCP UTF-8 bytes). Source limits5000 text records/8MiB UTF-8; incomplete sources produce no groups or continuation. Model snapshots ignore viewport navigation; entity changes refuse continuation. Explicit-source calls must be direct outside batches/baked tools. Each cluster has id, text, entity_count, in_block (bool) and rewrite_mode only on the legacy selection path. Explicit-source groups never supply writable numeric IDs.

Input parameters:

- `bbox` (string): Explicit source JSON object {min:[x,y,z],max:[x,y,z]} in WCS drawing units; mutually exclusive with handles.
- `bbox_mode` (string): intersects or contains inclusive3D extents test; requires bbox.
- `cursor` (string): Opaque whole-cluster continuation from output.next_calls. Echo same source/grouping/includeEntities.
- `groupingStrength` (string): Optional grouping strength: weak, normal, or strong. Use weak when an image/layout reference indicates nearby labels should stay separate.
- `handles` (string): Explicit source JSON array of0..5000 hexadecimal handle values; deduplicated. Mutually exclusive with bbox.
- `includeEntities` (boolean): When true, include each child text entity's handle/text/position so callers can recover from over-grouped clusters.
- `max_output_bytes` (integer|null): Explicit-source final MCP UTF-8 cap4096..65536(default16384), subject to lower global cap.
- `space` (string): model(default for explicit source) or layout:<exact name>. Top-level text only.

### `dwg_change_color` (~144 tokens)

Apply an AutoCAD ACI color index to entities identified by handle. handles is a JSON array of AutoCAD handle strings. color_index is validated by AutoCAD-side handling as ACI range 1-256. Returns per-item {handle, ok, error}; bad handles do not abort siblings. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `color_index` (integer, required): ACI color index to apply. Valid range: 1-256.
- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].

### `dwg_get_entity_properties` (~110 tokens)

Return properties for AutoCAD entities identified by handle. Input handles is a JSON array of hex handles, e.g. ["7F5AD"]. Returns one result record per handle; bad handles do not abort siblings.

Input parameters:

- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].
- `includeGeometry` (boolean): When true, include lightweight geometry such as extents, points, lengths, and text positions where available.

### `dwg_rotate_entities` (~158 tokens)

Rotate entities identified by handle around basePoint on the Z axis. handles is a JSON array of AutoCAD handle strings. basePoint is a JSON point object, and angleDegrees is in degrees. Returns per-item {handle, ok, error}; bad handles do not abort siblings. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `angleDegrees` (number, required): Rotation angle in degrees.
- `basePoint` (string, required): JSON base point object, e.g. {"x":0,"y":0,"z":0}.
- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].

### `dwg_select_by_type` (~157 tokens)

Return handles for model-space entities of a required type, with optional layer/color filters. This does not change AutoCAD pickfirst selection.

Input parameters:

- `color_index` (integer|null): Optional ACI color index filter. Valid range: 1-256.
- `entity_type` (string, required): Required managed type name, case-insensitive. TEXT/INSERT/LWPOLYLINE aliases are supported. Exact uppercase POLYLINE is refused; use Polyline/LWPOLYLINE, Polyline2d or Polyline3d explicitly.
- `layer` (string): Optional layer name filter. Case-insensitive.
- `limit` (integer|null): Optional maximum number of returned handles. The plugin clamps this to 1-5000.

### `dwg_copy_entities` (~146 tokens)

Copy entities identified by handle by a displacement vector. handles is a JSON array of AutoCAD handle strings. vector is a JSON point object with numeric x, y, and optional z fields. Returns per-item {handle, ok, new_handle, error}; bad handles do not abort siblings. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].
- `vector` (string, required): JSON vector object, e.g. {"x":100,"y":0,"z":0}.

### `dwg_list_recent_drawings` (~160 tokens)

List recent DWG files for the connected AutoCAD product from its user registry Recent File List. Works with no drawing open; never opens a file. Returns up to 50 entries in MRU index order: index, path, name, exists and pinned. Optional name is a case-insensitive filename substring, filtered before max_items (1-50, default 50). Ask the user which path to open, then call dwg_open_drawing with that absolute path. The registry layout is product-specific; a missing list returns registry_found=false, not a guessed list.

Input parameters:

- `max_items` (integer): Maximum matching files, 1-50; default 50.
- `name` (string): Optional case-insensitive filename substring.

### `dwg_list_available_targets` (~92 tokens)

List running AutoCAD instances with target_id, PID and process start time. In full mode select the intended instance using dwg_switch_target(target='pid:<PID>'). In --read-only, start or restart the gateway with --target pid:<PID> or id:<target_id>; dwg_switch_target is unavailable. Supports per-instance discovery and legacy AutoCAD 2022 through 2027 discovery files.

### `dwg_health` (~291 tokens)

At session start select the intended AutoCAD target, then call dwg_health(check_updates=true) once. Routine probes stay offline; not_checked/unknown never means up to date. Reports host/document state and loaded server/plugin versions, build ids and alignment. A busy UI can make document state unavailable; health does not require or lock an active drawing. No target still returns gateway identity with ok:false and host_connected:false. Legacy plugins without health/identity remain unverified, not assumed corrupt. Inspect both update.components and the full update.notification message, lookup_reason, protected_component_reasons and unobserved_components. UPDATE_CHECK_UNAVAILABLE reports external lookup failure, not a runtime fault or request for installation authorization. LOCAL_VERSION_AHEAD is informational: never downgrade or automatically replace development builds. Only update_guidance.mode=prepare_update with bundle_update_proposal_allowed=true permits an update proposal and needs installation authorization (reuse existing permission); other modes contain check/review steps only. comparison_reason=release_revision_unavailable means missing external evidence, not a broken local build. After reconnect compare fresh initialize and tools/list metadata/schema/annotations on that connection with client_verification; the server cannot prove client cache refresh. Matching revisions do not verify artifact bytes, compatibility or publisher trust. Read-only; never installs, downloads packages, saves/closes drawings, edits client configs or restarts processes.

Input parameters:

- `check_updates` (boolean)

### `dwg_switch_target` (~306 tokens)

Bind this gateway to one AutoCAD instance. A different bound instance requires pid:<PID> or id:acad-<year>-<PID>; an initial year must be unambiguous. verify=true (default) authenticates health and confirms the current drawing before allowing writes. verify=false permits reads only. Without rebind=true, selecting the same process preserves its drawing lifetime pin, including with verify=false. expected_document_id explicitly sets that pin, even without verification. Leaving a live confirmed instance requires rebind=true. A changed drawing must match an explicit expected_document_id or be intentionally accepted with rebind=true. Failed verification preserves the previous binding. Inspect health after opening/switching drawings before accepting a new pin. Unavailable in --read-only. Changes routing only; never activates, saves or closes drawings. Calls pending under an older binding are refused before sending.

Input parameters:

- `expected_document_id` (string): Optional drawing lifetime pin observed from health. Sets the pin even with verify=false; verification must match it.
- `rebind` (boolean): Explicitly accept an intended instance or drawing change; default false. Does not bypass an expected_document_id mismatch.
- `target` (string, required): pid:<PID> or id:acad-<year>-<PID> for a different bound instance; an unambiguous AutoCAD year (2022-2027) is accepted for initial selection.
- `verify` (boolean): Verify host and active drawing before allowing writes; default true.

### `dwg_count_entities` (~254 tokens)

Count AutoCAD entities matching type/layer/color; legacy calls read model space. Optional bbox/space use the same inclusive WCS extents filter as paged query, report INSUNITS and unknown extents separately. Incomplete spatial counts return null count/exact_match_count plus observed matched_count; no estimated count is invented. Spatial counts require matching plugin support and direct calls outside batches.

Input parameters:

- `bbox` (string): JSON object {min:[x,y,z],max:[x,y,z]} in WCS drawing units.
- `bbox_mode` (string): intersects (default with bbox) or contains; inclusive AABB test, requires bbox.
- `color_index` (integer|null): Optional ACI color index filter. Valid range: 1-256.
- `entity_type` (string): Optional managed type name, case-insensitive. TEXT/INSERT/LWPOLYLINE aliases are supported. Exact uppercase POLYLINE is refused; use Polyline/LWPOLYLINE, Polyline2d or Polyline3d explicitly.
- `layer` (string): Optional layer name filter. Case-insensitive.
- `space` (string): model or layout:<exact human layout name>; no fallback to another space.

### `dwg_create_circle` (~169 tokens)

Create a Circle in the current AutoCAD space. center is a JSON point object with numeric x, y, and optional z fields. radius must be positive and finite. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `center` (string, required): JSON point object, e.g. {"x":0,"y":0,"z":0}.
- `color_index` (integer|null): Optional ACI color index for the new entity, and for creating a supplied missing layer. Valid range: 1-256.
- `layer` (string): Optional target layer name. If supplied, the layer is ensured using color_index or default 7.
- `radius` (number, required): Circle radius. Must be positive and finite.

### `dwg_inspect_lisp` (~253 tokens)

Statically inspect AutoLISP for known suspicious patterns without executing it — downloaded .lsp files can embed malware (process exec via startapp/shell, COM automation like WScript.Shell/XMLHTTP, persistence via acad.lsp/acaddoc.lsp or registry writes, file deletion, staged (load ...) payloads, obfuscation via eval/read). Pure local analysis: does not execute anything and needs no AutoCAD round-trip, so it works under --read-only too. Params: 'file' (absolute path) and/or 'code' (inline source). Returns {ok, verdict: clean|caution|dangerous, opaque, summary, findings[]}. Compiled .fas/.vlx cannot be inspected and always verdict 'dangerous'. This is not a sandbox or an antivirus guarantee: clean means no known pattern matched, not safe. execution_authorized and safety_assured are always false. dwg_run_lisp is blocked in this build; do not bypass that refusal through other execution tools.

Input parameters:

- `code` (string): Inline AutoLISP source to inspect
- `file` (string): Absolute path to a .lsp/.fas/.vlx file to inspect

### `dwg_capture_view_image` (~392 tokens)

Capture the active drawing to a raster image (.png/.jpg/.jpeg/.bmp) using AutoCAD's in-process document preview API. No desktop automation, zoom, geometry edits or DWG save. Wait for zoom/commands to complete before capturing. If output_path is omitted, saves to %LOCALAPPDATA%\Bimwright\dwg-mcp\captures\ with an auto-generated name. Returns inline MCP image content (up to 8 MiB) plus JSON with image path, actual dimensions, SHA-256, timestamp, document fingerprint, layout, viewport and camera. Use capture_id with dwg_inspect_view_region when region_navigation.supported is true. Camera coordinates describe the active viewport; do not assume one pixel-to-world mapping for tiled views or paper layouts. Persist the response alongside the image when building a reading atlas. Writes an image file; disabled in read-only mode. Delete a new image to undo file creation. Overwritten image bytes cannot be restored by AutoCAD UNDO; restore a backup.

Input parameters:

- `allow_repo_output` (boolean|null): Allow output to the repository root directory.
- `expected_document_fingerprint` (string): Optional drawing fingerprint from a previous capture. Rejects capture if the active drawing differs; never switches documents.
- `image_format` (string): Image format used only when output_path is omitted: png (default), jpeg, or bmp.
- `output_path` (string): Optional absolute output path ending in .png, .jpg, .jpeg, or .bmp. If omitted, an auto-named PNG is written to the captures directory.
- `overwrite_existing` (boolean|null): Overwrite the output file if it already exists.
- `pixel_size` (integer|null): Requested longer image dimension (default 1600, clamped to 64-8192), using the current viewport aspect ratio. AutoCAD may round the actual dimensions returned.

### `dwg_erase_entities` (~98 tokens)

Erase entities identified by handle. handles is a JSON array of AutoCAD handle strings. Returns per-item {handle, ok, error}; bad handles do not abort siblings. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].

### `dwg_move_entities` (~143 tokens)

Move entities identified by handle by a displacement vector. handles is a JSON array of AutoCAD handle strings. vector is a JSON point object with numeric x, y, and optional z fields. Returns per-item {handle, ok, error}; bad handles do not abort siblings. Changes the current drawing; use AutoCAD UNDO immediately to reverse drawing edits before saving. Disabled in read-only mode.

Input parameters:

- `handles` (string, required): JSON array of AutoCAD handles, e.g. ["7F5AD","2A4F"].
- `vector` (string, required): JSON vector object, e.g. {"x":100,"y":0,"z":0}.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/bimwright-dwg-mcp/bimwright-dwg-server#diagnostics

## Score history

- 2026-11-05: 68
- 2026-11-04: 68
- 2026-11-03: 68
- 2026-11-02: 68
- 2026-11-01: 68
- 2026-10-31: 68
- 2026-10-30: 53

## Common questions

### What is the Bimwright DWG MCP server?

Bimwright DWG is an MCP server listed in the public MCP registry as io.github.bimwright/dwg-mcp. MCP gateway for AutoCAD 2022-2027: DWG text, layers, entities, views and automation. This page covers its NuGet package (Bimwright.Dwg.Server).

### Is the Bimwright DWG MCP server safe to use?

Bimwright DWG scores 68 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Bimwright DWG MCP server expose?

Bimwright DWG exposes 45 tools: dwg_update_texts, dwg_batch_execute, dwg_get_current_target, dwg_open_drawing, dwg_create_arc, and 40 more. Their descriptions and schemas cost roughly 8,951 tokens of context every time the server is loaded.

### Is the Bimwright DWG MCP server still maintained?

Bimwright DWG is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Bimwright DWG MCP server under?

Bimwright DWG declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- NuGet package: https://www.nuget.org/packages/Bimwright.Dwg.Server
- Socket report: https://socket.dev/nuget/package/Bimwright.Dwg.Server
- Repository: https://github.com/bimwright/dwg-mcp
- Changelog RSS feed: https://verifymcp.io/servers/bimwright-dwg-mcp/bimwright-dwg-server.xml
- Changelog JSON feed: https://verifymcp.io/servers/bimwright-dwg-mcp/bimwright-dwg-server.json
- HTML version of this page: https://verifymcp.io/servers/bimwright-dwg-mcp/bimwright-dwg-server
