Skip to main content
Glama
Nirlepb

3D CAD BasePlate Generator MCP

by Nirlepb
README.md
# 3D CAD BasePlate Generator MCP.

A [NitroStack](https://www.npmjs.com/package/@nitrostack/core) MCP server for
the **bottle-cap-cad** workflow: turn a photo of a broken bottle cap, worn
plug, or cavity into a printable replacement.

Vision/dimension extraction from the source photo happens **client-side**
(in the MCP client, e.g. Claude) — none of these tools re-derive dimensions
from pixels. `generate_visual_mesh` is the one exception, since Meshy infers
geometry directly from the image itself.

## Tools

| Tool | Input | Backend | Network |
|---|---|---|---|
| `generate_precise_cap` | dimensions JSON (outer/inner diameter, height, thread pitch/starts/depth) | CadQuery (Python, local subprocess) | none |
| `fill` | hole/cavity geometry JSON — circle, rectangle, stadium (slot), polygon, or freeform/organic outline, uniform or tapered | CadQuery (Python, local subprocess) | none |
| `repair_mesh` | mesh URL or base64 (STL/OBJ/PLY/GLB/OFF) | PyMeshLab (Python, local subprocess) | none (fetches `url` if given) |
| `generate_visual_mesh` | raw image (base64) | [Meshy](https://www.meshy.ai/) image-to-3D API | HTTPS |

A `fill-geometry-guide` MCP prompt is also registered, walking a caller
through the fields `fill` expects.

**Suggested pipeline:** `generate_visual_mesh` (rough visual reference from
a photo) → `repair_mesh` (make it manifold/watertight) → `generate_precise_cap`
or `fill` for the actual dimensionally-accurate part → `repair_mesh` again if
the CAD output needs cleanup after boolean operations.

## Setup

```bash
npm install
pip install -r requirements.txt --break-system-packages   # or your own venv
cp .env.example .env   # set MESHY_API_KEY
npm run build
npm start
```

For local iteration without a build step: `npm run dev`.

`generate_precise_cap`, `fill`, and `repair_mesh` shell out to a local Python
interpreter (`python-runtime.ts` auto-detects `python3`/`python`/`py`, or
respects a `PYTHON_EXECUTABLE` override in `.env`) — Python 3 with the
packages in `requirements.txt` needs to be installed wherever this server
runs. `generate_visual_mesh` only needs `MESHY_API_KEY`; it makes no Python
calls.

## Structure

```text
3D-CAD-Modeling-using-MCP/
├── src/
│   ├── app.module.ts          # registers the four tool providers + prompt
│   ├── main.ts                 # bootstrap / entrypoint
│   ├── index.ts                # re-exports main.ts
│   ├── modules/bottle-cap-cad/
│   │   └── bottle-cap-cad.prompts.ts   # fill-geometry-guide prompt
│   └── tools/
│       ├── shapes.ts            # shared circle/rectangle/stadium/polygon/freeform zod schema
│       ├── cap.tools.ts         # generate_precise_cap
│       ├── fill.tools.ts        # fill
│       ├── repair.tools.ts      # repair_mesh
│       ├── mesh.tools.ts        # generate_visual_mesh (pure TS, calls Meshy)
│       ├── python-runtime.ts    # local python3/python/py auto-detection
│       └── cad-api-client.ts    # optional HTTP client for a remote CAD API
├── cad/
│   ├── precise_cap.py           # CadQuery threaded-cap builder
│   ├── fill.py                  # CadQuery plug builder
│   └── repair_mesh.py           # PyMeshLab repair pipeline
├── package.json
├── tsconfig.json
└── requirements.txt
```

## Notes on the current code

- **Thread generation**: `precise_cap.py` builds a solid, closed-top cap
  with a blind bore (not a through-hole) and sweeps one or more real helical
  thread ridges onto the skirt's inner wall along a `cq.Wire.makeHelix()`
  path. `threadStarts` (1–4), `threadDepth`, and `topThickness` are optional
  fields on `generate_precise_cap`; `threadPitch` falls back to an
  approximate PCO 1810-style pitch (3.18mm, single start) when omitted. This
  is a parametric approximation tuned for FDM printing, not a certified
  thread-spec generator.
- **`fill` shapes**: `shapes.ts` supports five top/bottom shape types —
  `circle`, `rectangle` (with optional corner radius), `stadium` (true
  rounded slot with semicircular ends), `polygon` (straight-edged, arbitrary
  point count), and `freeform` (a smooth closed spline through 6–300 traced
  boundary points, for organic/irregular openings). `capStyle: "flush"` is
  only implemented for circle/rectangle/stadium/freeform tops — a polygon
  top with `flush` is downgraded to `none` by `fill.tools.ts`, with a
  warning returned to the caller rather than failing silently.
- **Low-confidence inputs**: both `generate_precise_cap` and `fill` accept a
  `confidence` field (`high`/`medium`/`low`, from the caller's own
  vision-based dimension extraction). A `low` value still generates output,
  but the response includes a warning recommending the dimensions be
  confirmed before printing.
- **Remote CAD API**: `cad-api-client.ts` supports routing
  `generate_precise_cap` / `fill` / `repair_mesh` over HTTP to a
  `CAD_API_URL` instead of spawning Python locally, for hosting environments
  without a Python runtime. **This repo does not currently include the
  server-side counterpart** (no `api/` directory) — `CAD_API_URL` /
  `CAD_API_KEY` are recognized but there's nothing to point them at yet.
  Leave both unset for local development; the tools fall back to the
  local-subprocess path automatically.
- **Meshy polling**: `mesh.tools.ts` polls Meshy's `image-to-3d` endpoint
  every 3s for up to 60 attempts rather than using a webhook callback.
  Meshy's free tier output is CC BY 4.0 licensed — check
  [meshy.ai/pricing](https://www.meshy.ai/pricing) for current terms before
  relying on it beyond a demo.
- **`app.module.ts`** registers a harmless placeholder for NitroStack's
  `OAUTH_CONFIG` DI token purely to silence a noisy (but non-fatal) startup
  log from `OAuthModule` — this server has no HTTP/OAuth surface and the
  placeholder has no effect on transport selection.

---

## Team

- Reshvanth Yeddla
- Nirlep Boddapally
- Tarun
- Vijay Reddy

TDQS

A4.1/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a distinct purpose: generating threaded caps, filling cavities, creating visual meshes from images (non-precise), and repairing meshes. No overlap in functionality.

Naming Consistency4/5

Tool names follow snake_case with a verb_noun pattern, except 'fill' which is a single verb but still clear. Overall consistent.

Tool Count5/5

4 tools is a well-scoped set for the domain of generating caps, plugs, visual meshes, and mesh repair. Not excessive or sparse.

Completeness2/5

Despite the server name 'BasePlate Generator', there is no tool to generate a baseplate itself. Tools focus on caps, plugs, and mesh operations, leaving a significant gap for the intended purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues