PicoBerry

io.github.UModelerPublished by GitHub account UModelerv0.1.7Updated Oct 29, 2026

An AI 3D workspace for games, VR, and beyond. Generate, remesh, texture, and animate 3D assets.

VerifiedSTDIODesktop onlyMedia & DesignAI & ML

Overview

AI-generated overview

PicoBerry generates, remeshes, textures and animates 3D models and images from an AI assistant, using prepaid PicoBerry credits.

What you can do
  • List engines, animation presets and credit balance before spending
  • Generate images from text prompts, optionally guided by reference images
  • Generate 3D models from text, a single image, or 2-4 ordered views
  • Decompose a reference image into an exploded parts board
  • Retopologize, re-texture (PBR) and auto-rig/animate existing 3D assets
  • Check status, wait for completion, browse your assets and export GLB, FBX or OBJ
When to use it
Useful when you want an assistant to produce game-ready 3D drafts, textures or animations without leaving the chat, and to iterate on them (remesh, re-texture, rig) before exporting to Unity or Blender. Generation is asynchronous and 3D jobs can take several minutes.
Requirements
Runs locally over stdio via npx, so Node.js is needed. Requires the PICOBERRY_API_KEY environment variable (a pb_live_ key created in the PicoBerry dashboard) and a completed purchase, either a subscription or a one-off credit pack. PICOBERRY_API_BASE is optional and defaults to the PicoBerry API host. Desktop clients only.
Before you install
Every generation, remesh, texture and animate call spends prepaid credits, so check list_models costs first. The API key is shown once and should be treated like a password. Result URLs are signed and short-lived, so download promptly. Local image files can be uploaded to PicoBerry, and generated assets are drafts meant for prototyping.

Installation

In SourceWeft

  1. Open PicoBerry in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[PicoBerry]

PicoBerry MCP Server

Generate 3D models, images, and animations for game and 3D workflows from any MCP client — Claude Code, Cursor, Claude Desktop, Cline — with no HTTP glue. A thin wrapper over the PicoBerry /v1 API, so you get PicoBerry's multi-engine pipeline directly inside your agent. Several 3D and image engines sit behind one API; call list_models for the live set and each engine's cost. Generated assets are drafts — useful for prototyping and iteration, and can be reviewed or refined for your project.

📖 Full reference: API + MCP docs · PicoBerry API

There's no separate subscription for the MCP or the API. Generation spends the same prepaid PicoBerry credits as the web app, per engine, at rates you can read with list_models before you spend anything. (Using the API does require a completed purchase — see Get an API key.)

Install

No install needed — run it with npx:

jsonc
// Claude Code:  .mcp.json   ·   Claude Desktop:  claude_desktop_config.json{  "mcpServers": {    "picoberry": {      "command": "npx",      "args": ["-y", "@picoberry/mcp-server"],      "env": {        "PICOBERRY_API_KEY": "pb_live_xxxxxxxxxxxxxxxx"      }    }  }}

Cursor uses the same shape in ~/.cursor/mcp.json.

Get an API key

Sign in at https://picoberry.ai, open the API Keys tab in your dashboard, and hit Create key. The key is shown once — copy it immediately and treat it like a password.

API access needs a completed purchase: a subscription or a one-off credit pack. A purchase entitles you permanently — you don't need a current subscription. (An active paid subscription works too, of course.)

Environment variables

VarRequiredDefaultNotes
PICOBERRY_API_KEY✅—pb_live_...
PICOBERRY_API_BASE—https://api.picoberry.aileave unset unless you were given a different host

Tools

ToolWhat it does
list_modelsEngines + credit cost for a category (3d / image / parts-board / remesh / texture / animate). Call before generating — don't hardcode engines.
list_animation_presetsAnimation preset ids, per engine family (tripo / meshy / pb), with optional substring filter. pb is PB Animation's motion list; each item carries body.
get_creditsCurrent credit balance.
generate_imageText → image (+ optional reference image URLs). count (1–4) makes several images in one call → assets[], wait on each id.
generate_3d_from_textText → 3D model (GLB).
generate_3d_from_imageImage → 3D model. Single: image_url or local image_path. Multi-view (2–4 views, higher fidelity): image_urls or image_paths, ordered [front, left, back, right] — tripo*/meshy6/hunyuan-3.x only.
parts_boardDecompose one image into an exploded parts-board image (server-fixed engine). Input asset_id, image_url, or local image_path; feed the result to generate_3d_from_image for a parts-separated mesh.
remeshRetopologize an existing 3D asset → new asset.
textureRe-texture (PBR) an existing 3D asset → new asset.
animateAuto-rig (+ optionally animate) an existing 3D asset → new asset. Tripo/Meshy rig humanoids; PB Animation (pb-rig + body: humanoid / quadruped / other) also rigs four-legged and other characters — quadrupeds are rig-only for now.
get_assetStatus + result URLs for one asset.
wait_for_assetPoll until an asset finishes (or times out), then return it.
list_my_assetsBrowse your generated assets.
download_assetExport a completed 3D asset (glb / fbx / obj) → signed URL.

