offnadir-delta-mcp 1.8.3 → 1.12.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/README.md +7 -2
- package/dist/catalog.js +383 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ satellite can actually resolve it, and produce a collection-ready plan.
|
|
|
16
16
|
Real-time event and geospatial intelligence for OSINT, geopolitical risk, and GEOINT work —
|
|
17
17
|
source-linked, geolocated, and current, not a training snapshot.
|
|
18
18
|
|
|
19
|
-
`
|
|
19
|
+
`25` tools · MCP server version `1.12.0` · [full reference](https://offnadir-delta.com/docs/mcp)
|
|
20
20
|
|
|
21
21
|
## What it does
|
|
22
22
|
|
|
@@ -77,7 +77,7 @@ locally from a generated catalog, so registries can introspect it without creden
|
|
|
77
77
|
|
|
78
78
|
### First call — free
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
12 of the 25 tools cost nothing, so the first thing you run is free:
|
|
81
81
|
|
|
82
82
|
> Give me the latest Daily World Brief. Lead with the three most significant developments,
|
|
83
83
|
> explain why each matters, and cite the supporting signals.
|
|
@@ -111,6 +111,8 @@ Whether a satellite can resolve it, which one, and when it next passes.
|
|
|
111
111
|
| `rank_imaging_priority` | WHERE — and with what class (and therefore cost) of satellite — is observation most worthwhile right now? | 1 tok |
|
|
112
112
|
| `survey_observable_events` | Which events in a window can a given in-app sensor actually RESOLVE? | 1 tok |
|
|
113
113
|
| `predict_satellite_passes` | WHEN can this place next be imaged, and by WHAT — the timing half of collection planning. | 2 tok |
|
|
114
|
+
| `lookup_elevation` | Measure terrain height from the Copernicus DEM GLO-30 — a point (lat + lon), an area (bbox), or a drawn polygon, for which the statistics are computed over the samples INSIDE the ring rather than its bounding box. | free |
|
|
115
|
+
| `analyze_terrain` | Compute FROM the terrain rather than reading heights out of it (that is lookup_elevation). | free |
|
|
114
116
|
|
|
115
117
|
### Analyze
|
|
116
118
|
|
|
@@ -122,6 +124,9 @@ Turn reporting into a cited assessment you can audit afterwards.
|
|
|
122
124
|
| `ask_analyst` | Ask the Delta Analyst an OSINT/GEOINT question. | 5–123 tok |
|
|
123
125
|
| `get_analyst_job` | Fetch the status and result of an ask_analyst run by job_id. | free |
|
|
124
126
|
| `query_claims` | Read the LEDGER of claims this key has been given — every factual assertion the Analyst made, with its evidence class (CONFIRMED / REPORTED / PARTY_CLAIM / ASSESSMENT), how many INDEPENDENT source families backed it, and the publishers. | free |
|
|
127
|
+
| `refine_location` | Research one signal's location further and, if the sources genuinely narrow it, store and return the better coordinate. | 3–29 tok |
|
|
128
|
+
| `measure_index_series` | Measure a spectral index over an area, scene by scene, back through the Sentinel-2 archive — the answer to "how has this changed since <year>". | 0.5 tok |
|
|
129
|
+
| `detect_ships` | Count vessel-like targets in ONE SAR scene over an area, using CFAR detection on Sentinel-1. | 5 tok |
|
|
125
130
|
|
|
126
131
|
### Watch
|
|
127
132
|
|
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 1.
|
|
16
|
+
// Generated for Off-Nadir Delta MCP 1.12.0.
|
|
17
17
|
export const TOOLS = [
|
|
18
18
|
{
|
|
19
19
|
"name": "query_signals",
|
|
@@ -1510,6 +1510,388 @@ export const TOOLS = [
|
|
|
1510
1510
|
"openWorldHint": false,
|
|
1511
1511
|
"destructiveHint": false
|
|
1512
1512
|
}
|
|
1513
|
+
},
|
|
1514
|
+
{
|
|
1515
|
+
"name": "lookup_elevation",
|
|
1516
|
+
"description": "Measure terrain height from the Copernicus DEM GLO-30 — a point (lat + lon), an area (bbox), or a drawn polygon, for which the statistics are computed over the samples INSIDE the ring rather than its bounding box. Returns min, max, mean, median, p10, p90 and relief (max − min), the number that governs SAR layover and shadow severity. Free of token charges. Three things the result carries that any answer must respect: it is a SURFACE model (buildings and tree canopy included, so not bare ground); `downsampled: true` means a large area was read below the 30 m posting, so min/max are smoothed inward and the relief is a floor rather than an exact figure; and `covered: false` or `tiles_missing > 0` means open ocean where the model has no data — which is absence, not 0 m. Heights are orthometric on the EGM2008 geoid, not ellipsoidal. Cite the returned `attribution` wherever a height is shown.",
|
|
1517
|
+
"inputSchema": {
|
|
1518
|
+
"type": "object",
|
|
1519
|
+
"properties": {
|
|
1520
|
+
"lat": {
|
|
1521
|
+
"type": "number",
|
|
1522
|
+
"minimum": -90,
|
|
1523
|
+
"maximum": 90,
|
|
1524
|
+
"description": "Latitude of a single point to measure (use with lon)."
|
|
1525
|
+
},
|
|
1526
|
+
"lon": {
|
|
1527
|
+
"type": "number",
|
|
1528
|
+
"minimum": -180,
|
|
1529
|
+
"maximum": 180,
|
|
1530
|
+
"description": "Longitude of a single point to measure (use with lat)."
|
|
1531
|
+
},
|
|
1532
|
+
"bbox": {
|
|
1533
|
+
"type": "array",
|
|
1534
|
+
"items": {
|
|
1535
|
+
"type": "number"
|
|
1536
|
+
},
|
|
1537
|
+
"minItems": 4,
|
|
1538
|
+
"maxItems": 4,
|
|
1539
|
+
"description": "Area to measure as [lon_min, lat_min, lon_max, lat_max] (WGS84)."
|
|
1540
|
+
},
|
|
1541
|
+
"polygon": {
|
|
1542
|
+
"type": "array",
|
|
1543
|
+
"items": {
|
|
1544
|
+
"type": "array",
|
|
1545
|
+
"items": {
|
|
1546
|
+
"type": "number"
|
|
1547
|
+
},
|
|
1548
|
+
"minItems": 2,
|
|
1549
|
+
"maxItems": 2
|
|
1550
|
+
},
|
|
1551
|
+
"minItems": 3,
|
|
1552
|
+
"description": "WGS84 ring [[lon, lat], …]. Statistics cover only the samples inside it."
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
},
|
|
1556
|
+
"outputSchema": {
|
|
1557
|
+
"type": "object",
|
|
1558
|
+
"properties": {
|
|
1559
|
+
"mode": {
|
|
1560
|
+
"type": "string",
|
|
1561
|
+
"description": "Which form was measured: 'point', 'bbox' or 'polygon'."
|
|
1562
|
+
},
|
|
1563
|
+
"elevation": {
|
|
1564
|
+
"type": "object"
|
|
1565
|
+
},
|
|
1566
|
+
"attribution": {
|
|
1567
|
+
"type": "string",
|
|
1568
|
+
"description": "Required Copernicus DEM credit (licence Article 6(b))."
|
|
1569
|
+
}
|
|
1570
|
+
},
|
|
1571
|
+
"required": [
|
|
1572
|
+
"elevation"
|
|
1573
|
+
]
|
|
1574
|
+
},
|
|
1575
|
+
"annotations": {
|
|
1576
|
+
"readOnlyHint": true,
|
|
1577
|
+
"openWorldHint": false,
|
|
1578
|
+
"destructiveHint": false
|
|
1579
|
+
}
|
|
1580
|
+
},
|
|
1581
|
+
{
|
|
1582
|
+
"name": "analyze_terrain",
|
|
1583
|
+
"description": "Compute FROM the terrain rather than reading heights out of it (that is lookup_elevation). Free of token charges; both operations come from one Copernicus DEM GLO-30 read. `operation: 'sar_geometry'` over a bbox, with an incidence angle and a look azimuth, returns the share of the area lost to LAYOVER and to SHADOW, the share merely foreshortened, and the mean LOCAL incidence angle — the arithmetic behind whether radar can use that ground. It changes with the pass direction (measured on one volcanic flank: 2.6% layover looking west against 0.7% looking east at the same 35°), so the geometry is required rather than assumed. `operation: 'profile'` between two points returns the ground along the line and a LINE-OF-SIGHT verdict including Earth curvature: whether the ends can see each other, where the terrain first rises above the sight line, and the worst clearance. Both results state the sample spacing they were computed at — a coarser grid reads flatter, and therefore more observable, than the ground is. A SURFACE model, so canopy and buildings are included; over a surface model they block a sight line as they would in reality. Cite the returned `attribution`.",
|
|
1584
|
+
"inputSchema": {
|
|
1585
|
+
"type": "object",
|
|
1586
|
+
"required": [
|
|
1587
|
+
"operation"
|
|
1588
|
+
],
|
|
1589
|
+
"properties": {
|
|
1590
|
+
"operation": {
|
|
1591
|
+
"type": "string",
|
|
1592
|
+
"enum": [
|
|
1593
|
+
"sar_geometry",
|
|
1594
|
+
"profile"
|
|
1595
|
+
],
|
|
1596
|
+
"description": "'sar_geometry' = layover/shadow over an area; 'profile' = ground along a line plus a line-of-sight verdict."
|
|
1597
|
+
},
|
|
1598
|
+
"bbox": {
|
|
1599
|
+
"type": "array",
|
|
1600
|
+
"items": {
|
|
1601
|
+
"type": "number"
|
|
1602
|
+
},
|
|
1603
|
+
"minItems": 4,
|
|
1604
|
+
"maxItems": 4,
|
|
1605
|
+
"description": "For 'sar_geometry': area as [lon_min, lat_min, lon_max, lat_max] (WGS84)."
|
|
1606
|
+
},
|
|
1607
|
+
"incidence_deg": {
|
|
1608
|
+
"type": "number",
|
|
1609
|
+
"minimum": 10,
|
|
1610
|
+
"maximum": 80,
|
|
1611
|
+
"description": "For 'sar_geometry': sensor incidence angle. Sentinel-1 IW spans roughly 29-46 degrees; use the scene's own value when you have it."
|
|
1612
|
+
},
|
|
1613
|
+
"look_azimuth_deg": {
|
|
1614
|
+
"type": "number",
|
|
1615
|
+
"minimum": 0,
|
|
1616
|
+
"maximum": 360,
|
|
1617
|
+
"description": "For 'sar_geometry': compass bearing the sensor looks along the ground range. A right-looking descending pass looks roughly west (270)."
|
|
1618
|
+
},
|
|
1619
|
+
"lat": {
|
|
1620
|
+
"type": "number",
|
|
1621
|
+
"minimum": -90,
|
|
1622
|
+
"maximum": 90,
|
|
1623
|
+
"description": "For 'profile': latitude of the observer end."
|
|
1624
|
+
},
|
|
1625
|
+
"lon": {
|
|
1626
|
+
"type": "number",
|
|
1627
|
+
"minimum": -180,
|
|
1628
|
+
"maximum": 180,
|
|
1629
|
+
"description": "For 'profile': longitude of the observer end."
|
|
1630
|
+
},
|
|
1631
|
+
"to_lat": {
|
|
1632
|
+
"type": "number",
|
|
1633
|
+
"minimum": -90,
|
|
1634
|
+
"maximum": 90,
|
|
1635
|
+
"description": "For 'profile': latitude of the far end."
|
|
1636
|
+
},
|
|
1637
|
+
"to_lon": {
|
|
1638
|
+
"type": "number",
|
|
1639
|
+
"minimum": -180,
|
|
1640
|
+
"maximum": 180,
|
|
1641
|
+
"description": "For 'profile': longitude of the far end."
|
|
1642
|
+
},
|
|
1643
|
+
"observer_height_m": {
|
|
1644
|
+
"type": "number",
|
|
1645
|
+
"minimum": 0,
|
|
1646
|
+
"description": "For 'profile': eye height above the ground, default 2 m. Use the real mast or tower height when that is the question."
|
|
1647
|
+
}
|
|
1648
|
+
}
|
|
1649
|
+
},
|
|
1650
|
+
"outputSchema": {
|
|
1651
|
+
"type": "object",
|
|
1652
|
+
"properties": {
|
|
1653
|
+
"operation": {
|
|
1654
|
+
"type": "string"
|
|
1655
|
+
},
|
|
1656
|
+
"sar_geometry": {
|
|
1657
|
+
"type": "object"
|
|
1658
|
+
},
|
|
1659
|
+
"profile": {
|
|
1660
|
+
"type": "object"
|
|
1661
|
+
},
|
|
1662
|
+
"attribution": {
|
|
1663
|
+
"type": "string",
|
|
1664
|
+
"description": "Required Copernicus DEM credit (licence Article 6(b))."
|
|
1665
|
+
}
|
|
1666
|
+
}
|
|
1667
|
+
},
|
|
1668
|
+
"annotations": {
|
|
1669
|
+
"readOnlyHint": true,
|
|
1670
|
+
"openWorldHint": false,
|
|
1671
|
+
"destructiveHint": false
|
|
1672
|
+
}
|
|
1673
|
+
},
|
|
1674
|
+
{
|
|
1675
|
+
"name": "refine_location",
|
|
1676
|
+
"description": "Research one signal's location further and, if the sources genuinely narrow it, store and return the better coordinate. Most signals are geolocated once, for free, from a single article's place string: measured across production, about two thirds sit at ±5 km or have no bounded radius at all. This reads the source article and live search for a source that names something finer — a facility, bridge, district, port — resolves it, and verifies it before accepting it. **You are charged only if the precision actually improves**, between 3 and 29 tokens by what the run consumed; a signal that cannot be narrowed costs nothing, and a signal an earlier caller already refined is returned free. Read the result honestly: `improved: false` with a `reason` is the common and correct outcome when no source is more specific — it does NOT mean the event is unlocated, and it is not a failure to retry. When it does improve, `evidence` lists the sources that named the place; a location without evidence is never stored, so do not present a refined point without citing them. `footprint_kind` says whether the answer is a POINT or an AREA — if it is an area, describe an area, because an admin-level place has no finite radius and drawing it as a dot misstates where the event was. `uncertainty_m: null` means unbounded, not unknown.",
|
|
1677
|
+
"inputSchema": {
|
|
1678
|
+
"type": "object",
|
|
1679
|
+
"required": [
|
|
1680
|
+
"signal_id"
|
|
1681
|
+
],
|
|
1682
|
+
"properties": {
|
|
1683
|
+
"signal_id": {
|
|
1684
|
+
"type": "integer",
|
|
1685
|
+
"description": "The signal (global_event_id) whose location should be researched further."
|
|
1686
|
+
}
|
|
1687
|
+
}
|
|
1688
|
+
},
|
|
1689
|
+
"outputSchema": {
|
|
1690
|
+
"type": "object",
|
|
1691
|
+
"properties": {
|
|
1692
|
+
"summary": {
|
|
1693
|
+
"type": "string",
|
|
1694
|
+
"description": "One-line natural-language summary of the result, ready to relay to a user."
|
|
1695
|
+
},
|
|
1696
|
+
"result": {
|
|
1697
|
+
"type": "object"
|
|
1698
|
+
},
|
|
1699
|
+
"meta": {
|
|
1700
|
+
"type": "object",
|
|
1701
|
+
"description": "Query echo, token charge/balance (meta.tokens), and pagination where applicable."
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
},
|
|
1705
|
+
"annotations": {
|
|
1706
|
+
"readOnlyHint": false,
|
|
1707
|
+
"openWorldHint": false,
|
|
1708
|
+
"destructiveHint": true
|
|
1709
|
+
}
|
|
1710
|
+
},
|
|
1711
|
+
{
|
|
1712
|
+
"name": "measure_index_series",
|
|
1713
|
+
"description": "Measure a spectral index over an area, scene by scene, back through the Sentinel-2 archive — the answer to \"how has this changed since <year>\". Give a polygon (or a bbox), an index (ndvi, evi, savi, ndmi, ndwi, mndwi, ndbi, ndsi, nbr, iron-oxide, clay, ferrous) and a date range; each scene is measured over the samples INSIDE the ring, and the result is the per-scene mean/median/min/max with a first-to-last change. Costs 0.5 tokens per scene actually measured; a scene that fails to read is reported in `skipped` and is not charged. **Call it once with `estimate_only: true` first** — that is free and returns how many scenes match, the real date span available, and what measuring them would cost, so the user can agree to the spend. Three things the result carries that any answer must respect: the Sentinel-2 archive begins 2015-06-27, so an earlier start is clamped and `clamped_to_archive` says so (those years are genuinely unavailable, not empty); at most 24 scenes are measured per call, so a longer period comes back as a SAMPLE and the rest appear in `skipped`; and `trend` compares the first and last measured scene only — it is not a fitted rate, so do not attach a slope or a confidence to it. `scenes_found` is what the catalog holds; `scenes_examined` is the newest page this call read, so `candidate_date_span` is the edge of that page and NOT how far the archive reaches — read `notes` before saying when coverage begins. For a SAR quantity, or to keep measuring as new imagery arrives, use create_monitored_area instead. Cite the returned `attribution`.",
|
|
1714
|
+
"inputSchema": {
|
|
1715
|
+
"type": "object",
|
|
1716
|
+
"required": [
|
|
1717
|
+
"index",
|
|
1718
|
+
"start",
|
|
1719
|
+
"end"
|
|
1720
|
+
],
|
|
1721
|
+
"properties": {
|
|
1722
|
+
"polygon": {
|
|
1723
|
+
"type": "array",
|
|
1724
|
+
"items": {
|
|
1725
|
+
"type": "array",
|
|
1726
|
+
"items": {
|
|
1727
|
+
"type": "number"
|
|
1728
|
+
}
|
|
1729
|
+
},
|
|
1730
|
+
"description": "WGS84 ring [[lon, lat], …] with at least 3 vertices. Statistics cover the samples inside it."
|
|
1731
|
+
},
|
|
1732
|
+
"bbox": {
|
|
1733
|
+
"type": "array",
|
|
1734
|
+
"items": {
|
|
1735
|
+
"type": "number"
|
|
1736
|
+
},
|
|
1737
|
+
"minItems": 4,
|
|
1738
|
+
"maxItems": 4,
|
|
1739
|
+
"description": "Alternative to polygon: [lon_min, lat_min, lon_max, lat_max] (WGS84)."
|
|
1740
|
+
},
|
|
1741
|
+
"index": {
|
|
1742
|
+
"type": "string",
|
|
1743
|
+
"enum": [
|
|
1744
|
+
"ndvi",
|
|
1745
|
+
"evi",
|
|
1746
|
+
"savi",
|
|
1747
|
+
"ndmi",
|
|
1748
|
+
"ndwi",
|
|
1749
|
+
"mndwi",
|
|
1750
|
+
"ndbi",
|
|
1751
|
+
"ndsi",
|
|
1752
|
+
"nbr",
|
|
1753
|
+
"iron-oxide",
|
|
1754
|
+
"clay",
|
|
1755
|
+
"ferrous"
|
|
1756
|
+
],
|
|
1757
|
+
"description": "Which optical index to measure."
|
|
1758
|
+
},
|
|
1759
|
+
"start": {
|
|
1760
|
+
"type": "string",
|
|
1761
|
+
"description": "Start date YYYY-MM-DD (UTC). Clamped forward to 2015-06-27 if earlier."
|
|
1762
|
+
},
|
|
1763
|
+
"end": {
|
|
1764
|
+
"type": "string",
|
|
1765
|
+
"description": "End date YYYY-MM-DD (UTC)."
|
|
1766
|
+
},
|
|
1767
|
+
"max_scenes": {
|
|
1768
|
+
"type": "integer",
|
|
1769
|
+
"minimum": 1,
|
|
1770
|
+
"maximum": 24,
|
|
1771
|
+
"description": "Cap on scenes measured in this call. Server maximum 24."
|
|
1772
|
+
},
|
|
1773
|
+
"max_cloud_cover": {
|
|
1774
|
+
"type": "number",
|
|
1775
|
+
"minimum": 1,
|
|
1776
|
+
"maximum": 100,
|
|
1777
|
+
"description": "Scene cloud-cover ceiling in percent. Default 30."
|
|
1778
|
+
},
|
|
1779
|
+
"estimate_only": {
|
|
1780
|
+
"type": "boolean",
|
|
1781
|
+
"description": "True = free: return the scene count, date span and token cost WITHOUT measuring or charging."
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
},
|
|
1785
|
+
"outputSchema": {
|
|
1786
|
+
"type": "object",
|
|
1787
|
+
"properties": {
|
|
1788
|
+
"summary": {
|
|
1789
|
+
"type": "string",
|
|
1790
|
+
"description": "One-line natural-language summary of the result, ready to relay to a user."
|
|
1791
|
+
},
|
|
1792
|
+
"estimate": {
|
|
1793
|
+
"type": "object"
|
|
1794
|
+
},
|
|
1795
|
+
"series": {
|
|
1796
|
+
"type": "object"
|
|
1797
|
+
},
|
|
1798
|
+
"meta": {
|
|
1799
|
+
"type": "object",
|
|
1800
|
+
"description": "Query echo, token charge/balance (meta.tokens), and pagination where applicable."
|
|
1801
|
+
},
|
|
1802
|
+
"attribution": {
|
|
1803
|
+
"type": "string"
|
|
1804
|
+
}
|
|
1805
|
+
}
|
|
1806
|
+
},
|
|
1807
|
+
"annotations": {
|
|
1808
|
+
"readOnlyHint": false,
|
|
1809
|
+
"openWorldHint": false,
|
|
1810
|
+
"destructiveHint": true
|
|
1811
|
+
}
|
|
1812
|
+
},
|
|
1813
|
+
{
|
|
1814
|
+
"name": "detect_ships",
|
|
1815
|
+
"description": "Count vessel-like targets in ONE SAR scene over an area, using CFAR detection on Sentinel-1. Costs 5 tokens per detection; a scene the worker refuses (an unsupported combination, an area with no usable sea) is not charged. The natural sequence is search_imagery over the area, pick a scene, then this with its `collection` and `item_id` — radar sees through cloud and at night, so the count works when optical would not. Read `caveats` before reporting the number: it states when the land mask was unavailable (shoreline structures may be counted as vessels), how far from the coast detections were excluded (the default excludes vessels alongside a quay), and when the scene covers only part of the requested area — a partial-coverage count must never be compared with a full one as though the difference were vessels. This measures one scene at one time. To track a berth or an anchorage over time, create_monitored_area with metric `ships` measures every new acquisition.",
|
|
1816
|
+
"inputSchema": {
|
|
1817
|
+
"type": "object",
|
|
1818
|
+
"required": [
|
|
1819
|
+
"collection",
|
|
1820
|
+
"item_id"
|
|
1821
|
+
],
|
|
1822
|
+
"properties": {
|
|
1823
|
+
"collection": {
|
|
1824
|
+
"type": "string",
|
|
1825
|
+
"enum": [
|
|
1826
|
+
"sentinel-1-grd",
|
|
1827
|
+
"sentinel-1-rtc"
|
|
1828
|
+
],
|
|
1829
|
+
"description": "Catalog collection of the scene. NISAR detection is available in the app only (it needs a granule conversion first)."
|
|
1830
|
+
},
|
|
1831
|
+
"item_id": {
|
|
1832
|
+
"type": "string",
|
|
1833
|
+
"description": "STAC item id of the scene, as returned by search_imagery."
|
|
1834
|
+
},
|
|
1835
|
+
"bbox": {
|
|
1836
|
+
"type": "array",
|
|
1837
|
+
"items": {
|
|
1838
|
+
"type": "number"
|
|
1839
|
+
},
|
|
1840
|
+
"minItems": 4,
|
|
1841
|
+
"maxItems": 4,
|
|
1842
|
+
"description": "Area to search within the scene, [lon_min, lat_min, lon_max, lat_max] (WGS84)."
|
|
1843
|
+
},
|
|
1844
|
+
"geometry": {
|
|
1845
|
+
"type": "object"
|
|
1846
|
+
},
|
|
1847
|
+
"algorithm_version": {
|
|
1848
|
+
"type": "string",
|
|
1849
|
+
"enum": [
|
|
1850
|
+
"auto",
|
|
1851
|
+
"v2",
|
|
1852
|
+
"v3"
|
|
1853
|
+
],
|
|
1854
|
+
"description": "Detector version. 'auto' (default) picks the recommended version for the sensor."
|
|
1855
|
+
}
|
|
1856
|
+
}
|
|
1857
|
+
},
|
|
1858
|
+
"outputSchema": {
|
|
1859
|
+
"type": "object",
|
|
1860
|
+
"properties": {
|
|
1861
|
+
"summary": {
|
|
1862
|
+
"type": "string",
|
|
1863
|
+
"description": "One-line natural-language summary of the result, ready to relay to a user."
|
|
1864
|
+
},
|
|
1865
|
+
"count": {
|
|
1866
|
+
"type": "integer",
|
|
1867
|
+
"description": "Vessel-like targets detected. Read `caveats` before quoting it."
|
|
1868
|
+
},
|
|
1869
|
+
"ships": {
|
|
1870
|
+
"type": "object"
|
|
1871
|
+
},
|
|
1872
|
+
"caveats": {
|
|
1873
|
+
"type": "array",
|
|
1874
|
+
"items": {
|
|
1875
|
+
"type": "string"
|
|
1876
|
+
}
|
|
1877
|
+
},
|
|
1878
|
+
"scene": {
|
|
1879
|
+
"type": "object"
|
|
1880
|
+
},
|
|
1881
|
+
"processing": {
|
|
1882
|
+
"type": "object"
|
|
1883
|
+
},
|
|
1884
|
+
"meta": {
|
|
1885
|
+
"type": "object",
|
|
1886
|
+
"description": "Query echo, token charge/balance (meta.tokens), and pagination where applicable."
|
|
1887
|
+
}
|
|
1888
|
+
}
|
|
1889
|
+
},
|
|
1890
|
+
"annotations": {
|
|
1891
|
+
"readOnlyHint": false,
|
|
1892
|
+
"openWorldHint": false,
|
|
1893
|
+
"destructiveHint": true
|
|
1894
|
+
}
|
|
1513
1895
|
}
|
|
1514
1896
|
];
|
|
1515
1897
|
export const RESOURCES = [
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,7 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
|
21
21
|
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
22
22
|
import { CallToolRequestSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
23
23
|
import { PROMPTS, RESOURCES, RESOURCE_TEMPLATES, TOOLS } from './catalog.js';
|
|
24
|
-
const VERSION = '1.
|
|
24
|
+
const VERSION = '1.12.0';
|
|
25
25
|
const REMOTE_URL = new URL(process.env.OFFNADIR_DELTA_MCP_URL ?? 'https://offnadir-delta.com/api/v1/mcp');
|
|
26
26
|
/** Lazily-connected client to the hosted remote MCP server. */
|
|
27
27
|
let remote = null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "offnadir-delta-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "Local (stdio) MCP server for Off-Nadir Delta \u2014 live, geolocated world-event intelligence, a Daily World Brief, satellite-imagery search, and an OSINT/GEOINT analyst. Forwards to the hosted server with your API key.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|