Skip to main content
Glama
ladla90077-web

SolidWorks MCP

README.md
# SolidWorks MCP — run, test & auto-fix VBA macros

An MCP server that connects to a running **SolidWorks 2022** over COM (pywin32),
runs your VBA macros (or inline VBA), inspects the resulting model, and returns
**structured diagnostics** so Claude can fix errors and re-run until the model
builds clean. It also ships an **API-documentation pipeline** that renders the
JavaScript-only `help.solidworks.com/2022` pages headlessly and extracts the
method/enum facts that keep generated code correct.

Built to pair with the `solidworks-vba` skill: the skill *writes* verified-style
macros; this server *runs, tests and repairs* them.

## How it works

```
Claude (+ solidworks-vba skill)
        │  writes / fixes VBA
        ▼
  run_and_verify ──► COM worker thread (STA) ──► SolidWorks 2022
        │                                              │
        │   ◄── verdict: ran? rebuild errors?  ◄───────┘
        ▼        errored features? VBA error?
   if not success: read errors, regenerate, call again   (Claude-driven loop)
```

- **Inline VBA** is written to a temporary `.swb` and executed with `RunMacro2`
  (SolidWorks compiles `.swb` text on the fly — no `.swp` authoring, no VBA
  trust-access setting needed).
- All COM access runs on **one STA worker thread** (COM objects are
  apartment-bound).
- Generated/automated macros use a **silent log** (`SWMCP_Log`) instead of
  `MsgBox`, and a **dialog watchdog** auto-dismisses stray modal dialogs so a
  macro can never deadlock the server.
- The server never edits your VBA. It returns rich errors; Claude fixes them.

## Session-first fast workflow

Every modeling request should begin with `prepare_modeling_context(request)`.
It performs the complete preflight in one round trip:

1. Detect running SOLIDWORKS processes through their exact ROT monikers.
2. Auto-select the only session, or return the process list when a choice is required.
3. Stop with `action=start_solidworks` when no session is running—nothing is launched silently.
4. Return matching skills, professional design guidance, bundled Cosmon references,
   and local SOLIDWORKS CHM results before any code is generated.
5. Bind every subsequent modeling tool to the selected process.

`sw_list_sessions`, `sw_select_session(process_id)`, and `sw_disconnect_session`
provide explicit control. Execution suppresses graphics/tree churn reversibly,
generated macros rebuild once, verification scans the feature tree once, and
repeated Cosmon searches are served from memory.

## Requirements

- Windows + **SolidWorks 2022** (COM ProgID `SldWorks.Application`).
- **Python 3.10+**.
- A **default part/assembly/drawing template** configured in SolidWorks
  (Tools ▸ Options ▸ Default Templates) — macros abort cleanly if none is set.

## Install

```bash
pip install -e .
python -m playwright install chromium   # one-time, for the docs pipeline
```

## Register with Claude Code

Already registered at user scope during setup:

```bash
claude mcp add solidworks -s user -- C:/Python313/python.exe -m sw_mcp.server
```

Or, for a project-scoped, shareable config, drop a `.mcp.json` in the project
root (see [install/register-mcp.md](install/register-mcp.md)). Confirm with
`claude mcp list` (look for `solidworks: ... ✓ Connected`).

## Tools

**Session and preflight** — `prepare_modeling_context`, `sw_status`,
`sw_list_sessions`, `sw_select_session`, `sw_disconnect_session`

**Professional design knowledge (proactive)**
- `get_design_guidance(query)` — **call this BEFORE modeling.** Returns the
  matching professional *archetype recipe* (ordered feature sequence,
  design-intent practices, key dimensions), the relevant universal design
  principles, and — for tolerancing queries — a GD&T reference. Distilled from
  real SolidWorks tutorials (`transcripts.txt`) so the build tools produce a real
  engineered component instead of a bare block or cylinder.
- `list_design_recipes()` — the available archetypes (bearing, engine, bottle,
  manifold, revolved housing, mounting plate).
  See [`DESIGN_PLAYBOOK.md`](src/sw_mcp/resources/knowledge/DESIGN_PLAYBOOK.md).

**Execute & verify**
- `run_macro(path, module, procedure)` — run an existing `.swp`/`.swb`.
- `run_vba(code, procedure, module)` — run an inline VBA string.
- `run_and_verify(code | macro_path, …)` — run → rebuild → scan → one verdict.
  **The auto-fix-loop primitive.**

**Diagnostics** — `rebuild_model`, `get_build_errors`, `get_feature_tree`,
`get_mass_properties`, `get_bounding_box`, `capture_screenshot`

**Documents** — `new_document`, `open_model`, `save_model`, `close_model`,
`export_file` (STEP/IGES/STL/X_T/PDF/PNG by extension)

