Skip to main content
Glama
README.md
# LazerMCP

Payas STEM lazer kesim MCP sunucusu. Python **Boxes.py’yi çağırır**; kaynağını modele dökmez, SVG’yi elle yazdırmaz.

Bu sunucu bir **takım çantası**dır, ürün kataloğu değil. Gelen AI (ChatGPT / Claude) fotoğrafa bakar, `plan_laser_job` çağırır, `create_design` ile primitive’lerden kesimi **besteler**. Her maket için yeni `create_*` aracı eklenmez.

| | |
| --- | --- |
| Canlı MCP | `https://mcp.metehanavci.com/mcp` |
| Yerel MCP | `http://127.0.0.1:8000/mcp` |
| Landing | `https://mcp.metehanavci.com` · yerel `http://127.0.0.1:8000` |
| Stüdyo | `http://127.0.0.1:8000/dashboard` |
| Repo | [metecodes/LazerMCP](https://github.com/metecodes/LazerMCP) |

Claude / ChatGPT connector adresi **kök `/` değil**, `/mcp` yoludur.

---

## Temel kural

Çalışan kod ≠ doğru ürün.  
Oluşmuş SVG ≠ üretilebilir ürün.  
Güzel önizleme ≠ monte edilebilir ürün.

Yazılım fiziksel testi yapamaz. Dijital PASS + fiziksel NOT VERIFIED → prototip SVG. Üretim export’u yazılım asla açmaz.

Gelen AI `speak` kartını aynen yapıştırır:

```
FINAL STATUS: PROTOTYPE READY

Digital Geometry        PASS
Part Completeness       PASS
Connections             PASS
Assembly                PASS
Collision               PASS
Kinematics              PASS
SVG Geometry            PASS
Manufacturing Geometry  PASS

Physical Kerf Test      NOT VERIFIED
Physical Assembly       NOT VERIFIED
Movement Test           NOT VERIFIED
After Assembly Use      NOT VERIFIED

AUTHORIZED OUTPUT:
Prototype SVG

PRODUCTION EXPORT:
BLOCKED
```

| `final_status` | Anlamı |
| --- | --- |
| `BLOCKED` | Dijital satır FAIL / NOT VERIFIED. `AUTHORIZED OUTPUT: None`. `look_again` oku, primitive’i düzelt, `create_design` tekrar çağır. |
| `PROTOTYPE READY` | Dijital satırlar PASS. Yetkili çıktı **Prototype SVG**. Fiziksel satırlar ölçülmediyse NOT VERIFIED. |
| `PRODUCTION READY` | Dijital PASS + insan kerf/montaj/(hareket)/kullanım. Yetkili çıktı **Production SVG**. |

Yazılım fiziksel satırı uydurmaz. İnsan 100 mm çubuğu ölçüp `measured_bar_mm` verir; kerf PASS olabilir. `physical_assembly=verified`, `movement_test=verified` ve `use_test=verified` yalnız gerçek denemeden sonra. Hepsi (yoksa N/A) PASS ise `PRODUCTION READY` ve `PRODUCTION EXPORT: AUTHORIZED`. LED/şalter çalışmasını yazılım uydurmaz. Uydurma flag = FAIL.

`error` / `errors` dönülmez. Öğretme `look_again` ve `speak` ile yapılır.

---

## İş hattı

```
Fotoğraf / istek
    → plan_laser_job
    → create_design
         Designer → Reviewer → Repair → Reviewer → Final Gate → SVG
```

Bu döngü `create_design` **içinde** çalışır. Gelen AI adımı atlayamaz; review için ayrı araç istemez.

1. Fotoğrafa bak. Parçaları `what_you_see` ile anlat.
2. `plan_laser_job` — dilbilgisi, ölçek, `next_tool`.
3. `create_design` — Boxes.py `rectangularWall` / FingerJoint / kontur. Ölçek: `parameters.reference = {feature, mm, drawn_mm}`.
4. Reviewer parça haritası (P01…), bağlantı grafiği (C01…), PASS / WARNING / FAIL / NOT_VERIFIED üretir.
5. Repair minimum parametrik düzeltir (çatı kilidi, eksik gable, koaksiyel mil, tab-slot kalınlığı). Ürünü sıfırdan yazmaz.
6. Final Gate `speak` kartını üretir. Dijital PASS olsa bile yetkili çıktı yalnızca Prototype SVG’dir; `PRODUCTION EXPORT` BLOCKED kalır.

2D sanat (logo, siluet, yapboz kazıması) için `create_from_reference`. Duvar / çatı / pervane için **değil**.

---

## Primitive’ler

`create_design` `primitives` listesi alır. Kapı / pencere **ayrı parça değildir**; ön duvara slot kesilir.

| `type` | Ne üretir |
| --- | --- |
| `box` | FingerJoint duvarlar + taban. `x,y,h` iç ölçü mm. `walls.front.holes` / `slots`. |
| `panel` | Motor plakası, güneş paneli, çatı, destek. `w,h`, `edges` (`e` / `f` / `F`). |
| `triangle` / `gable` | Çatı alınlığı. Çatı varsa duvar üstüne FingerJoint kilitlenir. |
| `disc` | Pul / mil adaptörü. Pervane için kullanma. |
| `propeller` | n kanatlı rotor. Fotoğraftaki kanat sayısını oku. |
| `contour` | Kapalı siluet. `points: [[x,y], …]` mm. |
| `coupon` | Kerf kalibrasyonu: `f`/`F` deneme + 100 mm çubuk. **Bir kez.** Her makete eklenmez. |

Opsiyonel işaret (parça üzerine gravür / kesim). Ayrı parça değildir. `part.markings` veya `{type:marking, target_part}`:

| Alan | |
| --- | --- |
| `kind` | `text` · `path` / `logo` · `icon` · `line` |
| `target_part` | Parça `label` veya kutu duvarı (`front`, `back`, …) |
| `x`, `y` | o parçanın sol-altından mm |
| `width` veya `height` | mm; ikisi de varsa kutuya sığdır |
| `rotation` | derece |
| `align` | `center` · `left` · `right` · `top` · `bottom` |
| `operation` | `engrave` (siyah) veya `cut` (kırmızı) |

İkonlar: `plus`, `arrow`, `star`, `heart`, `circle`, `x`, `square`, `triangle`. Metin outline path (Arimo). Logo için `d` (SVG path) veya `points`.

Kenarlar: `rectangularWall` sırası alt, sağ, üst, sol. `e` düz, `f` erkek parmak, `F` dişi parmak deliği. Parmak geometrisini uydurma; Boxes.py FingerJoint üretir.

Ölçek: kullanıcı cm/mm verdiyse o ayaktır. Vermediyse fotoğraftan **tek** uzunluk seç, `parameters.reference = {feature, mm, drawn_mm}` geç. İkinci ölçü uydurma.

---

## MCP araçları

Tercih edilen:

| Araç | Görev |
| --- | --- |
| `plan_laser_job` | Fotoğrafa baktıktan sonra dilbilgisi + `next_tool`. |
| `create_design` | Besteci + reviewer + repair + kapı. |
| `create_from_reference` | Yalnız 2D iz / yapboz kazıması. |
| `validate_assembly` | Kapıyı tekrar oku (`file_id` veya `primitives`). |
| `validate_svg` | XML, tabla, nesting, topoloji. |
| `payas_defaults` | 3 mm kavak, kerf 0.15, 1500×3000, malzeme/makine profilleri. |
| `studio` | Profiller, kerf kaydı, projeler, kullanım, anahtar. Kit değildir. |

Plan söylemedikçe: `generate_svg`, `get_generator_schema`.

İsimli kitler **yalnız mevcut Payas ürünleridir:**

- `create_traffic_light`
- `create_robot_bank`
- `create_drawing_robot`
- `create_product_box`
- `create_yacht`
- `create_astronaut`

Yeni değirmen / ev / puzzle için kit isteme.

---

## Payas varsayılanları

- Malzeme: 3 mm kavak kontrplak
- Kerf / burn kilitli: **0.15 mm**
- Tabla: **1500 × 3000 mm**
- Çıktı: SVG + DXF (`file_id`, `svg_url`, `dxf_url`) + otomatik nest önizlemesi
- Malzeme / makine: `parameters.material` (`poplar_3mm`, `poplar_4mm`, `mdf_3mm`, `acrylic_3mm`), `parameters.machine` (`payas_workshop`, `desktop_400`, `lasercad_900`)
- Kerf: insan `measured_bar_mm` verir; kalibrasyon makine+malzeme için saklanır. Kerf uydurma.
- BOM: kit veya bestelenmiş işte malzeme listesini **MCP yazar** (`bom`, `MATERIALS (MCP)`). Donanımı uydurma.
- Proje: `parameters.project` ile sürüm geçmişi. Studio: `/dashboard`
- Kesim `#FF0000`, kazıma `#000000`, LaserCAD **Y-up**
- Kapalı kesimlerde ~1 mm tutucu nick (parça düşmesin)
- Nesting yalnız öteleme (döndürme / ayna yok)
- Yazılar outline path (paketlenmiş Arimo). SVG `<text>` yok.

Paketler (fiyat landing’de yok; beta açık): **Free** 10 tasarım/ay · SVG · standart profil. **Maker** SVG+DXF · özel malzeme/makine · fotoğraf → tasarım · gelişmiş doğrulama. **Pro** BOM · gelişmiş nesting · proje geçmişi · API · ticari kullanım. `LASERMCP_BETA=1` (varsayılan) kotayı kaldırır, özellikleri açık tutar.

---

## Kurulum

Python 3.12+ (geliştirme 3.14 ile de çalışır). Boxes.py `BOXES_PATH` veya `vendor/boxes-master`.

```powershell
cd C:\Project\boxes-mcp
python -m venv .venv
.\.venv\Scripts\pip.exe install -r requirements.txt
.\.venv\Scripts\python.exe server.py
```

Tarayıcı landing: `http://127.0.0.1:8000` · stüdyo: `/dashboard`
Cursor MCP: `http://127.0.0.1:8000/mcp`

---

## Ortam değişkenleri

Hepsi isteğe bağlıdır.

| Değişken | Varsayılan | Açıklama |
| --- | --- | --- |
| `BOXES_PATH` | `C:\Project\boxes-master` veya `vendor/boxes-master` | Boxes.py kökü |
| `MCP_HOST` | `127.0.0.1` | Bind. Dışarı açmak için `0.0.0.0` |
| `MCP_PORT` | `8000` | Port |
| `MCP_PUBLIC_BASE_URL` | (boş) | Dosya URL kökü |
| `MCP_AUTH_TOKEN` | (boş) | Dolarsa `/mcp`, `/api/*`, `/files/*` Bearer ister. UI ve `/health` açık kalır. `studio` ile ek hashed anahtar üretilebilir |
| `MCP_OUTPUT_DIR` | `output` veya Vercel `/tmp` | Kalıcı SVG klasörü |
| `MCP_DATA_DIR` | `output/studio` | Profiller, kerf, projeler, kullanım, telemetry |
| `LASERMCP_BETA` | `1` | `0` olursa Free/Maker/Pro kotaları uygulanır |
| `BLOB_READ_WRITE_TOKEN` | (boş) | Varsa SVG Vercel Blob’a yazılır; `svg_url` kalır |

## Vercel

`server.py` top-level ASGI `app` export eder. Boxes.py `vendor/boxes-master` ile gelir.

Hobby yeter. Push sonrası isteğe bağlı `MCP_PUBLIC_BASE_URL`. **Deployment Protection** kapalı olsun; aksi halde Claude connector 401 alır.

SVG Vercel’de `/tmp` altındadır (geçici). Canlı connector’ın yeni kodu görmesi için deploy gerekir; ChatGPT/Claude oturumunu yeniden bağla.

## Sağlık

`GET /health` Boxes.py importunu ve generator kataloğunu doğrular.

## Ne yapılmaz

- SVG / DXF elle yazmak
- Geometriyi çevirmek, döndürmek, aynamak
- Parmak eklemini uydurmak (Boxes.py FingerJoint kullan)
- Kapı / pencereyi kayan ayrı parça yapmak
- Pervane yerine `disc` kullanmak
- Her işe kupon eklemek
- LAZER KESİME HAZIR veya üretim export’u yetkili demek (insan ölçüsü / montajı olmadan)
- `measured_bar_mm` veya `physical_assembly` uydurmak
- Kerf veya vida/LED/motor listesini uydurmak (MCP `bom` yazar)
- Her yeni maket için yeni MCP aracı istemek