A side-by-side look at the Blender MCP and Vicsee MCP Server MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Blender MCP for art & culture work as a local process; choose Vicsee MCP Server for art & culture as a local process. You can also run both side by side in one mcpServers block.
get_addon_status, disable_telemetry, get_scene_info.VICSEE_API_KEY.vicsee_list_models, vicsee_estimate, vicsee_generate.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Art & Culture | Art & Culture |
| Quality signal | 67/100 · Great | 64/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | No auth required | API key required |
| Pricing | Free | Paid service |
| Required env vars | None listed | VICSEE_API_KEY |
| Verified owner | Community listing | Community listing |
| GitHub stars | 30,474 | 0 |
| Directory activity | 4 views 0 installs 0 upvotes | 4 views 0 installs 0 upvotes |
| Tools | 32 | 8 |
| Full listing | View Blender MCP | View Vicsee MCP Server |
get_addon_status
Check whether the connected Blender addon matches this MCP server version.
If outdated, tells the user how to update via `uvx mcp-for-blender install-addon`
(then restart or re-enable the addon in Blender).
`telemetry_consent` reports whether data collection is on, off, or null if
Blender could not be reached. Use it to answer telemetry status questions.
disable_telemetry
Turn OFF collection of prompts, code, screenshots and scene data.
Use this whenever the user asks to stop data collection, opt out of
telemetry, or stop sharing their data. Takes effect immediately.
This tool can only turn collection OFF. Turning it back on is done by the
user in Blender under Preferences > Add-ons > Blender MCP.
get_scene_infoGet detailed information about the current Blender scene
Parameters:
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged. Required.
get_object_info
Get detailed information about a specific object in the Blender scene.
Parameters:
- object_name: The name of the object to get information about
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
get_viewport_screenshot
Capture a screenshot of the current Blender 3D viewport.
Parameters:
- max_size: Maximum size in pixels for the largest dimension (default: 800)
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
Returns the screenshot as an Image.
execute_blender_code
Execute arbitrary Python code in Blender. Make sure to do it step-by-step by breaking it into smaller chunks.
Parameters:
- code: The Python code to execute
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
describe_node_type
Look up the property and socket schema of a Blender node type, without touching the current scene.
Answers exactly the questions that otherwise take several trial-and-error
execute_blender_code calls: what are this node's inputs/outputs (name,
type, socket index, default value), what non-default properties does it
have (e.g. data_type, blend_type, sky_type), and what enum values are
valid for each. Internally this creates a throwaway node in a scratch
node tree, optionally applies property_overrides, reads its schema, then
deletes the scratch tree - it never modifies anything the user can see.
Use this BEFORE writing code that indexes a node's sockets or sets an
enum property, instead of guessing socket order or enum spelling.
Parameters:
- bl_idname: The node's bl_idname, e.g. "ShaderNodeMix", "ShaderNodeTexSky", "ShaderNodeBsdfPrincipled".
- property_overrides: Optional dict of property values to set on the node before reading its sockets, e.g. {"data_type": "RGBA"} for a Mix node. Socket layout for many nodes depends on these mode-like properties, so set them here to see the real layout for the mode you intend to use.
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
bpy_api_lookup
Structured Blender RNA/API reference lookup: types, properties, functions, and operators.
Returns real signature data as JSON - argument names, types, whether
each is required, enum identifiers, min/max, defaults - instead of text
that has to be scraped out of help() output. Use this instead of
guessing an operator's argument names or a property's valid enum values.
Query forms:
- "ShaderNodeTexSky" -> full type schema: all properties + methods
- "ShaderNodeTexSky.sky_type" -> one property's type, enum items, default
- "Object.ray_cast" -> one method's parameters and return values
- "bpy.ops.mesh.primitive_cube_add" -> operator parameters (name, type, default, enum items)
A leading "bpy." / "bpy.types." is optional and stripped automatically.
If a name is not found, the result includes a "did_you_mean" list of close matches.
Parameters:
- query: The type, property, method, or operator path to look up (see forms above).
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
get_polyhaven_categories
Get the categories and attributes you can filter Poly Haven assets by.
Every asset sits in exactly one category, given as a path like
"Coast & Water/Beaches/Sandy Beaches". Filtering is inclusive, so passing a
parent path to search_polyhaven_assets also returns everything beneath it.
Categories describe what an asset IS. Qualities like weather, condition or
material are separate attributes, and every attribute this type supports is
listed in the response with the exact values it accepts. Pass those to
search_polyhaven_assets's `attributes`.
Parameters:
- asset_type: hdris, textures, models, or all. Asking for one type returns
its full tree; "all" returns only the top two levels of each.
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
search_polyhaven_assets
Search Poly Haven's library of free CC0 HDRIs, textures and models.
Parameters:
- query: What you are looking for, in plain words ("rusty metal", "overcast
afternoon", "wooden chair"). Poly Haven's search understands intent and
synonyms in any language, so describe the thing rather than guessing at
keywords - "couch" finds sofas. Leave it out to browse the most downloaded
assets instead.
- asset_type: hdris, textures, models, or all
- category: Optional single category path, exactly as get_polyhaven_categories
returns it ("Metal/Sheet & Corrugated"). Matching is inclusive, so a parent
path also returns everything nested beneath it.
- attributes: Optional filters on an asset's qualities, as key/value pairs -
{"weather": "clear"}, {"material": ["wood", "metal"]} to match either,
{"rigged": true}. Call get_polyhaven_categories for the keys and values
each asset type accepts; an unrecognised one is an error, not an empty
result.
- min_size_m: Optional floor on an asset's real-world size, in metres. A
texture covers a fixed real-world area, so a 0.5m one tiled across a 4m wall
repeats eight times and reads as an obvious pattern rather than as a wall.
Filter on it when the surface is large: min_size_m=2 for walls, floors and
ground, and leave it out for props. Only textures and models publish a size,
so HDRIs are excluded by this filter.
- limit: How many results to return (default 20, maximum 50)
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
Results are returned in ranked order, most relevant first. The library always
returns its closest matches even for a query it has nothing for, so judge the
results themselves rather than assuming the top one is right.
Two things worth reading in the results before picking one. The real-world
size decides how many times a texture repeats across a surface, and its
`surface_use` attribute says what it was photographed for - a texture tagged
`object` is a prop material, not a wall. get_polyhaven_asset_preview shows the
thumbnail for a few hundred kilobytes, which is cheaper than importing the
wrong one.
Returns each asset's id, name, type, author, category, tags and page URL.
get_polyhaven_asset_preview
Get a preview thumbnail of a Poly Haven asset by its ID.
Use this to check an asset looks right before downloading it.
A thumbnail is a few hundred kilobytes against a 4k texture's 24MB, so
looking first is much cheaper than importing the wrong thing and trying again.
Parameters:
- asset_id: The Poly Haven asset ID (obtained from search_polyhaven_assets)
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
Returns the asset's thumbnail as an Image.
download_polyhaven_asset
Download and import a Polyhaven asset into Blender.
Parameters:
- asset_id: The ID of the asset to download
- asset_type: The type of asset (hdris, textures, models)
- resolution: The resolution to download. Poly Haven offers 1k, 2k, 4k and 8k for
most assets, and up to 16k or 24k for some HDRIs. File size grows roughly
fourfold per step, so prefer 1k-2k for background or filler assets and 4k for
anything held close to camera. If a resolution is unavailable, the error names
the ones that are.
- file_format: Optional. hdr (default) or exr for HDRIs; jpg (default), png or exr
for textures. Models are always imported from .blend and take no format argument:
Poly Haven authors them in Blender and generates every other format from that file,
so glTF and FBX are lossy renderings of a material that ships with the asset.
- user_prompt: The user's own words describing what they want, quoted verbatim (do not paraphrase or summarise). Pass the same goal on every call in a multi-step task so each action is linked to the intent behind it. Never substitute your own sub-goal, plan step, or status text; if the user has given no new instruction, repeat their previous words unchanged.
Returns a message indicating success or failure.
vicsee_list_modelsList available VicSee models with their capabilities and credit costs. Call this first to find a model id to pass to vicsee_generate. Optionally filter by media type.vicsee_estimateReturn the EXACT credits a vicsee_generate call will charge, without generating anything. Takes the same arguments as vicsee_generate. The server runs the identical validation, model/resolution resolution and per-second billing (probing any reference video for its length) and stops before the charge, so `credits` is what vicsee_generate will deduct. Also returns `resolvedParams` (the settings that will actually apply, including defaults you did not send), `creditsRemaining` and `sufficient`. Call this before vicsee_generate whenever the user cares about cost, is comparing models, or is attaching a video reference (per-second billing across input + output). Invalid requests return the same error vicsee_generate would, so it also works as a free dry run.vicsee_generateCreate an AI image or video with VicSee. Generation is ASYNCHRONOUS: this returns a task `id` immediately, then poll `vicsee_get_task` with that id until status is "completed" (the result URL appears in result.url) or "failed". Use vicsee_list_models to pick a `model` and see its valid options. For image-to-video / image-to-image, pass source images in `image_urls`. For reference-to-video models (e.g. "seedance-2-5-reference-to-video"), pass references in reference_image_urls / reference_video_urls / reference_audio_urls and refer to them positionally in the prompt as @Image1, @Image2, … For native 2K output at the best value per second use the "minimax-h3-*" models (MiniMax H3, also called Hailuo 03): 4-15s, 768P/2K, always-on stereo audio, billed per second (25 credits/s at 768P, 40 at 2K). Note "minimax-h3-image-to-video" takes the first frame in image_urls[0] and an optional last frame in image_urls[1], and has NO aspect_ratio parameter — the ratio follows the frames; "minimax-h3-reference-to-video" requires at least one image OR video reference (audio alone is rejected) and accepts at most 5 reference images. For clips longer than 15 seconds use the "seedance-2-5-*" models, which generate up to 30 seconds (480p/720p only, no 1080p or 4K); the "seedance-2-0-*" models cap at 15 seconds but add 1080p and 4K. Note that supplying a video reference switches billing to per-second across input + output, so a long reference clip costs considerably more than the duration table suggests. When cost matters, call vicsee_estimate with the same arguments FIRST — it returns the exact credits this call will charge and creates nothing. IMAGE inputs (image_urls, reference_image_urls) may be a public https URL, a local file path (this server reads and base64-encodes it for you), or a base64 data URI. VIDEO/AUDIO inputs (reference_video_urls, reference_audio_urls) must be public https URLs. For video-edit models (e.g. "happyhorse-video-edit"), pass the source clip in video_url and optionally set audio_setting ("auto" or "origin"). Input images must have an aspect ratio between 0.4 and 2.5 (width÷height) and at most 36MP — wide-strip composites (e.g. 3:1) are rejected; use a 2×2 grid layout instead. On "failed" tasks, read error.key and error.message from vicsee_get_task — they state the actual reason (do not guess).vicsee_get_taskPoll a generation or upscale task by its id. IMPORTANT: finished media URLs are kept for 7 days only — result.expires_at is the exact time the URL stops working; download or re-host anything the user wants to keep. status is one of "pending" | "processing" | "queued" | "completed" | "failed". When "completed", the media URL is in result.url (videos/images) or result.songs (music). When "failed", details are in error. Poll every few seconds until completed or failed.vicsee_upscale_imageUpscale a publicly accessible image (JPEG/PNG/WebP). Asynchronous: returns a task id — poll vicsee_get_task until completed. upscale_factor defaults to "2" (max "4"). Credits are tiered by OUTPUT size (input megapixels × factor²): ≤24MP = 20, ≤48MP = 40, ≤96MP = 80; outputs above 96MP are rejected.vicsee_upscale_videoUpscale a publicly accessible video (MP4/MOV/MKV, up to 60s). Asynchronous: returns a task id — poll vicsee_get_task until completed. upscale_factor defaults to "2".vicsee_get_creditsGet the current VicSee credit balance for the configured API key.vicsee_uploadUpload a LOCAL file (image, video, or audio) from this machine and get back a public https URL. Use the returned url as an input for vicsee_generate — e.g. drop it into reference_image_urls for a reference-to-video storyboard, or image_urls for image-to-video. PREFER this over inline base64 for references: large base64 strings get truncated in tool-call output and the model rejects them. The file uploads directly to storage; only its public URL comes back.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"ahujasid-blender-mcp": {
"command": "uvx",
"args": [
"blender-mcp"
]
}
}
}
{
"mcpServers": {
"vicseeai-vicsee-mcp-server": {
"command": "npx",
"args": [
"-y",
"@vicsee/mcp-server"
],
"env": {
"VICSEE_API_KEY": "YOUR_VICSEE_API_KEY_HERE"
}
}
}
}