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
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues