Servidor MCP

Hydrata - ANUGA Flood Simulation

com.hydrata/hydrata-mcp-server
Nube e infraestructura Ciencia e ingeniería Público y accesible MCP 2025-11-25

Qué hace este MCP

Creates and manages ANUGA flood simulation projects, imports terrain and geospatial inputs, builds scenarios, runs simulations, and retrieves progress and results on cloud infrastructure.

attach_input_layer
Attach Input Layer
Attach a GeoJSON you uploaded to GeoNode as the project's boundary, friction, inflow, rainfall, structure or mesh_region layer. The agent moves the bytes: first upload the GeoJSON yourself, with the same credential, to GeoNode's upload endpoint at the site origin: curl -sS -u <user>:<password> -F "base_file=@/path/rainfall.geojson" https://<site>/api/v2/uploads/upload/ → JSON with `execution_id`. Then call this tool with it. The tool polls GET /api/v2/resource-service/execution-status/<execution_id> (bounded by timeout_seconds; statuses ready → running → finished | failed), reads the new dataset's pk, and PATCHes it onto the project's DEFAULT row of that kind ('Boundary 01' … 'MeshRegion 01' — the six rows the terrain import seeds ~30 s after get_terrain reports ready; if the list is still empty the tool says so: run finalize_terrain_upload / wait for get_terrain first). `outcome` is exactly one of: `attached` (row_id, gn_layer, dataset_pk, dataset_alternate — the WFS typename — and every row id seen); `timed_out` (the import is still running: call again with the same arguments); `upload_failed` (the execution record, incl. its log, is returned verbatim — fix the file and upload again); `no_default_row`; `no_dataset` (finished but no resource was recorded). The PATCH is refused with a 400 if the dataset is not owned by you. Refused, with no request made: kind `breakline` and kind `culvert` — no REST create path exists for either at HEAD (TASK-3040 AC6), and culvert flow is not conveyed by run_anuga, so attaching one would only pretend. Also refused without a request: an execution_id that is not the UUID the upload returned. One GeoJSON per kind: all of a kind's features travel in that one file. A rainfall polygon names its gauge in its `data` property — create that gauge with create_time_series under the exact same name.
Esquema de entrada
{'type': 'object', 'required': ['project_id', 'kind', 'execution_id'], 'properties': {'kind': {'type': 'string', 'description': 'Which input the uploaded layer is: boundary, friction, inflow, rainfall, structure or mesh_region. breakline and culvert are refused (see below).'}, 'project_id': {'type': 'integer', 'description': 'The project ID'}, 'execution_id': {'type': 'string', 'description': '`execution_id` returned by your multipart POST to <origin>/api/v2/uploads/upload/'}, 'timeout_seconds': {'type': 'integer', 'default': 240, 'description': 'How long this call keeps polling the upload before it returns `timed_out` (default 240, ceiling 280 â\x80\x94 the prod /mcp/ proxy cuts a call at 300 s). 0 = one status read, no waiting.'}, 'poll_interval_seconds': {'type': 'number', 'default': 5.0, 'description': 'Seconds between polls (default 5)'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
build_scenario
Build Scenario
Build a scenario's package (mesh + inputs) after showing what it will cost, and poll until built. Order of operations, so the number is shown before anything is spent: 1. GET the scenario detail. A record with no `boundary`/`computed_status` keys is a non-member's read of a public project → refused: a build needs the EDITOR role. 2. Re-call checks on `latest_run` (a re-POST is NOT deduplicated after `built`/`complete` — it would dispatch a duplicate build): no run → proceed; run `created`/`building` → resume polling, no POST; run `built`/`queued`/`computing`/`processing`/`complete` with `latest_run_is_valid` not false → return that state, no POST unless rebuild=true; run `error`/`cancelled`, or `latest_run_is_valid` false (the scenario was edited since the build) → proceed. 3. Spend gates, each a refusal with `outcome: "refused"` and no POST: the scenario has no boundary or its boundary row has no features (the server would admit the build and fail it in make_package); the estimate is None (resolution is 0/unset); the estimate is above 100,000 triangles and confirm is not true — the refusal states the number; re-call with confirm=true to proceed. An estimate of 0 over a boundary WITH features is buildable and is reported, not refused. 4. POST /projects/<id>/scenarios/<pk>/build/. Every 4xx comes back verbatim as a normal result with `http_status`: 422 MESH_TOO_LARGE (`error_code`, `estimate`, `ceiling`, `detail` — the server's hard ceiling; coarsen `resolution` or shrink the boundary; no run was created), 409 COMPUTE_TARGET_UNAVAILABLE, 400/403/404. A 409 WITHOUT an error_code is the dedup body ({status, run_id, detail}: a build is already in flight) — the tool resumes polling that run. 5. On 202 poll the detail's `computed_status` (created → building → built | error), bounded by timeout_seconds. Returns a COMPACT state, never the whole detail: `outcome` (built, error, cancelled, complete/queued/computing/processing for a run past the build, timed_out, or refused), `computed_status`, `mesh_triangle_count_estimate`, `posted`, the POST's `build` body + `http_status` when one was made, and the latest run's `run_id`, `run_status`, `error_message`, `user_message`, `mesh_triangle_count`. `timed_out` is normal (make_package re-downloads the terrain from S3 every build; minutes): call again with the same arguments — step 2 resumes polling the same run, it never POSTs twice — or cancel_run(run_id) if the run is stuck in `created` with no worker. `error` is terminal: `error_message` says why (fix the inputs, then call again — an errored latest run is rebuilt). Units: `resolution` on the SCENARIO is a LENGTH in metres — ANUGA maximum_triangle_area = resolution²/2 (run_utils.py:227/:290; FloatField default 100, not nullable; 0 makes the estimate None) and the same value becomes the raster cell size; a MeshRegion FEATURE's `resolution` is consumed by the mesher as an AREA (max_triangle_area, m²) while the estimate prices it as a length, so attached regions mesh ~15x more than estimated (Towradgi 100/36/8 m² regions: estimate ~18k, mesh ~283k); the smallest MeshRegion value becomes the raster cell size.
Esquema de entrada
{'type': 'object', 'required': ['project_id', 'scenario_id'], 'properties': {'confirm': {'type': 'boolean', 'default': False, 'description': 'Required (true) when the estimate is above 100,000 triangles â\x80\x94 the tool refuses first and tells you the number. Default false.'}, 'rebuild': {'type': 'boolean', 'default': False, 'description': 'true to dispatch a NEW build of a scenario whose latest run is already built/complete and still valid (default false: the tool returns that state instead of duplicating the build).'}, 'project_id': {'type': 'integer', 'description': 'The project ID'}, 'scenario_id': {'type': 'integer', 'description': 'The scenario ID from create_scenario'}, 'timeout_seconds': {'type': 'integer', 'default': 240, 'description': 'How long this call keeps polling before it returns `timed_out` (default 240, ceiling 280 â\x80\x94 the prod /mcp/ proxy cuts a call at 300 s). 0 = one status read, no waiting.'}, 'poll_interval_seconds': {'type': 'number', 'default': 5.0, 'description': 'Seconds between polls (default 5)'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
cancel_run
Cancel Run
Cancel an in-flight simulation run. Works on runs in built, queued, or computing status. Cleans up compute resources (terminates EC2 instance, Celery task, or Batch job). Returns 409 if the run is already in a terminal state (complete, cancelled, or error).
Esquema de entrada
{'type': 'object', 'required': ['run_id'], 'properties': {'run_id': {'type': 'integer', 'description': 'The run ID to cancel'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
create_project
Create Project
Create a new ANUGA project. Returns the project record including its id. The caller's own account becomes the owner. `projection` is the projected CRS every scenario in the project is meshed and run in — pick the UTM zone covering the site. Next step for a new project: presign_terrain_upload.
Esquema de entrada
{'type': 'object', 'required': ['name', 'projection'], 'properties': {'name': {'type': 'string', 'description': 'Project name'}, 'projection': {'type': 'string', 'description': "Working CRS as an EPSG string, normally the UTM zone of the site, e.g. 'EPSG:32756' (WGS 84 / UTM 56S)"}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
create_scenario
Create Scenario
Create a DRAFT scenario (no build, no run) and report its mesh-triangle estimate. POSTs /projects/<id>/scenarios/ with the write fields, then GETs the scenario detail — the create response carries NO estimate; the detail's `mesh_triangle_count_estimate` (+ `_breakdown`) does. Returns a compact record: id, name, the FK ids as stored, resolution, duration, `computed_status` (`created` = no run yet), the estimate and its breakdown, and http_status. Next step: build_scenario (which asks for confirm=true above 100,000 triangles). Nothing is meshed or queued here. Units: `resolution` on the SCENARIO is a LENGTH in metres — ANUGA maximum_triangle_area = resolution²/2 (run_utils.py:227/:290; FloatField default 100, not nullable; 0 makes the estimate None) and the same value becomes the raster cell size; a MeshRegion FEATURE's `resolution` is consumed by the mesher as an AREA (max_triangle_area, m²) while the estimate prices it as a length, so attached regions mesh ~15x more than estimated (Towradgi 100/36/8 m² regions: estimate ~18k, mesh ~283k); the smallest MeshRegion value becomes the raster cell size. The server does NOT validate that the FK ids belong to `project_id` — pass the row ids attach_input_layer / get_terrain returned for THIS project. Every FK is nullable at create time, and the build fails later on a scenario with no terrain, or with neither an inflow nor a rainfall. A `boundary` whose row has no features (the default 'Boundary 01' before attach_input_layer) is accepted here and refused by build_scenario. The estimate is None when resolution is 0; an estimate of 0 with a real boundary is a very coarse mesh, not an error.
Esquema de entrada
{'type': 'object', 'required': ['project_id', 'name', 'resolution', 'duration'], 'properties': {'name': {'type': 'string', 'description': 'Scenario name'}, 'inflow': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Inflow row id (optional; the build needs an inflow OR a rainfall)'}, 'terrain': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Terrain id (get_terrain â\x86\x92 terrain.id); the build fails without one'}, 'boundary': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Boundary row id (attach_input_layer kind=boundary â\x86\x92 row_id)'}, 'duration': {'type': 'integer', 'description': 'Simulation duration in seconds (e.g. 43200 = 12 h)'}, 'friction': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Friction row id (optional)'}, 'rainfall': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Rainfall row id (optional; the build needs an inflow OR a rainfall)'}, 'structure': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Structure row id (optional)'}, 'project_id': {'type': 'integer', 'description': 'The project ID'}, 'resolution': {'type': 'number', 'description': 'Mesh resolution as a LENGTH in metres (ANUGA maximum_triangle_area = resolution²/2). Coarser (larger) = fewer triangles: on a ~13 km² boundary 36-40 m gives ~16-20k triangles, 10 m ~255k, 1 m ~25M (refused by the API).'}, 'description': {'type': 'string', 'default': '', 'description': 'Free-text description (optional)'}, 'mesh_region': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': "MeshRegion row id (optional). Leave UNSET unless you want the regions' finer meshing â\x80\x94 see the units note: they mesh ~15x more than estimated."}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
create_time_series
Create Time Series
Create a time series (rain gauge, hydrograph, tide/stage) in a project. POSTs /projects/<id>/time-series/ with `series_type` and `units` as top-level fields. `series_type` is checked against the four choices and `data` against the {"rowData": [{timestamp, value}, ...]} shape before any request is made — the API answers 500 (not 400) to a malformed row. Returns a compact record — id, name, series_type, units, timezone, row_count, http_status — not the echoed rows; fetch the full row with the REST API (GET /projects/<id>/time-series/<id>/) if you need to round-trip it. A rainfall polygon references its gauge by the series NAME, so create the gauges with the exact names the rainfall GeoJSON's features carry.
Esquema de entrada
{'type': 'object', 'required': ['project_id', 'name', 'data'], 'properties': {'data': {'type': 'object', 'description': 'The rows: {"rowData": [{"timestamp": "1998-08-17T00:00:00", "value": 1.5}, ...]}. Timestamps ISO 8601 (a trailing Z is tolerated), values numeric. Validated here before anything is sent.', 'additionalProperties': True}, 'name': {'type': 'string', 'description': 'Series name, kept VERBATIM â\x80\x94 a rainfall polygon binds to its gauge by this exact name (its `data` property), so use the name the GeoJSON features carry'}, 'units': {'type': 'string', 'default': '', 'description': "Display label for the values, e.g. 'mm/hr', 'm^3/s', 'm' (optional)"}, 'source': {'type': 'string', 'default': '', 'description': 'Where the data came from, e.g. a gauge id or agency (optional)'}, 'timezone': {'type': 'string', 'default': 'UTC', 'description': "IANA timezone of the timestamps (default 'UTC'), e.g. 'Australia/Sydney'"}, 'project_id': {'type': 'integer', 'description': 'The project ID'}, 'description': {'type': 'string', 'default': '', 'description': 'Free-text description (optional)'}, 'series_type': {'type': 'string', 'default': 'hyetograph', 'description': 'One of hyetograph (rainfall depth/intensity â\x80\x94 the default), hydrograph (flow, read by the Hydrographs panel and inflow boundaries), stage (water level, e.g. a tide) or generic. Sent as a top-level field.'}, 'location_name': {'type': 'string', 'default': '', 'description': 'Human-readable location of the gauge (optional)'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
finalize_terrain_upload
Finalize Terrain Upload
Step 2 of a terrain import: register the PUT GeoTIFF as a Terrain and start the import. Call this only after the presigned PUT returned 200. Creates the Terrain row (status `creating`) and queues the import chain — reproject to UTM, publish the layer + hillshade, style — which also seeds the project's six default boundary, friction, inflow, rainfall, structure and mesh-region rows. Returns 202 with the terrain record; keep its `id` for get_terrain. A 400 UPLOAD_NOT_FOUND means no object is at `staging_key`: the PUT did not land (check its status code and Content-Type) — do not retry finalize until it has.
Esquema de entrada
{'type': 'object', 'required': ['project_id', 'staging_key'], 'properties': {'title': {'type': 'string', 'default': '', 'description': 'Terrain title (default: the filename without .tif)'}, 'process_id': {'type': 'string', 'default': '', 'description': "`process_id` returned by presign_terrain_upload (pass it so the upload's progress record is reused; the API tolerates its absence)"}, 'project_id': {'type': 'integer', 'description': 'The project ID'}, 'staging_key': {'type': 'string', 'description': '`staging_key` returned by presign_terrain_upload'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
get_project
Get Project
Get details of a specific ANUGA project including its scenarios. Returns the project name, projection (EPSG code), base map ID, and configuration.
Esquema de entrada
{'type': 'object', 'required': ['project_id'], 'properties': {'project_id': {'type': 'integer', 'description': 'The project ID'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
get_run
Get Run
Get full details of a simulation run including timing and results. Returns the complete run record: status, progress, timing (start/end timestamps, duration), compute details (backend, instance type, cost), mesh info, error messages, and result log. Use get_run_status for lightweight polling; use this for final results.
Esquema de entrada
{'type': 'object', 'required': ['run_id'], 'properties': {'run_id': {'type': 'integer', 'description': 'The run ID'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
get_run_status
Get Run Status
Lightweight status check for a simulation run (fast, <50ms). Use this for polling instead of get_run. Returns only: id, status, progress_pct (0-100), eta_seconds, error_message, and compute_backend. Poll every 5-10 seconds. Terminal states: complete, error, cancelled.
Esquema de entrada
{'type': 'object', 'required': ['run_id'], 'properties': {'run_id': {'type': 'integer', 'description': 'The run ID'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
get_scenario
Get Scenario
Get scenario details including its `computed_status` and latest run. The `computed_status` field (there is NO `status` key on a scenario) is derived from the latest run and will be one of: created, building, built, queued, computing, processing, complete, error, or cancelled — `created` also means no run exists yet. A scenario must be `built` before it can be run. The detail also carries `mesh_triangle_count_estimate` (+ its `_breakdown`) and `latest_run_is_valid` (false after any edit since the last build). A non-member reading a public project's scenario gets a reduced record with no `computed_status`.
Esquema de entrada
{'type': 'object', 'required': ['project_id', 'scenario_id'], 'properties': {'project_id': {'type': 'integer', 'description': 'The project ID'}, 'scenario_id': {'type': 'integer', 'description': 'The scenario ID'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
get_terrain
Get Terrain
Poll a terrain's import until it is `ready` (or `error`), bounded by timeout_seconds. Returns `outcome` — exactly one of `ready`, `error`, `timed_out`, `not_found` (the project has no terrain yet; an unknown terrain_id is an API 404 error instead) — plus the last `status` seen (creating → styling → ready | error), `polls`, `elapsed_seconds` and the full `terrain` record (its `gn_layer` is the published elevation dataset pk once ready). An import takes minutes to tens of minutes (the SAME 32 MB 1 m DEM measured 4.5 min once and 26 min once — the worker's S3 download speed dominates), so `timed_out` is normal and NOT a failure: keep calling with the same arguments while `status` is still `creating`/`styling`; several calls in a row is expected. `error` is terminal — the import failed and no default input rows were seeded; upload a corrected GeoTIFF as a new terrain. `ready` is written by the import task; the project's default input rows (Boundary 01, Friction 01, Inflow 01, Rainfall 01, Structure 01, MeshRegion 01, one GeoNode layer each) are seeded by the NEXT task in the chain and appear over the following ~30 s. Poll the input-layer list until it is non-empty before attaching your own layer to a default row.
Esquema de entrada
{'type': 'object', 'required': ['project_id'], 'properties': {'project_id': {'type': 'integer', 'description': 'The project ID'}, 'terrain_id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': "The terrain ID from finalize_terrain_upload. Omit to follow the project's newest terrain."}, 'timeout_seconds': {'type': 'integer', 'default': 240, 'description': 'How long this call keeps polling before it returns `timed_out` (default 240, ceiling 280 â\x80\x94 the prod /mcp/ proxy cuts a call at 300 s). 0 = one status read, no waiting.'}, 'poll_interval_seconds': {'type': 'number', 'default': 5.0, 'description': 'Seconds between polls (default 5)'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
list_projects
List Projects
List ANUGA simulation projects accessible to the authenticated user. Returns a paginated list of projects with their names, projections, and base map references.
Esquema de entrada
{'type': 'object', 'properties': {'page': {'type': 'integer', 'default': 1, 'description': 'Page number (default 1)'}, 'page_size': {'type': 'integer', 'default': 100, 'description': 'Results per page, max 100 (default 100)'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
list_runs
List Runs
List all simulation runs across all scenarios in a project. Returns a paginated list of runs. Optionally filter by status to find active, completed, or failed runs.
Esquema de entrada
{'type': 'object', 'required': ['project_id'], 'properties': {'page': {'type': 'integer', 'default': 1, 'description': 'Page number (default 1)'}, 'page_size': {'type': 'integer', 'default': 100, 'description': 'Results per page, max 100 (default 100)'}, 'project_id': {'type': 'integer', 'description': 'The project ID'}, 'status_filter': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'default': None, 'description': 'Filter by status: created, building, built, queued, computing, processing, complete, error, cancelled. Omit for all.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
presign_terrain_upload
Presign Terrain Upload
Step 1 of a terrain import: get a presigned S3 PUT URL for a GeoTIFF DEM. The agent moves the bytes itself — no tool accepts file contents. After this call, PUT the file straight to `upload_url`, sending the SAME Content-Type you passed here (it is part of the signature; a mismatch is a 403 SignatureDoesNotMatch before it is anything else): curl -sS -X PUT -H "Content-Type: image/tiff" --upload-file /path/dem.tif "$UPLOAD_URL" then call finalize_terrain_upload with the returned staging_key and process_id. Nothing exists in Hydrata until finalize; the URL expires after `expires_in` seconds (3600). Platform guidance: keep the terrain extent within 5° across and 40,000 km² (200 × 200 km). The API enforces that cap on its bbox-fetch path; an uploaded GeoTIFF is only rejected above 5 GiB, but a larger DEM will not mesh or run well. The GeoTIFF must carry a CRS; the import reprojects it to the site's UTM zone and builds a hillshade. Fallback when a presigned PUT is impossible: multipart-POST the file with the same credential to /api/v2/anuga/projects/<id>/terrain/upload/ (form field `file`, optional `title`), which creates the terrain in one step — then get_terrain.
Esquema de entrada
{'type': 'object', 'required': ['project_id', 'filename'], 'properties': {'size': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'File size in bytes (`stat -c %s <file>`). The API rejects > 5 GiB up front. Omit if unknown.'}, 'filename': {'type': 'string', 'description': "Base name of the GeoTIFF, e.g. 'dem.tif' (a name only â\x80\x94 never contents)"}, 'project_id': {'type': 'integer', 'description': 'The project ID'}, 'content_type': {'type': 'string', 'default': 'image/tiff', 'description': "MIME type the PUT will send (default 'image/tiff'). It is SIGNED into the URL, so the PUT must send exactly this Content-Type header."}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
retry_run
Retry Run
Retry a failed simulation run. Resets an errored run back to 'created' status and triggers a new package build. The same run ID is reused. Only valid when status is 'error'. Returns 409 for any other state.
Esquema de entrada
{'type': 'object', 'required': ['run_id'], 'properties': {'run_id': {'type': 'integer', 'description': 'The run ID to retry'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
start_simulation
Start Simulation
Start a flood simulation run for a built scenario. The scenario must be in 'built' status. Returns 202 with the new run. The run transitions through: built → queued → computing → processing → complete. After starting, poll get_run_status to track progress. Returns 409 if the scenario is not in the correct state.
Esquema de entrada
{'type': 'object', 'required': ['scenario_id'], 'properties': {'scenario_id': {'type': 'integer', 'description': 'The scenario ID to run'}, 'compute_backend': {'type': 'string', 'default': 'local', 'description': "Compute backend: 'local' (Celery), 'ec2' (dedicated instance), or 'batch' (AWS Batch spot, cheapest). Default: 'local'"}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'string'}}, 'x-fastmcp-wrap-result': True}
Añadido
build_scenario
23 de September de 2026 a las 02:53
Añadido
create_scenario
23 de September de 2026 a las 02:53
Añadido
attach_input_layer
23 de September de 2026 a las 02:53
Añadido
create_time_series
23 de September de 2026 a las 02:53
Añadido
get_terrain
23 de September de 2026 a las 02:53
Añadido
finalize_terrain_upload
23 de September de 2026 a las 02:53
Añadido
presign_terrain_upload
23 de September de 2026 a las 02:53
Añadido
create_project
23 de September de 2026 a las 02:53
Modificado
list_runs
23 de September de 2026 a las 02:53
Modificado
retry_run
23 de September de 2026 a las 02:53
Modificado
cancel_run
23 de September de 2026 a las 02:53
Modificado
get_run
23 de September de 2026 a las 02:53
Modificado
get_run_status
23 de September de 2026 a las 02:53
Modificado
start_simulation
23 de September de 2026 a las 02:53
Modificado
get_scenario
23 de September de 2026 a las 02:53
Modificado
get_project
23 de September de 2026 a las 02:53
Modificado
list_projects
23 de September de 2026 a las 02:53
Añadido
list_runs
17 de September de 2026 a las 12:35
Añadido
retry_run
17 de September de 2026 a las 12:35
Añadido
cancel_run
17 de September de 2026 a las 12:35
Añadido
get_run
17 de September de 2026 a las 12:35
Añadido
get_run_status
17 de September de 2026 a las 12:35
Añadido
start_simulation
17 de September de 2026 a las 12:35
Añadido
get_scenario
17 de September de 2026 a las 12:35
Añadido
get_project
17 de September de 2026 a las 12:35
Añadido
list_projects
17 de September de 2026 a las 12:35