Tool tree
gradeNot graded
list_nodesAnswer
Lists the scene node outline as a lightweight hierarchy. Returns IDs, names, kinds, child nodes, and attached entities, but not full node data.
View tool JSON
{
"name": "list_nodes",
"kind": "answer",
"impl": "imperative",
"description": "Lists the scene node outline as a lightweight hierarchy. Returns IDs, names, kinds, child nodes, and attached entities, but not full node data.",
"inputSchema": {
"type": "object",
"properties": {}
}
}get_scene_settingsAnswer
Gets current scene settings. This is the canonical source for player scale, jump height, movement, camera mode, physics, fog, and ambient lighting.
View tool JSON
{
"name": "get_scene_settings",
"kind": "answer",
"impl": "imperative",
"description": "Gets current scene settings. This is the canonical source for player scale, jump height, movement, camera mode, physics, fog, and ambient lighting.",
"inputSchema": {
"type": "object",
"properties": {}
}
}get_node_detailsAnswer
Gets full details of a specific node, including transform, worldTransform, hierarchy links, hooks, metadata, and node data.
View tool JSON
{
"name": "get_node_details",
"kind": "answer",
"impl": "imperative",
"description": "Gets full details of a specific node, including transform, worldTransform, hierarchy links, hooks, metadata, and node data.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Node ID to inspect"
}
},
"required": [
"nodeId"
]
}
}get_terrain_stateAnswer
Returns a mesh terrain node's current authoring state: world size and section size in meters, seed, base profile, LOD count, the four material channels, and a summary of every modifier in the stack in evaluation order. Read this before a follow-up edit so new strokes land relative to what is already there instead of guessing. The full point list of each stroke is not returned, only its bounds, so this stays cheap on a heavily sculpted terrain.
View tool JSON
{
"name": "get_terrain_state",
"kind": "answer",
"impl": "imperative",
"description": "Returns a mesh terrain node's current authoring state: world size and section size in meters, seed, base profile, LOD count, the four material channels, and a summary of every modifier in the stack in evaluation order. Read this before a follow-up edit so new strokes land relative to what is already there instead of guessing. The full point list of each stroke is not returned, only its bounds, so this stays cheap on a heavily sculpted terrain.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."
},
"maxModifiers": {
"type": "number",
"description": "Maximum modifier summaries to return, most recent last. Default 60."
}
}
}
}get_forest_stateAnswer
Lists every forest field with its shape, stand settings, and — where it has been grown — the stem count, boulder count, and which tree prototypes it uses. Read this before a follow-up edit so a change lands relative to what is already standing.
View tool JSON
{
"name": "get_forest_state",
"kind": "answer",
"impl": "imperative",
"description": "Lists every forest field with its shape, stand settings, and — where it has been grown — the stem count, boulder count, and which tree prototypes it uses. Read this before a follow-up edit so a change lands relative to what is already standing.",
"inputSchema": {
"type": "object",
"properties": {}
}
}list_vfx_abilitiesAnswer
Lists the combat abilities available to cast, with the key each is bound to in the editor and how each is aimed (a line cast travels along the aimed line; a far cast lands its footprint at the far end; gate, ring and scribe casts build a structure). Read this before casting so the ability matches what the user described.
View tool JSON
{
"name": "list_vfx_abilities",
"kind": "answer",
"impl": "imperative",
"description": "Lists the combat abilities available to cast, with the key each is bound to in the editor and how each is aimed (a line cast travels along the aimed line; a far cast lands its footprint at the far end; gate, ring and scribe casts build a structure). Read this before casting so the ability matches what the user described.",
"inputSchema": {
"type": "object",
"properties": {}
}
}capture_viewport_screenshotAction
Capture a screenshot of the active editor viewport so you can inspect what has actually been built. Use this after meaningful scene changes when visual confirmation would help.
View tool JSON
{
"name": "capture_viewport_screenshot",
"kind": "act",
"impl": "imperative",
"description": "Capture a screenshot of the active editor viewport so you can inspect what has actually been built. Use this after meaningful scene changes when visual confirmation would help.",
"inputSchema": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Optional short note about what you want to inspect in the screenshot"
}
}
}
}create_mesh_terrainAction
Creates a mesh terrain node: a sculptable surface mesh, not a heightfield grid. Because strokes displace along the picked surface normal and holes are cut by exact CSG, mesh terrain can carry overhangs, undercut cliffs, arches, caves, and tunnels that heightmap terrain cannot represent. Terrain is authored in world meters at kilometre scale, so a default terrain is a 4 km square. Returns the node ID that every other terrain_* tool takes as nodeId.
View tool JSON
{
"name": "create_mesh_terrain",
"kind": "act",
"impl": "imperative",
"description": "Creates a mesh terrain node: a sculptable surface mesh, not a heightfield grid. Because strokes displace along the picked surface normal and holes are cut by exact CSG, mesh terrain can carry overhangs, undercut cliffs, arches, caves, and tunnels that heightmap terrain cannot represent. Terrain is authored in world meters at kilometre scale, so a default terrain is a 4 km square. Returns the node ID that every other terrain_* tool takes as nodeId.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Display name for the terrain node"
},
"x": {
"type": "number",
"description": "World X of the terrain center in meters (default 0)"
},
"y": {
"type": "number",
"description": "World Y of the terrain base plane in meters (default 0 = ground level)"
},
"z": {
"type": "number",
"description": "World Z of the terrain center in meters (default 0)"
},
"worldSizeMeters": {
"type": "number",
"description": "Edge length of the square terrain in meters. Default 4096, i.e. a 4 km world. Clamped to 256-16384."
},
"sectionSizeMeters": {
"type": "number",
"description": "Edge length of one streamed terrain section in meters. Default 128. Smaller sections rebuild faster after an edit but cost more draw calls. Clamped…"
},
"seed": {
"type": "number",
"description": "Deterministic base-field seed. The same seed and profile always produce the same starting surface, before any stroke."
},
"profile": {
"type": "string",
"enum": [
"natural",
"flat"
],
"description": "Base elevation the terrain starts from. \"natural\" (default) gives rolling procedural relief to sculpt against; \"flat\" gives a level plane at Y=0 for…"
},
"lodLevels": {
"type": "number",
"description": "Number of geometric LODs compiled per section, 1-5. Default 5."
},
"allowDuplicate": {
"type": "boolean",
"description": "Set true only when a second terrain node is genuinely intended. Defaults false, which refuses to add a second mesh terrain to the scene."
}
}
}
}terrain_sculpt_strokeAction
Sculpts the terrain along a path of world-space points, in meters. Nine modes: raise and lower move the surface, clay builds mass, smooth relaxes it, flatten levels toward one height, pinch sharpens ridges, scrape planes material away, terrace cuts benches, noise adds grain. Domain 'heightfield' moves straight up, 'mesh' follows the picked surface normal and can form overhangs. Strokes stack non-destructively, so build a landform in passes rather than one huge stroke.
View tool JSON
{
"name": "terrain_sculpt_stroke",
"kind": "act",
"impl": "imperative",
"description": "Sculpts the terrain along a path of world-space points, in meters. Nine modes: raise and lower move the surface, clay builds mass, smooth relaxes it, flatten levels toward one height, pinch sharpens ridges, scrape planes material away, terrace cuts benches, noise adds grain. Domain 'heightfield' moves straight up, 'mesh' follows the picked surface normal and can form overhangs. Strokes stack non-destructively, so build a landform in passes rather than one huge stroke.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."
},
"mode": {
"type": "string",
"enum": [
"raise",
"lower",
"smooth",
"flatten",
"clay",
"pinch",
"scrape",
"terrace",
"noise"
],
"description": "Sculpt operation. `raise`/`lower` push the surface out or in along the domain axis. `smooth` averages neighbours to soften noise and stroke seams.…"
},
"domain": {
"type": "string",
"enum": [
"heightfield",
"mesh"
],
"description": "Displacement axis. \"heightfield\" moves vertices along world +Y and cannot create an overhang. \"mesh\" (default) moves them along the picked surface…"
},
"path": {
"type": "array",
"description": "Ordered world-space dab positions, in meters. Give at least one point; two or more sweep the brush along the path.",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X in meters"
},
"y": {
"type": "number",
"description": "World Y in meters. For heightfield strokes this only picks the dab, not the result height."
},
"z": {
"type": "number",
"description": "World Z in meters"
},
"normalX": {
"type": "number",
"description": "Surface normal X at this point. Only meaningful for domain \"mesh\"; defaults to world up (0,1,0)."
},
"normalY": {
"type": "number",
"description": "Surface normal Y at this point. Defaults to 1."
},
"normalZ": {
"type": "number",
"description": "Surface normal Z at this point. Defaults to 0."
},
"weight": {
"type": "number",
"description": "Relative brush flow at this point, 0-1. Default 1. Taper the ends of a ridge by fading this toward 0."
}
},
"required": [
"x",
"y",
"z"
]
}
},
"radiusMeters": {
"type": "number",
"description": "Brush radius in meters. Terrain is kilometre scale, so a mountain mass is typically 200-600 m, a ridge 60-200 m, a trail cut or boulder detail 5-15 m."
},
"strength": {
"type": "number",
"description": "Peak displacement per dab in meters, at the center of the brush. Keep it positive: `lower` and `scrape` already remove material. A 400 m peak is…"
},
"falloff": {
"type": "number",
"description": "Edge softness 0-1. 0 is a hard-edged disc that leaves a visible rim; 1 is a fully smooth falloff. Default 0.5."
},
"targetY": {
"type": "number",
"description": "Only for mode \"flatten\": the world Y elevation in meters the surface is pulled toward. Defaults to the Y of the first path point."
},
"terraceStepMeters": {
"type": "number",
"description": "Only for mode \"terrace\": vertical spacing between terrace treads, in meters."
},
"noiseScale": {
"type": "number",
"description": "Only for mode \"noise\": world-space wavelength of the added roughness, in meters. Smaller values give finer grain."
},
"accumulate": {
"type": "boolean",
"description": "When true the stroke keeps building depth over overlapping dabs instead of settling on a single displacement. Use true to dig deep with one stroke,…"
},
"sculptLayerId": {
"type": "string",
"description": "Optional sculpt layer ID to file this stroke under, so a group of strokes can later be faded or disabled together."
}
},
"required": [
"mode",
"path",
"radiusMeters",
"strength"
]
}
}terrain_carve_tunnelAction
Carves a tunnel straight through a mesh terrain by sweeping a capsule between two world-space portals and subtracting it with exact CSG. This produces a genuine hole with interior walls, not a masked-out region, which is why it belongs to mesh terrain and has no heightmap equivalent. Use it for road and rail tunnels, mine adits, and the trunk passage of a cave system; branch chambers and side passages are better added with `terrain_add_csg_volume`. All distances are meters.
View tool JSON
{
"name": "terrain_carve_tunnel",
"kind": "act",
"impl": "imperative",
"description": "Carves a tunnel straight through a mesh terrain by sweeping a capsule between two world-space portals and subtracting it with exact CSG. This produces a genuine hole with interior walls, not a masked-out region, which is why it belongs to mesh terrain and has no heightmap equivalent. Use it for road and rail tunnels, mine adits, and the trunk passage of a cave system; branch chambers and side passages are better added with `terrain_add_csg_volume`. All distances are meters.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."
},
"startX": {
"type": "number",
"description": "World X of the entrance portal in meters, placed on the terrain surface"
},
"startY": {
"type": "number",
"description": "World Y of the entrance portal in meters"
},
"startZ": {
"type": "number",
"description": "World Z of the entrance portal in meters"
},
"startNormalX": {
"type": "number",
"description": "Direction the entrance portal faces, X. Should point out of the hillside. Defaults to the direction of the other portal."
},
"startNormalY": {
"type": "number",
"description": "Direction the entrance portal faces, Y"
},
"startNormalZ": {
"type": "number",
"description": "Direction the entrance portal faces, Z"
},
"endX": {
"type": "number",
"description": "World X of the exit portal in meters, placed on the terrain surface"
},
"endY": {
"type": "number",
"description": "World Y of the exit portal in meters"
},
"endZ": {
"type": "number",
"description": "World Z of the exit portal in meters"
},
"endNormalX": {
"type": "number",
"description": "Direction the exit portal faces, X. Should point out of the hillside."
},
"endNormalY": {
"type": "number",
"description": "Direction the exit portal faces, Y"
},
"endNormalZ": {
"type": "number",
"description": "Direction the exit portal faces, Z"
},
"radiusMeters": {
"type": "number",
"description": "Tunnel bore radius in meters. Default 8. A single-track rail tunnel is about 4 m, a two-lane road tunnel about 6-8 m, a walkable cave passage 3-10 m."
},
"depthMeters": {
"type": "number",
"description": "How far each portal drives straight inward before the two ends are joined, in meters. Default is 1.75x radiusMeters. Larger values give a straighter…"
},
"noise": {
"type": "number",
"description": "Wall roughness, 0 or more. 0 gives a machined bore, which is correct for an engineered tunnel; 1 (default) gives rock. Raise it toward 2-3 for a…"
},
"noiseScale": {
"type": "number",
"description": "World-space wavelength of the wall roughness in meters. Default 2.6. Larger values give broad undulation instead of fine pitting."
}
},
"required": [
"startX",
"startY",
"startZ",
"endX",
"endY",
"endZ"
]
}
}terrain_paint_weightsAction
Paints one of a mesh terrain's four material channels along a world-space path, and appends the paint stroke to the node's modifier stack. Channel weights blend the terrain's four surface materials; painting one channel up naturally takes weight from the others. Use `terrain_set_material_channels` first if the channels do not already mean what you need. All distances are meters.
View tool JSON
{
"name": "terrain_paint_weights",
"kind": "act",
"impl": "imperative",
"description": "Paints one of a mesh terrain's four material channels along a world-space path, and appends the paint stroke to the node's modifier stack. Channel weights blend the terrain's four surface materials; painting one channel up naturally takes weight from the others. Use `terrain_set_material_channels` first if the channels do not already mean what you need. All distances are meters.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."
},
"channel": {
"type": "string",
"enum": [
"channel0",
"channel1",
"channel2",
"channel3"
],
"description": "Which of the four material channels to paint. Call `get_terrain_state` to see what each channel is currently named. Defaults are channel0 Grass,…"
},
"mode": {
"type": "string",
"enum": [
"add",
"subtract"
],
"description": "\"add\" (default) paints the channel in; \"subtract\" erases it, letting the other channels show through."
},
"path": {
"type": "array",
"description": "Ordered world-space dab positions, in meters.",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X in meters"
},
"y": {
"type": "number",
"description": "World Y in meters"
},
"z": {
"type": "number",
"description": "World Z in meters"
},
"normalX": {
"type": "number",
"description": "Surface normal X at this point. Defaults to world up."
},
"normalY": {
"type": "number",
"description": "Surface normal Y at this point. Defaults to 1."
},
"normalZ": {
"type": "number",
"description": "Surface normal Z at this point. Defaults to 0."
},
"weight": {
"type": "number",
"description": "Relative paint flow at this point, 0-1. Default 1."
}
},
"required": [
"x",
"y",
"z"
]
}
},
"radiusMeters": {
"type": "number",
"description": "Paint radius in meters. Material bands read best when they are wide: a snowline or scree band is typically 100-400 m."
},
"strength": {
"type": "number",
"description": "Weight applied per dab, 0-1. Default 0.5. Use low values and repeated passes for a soft transition between materials."
},
"falloff": {
"type": "number",
"description": "Edge softness 0-1. Default 0.7; material boundaries almost always want a soft edge."
}
},
"required": [
"channel",
"path",
"radiusMeters"
]
}
}create_forest_fieldAction
Creates a forest field: a stand described as a spline on the ground rather than a list of trees. Nothing grows until the shape has at least two control points and `grow_forest_field` runs, so the normal sequence is create, add points, then grow. Returns the field ID every other forest_* tool takes. Forests sit on the terrain's height field, so make the terrain first when the user wants both.
View tool JSON
{
"name": "create_forest_field",
"kind": "act",
"impl": "imperative",
"description": "Creates a forest field: a stand described as a spline on the ground rather than a list of trees. Nothing grows until the shape has at least two control points and `grow_forest_field` runs, so the normal sequence is create, add points, then grow. Returns the field ID every other forest_* tool takes. Forests sit on the terrain's height field, so make the terrain first when the user wants both.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Display name for the field, for example \"North Woods\""
},
"preset": {
"type": "string",
"enum": [
"mossy-old-growth",
"temperate-mixed",
"ancient-oak-grove",
"boreal-conifer",
"primeval-redwood",
"tropical-wet",
"palm-oasis",
"savanna",
"arid-woodland"
],
"description": "The stand type. This decides the species mix, the floor, and the stems per hectare. Pick by climate and age: boreal-conifer for cold spruce/fir,…"
},
"points": {
"type": "array",
"description": "Optional control points to lay down immediately, so a field can be created and shaped in one call. Each is a point on the ground plane in world…",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"z": {
"type": "number"
}
},
"required": [
"x",
"z"
]
}
},
"closed": {
"type": "boolean",
"description": "True (default) makes the spline a closed loop enclosing an area. False makes it an open belt of `width` either side, for a treeline, hedgerow, or…"
},
"grow": {
"type": "boolean",
"description": "Grow the stand immediately after creating it. Only meaningful when `points` supplies at least two points. Defaults to true when points are given."
}
}
}
}add_forest_pointsAction
Appends control points to a forest field's spline, in order. The curve through them is a centripetal Catmull-Rom, so points may be placed close together without the shape cusping. Adding points marks the field dirty; it does not regrow until `grow_forest_field` runs.
View tool JSON
{
"name": "add_forest_points",
"kind": "act",
"impl": "imperative",
"description": "Appends control points to a forest field's spline, in order. The curve through them is a centripetal Catmull-Rom, so points may be placed close together without the shape cusping. Adding points marks the field dirty; it does not regrow until `grow_forest_field` runs.",
"inputSchema": {
"type": "object",
"properties": {
"fieldId": {
"type": "string",
"description": "Forest field ID. Omit when exactly one field exists."
},
"points": {
"type": "array",
"description": "Ground-plane points in world meters, in the order they should join.",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"z": {
"type": "number"
}
},
"required": [
"x",
"z"
]
}
}
},
"required": [
"points"
]
}
}grow_forest_fieldAction
Grows a forest field: lays out the stems, scatters the boulders, and reports what was produced. This is the expensive step in the whole forest system, so it is explicit and never implied by editing the shape. Growing again after a change replaces the previous stand.
View tool JSON
{
"name": "grow_forest_field",
"kind": "act",
"impl": "imperative",
"description": "Grows a forest field: lays out the stems, scatters the boulders, and reports what was produced. This is the expensive step in the whole forest system, so it is explicit and never implied by editing the shape. Growing again after a change replaces the previous stand.",
"inputSchema": {
"type": "object",
"properties": {
"fieldId": {
"type": "string",
"description": "Forest field ID. Omit to grow every dirty field."
}
}
}
}place_primitiveAction
Places a parametric primitive shape (cube, sphere, cylinder, cone). Use it for static blockout primitives or physics props.
View tool JSON
{
"name": "place_primitive",
"kind": "act",
"impl": "imperative",
"description": "Places a parametric primitive shape (cube, sphere, cylinder, cone). Use it for static blockout primitives or physics props.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position"
},
"y": {
"type": "number",
"description": "World Y position"
},
"z": {
"type": "number",
"description": "World Z position"
},
"role": {
"type": "string",
"enum": [
"brush",
"prop"
],
"description": "brush = static blockout primitive, prop = physics object"
},
"shape": {
"type": "string",
"enum": [
"cube",
"sphere",
"cylinder",
"cone"
],
"description": "Primitive shape"
},
"sizeX": {
"type": "number",
"description": "Size X (default: 2)"
},
"sizeY": {
"type": "number",
"description": "Size Y (default: 2, or 3 for cylinder/cone)"
},
"sizeZ": {
"type": "number",
"description": "Size Z (default: 2)"
},
"materialId": {
"type": "string",
"description": "Material ID to apply directly. Avoids needing a separate assign_material call."
},
"name": {
"type": "string",
"description": "Display name"
}
},
"required": [
"x",
"y",
"z",
"role",
"shape"
]
}
}place_blockout_roomAction
Places a blockout room (enclosed box with walls, floor, ceiling). Open sides remove entire wall/floor/ceiling planes for coarse full-side openings only. Position is the center-bottom of the room.
View tool JSON
{
"name": "place_blockout_room",
"kind": "act",
"impl": "imperative",
"description": "Places a blockout room (enclosed box with walls, floor, ceiling). Open sides remove entire wall/floor/ceiling planes for coarse full-side openings only. Position is the center-bottom of the room.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position of room center"
},
"y": {
"type": "number",
"description": "World Y position of room bottom (usually 0 for ground level)"
},
"z": {
"type": "number",
"description": "World Z position of room center"
},
"sizeX": {
"type": "number",
"description": "Room width in meters (X axis)"
},
"sizeY": {
"type": "number",
"description": "Room height in meters (Y axis)"
},
"sizeZ": {
"type": "number",
"description": "Room depth in meters (Z axis)"
},
"openSides": {
"type": "array",
"items": {
"type": "string",
"enum": [
"north",
"south",
"east",
"west",
"top",
"bottom"
]
},
"description": "Whole sides to leave open. This removes the entire wall, floor, or ceiling plane and is not suitable for doorway- or hallway-sized openings."
},
"materialId": {
"type": "string",
"description": "Material ID to apply. Use list_materials to see available IDs."
},
"name": {
"type": "string",
"description": "Display name for the room node"
}
},
"required": [
"x",
"y",
"z",
"sizeX",
"sizeY",
"sizeZ"
]
}
}set_scene_settingsAction
Updates scene settings (world physics, fog, ambient, skybox, grass wind, player config). Skybox uses world.skybox; grass wind animates the procedural grass field shader.
View tool JSON
{
"name": "set_scene_settings",
"kind": "act",
"impl": "imperative",
"description": "Updates scene settings (world physics, fog, ambient, skybox, grass wind, player config). Skybox uses world.skybox; grass wind animates the procedural grass field shader.",
"inputSchema": {
"type": "object",
"properties": {
"gravityX": {
"type": "number",
"description": "Gravity X (default: 0)"
},
"gravityY": {
"type": "number",
"description": "Gravity Y (default: -9.81)"
},
"gravityZ": {
"type": "number",
"description": "Gravity Z (default: 0)"
},
"physicsEnabled": {
"type": "boolean",
"description": "Enable physics simulation"
},
"ambientColor": {
"type": "string",
"description": "Ambient light hex color"
},
"ambientIntensity": {
"type": "number",
"description": "Ambient light intensity"
},
"fogColor": {
"type": "string",
"description": "Fog hex color"
},
"fogNear": {
"type": "number",
"description": "Fog near distance"
},
"fogFar": {
"type": "number",
"description": "Fog far distance"
},
"skyboxEnabled": {
"type": "boolean",
"description": "Enable HDR/image skybox"
},
"skyboxSource": {
"type": "string",
"description": "Skybox URL or asset path (HDR or image per skyboxFormat)"
},
"skyboxFormat": {
"type": "string",
"enum": [
"hdr",
"image"
],
"description": "Skybox file type"
},
"skyboxName": {
"type": "string",
"description": "Display label for the sky preset"
},
"skyboxIntensity": {
"type": "number",
"description": "Skybox display intensity"
},
"skyboxLightingIntensity": {
"type": "number",
"description": "How strongly the sky contributes to scene lighting (when affectsLighting)"
},
"skyboxBlur": {
"type": "number",
"description": "IBL / sky blur amount"
},
"skyboxAffectsLighting": {
"type": "boolean",
"description": "Whether skybox drives environmental lighting"
},
"grassEnabled": {
"type": "boolean",
"description": "Enable procedural grass field in lit viewport"
},
"grassWindSpeed": {
"type": "number",
"description": "Grass shader wind speed"
},
"grassWindStrength": {
"type": "number",
"description": "Grass shader wind displacement strength"
},
"cameraMode": {
"type": "string",
"enum": [
"fps",
"third-person",
"top-down"
],
"description": "Player camera mode"
},
"playerHeight": {
"type": "number",
"description": "Player height in meters"
},
"movementSpeed": {
"type": "number",
"description": "Player movement speed"
},
"jumpHeight": {
"type": "number",
"description": "Player jump height"
}
}
}
}cast_vfx_abilityAction
Fires one of seven combat abilities in the viewport as a one-off effect. Each travels from an origin along a flat heading, erupts at the far end, then clears itself. Use it to show what an ability looks like or to dress a frame. The cast is not saved with the scene. Call list_vfx_abilities first to match an ability to what the user described.
View tool JSON
{
"name": "cast_vfx_ability",
"kind": "act",
"impl": "imperative",
"description": "Fires one of seven combat abilities in the viewport as a one-off effect. Each travels from an origin along a flat heading, erupts at the far end, then clears itself. Use it to show what an ability looks like or to dress a frame. The cast is not saved with the scene. Call list_vfx_abilities first to match an ability to what the user described.",
"inputSchema": {
"type": "object",
"properties": {
"element": {
"type": "string",
"enum": [
"pyre",
"kraken",
"electrical",
"earth",
"portal",
"aether",
"firePortal"
],
"description": "Which ability. pyre is a ring of burning blades over a molten crater; kraken is cephalopod arms hauling out of a rift and hammering the ground;…"
},
"x": {
"type": "number",
"description": "World X the cast starts from, in meters. Defaults to 0."
},
"y": {
"type": "number",
"description": "World Y of the cast origin, in meters. Ground level unless the ability hangs in the air. Defaults to 0."
},
"z": {
"type": "number",
"description": "World Z the cast starts from, in meters. Defaults to 0."
},
"directionX": {
"type": "number",
"description": "Flat heading X. Need not be unit length; it is normalised. Defaults to 0."
},
"directionZ": {
"type": "number",
"description": "Flat heading Z. Defaults to 1, i.e. straight along +Z."
},
"distance": {
"type": "number",
"description": "How far the cast reaches, in meters. 20 is a natural skillshot range; clamped to 1-400."
}
},
"required": [
"element"
]
}
}create_procedural_worldAction
Creates a persistent LAAS procedural-world node. It is WebGPU-only and stores deterministic generator settings rather than generated GPU data.
View tool JSON
{
"name": "create_procedural_world",
"kind": "act",
"impl": "imperative",
"description": "Creates a persistent LAAS procedural-world node. It is WebGPU-only and stores deterministic generator settings rather than generated GPU data.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"seed": {
"type": "number"
},
"preset": {
"type": "string",
"enum": [
"low",
"high",
"ultra"
]
},
"worldSizeMeters": {
"type": "number"
},
"timeOfDay": {
"type": "number"
},
"allowDuplicate": {
"type": "boolean"
}
}
}
}inspect_procedural_worldAnswer
Returns persisted settings and current deterministic configuration for a procedural world.
View tool JSON
{
"name": "inspect_procedural_world",
"kind": "answer",
"impl": "imperative",
"description": "Returns persisted settings and current deterministic configuration for a procedural world.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
}
}
}
}regenerate_procedural_worldAction
Queues regeneration from the persisted LAAS seed and settings. Does not claim GPU generation succeeded before the viewport reports it.
View tool JSON
{
"name": "regenerate_procedural_world",
"kind": "act",
"impl": "imperative",
"description": "Queues regeneration from the persisted LAAS seed and settings. Does not claim GPU generation succeeded before the viewport reports it.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
}
}
}
}set_procedural_world_seedAction
Sets the deterministic uint32 seed for a procedural world.
View tool JSON
{
"name": "set_procedural_world_seed",
"kind": "act",
"impl": "imperative",
"description": "Sets the deterministic uint32 seed for a procedural world.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"seed": {
"type": "number"
}
},
"required": [
"seed"
]
}
}set_procedural_world_presetAction
Selects the low, high, or ultra LAAS quality preset.
View tool JSON
{
"name": "set_procedural_world_preset",
"kind": "act",
"impl": "imperative",
"description": "Selects the low, high, or ultra LAAS quality preset.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"preset": {
"type": "string",
"enum": [
"low",
"high",
"ultra"
]
}
},
"required": [
"preset"
]
}
}configure_procedural_terrainAction
Configures LAAS terrain/hydrology authoring controls.
View tool JSON
{
"name": "configure_procedural_terrain",
"kind": "act",
"impl": "imperative",
"description": "Configures LAAS terrain/hydrology authoring controls.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"heightAmplitude": {
"type": "number"
},
"noiseScale": {
"type": "number"
},
"hydraulicErosion": {
"type": "number"
},
"thermalErosion": {
"type": "number"
},
"riverThreshold": {
"type": "number"
},
"lakeBehavior": {
"type": "string",
"enum": [
"connected",
"natural",
"off"
]
},
"moisture": {
"type": "number"
},
"snow": {
"type": "number"
},
"terrainRange": {
"type": "number"
},
"farShell": {
"type": "boolean"
}
}
}
}configure_proc_vegetationAction
Configures LAAS GPU scatter densities, species, slopes, impostors, and wind response.
View tool JSON
{
"name": "configure_proc_vegetation",
"kind": "act",
"impl": "imperative",
"description": "Configures LAAS GPU scatter densities, species, slopes, impostors, and wind response.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"enabledSpecies": {
"type": "array",
"items": {
"type": "string"
}
},
"treeDensity": {
"type": "number"
},
"understoryDensity": {
"type": "number"
},
"grassDensity": {
"type": "number"
},
"slopeLimit": {
"type": "number"
},
"scatterSeedOffset": {
"type": "number"
},
"impostorRange": {
"type": "number"
},
"windResponse": {
"type": "number"
}
}
}
}configure_procedural_lightingAction
Configures LAAS sun, cascaded shadows, and canopy-aware GI.
View tool JSON
{
"name": "configure_procedural_lighting",
"kind": "act",
"impl": "imperative",
"description": "Configures LAAS sun, cascaded shadows, and canopy-aware GI.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"giEnabled": {
"type": "boolean"
},
"shadowQuality": {
"type": "string",
"enum": [
"low",
"high",
"ultra"
]
},
"sunAzimuth": {
"type": "number"
},
"sunElevation": {
"type": "number"
}
}
}
}configure_proc_atmosphereAction
Configures LAAS clouds, fog, and froxel volumetrics.
View tool JSON
{
"name": "configure_proc_atmosphere",
"kind": "act",
"impl": "imperative",
"description": "Configures LAAS clouds, fog, and froxel volumetrics.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"cloudCoverage": {
"type": "number"
},
"cloudSpeed": {
"type": "number"
},
"fogDensity": {
"type": "number"
},
"volumetrics": {
"type": "boolean"
}
}
}
}configure_procedural_waterAction
Configures LAAS rivers/lakes, reflections, caustics, foam, wet margins, and clipmap distance.
View tool JSON
{
"name": "configure_procedural_water",
"kind": "act",
"impl": "imperative",
"description": "Configures LAAS rivers/lakes, reflections, caustics, foam, wet margins, and clipmap distance.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"reflectionQuality": {
"type": "string",
"enum": [
"low",
"high",
"ultra"
]
},
"caustics": {
"type": "boolean"
},
"foam": {
"type": "boolean"
},
"wetMargins": {
"type": "boolean"
},
"clipmapDistance": {
"type": "number"
}
}
}
}configure_procedural_motionAction
Configures LAAS wind, cloud motion, particle classes, and deterministic freeze mode.
View tool JSON
{
"name": "configure_procedural_motion",
"kind": "act",
"impl": "imperative",
"description": "Configures LAAS wind, cloud motion, particle classes, and deterministic freeze mode.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"windDirection": {
"type": "number"
},
"windStrength": {
"type": "number"
},
"cloudSpeed": {
"type": "number"
},
"particlePreset": {
"type": "string",
"enum": [
"low",
"high",
"ultra"
]
},
"particleTypes": {
"type": "array",
"items": {
"type": "string",
"enum": [
"leaves",
"pollen",
"snow"
]
}
},
"freezeSimulation": {
"type": "boolean"
}
}
}
}configure_procedural_postAction
Configures LAAS TAA, GTAO, bounce, bloom, exposure, and debug view settings.
View tool JSON
{
"name": "configure_procedural_post",
"kind": "act",
"impl": "imperative",
"description": "Configures LAAS TAA, GTAO, bounce, bloom, exposure, and debug view settings.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"taa": {
"type": "boolean"
},
"gtao": {
"type": "boolean"
},
"screenSpaceBounce": {
"type": "boolean"
},
"bloom": {
"type": "boolean"
},
"autoExposure": {
"type": "boolean"
},
"debugView": {
"type": "string",
"enum": [
"none",
"ao",
"clouds",
"velocity"
]
}
}
}
}set_world_time_of_dayAction
Sets LAAS physical sky time of day in hours from 0 through 24.
View tool JSON
{
"name": "set_world_time_of_day",
"kind": "act",
"impl": "imperative",
"description": "Sets LAAS physical sky time of day in hours from 0 through 24.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"timeOfDay": {
"type": "number"
}
},
"required": [
"timeOfDay"
]
}
}set_world_weatherAction
Applies a concise cloud/fog/particle weather configuration.
View tool JSON
{
"name": "set_world_weather",
"kind": "act",
"impl": "imperative",
"description": "Applies a concise cloud/fog/particle weather configuration.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"cloudCoverage": {
"type": "number"
},
"fogDensity": {
"type": "number"
},
"particleTypes": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}set_world_exploration_modeAction
Sets editor, walk, or fly exploration mode for the world preview/runtime.
View tool JSON
{
"name": "set_world_exploration_mode",
"kind": "act",
"impl": "imperative",
"description": "Sets editor, walk, or fly exploration mode for the world preview/runtime.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"mode": {
"type": "string",
"enum": [
"editor",
"walk",
"fly"
]
}
},
"required": [
"mode"
]
}
}create_world_bookmarkAction
Adds a serialized procedural-world camera bookmark.
View tool JSON
{
"name": "create_world_bookmark",
"kind": "act",
"impl": "imperative",
"description": "Adds a serialized procedural-world camera bookmark.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"name": {
"type": "string"
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"z": {
"type": "number"
},
"yaw": {
"type": "number"
},
"pitch": {
"type": "number"
},
"timeOfDay": {
"type": "number"
}
},
"required": [
"name",
"x",
"y",
"z"
]
}
}update_world_bookmarkAction
Updates a serialized procedural-world camera bookmark.
View tool JSON
{
"name": "update_world_bookmark",
"kind": "act",
"impl": "imperative",
"description": "Updates a serialized procedural-world camera bookmark.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"bookmarkId": {
"type": "string"
},
"name": {
"type": "string"
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"z": {
"type": "number"
},
"yaw": {
"type": "number"
},
"pitch": {
"type": "number"
},
"timeOfDay": {
"type": "number"
}
},
"required": [
"bookmarkId"
]
}
}delete_world_bookmarkSensitive Action
Deletes a serialized procedural-world camera bookmark.
View tool JSON
{
"name": "delete_world_bookmark",
"kind": "transact",
"impl": "imperative",
"description": "Deletes a serialized procedural-world camera bookmark.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"bookmarkId": {
"type": "string"
}
},
"required": [
"bookmarkId"
]
}
}play_world_flythroughAction
Enters LAAS fly exploration mode so its composed bookmark flythrough controls can run.
View tool JSON
{
"name": "play_world_flythrough",
"kind": "act",
"impl": "imperative",
"description": "Enters LAAS fly exploration mode so its composed bookmark flythrough controls can run.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
}
}
}
}stop_world_flythroughAction
Returns the procedural world to editor exploration mode.
View tool JSON
{
"name": "stop_world_flythrough",
"kind": "act",
"impl": "imperative",
"description": "Returns the procedural world to editor exploration mode.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
}
}
}
}inspect_world_performanceAnswer
Returns persisted quality/capacity expectations; live GPU timings are available only after a WebGPU world is running.
View tool JSON
{
"name": "inspect_world_performance",
"kind": "answer",
"impl": "imperative",
"description": "Returns persisted quality/capacity expectations; live GPU timings are available only after a WebGPU world is running.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
}
}
}
}capture_world_verify_shotAction
Captures the current viewport for procedural-world verification when screenshot capture is available.
View tool JSON
{
"name": "capture_world_verify_shot",
"kind": "act",
"impl": "imperative",
"description": "Captures the current viewport for procedural-world verification when screenshot capture is available.",
"inputSchema": {
"type": "object",
"properties": {}
}
}list_copilot_skill_referencesAnswer
Lists available read-only Copilot skill references. Use this before reading a deeper reference when the active skill names several documents.
View tool JSON
{
"name": "list_copilot_skill_references",
"kind": "answer",
"impl": "imperative",
"description": "Lists available read-only Copilot skill references. Use this before reading a deeper reference when the active skill names several documents.",
"inputSchema": {
"type": "object",
"properties": {
"skillId": {
"type": "string",
"description": "Optional active Copilot skill ID"
}
}
}
}read_copilot_skill_referenceAnswer
Reads a bounded line range from an active Copilot skill reference. Do not reread an identical range during this run.
View tool JSON
{
"name": "read_copilot_skill_reference",
"kind": "answer",
"impl": "imperative",
"description": "Reads a bounded line range from an active Copilot skill reference. Do not reread an identical range during this run.",
"inputSchema": {
"type": "object",
"properties": {
"skillId": {
"type": "string"
},
"referenceId": {
"type": "string"
},
"startLine": {
"type": "number"
},
"endLine": {
"type": "number"
},
"maxChars": {
"type": "number",
"description": "Maximum 24000 characters"
}
},
"required": [
"skillId",
"referenceId"
]
}
}search_skill_referencesAnswer
Searches active Copilot skill references and returns focused line ranges. Search before reading a long document.
View tool JSON
{
"name": "search_skill_references",
"kind": "answer",
"impl": "imperative",
"description": "Searches active Copilot skill references and returns focused line ranges. Search before reading a long document.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"skillId": {
"type": "string"
},
"referenceIds": {
"type": "array",
"items": {
"type": "string"
}
},
"maxResults": {
"type": "number",
"description": "Maximum 24 results"
}
},
"required": [
"query"
]
}
}place_blockout_platformAction
Places a flat blockout mesh platform (floor slab, roof, shelf). Position is the center of the platform volume.
View tool JSON
{
"name": "place_blockout_platform",
"kind": "act",
"impl": "imperative",
"description": "Places a flat blockout mesh platform (floor slab, roof, shelf). Position is the center of the platform volume.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position"
},
"y": {
"type": "number",
"description": "World Y position (center of slab thickness)"
},
"z": {
"type": "number",
"description": "World Z position"
},
"sizeX": {
"type": "number",
"description": "Platform width (X)"
},
"sizeY": {
"type": "number",
"description": "Platform thickness (Y), typically 0.25-0.5"
},
"sizeZ": {
"type": "number",
"description": "Platform depth (Z)"
},
"materialId": {
"type": "string",
"description": "Material ID"
},
"name": {
"type": "string",
"description": "Display name"
}
},
"required": [
"x",
"y",
"z",
"sizeX",
"sizeY",
"sizeZ"
]
}
}place_blockout_stairsAction
Places a parametric staircase with optional landings. Position is the center-bottom of the bottom landing. Returns topLandingCenter for chaining connections.
View tool JSON
{
"name": "place_blockout_stairs",
"kind": "act",
"impl": "imperative",
"description": "Places a parametric staircase with optional landings. Position is the center-bottom of the bottom landing. Returns topLandingCenter for chaining connections.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position of stair base"
},
"y": {
"type": "number",
"description": "World Y position of stair base (bottom)"
},
"z": {
"type": "number",
"description": "World Z position of stair base"
},
"stepCount": {
"type": "number",
"description": "Number of steps"
},
"stepHeight": {
"type": "number",
"description": "Height of each step in meters (typical: 0.2)"
},
"treadDepth": {
"type": "number",
"description": "Depth of each step tread in meters (typical: 0.3)"
},
"width": {
"type": "number",
"description": "Stair width in meters"
},
"direction": {
"type": "string",
"enum": [
"north",
"south",
"east",
"west"
],
"description": "Direction the stairs ascend toward (default: north)"
},
"materialId": {
"type": "string",
"description": "Material ID"
},
"name": {
"type": "string",
"description": "Display name"
}
},
"required": [
"x",
"y",
"z",
"stepCount",
"stepHeight",
"treadDepth",
"width"
]
}
}place_brushAction
Legacy-named compatibility tool that places a simple axis-aligned mesh box. Default is a 4x3x4 box. Prefer mesh editing workflows after placement.
View tool JSON
{
"name": "place_brush",
"kind": "act",
"impl": "imperative",
"description": "Legacy-named compatibility tool that places a simple axis-aligned mesh box. Default is a 4x3x4 box. Prefer mesh editing workflows after placement.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position"
},
"y": {
"type": "number",
"description": "World Y position"
},
"z": {
"type": "number",
"description": "World Z position"
},
"sizeX": {
"type": "number",
"description": "Brush width (default: 4)"
},
"sizeY": {
"type": "number",
"description": "Brush height (default: 3)"
},
"sizeZ": {
"type": "number",
"description": "Brush depth (default: 4)"
},
"name": {
"type": "string",
"description": "Display name"
}
},
"required": [
"x",
"y",
"z"
]
}
}place_lightAction
Places a light in the scene. Types: point (local area), directional (sun), spot (focused cone), ambient (global fill), hemisphere (sky/ground).
View tool JSON
{
"name": "place_light",
"kind": "act",
"impl": "imperative",
"description": "Places a light in the scene. Types: point (local area), directional (sun), spot (focused cone), ambient (global fill), hemisphere (sky/ground).",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position"
},
"y": {
"type": "number",
"description": "World Y position"
},
"z": {
"type": "number",
"description": "World Z position"
},
"type": {
"type": "string",
"enum": [
"point",
"directional",
"spot",
"ambient",
"hemisphere"
],
"description": "Light type"
},
"color": {
"type": "string",
"description": "Hex color (e.g. '#ffffff')"
},
"intensity": {
"type": "number",
"description": "Light intensity"
}
},
"required": [
"x",
"y",
"z",
"type"
]
}
}place_entityAction
Places a gameplay entity (spawn point, NPC, or interactive object). Prefer place_player_spawn for playable start positions.
View tool JSON
{
"name": "place_entity",
"kind": "act",
"impl": "imperative",
"description": "Places a gameplay entity (spawn point, NPC, or interactive object). Prefer place_player_spawn for playable start positions.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position"
},
"y": {
"type": "number",
"description": "World Y position"
},
"z": {
"type": "number",
"description": "World Z position"
},
"rotationY": {
"type": "number",
"description": "Yaw rotation in radians"
},
"type": {
"type": "string",
"enum": [
"player-spawn",
"npc-spawn",
"smart-object"
],
"description": "Entity type"
},
"name": {
"type": "string",
"description": "Display name"
}
},
"required": [
"x",
"y",
"z",
"type"
]
}
}place_player_spawnAction
Places a player-spawn entity. Use this for playable maps instead of generic entity placement.
View tool JSON
{
"name": "place_player_spawn",
"kind": "act",
"impl": "imperative",
"description": "Places a player-spawn entity. Use this for playable maps instead of generic entity placement.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position"
},
"y": {
"type": "number",
"description": "World Y position"
},
"z": {
"type": "number",
"description": "World Z position"
},
"rotationY": {
"type": "number",
"description": "Yaw rotation in radians"
},
"name": {
"type": "string",
"description": "Display name"
}
},
"required": [
"x",
"y",
"z"
]
}
}place_skatepark_elementAction
Places a procedural skatepark element (ramps, rails, bowls, etc.). Position is the center-bottom of the element.
View tool JSON
{
"name": "place_skatepark_element",
"kind": "act",
"impl": "imperative",
"description": "Places a procedural skatepark element (ramps, rails, bowls, etc.). Position is the center-bottom of the element.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position"
},
"y": {
"type": "number",
"description": "World Y position (bottom)"
},
"z": {
"type": "number",
"description": "World Z position"
},
"type": {
"type": "string",
"enum": [
"quarter-pipe",
"half-pipe",
"bank",
"spine",
"gap-to-rail",
"floor",
"ledge",
"rail",
"stair-set",
"hubba",
"bowl",
"taco",
"handrail",
"kicker"
],
"description": "Type of skatepark element"
},
"rotationY": {
"type": "number",
"description": "Rotation around Y axis in radians (default: 0)"
},
"width": {
"type": "number",
"description": "Standard width (default: 4)"
},
"height": {
"type": "number",
"description": "Standard height (default: 2)"
},
"length": {
"type": "number",
"description": "Standard length/depth (default: 4)"
},
"materialId": {
"type": "string",
"description": "Specific material ID (e.g. 'material:skate:concrete', 'material:skate:plywood', 'material:skate:metal')"
},
"name": {
"type": "string",
"description": "Display name"
}
},
"required": [
"x",
"y",
"z",
"type"
]
}
}place_architecture_elementAction
Places an architecture element (wall, slab, ceiling, roof, door, window, light fixture). Position is the center-bottom of the element.
View tool JSON
{
"name": "place_architecture_element",
"kind": "act",
"impl": "imperative",
"description": "Places an architecture element (wall, slab, ceiling, roof, door, window, light fixture). Position is the center-bottom of the element.",
"inputSchema": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X position"
},
"y": {
"type": "number",
"description": "World Y position (bottom)"
},
"z": {
"type": "number",
"description": "World Z position"
},
"type": {
"type": "string",
"enum": [
"wall",
"slab",
"ceiling",
"roof",
"item"
],
"description": "Architecture element type"
},
"width": {
"type": "number",
"description": "Width in meters (default: 4)"
},
"height": {
"type": "number",
"description": "Height in meters (default: 3 for walls, 0.2 for slabs)"
},
"depth": {
"type": "number",
"description": "Depth in meters (default: 4 for slabs/ceilings/roofs)"
},
"thickness": {
"type": "number",
"description": "Thickness in meters (default: 0.2 for walls, 0.15 for ceilings)"
},
"pitchAngle": {
"type": "number",
"description": "Roof pitch angle in degrees, 0 for flat (default: 30)"
},
"overhang": {
"type": "number",
"description": "Roof overhang in meters (default: 0.3)"
},
"itemType": {
"type": "string",
"enum": [
"door",
"window",
"light-fixture"
],
"description": "Item sub-type (required when type is 'item')"
},
"rotationY": {
"type": "number",
"description": "Rotation around Y axis in radians (default: 0)"
},
"materialId": {
"type": "string",
"description": "Material ID (defaults to architecture material for the element type)"
},
"name": {
"type": "string",
"description": "Display name"
}
},
"required": [
"x",
"y",
"z",
"type"
]
}
}translate_nodesAction
Moves nodes by a relative offset (delta). Does not set absolute position — adds delta to current position.
View tool JSON
{
"name": "translate_nodes",
"kind": "act",
"impl": "imperative",
"description": "Moves nodes by a relative offset (delta). Does not set absolute position — adds delta to current position.",
"inputSchema": {
"type": "object",
"properties": {
"nodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node IDs to move"
},
"dx": {
"type": "number",
"description": "X offset"
},
"dy": {
"type": "number",
"description": "Y offset"
},
"dz": {
"type": "number",
"description": "Z offset"
}
},
"required": [
"nodeIds",
"dx",
"dy",
"dz"
]
}
}set_node_transformAction
Sets a node's absolute position, rotation, and scale.
View tool JSON
{
"name": "set_node_transform",
"kind": "act",
"impl": "imperative",
"description": "Sets a node's absolute position, rotation, and scale.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Node ID"
},
"x": {
"type": "number",
"description": "Absolute X position"
},
"y": {
"type": "number",
"description": "Absolute Y position"
},
"z": {
"type": "number",
"description": "Absolute Z position"
},
"rotationX": {
"type": "number",
"description": "Rotation X in radians"
},
"rotationY": {
"type": "number",
"description": "Rotation Y in radians"
},
"rotationZ": {
"type": "number",
"description": "Rotation Z in radians"
},
"scaleX": {
"type": "number",
"description": "Scale X"
},
"scaleY": {
"type": "number",
"description": "Scale Y"
},
"scaleZ": {
"type": "number",
"description": "Scale Z"
}
},
"required": [
"nodeId",
"x",
"y",
"z"
]
}
}duplicate_nodesAction
Duplicates nodes with a position offset. Returns the new node IDs.
View tool JSON
{
"name": "duplicate_nodes",
"kind": "act",
"impl": "imperative",
"description": "Duplicates nodes with a position offset. Returns the new node IDs.",
"inputSchema": {
"type": "object",
"properties": {
"nodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node IDs to duplicate"
},
"offsetX": {
"type": "number",
"description": "X offset for duplicates"
},
"offsetY": {
"type": "number",
"description": "Y offset for duplicates"
},
"offsetZ": {
"type": "number",
"description": "Z offset for duplicates"
}
},
"required": [
"nodeIds",
"offsetX",
"offsetY",
"offsetZ"
]
}
}mirror_nodesAction
Mirrors (flips) nodes across the specified axis.
View tool JSON
{
"name": "mirror_nodes",
"kind": "act",
"impl": "imperative",
"description": "Mirrors (flips) nodes across the specified axis.",
"inputSchema": {
"type": "object",
"properties": {
"nodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node IDs to mirror"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Axis to mirror across"
}
},
"required": [
"nodeIds",
"axis"
]
}
}delete_nodesSensitive Action
Deletes nodes and/or entities by their IDs. Also removes all children.
View tool JSON
{
"name": "delete_nodes",
"kind": "transact",
"impl": "imperative",
"description": "Deletes nodes and/or entities by their IDs. Also removes all children.",
"inputSchema": {
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node or entity IDs to delete"
}
},
"required": [
"ids"
]
}
}split_brushAction
Legacy brush-only tool. Splits brush nodes at their midpoint along the specified axis. Returns the new node IDs.
View tool JSON
{
"name": "split_brush",
"kind": "act",
"impl": "imperative",
"description": "Legacy brush-only tool. Splits brush nodes at their midpoint along the specified axis. Returns the new node IDs.",
"inputSchema": {
"type": "object",
"properties": {
"nodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Brush node IDs to split"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Axis to split along"
}
},
"required": [
"nodeIds",
"axis"
]
}
}extrude_brushAction
Legacy brush-only tool. Extrudes (grows) brush nodes along an axis by a given amount.
View tool JSON
{
"name": "extrude_brush",
"kind": "act",
"impl": "imperative",
"description": "Legacy brush-only tool. Extrudes (grows) brush nodes along an axis by a given amount.",
"inputSchema": {
"type": "object",
"properties": {
"nodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Brush node IDs"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Extrusion axis"
},
"amount": {
"type": "number",
"description": "Extrusion distance in meters"
},
"direction": {
"type": "string",
"enum": [
"-1",
"1"
],
"description": "Extrusion direction: '-1' (negative) or '1' (positive)"
}
},
"required": [
"nodeIds",
"axis",
"amount",
"direction"
]
}
}offset_brush_faceAction
Legacy brush-only tool. Moves a single face of a brush inward or outward.
View tool JSON
{
"name": "offset_brush_face",
"kind": "act",
"impl": "imperative",
"description": "Legacy brush-only tool. Moves a single face of a brush inward or outward.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Brush node ID"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Face axis"
},
"side": {
"type": "string",
"enum": [
"min",
"max"
],
"description": "Which face (min or max)"
},
"amount": {
"type": "number",
"description": "Offset amount (positive = outward)"
}
},
"required": [
"nodeId",
"axis",
"side",
"amount"
]
}
}assign_material_to_brushesAction
Legacy brush-only tool. Assigns a material to all faces of the specified brush nodes.
View tool JSON
{
"name": "assign_material_to_brushes",
"kind": "act",
"impl": "imperative",
"description": "Legacy brush-only tool. Assigns a material to all faces of the specified brush nodes.",
"inputSchema": {
"type": "object",
"properties": {
"nodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Brush node IDs"
},
"materialId": {
"type": "string",
"description": "Material ID to assign"
}
},
"required": [
"nodeIds",
"materialId"
]
}
}create_materialAction
Creates or updates a material in the scene library. The ID is auto-generated as 'material:custom:<slug>' from the name (e.g. name 'Dark Wood' → id 'material:custom:dark-wood'). You can use this predictable ID immediately in assign_material calls.
View tool JSON
{
"name": "create_material",
"kind": "act",
"impl": "imperative",
"description": "Creates or updates a material in the scene library. The ID is auto-generated as 'material:custom:<slug>' from the name (e.g. name 'Dark Wood' → id 'material:custom:dark-wood'). You can use this predictable ID immediately in assign_material calls.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Material display name"
},
"color": {
"type": "string",
"description": "Hex color (e.g. '#ff6633')"
},
"category": {
"type": "string",
"enum": [
"flat",
"blockout",
"custom"
],
"description": "Material category (default: custom)"
},
"metalness": {
"type": "number",
"description": "Metalness 0-1 (default: 0)"
},
"roughness": {
"type": "number",
"description": "Roughness 0-1 (default: 0.8)"
}
},
"required": [
"name",
"color"
]
}
}assign_materialAction
Assigns a material to nodes (all faces) or specific faces on nodes.
View tool JSON
{
"name": "assign_material",
"kind": "act",
"impl": "imperative",
"description": "Assigns a material to nodes (all faces) or specific faces on nodes.",
"inputSchema": {
"type": "object",
"properties": {
"targets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional face IDs (omit for all faces)"
}
},
"required": [
"nodeId"
]
},
"description": "Nodes (and optional faces) to assign material to"
},
"materialId": {
"type": "string",
"description": "Material ID to assign"
}
},
"required": [
"targets",
"materialId"
]
}
}set_uv_scaleAction
Sets UV texture tiling scale on nodes or specific faces.
View tool JSON
{
"name": "set_uv_scale",
"kind": "act",
"impl": "imperative",
"description": "Sets UV texture tiling scale on nodes or specific faces.",
"inputSchema": {
"type": "object",
"properties": {
"targets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"nodeId": {
"type": "string"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"nodeId"
]
}
},
"scaleX": {
"type": "number",
"description": "UV scale X"
},
"scaleY": {
"type": "number",
"description": "UV scale Y"
}
},
"required": [
"targets",
"scaleX",
"scaleY"
]
}
}group_nodesAction
Groups nodes/entities under a new group node. Returns the group ID.
View tool JSON
{
"name": "group_nodes",
"kind": "act",
"impl": "imperative",
"description": "Groups nodes/entities under a new group node. Returns the group ID.",
"inputSchema": {
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Node/entity IDs to group"
}
},
"required": [
"ids"
]
}
}select_nodesAction
Sets the editor selection to the given node/entity IDs.
View tool JSON
{
"name": "select_nodes",
"kind": "act",
"impl": "imperative",
"description": "Sets the editor selection to the given node/entity IDs.",
"inputSchema": {
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "IDs to select"
}
},
"required": [
"ids"
]
}
}clear_selectionAction
Clears the current editor selection.
View tool JSON
{
"name": "clear_selection",
"kind": "act",
"impl": "imperative",
"description": "Clears the current editor selection.",
"inputSchema": {
"type": "object",
"properties": {}
}
}undoAction
Undoes the last editor command.
View tool JSON
{
"name": "undo",
"kind": "act",
"impl": "imperative",
"description": "Undoes the last editor command.",
"inputSchema": {
"type": "object",
"properties": {}
}
}push_scene_to_connected_gameAction
Pushes the current editor scene into the connected scaffolded game dev server. Use it when the user asks to sync or send the current scene to the game.
View tool JSON
{
"name": "push_scene_to_connected_game",
"kind": "act",
"impl": "imperative",
"description": "Pushes the current editor scene into the connected scaffolded game dev server. Use it when the user asks to sync or send the current scene to the game.",
"inputSchema": {
"type": "object",
"properties": {
"forceSwitch": {
"type": "boolean",
"description": "If true, request the game to reload directly into the pushed scene after syncing."
},
"gameId": {
"type": "string",
"description": "Optional specific connected game ID when more than one game is available."
},
"projectName": {
"type": "string",
"description": "Optional project display name override for the pushed scene."
},
"projectSlug": {
"type": "string",
"description": "Optional slug override for the target scene folder."
}
}
}
}create_articulated_assetAction
Creates a true Articraft-generated articulated 3D asset in the editor viewport by calling the local Articraft Python SDK/compiler, compiling an Articraft model.py into URDF/mesh assets, and importing the result. Use this for objects with semantic parts and joints such as robot arms, desk lamps, cabinets with drawers, vehicles with wheels, doors, lids, sliders, hinges, levers, grippers, and mechanisms.
View tool JSON
{
"name": "create_articulated_asset",
"kind": "act",
"impl": "imperative",
"description": "Creates a true Articraft-generated articulated 3D asset in the editor viewport by calling the local Articraft Python SDK/compiler, compiling an Articraft model.py into URDF/mesh assets, and importing the result. Use this for objects with semantic parts and joints such as robot arms, desk lamps, cabinets with drawers, vehicles with wheels, doors, lids, sliders, hinges, levers, grippers, and mechanisms.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Asset display name, e.g. 'Articulated Desk Lamp'"
},
"prompt": {
"type": "string",
"description": "The original natural-language asset request. Used as Articraft provenance metadata."
},
"x": {
"type": "number",
"description": "Root world X position"
},
"y": {
"type": "number",
"description": "Root world Y position"
},
"z": {
"type": "number",
"description": "Root world Z position"
},
"showJointGuides": {
"type": "boolean",
"description": "Whether to add visible pivot/axis guide primitives for each joint. Default true."
},
"parts": {
"type": "array",
"description": "Semantic parts. Each part becomes a viewport node. Positions are local to parentPartId when provided, otherwise local to the asset root.",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Stable part id such as 'base', 'upper_arm', 'drawer'"
},
"name": {
"type": "string",
"description": "Part display name"
},
"parentPartId": {
"type": "string",
"description": "Optional parent part id. Use 'root' or omit for root-level parts."
},
"semanticRole": {
"type": "string",
"description": "Semantic role such as base, housing, hinge, arm, wheel, drawer, lid, handle, bracket, knob"
},
"shape": {
"type": "string",
"enum": [
"cube",
"box",
"sphere",
"cylinder",
"cone"
],
"description": "Simple viewport primitive shape"
},
"x": {
"type": "number",
"description": "Local X position"
},
"y": {
"type": "number",
"description": "Local Y position"
},
"z": {
"type": "number",
"description": "Local Z position"
},
"sizeX": {
"type": "number",
"description": "Part size along X"
},
"sizeY": {
"type": "number",
"description": "Part size along Y"
},
"sizeZ": {
"type": "number",
"description": "Part size along Z"
},
"rotationX": {
"type": "number",
"description": "Local X rotation in radians"
},
"rotationY": {
"type": "number",
"description": "Local Y rotation in radians"
},
"rotationZ": {
"type": "number",
"description": "Local Z rotation in radians"
},
"pivotX": {
"type": "number",
"description": "Optional local pivot X for hinge/slider previews"
},
"pivotY": {
"type": "number",
"description": "Optional local pivot Y for hinge/slider previews"
},
"pivotZ": {
"type": "number",
"description": "Optional local pivot Z for hinge/slider previews"
},
"materialId": {
"type": "string",
"description": "Existing material id to use"
},
"color": {
"type": "string",
"description": "Hex color if a new material should be created for this part"
},
"metalness": {
"type": "number",
"description": "Optional material metalness 0-1"
},
"roughness": {
"type": "number",
"description": "Optional material roughness 0-1"
},
"mass": {
"type": "number",
"description": "Optional physical mass metadata"
}
},
"required": [
"id",
"name",
"shape",
"x",
"y",
"z",
"sizeX",
"sizeY",
"sizeZ"
]
}
},
"joints": {
"type": "array",
"description": "Articulations between parts, using Articraft/URDF-style conventions: origin is in the parent part frame; axis is in the joint frame; revolute values…",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Stable joint id, e.g. 'base_to_arm'"
},
"name": {
"type": "string",
"description": "Joint display name"
},
"type": {
"type": "string",
"enum": [
"fixed",
"revolute",
"continuous",
"prismatic",
"ball"
],
"description": "Joint/articulation type"
},
"parentPartId": {
"type": "string",
"description": "Parent part id"
},
"childPartId": {
"type": "string",
"description": "Child part id"
},
"originX": {
"type": "number",
"description": "Joint origin X in parent part frame"
},
"originY": {
"type": "number",
"description": "Joint origin Y in parent part frame"
},
"originZ": {
"type": "number",
"description": "Joint origin Z in parent part frame"
},
"axisX": {
"type": "number",
"description": "Joint axis X"
},
"axisY": {
"type": "number",
"description": "Joint axis Y"
},
"axisZ": {
"type": "number",
"description": "Joint axis Z"
},
"lower": {
"type": "number",
"description": "Lower motion limit; radians for revolute, meters for prismatic"
},
"upper": {
"type": "number",
"description": "Upper motion limit; radians for revolute, meters for prismatic"
},
"defaultValue": {
"type": "number",
"description": "Optional default preview value"
},
"effort": {
"type": "number",
"description": "Optional effort limit metadata"
},
"velocity": {
"type": "number",
"description": "Optional velocity limit metadata"
},
"mimicJointId": {
"type": "string",
"description": "Optional source joint id this joint mimics"
},
"mimicMultiplier": {
"type": "number",
"description": "Optional mimic multiplier"
},
"mimicOffset": {
"type": "number",
"description": "Optional mimic offset"
}
},
"required": [
"id",
"type",
"parentPartId",
"childPartId"
]
}
}
},
"required": [
"name",
"parts",
"joints"
]
}
}pose_articulated_jointAction
Sets a preview pose for one articulated asset joint in the viewport. Revolute/continuous values are radians; prismatic values are meters. The pose is stored on the asset metadata and applied from the child part's saved base transform.
View tool JSON
{
"name": "pose_articulated_joint",
"kind": "act",
"impl": "imperative",
"description": "Sets a preview pose for one articulated asset joint in the viewport. Revolute/continuous values are radians; prismatic values are meters. The pose is stored on the asset metadata and applied from the child part's saved base transform.",
"inputSchema": {
"type": "object",
"properties": {
"assetNodeId": {
"type": "string",
"description": "Root articulated asset group node id"
},
"jointId": {
"type": "string",
"description": "Joint id or joint name to pose"
},
"value": {
"type": "number",
"description": "Joint value in radians or meters"
},
"clampToLimits": {
"type": "boolean",
"description": "Clamp value to lower/upper limits when present. Default true."
}
},
"required": [
"assetNodeId",
"jointId",
"value"
]
}
}list_entitiesAnswer
Lists entities in a lightweight form with ID, name, type, and parentId. Use get_entity_details for full data.
View tool JSON
{
"name": "list_entities",
"kind": "answer",
"impl": "imperative",
"description": "Lists entities in a lightweight form with ID, name, type, and parentId. Use get_entity_details for full data.",
"inputSchema": {
"type": "object",
"properties": {}
}
}list_materialsAnswer
Lists all materials in the scene with their ID, name, color, and category.
View tool JSON
{
"name": "list_materials",
"kind": "answer",
"impl": "imperative",
"description": "Lists all materials in the scene with their ID, name, color, and category.",
"inputSchema": {
"type": "object",
"properties": {}
}
}list_scene_pathsAnswer
Lists all scene-level waypoint paths with ids, names, loop state, and points.
View tool JSON
{
"name": "list_scene_paths",
"kind": "answer",
"impl": "imperative",
"description": "Lists all scene-level waypoint paths with ids, names, loop state, and points.",
"inputSchema": {
"type": "object",
"properties": {}
}
}list_scene_eventsAnswer
Lists the standard and custom gameplay events available in the scene.
View tool JSON
{
"name": "list_scene_events",
"kind": "answer",
"impl": "imperative",
"description": "Lists the standard and custom gameplay events available in the scene.",
"inputSchema": {
"type": "object",
"properties": {}
}
}list_hook_typesAnswer
Lists all supported gameplay hook types, including field paths, defaults, emitted events, and listened events.
View tool JSON
{
"name": "list_hook_types",
"kind": "answer",
"impl": "imperative",
"description": "Lists all supported gameplay hook types, including field paths, defaults, emitted events, and listened events.",
"inputSchema": {
"type": "object",
"properties": {}
}
}list_articulated_assetsAnswer
Lists articulated asset roots created in the viewport, including part/joint counts and current pose metadata.
View tool JSON
{
"name": "list_articulated_assets",
"kind": "answer",
"impl": "imperative",
"description": "Lists articulated asset roots created in the viewport, including part/joint counts and current pose metadata.",
"inputSchema": {
"type": "object",
"properties": {}
}
}get_articulated_asset_detailsAnswer
Gets full structured part, joint, pose, and node details for one articulated asset root.
View tool JSON
{
"name": "get_articulated_asset_details",
"kind": "answer",
"impl": "imperative",
"description": "Gets full structured part, joint, pose, and node details for one articulated asset root.",
"inputSchema": {
"type": "object",
"properties": {
"assetNodeId": {
"type": "string",
"description": "Root articulated asset group node id"
}
},
"required": [
"assetNodeId"
]
}
}get_entity_detailsAnswer
Gets full details of a specific entity, including transform, worldTransform, parentId, properties, and hooks.
View tool JSON
{
"name": "get_entity_details",
"kind": "answer",
"impl": "imperative",
"description": "Gets full details of a specific entity, including transform, worldTransform, parentId, properties, and hooks.",
"inputSchema": {
"type": "object",
"properties": {
"entityId": {
"type": "string",
"description": "Entity ID to inspect"
}
},
"required": [
"entityId"
]
}
}create_scene_pathAction
Creates a new scene-level waypoint path. Paths are referenced by hook config such as path_mover.pathId.
View tool JSON
{
"name": "create_scene_path",
"kind": "act",
"impl": "imperative",
"description": "Creates a new scene-level waypoint path. Paths are referenced by hook config such as path_mover.pathId.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Optional explicit path id"
},
"name": {
"type": "string",
"description": "Display name"
},
"loop": {
"type": "boolean",
"description": "Whether the path loops"
},
"points": {
"type": "array",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"z": {
"type": "number"
}
},
"required": [
"x",
"y",
"z"
]
},
"description": "Waypoint points in world space"
}
},
"required": [
"name",
"points"
]
}
}update_scene_pathAction
Updates a scene path by replacing any provided fields such as name, loop, or points.
View tool JSON
{
"name": "update_scene_path",
"kind": "act",
"impl": "imperative",
"description": "Updates a scene path by replacing any provided fields such as name, loop, or points.",
"inputSchema": {
"type": "object",
"properties": {
"pathId": {
"type": "string",
"description": "Path id to update"
},
"name": {
"type": "string",
"description": "New display name"
},
"loop": {
"type": "boolean",
"description": "Whether the path loops"
},
"points": {
"type": "array",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"z": {
"type": "number"
}
},
"required": [
"x",
"y",
"z"
]
},
"description": "Replacement waypoint points in world space"
}
},
"required": [
"pathId"
]
}
}delete_scene_pathSensitive Action
Deletes a scene-level waypoint path.
View tool JSON
{
"name": "delete_scene_path",
"kind": "transact",
"impl": "imperative",
"description": "Deletes a scene-level waypoint path.",
"inputSchema": {
"type": "object",
"properties": {
"pathId": {
"type": "string",
"description": "Path id to delete"
}
},
"required": [
"pathId"
]
}
}add_hookAction
Attaches a gameplay hook to a node or entity using the canonical default config for that hook type, then applies any provided config overrides.
View tool JSON
{
"name": "add_hook",
"kind": "act",
"impl": "imperative",
"description": "Attaches a gameplay hook to a node or entity using the canonical default config for that hook type, then applies any provided config overrides.",
"inputSchema": {
"type": "object",
"properties": {
"targetKind": {
"type": "string",
"enum": [
"node",
"entity"
],
"description": "Whether the hook attaches to a node or entity"
},
"targetId": {
"type": "string",
"description": "Node or entity id"
},
"hookType": {
"type": "string",
"description": "Hook type. Use list_hook_types to inspect supported types."
},
"enabled": {
"type": "boolean",
"description": "Whether the hook starts enabled"
},
"defaultPathId": {
"type": "string",
"description": "Optional default path id for path_mover hooks"
},
"config": {
"type": "object",
"additionalProperties": true,
"description": "Optional config override object merged into the canonical default config"
}
},
"required": [
"targetKind",
"targetId",
"hookType"
]
}
}set_hook_valueAction
Sets a specific hook config value by dot path on an existing node/entity hook.
View tool JSON
{
"name": "set_hook_value",
"kind": "act",
"impl": "imperative",
"description": "Sets a specific hook config value by dot path on an existing node/entity hook.",
"inputSchema": {
"type": "object",
"properties": {
"targetKind": {
"type": "string",
"enum": [
"node",
"entity"
],
"description": "Whether the hook is on a node or entity"
},
"targetId": {
"type": "string",
"description": "Node or entity id"
},
"hookId": {
"type": "string",
"description": "Hook id to edit"
},
"path": {
"type": "string",
"description": "Dot path inside hook.config, for example 'pathId' or 'trigger.event'"
},
"value": {
"description": "New value to write at the config path"
}
},
"required": [
"targetKind",
"targetId",
"hookId",
"path",
"value"
]
}
}remove_hookAction
Removes a gameplay hook from a node or entity.
View tool JSON
{
"name": "remove_hook",
"kind": "act",
"impl": "imperative",
"description": "Removes a gameplay hook from a node or entity.",
"inputSchema": {
"type": "object",
"properties": {
"targetKind": {
"type": "string",
"enum": [
"node",
"entity"
],
"description": "Whether the hook is on a node or entity"
},
"targetId": {
"type": "string",
"description": "Node or entity id"
},
"hookId": {
"type": "string",
"description": "Hook id to remove"
}
},
"required": [
"targetKind",
"targetId",
"hookId"
]
}
}list_behavior_treesAnswer
Lists locally saved behavior trees from the AI Behavior Tree Editor.
View tool JSON
{
"name": "list_behavior_trees",
"kind": "answer",
"impl": "imperative",
"description": "Lists locally saved behavior trees from the AI Behavior Tree Editor.",
"inputSchema": {
"type": "object",
"properties": {}
}
}get_behavior_treeAnswer
Gets the full nodes and edges for a saved behavior tree by id.
View tool JSON
{
"name": "get_behavior_tree",
"kind": "answer",
"impl": "imperative",
"description": "Gets the full nodes and edges for a saved behavior tree by id.",
"inputSchema": {
"type": "object",
"properties": {
"treeId": {
"type": "string",
"description": "Behavior tree id"
}
},
"required": [
"treeId"
]
}
}create_behavior_treeAction
Creates a new behavior tree in local storage. By default it starts with a root node only. Set useDefaultTemplate to true for the starter attack/patrol example tree.
View tool JSON
{
"name": "create_behavior_tree",
"kind": "act",
"impl": "imperative",
"description": "Creates a new behavior tree in local storage. By default it starts with a root node only. Set useDefaultTemplate to true for the starter attack/patrol example tree.",
"inputSchema": {
"type": "object",
"properties": {
"treeId": {
"type": "string",
"description": "Optional requested tree id. If omitted, one is derived from the name."
},
"name": {
"type": "string",
"description": "Tree display name"
},
"useDefaultTemplate": {
"type": "boolean",
"description": "Whether to start from the built-in sample tree instead of an empty root-only tree"
}
},
"required": [
"name"
]
}
}add_behavior_tree_nodeAction
Adds a node to a behavior tree, optionally connecting it under a parent node.
View tool JSON
{
"name": "add_behavior_tree_node",
"kind": "act",
"impl": "imperative",
"description": "Adds a node to a behavior tree, optionally connecting it under a parent node.",
"inputSchema": {
"type": "object",
"properties": {
"treeId": {
"type": "string",
"description": "Behavior tree id"
},
"nodeType": {
"type": "string",
"enum": [
"root",
"selector",
"sequence",
"parallel",
"inverter",
"repeater",
"condition",
"action"
],
"description": "Behavior tree node type"
},
"label": {
"type": "string",
"description": "Optional node label"
},
"parentNodeId": {
"type": "string",
"description": "Optional parent node id to connect from"
},
"positionX": {
"type": "number",
"description": "Optional canvas X position"
},
"positionY": {
"type": "number",
"description": "Optional canvas Y position"
},
"event": {
"type": "string",
"description": "Condition event name"
},
"mode": {
"type": "string",
"enum": [
"allOf",
"anyOf"
],
"description": "Condition mode"
},
"actionType": {
"type": "string",
"description": "Action type, usually emit"
},
"actionTarget": {
"type": "string",
"description": "Action target/event name"
},
"actionValue": {
"type": "string",
"description": "Optional action value"
},
"count": {
"type": "number",
"description": "Repeater count"
}
},
"required": [
"treeId",
"nodeType"
]
}
}update_behavior_tree_nodeAction
Updates label, behavior data, or canvas position for an existing behavior tree node.
View tool JSON
{
"name": "update_behavior_tree_node",
"kind": "act",
"impl": "imperative",
"description": "Updates label, behavior data, or canvas position for an existing behavior tree node.",
"inputSchema": {
"type": "object",
"properties": {
"treeId": {
"type": "string",
"description": "Behavior tree id"
},
"nodeId": {
"type": "string",
"description": "Node id"
},
"label": {
"type": "string",
"description": "Updated node label"
},
"event": {
"type": "string",
"description": "Condition event name"
},
"mode": {
"type": "string",
"enum": [
"allOf",
"anyOf"
],
"description": "Condition mode"
},
"actionType": {
"type": "string",
"description": "Action type"
},
"actionTarget": {
"type": "string",
"description": "Action target/event name"
},
"actionValue": {
"type": "string",
"description": "Optional action value"
},
"count": {
"type": "number",
"description": "Repeater count"
},
"positionX": {
"type": "number",
"description": "Canvas X position"
},
"positionY": {
"type": "number",
"description": "Canvas Y position"
}
},
"required": [
"treeId",
"nodeId"
]
}
}connect_behavior_tree_nodesAction
Creates a directed edge from one behavior tree node to another.
View tool JSON
{
"name": "connect_behavior_tree_nodes",
"kind": "act",
"impl": "imperative",
"description": "Creates a directed edge from one behavior tree node to another.",
"inputSchema": {
"type": "object",
"properties": {
"treeId": {
"type": "string",
"description": "Behavior tree id"
},
"sourceNodeId": {
"type": "string",
"description": "Parent/source node id"
},
"targetNodeId": {
"type": "string",
"description": "Child/target node id"
}
},
"required": [
"treeId",
"sourceNodeId",
"targetNodeId"
]
}
}delete_behavior_tree_nodeSensitive Action
Deletes a node and any connected edges from a behavior tree.
View tool JSON
{
"name": "delete_behavior_tree_node",
"kind": "transact",
"impl": "imperative",
"description": "Deletes a node and any connected edges from a behavior tree.",
"inputSchema": {
"type": "object",
"properties": {
"treeId": {
"type": "string",
"description": "Behavior tree id"
},
"nodeId": {
"type": "string",
"description": "Node id"
}
},
"required": [
"treeId",
"nodeId"
]
}
}apply_behavior_tree_layoutAction
Automatically lays out the nodes in a behavior tree.
View tool JSON
{
"name": "apply_behavior_tree_layout",
"kind": "act",
"impl": "imperative",
"description": "Automatically lays out the nodes in a behavior tree.",
"inputSchema": {
"type": "object",
"properties": {
"treeId": {
"type": "string",
"description": "Behavior tree id"
}
},
"required": [
"treeId"
]
}
}delete_behavior_treeSensitive Action
Deletes a saved behavior tree from local storage.
View tool JSON
{
"name": "delete_behavior_tree",
"kind": "transact",
"impl": "imperative",
"description": "Deletes a saved behavior tree from local storage.",
"inputSchema": {
"type": "object",
"properties": {
"treeId": {
"type": "string",
"description": "Behavior tree id"
}
},
"required": [
"treeId"
]
}
}get_mesh_topologyAnswer
Returns the face IDs, vertex IDs with positions, face centers, face normals, and edges for a mesh node. Use this before mesh editing operations to discover which faces/vertices/edges to target.
View tool JSON
{
"name": "get_mesh_topology",
"kind": "answer",
"impl": "imperative",
"description": "Returns the face IDs, vertex IDs with positions, face centers, face normals, and edges for a mesh node. Use this before mesh editing operations to discover which faces/vertices/edges to target.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID to inspect"
}
},
"required": [
"nodeId"
]
}
}extrude_mesh_facesAction
Extrude one or more faces of a mesh node along their normal by an amount. Use get_mesh_topology first to find face IDs.
View tool JSON
{
"name": "extrude_mesh_faces",
"kind": "act",
"impl": "imperative",
"description": "Extrude one or more faces of a mesh node along their normal by an amount. Use get_mesh_topology first to find face IDs.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to extrude"
},
"amount": {
"type": "number",
"description": "Extrusion distance in meters (positive = outward)"
}
},
"required": [
"nodeId",
"faceIds",
"amount"
]
}
}extrude_mesh_edgeAction
Extrude a boundary edge of a mesh outward, creating a new quad face.
View tool JSON
{
"name": "extrude_mesh_edge",
"kind": "act",
"impl": "imperative",
"description": "Extrude a boundary edge of a mesh outward, creating a new quad face.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"vertexId1": {
"type": "string",
"description": "First vertex ID of the edge"
},
"vertexId2": {
"type": "string",
"description": "Second vertex ID of the edge"
},
"amount": {
"type": "number",
"description": "Extrusion distance"
}
},
"required": [
"nodeId",
"vertexId1",
"vertexId2",
"amount"
]
}
}bevel_mesh_edgesAction
Bevel (chamfer/round) edges of a mesh. Creates smooth transitions at sharp edges.
View tool JSON
{
"name": "bevel_mesh_edges",
"kind": "act",
"impl": "imperative",
"description": "Bevel (chamfer/round) edges of a mesh. Creates smooth transitions at sharp edges.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"edges": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Edges as [[vertexId1, vertexId2], ...] pairs"
},
"width": {
"type": "number",
"description": "Bevel width in meters"
},
"steps": {
"type": "number",
"description": "Number of bevel segments (1=flat chamfer, 3+=smooth round)"
},
"profile": {
"type": "string",
"enum": [
"flat",
"round"
],
"description": "Bevel profile shape (default: flat)"
}
},
"required": [
"nodeId",
"edges",
"width",
"steps"
]
}
}inset_mesh_facesAction
Inset selected faces to create an inner face loop. Use it for panel lines, door/window frames, and prep before extrusion.
View tool JSON
{
"name": "inset_mesh_faces",
"kind": "act",
"impl": "imperative",
"description": "Inset selected faces to create an inner face loop. Use it for panel lines, door/window frames, and prep before extrusion.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to inset"
},
"amount": {
"type": "number",
"description": "Inset amount in meters"
}
},
"required": [
"nodeId",
"faceIds",
"amount"
]
}
}bridge_mesh_edgesAction
Bridge two selected boundary edges with a new face. Use get_mesh_topology first and pass exactly two edge pairs.
View tool JSON
{
"name": "bridge_mesh_edges",
"kind": "act",
"impl": "imperative",
"description": "Bridge two selected boundary edges with a new face. Use get_mesh_topology first and pass exactly two edge pairs.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"edges": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Two edges as [[vertexId1, vertexId2], [vertexId3, vertexId4]]"
}
},
"required": [
"nodeId",
"edges"
]
}
}poke_mesh_facesAction
Poke selected faces into triangles from a new center vertex. Useful for radial detail, peaks, and controlled triangulation.
View tool JSON
{
"name": "poke_mesh_faces",
"kind": "act",
"impl": "imperative",
"description": "Poke selected faces into triangles from a new center vertex. Useful for radial detail, peaks, and controlled triangulation.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to poke"
}
},
"required": [
"nodeId",
"faceIds"
]
}
}triangulate_mesh_facesAction
Triangulate selected faces, or all faces when faceIds is omitted. Useful before runtime baking or cleanup.
View tool JSON
{
"name": "triangulate_mesh_faces",
"kind": "act",
"impl": "imperative",
"description": "Triangulate selected faces, or all faces when faceIds is omitted. Useful before runtime baking or cleanup.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional face IDs to triangulate"
}
},
"required": [
"nodeId"
]
}
}quadrangulate_mesh_facesAction
Attempt to rebuild selected triangle pairs into quads. Use after triangulation or cleanup when quad authoring is preferred.
View tool JSON
{
"name": "quadrangulate_mesh_faces",
"kind": "act",
"impl": "imperative",
"description": "Attempt to rebuild selected triangle pairs into quads. Use after triangulation or cleanup when quad authoring is preferred.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to quadrangulate"
}
},
"required": [
"nodeId",
"faceIds"
]
}
}solidify_meshAction
Add shell thickness to a mesh as a one-shot topology edit. Prefer add_mesh_modeling_modifier type=solidify for live/non-destructive work.
View tool JSON
{
"name": "solidify_mesh",
"kind": "act",
"impl": "imperative",
"description": "Add shell thickness to a mesh as a one-shot topology edit. Prefer add_mesh_modeling_modifier type=solidify for live/non-destructive work.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"thickness": {
"type": "number",
"description": "Shell thickness in meters"
}
},
"required": [
"nodeId",
"thickness"
]
}
}mirror_meshAction
Mirror a mesh across one local axis as a one-shot topology edit. Prefer the modeling stack for reusable symmetry.
View tool JSON
{
"name": "mirror_mesh",
"kind": "act",
"impl": "imperative",
"description": "Mirror a mesh across one local axis as a one-shot topology edit. Prefer the modeling stack for reusable symmetry.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Mirror axis"
}
},
"required": [
"nodeId",
"axis"
]
}
}weld_mesh_vertices_by_distanceAction
Merge vertices within a distance threshold. Use for cleanup after boolean, bridge, mirror, import, or remesh-style edits.
View tool JSON
{
"name": "weld_mesh_vertices_by_distance",
"kind": "act",
"impl": "imperative",
"description": "Merge vertices within a distance threshold. Use for cleanup after boolean, bridge, mirror, import, or remesh-style edits.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"vertexIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional vertex IDs to restrict the weld"
},
"distance": {
"type": "number",
"description": "Maximum merge distance in meters"
}
},
"required": [
"nodeId",
"distance"
]
}
}weld_mesh_vertices_to_targetAction
Target-weld source vertices into one target vertex. Use for precise cleanup and snapping holes shut.
View tool JSON
{
"name": "weld_mesh_vertices_to_target",
"kind": "act",
"impl": "imperative",
"description": "Target-weld source vertices into one target vertex. Use for precise cleanup and snapping holes shut.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"targetVertexId": {
"type": "string",
"description": "Vertex ID that receives the weld"
},
"sourceVertexIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Vertex IDs to merge into the target"
}
},
"required": [
"nodeId",
"targetVertexId",
"sourceVertexIds"
]
}
}subdivide_mesh_faceAction
Subdivide a mesh face into smaller faces. Quad faces get a grid pattern, others get radial.
View tool JSON
{
"name": "subdivide_mesh_face",
"kind": "act",
"impl": "imperative",
"description": "Subdivide a mesh face into smaller faces. Quad faces get a grid pattern, others get radial.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceId": {
"type": "string",
"description": "Face ID to subdivide"
},
"cuts": {
"type": "number",
"description": "Number of cuts (1=2x2 for quads, 2=3x3, etc.)"
}
},
"required": [
"nodeId",
"faceId",
"cuts"
]
}
}cut_mesh_faceAction
Cut a mesh face with a line passing through a point, splitting it into two faces.
View tool JSON
{
"name": "cut_mesh_face",
"kind": "act",
"impl": "imperative",
"description": "Cut a mesh face with a line passing through a point, splitting it into two faces.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceId": {
"type": "string",
"description": "Face ID to cut"
},
"pointX": {
"type": "number",
"description": "X coordinate of cut point on the face"
},
"pointY": {
"type": "number",
"description": "Y coordinate"
},
"pointZ": {
"type": "number",
"description": "Z coordinate"
},
"snapSize": {
"type": "number",
"description": "Snap resolution (default: 1)"
}
},
"required": [
"nodeId",
"faceId",
"pointX",
"pointY",
"pointZ"
]
}
}cut_mesh_between_edgesAction
Knife-cut a polygon by connecting the midpoints of two non-adjacent edges on the same face.
View tool JSON
{
"name": "cut_mesh_between_edges",
"kind": "act",
"impl": "imperative",
"description": "Knife-cut a polygon by connecting the midpoints of two non-adjacent edges on the same face.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"edges": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Exactly two non-adjacent edges as [[vertexId1, vertexId2], [vertexId3, vertexId4]]"
}
},
"required": [
"nodeId",
"edges"
]
}
}delete_mesh_facesSensitive Action
Delete faces from a mesh, leaving real holes. Use only for intentional openings to empty space or adjacent voids, not as a shortcut for doorway- or hallway-sized passages.
View tool JSON
{
"name": "delete_mesh_faces",
"kind": "transact",
"impl": "imperative",
"description": "Delete faces from a mesh, leaving real holes. Use only for intentional openings to empty space or adjacent voids, not as a shortcut for doorway- or hallway-sized passages.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to delete"
}
},
"required": [
"nodeId",
"faceIds"
]
}
}merge_mesh_facesAction
Merge adjacent coplanar faces into a single face.
View tool JSON
{
"name": "merge_mesh_faces",
"kind": "act",
"impl": "imperative",
"description": "Merge adjacent coplanar faces into a single face.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to merge (must be coplanar and adjacent)"
}
},
"required": [
"nodeId",
"faceIds"
]
}
}merge_mesh_verticesAction
Merge multiple vertices to their average position.
View tool JSON
{
"name": "merge_mesh_vertices",
"kind": "act",
"impl": "imperative",
"description": "Merge multiple vertices to their average position.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"vertexIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Vertex IDs to merge"
}
},
"required": [
"nodeId",
"vertexIds"
]
}
}translate_mesh_verticesAction
Translate selected mesh vertices in world space. Use this to reposition a cap or face region after cutting or extruding.
View tool JSON
{
"name": "translate_mesh_vertices",
"kind": "act",
"impl": "imperative",
"description": "Translate selected mesh vertices in world space. Use this to reposition a cap or face region after cutting or extruding.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"vertexIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Vertex IDs to move"
},
"offsetX": {
"type": "number",
"description": "World X offset in meters"
},
"offsetY": {
"type": "number",
"description": "World Y offset in meters"
},
"offsetZ": {
"type": "number",
"description": "World Z offset in meters"
}
},
"required": [
"nodeId",
"vertexIds",
"offsetX",
"offsetY",
"offsetZ"
]
}
}scale_mesh_verticesAction
Scale selected mesh vertices around their centroid or an optional pivot. Use this to widen or narrow an extruded cap before the next extrusion.
View tool JSON
{
"name": "scale_mesh_vertices",
"kind": "act",
"impl": "imperative",
"description": "Scale selected mesh vertices around their centroid or an optional pivot. Use this to widen or narrow an extruded cap before the next extrusion.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"vertexIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Vertex IDs to scale"
},
"scaleX": {
"type": "number",
"description": "World-axis scale factor around the pivot for X"
},
"scaleY": {
"type": "number",
"description": "World-axis scale factor around the pivot for Y"
},
"scaleZ": {
"type": "number",
"description": "World-axis scale factor around the pivot for Z"
},
"pivotX": {
"type": "number",
"description": "Optional pivot X. Defaults to the selected vertices centroid."
},
"pivotY": {
"type": "number",
"description": "Optional pivot Y. Defaults to the selected vertices centroid."
},
"pivotZ": {
"type": "number",
"description": "Optional pivot Z. Defaults to the selected vertices centroid."
}
},
"required": [
"nodeId",
"vertexIds",
"scaleX",
"scaleY",
"scaleZ"
]
}
}fill_mesh_faceAction
Create a new face from a loop of boundary vertices, filling a hole in the mesh.
View tool JSON
{
"name": "fill_mesh_face",
"kind": "act",
"impl": "imperative",
"description": "Create a new face from a loop of boundary vertices, filling a hole in the mesh.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"vertexIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Vertex IDs forming the boundary loop (>=3, must be boundary vertices)"
}
},
"required": [
"nodeId",
"vertexIds"
]
}
}invert_mesh_normalsAction
Flip face normals (winding order) on selected or all faces of a mesh.
View tool JSON
{
"name": "invert_mesh_normals",
"kind": "act",
"impl": "imperative",
"description": "Flip face normals (winding order) on selected or all faces of a mesh.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to invert (omit for all faces)"
}
},
"required": [
"nodeId"
]
}
}arc_mesh_edgesAction
Curve straight edges into arcs by inserting interpolated vertices.
View tool JSON
{
"name": "arc_mesh_edges",
"kind": "act",
"impl": "imperative",
"description": "Curve straight edges into arcs by inserting interpolated vertices.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"edges": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Edges as [[vertexId1, vertexId2], ...] pairs"
},
"offset": {
"type": "number",
"description": "Arc height/offset in meters"
},
"segments": {
"type": "number",
"description": "Number of arc segments (minimum 2)"
}
},
"required": [
"nodeId",
"edges",
"offset",
"segments"
]
}
}inflate_meshAction
Move all vertices of mesh nodes along their averaged normals (inflate/deflate).
View tool JSON
{
"name": "inflate_mesh",
"kind": "act",
"impl": "imperative",
"description": "Move all vertices of mesh nodes along their averaged normals (inflate/deflate).",
"inputSchema": {
"type": "object",
"properties": {
"nodeIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Mesh node IDs"
},
"factor": {
"type": "number",
"description": "Inflate factor (positive = outward, negative = inward)"
}
},
"required": [
"nodeIds",
"factor"
]
}
}convert_brush_to_meshAction
Convert a legacy brush node into an editable mesh node, enabling the preferred face/edge/vertex editing workflow.
View tool JSON
{
"name": "convert_brush_to_mesh",
"kind": "act",
"impl": "imperative",
"description": "Convert a legacy brush node into an editable mesh node, enabling the preferred face/edge/vertex editing workflow.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Brush node ID to convert"
}
},
"required": [
"nodeId"
]
}
}capture_mesh_modeling_baseAction
Capture the current mesh topology as the base for a live/non-destructive modeling stack.
View tool JSON
{
"name": "capture_mesh_modeling_base",
"kind": "act",
"impl": "imperative",
"description": "Capture the current mesh topology as the base for a live/non-destructive modeling stack.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
}
},
"required": [
"nodeId"
]
}
}rebuild_mesh_modeling_stackAction
Re-evaluate the mesh modeling stack from its captured base topology and current modifiers.
View tool JSON
{
"name": "rebuild_mesh_modeling_stack",
"kind": "act",
"impl": "imperative",
"description": "Re-evaluate the mesh modeling stack from its captured base topology and current modifiers.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
}
},
"required": [
"nodeId"
]
}
}add_mesh_modeling_modifierAction
Add a live/non-destructive modeling modifier. Supports boolean, mirror, solidify, lattice, remesh, and retopo modifiers.
View tool JSON
{
"name": "add_mesh_modeling_modifier",
"kind": "act",
"impl": "imperative",
"description": "Add a live/non-destructive modeling modifier. Supports boolean, mirror, solidify, lattice, remesh, and retopo modifiers.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"type": {
"type": "string",
"enum": [
"boolean",
"mirror",
"solidify",
"lattice",
"remesh",
"retopo"
],
"description": "Modifier type"
},
"label": {
"type": "string",
"description": "Display label"
},
"enabled": {
"type": "boolean",
"description": "Whether the modifier is enabled"
},
"operation": {
"type": "string",
"enum": [
"union",
"difference",
"intersect"
],
"description": "Boolean operation"
},
"targetNodeId": {
"type": "string",
"description": "Boolean target mesh node ID"
},
"mode": {
"type": "string",
"description": "Boolean mode apply/live, lattice mode bend/twist/taper/shear, or remesh mode cleanup/quad/voxel"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Mirror/lattice axis"
},
"weld": {
"type": "boolean",
"description": "Mirror weld/symmetry weld toggle"
},
"thickness": {
"type": "number",
"description": "Solidify thickness in meters"
},
"intensity": {
"type": "number",
"description": "Lattice intensity"
},
"falloff": {
"type": "number",
"description": "Lattice falloff"
},
"resolution": {
"type": "number",
"description": "Remesh resolution"
},
"smoothing": {
"type": "number",
"description": "Remesh smoothing amount"
},
"weldDistance": {
"type": "number",
"description": "Cleanup weld distance"
},
"preserveBorders": {
"type": "boolean",
"description": "Retopo preserve-border toggle"
},
"targetFaceCount": {
"type": "number",
"description": "Retopo target face count"
}
},
"required": [
"nodeId",
"type"
]
}
}update_mesh_modeling_modifierAction
Update fields on an existing live modeling modifier by modifierId.
View tool JSON
{
"name": "update_mesh_modeling_modifier",
"kind": "act",
"impl": "imperative",
"description": "Update fields on an existing live modeling modifier by modifierId.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"modifierId": {
"type": "string",
"description": "Modifier ID to update"
},
"label": {
"type": "string",
"description": "Display label"
},
"enabled": {
"type": "boolean",
"description": "Whether the modifier is enabled"
},
"operation": {
"type": "string",
"enum": [
"union",
"difference",
"intersect"
],
"description": "Boolean operation"
},
"targetNodeId": {
"type": "string",
"description": "Boolean target mesh node ID"
},
"mode": {
"type": "string",
"description": "Boolean, lattice, or remesh mode"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Mirror/lattice axis"
},
"weld": {
"type": "boolean",
"description": "Mirror weld/symmetry weld toggle"
},
"thickness": {
"type": "number",
"description": "Solidify thickness in meters"
},
"intensity": {
"type": "number",
"description": "Lattice intensity"
},
"falloff": {
"type": "number",
"description": "Lattice falloff"
},
"resolution": {
"type": "number",
"description": "Remesh resolution"
},
"smoothing": {
"type": "number",
"description": "Remesh smoothing amount"
},
"weldDistance": {
"type": "number",
"description": "Cleanup weld distance"
},
"preserveBorders": {
"type": "boolean",
"description": "Retopo preserve-border toggle"
},
"targetFaceCount": {
"type": "number",
"description": "Retopo target face count"
}
},
"required": [
"nodeId",
"modifierId"
]
}
}remove_mesh_modeling_modifierAction
Remove a live/non-destructive modeling modifier from a mesh.
View tool JSON
{
"name": "remove_mesh_modeling_modifier",
"kind": "act",
"impl": "imperative",
"description": "Remove a live/non-destructive modeling modifier from a mesh.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"modifierId": {
"type": "string",
"description": "Modifier ID to remove"
}
},
"required": [
"nodeId",
"modifierId"
]
}
}set_mesh_symmetryAction
Enable or update live symmetry settings for a mesh modeling stack.
View tool JSON
{
"name": "set_mesh_symmetry",
"kind": "act",
"impl": "imperative",
"description": "Enable or update live symmetry settings for a mesh modeling stack.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"enabled": {
"type": "boolean",
"description": "Whether symmetry is enabled"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Symmetry mirror axis"
},
"weld": {
"type": "boolean",
"description": "Whether symmetry should weld mirrored seams"
}
},
"required": [
"nodeId"
]
}
}create_mesh_polygroupAction
Create a PolyGroup/face group from selected face IDs for material IDs, retopo regions, LOD planning, and bake masks.
View tool JSON
{
"name": "create_mesh_polygroup",
"kind": "act",
"impl": "imperative",
"description": "Create a PolyGroup/face group from selected face IDs for material IDs, retopo regions, LOD planning, and bake masks.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to include"
},
"name": {
"type": "string",
"description": "Group display name"
},
"groupId": {
"type": "string",
"description": "Optional stable group ID"
},
"color": {
"type": "string",
"description": "Hex color for the group"
}
},
"required": [
"nodeId",
"faceIds"
]
}
}assign_faces_to_mesh_polygroupAction
Add more face IDs to an existing PolyGroup.
View tool JSON
{
"name": "assign_faces_to_mesh_polygroup",
"kind": "act",
"impl": "imperative",
"description": "Add more face IDs to an existing PolyGroup.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"groupId": {
"type": "string",
"description": "Existing PolyGroup ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to add"
}
},
"required": [
"nodeId",
"groupId",
"faceIds"
]
}
}create_mesh_smoothing_groupAction
Create a smoothing group over selected faces with a target smoothing angle.
View tool JSON
{
"name": "create_mesh_smoothing_group",
"kind": "act",
"impl": "imperative",
"description": "Create a smoothing group over selected faces with a target smoothing angle.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to include"
},
"name": {
"type": "string",
"description": "Group display name"
},
"groupId": {
"type": "string",
"description": "Optional stable group ID"
},
"angle": {
"type": "number",
"description": "Smoothing angle in degrees"
}
},
"required": [
"nodeId",
"faceIds"
]
}
}set_mesh_lod_profilesAction
Author LOD targets for runtime export. Pass profiles with ratios/faceCounts, or ratios for generated profiles.
View tool JSON
{
"name": "set_mesh_lod_profiles",
"kind": "act",
"impl": "imperative",
"description": "Author LOD targets for runtime export. Pass profiles with ratios/faceCounts, or ratios for generated profiles.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"ratios": {
"type": "array",
"items": {
"type": "number"
},
"description": "LOD reduction ratios such as [0.7, 0.4, 0.18]"
},
"profiles": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"ratio": {
"type": "number"
},
"faceCount": {
"type": "number"
}
}
},
"description": "Explicit LOD profiles"
}
},
"required": [
"nodeId"
]
}
}queue_mesh_bake_outputsAction
Queue bake-map output slots for runtime asset production: normals, AO, curvature, ID masks, and vertex colors.
View tool JSON
{
"name": "queue_mesh_bake_outputs",
"kind": "act",
"impl": "imperative",
"description": "Queue bake-map output slots for runtime asset production: normals, AO, curvature, ID masks, and vertex colors.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"kinds": {
"type": "array",
"items": {
"type": "string",
"enum": [
"normals",
"ao",
"curvature",
"id-mask",
"vertex-colors"
]
},
"description": "Bake map kinds to queue"
},
"resolution": {
"type": "number",
"description": "Bake texture resolution, default 2048"
},
"sourceGroupId": {
"type": "string",
"description": "Optional PolyGroup/source group ID"
},
"replaceExisting": {
"type": "boolean",
"description": "Replace existing queued outputs for the same kind, default true"
}
},
"required": [
"nodeId",
"kinds"
]
}
}unwrap_mesh_uvsAction
Create or replace explicit UVs on mesh faces using smart unwrap, planar, box, or cylindrical projection.
View tool JSON
{
"name": "unwrap_mesh_uvs",
"kind": "act",
"impl": "imperative",
"description": "Create or replace explicit UVs on mesh faces using smart unwrap, planar, box, or cylindrical projection.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional face IDs; omit for whole mesh"
},
"mode": {
"type": "string",
"enum": [
"smart",
"planar",
"box",
"cylindrical"
],
"description": "UV unwrap/projection mode"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Projection axis for planar/cylindrical modes"
},
"angleThresholdDegrees": {
"type": "number",
"description": "Smart unwrap hard-edge seam angle, default 66"
},
"margin": {
"type": "number",
"description": "Packing margin 0-0.2, default 0.02"
},
"scaleU": {
"type": "number",
"description": "U scale for projection"
},
"scaleV": {
"type": "number",
"description": "V scale for projection"
},
"offsetU": {
"type": "number",
"description": "U offset for projection"
},
"offsetV": {
"type": "number",
"description": "V offset for projection"
}
},
"required": [
"nodeId",
"mode"
]
}
}pack_mesh_uvsAction
Pack existing mesh UV islands into 0-1 UV space with deterministic shelf packing.
View tool JSON
{
"name": "pack_mesh_uvs",
"kind": "act",
"impl": "imperative",
"description": "Pack existing mesh UV islands into 0-1 UV space with deterministic shelf packing.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional face IDs; omit for whole mesh"
},
"margin": {
"type": "number",
"description": "Island margin, default 0.02"
}
},
"required": [
"nodeId"
]
}
}mark_mesh_uv_seamsAction
Mark UV seams using vertex-id edge pairs. Use list_mesh_topology first to inspect vertex IDs and edges.
View tool JSON
{
"name": "mark_mesh_uv_seams",
"kind": "act",
"impl": "imperative",
"description": "Mark UV seams using vertex-id edge pairs. Use list_mesh_topology first to inspect vertex IDs and edges.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"edges": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Edges as [[vertexId1, vertexId2], ...]"
},
"append": {
"type": "boolean",
"description": "Append to existing seams, default true"
}
},
"required": [
"nodeId",
"edges"
]
}
}normalize_mesh_texel_densityAction
Scale selected face UVs to a target texel density for game-production texture consistency.
View tool JSON
{
"name": "normalize_mesh_texel_density",
"kind": "act",
"impl": "imperative",
"description": "Scale selected face UVs to a target texel density for game-production texture consistency.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional face IDs; omit for whole mesh"
},
"pixelsPerMeter": {
"type": "number",
"description": "Target pixels per meter, default 512"
},
"textureResolution": {
"type": "number",
"description": "Texture resolution in pixels, default 1024"
}
},
"required": [
"nodeId"
]
}
}paint_mesh_face_materialAction
Assign a material to mesh faces and register it as a mesh-local material slot.
View tool JSON
{
"name": "paint_mesh_face_material",
"kind": "act",
"impl": "imperative",
"description": "Assign a material to mesh faces and register it as a mesh-local material slot.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to paint; omit for all faces"
},
"materialId": {
"type": "string",
"description": "Material ID from list_materials"
}
},
"required": [
"nodeId",
"materialId"
]
}
}paint_mesh_vertex_colorAction
Paint RGBA vertex colors onto mesh face corners. Hex color is easiest, e.g. #ff8844.
View tool JSON
{
"name": "paint_mesh_vertex_color",
"kind": "act",
"impl": "imperative",
"description": "Paint RGBA vertex colors onto mesh face corners. Hex color is easiest, e.g. #ff8844.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to paint; omit for all faces"
},
"color": {
"type": "string",
"description": "Hex color such as #ffffff"
},
"r": {
"type": "number",
"description": "Red 0-1 when not using color"
},
"g": {
"type": "number",
"description": "Green 0-1 when not using color"
},
"b": {
"type": "number",
"description": "Blue 0-1 when not using color"
},
"alpha": {
"type": "number",
"description": "Alpha 0-1, default 1"
},
"strength": {
"type": "number",
"description": "Paint strength 0-1, default 1"
}
},
"required": [
"nodeId"
]
}
}add_mesh_surface_blend_layerAction
Add or update one of the mesh's up-to-4 PBR texture blend layers, usually from an existing material.
View tool JSON
{
"name": "add_mesh_surface_blend_layer",
"kind": "act",
"impl": "imperative",
"description": "Add or update one of the mesh's up-to-4 PBR texture blend layers, usually from an existing material.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"layerId": {
"type": "string",
"description": "Stable blend layer ID. Defaults to blend:<materialId>"
},
"materialId": {
"type": "string",
"description": "Existing material ID to copy color/textures from"
},
"name": {
"type": "string",
"description": "Layer display name"
},
"color": {
"type": "string",
"description": "Fallback layer color"
},
"colorTexture": {
"type": "string",
"description": "Color texture URL/data URI"
},
"normalTexture": {
"type": "string",
"description": "Normal texture URL/data URI"
},
"metalnessTexture": {
"type": "string",
"description": "Metalness texture URL/data URI"
},
"roughnessTexture": {
"type": "string",
"description": "Roughness texture URL/data URI"
},
"metalness": {
"type": "number",
"description": "Layer metalness 0-1"
},
"roughness": {
"type": "number",
"description": "Layer roughness 0-1"
}
},
"required": [
"nodeId"
]
}
}paint_mesh_texture_blendAction
Paint normalized per-corner weights for a mesh surface blend layer.
View tool JSON
{
"name": "paint_mesh_texture_blend",
"kind": "act",
"impl": "imperative",
"description": "Paint normalized per-corner weights for a mesh surface blend layer.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Face IDs to paint; omit for all faces"
},
"layerId": {
"type": "string",
"description": "Blend layer ID to paint"
},
"strength": {
"type": "number",
"description": "Paint strength 0-1, default 1"
}
},
"required": [
"nodeId",
"layerId"
]
}
}add_mesh_projected_decalAction
Add a live projected decal record to a mesh for editor and runtime overlay rendering.
View tool JSON
{
"name": "add_mesh_projected_decal",
"kind": "act",
"impl": "imperative",
"description": "Add a live projected decal record to a mesh for editor and runtime overlay rendering.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh node ID"
},
"decalId": {
"type": "string",
"description": "Optional stable decal ID"
},
"name": {
"type": "string",
"description": "Decal display name"
},
"materialId": {
"type": "string",
"description": "Optional material ID to copy texture/color from"
},
"texture": {
"type": "string",
"description": "Optional decal texture URL/data URI"
},
"color": {
"type": "string",
"description": "Fallback decal color"
},
"blendMode": {
"type": "string",
"enum": [
"normal",
"multiply",
"add"
],
"description": "Decal blend mode"
},
"opacity": {
"type": "number",
"description": "Opacity 0-1"
},
"x": {
"type": "number",
"description": "Local projected decal center X"
},
"y": {
"type": "number",
"description": "Local projected decal center Y"
},
"z": {
"type": "number",
"description": "Local projected decal center Z"
},
"normalX": {
"type": "number",
"description": "Projection normal X"
},
"normalY": {
"type": "number",
"description": "Projection normal Y"
},
"normalZ": {
"type": "number",
"description": "Projection normal Z"
},
"upX": {
"type": "number",
"description": "Decal up vector X"
},
"upY": {
"type": "number",
"description": "Decal up vector Y"
},
"upZ": {
"type": "number",
"description": "Decal up vector Z"
},
"sizeX": {
"type": "number",
"description": "Decal width in mesh-local units"
},
"sizeY": {
"type": "number",
"description": "Decal height in mesh-local units"
},
"depth": {
"type": "number",
"description": "Projection depth"
},
"faceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional target face IDs"
}
},
"required": [
"nodeId",
"x",
"y",
"z",
"normalX",
"normalY",
"normalZ",
"sizeX",
"sizeY"
]
}
}split_brush_at_coordinateAction
Split a brush node at an exact world coordinate along an axis (more precise than split_brush which only splits at the midpoint).
View tool JSON
{
"name": "split_brush_at_coordinate",
"kind": "act",
"impl": "imperative",
"description": "Split a brush node at an exact world coordinate along an axis (more precise than split_brush which only splits at the midpoint).",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Brush node ID"
},
"axis": {
"type": "string",
"enum": [
"x",
"y",
"z"
],
"description": "Axis to split along"
},
"coordinate": {
"type": "number",
"description": "World coordinate to split at"
}
},
"required": [
"nodeId",
"axis",
"coordinate"
]
}
}terrain_add_csg_volumeAction
Adds a non-destructive cutter volume to the terrain: a box, sphere, cylinder or capsule that carves the surface where it overlaps, for caves, arches and overhangs. The volume stays live in the modifier stack, so it can be moved, resized or removed later without rebaking the landform. Prefer this over terrain_carve_tunnel when the opening is a chamber rather than a passage.
View tool JSON
{
"name": "terrain_add_csg_volume",
"kind": "act",
"impl": "imperative",
"description": "Adds a non-destructive cutter volume to the terrain: a box, sphere, cylinder or capsule that carves the surface where it overlaps, for caves, arches and overhangs. The volume stays live in the modifier stack, so it can be moved, resized or removed later without rebaking the landform. Prefer this over terrain_carve_tunnel when the opening is a chamber rather than a passage.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."
},
"operation": {
"type": "string",
"enum": [
"subtract",
"add"
],
"description": "\"subtract\" (default) removes the volumes from the terrain solid; \"add\" unions them into it."
},
"volumes": {
"type": "array",
"description": "The volumes to combine with the terrain. Fields other than `kind` and the shared surface fields apply only to the kinds named in their description.",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"capsule",
"ellipsoid",
"box",
"sweep"
],
"description": "Volume shape. `capsule` is a swept sphere between two points -- passages, tubes, and windows punched through a fin. `ellipsoid` is a rotated ellipsoid -- round for a chamber, flattened for a cliff undercut. `box` is a rotated box, for the straight-walled reaches of a slot canyon. `sweep` is a chain of elliptical rings, for one continuously varying cave shell."
},
"startX": {
"type": "number",
"description": "capsule: world X of the capsule axis start, in meters"
},
"startY": {
"type": "number",
"description": "capsule: world Y of the capsule axis start, in meters"
},
"startZ": {
"type": "number",
"description": "capsule: world Z of the capsule axis start, in meters"
},
"endX": {
"type": "number",
"description": "capsule: world X of the capsule axis end, in meters"
},
"endY": {
"type": "number",
"description": "capsule: world Y of the capsule axis end, in meters"
},
"endZ": {
"type": "number",
"description": "capsule: world Z of the capsule axis end, in meters"
},
"radiusMeters": {
"type": "number",
"description": "capsule: sphere radius swept along the axis, in meters"
},
"centerX": {
"type": "number",
"description": "ellipsoid and box: world X of the volume center, in meters"
},
"centerY": {
"type": "number",
"description": "ellipsoid and box: world Y of the volume center, in meters"
},
"centerZ": {
"type": "number",
"description": "ellipsoid and box: world Z of the volume center, in meters"
},
"radiusX": {
"type": "number",
"description": "ellipsoid: half-extent along the local forward axis, in meters"
},
"radiusY": {
"type": "number",
"description": "ellipsoid: half-extent along local up, in meters. Make this small relative to radiusX and radiusZ to undercut a cliff."
},
"radiusZ": {
"type": "number",
"description": "ellipsoid: half-extent along the local side axis, in meters"
},
"halfExtentX": {
"type": "number",
"description": "box: half-size along the local forward axis, in meters"
},
"halfExtentY": {
"type": "number",
"description": "box: half-size along local up, in meters"
},
"halfExtentZ": {
"type": "number",
"description": "box: half-size along the local side axis, in meters"
},
"forwardX": {
"type": "number",
"description": "ellipsoid and box: world direction the local +X axis points along. Defaults to (1,0,0)."
},
"forwardY": {
"type": "number",
"description": "ellipsoid and box: forward direction Y"
},
"forwardZ": {
"type": "number",
"description": "ellipsoid and box: forward direction Z"
},
"upX": {
"type": "number",
"description": "ellipsoid and box: optional world up reference, X. Defaults to (0,1,0)."
},
"upY": {
"type": "number",
"description": "ellipsoid and box: optional world up reference, Y"
},
"upZ": {
"type": "number",
"description": "ellipsoid and box: optional world up reference, Z"
},
"rings": {
"type": "array",
"description": "sweep: ordered elliptical cross-sections defining one continuous void. Three or more rings give a passage that widens and narrows convincingly.",
"items": {
"type": "object",
"properties": {
"x": {
"type": "number",
"description": "World X of the ring center, in meters"
},
"y": {
"type": "number",
"description": "World Y of the ring center, in meters"
},
"z": {
"type": "number",
"description": "World Z of the ring center, in meters"
},
"horizontalRadius": {
"type": "number",
"description": "Ring half-width in meters"
},
"verticalRadius": {
"type": "number",
"description": "Ring half-height in meters. Below the horizontal radius it reads as a bedding-plane crawl; above it, as a rift."
}
},
"required": [
"x",
"y",
"z",
"horizontalRadius",
"verticalRadius"
]
}
},
"surface": {
"type": "string",
"enum": [
"cave",
"arch",
"overhang",
"canyon",
"hoodoo",
"default",
"none"
],
"description": "Displacement character applied to the cut face before the boolean runs. Pick the one that matches what the volume is for; \"none\" leaves an analytic, machined-looking surface and is only right for engineered geometry."
},
"noise": {
"type": "number",
"description": "Relative cross-section roughness, 0 or more. 0 is smooth."
},
"noiseScale": {
"type": "number",
"description": "World-space wavelength of the close-surface roughness, in meters."
},
"interior": {
"type": "string",
"enum": [
"rock",
"ember"
],
"description": "Material classification for the faces this subtraction exposes."
}
},
"required": [
"kind"
]
}
}
},
"required": [
"volumes"
]
}
}terrain_refine_densityAction
Locally raises mesh density on a terrain so a following sculpt stroke or CSG cut has enough vertices to resolve detail. Terrain starts at a density tuned for kilometre-scale relief, so fine work -- a cave mouth, a trail cut, a rock shelf -- needs refinement first or it will come out mushy. Use "tessellate" to subdivide in place, and "remesh" to rebuild the region at an even edge length when repeated sculpting has left stretched triangles. All distances are meters.
View tool JSON
{
"name": "terrain_refine_density",
"kind": "act",
"impl": "imperative",
"description": "Locally raises mesh density on a terrain so a following sculpt stroke or CSG cut has enough vertices to resolve detail. Terrain starts at a density tuned for kilometre-scale relief, so fine work -- a cave mouth, a trail cut, a rock shelf -- needs refinement first or it will come out mushy. Use \"tessellate\" to subdivide in place, and \"remesh\" to rebuild the region at an even edge length when repeated sculpting has left stretched triangles. All distances are meters.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."
},
"mode": {
"type": "string",
"enum": [
"tessellate",
"remesh"
],
"description": "\"tessellate\" (default) subdivides existing triangles inside the sphere. \"remesh\" rebuilds them toward a uniform edge length, which also relaxes…"
},
"x": {
"type": "number",
"description": "World X of the refinement sphere center, in meters"
},
"y": {
"type": "number",
"description": "World Y of the refinement sphere center, in meters"
},
"z": {
"type": "number",
"description": "World Z of the refinement sphere center, in meters"
},
"radiusMeters": {
"type": "number",
"description": "Radius of the refined region in meters. Cover the whole area of the planned edit plus a margin."
},
"targetEdgeLengthMeters": {
"type": "number",
"description": "Desired triangle edge length in meters inside the region. A cave mouth wants roughly 0.5-2 m; a hillside 5-20 m. Smaller values cost geometry quickly."
}
},
"required": [
"x",
"y",
"z",
"radiusMeters",
"targetEdgeLengthMeters"
]
}
}terrain_set_material_channelsAction
Renames, recolours, or sets roughness on a mesh terrain's four material channels. The channels are fixed at four and cannot be added to; this tool decides what they mean. Do this before painting so the channel names in `terrain_paint_weights` match the biome the user asked for.
View tool JSON
{
"name": "terrain_set_material_channels",
"kind": "act",
"impl": "imperative",
"description": "Renames, recolours, or sets roughness on a mesh terrain's four material channels. The channels are fixed at four and cannot be added to; this tool decides what they mean. Do this before painting so the channel names in `terrain_paint_weights` match the biome the user asked for.",
"inputSchema": {
"type": "object",
"properties": {
"nodeId": {
"type": "string",
"description": "Mesh terrain node ID. Omit when the scene contains exactly one mesh terrain."
},
"channels": {
"type": "array",
"description": "The channels to change. Omit any channel to leave it as it is.",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"enum": [
"channel0",
"channel1",
"channel2",
"channel3"
],
"description": "Which channel this entry configures"
},
"name": {
"type": "string",
"description": "Display name, for example \"Alpine Grass\", \"Scree\", \"Wet Sand\""
},
"color": {
"type": "string",
"description": "Base colour as a hex string such as \"#4f7d32\""
},
"roughness": {
"type": "number",
"description": "Surface roughness 0-1. Rock and soil sit near 0.85-0.95; wet stone and packed snow sit lower, near 0.6-0.7."
}
},
"required": [
"id"
]
}
}
},
"required": [
"channels"
]
}
}generate_street_gridAction
Lays out a street grid: avenues, cross streets, junctions, kerbs and footways, conformed to the terrain. This is the ground a city stands on -- blocks and buildings are derived from it, so run this before either. Block proportion matters more than block size; the default 80m by 275m is roughly Manhattan, and long thin blocks are most of what makes a grid read as a city rather than as graph paper. Replaces any existing network.
View tool JSON
{
"name": "generate_street_grid",
"kind": "act",
"impl": "imperative",
"description": "Lays out a street grid: avenues, cross streets, junctions, kerbs and footways, conformed to the terrain. This is the ground a city stands on -- blocks and buildings are derived from it, so run this before either. Block proportion matters more than block size; the default 80m by 275m is roughly Manhattan, and long thin blocks are most of what makes a grid read as a city rather than as graph paper. Replaces any existing network.",
"inputSchema": {
"type": "object",
"properties": {
"columns": {
"type": "number",
"description": "Blocks along x. 4 to 12 is a neighbourhood; above 20 gets heavy."
},
"rows": {
"type": "number",
"description": "Blocks along z."
},
"blockWidth": {
"type": "number",
"description": "Block interior width in meters, across the short side. Defaults to 80."
},
"blockDepth": {
"type": "number",
"description": "Block interior depth in meters, along the long side. Defaults to 275."
},
"centerX": {
"type": "number",
"description": "Grid centre x in world meters. Defaults to 0."
},
"centerZ": {
"type": "number",
"description": "Grid centre z in world meters. Defaults to 0."
},
"arterialEvery": {
"type": "number",
"description": "Every nth avenue is a wide arterial. Defaults to 4; 0 makes every street the same width, which reads flatter."
},
"rotation": {
"type": "number",
"description": "Rotation of the whole grid in degrees, so it need not align to the world axes."
}
},
"required": [
"columns",
"rows"
]
}
}get_street_networkAnswer
Reports the street network: how many junctions and segments exist, the bounding extent, and a sample of segments with their widths and classes. Call before editing so changes are made against what is actually there.
View tool JSON
{
"name": "get_street_network",
"kind": "answer",
"impl": "imperative",
"description": "Reports the street network: how many junctions and segments exist, the bounding extent, and a sample of segments with their widths and classes. Call before editing so changes are made against what is actually there.",
"inputSchema": {
"type": "object",
"properties": {}
}
}add_streetAction
Joins two junctions with a new street, creating either junction if it does not exist yet. Use it to extend a generated grid, cut a diagonal avenue across it, or build a network by hand. The road class sets width and footways unless overridden.
View tool JSON
{
"name": "add_street",
"kind": "act",
"impl": "imperative",
"description": "Joins two junctions with a new street, creating either junction if it does not exist yet. Use it to extend a generated grid, cut a diagonal avenue across it, or build a network by hand. The road class sets width and footways unless overridden.",
"inputSchema": {
"type": "object",
"properties": {
"fromX": {
"type": "number",
"description": "Start junction x in world meters."
},
"fromZ": {
"type": "number",
"description": "Start junction z in world meters."
},
"toX": {
"type": "number",
"description": "End junction x in world meters."
},
"toZ": {
"type": "number",
"description": "End junction z in world meters."
},
"roadClass": {
"type": "string",
"enum": [
"arterial",
"street",
"alley"
],
"description": "arterial is a wide multi-lane avenue, street is the ordinary case, alley is narrow with no footways. Defaults to street."
},
"width": {
"type": "number",
"description": "Carriageway width in meters, kerb to kerb, overriding the class default."
},
"sidewalkWidth": {
"type": "number",
"description": "Footway width in meters per side. 0 removes footways."
}
},
"required": [
"fromX",
"fromZ",
"toX",
"toZ"
]
}
}add_crosswalkAction
Paints a zebra crossing across one existing street segment. Use get_street_network first to choose a segment. The crossing follows the compiled road surface and terrain.
View tool JSON
{
"name": "add_crosswalk",
"kind": "act",
"impl": "imperative",
"description": "Paints a zebra crossing across one existing street segment. Use get_street_network first to choose a segment. The crossing follows the compiled road surface and terrain.",
"inputSchema": {
"type": "object",
"properties": {
"segmentId": {
"type": "string",
"description": "Source street segment that owns the crossing."
},
"position": {
"type": "number",
"description": "Position from 0 at the segment start to 1 at its end. Defaults to 0.5."
},
"width": {
"type": "number",
"description": "Crossing length along the street in metres. Defaults to 4."
}
},
"required": [
"segmentId"
]
}
}clear_street_networkAction
Removes every street and junction. The terrain and everything else in the scene are untouched.
View tool JSON
{
"name": "clear_street_network",
"kind": "act",
"impl": "imperative",
"description": "Removes every street and junction. The terrain and everything else in the scene are untouched.",
"inputSchema": {
"type": "object",
"properties": {}
}
}generate_city_massingAction
Fills the street grid's blocks with building volumes. Divides each block into lots with street frontage, then extrudes each lot to a height, so buildings stand shoulder to shoulder along the street with a shared interior behind. This is the stage that decides a city's silhouette -- skyline, street wall, where the towers cluster -- and it renders as flat coloured boxes rather than finished facades. Requires a street network; run generate_street_grid first.
View tool JSON
{
"name": "generate_city_massing",
"kind": "act",
"impl": "imperative",
"description": "Fills the street grid's blocks with building volumes. Divides each block into lots with street frontage, then extrudes each lot to a height, so buildings stand shoulder to shoulder along the street with a shared interior behind. This is the stage that decides a city's silhouette -- skyline, street wall, where the towers cluster -- and it renders as flat coloured boxes rather than finished facades. Requires a street network; run generate_street_grid first.",
"inputSchema": {
"type": "object",
"properties": {
"lotWidth": {
"type": "number",
"description": "Target street frontage per building in meters. Defaults to 18. Smaller reads as townhouses, larger as apartment blocks."
},
"lotDepth": {
"type": "number",
"description": "How far back from the street a building reaches, in meters. Defaults to 24. Clamped so two rows on a shallow block cannot overlap."
},
"minStoreys": {
"type": "number",
"description": "Fewest storeys for a building at the edge of the city. Defaults to 2."
},
"maxStoreys": {
"type": "number",
"description": "Most storeys for a building at the centre. Defaults to 12."
},
"storeyHeight": {
"type": "number",
"description": "Floor-to-floor height in meters. Defaults to 3.4."
},
"centerX": {
"type": "number",
"description": "Where the tall buildings cluster, x in world meters. Defaults to 0."
},
"centerZ": {
"type": "number",
"description": "Where the tall buildings cluster, z in world meters. Defaults to 0."
},
"falloffRadius": {
"type": "number",
"description": "How far from the centre height falls off, in meters. Defaults to 400. Large values make the city uniformly tall."
},
"setback": {
"type": "number",
"description": "Extra gap between the footway and the building line, in meters. 0 (default) is a dense downtown; larger values suburbanise it."
},
"seed": {
"type": "number",
"description": "Seed for lot widths and heights. The same seed rebuilds the same city."
}
}
}
}clear_city_massingAction
Removes every building volume, leaving the street network in place.
View tool JSON
{
"name": "clear_city_massing",
"kind": "act",
"impl": "imperative",
"description": "Removes every building volume, leaving the street network in place.",
"inputSchema": {
"type": "object",
"properties": {}
}
}generate_city_buildingsAction
Replaces the tallest massing volumes with real buildings: limestone banks, setback towers and corner headquarters, with colonnades, windows, cornices and roof equipment. Only a few dozen are generated because each costs around 140,000 triangles, so they stand as landmarks among the massing boxes rather than replacing all of them -- which is what a downtown looks like anyway. Requires massing; run generate_city_massing first.
View tool JSON
{
"name": "generate_city_buildings",
"kind": "act",
"impl": "imperative",
"description": "Replaces the tallest massing volumes with real buildings: limestone banks, setback towers and corner headquarters, with colonnades, windows, cornices and roof equipment. Only a few dozen are generated because each costs around 140,000 triangles, so they stand as landmarks among the massing boxes rather than replacing all of them -- which is what a downtown looks like anyway. Requires massing; run generate_city_massing first.",
"inputSchema": {
"type": "object",
"properties": {
"count": {
"type": "number",
"description": "How many landmarks to generate, tallest lots first. Defaults to 12. Above about 40 the viewport slows noticeably."
},
"coverage": {
"type": "number",
"description": "Fraction of lots to build instead of a fixed count, 0 to 1. Whichever of this and `count` is smaller wins. Defaults to 0.08."
},
"seed": {
"type": "number",
"description": "Seed for materials and proportions. The same seed rebuilds the same buildings."
}
}
}
}clear_city_buildingsAction
Removes the generated landmark buildings. The massing boxes they replaced come back, and streets are untouched.
View tool JSON
{
"name": "clear_city_buildings",
"kind": "act",
"impl": "imperative",
"description": "Removes the generated landmark buildings. The massing boxes they replaced come back, and streets are untouched.",
"inputSchema": {
"type": "object",
"properties": {}
}
}configure_forest_fieldAction
Changes a forest field's shape and stand settings. `feather` is the number that matters most: it is the depth in meters over which the stand thins out at its boundary, and a hard edge is what makes a painted forest read as a decal rather than a place. Twenty to forty meters reads as a real wood; zero reads as a surveyed line. Marks the field dirty.
View tool JSON
{
"name": "configure_forest_field",
"kind": "act",
"impl": "imperative",
"description": "Changes a forest field's shape and stand settings. `feather` is the number that matters most: it is the depth in meters over which the stand thins out at its boundary, and a hard edge is what makes a painted forest read as a decal rather than a place. Twenty to forty meters reads as a real wood; zero reads as a surveyed line. Marks the field dirty.",
"inputSchema": {
"type": "object",
"properties": {
"fieldId": {
"type": "string",
"description": "Forest field ID. Omit when exactly one field exists."
},
"preset": {
"type": "string",
"enum": [
"mossy-old-growth",
"temperate-mixed",
"ancient-oak-grove",
"boreal-conifer",
"primeval-redwood",
"tropical-wet",
"palm-oasis",
"savanna",
"arid-woodland"
],
"description": "Change the stand type."
},
"density": {
"type": "number",
"description": "Multiplier on the preset's stems per hectare. 1 is the preset's own figure; fields open at 0.6 because a full-density stand over a couple of hundred…"
},
"feather": {
"type": "number",
"description": "Meters the stand fades across at its boundary. 20-40 for a natural wood."
},
"width": {
"type": "number",
"description": "Half-width in meters of an open belt. Ignored when the field is a closed loop."
},
"closed": {
"type": "boolean",
"description": "Whether the spline encloses an area (true) or is a belt (false)."
},
"seed": {
"type": "number",
"description": "Layout seed. Change it to reshuffle the same stand into a different arrangement."
},
"visible": {
"type": "boolean",
"description": "Whether the stand draws in the viewport."
},
"name": {
"type": "string",
"description": "Rename the field."
}
}
}
}delete_forest_fieldSensitive Action
Removes a forest field and the stand grown from it.
View tool JSON
{
"name": "delete_forest_field",
"kind": "transact",
"impl": "imperative",
"description": "Removes a forest field and the stand grown from it.",
"inputSchema": {
"type": "object",
"properties": {
"fieldId": {
"type": "string",
"description": "Forest field ID."
}
},
"required": [
"fieldId"
]
}
}