Skip to main content
Glama
sathish136

BricsCAD ETP Layout MCP Server

by sathish136
README.md
# BricsCAD ETP Layout MCP Server

This is the same idea as the AutoCAD MCP demo you watched
(https://www.youtube.com/watch?v=KQpxiXvF4cc / thepiruthvirajan/autocad-mcp-server)
but pointed at **BricsCAD**, and specialized for **ETP (Effluent Treatment
Plant) General Arrangement layouts**, using the retention-time rules
extracted from your 10 reference drawings.

Once running, you just talk to Claude normally:

> "Draw an ETP layout for 2000 m3/day, MBR scheme, at origin 0,0"
> "Calculate tanks for 5750 m3/day dyeing stream + 250 m3/day printing, heavy biological load"
> "Draw a single 41 m3 Alkalinity Feed Tank at 20,15"

...and Claude calls the tools below, which draw **live** into your currently
open BricsCAD drawing via COM automation. No exporting/importing DWG files —
it's directly controlling the running BricsCAD session, same as the video.

## How it works

```
Claude  <--MCP-->  server.py  <--COM/pywin32-->  BricsCAD (must be running)
                       |
                       +-- tank_sizing.py    (flow -> tank volumes/footprints)
                       +-- layout_engine.py  (arranges tanks in rows)
                       +-- bricscad_com.py   (draws rectangles/text via COM)
```

- `design_standards.py` — retention times, tank depth, fixed equipment
  footprints. **Edit this to change engineering rules.**
- `tank_sizing.py` / `layout_engine.py` — pure Python, no BricsCAD needed,
  can be unit tested standalone.
- `bricscad_com.py` — the actual "connector": talks to a running BricsCAD
  instance over COM (pywin32), same automation model AutoCAD's MCP demo uses.
- `server.py` — wraps everything as MCP tools (`calculate_etp_tanks`,
  `draw_etp_layout`, `draw_single_tank`, `check_bricscad_connection`).

## Setup (Windows only — COM automation requires it)

1. **Install BricsCAD** and open it with a drawing (new or existing).
   In BricsCAD, make sure COM/ActiveX automation isn't blocked (default
   install has it enabled).

2. **Install Python deps:**
   ```
   pip install -r requirements.txt
   ```

3. **Find your BricsCAD COM ProgID** (versions differ slightly). Open
   `regedit`, search under `HKEY_CLASSES_ROOT` for a key that looks like
   `BricscadApp.AcadApplication` or `Bricscad.Application.<version>`. If the
   two candidates already in `bricscad_com.py` don't connect, add the exact
   one you find to `PROG_ID_CANDIDATES` at the top of that file.

4. **Test the connection directly** (without Claude), from the same folder:
   ```python
   from bricscad_com import BricscadConnection
   conn = BricscadConnection()
   print(conn.doc.Name)   # should print your open drawing's filename
   ```

5. **Register the MCP server with your MCP client.** For Claude Desktop,
   add to `claude_desktop_config.json`:
   ```json
   {
     "mcpServers": {
       "bricscad-etp": {
         "command": "python",
         "args": ["C:\\path\\to\\bricscad-mcp-server\\server.py"]
       }
     }
   }
   ```
   Restart Claude Desktop. You should see the 4 tools show up under this
   server's connector icon.

6. Open BricsCAD, open/start a drawing, then just ask Claude to draw.

## Tools exposed

| Tool | What it does |
|---|---|
| `calculate_etp_tanks` | Sizing only — no drawing. Good for sanity-checking numbers first. |
| `draw_etp_layout` | Calculates AND draws the full layout live into BricsCAD. |
| `draw_single_tank` | Draws/redraws one rectangle+label — for manual tweaks after auto-layout. |
| `check_bricscad_connection` | Confirms the server can currently reach BricsCAD. |

## Testing sizing logic without BricsCAD or Claude

```bash
python -c "
from tank_sizing import PlantInput, calculate_tanks
tanks = calculate_tanks(PlantInput(total_flow_m3_per_day=2000, scheme='MF'))
for t in tanks:
    print(f'{t.label}: {t.volume_m3} m3 -> {t.width_m}m x {t.length_m}m')
"
```

Compare against your Sky Clothing (2000 m3/day, MF scheme) reference
drawing's tank table before ever touching BricsCAD.

## Current limitations (same as the .NET plugin version)

- Row-based bin-packing layout, not a true optimizer — matches the general
  flow (screener → EQ → Bio → MBR/Clarifier → RO → chemical/sludge →
  evaporator) but not the exact hand-tuned arrangement in your drawings.
- Fixed equipment footprints (screener, blower room, RO skid, etc.) are
  rough defaults — replace with your actual vendor package sizes in
  `design_standards.py`.
- No title block, dimension lines, or north arrow yet — add more COM calls
  (`AddDimAligned`, inserting your title block as a block reference) once
  the tank layout itself is validated.
- Deterministic engineering-rule based sizing, not an LLM-guessed layout —
  numbers are traceable back to the retention-time table for client-facing
  drawings.
# bricscad-mcp