# 3DLogo.io MCP tools

Endpoints: `https://3dlogo.io/api/mcp` (OAuth) and `https://3dlogo.io/api/mcp/public` (no auth).
All URLs in results are absolute. Errors come back as tool results with `isError` and a
message; a `paywall` field names the plan gate and `upgradeUrl` where to lift it.

## Public

The two `*_logo_image_*` tools and the `mark`/`upload` options on `build_logo_editor_link` are on both endpoints (no account needed).

| Tool | Input | Returns |
| --- | --- | --- |
| `list_materials` | `category?` | `materials[] {id, name, category, categoryLabel, pro}`, `categories` |
| `list_coin_looks` | — | `looks[]`, `blanks[]`, `motions[]`, `environments[]`, `fonts[]` |
| `build_logo_editor_link` | `text` (≤40) **or** `mark` (from the upload tools) **or** `upload: true` (open on the upload panel, look prepared); `material?`, `font?`, `environment?`, `background?` (#hex), `motion?` (none/rotate/tumble/reveal/pulse), `depth?` (1-500) | `url` |
| `build_coin_studio_link` | `text` (≤24), `look?` (gold/chrome/silver/bronze), `font?`, `coinColor?`, `logoColor?`, `blank?` (reeded/milled/smooth), `environment?`, `background?`, `motion?` | `url` |
| `get_plans` | — | `free[]`, `pro[]`, `pricingUrl` |
| `upload_logo_image` | one of `image` (a file attached in chat; ChatGPT fills `{download_url, file_id, mime_type?, file_name?}`), `image_url` (public https link to the image file), `image_data` (base64 data URL, small files only); optional `file_name`, `material?`, `environment?`, `background?`, `motion?`, `depth?` | `markId`, `editorUrl` (styled), `contentType`, `bytes`, `fileName`, `expiresAt` (7 days). PNG/JPEG/GIF/WebP ≤ 8 MB, SVG ≤ 1 MB, no scripts or external refs in SVG |
| `request_logo_image_upload` | `file_name?` | `markId`, `uploadUrl` (one-shot HTTPS PUT of the raw bytes, e.g. `curl -T logo.png "<uploadUrl>"`), `accept`, `maxBytes`, `next` |

Resource `3dlogo://materials`; prompt `design-3d-logo` (`brand`, `vibe?`).

## Signed in

| Tool | Input | Returns |
| --- | --- | --- |
| `get_account` | — | plan, credits remaining and expiry, project count / limit, export entitlements |
| `list_projects` | `query?`, `kind?` (logo/coin/mesh), `page?` | `projects[] {id, title, kind, url, shareUrl, modelUrl, thumbnailUrl, isPublic, updatedAt}` |
| `get_project` | `id` | project view + `accessRole`, `canEdit`, `hasArtwork`, `config` |
| `search` / `fetch` | `query` / `id` | ChatGPT connector contract: `results[] {id, title, url}` / `{id, title, text, url, metadata}` |
| `create_text_logo_project` | `text`, `title?`, `material?`, `font?`, `environment?`, `background?`, `motion?`, `depth?` | project view (open the `url` once to render artwork) |
| `create_image_logo_project` | `mark` (from the upload tools), `title?`, `material?`, `environment?`, `background?`, `motion?`, `depth?` | project view; the image is traced into 3D on first open, then saved |
| `rename_project` | `id`, `title` | project view |
| `set_project_public` | `id`, `public` | project view with `shareUrl` (and `modelUrl` for meshes). Owner only; needs rendered artwork. |
| `create_invite_link` | `id`, `role` (editor/viewer) | `url`, `expiresAt` (7 days, 50 uses) |
| `delete_project` | `id`, `confirm: true` | `{deleted: true}` — permanent |
| `quote_generation` | `mode` (text/image), `density?` | credits and plan requirement |
| `generate_3d_model` | `mode`, `prompt?` or `image_url?`, `density?` (fast/standard/pro/ultra), `texture?` | `runId`, `creditsCharged`, `statusUrl` |
| `get_generation_status` | `run_id` | `status` (queued/processing/completed/failed/cancelled/expired), `queuePosition`, `error`, `refunded` |
| `list_generations` | `limit?` | recent runs |
| `save_generation_as_project` | `run_id`, `title?`, `public?` | project view; when public, `shareUrl` and a downloadable `modelUrl` |

Resource template `3dlogo://projects/{id}`.
