generate-3d-model · git:20260707.617aab8 · 2026-07-07 · sha256 c0957db52ba54df0

generate-3d-model git:20260707.617aab8A

Immutable. This exact content is served forever at /api/v1/blob/c0957db52ba54df0.

---
name: generate-3d-model
description: Turn a text prompt into a downloadable, textured 3D model (GLB). Use when you or the user want to generate, create, make, or forge a 3D model, asset, object, mesh, or prop from a text description — "make a 3D model of a robot", "generate a GLB of a sword", "I need a 3D chair". Runs on the FREE text→3D lane (no key, no account, free). Returns a GLB URL plus a browser viewer link.
when_to_use: User wants a 3D object/asset/prop from text. For a posable character with a skeleton, use create-3d-avatar. To rig an existing GLB, use rig-a-model.
license: MIT
metadata:
  category: 3d/creative
  cross-platform-safe: true
  pack: three-ws-skills
---

# Generate a 3D model from text

Turn a natural-language prompt into a textured, downloadable **GLB** model on the
**free** three.ws text→3D lane (NVIDIA NIM / Microsoft TRELLIS). No API key and no
account — the platform's server-side keys cover provider cost.

The result is always two things: a durable **`glbUrl`** (download / import into any
3D tool) and a **viewer link** that renders the model in the browser.

## When to use which tool

| Goal | Use |
| --- | --- |
| A single object / prop / creature from text | this skill (free lane) |
| A posable humanoid **character with a skeleton** | `create-3d-avatar` |
| Add a skeleton to a GLB you already have | `rig-a-model` |

## Fastest path — the MCP tool

If the three.ws MCP server is connected, call the free tool directly:

- **Tool:** `forge_free`
- **Input:** `{ "prompt": "<description>", "tier": "draft" }`
  - `prompt` — 3–1000 chars. Lead with the subject, then its key materials and
    colors. The free lane conditions on ~77 characters, so front-load what matters:
    `"a friendly round robot mascot, glossy white plastic, big blue eyes"`.
  - `tier` — `draft` (fast, default), `standard`, or `high`. All free; higher tiers
    only take longer.
- **Returns:** `glbUrl`, `viewerUrl`, `tier`, `backend`, `durationMs`.

This is text-only (the free TRELLIS preview does not accept uploaded photos). For
image / multi-view → 3D, use the art-directed lanes described in
[reference.md](reference.md).

## Portable path — the hosted HTTP endpoint

No MCP client required. The same free lane is a public JSON-RPC endpoint at
`https://three.ws/api/mcp-studio` (no auth, no account):

```bash
curl -s -X POST https://three.ws/api/mcp-studio \
  -H 'content-type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "forge_free",
      "arguments": { "prompt": "a small glossy green ceramic frog figurine", "tier": "draft" }
    }
  }'
```

Response (`structuredContent`) carries the model:

```json
{
  "kind": "model",
  "glbUrl": "https://three.ws/cdn/creations/abc123/mesh.glb",
  "viewerUrl": "https://three.ws/viewer?src=https%3A%2F%2Fthree.ws%2Fcdn%2F...",
  "format": "glb",
  "prompt": "a small glossy green ceramic frog figurine"
}
```

Discover the full free tool set first with `{"jsonrpc":"2.0","id":1,"method":"tools/list"}`.

## What to do with the result

1. Give the user the **viewer link** — they can rotate and inspect the model in the
   browser immediately.
2. Give the **`glbUrl`** for download / import into Blender, Unity, three.js, etc.
3. If they want it animated, feed `glbUrl` into the `rig-a-model` skill.

## Higher-fidelity & art-directed lanes

The full three.ws MCP server also exposes art-directed and image→3D lanes
(`mesh_forge`) and paid lanes with denser geometry. Those, the tier trade-offs, the
raw `POST /api/forge` REST shape, and full error handling are in
[reference.md](reference.md) — load it only when you need more than the free
text→3D path above.

## Errors

The free lane is shared and protected by per-IP rate limits and a global capacity
breaker. Handle these and retry rather than failing:

- `rate_limited` / `busy` — honor `retryAfter` (seconds) and try again.
- `not_configured` — the durable lane is momentarily cold; retry shortly.
- `lane_degraded` — a result was produced but its URL was unreachable; retry.

Never report a dead or empty link as success — only return a `glbUrl` the call
actually produced.