{"ok":true,"method":"POST","supportedTools":[{"key":"BufferTool","name":"Buffer","description":"Makes a buffer around the input layer","parameters":[{"name":"Input Layer","description":"The input layer to buffer","type":"dropdown","defaultValue":""},{"name":"Distance","description":"The distance","type":"float","defaultValue":10},{"name":"Units","description":"The units for the distance","type":"dropdown","defaultValue":"miles","options":["feet","miles","kilometers","degrees"]}],"headless":true,"stateMode":"layers","execution":{"stateMode":"layers","inputs":[{"parameter":"Input Layer","kind":"layer","geometryTypes":["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],"cardinality":"one","selectionAware":true}],"outputs":[{"kind":"layer","operation":"add","geometryType":"Polygon"}],"mutatesState":true,"producesArtifacts":false}},{"key":"ExportTool","name":"Export","description":"Export data","parameters":[{"name":"Layer","description":"layer to export","type":"dropdown","defaultValue":""},{"name":"Format","description":"format to export","type":"dropdown","defaultValue":"geojson"}],"headless":true,"stateMode":"layers","execution":{"stateMode":"layers","inputs":[{"parameter":"Layer","kind":"layer","geometryTypes":["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],"cardinality":"one","selectionAware":true}],"outputs":[{"kind":"artifact","operation":"create","artifactType":"download"}],"mutatesState":false,"producesArtifacts":true}},{"key":"GroupTool","name":"Group","description":"Groups nearby features by distance and adds the grouped result as a new layer","parameters":[{"name":"Layer","description":"layer to group","type":"dropdown","defaultValue":""},{"name":"Distance","description":"distance threshold","type":"float","defaultValue":10,"min":0},{"name":"Units","description":"The units for the distance","type":"dropdown","defaultValue":"kilometers","options":["feet","miles","kilometers","degrees"]}],"headless":true,"stateMode":"layers","execution":{"stateMode":"layers","inputs":[{"parameter":"Layer","kind":"layer","geometryTypes":["Point","MultiPoint"],"cardinality":"one","selectionAware":true}],"outputs":[{"kind":"layer","operation":"add","geometryType":"Point"}],"mutatesState":true,"producesArtifacts":false}},{"key":"RandomPointsTool","name":"Random Points","description":"Adds random points within selected polygon","parameters":[{"name":"Points Count","description":"Number of random points to generate.","type":"int","defaultValue":10},{"name":"Inside Polygon","description":"Generate points inside polygon","type":"boolean","defaultValue":false},{"name":"Polygon","description":"Polygon to add random points within.","type":"dropdown","defaultValue":""}],"headless":true,"stateMode":"layers","execution":{"stateMode":"layers","inputs":[{"parameter":"Polygon","kind":"layer","geometryTypes":["Polygon","MultiPolygon"],"cardinality":"one","selectionAware":false,"when":{"parameter":"Inside Polygon","equals":true}}],"outputs":[{"kind":"layer","operation":"add","geometryType":"Point"}],"mutatesState":true,"producesArtifacts":false}},{"key":"SelectByAttributeTool","name":"Select by Attribute","description":"Selects features using an attribute condition","parameters":[{"name":"Layer","description":"Layer to query","type":"dropdown","defaultValue":""},{"name":"Field","description":"Attribute field to query","type":"text","defaultValue":""},{"name":"Operator","description":"Attribute comparison","type":"dropdown","defaultValue":"equals","options":["equals","not equals","contains","starts with","ends with","greater than","less than","is empty","is not empty"]},{"name":"Value","description":"Value to compare","type":"text","defaultValue":""},{"name":"Selection Mode","description":"How to apply matching features","type":"dropdown","defaultValue":"replace","options":["replace","add","remove"]}],"headless":true,"stateMode":"layers","execution":{"stateMode":"layers","inputs":[{"parameter":"Layer","kind":"layer","geometryTypes":["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],"cardinality":"one","selectionAware":false}],"outputs":[{"kind":"selection","operation":"update"}],"mutatesState":true,"producesArtifacts":false}},{"key":"ClipTool","name":"Clip","description":"Clips polygon features by a boundary layer","parameters":[{"name":"Input Layer","description":"Layer to clip","type":"dropdown","defaultValue":""},{"name":"Clip Layer","description":"Polygon layer used as the boundary","type":"dropdown","defaultValue":""}],"headless":true,"stateMode":"layers","execution":{"stateMode":"layers","inputs":[{"parameter":"Input Layer","kind":"layer","geometryTypes":["Polygon","MultiPolygon"],"cardinality":"one","selectionAware":true},{"parameter":"Clip Layer","kind":"layer","geometryTypes":["Polygon","MultiPolygon"],"cardinality":"one","selectionAware":false}],"outputs":[{"kind":"layer","operation":"add","geometryType":"Polygon"}],"mutatesState":true,"producesArtifacts":false}},{"key":"EraseTool","name":"Erase","description":"Erases polygon features using a boundary layer","parameters":[{"name":"Input Layer","description":"Layer to erase from","type":"dropdown","defaultValue":""},{"name":"Erase Layer","description":"Polygon layer used to erase","type":"dropdown","defaultValue":""}],"headless":true,"stateMode":"layers","execution":{"stateMode":"layers","inputs":[{"parameter":"Input Layer","kind":"layer","geometryTypes":["Polygon","MultiPolygon"],"cardinality":"one","selectionAware":true},{"parameter":"Erase Layer","kind":"layer","geometryTypes":["Polygon","MultiPolygon"],"cardinality":"one","selectionAware":false}],"outputs":[{"kind":"layer","operation":"add","geometryType":"Polygon"}],"mutatesState":true,"producesArtifacts":false}},{"key":"AddAIGeneratedFieldTool","name":"Add AI-Generated Field","description":"Generate a new attribute field from existing feature attributes using AI","parameters":[{"name":"Input Layer","description":"The input layer to enrich","type":"dropdown","defaultValue":""},{"name":"Source Fields","description":"Comma-separated source fields to send to AI","type":"text","defaultValue":""},{"name":"Instruction","description":"The instruction used to generate the new field","type":"text","defaultValue":""},{"name":"Output Field Name","description":"The field to write","type":"text","defaultValue":""},{"name":"Output Type","description":"The output field type","type":"dropdown","defaultValue":"text","options":["text","number","boolean"]},{"name":"Overwrite Existing Field","description":"Overwrite existing values in the output field","type":"boolean","defaultValue":false}],"headless":true,"stateMode":"featureCollection","execution":{"stateMode":"featureCollection","inputs":[{"kind":"featureCollection","geometryTypes":["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],"cardinality":"many","selectionAware":true}],"outputs":[{"kind":"featureCollection","operation":"update","geometryType":"preserved"}],"mutatesState":true,"producesArtifacts":false}},{"key":"ConvertTextToNumericTool","name":"Convert Text to Numeric","description":"Convert text-like numeric attributes into numeric values","parameters":[{"name":"Input Layer","description":"The input layer to convert","type":"dropdown","defaultValue":""},{"name":"Input Field Name","description":"The text field to parse","type":"text","defaultValue":""},{"name":"Output Field Name","description":"The numeric field to write","type":"text","defaultValue":""},{"name":"Overwrite Existing Field","description":"Overwrite existing values in the output field","type":"boolean","defaultValue":false},{"name":"Use AI Fallback","description":"Use AI when rules-based parsing fails","type":"boolean","defaultValue":true}],"headless":true,"stateMode":"featureCollection","execution":{"stateMode":"featureCollection","inputs":[{"kind":"featureCollection","geometryTypes":["Point","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon"],"cardinality":"many","selectionAware":true}],"outputs":[{"kind":"featureCollection","operation":"update","geometryType":"preserved"}],"mutatesState":true,"producesArtifacts":false}}],"spatial":{"crs":"EPSG:4326","coordinateOrder":"longitude,latitude","engine":"@turf/turf","measurementModel":"geodesic/web-oriented","precision":"not-survey-grade","warnings":[]},"notes":["First pass: headless execution is currently limited to tools that are safe without the browser UI.","Send request state.layers with stable ids and GeoJSON so params can reference them.","Optional dataset references are supported via state.layers[].datasetRef handles created by /api/datasets.","Layer-state tools use state.layers; featureCollection tools use state.featureCollection.","Tool validation failures return HTTP 200 with ok: false; unsupported tools and malformed API requests return 4xx.","GeoJSON coordinates are interpreted as EPSG:4326 longitude/latitude values and are suitable for lightweight web/runtime analysis, not survey-grade measurement."],"requestShape":{"tool":"BufferTool","params":{"Input Layer":"source-layer","Distance":5,"Units":"miles"},"state":{"layers":[{"id":"source-layer","name":"Source Layer","geojson":{"type":"FeatureCollection","features":[]}},{"id":"source-layer-ref","datasetRef":"dataset://abc123"}],"bbox":[-118.5,33.5,-117.5,34.5]}}}