How generation works

Generation is asynchronous:

  1. generate_3d_from_text({ prompt }) → returns an asset { id }.
  2. wait_for_asset({ asset_id: id }) → polls until taskStatus === 2 (succeeded).
  3. Read the result URL from files.model (GLB) or files.image (PNG).

taskStatus: 0 pending · 1 processing · 2 succeeded · 3 failed. Result URLs are signed and short-lived — download promptly. Errors come back with an actionable message (e.g. an unknown engine returns the list of valid names).

Example (in an agent)

"Make a low-poly treasure chest, retopo it to 3k tris, and give me a Unity FBX."

list_models(category="3d")                         → pick an enginegenerate_3d_from_text(prompt="low-poly treasure chest")  → { id: A }wait_for_asset(asset_id=A)                          → taskStatus 2remesh(asset_id=A, polycount=3000)                  → { id: B }wait_for_asset(asset_id=B)download_asset(asset_id=B, format="fbx", texture_preset="unity")  → signed URL

Use it alongside Blender MCP

Run this next to blender-mcp and the agent can generate with PicoBerry, then import into Blender in one flow:

jsonc
{  "mcpServers": {    "picoberry": { "command": "npx", "args": ["-y", "@picoberry/mcp-server"], "env": { "PICOBERRY_API_KEY": "pb_live_..." } },    "blender":   { "command": "uvx", "args": ["blender-mcp"] }  }}

Develop

bash
npm installnpm run build      # tsc → dist/PICOBERRY_API_KEY=pb_live_... npm start

Release

Run Actions → Publish → Run workflow (or push a v* tag). It publishes to npm and then to the official MCP registry, in that order — the registry validates by fetching the package's npm metadata and matching its mcpName against server.json's name, so npm has to land first. A guard step checks every invariant (name/version agreement, namespace casing, version not already on npm) before anything is published, because npm versions are immutable and a failed half-publish burns the number.

Bump version in both package.json and server.json (version and packages[0].version) — the guard fails the run if they disagree.

One-time setup — no secrets. Both publishes authenticate over the workflow's GitHub OIDC token (id-token: write). There is nothing to store or rotate.

The only step is telling npm to trust this workflow. On npmjs.com go to @picoberry/mcp-server → Settings → Trusted publishing → GitHub Actions and enter:

FieldValue
Organization or userUModeler
Repositorypicoberry-mcp
Workflow filenamepublish.yml
Environment name(leave empty)
Allowed actionsnpm publish

The workflow filename must match exactly — it is part of what npm verifies.

