offnadir-delta-mcp 1.8.0 → 1.8.2
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 +161 -46
- package/dist/catalog.js +8 -5
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,36 +1,58 @@
|
|
|
1
|
-
|
|
1
|
+
<!--
|
|
2
|
+
AUTO-GENERATED from the Off-Nadir Delta contract registry
|
|
3
|
+
(src/lib/api/toolRegistry.ts + src/lib/api/mcpResources.ts) by
|
|
4
|
+
scripts/gen-contract-artifacts.mjs in the Off-Nadir Delta application repo.
|
|
2
5
|
|
|
3
|
-
|
|
6
|
+
DO NOT EDIT BY HAND — `node scripts/gen-contract-artifacts.mjs --check` fails on drift,
|
|
7
|
+
and scripts/publish-distribution.sh refuses to publish a stale copy.
|
|
8
|
+
-->
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
# Off-Nadir Delta MCP
|
|
6
11
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
**From first signal to satellite evidence.** Give an AI agent a live intelligence workflow:
|
|
13
|
+
discover an event, verify the reporting, identify what evidence is missing, determine whether a
|
|
14
|
+
satellite can actually resolve it, and produce a collection-ready plan.
|
|
10
15
|
|
|
11
|
-
|
|
16
|
+
Real-time event and geospatial intelligence for OSINT, geopolitical risk, and GEOINT work —
|
|
17
|
+
source-linked, geolocated, and current, not a training snapshot.
|
|
18
|
+
|
|
19
|
+
`20` tools · MCP server version `1.8.2` · [full reference](https://offnadir-delta.com/docs/mcp)
|
|
20
|
+
|
|
21
|
+
## What it does
|
|
12
22
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
| `query_signals` | 3 | Geolocated world-event signals by area / date / category, with severity, escalation, and GEOINT scores. |
|
|
16
|
-
| `query_stats` | 1 | Event counts by category and day for an area/window. |
|
|
17
|
-
| `query_hotspots` | 1 | Where activity is concentrating — grid-binned, ranked. |
|
|
18
|
-
| `search_imagery` | 2 | Satellite scenes (Sentinel-1/2, OPERA RTC-S1) over an area. |
|
|
19
|
-
| `get_world_brief` | **free** | The AI-synthesized Daily World Brief. |
|
|
20
|
-
| `get_usage` | **free** | Your remaining token balance and plan capabilities. |
|
|
21
|
-
| `assess_signal` | 5 / 15 | AI remote-sensing assessment for one signal (quick / deep). |
|
|
22
|
-
| `ask_analyst` | 5–123 | Agentic OSINT/GEOINT Q&A returning a structured, cited brief. |
|
|
23
|
+
Seeing the event is easy. Knowing what you can *prove* — and what evidence is still missing — is
|
|
24
|
+
the product. Delta:
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
- monitors emerging world events and geolocates them
|
|
27
|
+
- checks claims against source-linked open data, and reports the source breadth behind each one
|
|
28
|
+
- assesses whether the event is observable from space, at what resolution, and by which sensor
|
|
29
|
+
- returns a collection-ready recommendation: what to collect, where, and when
|
|
25
30
|
|
|
26
|
-
|
|
31
|
+
## Connect
|
|
27
32
|
|
|
28
|
-
|
|
33
|
+
### Hosted server — recommended
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
No install. Point any MCP client at the remote endpoint and approve once over OAuth 2.1
|
|
36
|
+
(Dynamic Client Registration is supported, so most clients need only the URL):
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
https://offnadir-delta.com/api/v1/mcp
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
In the Claude or ChatGPT apps: **Settings → Connectors → Add custom connector**, paste that URL.
|
|
43
|
+
Cursor and VS Code have one-click installs on the [docs page](https://offnadir-delta.com/docs/mcp).
|
|
44
|
+
|
|
45
|
+
Claude Code:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
claude mcp add --transport http off-nadir-delta https://offnadir-delta.com/api/v1/mcp
|
|
49
|
+
```
|
|
32
50
|
|
|
33
|
-
###
|
|
51
|
+
### This package — local stdio
|
|
52
|
+
|
|
53
|
+
Use this when your client cannot do remote OAuth, or you would rather hold an API key in an
|
|
54
|
+
environment variable and pin a version. Get a key at
|
|
55
|
+
[offnadir-delta.com/account/api](https://offnadir-delta.com/account/api).
|
|
34
56
|
|
|
35
57
|
```json
|
|
36
58
|
{
|
|
@@ -38,46 +60,139 @@ Costs are token charges against your balance. Reading the brief and checking usa
|
|
|
38
60
|
"off-nadir-delta": {
|
|
39
61
|
"command": "npx",
|
|
40
62
|
"args": ["-y", "offnadir-delta-mcp"],
|
|
41
|
-
"env": { "OFFNADIR_DELTA_API_KEY": "
|
|
63
|
+
"env": { "OFFNADIR_DELTA_API_KEY": "ond_..." }
|
|
42
64
|
}
|
|
43
65
|
}
|
|
44
66
|
}
|
|
45
67
|
```
|
|
46
68
|
|
|
47
|
-
|
|
69
|
+
Docker:
|
|
48
70
|
|
|
49
71
|
```bash
|
|
50
|
-
|
|
51
|
-
cd offnadir-delta-mcp
|
|
52
|
-
npm install && npm run build
|
|
53
|
-
OFFNADIR_DELTA_API_KEY=ond_... node dist/index.js
|
|
72
|
+
docker run -i --rm -e OFFNADIR_DELTA_API_KEY=ond_... offnadir-delta-mcp
|
|
54
73
|
```
|
|
55
74
|
|
|
56
|
-
|
|
75
|
+
The package forwards `tools/call` to the hosted server with your key. `tools/list` answers
|
|
76
|
+
locally from a generated catalog, so registries can introspect it without credentials.
|
|
57
77
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
78
|
+
### First call — free
|
|
79
|
+
|
|
80
|
+
10 of the 20 tools cost nothing, so the first thing you run is free:
|
|
81
|
+
|
|
82
|
+
> Give me the latest Daily World Brief. Lead with the three most significant developments,
|
|
83
|
+
> explain why each matters, and cite the supporting signals.
|
|
84
|
+
|
|
85
|
+
Then try the full signal-to-satellite workflow:
|
|
86
|
+
|
|
87
|
+
> Find the highest-priority observable event from the last 24 hours, verify the reporting, and
|
|
88
|
+
> recommend the best available satellite collection plan.
|
|
89
|
+
|
|
90
|
+
## Tools
|
|
91
|
+
|
|
92
|
+
### Discover
|
|
93
|
+
|
|
94
|
+
What is happening, where it concentrates, and what today looks like.
|
|
95
|
+
|
|
96
|
+
| Tool | What it does | Cost |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| `query_signals` | Query geolocated world event signals (Delta Signals: geopolitical, security, disaster, and infrastructure events distilled from global news media, AI-enriched with severity/GEOINT scores and satellite-collection recommendations). | 3 tok |
|
|
99
|
+
| `query_stats` | Aggregate statistics over the signal corpus — total event count plus per-category and per-day breakdown (trend) for a bounding box and date window. | 1 tok |
|
|
100
|
+
| `query_hotspots` | Geographic hotspots — signal density grid-binned into cells, ranked by event count, each with peak severity, the categories present, and up to 5 representative event_ids (trace a cell back to its signals). | 1 tok |
|
|
101
|
+
| `get_world_brief` | Fetch the Daily World Brief — an AI-synthesized OSINT/GEOINT digest of the previous UTC day's worldwide event signals (headline, executive summary, top developments with why-it-matters and what-to-watch, per-theme roll-up, ranked signals). | free |
|
|
102
|
+
|
|
103
|
+
### Plan
|
|
104
|
+
|
|
105
|
+
Whether a satellite can resolve it, which one, and when it next passes.
|
|
106
|
+
|
|
107
|
+
| Tool | What it does | Cost |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| `search_imagery` | Search the satellite imagery catalog (Sentinel-1, Sentinel-2, NISAR L-band) for scenes over an area and date window — the natural follow-up to a signal (find imagery over the event location). | 2 tok |
|
|
110
|
+
| `plan_event_imagery` | Plan the imagery evidence for ONE event in a single call, instead of guessing collections one at a time. | 4 tok |
|
|
111
|
+
| `rank_imaging_priority` | WHERE — and with what class (and therefore cost) of satellite — is observation most worthwhile right now? | 1 tok |
|
|
112
|
+
| `survey_observable_events` | Which events in a window can a given in-app sensor actually RESOLVE? | 1 tok |
|
|
113
|
+
| `predict_satellite_passes` | WHEN can this place next be imaged, and by WHAT — the timing half of collection planning. | 2 tok |
|
|
114
|
+
|
|
115
|
+
### Analyze
|
|
116
|
+
|
|
117
|
+
Turn reporting into a cited assessment you can audit afterwards.
|
|
118
|
+
|
|
119
|
+
| Tool | What it does | Cost |
|
|
120
|
+
| --- | --- | --- |
|
|
121
|
+
| `assess_signal` | Run an AI RS (remote-sensing) deep-dive assessment for a specific signal: what to observe, recommended sensors, and a collection window. | 5/15 tok |
|
|
122
|
+
| `ask_analyst` | Ask the Delta Analyst an OSINT/GEOINT question. | 5–123 tok |
|
|
123
|
+
| `get_analyst_job` | Fetch the status and result of an ask_analyst run by job_id. | free |
|
|
124
|
+
| `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 |
|
|
125
|
+
|
|
126
|
+
### Watch
|
|
127
|
+
|
|
128
|
+
Stand up continuous coverage and be told only when the answer changes. Creating and listing cost nothing — you are metered only when a check actually fires, or a new acquisition is actually measured.
|
|
129
|
+
|
|
130
|
+
| Tool | What it does | Cost |
|
|
131
|
+
| --- | --- | --- |
|
|
132
|
+
| `create_standing_order` | Put an area under CONTINUOUS watch: save a question plus a bounding box and Delta re-answers it on a schedule, notifying only when the answer actually changed. | free |
|
|
133
|
+
| `list_standing_orders` | List the standing orders on this key, with each one’s cadence, watched area, when it last checked, when it last actually fired, and how many consecutive checks found nothing (quiet_checks — a high number means the watch is not earning its place). | free |
|
|
134
|
+
| `delete_standing_order` | Delete a standing order by id, or pause/resume it instead by passing active=false/true. | free |
|
|
135
|
+
| `list_monitored_areas` | List the places under continuous satellite measurement on this key (Delta Monitor), with each area’s metric, most recent value, change since the previous measurement, whether that value was flagged anomalous, and coverage — how many acquisitions were measured versus how many exist. | free |
|
|
136
|
+
| `get_monitored_area` | Fetch one monitored area with its full measurement history — every acquisition that was measured, its value, and whether it was flagged anomalous. | free |
|
|
137
|
+
| `create_monitored_area` | Put a place under continuous satellite measurement: pick an area and what to count, and every new Sentinel-1 / Sentinel-2 / VIIRS acquisition over it is measured automatically from then on. | free |
|
|
138
|
+
|
|
139
|
+
### Account
|
|
140
|
+
|
|
141
|
+
Pre-flight your token balance before a metered call.
|
|
142
|
+
|
|
143
|
+
| Tool | What it does | Cost |
|
|
144
|
+
| --- | --- | --- |
|
|
145
|
+
| `get_usage` | Check the calling key's remaining token balance and plan capabilities — monthly allocation, tokens used this period, tokens remaining, and whether the plan includes AI tools over the API (assess_signal / ask_analyst). | free |
|
|
146
|
+
|
|
147
|
+
## Pricing and metering
|
|
148
|
+
|
|
149
|
+
Usage-based Delta tokens, identical over REST and MCP. Costs above are generated from the same
|
|
150
|
+
constant the biller reads, and every metered result carries the exact charge it incurred — so
|
|
151
|
+
you never have to trust a number in a README. Free tools never touch the balance.
|
|
152
|
+
|
|
153
|
+
`ask_analyst` is **hybrid-async**: it enqueues a run and returns a `job_id` immediately; poll
|
|
154
|
+
`get_analyst_job` (free — the run is charged once, on completion). Most questions finish in
|
|
155
|
+
~30–90s; a brief with satellite-imagery lookups or many sources can take 2–3 minutes.
|
|
156
|
+
|
|
157
|
+
The API and the MCP server are available on **every plan, including Free** — the only gate is
|
|
158
|
+
your token balance. Call `get_usage` (free) to pre-flight. Current limits and package prices:
|
|
159
|
+
[offnadir-delta.com/pricing](https://offnadir-delta.com/pricing).
|
|
160
|
+
|
|
161
|
+
## Authentication
|
|
162
|
+
|
|
163
|
+
Two credentials are accepted on the hosted endpoint:
|
|
164
|
+
|
|
165
|
+
- **OAuth 2.1** with PKCE and Dynamic Client Registration — for interactive clients
|
|
166
|
+
- **Bearer API key** (`Authorization: Bearer ond_...`) — for servers, CI, and this stdio package
|
|
62
167
|
|
|
63
|
-
|
|
168
|
+
Keys are shown once at creation, hashed at rest, and revocable at any time from
|
|
169
|
+
[/account/api](https://offnadir-delta.com/account/api).
|
|
64
170
|
|
|
65
|
-
|
|
66
|
-
|----------|----------|---------|-------|
|
|
67
|
-
| `OFFNADIR_DELTA_API_KEY` | for tool calls | — | Bearer key from `/account/api`. Not needed for `tools/list` introspection. |
|
|
68
|
-
| `OFFNADIR_DELTA_MCP_URL` | no | `https://offnadir-delta.com/api/v1/mcp` | Override the remote endpoint (testing). |
|
|
171
|
+
## Resources and prompts
|
|
69
172
|
|
|
70
|
-
|
|
173
|
+
| Resource | Description |
|
|
174
|
+
| --- | --- |
|
|
175
|
+
| `brief://latest` | The most recent AI-synthesized Daily World Brief (JSON). Free. |
|
|
176
|
+
| `signals://schema` | JSON Schema of the public Signal shape returned by query_signals / /api/v1/signals. |
|
|
177
|
+
| `usage://current` | Remaining token balance and plan capabilities for the calling key. Free. |
|
|
178
|
+
| `imagery://collections` | The satellite catalog collections searchable via search_imagery — Sentinel-1 C-band SAR, Sentinel-2 optical, and NISAR L-band SAR (provisional calibration). Free. |
|
|
179
|
+
| `status://current` | How current the data is (ingestion/enrichment frontier), the Daily World Brief status, and an Operational/Delayed/Degraded roll-up. Free. |
|
|
180
|
+
| `brief://{date}` | The Daily World Brief for a specific UTC date (YYYY-MM-DD). Free. |
|
|
71
181
|
|
|
72
|
-
|
|
182
|
+
| Prompt | Description |
|
|
183
|
+
| --- | --- |
|
|
184
|
+
| `daily-situation-briefing` | Summarize the current world situation from the Daily World Brief. |
|
|
185
|
+
| `assess-top-signal` | Find the highest-severity recent signal in an area/category and run an RS assessment. |
|
|
186
|
+
| `aoi-watch` | Scan an area of interest for recent escalations and recommend collection. |
|
|
187
|
+
| `market-exposure-check` | Find recent events that could plausibly move a given market (oil, grain, shipping, ...) and explain each transmission channel. Informational only — not investment advice. |
|
|
73
188
|
|
|
74
189
|
## Links
|
|
75
190
|
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
191
|
+
- [Tool reference, setup, and one-click installs](https://offnadir-delta.com/docs/mcp)
|
|
192
|
+
- [REST API reference](https://offnadir-delta.com/docs/api) · [OpenAPI](https://offnadir-delta.com/api/v1/openapi.json)
|
|
193
|
+
- [Changelog and compatibility policy](https://offnadir-delta.com/docs/changelog)
|
|
194
|
+
- [Live server version probe](https://offnadir-delta.com/api/v1/version) (no auth, no tokens)
|
|
80
195
|
|
|
81
196
|
## License
|
|
82
197
|
|
|
83
|
-
|
|
198
|
+
Apache-2.0
|
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.8.
|
|
16
|
+
// Generated for Off-Nadir Delta MCP 1.8.2.
|
|
17
17
|
export const TOOLS = [
|
|
18
18
|
{
|
|
19
19
|
"name": "query_signals",
|
|
@@ -450,7 +450,7 @@ export const TOOLS = [
|
|
|
450
450
|
},
|
|
451
451
|
{
|
|
452
452
|
"name": "search_imagery",
|
|
453
|
-
"description": "Search the satellite imagery catalog (Sentinel-1
|
|
453
|
+
"description": "Search the satellite imagery catalog (Sentinel-1, Sentinel-2, NISAR L-band) for scenes over an area and date window — the natural follow-up to a signal (find imagery over the event location). Returns scene metadata (id, datetime, footprint, cloud cover, platform, orbit geometry, coverage, catalog link) — no imagery bytes. Pass eventDate to classify each scene timing=pre/post/same_day_unknown (a same-day scene is same_day_unknown, never post, without a real event time) and get pre/post bracketing + window_status + SAR sar_pair_status in meta. Pass eventPoint [lon,lat] and/or eventAoi [minLon,minLat,maxLon,maxLat] to get each scene's target_relation (covers_event_geometry = pure geometry gate; usable_for_analysis additionally requires acceptable cloud for optical, so a 99%-cloud scene is geometry-covering but not analysis-usable) — so a scene that only clips the wide bbox is not mistaken for covering the event. Costs 2 token(s) per call.",
|
|
454
454
|
"inputSchema": {
|
|
455
455
|
"type": "object",
|
|
456
456
|
"properties": {
|
|
@@ -469,7 +469,7 @@ export const TOOLS = [
|
|
|
469
469
|
"sentinel-1-grd",
|
|
470
470
|
"sentinel-1-rtc",
|
|
471
471
|
"sentinel-2-l2a",
|
|
472
|
-
"
|
|
472
|
+
"NISAR_L2_GCOV_PROVISIONAL_V1"
|
|
473
473
|
],
|
|
474
474
|
"description": "Catalog collection. Defaults to sentinel-2-l2a."
|
|
475
475
|
},
|
|
@@ -1220,7 +1220,7 @@ export const TOOLS = [
|
|
|
1220
1220
|
},
|
|
1221
1221
|
{
|
|
1222
1222
|
"name": "create_standing_order",
|
|
1223
|
-
"description": "Put an area under CONTINUOUS watch: save a question plus a bounding box and Delta re-answers it on a schedule, notifying only when the answer actually changed. Creating one is FREE. Each time it fires it runs ask_analyst and is metered like any Analyst question, so the cost is per CHANGE, not per check: a deterministic pass over the corpus decides whether anything new crossed the reporting bar, and quiet periods never invoke the model or charge anything. Returns projected_monthly_tokens_max
|
|
1223
|
+
"description": "Put an area under CONTINUOUS watch: save a question plus a bounding box and Delta re-answers it on a schedule, notifying only when the answer actually changed. Creating one is FREE. Each time it fires it runs ask_analyst and is metered like any Analyst question, so the cost is per CHANGE, not per check: a deterministic pass over the corpus decides whether anything new crossed the reporting bar, and quiet periods never invoke the model or charge anything. Returns projected_monthly_tokens_typical (the observed median cost per run × this cadence) and projected_monthly_tokens_max (the true ceiling: every check fires AND every run reaches the per-question cap), so the cost is visible before committing. Cadence and how many orders you may hold are set by your plan; the error says which limit you hit. Use it when the question is \"tell me when this changes\" rather than \"what is happening right now\".",
|
|
1224
1224
|
"inputSchema": {
|
|
1225
1225
|
"type": "object",
|
|
1226
1226
|
"properties": {
|
|
@@ -1284,6 +1284,9 @@ export const TOOLS = [
|
|
|
1284
1284
|
"order": {
|
|
1285
1285
|
"type": "object"
|
|
1286
1286
|
},
|
|
1287
|
+
"projected_monthly_tokens_typical": {
|
|
1288
|
+
"type": "number"
|
|
1289
|
+
},
|
|
1287
1290
|
"projected_monthly_tokens_max": {
|
|
1288
1291
|
"type": "number"
|
|
1289
1292
|
}
|
|
@@ -1531,7 +1534,7 @@ export const RESOURCES = [
|
|
|
1531
1534
|
{
|
|
1532
1535
|
"uri": "imagery://collections",
|
|
1533
1536
|
"name": "Imagery collections",
|
|
1534
|
-
"description": "The satellite catalog collections searchable via search_imagery. Free.",
|
|
1537
|
+
"description": "The satellite catalog collections searchable via search_imagery — Sentinel-1 C-band SAR, Sentinel-2 optical, and NISAR L-band SAR (provisional calibration). Free.",
|
|
1535
1538
|
"mimeType": "application/json"
|
|
1536
1539
|
},
|
|
1537
1540
|
{
|
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.8.
|
|
24
|
+
const VERSION = '1.8.2';
|
|
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.8.
|
|
3
|
+
"version": "1.8.2",
|
|
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": {
|