offnadir-delta-mcp 1.32.0 → 1.34.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 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
- `41` tools · MCP server version `1.32.0` · [full reference](https://offnadir-delta.com/docs/mcp)
19
+ `41` tools · MCP server version `1.34.0` · [full reference](https://offnadir-delta.com/docs/mcp)
20
20
 
21
21
  ## What it does
22
22
 
@@ -149,7 +149,7 @@ Stand up continuous coverage and be told only when the answer changes. Creating
149
149
  | `get_watch` | One watch end to end: target, state, latest change, measurements with recent series, standing-order questions, and for an event watch its verification state, developments and thread, plus this account's notes. | free |
150
150
  | `get_decision_package` | Everything needed to decide what to collect next about one watch, in one object. | 5 tok |
151
151
  | `create_watch` | Add a target to the Watchlist. | free |
152
- | `update_watch` | Rename, pause or resume a watch. | free |
152
+ | `update_watch` | Rename, pause, resume or close a watch. | free |
153
153
  | `delete_watch` | Delete a watch and its underlying resources — bound monitored areas with their history, and standing orders. | free |
154
154
  | `add_note` | Add a note to a watch, start a thread, or reply. | free |
155
155
  | `delete_note` | Delete one note from a watch. | free |
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.32.0.
16
+ // Generated for Off-Nadir Delta MCP 1.34.0.
17
17
  export const TOOLS = [
18
18
  {
19
19
  "name": "query_signals",
@@ -105,55 +105,57 @@ export const TOOLS = [
105
105
  "sources",
106
106
  "geoint"
107
107
  ],
108
- "description": "\"geoint\" = collection_priority, NOT the saturated geoint_score."
108
+ "description": "Default \"severity\". \"geoint\" = collection relevance: satellite-visible first, then geoint_score, then stage."
109
109
  },
110
110
  "updatedSince": {
111
111
  "type": "string",
112
- "description": "Only signals (re)enriched at/after this ISO 8601 time. Ignores the date window."
112
+ "description": "Only signals refolded at/after this ISO 8601 time. Narrows the date window rather than replacing it."
113
113
  },
114
114
  "createdSince": {
115
115
  "type": "string",
116
- "description": "Only signals FIRST enriched at/after this ISO 8601 time."
116
+ "description": "Only signals FIRST seen at/after this ISO 8601 time."
117
117
  },
118
- "observability": {
119
- "type": "string",
120
- "enum": [
121
- "observable",
122
- "not-observable"
123
- ],
124
- "description": "Is a physical mark imageable at all."
125
- },
126
- "observabilityStatus": {
127
- "type": "string",
128
- "enum": [
129
- "observable",
130
- "not_observable",
131
- "insufficient_detail"
132
- ],
133
- "description": "3-state `observability`, adding `insufficient_detail`; neither bucket leaks it."
118
+ "stages": {
119
+ "type": "array",
120
+ "items": {
121
+ "type": "string",
122
+ "enum": [
123
+ "reported",
124
+ "localized",
125
+ "pinpointed"
126
+ ]
127
+ },
128
+ "description": "Place precision: reported (country/province), localized (town), pinpointed (block/facility)."
134
129
  },
135
- "openData": {
136
- "type": "string",
137
- "enum": [
138
- "sufficient",
139
- "commercial-recommended",
140
- "not-applicable"
141
- ],
142
- "description": "Free imagery enough vs commercial tasking recommended."
130
+ "sensors": {
131
+ "type": "array",
132
+ "items": {
133
+ "type": "string",
134
+ "enum": [
135
+ "sentinel-2",
136
+ "sentinel-1-sar",
137
+ "viirs-thermal",
138
+ "planet",
139
+ "vhr-optical",
140
+ "multi-sensor",
141
+ "none"
142
+ ]
143
+ },
144
+ "description": "Keep only signals whose recommended sensor is one of these."
143
145
  },
144
- "minInformationGain": {
146
+ "minGeoint": {
145
147
  "type": "number",
146
148
  "minimum": 0,
147
- "maximum": 1,
148
- "description": "expected_information_gain >= this (0-1)."
149
+ "maximum": 10,
150
+ "description": "geoint_score >= this (0-10) — how much a satellite look would add."
149
151
  },
150
- "taskableOnly": {
152
+ "plottableOnly": {
151
153
  "type": "boolean",
152
- "description": "Coordinate is search_ready. GEOMETRY ONLY — for tasking use collectionReadyOnly."
154
+ "description": "Coordinate is precise enough to draw as a point, and therefore to point a sensor at."
153
155
  },
154
- "collectionReadyOnly": {
156
+ "observableOnly": {
155
157
  "type": "boolean",
156
- "description": "Strict tasking candidates: search_ready AND observable AND quality!=failed AND a plan AND a coordinate."
158
+ "description": "A satellite could see it (effect large enough, place fine enough). Tasking: with plottableOnly."
157
159
  },
158
160
  "responseFormat": {
159
161
  "type": "string",
@@ -196,7 +198,7 @@ export const TOOLS = [
196
198
  },
197
199
  {
198
200
  "name": "query_stats",
199
- "description": "Roll-ups over the corpus: totals plus per-category and per-day breakdown. NOTE the unit — `total` counts article-deduped events, not clusters, so it is >= the query_signals count.",
201
+ "description": "Roll-ups over the corpus: totals plus per-category and per-day breakdown. `total` counts the same events query_signals returns, so it matches its meta.total_count for the same query.",
200
202
  "inputSchema": {
201
203
  "type": "object",
202
204
  "properties": {
@@ -268,7 +270,7 @@ export const TOOLS = [
268
270
  },
269
271
  {
270
272
  "name": "query_hotspots",
271
- "description": "Where activity concentrates: density grid-binned into ranked cells with peak severity, categories and representative event_ids. Cells count satellite-observable points.",
273
+ "description": "Where activity concentrates: density grid-binned into ranked cells with peak severity, categories and representative event_ids. Events too coarse to place are counted in meta.dropped_by_plottable_count, not spread over the grid.",
272
274
  "inputSchema": {
273
275
  "type": "object",
274
276
  "properties": {
@@ -320,13 +322,13 @@ export const TOOLS = [
320
322
  "type": "number",
321
323
  "minimum": 0,
322
324
  "maximum": 10,
323
- "description": "Keep only points with severity_score >= this."
325
+ "description": "Keep only events with severity_score >= this."
324
326
  },
325
327
  "limit": {
326
328
  "type": "integer",
327
329
  "minimum": 1,
328
330
  "maximum": 500,
329
- "description": "Source points sampled before binning — NOT the cell count. Default/max 500."
331
+ "description": "Max CELLS returned, highest first. The whole window is aggregated either way; meta.total_cell_count is the uncut count. Default/max 500."
330
332
  }
331
333
  }
332
334
  },
@@ -570,8 +572,8 @@ export const TOOLS = [
570
572
  "type": "object",
571
573
  "properties": {
572
574
  "event_id": {
573
- "type": "integer",
574
- "description": "The `id` from query_signals; the server resolves its point and AOI."
575
+ "type": "string",
576
+ "description": "The `id` (UUID) from query_signals; the server resolves its point and AOI."
575
577
  },
576
578
  "analysis_goal": {
577
579
  "type": "string",
@@ -869,8 +871,8 @@ export const TOOLS = [
869
871
  "type": "object",
870
872
  "properties": {
871
873
  "eventId": {
872
- "type": "integer",
873
- "description": "Signal id (global_event_id) from query_signals."
874
+ "type": "string",
875
+ "description": "Signal id (UUID) from query_signals."
874
876
  },
875
877
  "kind": {
876
878
  "type": "string",
@@ -911,7 +913,7 @@ export const TOOLS = [
911
913
  "description": "Deterministic collection context for this signal — not model prose. Use `imagery_handoff` to go straight from the assessment to real scene candidates.",
912
914
  "properties": {
913
915
  "event_id": {
914
- "type": "integer"
916
+ "type": "string"
915
917
  },
916
918
  "event_date": {
917
919
  "type": [
@@ -1117,7 +1119,7 @@ export const TOOLS = [
1117
1119
  "description": "Present ONLY on a pre-charge rejection; `content` and `meta` are then absent."
1118
1120
  },
1119
1121
  "event_id": {
1120
- "type": "integer",
1122
+ "type": "string",
1121
1123
  "description": "Echoed on a rejection so the caller can tell which signal it was."
1122
1124
  },
1123
1125
  "charged": {
@@ -1415,8 +1417,8 @@ export const TOOLS = [
1415
1417
  "description": "Only claims a later answer restated with WEAKER evidence — read these first."
1416
1418
  },
1417
1419
  "event_id": {
1418
- "type": "number",
1419
- "description": "Only claims about this event. If neither anchor resolves, `event_link.linked` says so."
1420
+ "type": "string",
1421
+ "description": "Only claims about this event (the UUID from query_signals). `event_link.linked` says whether any resolved."
1420
1422
  },
1421
1423
  "limit": {
1422
1424
  "type": "number",
@@ -1489,45 +1491,52 @@ export const TOOLS = [
1489
1491
  },
1490
1492
  "description": "Restrict to these signal categories."
1491
1493
  },
1492
- "development_types": {
1494
+ "axes": {
1493
1495
  "type": "array",
1494
1496
  "items": {
1495
1497
  "type": "string",
1496
1498
  "enum": [
1497
- "new_event",
1498
- "baseline",
1499
- "occurrence_time_established",
1500
- "casualty_count_first_reported",
1501
- "casualty_count_raised",
1502
- "casualty_count_corrected",
1499
+ "attributed_actor",
1503
1500
  "casualties_disputed",
1504
- "attribution_stated",
1505
- "attribution_changed",
1506
- "attribution_disputed",
1507
- "corroboration_increased",
1508
- "severity_escalated",
1509
- "location_resolved",
1510
- "observability_established",
1511
- "collection_ready",
1512
- "imagery_available",
1513
- "sar_pair_ready",
1514
- "observed",
1515
- "confirmed",
1516
- "reporting_disputed",
1517
- "retracted"
1501
+ "casualties_injured",
1502
+ "casualties_killed",
1503
+ "distinct_hosts",
1504
+ "escalation_trend",
1505
+ "geoint_score",
1506
+ "imagery_post_status",
1507
+ "imagery_sar_pair_status",
1508
+ "location_level",
1509
+ "means_reported",
1510
+ "member_count",
1511
+ "occurred_at",
1512
+ "point_plottable",
1513
+ "quality_status",
1514
+ "severity_score",
1515
+ "stage",
1516
+ "target_status",
1517
+ "targets_named"
1518
1518
  ]
1519
1519
  },
1520
- "description": "Restrict to these kinds of change. An unknown value is an error, not an empty result."
1520
+ "description": "Restrict to these axes. An unknown value errors rather than returning nothing."
1521
1521
  },
1522
1522
  "notable_only": {
1523
1523
  "type": "boolean",
1524
1524
  "description": "Default true. False returns every recorded change."
1525
1525
  },
1526
+ "include_member_count": {
1527
+ "type": "boolean",
1528
+ "description": "Default false. \"One more report arrived\" is not news about the event."
1529
+ },
1526
1530
  "limit": {
1527
1531
  "type": "number",
1528
1532
  "minimum": 1,
1529
1533
  "maximum": 200,
1530
1534
  "description": "How many developments to return (default 50)."
1535
+ },
1536
+ "offset": {
1537
+ "type": "number",
1538
+ "minimum": 0,
1539
+ "description": "Skip this many; meta.total_count is the window."
1531
1540
  }
1532
1541
  },
1533
1542
  "required": []
@@ -1567,8 +1576,8 @@ export const TOOLS = [
1567
1576
  "type": "object",
1568
1577
  "properties": {
1569
1578
  "event_id": {
1570
- "type": "number",
1571
- "description": "Any signal id in the event; the canonical event is returned."
1579
+ "type": "string",
1580
+ "description": "Event id (UUID). A folded id resolves to its event; merged_from_request says so."
1572
1581
  }
1573
1582
  },
1574
1583
  "required": [
@@ -2294,7 +2303,7 @@ export const TOOLS = [
2294
2303
  },
2295
2304
  {
2296
2305
  "name": "update_watch",
2297
- "description": "Rename, pause or resume a watch. **Pausing is not a display state**: monitored areas stop being measured and charged, standing orders stop checking.",
2306
+ "description": "Rename, 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** and requires close_reason.",
2298
2307
  "inputSchema": {
2299
2308
  "type": "object",
2300
2309
  "properties": {
@@ -2311,9 +2320,19 @@ export const TOOLS = [
2311
2320
  "enum": [
2312
2321
  "active",
2313
2322
  "paused",
2314
- "saved"
2323
+ "saved",
2324
+ "closed"
2315
2325
  ],
2316
- "description": "\"paused\" stops the bound checks; \"active\" resumes them."
2326
+ "description": "\"paused\" stops the bound checks; \"active\" resumes them; \"closed\" ends the question and needs close_reason."
2327
+ },
2328
+ "close_reason": {
2329
+ "type": "string",
2330
+ "enum": [
2331
+ "resolved",
2332
+ "lapsed",
2333
+ "false_alarm"
2334
+ ],
2335
+ "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."
2317
2336
  },
2318
2337
  "notify_email": {
2319
2338
  "type": "boolean",
@@ -2880,8 +2899,8 @@ export const TOOLS = [
2880
2899
  ],
2881
2900
  "properties": {
2882
2901
  "signal_id": {
2883
- "type": "integer",
2884
- "description": "The signal (global_event_id) to research further."
2902
+ "type": "string",
2903
+ "description": "The signal id (UUID from query_signals) to research further."
2885
2904
  }
2886
2905
  }
2887
2906
  },
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.32.0';
24
+ const VERSION = '1.34.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.32.0",
3
+ "version": "1.34.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": {