Editor MCP assistant tool definitions for terrain operations. Exposes two MCP tools: TerrainSculpt and TerrainPaint, which call TerrainSculptDriver.Sculpt and TerrainSculptDriver.PaintSplat and return JSON-encoded outcomes.
#nullable enable
using System;
using System.ComponentModel;
using Sandbox;
namespace Editor.Mcp
{
public static partial class SboxMcpAssistant
{
[McpTool( "pocketknife_terrain_sculpt" )]
public static string TerrainSculpt(
[Description( "Terrain GameObject name (defaults to first in scene)" )] string? terrainQuery = null,
[Description( "Operation: procedural_generate, flatten, smooth" )] string operation = "procedural_generate",
[Description( "Algorithm: perlin, crater, terrace" )] string algorithm = "perlin",
[Description( "Scale frequency factor" )] float scale = 1.0f,
[Description( "Height amplitude" )] float height = 1000.0f,
[Description( "Noise roughness factor" )] float roughness = 0.5f )
{
try
{
return McpJson.Write( TerrainSculptDriver.Sculpt( terrainQuery, operation, algorithm, scale, height, roughness ) );
}
catch ( Exception ex )
{
return McpJson.Write( ToolOutcome<object>.Failure( null, ToolStatus.Failed, "terrain.sculpt_failed", "Terrain sculpting failed.", ex ) );
}
}
[McpTool( "pocketknife_terrain_paint" )]
public static string TerrainPaint(
[Description( "Terrain GameObject name" )] string? terrainQuery = null,
[Description( "Surface UV X coordinate (0.0 - 1.0)" )] float uvX = 0.5f,
[Description( "Surface UV Y coordinate (0.0 - 1.0)" )] float uvY = 0.5f,
[Description( "Target splat material layer index (0 to 3)" )] int splatChannel = 0,
[Description( "Brush world radius" )] float brushSize = 64.0f,
[Description( "Paint opacity (0.0 - 1.0)" )] float opacity = 1.0f )
{
try
{
return McpJson.Write( TerrainSculptDriver.PaintSplat( terrainQuery, new Vector2( uvX, uvY ), splatChannel, brushSize, opacity ) );
}
catch ( Exception ex )
{
return McpJson.Write( ToolOutcome<object>.Failure( null, ToolStatus.Failed, "terrain.paint_failed", "Terrain splat painting failed.", ex ) );
}
}
}
}