**Feature generators** — single-feature *primitives* (verified-style VBA, each
built → run → rebuilt → error-scanned). These are building blocks and smoke
tests, **not** finished parts; a professional component is composed from them
(plus inline `run_vba`) following the recipe from `get_design_guidance`:
`create_extrusion`, `create_cylinder`, `create_fillet`, `create_chamfer`,
`create_shell`, `create_draft`, `create_rib` (L-bracket + gusset),
`create_revolve` (tube), `create_sweep` (swept groove), `create_loft` (lofted cut),
`create_hole_wizard` (metric counterbore), `create_thread` (real cut thread),
`create_spring` (helix + sweep), `create_linear_pattern`, `create_mirror`,
`create_circular_pattern`, `create_assembly` (2 components fully mated).
**Surface modeling:** `create_surface_extrude`, `create_surface_planar`,
`create_surface_revolve`, `create_surface_thicken` (surface→solid).
**Sheet metal:** `create_sheet_base_flange` (flat plate), `create_sheet_lbracket`
(bent, real bend). Extend by adding builders to `feature_tools.py` (see below).
Pattern variants not yet given a one-call tool (curve/sketch/table/fill), sheet-metal
edge flange/hem/miter, and any other feature are fully buildable via `run_vba` + the
`solidworks-vba` skill + the auto-fix loop.

**Self-improving knowledge base** — `learn_rule`, `list_rules`. Every fixed error
becomes a persistent rule (`resources/knowledge/rules.json`, human-readable
`LESSONS.md`). On failure, `run_and_verify` returns `suggested_fixes` matched from
past rules, so the same mistake is never solved twice.

**API docs** — `docs_lookup_method(interface, method)`,
`docs_lookup_enum(enum_name)`, `docs_get(url)`. Read the `remarks` field — it
holds the selection-mark/precondition details that separate working from
crashing code.

**Cosmon-compatible resources and skills** —
`engineering_resources_status`, `list_engineering_resources`,
`search_engineering_resources`, `get_engineering_resource`, `list_skills`,
`get_skill`, `create_skill`, `update_skill`, `delete_skill`, `import_skill`.
The server bundles Cosmon's complete SOLIDWORKS documentation payload—including
the large feature/function databases—plus C# templates, persistent-service
source, and all 12 packaged skills. The installed Cosmon resources remain a
fallback source. Set `COSMON_RESOURCES_DIR` for a non-default Cosmon location
and `SW_MCP_SKILLS_DIR` for editable skill overrides.

## The auto-fix loop

1. Claude writes a macro (via the `solidworks-vba` skill) and calls
   `run_and_verify`.
2. The verdict comes back: `{success, ran, run_error, log[], log_errors[],
   errors[], errored_features[], suppressed_features[], feature_count}`.
3. If `success == false`, Claude reads `log_errors`/`errors` (and looks up the
   exact API via `docs_lookup_method`), regenerates the corrected VBA, and calls
   `run_and_verify` again — until `success == true`.

## Designing professional parts (not bare blocks)

The build loop only checks that geometry *rebuilds* — left alone, the simplest
shape that builds clean is a block or a cylinder. To get a real engineered
component, design intent has to come from somewhere. That is the
`get_design_guidance` layer (`design_library.py`, surfaced from the tutorial
transcripts):

1. Call `get_design_guidance("<part description>")` (e.g. `"deep-groove ball
   bearing"`, `"mounting base plate with bolt circle"`, `"hollow exhaust
   manifold"`, `"shaft tolerance / GD&T"`).
2. Follow the returned **feature sequence** and **design-intent** notes — revolve
   about a centerline, fully-define sketches, locate holes on a construction PCD
   and circular-pattern them, break every edge, surface-then-thicken for
   thin-wall parts, combine-then-shell for hollow ones, fix-first then
   fully-constrain for assemblies, apply GD&T to functional features.
3. Emit the VBA (the feature primitives below, or inline `run_vba`) and drive it
   through `run_and_verify` until `success == true`.

The recipes are an *index of archetypes*; the **principles** apply to every part.
The same knowledge is mirrored as reactive rules in `rules.json`, so a related
build error also surfaces the relevant professional practice as a
`suggested_fix`.

## Writing more feature generators

Generators emit VBA in the verified `solidworks-vba` style and run through
`run_and_verify`. Two **non-negotiable rules** for inline `.swb` code (learned
the hard way — see `src/sw_mcp/vba/helpers.vba`):

1. **Never test an API boolean with bitwise `If Not x`.** In an on-the-fly
   `.swb`, API `VARIANT_BOOL` returns arrive as `+1`, and VBA's `Not` is
   bitwise (`Not 1 = -2`, truthy). Always write `If x = False Then`. Object
   checks (`Is Nothing`) are fine.
2. **`Create*Rectangle` returns a Variant array, not an object.** Capture with
   `Dim v As Variant: v = ...` and check `IsArray(v)` — never `Set seg = …`
   (raises run-time error 424).

Add a `build_<feature>()` to `feature_tools.py` (reuse `assemble_part_macro`)
and a thin `@mcp.tool()` wrapper in `server.py`.

## Diagnostic scripts

`scripts/` contains the standalone spikes used to validate each layer
(`spike_connect`, `spike_runmacro`, `spike_build`, `spike_autofix`, …). They are
handy for debugging the COM link without going through the MCP transport.