Structured, part-aware 3D generation for AI agents.
nova3d-mcp is an MCP server that exposes Nova3D's generation pipeline as a callable tool inside Codex, Cursor, VS Code, Visual Studio, Claude Code, and other MCP-compatible agents.
One tool call. A washing machine comes back with named drum, door, control panel, and hose connectors — separately editable, not fused into a blob.
Every major AI 3D generator today produces mesh blobs — a single fused object that looks plausible in a render and collapses the moment you try to edit, rig, or pipeline it.
Nova3D is different. Instead of diffusion → mesh, it runs:
prompt / image
↓
LLM writes Blender Python construction code
↓
headless Blender executes + validates + repairs
↓
structured GLB — named parts, intact hierarchy, real joints
The result is a 3D asset that survives contact with real workflows: game engines, configurators, robotics simulations, AR scenes. Parts have names. Hierarchy is intact. Joints are real. You can change one component without regenerating everything.
| Client | Status | Install path | Preview path |
|---|---|---|---|
| Codex | Supported | codex mcp add or Codex MCP config |
Browser conversation_url |
| Cursor | Supported | .cursor/mcp.json or ~/.cursor/mcp.json |
Browser conversation_url |
| VS Code | Supported | .vscode/mcp.json, MCP: Add Server, or code --add-mcp |
Browser conversation_url |
| Visual Studio | Supported | .mcp.json or Visual Studio MCP UI |
Browser conversation_url |
| Claude Code | Supported | claude mcp add |
Browser conversation_url |
Nova3D runs from your MCP client, but model inspection happens through the
hosted browser viewer returned as conversation_url. This repository does not
currently ship an embedded IDE-native 3D viewport.
Get an API key at: https://app.nova3d.xyz/api-key
export NOVA3D_TOKEN="n3d_your-api-key-here"API keys never expire unless revoked. The MCP server validates your key on startup and prints a clear error if it's missing or invalid.
codex mcp add nova3d --env NOVA3D_TOKEN=n3d_your-api-key-here -- uvx nova3d-mcpCodex also supports MCP configuration through ~/.codex/config.toml. If you
prefer config files over the CLI, use Codex's MCP config surface and point it
at the same stdio command: uvx nova3d-mcp.
claude mcp add nova3d -e NOVA3D_TOKEN=n3d_your-api-key-here -- uvx nova3d-mcpCreate .cursor/mcp.json in your project, or ~/.cursor/mcp.json for a global
install:
{
"mcpServers": {
"nova3d": {
"command": "uvx",
"args": ["nova3d-mcp"],
"env": {
"NOVA3D_TOKEN": "n3d_your-api-key-here"
}
}
}
}Option A: add the server from the command line:
code --add-mcp "{\"name\":\"nova3d\",\"command\":\"uvx\",\"args\":[\"nova3d-mcp\"],\"env\":{\"NOVA3D_TOKEN\":\"n3d_your-api-key-here\"}}"Option B: create .vscode/mcp.json in your workspace:
{
"servers": {
"nova3d": {
"command": "uvx",
"args": ["nova3d-mcp"],
"env": {
"NOVA3D_TOKEN": "n3d_your-api-key-here"
}
}
}
}You can also use MCP: Add Server from the Command Palette.
Create <SOLUTIONDIR>/.mcp.json or %USERPROFILE%/.mcp.json:
{
"servers": {
"nova3d": {
"command": "uvx",
"args": ["nova3d-mcp"],
"env": {
"NOVA3D_TOKEN": "n3d_your-api-key-here"
}
}
}
}You can also add the server from the Visual Studio MCP UI by providing the
stdio command uvx with args ["nova3d-mcp"] and the NOVA3D_TOKEN
environment variable.
If you prefer to install from source instead of uvx, clone the repository and
install the package locally:
git clone https://github.com/RareSense/nova3d-mcp.git
cd nova3d-mcp
python3.10 -m venv .venv && source .venv/bin/activate
pip install .Then replace uvx nova3d-mcp in the client examples above with the local
nova3d-mcp executable from your environment.
Pass a prompt like this to your AI agent:
Generate a vending machine with separate door, glass panel, coin slot,
button grid, frame, and interior shelving.
The agent calls generate_3d. You get back:
{
"glb_url": "https://nova3d.xyz/assets/abc123.glb",
"conversation_url": "https://app.nova3d.xyz/chat/conv-...",
"parts": ["door", "glass_panel", "coin_slot", "button_grid", "frame", "shelf_1", "shelf_2"],
"joint_count": 1,
"code_artifact": { ... },
"workflow_id": "state-..."
}conversation_url— your editing session in the Nova3D app, with the generated model and edit history already hydrated. All subsequentregenerate_part,add_part, andarticulate_modelcalls on this asset link back to the same session.
conversation_urlis the standard supported way to inspect generated assets — it opens your fully hydrated editing session in the Nova3D app.- Keep secrets out of checked-in workspace config when possible. Prefer per-user configuration files or client-managed environment variables.
- If your editor supports source-controlled MCP config, commit the server entry
and inject
NOVA3D_TOKENper-user.
| Problem | What to check |
|---|---|
NOVA3D_TOKEN is not set |
Add NOVA3D_TOKEN to your MCP server environment and restart the client |
| Auth failure on startup | Confirm the key at https://app.nova3d.xyz/api-key |
uvx not found |
Install uv or use a local nova3d-mcp executable from a virtualenv |
| No 3D preview inside the editor | Open the returned conversation_url in the browser; that is the supported preview path |
Generate a structured 3D asset from text (and optional reference image).
| Parameter | Type | Required | Description |
|---|---|---|---|
prompt |
string | ✓ | Asset description. Be specific about parts. |
model |
string | "gemini" (default) · "claude-sonnet" · "claude-opus" · "claude-opus-latest" · "gpt-5.5" |
|
image_base64 |
string | Reference image as plain base64 | |
image_mime |
string | e.g. "image/jpeg" |
Returns: glb_url, conversation_url, parts, joint_count, code_artifact, model_artifact, workflow_id. Pass code_artifact to any edit tool. Open conversation_url to see the full edit history for this asset in the Nova3D app.
Regenerate one named part without rebuilding the whole asset.
| Parameter | Type | Required | Description |
|---|---|---|---|
code_artifact |
object | ✓ | From prior generate_3d result |
part_type |
string | ✓ | Part name e.g. "door", "handle" |
description |
string | ✓ | What the new part should look like |
model |
string | "gemini" (default) · "claude-sonnet" · "claude-opus" · "claude-opus-latest" · "gpt-5.5" |
Finding part names: Open the conversation_url from your generation and
inspect the model viewer — each mesh is labeled. Use that exact name as
part_type.
Add a new component to an existing asset.
| Parameter | Type | Required | Description |
|---|---|---|---|
code_artifact |
object | ✓ | From prior generation result |
description |
string | ✓ | Description of the new part and where it goes |
model |
string | "gemini" (default) · "claude-sonnet" · "claude-opus" · "claude-opus-latest" · "gpt-5.5" |
Add joints, hinges, or rotational articulation to an existing asset.
| Parameter | Type | Required | Description |
|---|---|---|---|
code_artifact |
object | ✓ | From prior generation result |
articulation_request |
string | ✓ | What should move and how |
model_url |
string | glb_url from prior generation. Provide this or model_artifact. |
|
model_artifact |
object | model_artifact from prior generation. Provide this or model_url. |
|
model |
string | "gemini" (default) · "claude-sonnet" · "claude-opus" · "claude-opus-latest" · "gpt-5.5" |
|
selected_meshes |
list | Specific mesh names to articulate |
Check the status of a running workflow by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
workflow_id |
string | ✓ | From any prior generation tool |
1. generate_3d("robot dog with four legs, head, torso, and tail")
→ glb_url, conversation_url, parts, code_artifact
2. Open conversation_url in browser
→ see named parts, identify what needs changing
3. regenerate_part(code_artifact, part_type="head", description="...")
→ updated glb_url, same conversation_url
4. add_part(code_artifact, description="a wagging tail with three segments")
→ updated glb_url, parts list now includes new tail segments
5. articulate_model(code_artifact, model_url, "make legs rotate at hip joints")
→ glb_url with working joints
All edit tools accept the code_artifact from any prior result and return an updated one. Always pass the most recent code_artifact forward — it carries the session state that links your edits together.
model value |
Provider | Notes |
|---|---|---|
"gemini" (default) |
Google Gemini | Recommended for spatial reasoning |
"claude-sonnet" |
Anthropic | Strong reasoning |
"claude-opus" |
Anthropic | Most capable Anthropic model |
"claude-opus-latest" |
Anthropic | Latest Opus version |
"gpt-5.5" |
OpenAI | Latest GPT model |
| Variable | Required | Description |
|---|---|---|
NOVA3D_TOKEN |
✓ | API key from https://app.nova3d.xyz/api-key (recommended) or session JWT |
NOVA3D_API_URL |
Override API base URL (default: https://nova3d.xyz/api) |
|
NOVA3D_APP_URL |
Override app URL for conversation links (default: https://app.nova3d.xyz) |
blender-mcp (21.9k ★) gives AI agents a remote control for a locally running Blender instance. It requires Blender installed, produces unstructured output, and inherits all the bpy hallucination problems of raw LLM → Blender code generation.
nova3d-mcp is different in kind:
| blender-mcp | nova3d-mcp | |
|---|---|---|
| Blender required | Yes | No |
| Output | Unstructured scene | Named, hierarchical GLB |
| Validation | None | Server-side repair loop |
| Part awareness | No | Yes — named, addressable |
| Joints | Manual scripting | First-class output |
| Hosted backend | No | Yes |
Issues, PRs, and workflow feedback welcome. github.com/RareSense/nova3d-mcp
Community Discord: discord.gg/QEH8mzcwdR
MIT — see LICENSE