Skip to main content
Glama
giasonpooni

Atelier MCP

by giasonpooni
README.md
# Atelier MCP

Observe-first Model Context Protocol server for **small-format atelier mills**. Token-gated rough and finish passes. Works with Claude, Grok, and Codex.

This is not a factory. It is the control plane a sculptor or maker can put in front of a machine they already own — foam, plaster, wood, soapstone, limestone — so an assistant can **see** the job and **cannot** fire the spindle unless a human returns a server-minted token bound to that exact pass.

```
Claude / Grok / Codex
        |  MCP stdio
        v
   atelier-mcp
        |  GuardLattice
        |  plane AND job AND units AND extract AND envelope
        |  AND magnitude AND live AND token_binding AND forbid
        v
   sim cell  (GRBL live path is opt-in, later)
```

There is no `send_gcode`. There is no `request_jog`. A finish pass ends in **hand-off**. The human finishes the work.

## Status (0.1.0)

| Plane | Tools |
|---|---|
| Observe | `capabilities`, `cell_status` |
| Prepare | `bind_job`, `inspect_program`, `mark_handoff` |
| Command | `request_rough`, `request_finish_pass` |
| Recover | `feed_hold`, `emergency_stop` |

Default backend is an in-process simulator. Command is off until `ATELIER_MCP_ALLOW_COMMAND=1`.

## Install

```bash
pip install git+https://github.com/giasonpooni/Atelier-MCP.git
atelier-mcp
```

From a clone:

```bash
pip install -e ".[dev]"
python -m pytest
```

## Clients

Same binary. Configs in [`examples/`](examples/).

Leave command and live off until you have read [SAFETY.md](SAFETY.md).

**Claude Desktop** — `examples/claude_desktop_config.json`

**Grok Build**

```bash
grok mcp add atelier atelier-mcp
```

**Codex** — `examples/codex_config.toml`

## A pass

```
1. bind_job(stock, bit, material=foam, extract_on=false)
2. inspect_program(gcode)          # static, not a proof
3. request_rough(...)              # preview + token
4. human reads the preview
5. request_rough(..., token=...)   # commit
6. request_finish_pass(...)        # same two-step
7. mark_handoff()                  # chisel is yours
```

Swap the target between step 3 and step 5 → `token_payload_mismatch`.
Soapstone without `extract_on=true` → `extract` gate stays open.
Finish stepdown 1.5 mm → `magnitude` stays open.

## Environment

| Variable | Default |
|---|---|
| `ATELIER_MCP_ALLOW_COMMAND` | `0` |
| `ATELIER_MCP_LIVE` | `0` |
| `ATELIER_MCP_ALLOW_RECOVER` | `1` |
| `ATELIER_MCP_MAX_STEPDOWN_MM` | `2.0` |
| `ATELIER_MCP_MAX_FINISH_MM` | `0.4` |

## What this is not

Not Monumental Labs. Not a 7-axis stone cell. Not pour-cell telemetry. Not a digital twin. Not a finished sculpture.

Optional CSE fields (`element_id`, `world_digest`) may be stored on a job; v0.1 does not yet refuse on disposition. See [docs/ROADMAP.md](docs/ROADMAP.md).

## License

Apache-2.0. No warranty. [SAFETY.md](SAFETY.md).