PicoBerry

io.github.UModeler由 GitHub 账号 UModeler 发布v0.1.7更新于 Oct 29, 2026

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

已验证STDIO仅桌面媒体与设计AI 与机器学习

概览

AI 生成的概览

PicoBerry 让 AI 助手生成、重拓扑、贴图并制作 3D 模型与图片动画,消耗预付费的 PicoBerry 积分。

可以做什么
  • 查询可用引擎、动画预设与积分余额
  • 根据文字提示生成图片,可用参考图引导
  • 由文字、单张图片或 2–4 张有序视图生成 3D 模型
  • 把一张参考图拆解成爆炸式的零件板图片
  • 对已有 3D 资产做重拓扑、PBR 重贴图与自动绑定动画
  • 查询任务状态、等待完成、浏览资产并导出 GLB、FBX 或 OBJ
适用场景
适合希望助手在对话中直接产出可用于游戏的 3D 草稿、贴图或动画,并在导出到 Unity 或 Blender 前反复调整(重拓扑、重贴图、绑定)的场景。生成是异步的,3D 任务可能需要数分钟。
运行要求
通过 npx 以 stdio 在本地运行,需要 Node.js。需要设置环境变量 PICOBERRY_API_KEY(在 PicoBerry 控制台创建的 pb_live_ 密钥),并已完成购买(订阅或一次性积分包)。PICOBERRY_API_BASE 可选,默认指向 PicoBerry API 主机。仅支持桌面客户端。
安装前请注意
每次生成、重拓扑、贴图和动画调用都会消耗预付费积分,建议先用 list_models 查看费用。API 密钥只显示一次,应像密码一样保管。结果链接为短期有效的签名地址,需尽快下载。本地图片文件会被上传到 PicoBerry,生成的资产属于草稿,适合原型与迭代。

安装

在 SourceWeft 中

  1. 打开 控制台中的 PicoBerry,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

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

来源:README.md,提交 71cb944

工具

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.

输入参数category

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.

输入参数enginesearch

get_credits

Get the current PicoBerry credit balance for the authenticated key.

无需输入参数。

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).

输入参数modelprompt必填aspect_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.

输入参数engineprompt必填texturepolycount

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).

输入参数enginetextureimage_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.

输入参数asset_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.

输入参数engineasset_id必填polycount

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.

输入参数enginepromptasset_id必填

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.

输入参数enginepresetasset_id必填

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.

输入参数asset_id必填

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.

输入参数asset_id必填timeout_secondspoll_interval_seconds

list_my_assets

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

输入参数pagelimitkeywordcategory

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).

输入参数nameformatasset_id必填texture_preset

版本历史

2
  1. v0.1.7最新Oct 22, 2026
  2. v0.1.6Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分