toolbag-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TOOLBAG_MCP_NO_FOCUS | No | Set to 1 to stop the server from bringing Toolbag to the front for the duration of each call (the plugin only runs while Toolbag has focus, so this is normally left unset). |
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| statusA | Toolbag version, graphics adapter, scene path, counts and plugin state (port, Python switch, call counter). Start here: it tells whether the plugin is reachable. |
| capabilitiesA | Everything the running Toolbag exposes in |
| preferences_getB | Toolbag application preferences, all or the given keys (e.g. autoTextureReload, defaultTangentMethod, rayTraceBackend). |
| preferences_setA | Set one Toolbag application preference (see preferences_get for keys). |
| scene_infoC | Scene path, unit scale, bounds, object counts by type, bake projects, selection. |
| scene_newA | New empty scene. Unsaved changes are lost without a prompt. Save a large scene first: Toolbag 5.0.2 has crashed here on big bake scenes. |
| scene_loadA | Load a .tbscene file. Unsaved changes in the current scene are lost without a prompt; save a large scene first (Toolbag 5.0.2 has crashed tearing big bake scenes down). |
| scene_saveA | Save the scene to its current file, or to |
| scene_list_objectsB | Flat list of scene objects (uid, name, type, parent, visibility, transform).
|
| scene_treeB | Object hierarchy as nested nodes, |
| object_getC | Everything about one object: transform, pivot, bounds, mesh/camera/light settings, submeshes with their materials. |
| object_findB | Objects whose name contains |
| selection_getC | The currently selected objects. |
| selection_setC | Select exactly these objects. |
| selection_clearA | Deselect everything. |
| object_set_visibleA | Show or hide groups, lights, cameras or bake nodes. Refuses submeshes always and
meshes unless |
| object_set_transformA | Set position, rotation (degrees), scale or pivot (each three numbers) of a transform object; omitted ones stay. |
| object_renameC | Rename an object. |
| object_duplicateB | Duplicate an object with its children; optional name for the copy. |
| object_deleteC | Delete objects from the scene. |
| object_groupC | Put objects under a new group, optionally named. |
| object_set_parentA | Re-parent an object; without |
| scene_import_modelA | Import a model file (FBX, OBJ, glTF, USD, ...) into the scene with the scene's import settings. Returns the imported root and the new objects. |
| scene_exportA | Export the scene; the format follows the extension: .fbx, .obj, .glb/.gltf,
.usd/.usda/.usdc/.usdz, .dae. |
| scene_boundsB | Bounds of the whole scene as [min_xyz, max_xyz] plus the unit scale. |
| camera_frameA | Frame one object, or the whole scene without |
| mesh_set_backfacesA | Show back faces (cull back faces off) on all meshes or the given ones, as a two-sided shader would render them. Per object; lost on re-import. |
| material_listB | All materials with group, number of assigned objects and the shader per slot. |
| material_getB | One material in full: each slot (albedo, surface, microsurface, reflectivity, transparency, ...) with shader and field values, textures as path and sRGB flag, and the objects it is assigned to. |
| material_createB | Create a material with Toolbag's default shaders. |
| material_duplicateC | Duplicate a material; optional name for the copy. |
| material_deleteB | Delete a material; its objects fall back to the default material. |
| material_assignB | Assign a material to objects, by default including their children. |
| material_set_groupB | Move a material into a material group ('' for none). |
| material_set_subroutineB | Set the shader of a material slot, e.g. ('transparency', 'Cutout'), ('reflectivity', 'Metalness'), ('surface', 'Normals'). Slots: subdivision, displacement, surface, microsurface, albedo, diffusion, transmission, reflectivity, reflection, clearcoat reflection, clearcoat microsurface, clearcoat reflectivity, occlusion, emissive, transparency, texture. Returns the slot's field names. |
| material_set_fieldA | Set a number, boolean, enum or color field of a material slot (field names from material_get). For texture fields use material_set_texture. |
| material_set_textureA | Put an image file into a texture field (e.g. slot 'albedo', field 'Albedo Map';
slot 'surface', field 'Normal Map'). The field is cleared first so a changed file is
re-read. |
| material_set_cutoutB | Alpha-tested transparency from a mask image: transparency slot to Cutout, 'Use Albedo Alpha' off, channel (0 = R) and the mask as Alpha Map, re-read from disk. |
| material_importB | Import a material file (.tbmat, MTL, or named texture files). |
| material_exportB | Export a material to a .tbmat file. |
| baker_listB | All bake projects with their groups and output path. |
| baker_getB | One bake project in full: groups with Low (cage offsets, meshes) and High nodes, settings, maps with options, texture sets, UDIM tiles and the expected output files. |
| baker_createC | Create a new bake project. |
| baker_add_groupC | Add an empty bake group (with Low and High nodes) to a bake project. |
| baker_quick_loadA | Load a model through the Quick Loader: objects named '_low' and '_high' pair into one group per stem. A mismatch leaves a group without High and an empty bake, so check the returned groups. |
| baker_set_settingsB | Set bake project settings: outputPath, outputWidth, outputHeight, outputBits (8, 16, 32), outputSamples, edgePadding ('None', 'Moderate', 'Extreme'), edgePaddingSize, outputSoften, smoothCage, ignoreBackfaces, useHiddenMeshes, ignoreTransforms, fixMirroredTangents, tileMode (0 single, 1 texture sets, 2 UDIM), geometryMode (0 high to low, 1 low to low, 2 UV match). |
| baker_set_mapsB | Switch maps on or off by suffix ('normals', 'ao', 'height', 'curvature', 'position', 'thickness', 'bentnormals', ...) and set map options, e.g. {"normals": {"flipY": true}, "ao": {"rayCount": 1024, "ignoreGroups": false}}. Returns the enabled maps. |
| baker_set_cageC | Cage offsets per bake group (all groups when omitted). |
| baker_set_visibleB | Show or hide bake groups, or their Low and High nodes separately. The safe way to toggle meshes in a bake scene. |
| baker_isolateC | Show only these bake groups and hide all others. |
| baker_bakeB | Bake with the project's current settings and write the enabled maps next to outputPath ('_.'). Synchronous, can take minutes. |
| baker_bake_psdC | Bake all enabled maps into one layered PSD at the output path. |
| baker_bake_toA | Trial bake of selected maps (default ['normals']) into a separate file, e.g.
'C:/tmp/test.png' gives 'C:/tmp/test_normals.png', at the given size and samples. The
project's settings and map switches are restored afterwards; |
| baker_map_pathB | Toolbag's own output path for a map by display name ('Normals', 'Ambient Occlusion', 'Height'), optionally for a texture set name or UDIM tile ('1001'). |
| baker_load_presetC | Load a saved baker preset by name. |
| baker_save_presetB | Save the bake project's configuration as a named preset. |
| baker_set_texture_setB | Enable and size one texture set by index or name (tileMode 1). |
| baker_set_udim_tileB | Enable and size one UDIM tile by index or name such as '1001' (tileMode 2). |
| baker_replace_lowA | Swap the geometry of a group's single low mesh for the mesh in a model file (new UVs, fixed topology) while keeping group, cage and material. Save the scene first if you rely on stored cage directions. |
| baker_skew_previewA | Edge protect: compute skew masks by edge rule and show them as base colour on the low
materials (black = averaged cage, white = corrected). Full correction everywhere except
bands along UV seams and open borders ( |
| baker_skew_clear_previewA | End the skew mask preview: the low materials get their albedo map and colour back. |
| baker_skew_applyA | Edge protect: write skew masks by edge rule (see baker_skew_preview, same parameters)
into the bake groups. The Python API cannot set skew masks, so the scene is saved as a
new file, the masks go into that file and Toolbag loads it. |
| object_attributesB | Every plain attribute of an object with its current value, type-specific: light, camera (lens, limits, postEffect expanded), sky, fog, shadow catcher, backdrop, mesh. These are the names object_set_attributes takes. |
| object_set_attributesA | Set attributes of any object by name: {"brightness": 3, "color": [1, 0.9, 0.8]} for a light, {"lens": {"dofStop": 2.8}} or {"lens.dofStop": 2.8} for a camera, {"density": 0.2} for fog, {"opacity": 0.5} for a shadow catcher. |
| object_createB | Create a scene object by class: LightObject, CameraObject, FogObject, SkyBoxObject, ShadowCatcherObject, BackdropObject, SceneObject (a group), TransformObject, BakerObject; with optional name, transform, parent and attributes set right away. |
| light_listA | All lights (sky child lights included) with type, brightness, colour, shadows, shape and transform. |
| light_createA | Create a light: 'omni', 'spot' or 'directional', with optional transform and attributes such as brightness, color [r, g, b], castShadows, width, lengthX, lengthY, spotAngle, useTemperature, temperature (object_attributes lists what this Toolbag build has; 5.02 has no shape or physical units). |
| sky_getC | The sky: mode, brightness, rotation, background, procedural sun settings and its child lights. |
| sky_setB | Set sky attributes: brightness, rotation (degrees), mode ('color', 'sky', 'blurred sky', 'ambient sky'), backgroundColor, blur, and for a procedural sky time, day, latitude, longitude, turbidity, sunBrightness. |
| sky_loadA | Load a sky: a .tbsky file replaces the whole sky, an image (.hdr, .exr, .png, .jpg) becomes the panorama. |
| sky_saveC | Save the sky as a .tbsky archive. |
| sky_set_background_imageB | Use an image as the sky's background; an empty path clears it. |
| sky_compute_proceduralB | Switch the sky to procedural mode (sun by time, day and location) and recompute it. |
| fog_getB | The scene's fog with its attributes, or exists: false when there is none. |
| fog_setA | Set fog attributes (color, density, opacity, volumeType 'fit'/'vertical', heightMin, heightMax, falloffMin, falloffMax); creates the fog object when the scene has none. |
| camera_listA | All cameras with mode, field of view, focal length and which one is active. |
| camera_getB | One camera in full (the active one by default): transform, mode, fov, focal length, lens (depth of field, distortion, flares, motion blur), limits and postEffect (tone mapping, exposure, contrast, bloom, vignette, grain). |
| camera_createA | Create a camera with optional transform and attributes; activate makes it the viewport and render camera. |
| camera_setA | Set camera attributes (the active camera by default): fov, focalLength, mode, {"lens": {"dofMode": 1, "dofStop": 2.8, "dofFocusDistance": 50}}, {"postEffect": {"toneMappingMode": "aces", "exposure": 1.2, "bloomBrightness": 0.1}}, {"limits": {...}}. |
| camera_set_activeB | Make a camera the active viewport and render camera. |
| camera_post_effect_fileB | Load a camera post effect preset from a file, or save the current one (save=true). |
| render_getB | The render object: options (renderer, ray tracing, shadows, occlusion, wireframe, watermark), image and video output settings (outputPath, format, width, height, samples, transparency), and the cameras and passes enabled for export. |
| render_setB | Change render settings: options ({"renderer": "raytrace", "rayTraceBounces": 4, "shadowQuality": "High"}), images ({"outputPath": "C:/out", "format": "PNG", "width": 1920, "height": 1080, "samples": 256, "transparency": true}), videos (same keys). |
| render_set_camerasC | Choose which cameras render on render_images and render_videos. |
| render_set_passesA | Switch render passes on or off by name (render_get lists them). |
| render_imageB | Render one image with the active camera (or the given one) using the render object's settings; width, height and sampling default to those settings. With path the file is written (format by extension). Can take minutes with ray tracing. |
| render_imagesB | Render all enabled cameras and passes into the image output folder (render_get: images.outputPath). Returns the files written. |
| render_videosC | Render the animation into the video output folder (render_get: videos.outputPath). Can take long. |
| render_export_viewerC | Export a Marmoset Viewer (.mview) archive of the scene. |
| timeline_getB | Animation timeline: time, frame, total frames, frame rate, selection, speed. |
| timeline_setA | Set the timeline: time in seconds or frame, total frames, frame rate (resamples keyframes), selection range, playback speed; play=true/false starts or stops playback. |
| toolbag_quitA | Quit Toolbag. Unsaved changes are lost without a prompt; the plugin answers and Toolbag closes right after. |
| execute_pythonA | Run Python inside Toolbag with |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| scene_resource | The current scene: path, counts, bake projects, selection. |
| materials_resource | All materials with their shaders. |
| baker_resource | The bake projects of the scene; the single one in full, otherwise the list. |
| cameras_resource | All cameras and which one is active. |
| render_resource | Render options, output settings, cameras and passes. |
TDQS
Scored across 93 tools
Tools are organized into clear domain prefixes (scene_, object_, material_, baker_, camera_, sky_, fog_, render_, timeline_), so most selections are obvious. A few genuine overlaps exist: object_create vs light_create/camera_create, object_set_attributes vs camera_set/sky_set, and scene_list_objects vs object_find vs scene_tree; descriptions mostly disambiguate (e.g. object_set_visible explicitly defers to baker_set_visible/baker_isolate for bake scenes), but the create/attribute-set duplication could still cause misselection.
The dominant convention is prefix_noun_verb (material_set_texture, baker_set_maps, camera_set_active), applied consistently across domains. Deviations are limited to a handful of bare or legacy names (status, capabilities, execute_python, toolbag_quit), which are readable but break the pattern.
93 tools is far beyond any comfortable agent working set, even for a full 3D DCC application. The breadth (baking, skew masks, sky, fog, render, timeline) justifies many of them, but a large tail of hyper-specific tools (baker_skew_preview/apply/clear_preview, baker_map_path, camera_post_effect_file, baker_set_udim_tile) bloats the surface when execute_python could absorb rare cases.
Coverage is exceptional: full lifecycle for scenes, objects, materials, bake projects, cameras, sky, fog, lights, rendering, and timeline, plus presets and export paths. The execute_python escape hatch means there are effectively no dead ends for operations the tool set omits (e.g. material renaming).