MCP Server
Use Asset Tap from Claude Desktop, Cursor, and other MCP hosts. asset-tap mcp serves the Model Context Protocol over stdio.
asset-tap mcp serves the Model Context Protocol over stdio. It is a thin wrapper: every tool maps 1:1 onto something the CLI already does and returns the same shapes as the --json wire format, so the two can't drift.
When to use which:
- Hosts with no shell at all (Claude Desktop and other chat apps) -- the MCP server is the only way in.
- Agents that have a shell (Cursor's agent, IDE agents, Claude Code) -- both work. The MCP gives you discovered, typed tools with structured results, live progress, and clean cancellation, with no
PATHor output-parsing concerns; the CLI is the more direct interface if your agent already lives in a terminal. - Long-running generation benefits from MCP either way: progress streams as notifications and cancelling the request cancels the pipeline.
Setup
The binary must be on PATH -- see Installation. For GUI-launched hosts (Claude Desktop), use the absolute path instead: apps launched outside a terminal don't inherit your shell's PATH, so a bare asset-tap command can silently fail to spawn (e.g. use "command": "/Users/you/.local/bin/asset-tap"). Provider keys are the CLI's: asset-tap auth set fal.ai or an env var such as FAL_KEY -- the MCP server reads the same settings. Saved keys are loaded when the server starts; if you add one with auth set while a server is running, restart it (hosts do this on config change).
Claude Code
claude mcp add asset-tap -- asset-tap mcp
Claude Desktop (claude_desktop_config.json) / Cursor (.cursor/mcp.json)
{
"mcpServers": {
"asset-tap": { "command": "asset-tap", "args": ["mcp"] }
}
}
Env vars can be passed the usual way ("env": {"FAL_KEY": "..."}) if the host doesn't inherit your shell's. After editing a host's config, fully quit and reopen it -- a config reload without a real restart is the most common "server doesn't appear" cause.
Tools
list_catalog -- no arguments. Backed by asset-tap --list --json.
Returns providers, models with their parameter schemas, and templates.
auth_status -- no arguments. Backed by asset-tap auth list --json.
Returns, per provider: configured, source (stored | env | missing),
and the env_var name -- never key material.
inspect_bundle -- takes bundle_dir. Reads the bundle's bundle.json.
Returns {bundle_dir, files[], bundle}.
generate -- takes a prompt or an image path; optional template,
provider, image_model, model_3d, params{}, fbx (default false),
image_only, output_dir, name. Runs the generation pipeline and returns
{status: "success", bundle_dir, duration_ms, bundle}.
Every tool returns structured content (JSON) plus the same JSON as text, so hosts that read either work. list_catalog and auth_status make no API calls -- they're free to use as preflight checks.
generate semantics
- Implemented by building an argv from the arguments and running it through the same clap parser and the same run path as the CLI. Validation, model resolution,
--paramrouting, and error classification are literally the CLI's. - Non-interactive: a
promptorimageis required (usage error otherwise); no approval steps. - Long-running (tens of seconds to minutes). If the host sends a progress token, progress arrives as
notifications/progress-- the same stages the CLI streams as NDJSON, in order, all delivered before the tool result. Cancelling the request cancels the pipeline; the result then haskind: "canceled". - Errors are tool errors (
isError: true) carrying the wire error shape:kind,message, optionalprovider/action/retryable/retry_after_secs. Retry only whenretryableis true; onunauthorized, ask the human for a key instead of looping. fbxdefaults to false: FBX conversion needs Blender; GLB is enough for three.js, Godot, Bevy, and most engines. Passfbx: trueto get FBX.- Prefer a fresh
output_dirper project; runs never overwrite (timestamped bundle directories).namesetsbundle.json'sname, not the directory.
Not this
- Not a hosted/remote service -- stdio only, runs on your machine with your keys.
- Not a place capability appears first: anything the MCP can do, the CLI can do, by construction.
The tools return the same shapes as the CLI's --json output; the full wire-format specification is CLI_MACHINE_INTERFACE.md in the repository.