The MCP registry needs no setup at all: mcp-publisher exchanges the Actions OIDC token, and the registry grants io.github.<repository_owner>/* from the token's repository_owner claim. That covers io.github.UModeler/picoberry-mcp and avoids the interactive browser login (which additionally requires org Owner).

Trusted Publishing needs npm >= 11.5.1, so the workflow runs on Node 24 (npm 11.x). Node 22 still bundles npm 10.9 and would fail — the node-version pin is load-bearing. A guard step fails the run early if the runner ever ships an older npm.

The namespace is compared byte-exactly — io.github.UModeler/..., matching the GitHub org's login. A lowercased io.github.umodeler/... is rejected 403.

After publishing, claim the Glama listing — unclaimed servers get limited discoverability, and awesome-mcp-servers gates its PRs on a Glama badge in CI.

License

MIT

Source: README.md at commit 71cb944

Tools

14

list_models

List available generation engines/models and their credit cost for a category. Call this before generating instead of hardcoding engine names. Returns [{ name, label, cost, paidOnly, supportsMultiView, supportsUltraMode, ultraCost, ... }] — use `name` as the engine/model value. NOTE: the two 3D surfaces are SEPARATE catalogs — `3d` is text-to-3D, `image-to-3d` is image-to-3D. An unrecognized category silently falls back to `3d`, so a guessed value returns a plausible list that is missing image-only engines.

Parameterscategory

list_animation_presets

List animation preset ids for the `animate` tool. Presets are engine-specific (Tripo ~97 / Meshy ~675) — pick one from the SAME engine you animate with. Optionally filter with a case-insensitive substring.

Parametersenginesearch

get_credits

Get the current PicoBerry credit balance for the authenticated key.

Takes no parameters.

generate_image

Generate a 2D image from a text prompt (async). Returns an asset { id }; then call wait_for_asset (or poll get_asset) until taskStatus=2 and read files.image (PNG URL). Costs credits — see list_models(category='image'). Omit `model` for the default. Up to 4 reference image URLs can guide the result (best with nano-banana).

Parametersmodelpromptrequiredaspect_ratioreference_image_urls

generate_3d_from_text

Generate a game-ready 3D model (GLB) from a text prompt (async). Returns an asset { id }; call wait_for_asset (or poll get_asset) until taskStatus=2 and read files.model (GLB URL). Costs credits — see list_models(category='3d'). Omit `engine` for the default.

Parametersenginepromptrequiredtexturepolycount

generate_3d_from_image

Generate a 3D model (GLB) from one image, or from 2–4 views of the same subject (multi-view → higher-fidelity geometry), async. Single: `image_url` (any public http/https image, or a prior generation's files.image) OR `image_path` (a local file, uploaded directly — no hosting needed). Multi-view: `image_urls` OR `image_paths`, ordered [front, left, back, right] (2–4 views). Not every engine takes multi-view — check `supportsMultiView` from list_models(category='image-to-3d'); unsupported engines return 400. Local files win over URLs. Then wait_for_asset and read files.model. Costs credits — see list_models(category='image-to-3d') (NOT category='3d', which is the text-to-3D catalog and omits image-only engines).

Parametersenginetextureimage_urlpolycountimage_pathimage_urlsultra_modeimage_paths

parts_board

Decompose one reference image into an exploded "parts board" image (async) — the subject laid out as separated components on one canvas. Input: `asset_id` (an existing IMAGE asset you own), `image_url` (a public http/https image), OR `image_path` (a local file, uploaded directly). Engine/resolution/prompt are server-fixed — no params. Returns an asset { id }; call wait_for_asset (or poll get_asset) until taskStatus=2 and read files.image (the board PNG). Feed that image to generate_3d_from_image for a parts-separated mesh. Costs 80 credits — see list_models(category='parts-board'). Precedence when several are set: image_path > asset_id > image_url.

Parametersasset_idimage_urlimage_path

remesh

Retopologize an existing 3D asset into a NEW asset (async). Costs credits — see list_models(category='remesh') (pb-remesh is cheapest). wait_for_asset → files.model.

Parametersengineasset_idrequiredpolycount

texture

Re-texture an existing 3D asset (PBR) into a NEW asset (async). Describe the desired look in `prompt`. Costs credits — see list_models(category='texture'). wait_for_asset → files.model.

Parametersenginepromptasset_idrequired

animate

Auto-rig an existing 3D character asset and apply an animation, producing a NEW asset (async). Pick `preset` from list_animation_presets for the SAME engine. Costs credits — see list_models(category='animate'). wait_for_asset → files.model.

Parametersenginepresetasset_idrequired

get_asset

Get a generation's status + result. taskStatus: 0=pending 1=processing 2=succeeded 3=failed. When succeeded, files.{model,image,thumbnail,textures} hold signed result URLs (short TTL — download promptly). On failure, read errorDetail.

Parametersasset_idrequired

wait_for_asset

Poll an asset until it finishes (taskStatus 2 or 3) or the timeout elapses, then return the final asset. Use right after generate_* / remesh / texture / animate. 3D generations can take several minutes.

Parametersasset_idrequiredtimeout_secondspoll_interval_seconds

list_my_assets

List your generated assets (newest first, owner-scoped) for browsing/sync. Filter by category (3d/image/…) or keyword.

Parameterspagelimitkeywordcategory

download_asset

Export a completed 3D asset and get a short-lived signed download URL. glb = a single self-contained file. fbx/obj download as a .zip bundle (model + textures; + Unity .meta files when texture_preset='unity') — unzip before importing. For Unity use fbx (there is no built-in glb importer).

Parametersnameformatasset_idrequiredtexture_preset

Version history

2
  1. v0.1.7LatestOct 22, 2026
  2. v0.1.6Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts