offnadir-delta-mcp 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/catalog.js CHANGED
@@ -13,7 +13,7 @@
13
13
  * Actual `tools/call` / `resources/read` / `prompts/get` requests are forwarded
14
14
  * to the remote server with the caller's OFFNADIR_DELTA_API_KEY (see index.ts).
15
15
  */
16
- // Generated for Off-Nadir Delta MCP 2.1.0.
16
+ // Generated for Off-Nadir Delta MCP 3.0.0.
17
17
  export const TOOLS = [
18
18
  {
19
19
  "name": "query_signals",
@@ -116,7 +116,7 @@ export const TOOLS = [
116
116
  "equities"
117
117
  ]
118
118
  },
119
- "description": "Markets exposed via a physical/supply channel."
119
+ "description": "Exposed markets (physical/supply channel)."
120
120
  },
121
121
  "placement": {
122
122
  "type": "string",
@@ -127,62 +127,13 @@ export const TOOLS = [
127
127
  ],
128
128
  "description": "map=a point; list=country/province only."
129
129
  },
130
- "observable": {
131
- "type": "string",
132
- "enum": [
133
- "any",
134
- "yes",
135
- "no"
136
- ],
137
- "description": "A satellite could see it."
138
- },
139
130
  "linkedTo": {
140
131
  "type": "string",
141
- "description": "Events sharing a connector: facility:<entity_id>, place:<place_key>, actor:<name>. Plan-gated."
142
- },
143
- "sensors": {
144
- "type": "array",
145
- "items": {
146
- "type": "string",
147
- "enum": [
148
- "sentinel-2",
149
- "sentinel-1-sar",
150
- "viirs-thermal",
151
- "planet",
152
- "vhr-optical",
153
- "multi-sensor",
154
- "none"
155
- ]
156
- },
157
- "description": "Recommended sensor (unassessed passes)."
158
- },
159
- "collectionLevels": {
160
- "type": "array",
161
- "items": {
162
- "type": "string",
163
- "enum": [
164
- "GSD<0.1m",
165
- "GSD<0.5m",
166
- "GSD<1m",
167
- "GSD<10m",
168
- "GSD<100m",
169
- "Impossible"
170
- ]
171
- },
172
- "description": "Resolution needed (unassessed passes)."
132
+ "description": "Shares a connector: facility:<entity_id>, place:<place_key>, actor:<name>. Plan-gated."
173
133
  },
174
- "escalationTrends": {
175
- "type": "array",
176
- "items": {
177
- "type": "string",
178
- "enum": [
179
- "escalating",
180
- "de-escalating",
181
- "stable",
182
- "new"
183
- ]
184
- },
185
- "description": "Trend (unassessed passes)."
134
+ "watchId": {
135
+ "type": "string",
136
+ "description": "Events linked to this watch (list_watches id)."
186
137
  },
187
138
  "sort": {
188
139
  "type": "string",
@@ -191,21 +142,21 @@ export const TOOLS = [
191
142
  "oldest",
192
143
  "geoint"
193
144
  ],
194
- "description": "Default latest. geoint: visible first, then geoint_score, stage (plan-gated; else latest (filter_clamp))."
145
+ "description": "Default latest. geoint (plan-gated): observable, then geoint_score."
195
146
  },
196
147
  "updatedSince": {
197
148
  "type": "string",
198
- "description": "Refolded at/after (ISO); narrows the window."
149
+ "description": "Refolded at/after (ISO)."
199
150
  },
200
151
  "limit": {
201
152
  "type": "integer",
202
153
  "minimum": 1,
203
- "maximum": 500,
204
- "description": "Max rows per page. Default 100."
154
+ "maximum": 50,
155
+ "description": "Page size (default 20). Rows are digests; full rows: full_records."
205
156
  },
206
157
  "cursor": {
207
158
  "type": "string",
208
- "description": "Cursor from meta.next_cursor."
159
+ "description": "From meta.next_cursor."
209
160
  }
210
161
  }
211
162
  },
@@ -225,6 +176,24 @@ export const TOOLS = [
225
176
  "items": {
226
177
  "type": "object"
227
178
  }
179
+ },
180
+ "full_records": {
181
+ "type": "object",
182
+ "description": "The same query on the REST API and the Python SDK, which return every field and larger pages.",
183
+ "properties": {
184
+ "note": {
185
+ "type": "string"
186
+ },
187
+ "rest": {
188
+ "type": "string"
189
+ },
190
+ "sdk": {
191
+ "type": "string"
192
+ },
193
+ "docs": {
194
+ "type": "string"
195
+ }
196
+ }
228
197
  }
229
198
  },
230
199
  "required": [
@@ -403,8 +372,8 @@ export const TOOLS = [
403
372
  "limit": {
404
373
  "type": "integer",
405
374
  "minimum": 1,
406
- "maximum": 100,
407
- "description": "Max scenes. Default 25."
375
+ "maximum": 25,
376
+ "description": "Max scenes. Default 10."
408
377
  }
409
378
  },
410
379
  "required": [
@@ -427,6 +396,24 @@ export const TOOLS = [
427
396
  "items": {
428
397
  "type": "object"
429
398
  }
399
+ },
400
+ "full_records": {
401
+ "type": "object",
402
+ "description": "The same query on the REST API and the Python SDK, which return every field and larger pages.",
403
+ "properties": {
404
+ "note": {
405
+ "type": "string"
406
+ },
407
+ "rest": {
408
+ "type": "string"
409
+ },
410
+ "sdk": {
411
+ "type": "string"
412
+ },
413
+ "docs": {
414
+ "type": "string"
415
+ }
416
+ }
430
417
  }
431
418
  },
432
419
  "required": [
@@ -564,83 +551,6 @@ export const TOOLS = [
564
551
  "destructiveHint": true
565
552
  }
566
553
  },
567
- {
568
- "name": "survey_observable_events",
569
- "description": "Which events a sensor can actually RESOLVE, over the FULL set. **The population is ungated by tasking readiness**, so its total sits above rank_imaging_priority and counts a different unit from query_signals clusters.",
570
- "inputSchema": {
571
- "type": "object",
572
- "properties": {
573
- "sensor": {
574
- "type": "string",
575
- "enum": [
576
- "sentinel-2",
577
- "sentinel-1"
578
- ],
579
- "description": "sentinel-2 = ~10 m optical (needs daylight and clear sky); sentinel-1 = SAR."
580
- },
581
- "bbox": {
582
- "type": "array",
583
- "items": {
584
- "type": "number"
585
- },
586
- "minItems": 4,
587
- "maxItems": 4,
588
- "description": "[west, south, east, north] WGS84. Omit for global."
589
- },
590
- "start_date": {
591
- "type": "string",
592
- "description": "YYYY-MM-DD, inclusive. Default today. Records start 2026-09-23 (earlier: unrecorded, not quiet). Plan-bounded: meta.window_clamp."
593
- },
594
- "end_date": {
595
- "type": "string",
596
- "description": "YYYY-MM-DD, inclusive. Default today; capped at 30 days."
597
- },
598
- "categories": {
599
- "type": "array",
600
- "items": {
601
- "type": "string"
602
- },
603
- "description": "Restrict to these Delta categories."
604
- },
605
- "min_geoint_score": {
606
- "type": "number",
607
- "description": "Drop events below this GEOINT score before surveying."
608
- },
609
- "top_n": {
610
- "type": "number",
611
- "minimum": 1,
612
- "maximum": 50,
613
- "description": "How many observable events to return (default 20)."
614
- }
615
- },
616
- "required": []
617
- },
618
- "outputSchema": {
619
- "type": "object",
620
- "properties": {
621
- "meta": {
622
- "type": "object",
623
- "description": "Query echo, token charge/balance (meta.tokens), and pagination where applicable."
624
- },
625
- "summary": {
626
- "type": "string",
627
- "description": "One-line natural-language summary of the result, ready to relay to a user."
628
- },
629
- "survey": {
630
- "type": "object"
631
- }
632
- },
633
- "required": [
634
- "meta",
635
- "survey"
636
- ]
637
- },
638
- "annotations": {
639
- "readOnlyHint": false,
640
- "openWorldHint": false,
641
- "destructiveHint": true
642
- }
643
- },
644
554
  {
645
555
  "name": "predict_satellite_passes",
646
556
  "description": "WHEN a place can next be imaged and by WHAT: 13 free-systematic and commercial-taskable families. **Every pass is a GEOMETRIC access opportunity** — no operator plan is consulted. retrieval_ok:false means timing is UNAVAILABLE, never \"no passes\".",
@@ -1315,8 +1225,8 @@ export const TOOLS = [
1315
1225
  "limit": {
1316
1226
  "type": "number",
1317
1227
  "minimum": 1,
1318
- "maximum": 200,
1319
- "description": "Developments to return (default 50)."
1228
+ "maximum": 50,
1229
+ "description": "Developments to return (default 20)."
1320
1230
  },
1321
1231
  "offset": {
1322
1232
  "type": "number",
@@ -1404,32 +1314,27 @@ export const TOOLS = [
1404
1314
  }
1405
1315
  },
1406
1316
  {
1407
- "name": "create_standing_order",
1408
- "description": "Put an area under CONTINUOUS watch (the app’s \"Watch this area\"): checked weekly, notifying only when new events cross the bar. **Cost is per CHANGE, not per check.**",
1317
+ "name": "list_watches",
1318
+ "description": "The Watchlist as one list, each entry with a state bucket. `updated_since` returns only watches whose CONTENT changed after that instant — what a synchronised copy should poll.",
1409
1319
  "inputSchema": {
1410
1320
  "type": "object",
1411
1321
  "properties": {
1412
- "bbox": {
1413
- "type": "array",
1414
- "items": {
1415
- "type": "number"
1416
- },
1417
- "minItems": 4,
1418
- "maxItems": 4,
1419
- "description": "[west, south, east, north] WGS84. Required — a global order would fire on everything."
1322
+ "updated_since": {
1323
+ "type": "string",
1324
+ "description": "ISO 8601. Only watches whose CONTENT changed after it — the evidence, not renames."
1420
1325
  },
1421
- "name": {
1326
+ "cursor": {
1422
1327
  "type": "string",
1423
- "description": "Label for the order (default \"Standing order\")."
1328
+ "description": "Cursor from meta.next_cursor."
1424
1329
  },
1425
- "notify_email": {
1426
- "type": "boolean",
1427
- "description": "Email on fire (default true); readable via list_standing_orders anyway."
1330
+ "limit": {
1331
+ "type": "integer",
1332
+ "description": "Watches per page when paging (1..500, default 100).",
1333
+ "minimum": 1,
1334
+ "maximum": 500
1428
1335
  }
1429
1336
  },
1430
- "required": [
1431
- "bbox"
1432
- ]
1337
+ "required": []
1433
1338
  },
1434
1339
  "outputSchema": {
1435
1340
  "type": "object",
@@ -1438,31 +1343,66 @@ export const TOOLS = [
1438
1343
  "type": "string",
1439
1344
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1440
1345
  },
1441
- "order": {
1346
+ "watches": {
1347
+ "type": "array",
1348
+ "items": {
1349
+ "type": "object"
1350
+ }
1351
+ },
1352
+ "buckets": {
1353
+ "type": "object"
1354
+ },
1355
+ "limits": {
1356
+ "type": "object"
1357
+ },
1358
+ "meta": {
1442
1359
  "type": "object"
1443
1360
  }
1444
1361
  },
1445
1362
  "required": [
1446
- "order"
1363
+ "watches"
1447
1364
  ]
1448
1365
  },
1449
1366
  "annotations": {
1450
- "readOnlyHint": false,
1367
+ "readOnlyHint": true,
1451
1368
  "openWorldHint": false,
1452
1369
  "destructiveHint": false
1453
1370
  }
1454
1371
  },
1455
1372
  {
1456
- "name": "list_layer_sets",
1457
- "description": "The layer sets saved on this account. The layer tree itself is not returned: it is an internal format, and opening it is the map's job.",
1373
+ "name": "list_notifications",
1374
+ "description": "What changed across the Watchlist, newest first: one row per change a watch reported, with read state. Reading does not mark them read. A value the plan does not open is `locked`, never filled in.",
1458
1375
  "inputSchema": {
1459
1376
  "type": "object",
1460
1377
  "properties": {
1378
+ "unread_only": {
1379
+ "type": "boolean",
1380
+ "description": "Only notifications not yet read."
1381
+ },
1382
+ "kind": {
1383
+ "type": "string",
1384
+ "enum": [
1385
+ "event_development",
1386
+ "related_event",
1387
+ "monitoring_anomaly",
1388
+ "site_event",
1389
+ "new_imagery",
1390
+ "standing_order"
1391
+ ]
1392
+ },
1393
+ "watch_id": {
1394
+ "type": "string",
1395
+ "description": "Id from list_watches."
1396
+ },
1397
+ "cursor": {
1398
+ "type": "string",
1399
+ "description": "Cursor from meta.next_cursor."
1400
+ },
1461
1401
  "limit": {
1462
1402
  "type": "integer",
1403
+ "description": "Rows per page (1..25, default 10).",
1463
1404
  "minimum": 1,
1464
- "maximum": 100,
1465
- "description": "Max layer sets to return (default 50)."
1405
+ "maximum": 25
1466
1406
  }
1467
1407
  },
1468
1408
  "required": []
@@ -1474,18 +1414,36 @@ export const TOOLS = [
1474
1414
  "type": "string",
1475
1415
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1476
1416
  },
1477
- "layer_sets": {
1417
+ "notifications": {
1478
1418
  "type": "array",
1479
1419
  "items": {
1480
1420
  "type": "object"
1481
1421
  }
1482
1422
  },
1483
- "total": {
1484
- "type": "integer"
1423
+ "meta": {
1424
+ "type": "object"
1425
+ },
1426
+ "full_records": {
1427
+ "type": "object",
1428
+ "description": "The same query on the REST API and the Python SDK, which return every field and larger pages.",
1429
+ "properties": {
1430
+ "note": {
1431
+ "type": "string"
1432
+ },
1433
+ "rest": {
1434
+ "type": "string"
1435
+ },
1436
+ "sdk": {
1437
+ "type": "string"
1438
+ },
1439
+ "docs": {
1440
+ "type": "string"
1441
+ }
1442
+ }
1485
1443
  }
1486
1444
  },
1487
1445
  "required": [
1488
- "layer_sets"
1446
+ "notifications"
1489
1447
  ]
1490
1448
  },
1491
1449
  "annotations": {
@@ -1495,18 +1453,22 @@ export const TOOLS = [
1495
1453
  }
1496
1454
  },
1497
1455
  {
1498
- "name": "get_layer_set",
1499
- "description": "One saved layer set by id. The serialized layer tree is deliberately not exposed — an internal representation, not a public contract.",
1456
+ "name": "get_watch",
1457
+ "description": "One watch end to end: target, state, latest change, measurements with recent series, standing-order questions, and for an event watch its stage, developments and thread, plus this account's notes.",
1500
1458
  "inputSchema": {
1501
1459
  "type": "object",
1502
1460
  "properties": {
1503
- "layer_set_id": {
1461
+ "watch_id": {
1504
1462
  "type": "string",
1505
- "description": "The layer set id."
1463
+ "description": "Id from list_watches."
1464
+ },
1465
+ "include_passes": {
1466
+ "type": "boolean",
1467
+ "description": "Add the collection outlook. Costs the same as predict_satellite_passes; omit it and the call is free."
1506
1468
  }
1507
1469
  },
1508
1470
  "required": [
1509
- "layer_set_id"
1471
+ "watch_id"
1510
1472
  ]
1511
1473
  },
1512
1474
  "outputSchema": {
@@ -1516,12 +1478,15 @@ export const TOOLS = [
1516
1478
  "type": "string",
1517
1479
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1518
1480
  },
1519
- "layer_set": {
1481
+ "watch": {
1482
+ "type": "object"
1483
+ },
1484
+ "thread": {
1520
1485
  "type": "object"
1521
1486
  }
1522
1487
  },
1523
1488
  "required": [
1524
- "layer_set"
1489
+ "watch"
1525
1490
  ]
1526
1491
  },
1527
1492
  "annotations": {
@@ -1531,60 +1496,73 @@ export const TOOLS = [
1531
1496
  }
1532
1497
  },
1533
1498
  {
1534
- "name": "list_uploaded_layers",
1535
- "description": "The data this account uploaded to the map, plus the formats the uploader accepts. Uploading happens in the app; GeoJSON and GeoTIFF only.",
1499
+ "name": "create_watch",
1500
+ "description": "Add a target to the Watchlist. EVENT: the signal's event id binds the canonical event — **never watch an article URL**. AREA: a bbox. SITE: entity_id or lat+lon, and scale.",
1536
1501
  "inputSchema": {
1537
1502
  "type": "object",
1538
1503
  "properties": {
1539
- "limit": {
1540
- "type": "integer",
1541
- "minimum": 1,
1542
- "maximum": 100,
1543
- "description": "Max uploads to return (default 50)."
1544
- }
1545
- },
1546
- "required": []
1547
- },
1548
- "outputSchema": {
1549
- "type": "object",
1550
- "properties": {
1551
- "summary": {
1504
+ "target_type": {
1552
1505
  "type": "string",
1553
- "description": "One-line natural-language summary of the result, ready to relay to a user."
1506
+ "enum": [
1507
+ "event",
1508
+ "area",
1509
+ "site"
1510
+ ]
1511
+ },
1512
+ "event_id": {
1513
+ "type": "string",
1514
+ "description": "EVENT: signal uuid."
1554
1515
  },
1555
- "uploads": {
1516
+ "bbox": {
1556
1517
  "type": "array",
1557
1518
  "items": {
1558
- "type": "object"
1559
- }
1519
+ "type": "number"
1520
+ },
1521
+ "minItems": 4,
1522
+ "maxItems": 4,
1523
+ "description": "AREA: [W,S,E,N] WGS84, at most 100,000 km² (larger → 400)."
1560
1524
  },
1561
- "total": {
1562
- "type": "integer"
1525
+ "entity_id": {
1526
+ "type": "string",
1527
+ "description": "SITE: registry id"
1563
1528
  },
1564
- "accepted_formats": {
1565
- "type": "array",
1566
- "items": {
1567
- "type": "string"
1568
- }
1569
- }
1570
- },
1571
- "required": [
1572
- "uploads"
1573
- ]
1574
- },
1575
- "annotations": {
1576
- "readOnlyHint": true,
1577
- "openWorldHint": false,
1578
- "destructiveHint": false
1579
- }
1580
- },
1581
- {
1582
- "name": "list_standing_orders",
1583
- "description": "The standing orders on this key: cadence, area, last check, last actual fire, and quiet_checks — a high quiet_checks means the watch is not earning its place.",
1584
- "inputSchema": {
1585
- "type": "object",
1586
- "properties": {},
1587
- "required": []
1529
+ "lat": {
1530
+ "type": "number"
1531
+ },
1532
+ "lon": {
1533
+ "type": "number"
1534
+ },
1535
+ "scale": {
1536
+ "type": "string",
1537
+ "enum": [
1538
+ "facility",
1539
+ "city",
1540
+ "country"
1541
+ ]
1542
+ },
1543
+ "radius_m": {
1544
+ "type": "number"
1545
+ },
1546
+ "metric": {
1547
+ "type": "string",
1548
+ "description": "SITE: metric or \"none\"."
1549
+ },
1550
+ "name": {
1551
+ "type": "string",
1552
+ "description": "Label."
1553
+ },
1554
+ "notify_email": {
1555
+ "type": "boolean",
1556
+ "description": "Email on changes."
1557
+ },
1558
+ "imagery_alerts": {
1559
+ "type": "boolean",
1560
+ "description": "AREA/SITE: new-scene alerts."
1561
+ }
1562
+ },
1563
+ "required": [
1564
+ "target_type"
1565
+ ]
1588
1566
  },
1589
1567
  "outputSchema": {
1590
1568
  "type": "object",
@@ -1593,33 +1571,64 @@ export const TOOLS = [
1593
1571
  "type": "string",
1594
1572
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1595
1573
  },
1596
- "orders": {
1597
- "type": "array",
1598
- "items": {
1599
- "type": "object"
1600
- }
1601
- },
1602
- "limits": {
1574
+ "watch": {
1603
1575
  "type": "object"
1576
+ },
1577
+ "already_existed": {
1578
+ "type": "boolean"
1604
1579
  }
1605
1580
  },
1606
1581
  "required": [
1607
- "orders"
1582
+ "watch"
1608
1583
  ]
1609
1584
  },
1610
1585
  "annotations": {
1611
- "readOnlyHint": true,
1586
+ "readOnlyHint": false,
1612
1587
  "openWorldHint": false,
1613
1588
  "destructiveHint": false
1614
1589
  }
1615
1590
  },
1616
1591
  {
1617
- "name": "list_monitored_areas",
1618
- "description": "Places under continuous satellite measurement: metric, latest value, change, anomaly flag, coverage. **coverage.window_total is null when the catalog total is UNKNOWN; null never means zero.**",
1592
+ "name": "update_watch",
1593
+ "description": "Pause, resume or close a watch. **Pausing is not a display state**: monitored areas stop being measured and charged, standing orders stop checking. **Closing states how the question ended** (close_reason).",
1619
1594
  "inputSchema": {
1620
1595
  "type": "object",
1621
- "properties": {},
1622
- "required": []
1596
+ "properties": {
1597
+ "watch_id": {
1598
+ "type": "string",
1599
+ "description": "Id from list_watches."
1600
+ },
1601
+ "status": {
1602
+ "type": "string",
1603
+ "enum": [
1604
+ "active",
1605
+ "paused",
1606
+ "saved",
1607
+ "closed"
1608
+ ],
1609
+ "description": "\"paused\" stops the bound checks; \"active\" resumes them; \"closed\" ends the question and needs close_reason."
1610
+ },
1611
+ "close_reason": {
1612
+ "type": "string",
1613
+ "enum": [
1614
+ "resolved",
1615
+ "lapsed",
1616
+ "false_alarm"
1617
+ ],
1618
+ "description": "Required when status is \"closed\". resolved = an answer was reached; lapsed = interest moved on without an answer; false_alarm = never a watchable event. They point at different things to fix, so do not collapse them."
1619
+ },
1620
+ "notify_email": {
1621
+ "type": "boolean",
1622
+ "description": "Email on changes."
1623
+ },
1624
+ "imagery_alerts": {
1625
+ "type": "boolean",
1626
+ "description": "AREA/SITE: new-scene alerts."
1627
+ }
1628
+ },
1629
+ "required": [
1630
+ "watch_id"
1631
+ ]
1623
1632
  },
1624
1633
  "outputSchema": {
1625
1634
  "type": "object",
@@ -1628,42 +1637,30 @@ export const TOOLS = [
1628
1637
  "type": "string",
1629
1638
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1630
1639
  },
1631
- "areas": {
1632
- "type": "array",
1633
- "items": {
1634
- "type": "object"
1635
- }
1636
- },
1637
- "limits": {
1638
- "type": "object"
1639
- },
1640
- "metering": {
1640
+ "watch": {
1641
1641
  "type": "object"
1642
1642
  }
1643
- },
1644
- "required": [
1645
- "areas"
1646
- ]
1643
+ }
1647
1644
  },
1648
1645
  "annotations": {
1649
- "readOnlyHint": true,
1646
+ "readOnlyHint": false,
1650
1647
  "openWorldHint": false,
1651
1648
  "destructiveHint": false
1652
1649
  }
1653
1650
  },
1654
1651
  {
1655
- "name": "get_monitored_area",
1656
- "description": "One monitored area with its full measurement history. Anomaly flags come from a median-absolute-deviation test, not a fixed threshold. Needs a plan that includes data export.",
1652
+ "name": "delete_watch",
1653
+ "description": "Delete a watch and its underlying resources — bound monitored areas with their history, and standing orders. To stop without losing them, pause with update_watch.",
1657
1654
  "inputSchema": {
1658
1655
  "type": "object",
1659
1656
  "properties": {
1660
- "area_id": {
1657
+ "watch_id": {
1661
1658
  "type": "string",
1662
- "description": "From list_monitored_areas; a metric's polygon_id also resolves."
1659
+ "description": "Id from list_watches."
1663
1660
  }
1664
1661
  },
1665
1662
  "required": [
1666
- "area_id"
1663
+ "watch_id"
1667
1664
  ]
1668
1665
  },
1669
1666
  "outputSchema": {
@@ -1673,58 +1670,79 @@ export const TOOLS = [
1673
1670
  "type": "string",
1674
1671
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1675
1672
  },
1676
- "area": {
1677
- "type": "object"
1673
+ "deleted": {
1674
+ "type": "string"
1678
1675
  },
1679
- "metering": {
1676
+ "removed": {
1680
1677
  "type": "object"
1681
1678
  }
1682
- },
1683
- "required": [
1684
- "area"
1685
- ]
1679
+ }
1686
1680
  },
1687
1681
  "annotations": {
1688
- "readOnlyHint": true,
1682
+ "readOnlyHint": false,
1689
1683
  "openWorldHint": false,
1690
- "destructiveHint": false
1684
+ "destructiveHint": true,
1685
+ "idempotentHint": true
1691
1686
  }
1692
1687
  },
1693
1688
  {
1694
- "name": "create_monitored_area",
1695
- "description": "Put a place under continuous satellite measurement — every new Sentinel-1/2 or VIIRS acquisition (or FIRMS fire detection) is measured. For a QUANTITY at a fixed place; for events use create_standing_order.",
1689
+ "name": "add_note",
1690
+ "description": "Add a note to a watch, start a thread, or reply. **Confidence is what separates a note from a judgment**: with one it is a JUDGMENT that supersedes the previous judgment rather than overwriting it.",
1696
1691
  "inputSchema": {
1697
1692
  "type": "object",
1698
1693
  "properties": {
1699
- "bbox": {
1700
- "type": "array",
1701
- "items": {
1702
- "type": "number"
1703
- },
1704
- "minItems": 4,
1705
- "maxItems": 4,
1706
- "description": "[west, south, east, north] WGS84, under 5,000 km² — a larger box is rejected, not sampled."
1694
+ "watch_id": {
1695
+ "type": "string",
1696
+ "description": "Id from list_watches."
1707
1697
  },
1708
- "metric": {
1698
+ "note": {
1699
+ "type": "string",
1700
+ "description": "What you want kept with this watch."
1701
+ },
1702
+ "title": {
1709
1703
  "type": "string",
1710
- "description": "Plain words (ships, fires, vegetation, water, burn, snow, built_up, moisture, night_lights) or index ids (ndvi, ndwi, nbr, vv, vh …). The sensor follows."
1704
+ "description": "A heading makes it a thread. A reply cannot have one."
1711
1705
  },
1712
- "satellite": {
1706
+ "parent_id": {
1713
1707
  "type": "string",
1714
- "description": "Pick the sensor like the app does (e.g. ship detection on NISAR_L2_GCOV_PROVISIONAL_V1). Default: the metric’s first."
1708
+ "description": "Reply to this note id. One level deep."
1715
1709
  },
1716
- "name": {
1710
+ "confidence": {
1717
1711
  "type": "string",
1718
- "description": "Label for the area (default \"Monitored area\")."
1712
+ "enum": [
1713
+ "high",
1714
+ "moderate",
1715
+ "low"
1716
+ ],
1717
+ "description": "How sure the judgment is — about the evidence, not the event. Omit and it stays a note."
1719
1718
  },
1720
- "start_date": {
1719
+ "likelihood": {
1720
+ "type": "string",
1721
+ "enum": [
1722
+ "very unlikely",
1723
+ "unlikely",
1724
+ "roughly even chance",
1725
+ "likely",
1726
+ "very likely",
1727
+ "almost certain"
1728
+ ],
1729
+ "description": "How probable the thing itself is (ICD 203). Omit rather than guess."
1730
+ },
1731
+ "gaps": {
1732
+ "type": "array",
1733
+ "items": {
1734
+ "type": "string"
1735
+ },
1736
+ "description": "What would change this judgment. Only meaningful with a confidence."
1737
+ },
1738
+ "next_check": {
1721
1739
  "type": "string",
1722
- "description": "YYYY-MM-DD to backfill from. Default 3 months ago; longer costs more on the first check."
1740
+ "description": "When/what to look at next."
1723
1741
  }
1724
1742
  },
1725
1743
  "required": [
1726
- "bbox",
1727
- "metric"
1744
+ "watch_id",
1745
+ "note"
1728
1746
  ]
1729
1747
  },
1730
1748
  "outputSchema": {
@@ -1734,15 +1752,12 @@ export const TOOLS = [
1734
1752
  "type": "string",
1735
1753
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1736
1754
  },
1737
- "area": {
1738
- "type": "object"
1739
- },
1740
- "metering": {
1755
+ "note": {
1741
1756
  "type": "object"
1742
1757
  }
1743
1758
  },
1744
1759
  "required": [
1745
- "area"
1760
+ "note"
1746
1761
  ]
1747
1762
  },
1748
1763
  "annotations": {
@@ -1752,27 +1767,43 @@ export const TOOLS = [
1752
1767
  }
1753
1768
  },
1754
1769
  {
1755
- "name": "list_watches",
1756
- "description": "The Watchlist as one list, each entry with a state bucket. `updated_since` returns only watches whose CONTENT changed after that instant — what a synchronised copy should poll.",
1770
+ "name": "search_entities",
1771
+ "description": "Find a named place (airport, base, plant, port, dam, strait…) in any language or by IATA/ICAO code. Max 50.",
1757
1772
  "inputSchema": {
1758
1773
  "type": "object",
1759
1774
  "properties": {
1760
- "updated_since": {
1775
+ "query": {
1761
1776
  "type": "string",
1762
- "description": "ISO 8601. Only watches whose CONTENT changed after it — the evidence, not renames."
1777
+ "description": "Name or partial name (at least 2 characters)."
1763
1778
  },
1764
- "cursor": {
1765
- "type": "string",
1766
- "description": "Cursor from meta.next_cursor."
1779
+ "subtypes": {
1780
+ "type": "array",
1781
+ "items": {
1782
+ "type": "string",
1783
+ "enum": [
1784
+ "port_facility",
1785
+ "military_base",
1786
+ "airport",
1787
+ "refinery_energy",
1788
+ "nuclear_facility",
1789
+ "launch_site",
1790
+ "dam",
1791
+ "bridge",
1792
+ "government_site",
1793
+ "chokepoint",
1794
+ "water_body"
1795
+ ]
1796
+ },
1797
+ "description": "Kinds to keep. Omit for all."
1767
1798
  },
1768
1799
  "limit": {
1769
- "type": "integer",
1770
- "description": "Watches per page when paging (1..500, default 100).",
1771
- "minimum": 1,
1772
- "maximum": 500
1800
+ "type": "number",
1801
+ "description": "Max rows (1-50, default 20)."
1773
1802
  }
1774
1803
  },
1775
- "required": []
1804
+ "required": [
1805
+ "query"
1806
+ ]
1776
1807
  },
1777
1808
  "outputSchema": {
1778
1809
  "type": "object",
@@ -1781,24 +1812,18 @@ export const TOOLS = [
1781
1812
  "type": "string",
1782
1813
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1783
1814
  },
1784
- "watches": {
1815
+ "entities": {
1785
1816
  "type": "array",
1786
1817
  "items": {
1787
1818
  "type": "object"
1788
1819
  }
1789
1820
  },
1790
- "buckets": {
1791
- "type": "object"
1792
- },
1793
- "limits": {
1794
- "type": "object"
1795
- },
1796
- "meta": {
1797
- "type": "object"
1821
+ "limit": {
1822
+ "type": "number"
1798
1823
  }
1799
1824
  },
1800
1825
  "required": [
1801
- "watches"
1826
+ "entities"
1802
1827
  ]
1803
1828
  },
1804
1829
  "annotations": {
@@ -1808,22 +1833,18 @@ export const TOOLS = [
1808
1833
  }
1809
1834
  },
1810
1835
  {
1811
- "name": "get_watch",
1812
- "description": "One watch end to end: target, state, latest change, measurements with recent series, standing-order questions, and for an event watch its stage, developments and thread, plus this account's notes.",
1836
+ "name": "get_entity",
1837
+ "description": "What has happened at one place: the registry record plus its most recent linked events, each with HOW it was linked. **`link_kind: proximity` is an association, not a statement that the event happened there.**",
1813
1838
  "inputSchema": {
1814
1839
  "type": "object",
1815
1840
  "properties": {
1816
- "watch_id": {
1841
+ "entity_id": {
1817
1842
  "type": "string",
1818
- "description": "Id from list_watches."
1819
- },
1820
- "include_passes": {
1821
- "type": "boolean",
1822
- "description": "Add the collection outlook. Costs the same as predict_satellite_passes; omit it and the call is free."
1843
+ "description": "The id from search_entities."
1823
1844
  }
1824
1845
  },
1825
1846
  "required": [
1826
- "watch_id"
1847
+ "entity_id"
1827
1848
  ]
1828
1849
  },
1829
1850
  "outputSchema": {
@@ -1833,569 +1854,24 @@ export const TOOLS = [
1833
1854
  "type": "string",
1834
1855
  "description": "One-line natural-language summary of the result, ready to relay to a user."
1835
1856
  },
1836
- "watch": {
1857
+ "entity": {
1837
1858
  "type": "object"
1838
1859
  },
1839
- "thread": {
1840
- "type": "object"
1841
- }
1842
- },
1843
- "required": [
1844
- "watch"
1845
- ]
1846
- },
1847
- "annotations": {
1848
- "readOnlyHint": true,
1849
- "openWorldHint": false,
1850
- "destructiveHint": false
1851
- }
1852
- },
1853
- {
1854
- "name": "create_watch",
1855
- "description": "Add a target to the Watchlist. EVENT: the signal's event id binds the canonical event — **never watch an article URL**. AREA: a bbox. SITE: entity_id or lat+lon, and scale.",
1856
- "inputSchema": {
1857
- "type": "object",
1858
- "properties": {
1859
- "target_type": {
1860
- "type": "string",
1861
- "enum": [
1862
- "event",
1863
- "area",
1864
- "site"
1865
- ]
1866
- },
1867
- "event_id": {
1868
- "type": "string",
1869
- "description": "EVENT: signal uuid."
1870
- },
1871
- "bbox": {
1872
- "type": "array",
1873
- "items": {
1874
- "type": "number"
1875
- },
1876
- "minItems": 4,
1877
- "maxItems": 4,
1878
- "description": "AREA: [W,S,E,N] WGS84."
1879
- },
1880
- "entity_id": {
1881
- "type": "string",
1882
- "description": "SITE: registry id"
1883
- },
1884
- "lat": {
1885
- "type": "number"
1886
- },
1887
- "lon": {
1888
- "type": "number"
1889
- },
1890
- "scale": {
1891
- "type": "string",
1892
- "enum": [
1893
- "facility",
1894
- "city",
1895
- "country"
1896
- ]
1897
- },
1898
- "radius_m": {
1899
- "type": "number"
1900
- },
1901
- "metric": {
1902
- "type": "string",
1903
- "description": "SITE: metric or \"none\"."
1904
- },
1905
- "name": {
1906
- "type": "string",
1907
- "description": "Label."
1908
- },
1909
- "notify_email": {
1910
- "type": "boolean",
1911
- "description": "Email on changes."
1912
- },
1913
- "imagery_alerts": {
1914
- "type": "boolean",
1915
- "description": "AREA/SITE: new-scene alerts."
1916
- }
1917
- },
1918
- "required": [
1919
- "target_type"
1920
- ]
1921
- },
1922
- "outputSchema": {
1923
- "type": "object",
1924
- "properties": {
1925
- "summary": {
1926
- "type": "string",
1927
- "description": "One-line natural-language summary of the result, ready to relay to a user."
1928
- },
1929
- "watch": {
1930
- "type": "object"
1931
- },
1932
- "already_existed": {
1933
- "type": "boolean"
1934
- }
1935
- },
1936
- "required": [
1937
- "watch"
1938
- ]
1939
- },
1940
- "annotations": {
1941
- "readOnlyHint": false,
1942
- "openWorldHint": false,
1943
- "destructiveHint": false
1944
- }
1945
- },
1946
- {
1947
- "name": "update_watch",
1948
- "description": "Pause, resume or close a watch. **Pausing is not a display state**: monitored areas stop being measured and charged, standing orders stop checking. **Closing states how the question ended** (close_reason).",
1949
- "inputSchema": {
1950
- "type": "object",
1951
- "properties": {
1952
- "watch_id": {
1953
- "type": "string",
1954
- "description": "Id from list_watches."
1955
- },
1956
- "status": {
1957
- "type": "string",
1958
- "enum": [
1959
- "active",
1960
- "paused",
1961
- "saved",
1962
- "closed"
1963
- ],
1964
- "description": "\"paused\" stops the bound checks; \"active\" resumes them; \"closed\" ends the question and needs close_reason."
1965
- },
1966
- "close_reason": {
1967
- "type": "string",
1968
- "enum": [
1969
- "resolved",
1970
- "lapsed",
1971
- "false_alarm"
1972
- ],
1973
- "description": "Required when status is \"closed\". resolved = an answer was reached; lapsed = interest moved on without an answer; false_alarm = never a watchable event. They point at different things to fix, so do not collapse them."
1974
- },
1975
- "notify_email": {
1976
- "type": "boolean",
1977
- "description": "Email on changes."
1978
- },
1979
- "imagery_alerts": {
1980
- "type": "boolean",
1981
- "description": "AREA/SITE: new-scene alerts."
1982
- }
1983
- },
1984
- "required": [
1985
- "watch_id"
1986
- ]
1987
- },
1988
- "outputSchema": {
1989
- "type": "object",
1990
- "properties": {
1991
- "summary": {
1992
- "type": "string",
1993
- "description": "One-line natural-language summary of the result, ready to relay to a user."
1994
- },
1995
- "watch": {
1996
- "type": "object"
1997
- }
1998
- }
1999
- },
2000
- "annotations": {
2001
- "readOnlyHint": false,
2002
- "openWorldHint": false,
2003
- "destructiveHint": false
2004
- }
2005
- },
2006
- {
2007
- "name": "delete_watch",
2008
- "description": "Delete a watch and its underlying resources — bound monitored areas with their history, and standing orders. To stop without losing them, pause with update_watch.",
2009
- "inputSchema": {
2010
- "type": "object",
2011
- "properties": {
2012
- "watch_id": {
2013
- "type": "string",
2014
- "description": "Id from list_watches."
2015
- }
2016
- },
2017
- "required": [
2018
- "watch_id"
2019
- ]
2020
- },
2021
- "outputSchema": {
2022
- "type": "object",
2023
- "properties": {
2024
- "summary": {
2025
- "type": "string",
2026
- "description": "One-line natural-language summary of the result, ready to relay to a user."
2027
- },
2028
- "deleted": {
2029
- "type": "string"
2030
- },
2031
- "removed": {
2032
- "type": "object"
2033
- }
2034
- }
2035
- },
2036
- "annotations": {
2037
- "readOnlyHint": false,
2038
- "openWorldHint": false,
2039
- "destructiveHint": true,
2040
- "idempotentHint": true
2041
- }
2042
- },
2043
- {
2044
- "name": "add_note",
2045
- "description": "Add a note to a watch, start a thread, or reply. **Confidence is what separates a note from a judgment**: with one it is a JUDGMENT that supersedes the previous judgment rather than overwriting it.",
2046
- "inputSchema": {
2047
- "type": "object",
2048
- "properties": {
2049
- "watch_id": {
2050
- "type": "string",
2051
- "description": "Id from list_watches."
2052
- },
2053
- "note": {
2054
- "type": "string",
2055
- "description": "What you want kept with this watch."
2056
- },
2057
- "title": {
2058
- "type": "string",
2059
- "description": "A heading makes it a thread. A reply cannot have one."
2060
- },
2061
- "parent_id": {
2062
- "type": "string",
2063
- "description": "Reply to this note id. One level deep."
2064
- },
2065
- "confidence": {
2066
- "type": "string",
2067
- "enum": [
2068
- "high",
2069
- "moderate",
2070
- "low"
2071
- ],
2072
- "description": "How sure the judgment is — about the evidence, not the event. Omit and it stays a note."
2073
- },
2074
- "likelihood": {
2075
- "type": "string",
2076
- "enum": [
2077
- "very unlikely",
2078
- "unlikely",
2079
- "roughly even chance",
2080
- "likely",
2081
- "very likely",
2082
- "almost certain"
2083
- ],
2084
- "description": "How probable the thing itself is (ICD 203). Omit rather than guess."
2085
- },
2086
- "gaps": {
2087
- "type": "array",
2088
- "items": {
2089
- "type": "string"
2090
- },
2091
- "description": "What would change this judgment. Only meaningful with a confidence."
2092
- },
2093
- "next_check": {
2094
- "type": "string",
2095
- "description": "When/what to look at next."
2096
- }
2097
- },
2098
- "required": [
2099
- "watch_id",
2100
- "note"
2101
- ]
2102
- },
2103
- "outputSchema": {
2104
- "type": "object",
2105
- "properties": {
2106
- "summary": {
2107
- "type": "string",
2108
- "description": "One-line natural-language summary of the result, ready to relay to a user."
2109
- },
2110
- "note": {
2111
- "type": "object"
2112
- }
2113
- },
2114
- "required": [
2115
- "note"
2116
- ]
2117
- },
2118
- "annotations": {
2119
- "readOnlyHint": false,
2120
- "openWorldHint": false,
2121
- "destructiveHint": false
2122
- }
2123
- },
2124
- {
2125
- "name": "delete_note",
2126
- "description": "Delete one note from a watch. The deletion itself stays in the account's action log.",
2127
- "inputSchema": {
2128
- "type": "object",
2129
- "properties": {
2130
- "watch_id": {
2131
- "type": "string",
2132
- "description": "Id from list_watches."
2133
- },
2134
- "note_id": {
2135
- "type": "string",
2136
- "description": "Note id from get_watch."
2137
- }
2138
- },
2139
- "required": [
2140
- "watch_id",
2141
- "note_id"
2142
- ]
2143
- },
2144
- "outputSchema": {
2145
- "type": "object",
2146
- "properties": {
2147
- "summary": {
2148
- "type": "string",
2149
- "description": "One-line natural-language summary of the result, ready to relay to a user."
2150
- },
2151
- "deleted": {
2152
- "type": "string"
2153
- }
2154
- }
2155
- },
2156
- "annotations": {
2157
- "readOnlyHint": false,
2158
- "openWorldHint": false,
2159
- "destructiveHint": true,
2160
- "idempotentHint": true
2161
- }
2162
- },
2163
- {
2164
- "name": "search_entities",
2165
- "description": "Find a named place (airport, base, plant, port, dam, strait…) in any language or by IATA/ICAO code. Max 50.",
2166
- "inputSchema": {
2167
- "type": "object",
2168
- "properties": {
2169
- "query": {
2170
- "type": "string",
2171
- "description": "Name or partial name (at least 2 characters)."
2172
- },
2173
- "subtypes": {
2174
- "type": "array",
2175
- "items": {
2176
- "type": "string",
2177
- "enum": [
2178
- "port_facility",
2179
- "military_base",
2180
- "airport",
2181
- "refinery_energy",
2182
- "nuclear_facility",
2183
- "launch_site",
2184
- "dam",
2185
- "bridge",
2186
- "government_site",
2187
- "chokepoint",
2188
- "water_body"
2189
- ]
2190
- },
2191
- "description": "Kinds to keep. Omit for all."
2192
- },
2193
- "limit": {
2194
- "type": "number",
2195
- "description": "Max rows (1-50, default 20)."
2196
- }
2197
- },
2198
- "required": [
2199
- "query"
2200
- ]
2201
- },
2202
- "outputSchema": {
2203
- "type": "object",
2204
- "properties": {
2205
- "summary": {
2206
- "type": "string",
2207
- "description": "One-line natural-language summary of the result, ready to relay to a user."
2208
- },
2209
- "entities": {
2210
- "type": "array",
2211
- "items": {
2212
- "type": "object"
2213
- }
2214
- },
2215
- "limit": {
2216
- "type": "number"
2217
- }
2218
- },
2219
- "required": [
2220
- "entities"
2221
- ]
2222
- },
2223
- "annotations": {
2224
- "readOnlyHint": true,
2225
- "openWorldHint": false,
2226
- "destructiveHint": false
2227
- }
2228
- },
2229
- {
2230
- "name": "get_entity",
2231
- "description": "What has happened at one place: the registry record plus its most recent linked events, each with HOW it was linked. **`link_kind: proximity` is an association, not a statement that the event happened there.**",
2232
- "inputSchema": {
2233
- "type": "object",
2234
- "properties": {
2235
- "entity_id": {
2236
- "type": "string",
2237
- "description": "The id from search_entities."
2238
- }
2239
- },
2240
- "required": [
2241
- "entity_id"
2242
- ]
2243
- },
2244
- "outputSchema": {
2245
- "type": "object",
2246
- "properties": {
2247
- "summary": {
2248
- "type": "string",
2249
- "description": "One-line natural-language summary of the result, ready to relay to a user."
2250
- },
2251
- "entity": {
2252
- "type": "object"
2253
- },
2254
- "events": {
2255
- "type": "array",
2256
- "items": {
2257
- "type": "object"
2258
- }
2259
- },
2260
- "event_count": {
2261
- "type": "number"
2262
- },
2263
- "events_24h": {
2264
- "type": "number"
2265
- }
2266
- },
2267
- "required": [
2268
- "entity"
2269
- ]
2270
- },
2271
- "annotations": {
2272
- "readOnlyHint": true,
2273
- "openWorldHint": false,
2274
- "destructiveHint": false
2275
- }
2276
- },
2277
- {
2278
- "name": "get_related_events",
2279
- "description": "The relations recorded for one event: others at the same registry facility, naming the same place, or stored as the same campaign, each saying what is shared; plus reports merged into it. Merely-nearby events are not relations and are not returned. Plan-dependent: see `plan_lock`.",
2280
- "inputSchema": {
2281
- "type": "object",
2282
- "properties": {
2283
- "event_id": {
2284
- "type": "string",
2285
- "description": "The event id (a UUID) from query_signals."
2286
- }
2287
- },
2288
- "required": [
2289
- "event_id"
2290
- ]
2291
- },
2292
- "outputSchema": {
2293
- "type": "object",
2294
- "properties": {
2295
- "summary": {
2296
- "type": "string",
2297
- "description": "One-line natural-language summary of the result, ready to relay to a user."
2298
- },
2299
- "anchor": {
2300
- "type": "object"
2301
- },
2302
- "facilities": {
2303
- "type": "array",
2304
- "items": {
2305
- "type": "object"
2306
- }
2307
- },
2308
- "places": {
2309
- "type": "array",
2310
- "items": {
2311
- "type": "object"
2312
- }
2313
- },
2314
- "related": {
2315
- "type": "array",
2316
- "items": {
2317
- "type": "object"
2318
- }
2319
- },
2320
- "merged_in": {
1860
+ "events": {
2321
1861
  "type": "array",
2322
1862
  "items": {
2323
1863
  "type": "object"
2324
1864
  }
2325
1865
  },
2326
- "accounting": {
2327
- "type": "object"
2328
- }
2329
- },
2330
- "required": [
2331
- "related"
2332
- ]
2333
- },
2334
- "annotations": {
2335
- "readOnlyHint": true,
2336
- "openWorldHint": false,
2337
- "destructiveHint": false
2338
- }
2339
- },
2340
- {
2341
- "name": "lookup_elevation",
2342
- "description": "Terrain height from the Copernicus DEM GLO-30 for a point, bbox or polygon, with relief — the number that governs SAR layover and shadow. A SURFACE model; `covered: false` is no data, not 0 m. Cite the `attribution`.",
2343
- "inputSchema": {
2344
- "type": "object",
2345
- "properties": {
2346
- "lat": {
2347
- "type": "number",
2348
- "minimum": -90,
2349
- "maximum": 90,
2350
- "description": "Latitude of a single point to measure (use with lon)."
2351
- },
2352
- "lon": {
2353
- "type": "number",
2354
- "minimum": -180,
2355
- "maximum": 180,
2356
- "description": "Longitude of a single point to measure (use with lat)."
2357
- },
2358
- "bbox": {
2359
- "type": "array",
2360
- "items": {
2361
- "type": "number"
2362
- },
2363
- "minItems": 4,
2364
- "maxItems": 4,
2365
- "description": "[lon_min, lat_min, lon_max, lat_max] WGS84."
2366
- },
2367
- "polygon": {
2368
- "type": "array",
2369
- "items": {
2370
- "type": "array",
2371
- "items": {
2372
- "type": "number"
2373
- },
2374
- "minItems": 2,
2375
- "maxItems": 2
2376
- },
2377
- "minItems": 3,
2378
- "description": "WGS84 ring [[lon, lat], …]. Statistics cover only the samples inside it."
2379
- }
2380
- }
2381
- },
2382
- "outputSchema": {
2383
- "type": "object",
2384
- "properties": {
2385
- "mode": {
2386
- "type": "string",
2387
- "description": "Which form was measured: 'point', 'bbox' or 'polygon'."
2388
- },
2389
- "elevation": {
2390
- "type": "object"
1866
+ "event_count": {
1867
+ "type": "number"
2391
1868
  },
2392
- "attribution": {
2393
- "type": "string",
2394
- "description": "Required Copernicus DEM credit (licence Article 6(b))."
1869
+ "events_24h": {
1870
+ "type": "number"
2395
1871
  }
2396
1872
  },
2397
1873
  "required": [
2398
- "elevation"
1874
+ "entity"
2399
1875
  ]
2400
1876
  },
2401
1877
  "annotations": {
@@ -2403,285 +1879,6 @@ export const TOOLS = [
2403
1879
  "openWorldHint": false,
2404
1880
  "destructiveHint": false
2405
1881
  }
2406
- },
2407
- {
2408
- "name": "analyze_terrain",
2409
- "description": "Compute FROM the terrain. `sar_geometry` returns layover, shadow, foreshortening and mean LOCAL incidence — **required, not assumed, because it changes with pass direction**. `profile` returns ground along a line and a line-of-sight verdict. Cite the `attribution`.",
2410
- "inputSchema": {
2411
- "type": "object",
2412
- "required": [
2413
- "operation"
2414
- ],
2415
- "properties": {
2416
- "operation": {
2417
- "type": "string",
2418
- "enum": [
2419
- "sar_geometry",
2420
- "profile"
2421
- ],
2422
- "description": "'sar_geometry' = layover/shadow over an area; 'profile' = ground along a line + line-of-sight."
2423
- },
2424
- "bbox": {
2425
- "type": "array",
2426
- "items": {
2427
- "type": "number"
2428
- },
2429
- "minItems": 4,
2430
- "maxItems": 4,
2431
- "description": "For 'sar_geometry': [lon_min, lat_min, lon_max, lat_max] WGS84."
2432
- },
2433
- "incidence_deg": {
2434
- "type": "number",
2435
- "minimum": 10,
2436
- "maximum": 80,
2437
- "description": "For 'sar_geometry'. Sentinel-1 IW spans ~29-46°."
2438
- },
2439
- "look_azimuth_deg": {
2440
- "type": "number",
2441
- "minimum": 0,
2442
- "maximum": 360,
2443
- "description": "For 'sar_geometry': bearing along ground range. Right-looking descending ≈ 270."
2444
- },
2445
- "lat": {
2446
- "type": "number",
2447
- "minimum": -90,
2448
- "maximum": 90,
2449
- "description": "For 'profile': latitude of the observer end."
2450
- },
2451
- "lon": {
2452
- "type": "number",
2453
- "minimum": -180,
2454
- "maximum": 180,
2455
- "description": "For 'profile': longitude of the observer end."
2456
- },
2457
- "to_lat": {
2458
- "type": "number",
2459
- "minimum": -90,
2460
- "maximum": 90,
2461
- "description": "For 'profile': latitude of the far end."
2462
- },
2463
- "to_lon": {
2464
- "type": "number",
2465
- "minimum": -180,
2466
- "maximum": 180,
2467
- "description": "For 'profile': longitude of the far end."
2468
- },
2469
- "observer_height_m": {
2470
- "type": "number",
2471
- "minimum": 0,
2472
- "description": "For 'profile': eye height above ground, default 2 m."
2473
- }
2474
- }
2475
- },
2476
- "outputSchema": {
2477
- "type": "object",
2478
- "properties": {
2479
- "operation": {
2480
- "type": "string"
2481
- },
2482
- "sar_geometry": {
2483
- "type": "object"
2484
- },
2485
- "profile": {
2486
- "type": "object"
2487
- },
2488
- "attribution": {
2489
- "type": "string",
2490
- "description": "Required Copernicus DEM credit (licence Article 6(b))."
2491
- }
2492
- }
2493
- },
2494
- "annotations": {
2495
- "readOnlyHint": true,
2496
- "openWorldHint": false,
2497
- "destructiveHint": false
2498
- }
2499
- },
2500
- {
2501
- "name": "measure_index_series",
2502
- "description": "Measure a spectral index over an area scene by scene through the Sentinel-2 archive. **Call `estimate_only: true` first** — free, and returns the scene count, real date span and cost. At most 24 scenes, so a longer period is a SAMPLE. Cite the `attribution`.",
2503
- "inputSchema": {
2504
- "type": "object",
2505
- "required": [
2506
- "index",
2507
- "start",
2508
- "end"
2509
- ],
2510
- "properties": {
2511
- "polygon": {
2512
- "type": "array",
2513
- "items": {
2514
- "type": "array",
2515
- "items": {
2516
- "type": "number"
2517
- }
2518
- },
2519
- "description": "WGS84 ring [[lon, lat], …], 3+ vertices. Statistics cover the samples inside it."
2520
- },
2521
- "bbox": {
2522
- "type": "array",
2523
- "items": {
2524
- "type": "number"
2525
- },
2526
- "minItems": 4,
2527
- "maxItems": 4,
2528
- "description": "Alternative to polygon: [lon_min, lat_min, lon_max, lat_max] WGS84."
2529
- },
2530
- "index": {
2531
- "type": "string",
2532
- "enum": [
2533
- "ndvi",
2534
- "evi",
2535
- "savi",
2536
- "ndmi",
2537
- "ndwi",
2538
- "mndwi",
2539
- "ndbi",
2540
- "ndsi",
2541
- "nbr",
2542
- "iron-oxide",
2543
- "clay",
2544
- "ferrous"
2545
- ],
2546
- "description": "Which optical index to measure."
2547
- },
2548
- "start": {
2549
- "type": "string",
2550
- "description": "YYYY-MM-DD (UTC). Clamped forward to 2015-06-27 if earlier."
2551
- },
2552
- "end": {
2553
- "type": "string",
2554
- "description": "End date YYYY-MM-DD (UTC)."
2555
- },
2556
- "max_scenes": {
2557
- "type": "integer",
2558
- "minimum": 1,
2559
- "maximum": 24,
2560
- "description": "Cap on scenes measured in this call. Server maximum 24."
2561
- },
2562
- "max_cloud_cover": {
2563
- "type": "number",
2564
- "minimum": 1,
2565
- "maximum": 100,
2566
- "description": "Scene cloud-cover ceiling in percent. Default 30."
2567
- },
2568
- "estimate_only": {
2569
- "type": "boolean",
2570
- "description": "True = free: scene count, date span and cost, without measuring."
2571
- }
2572
- }
2573
- },
2574
- "outputSchema": {
2575
- "type": "object",
2576
- "properties": {
2577
- "summary": {
2578
- "type": "string",
2579
- "description": "One-line natural-language summary of the result, ready to relay to a user."
2580
- },
2581
- "estimate": {
2582
- "type": "object"
2583
- },
2584
- "series": {
2585
- "type": "object"
2586
- },
2587
- "meta": {
2588
- "type": "object",
2589
- "description": "Query echo, token charge/balance (meta.tokens), and pagination where applicable."
2590
- },
2591
- "attribution": {
2592
- "type": "string"
2593
- }
2594
- }
2595
- },
2596
- "annotations": {
2597
- "readOnlyHint": false,
2598
- "openWorldHint": false,
2599
- "destructiveHint": true
2600
- }
2601
- },
2602
- {
2603
- "name": "detect_ships",
2604
- "description": "Count vessel-like targets in ONE Sentinel-1 SAR scene by CFAR detection — radar sees through cloud and at night. **Read `caveats` before reporting the number**: land mask, offshore exclusion and partial coverage change what it means.",
2605
- "inputSchema": {
2606
- "type": "object",
2607
- "required": [
2608
- "collection",
2609
- "item_id"
2610
- ],
2611
- "properties": {
2612
- "collection": {
2613
- "type": "string",
2614
- "enum": [
2615
- "sentinel-1-grd",
2616
- "sentinel-1-rtc",
2617
- "NISAR_L2_GCOV_PROVISIONAL_V1"
2618
- ],
2619
- "description": "Collection of the scene (Sentinel-1, or NISAR L-band — converted first, extra tokens)."
2620
- },
2621
- "item_id": {
2622
- "type": "string",
2623
- "description": "STAC item id from search_imagery."
2624
- },
2625
- "bbox": {
2626
- "type": "array",
2627
- "items": {
2628
- "type": "number"
2629
- },
2630
- "minItems": 4,
2631
- "maxItems": 4,
2632
- "description": "[lon_min, lat_min, lon_max, lat_max] WGS84, within the scene."
2633
- },
2634
- "geometry": {
2635
- "type": "object"
2636
- },
2637
- "algorithm_version": {
2638
- "type": "string",
2639
- "enum": [
2640
- "auto",
2641
- "v2",
2642
- "v3"
2643
- ],
2644
- "description": "'auto' (default) picks the recommended version for the sensor."
2645
- }
2646
- }
2647
- },
2648
- "outputSchema": {
2649
- "type": "object",
2650
- "properties": {
2651
- "summary": {
2652
- "type": "string",
2653
- "description": "One-line natural-language summary of the result, ready to relay to a user."
2654
- },
2655
- "count": {
2656
- "type": "integer",
2657
- "description": "Vessel-like targets detected. Read `caveats` before quoting it."
2658
- },
2659
- "ships": {
2660
- "type": "object"
2661
- },
2662
- "caveats": {
2663
- "type": "array",
2664
- "items": {
2665
- "type": "string"
2666
- }
2667
- },
2668
- "scene": {
2669
- "type": "object"
2670
- },
2671
- "processing": {
2672
- "type": "object"
2673
- },
2674
- "meta": {
2675
- "type": "object",
2676
- "description": "Query echo, token charge/balance (meta.tokens), and pagination where applicable."
2677
- }
2678
- }
2679
- },
2680
- "annotations": {
2681
- "readOnlyHint": false,
2682
- "openWorldHint": false,
2683
- "destructiveHint": true
2684
- }
2685
1882
  }
2686
1883
  ];
2687
1884
  export const RESOURCES = [