Waggle

벌이 춤으로 공간을 알리듯, 문장으로 공간을 짓는다 · Spacemaker MCP
…
대화
튜토리얼
아직 아무것도 없습니다. 튜토리얼 1번을 누르세요.
벽문창기둥
크레딧 충전
Waggle 매뉴얼

Waggle 이란

꿀벌은 8자춤으로 동료에게 먹이가 있는 방향과 거리를 알립니다. Waggle 은 문장으로 Spacemaker 에 공간을 알립니다. 왼쪽에 말하면 오른쪽에 평면이 그려지고, 모델은 Spacemaker 서버가 들고 있습니다. 설치할 것은 없습니다.

시작하기

  1. 왼쪽 아래 튜토리얼 1번을 누릅니다. 문장이 보내지고 방 넷이 점선으로 그려집니다.
  2. 단계가 끝나면 체크가 붙고 다음 단계가 노랗게 켜집니다. 순서대로 누르면 방 → 벽 → 문 → 창 → 점검까지 갑니다.
  3. 언제든 입력창에 직접 문장을 쳐도 됩니다. 이전 대화를 기억하므로 "그 벽을 50 cm 더" 같은 말도 통합니다.

화면

방향과 크기

도면의 위가 북쪽, 아래가 남쪽입니다. 판은 30 m × 30 m 이고 건물은 가운데에 놓입니다. 크기는 미터로 말하면 됩니다.

이런 문장이 됩니다

12 m × 8 m 집 1층. 남쪽에 거실 6×5 m, 북쪽에 침실 둘과 화장실 하나. 방만 그려 줘.
지금 그린 방들로 벽을 세워 줘. 그리고 방마다 문을 달아 줘. 현관은 거실 남쪽.
거실 남쪽 벽을 1 m 남쪽으로 밀어 줘. 문과 창은 따라와야 해.
두 번째 침실을 서재로 바꿔 줘. 현관문 위에 유리 캐노피. 거실 남쪽 벽에 발코니.
2층을 1층 복사본으로 올리고, 8 m 간격 기둥 그리드를 4×3 으로 깔아 줘.
허공에 뜬 문이 있으면 지우고 다시 점검해 줘.

알아둘 것

개발자 가이드 — Waggle 소스로 MCP 앱 만들기

Waggle 은 Spacemaker MCP 를 쓰는 가장 작은 응용 프로그램입니다. 자기 프로그램에서 같은 일을 하려면 아래 세 호출만 있으면 됩니다. 모델(LLM)은 무엇이든 됩니다. 화면도 무엇이든 됩니다.

sessions/create세션을 연다
서버가 모델을 든다
→
tools/call {sessionId,…}도구 하나 실행
서버가 결과를 세션에 적용
→
sessions/get모델 JSON 을 받는다
벽·방·문·창·…

주소와 인증. 엔드포인트는 https://spacemaker.gongvue.com/api/mcp 하나입니다. Spacemaker 가 발급한 키를 Authorization: Bearer <key> 로 보냅니다. 본문은 JSON-RPC 2.0 이고, 응답은 JSON 또는 SSE(data: 한 줄)로 옵니다.

POST /api/mcp
Authorization: Bearer <key>
Content-Type: application/json

{"jsonrpc":"2.0","id":1,"method":"sessions/create","params":{"projectId":"my-app"}}
→ {"result":{"sessionId":"sess_…","state":{"shapes":[],"interactiveWalls":[],…}}}

{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"create_shape",
  "arguments":{"sessionId":"sess_…","x1":0.3,"x2":0.5,"z1":0.3,"z2":0.5,"name":"거실","spaceType":"living"}}}
→ {"result":{"content":[{"type":"text","text":"{\"op\":\"create\",\"shape\":{\"id\":\"shape_…\",…}}"}]}}

{"jsonrpc":"2.0","id":3,"method":"sessions/get","params":{"sessionId":"sess_…"}}
→ {"result":{"state":{"shapes":[…],"interactiveWalls":[…],"spaces":[…],"interactiveDoors":[…]}}}

도구 호출의 결과는 "플랜" 입니다. tools/call 의 text 안에는 { op: "create" | "edit" | "delete" | "create_opening" | "compose_extrude" | "invoke" | "read" | "error", … } 형태의 JSON 이 있습니다. 세션 모드에서는 서버가 이것을 세션 상태에 적용해 두므로 읽기만 하면 됩니다. op: "error" 면 reason 을 모델에 돌려주면 모델이 고칩니다. op: "read" 는 data 에 조회 결과가 있습니다.

Waggle 소스는 이렇게 읽습니다. 저장소 mcp-package/examples/ 에 있습니다.

파일역할
vibe-session.mjs115줄, 의존성 없음. mcp() 가 위 JSON-RPC 를 보내고, claude() 가 모델을 부르고, 루프가 모델의 tool_use 를 tools/call 로 바꿔 결과를 되돌립니다. 끝에 sessions/get 으로 받은 JSON 을 파일로 씁니다. MCP 앱의 뼈대는 이 파일 하나입니다.
waggle/server.mjs같은 루프를 HTTP 서버로 감쌌습니다. 페이지의 POST /api/waggle/chat 를 받아 도구 호출마다 SSE 로 흘려 줍니다. 세션 하나를 프로세스가 들고 있습니다.
waggle/index.html이 화면. 채팅, 튜토리얼, 캔버스. 캔버스는 sessions/get 의 상태를 그대로 그립니다: interactiveWalls[].p1/p2(정규화 0..1), spaces[].points(평면 단위, (n−0.5)×2000), interactiveDoors/Windows[].x,z,angle,width.

바꿔 쓰기.

MCP 함수 — Waggle 이 쓰는 것

아래는 이 화면이 모델에 주는 함수입니다. 서버의 현재 정의에서 그대로 읽어 옵니다. 전체 카탈로그(약 100개)는 tools/list 로 받거나 저장소의 mcp-package/PUBLIC-API.md 를 보세요. 좌표는 모두 정규화 0..1, 길이는 cm 입니다. 세션 모드에서는 context 를 보내지 않습니다.

불러오는 중…