Substance Painter MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SP_MCP_SOCKET | No | Bridge socket. Set it for both Painter and the server. | ~/.painter_bridge.sock |
| SP_MCP_TIMEOUT | No | Seconds to wait for Painter. | 30 |
| SP_MCP_MESH_ROOTS | No | Folders project meshes may come from. Separate several folders with ':'. | |
| SP_MCP_EXPORT_ROOTS | No | Folders exports may write to. Separate several folders with ':'. | |
| SP_MCP_PROJECT_ROOTS | No | Folders .spp files may be saved in. Separate several folders with ':'. | |
| SP_MCP_RESOURCE_ROOTS | No | Folders imported resources may come from. Separate several folders with ':'. | |
| SP_MCP_BAKE_MESH_ROOTS | No | Folders high-poly and cage meshes may come from. Separate several folders with ':'. | |
| SP_MCP_ALLOW_EXECUTE_PYTHON | No | Set to 1 to enable execute_python. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| painter_statusA | Check the connection and report Painter, Python API, and project status. |
| capture_viewportC | Look at Painter. view="3d" is the model; view="window" includes the whole UI. |
| capture_turntableB | See every side: orbit the camera, capture each yaw angle, then restore the view. zoom above 1 moves closer. A negative elevation looks up from below. focus is the [x, y, z] point to orbit, for close-ups of one part; it defaults to the model's center. |
| capture_channelC | See one flattened channel as a flat texture, for example Roughness or Normal. |
| close_projectA | Close the open project; refuses unsaved work unless discard_unsaved=true. |
| export_meshB | Export the project mesh, with any Auto UV result, inside SP_MCP_EXPORT_ROOTS. |
| get_project_infoA | Return the current project path and texture-set names. |
| plan_project_creationC | Validate a new project, typed import settings, context switch, and backup. |
| create_projectC | Back up an optional current project, create a typed project, and verify its file. |
| get_project_creation_jobB | Read terminal state and file verification for an asynchronous project creation. |
| save_projectB | Overwrite and verify the current saved project after explicit confirmation. |
| open_projectB | Open an approved .spp, requiring a backup when the current project is dirty. |
| get_capabilitiesA | Report runtime-supported channels, blend modes, and version-sensitive features. |
| audit_projectB | Audit texture sets, channels, layer hygiene, and outdated resources. |
| inspect_bakingB | Inspect enabled bakers, UV tiles, and mesh-map assignments without starting a bake. |
| inspect_baking_parametersC | Inspect editable common parameters and one baker's typed property metadata. |
| configure_bakingC | Transactionally configure Texture Set, UV tile, common, and per-baker settings. |
| set_baking_mesh_inputsC | Assign sandboxed high-poly/cage meshes and related common baker settings. |
| set_baking_resource_inputC | Set or clear a Resource-typed common/per-baker input transactionally. |
| capture_baking_presetC | Capture a portable JSON baking preset without filesystem-backed properties. |
| apply_baking_presetA | Apply a captured baking preset transactionally after explicit confirmation. |
| preflight_bakeC | Validate selected Texture Sets, mesh inputs, UV tiles, and expected mesh maps. |
| start_batch_bakeC | Preflight and start a cancellable multi-Texture-Set bake with result manifests. |
| start_bakeB | Start an asynchronous mesh-map bake after explicit confirmation. |
| get_bake_jobB | Return progress and terminal status for the latest or selected bake job. |
| cancel_bakeB | Request cooperative cancellation of a running bake job. |
| plan_mesh_reloadB | Validate a mesh reload and preview texture-set and backup impact. |
| start_mesh_reloadC | Back up and asynchronously reload a mesh after explicit confirmation. |
| get_mesh_reload_jobB | Return status and texture-set changes for the latest mesh reload job. |
| list_layersB | List layers with stable UIDs, types, visibility, and optional group children. |
| find_layersC | Search layers by partial name, exact node type, and visibility. |
| snapshot_layer_treeC | Capture a detailed layer/effect snapshot with a deterministic SHA-256 digest. |
| diff_layer_snapshotsB | Compare two layer snapshots by UID and report added, removed, and changed nodes. |
| get_geometry_maskB | Inspect a layer's Mesh/UVTile geometry mask and available elements. |
| set_geometry_maskC | Set a geometry mask using mesh names or standard UDIM numbers. |
| create_fill_layerC | Create a Fill Layer, optionally with sRGB base color [r,g,b]. position is top, or above, below or inside reference_uid. |
| create_groupC | Create a layer group at the top, or above, below or inside reference_uid. |
| create_paint_layerC | Create a Paint Layer at the top, or above, below or inside reference_uid. |
| plan_layer_recipeB | Validate a recipe, resolve channels, and preview backup/mutation scope without editing. |
| create_layer_recipeB | Create a nested recipe atomically, optionally saving an approved .spp backup first. |
| insert_smart_materialC | Insert a Smart Material at the top, inside parent_uid, or relative to reference_uid. |
| apply_smart_maskC | Apply a Smart Mask resource to a layer using transactional mask insertion. |
| set_fill_base_colorB | Set a Fill Layer's base color using its UID and sRGB [r,g,b] values. |
| get_fill_projectionB | Inspect a Fill layer's projection mode and common UV transformation. |
| get_fill_sourcesC | Inspect a Fill layer's material or per-channel color/resource sources. |
| get_procedural_inputsC | Inspect image inputs on Fill, Fill Effect, Generator, or Filter sources. |
| set_procedural_inputC | Connect a resource to a procedural image input or reset it to its default. |
| get_fill_parametersB | Inspect parameters and presets of a Fill, Fill Effect, Generator or Filter. Use it to tune generators such as edge wear. Effect UIDs come from snapshot_layer_tree. |
| set_fill_parametersB | Update parameters of a Fill, Fill Effect, Generator or Filter; rolls back on failure. |
| apply_fill_presetC | Apply a named preset of a Fill, Fill Effect, Generator or Filter source. |
| list_anchor_pointsC | List Anchor Point effects with owner and Texture Set context. |
| set_fill_anchor_sourceC | Connect an Anchor Point to one Fill channel or the complete material source. |
| set_fill_resourceB | Assign a Painter resource to one Fill channel, a whole material or a mask Fill. A Fill inside a mask has no channels, so leave channel out for one. |
| set_fill_projectionC | Set Fill, UV, or Triplanar projection with transactional transform updates. |
| set_fill_projection_advancedC | Configure UV, triplanar, planar, spherical, or cylindrical projection details. |
| set_fill_channelsC | Set and enable multiple uniform Fill channels, such as Roughness or Metallic. |
| set_active_channelsC | Replace a Fill or Paint layer's active channel set by UID. |
| set_layer_maskC | Add/update or remove a layer mask; backgrounds are reported by get_capabilities. |
| insert_mask_effectC | Insert Fill, Paint, Generator, Filter, Levels, Anchor, or Smart Mask into a mask. |
| insert_content_effectC | Insert Fill, Paint, Generator, Filter, Levels or Anchor into a layer's content. |
| set_levelsC | Tune a Levels effect, for example to push a mask's contrast. channel picks what a content Levels affects, such as BaseColor or Roughness. |
| rename_layerC | Rename a layer or group by UID. |
| set_layer_propertiesC | Set visibility, opacity, or blend mode; channel defaults to BaseColor. |
| select_layersC | Select one or more layers in Painter by UID. |
| list_export_presetsA | List built-in and shelf export presets without exporting files. |
| inspect_export_presetB | Resolve an export preset and preview its map names without writing files. |
| list_export_profilesA | List curated engine export profiles and whether their Painter presets are available. |
| plan_texture_exportB | Validate an export and list exact output files without writing them. |
| export_texturesB | Export textures inside SP_MCP_EXPORT_ROOTS and verify every output file. |
| plan_profile_exportB | Preview an engine-profile texture export without writing files. |
| export_with_profileC | Run a curated export profile inside SP_MCP_EXPORT_ROOTS and verify outputs. |
| import_project_resourceC | Import and verify a sandboxed resource inside the open Painter project. |
| list_shelvesA | List Painter shelves with paths, write capability, and crawling state. |
| import_shelf_resourceC | Import and verify a safe resource in an editable shelf or the user shelf. |
| start_shelf_refreshC | Start event-observed discovery for one Painter shelf after confirmation. |
| get_shelf_refresh_jobB | Read persistent state for the latest or selected shelf refresh job. |
| import_session_resourceC | Import and verify a sandboxed resource for the current Painter session. |
| list_project_resourcesA | List resources referenced by the open project. |
| search_resourcesB | Search Painter resources and return identifiers, type, category, and usages. query uses Painter's shelf syntax: words such as "rust", or filters such as "u:generator", "u:smartmaterial rust", "u:basematerial" or "p:starter_assets". Underscores in a resource name don't match; search one word of it. |
| find_outdated_resourcesA | Plan project-resource replacements without modifying the project. |
| replace_outdated_resourcesA | Atomically replace all outdated resources after explicit confirm=true. |
| save_project_copyB | Save a verified .spp copy inside SP_MCP_PROJECT_ROOTS without relocating the project. |
| export_smart_materialC | Export a group as a verified Smart Material inside SP_MCP_EXPORT_ROOTS. |
| export_smart_maskC | Export a layer mask as a verified Smart Mask inside SP_MCP_EXPORT_ROOTS. |
| delete_layerB | Delete a layer or group by UID. This modifies the open project. |
| execute_pythonA | Execute raw Painter Python only when SP_MCP_ALLOW_EXECUTE_PYTHON=1. Variables survive between calls. Assign to |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 86 tools
The domain is genuinely large, and most tools state a distinct target (e.g., set_fill_base_color vs set_fill_channels vs set_fill_parameters). However, several clusters overlap heavily — three capture_* tools, set_fill_projection vs set_fill_projection_advanced, insert_content_effect vs insert_mask_effect vs insert_smart_material, and apply_smart_mask vs set_layer_mask — forcing an agent to read long descriptions to choose correctly.
Nearly everything follows a snake_case verb_noun pattern (list_*, get_*, set_*, create_*, plan_*, start_*_job, get_*_job), which is predictable and readable. Minor deviations like painter_status (noun-first) and the mix of plan/start/get_job job-lifecycle verbs are the only friction.
86 tools is far beyond what an agent can reliably navigate in one surface; the plan/start/get_job triples alone multiply the tool count considerably. This is an extreme mismatch for a single server, even given the breadth of Substance Painter.
Coverage is unusually thorough: project lifecycle, layers, masks, fills/generators, baking, mesh reload, export/import, resources, and job polling are all represented with verification and rollback. Gaps like undo/redo, texture-set creation, and resource deletion are minor workarounds rather than dead ends.