# Off-Nadir-Lab/offnadir-delta-mcp [Health: Active]

**Category:** 🗺️ Location Services  
**Repository:** https://github.com/Off-Nadir-Lab/offnadir-delta-mcp  
**GitHub Stars:** 0  
**npm Downloads (last month):** 2931  
**Views:** 4  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/off-nadir-lab-offnadir-delta-mcp

## Description
Live, geolocated world-event intelligence and a Daily World Brief for AI agents — query event signals (coordinates, severity, sources), hotspots, and satellite imagery (Sentinel-1/2 etc), plus an OSINT/GEOINT analyst. Streamable HTTP + OAuth; free tier, token-metered.

## Tools
Capabilities this server exposes over MCP:

- **query_signals** — Geolocated world events from global news media, AI-enriched with severity/GEOINT scores and collection recommendations.
- **query_stats** — 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.
- **query_hotspots** — 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.
- **get_world_brief** — AI world brief: daily (prior UTC day, all plans) or weekly/monthly by plan. freshness.is_stale: no newer day, so relay as stale.
- **get_usage** — The calling key's remaining token balance and plan capabilities. Pre-flight a metered call with it.
- **search_imagery** — Search the imagery catalog over an area and window. Metadata only, no pixels. eventDate tags each scene pre/post — **a same-day scene is same_day_unknown, never post** — and eventPoint/eventAoi add target_relation, so a scene that only clips the bbox is not read as covering the event.
- **plan_event_imagery** — The deterministic imagery plan for ONE event: checks BOTH sensors exactly once — sentinel-1-grd (SAR, the only look that survives cloud and night) and sentinel-2-l2a — against the event footprint and a pre/post window. **A VHR recommendation never invalidates what the free catalog showed.**
- **rank_imaging_priority** — WHERE, and with what class of satellite, observation is most worthwhile now: composite IMPORTANCE crossed with the SPEC CLASS the required resolution demands — coarse, hr (free Sentinel-class) or vhr. Deterministic.
- **survey_observable_events** — 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.
- **predict_satellite_passes** — 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".
- **assess_signal** — AI remote-sensing deep-dive for one signal: what to observe, sensors, a collection window. Also returns a deterministic `context` whose `imagery_handoff.parameters` are the exact search_imagery inputs. Cached per signal; not-observable signals are rejected before any charge.
- **ask_analyst** — Ask the Delta Analyst an OSINT/GEOINT question; returns a structured brief. **Durable async**: {status:"processing", job_id} comes back immediately and the run finishes in a background worker. Fetch with get_analyst_job, or re-send the SAME idempotencyKey (no second charge).
- **get_analyst_job** — Status and result of an ask_analyst run. Status is "processing", "done" or "error"; result_quality.status is **SEPARATE** — a done job can carry a partial result.
- **query_claims** — The ledger of claims this key was given, each with its evidence class, independent source families and publishers. The point is the time axis: a restated assertion links to the earlier one and says which way the evidence moved.
- **query_developments** — What actually CHANGED about the events in an area, not which articles are new. Each change is labelled `world` (the event's own state moved) or `measurement` (what we can see moved). Plan-dependent values say so (`locked_by`).
- **get_event_thread** — One event end to end: state plus every change in order — the "new event or update" distinction a feed cannot make. `occurred_at_basis` distinguishes stated, absent and never measured. Plan-dependent: see `locked_by`, `plan_lock`.
- **create_standing_order** — Put an area under CONTINUOUS watch: a question plus a bbox, re-answered on a schedule, notifying only when the answer changed. **Cost is per CHANGE, not per check.**
- **list_layer_sets** — 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.
- **get_layer_set** — One saved layer set by id. The serialized layer tree is deliberately not exposed — an internal representation, not a public contract.
- **list_uploaded_layers** — The data this account uploaded to the map, plus the formats the uploader accepts. Uploading happens in the app; GeoJSON and GeoTIFF only.
- **list_standing_orders** — 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.
- **delete_standing_order** — Delete a standing order, or pause/resume with active=false/true. A paused order still counts against the plan limit.
- **list_monitored_areas** — 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.**
- **get_monitored_area** — 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.
- **create_monitored_area** — Put a place under continuous satellite measurement — every new Sentinel-1/2 or VIIRS acquisition is measured. For a QUANTITY at a fixed place; for events use create_standing_order.
- **list_watches** — 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.
- **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.
- **get_decision_package** — Everything needed to decide what to collect next about one watch, in one object. **Only `absent` asserts a negative** — `inconclusive` means imagery could not answer, `not_collected` means no valid look happened. `revision` is a content hash.
- **create_watch** — Add a target to the Watchlist. EVENT: pass the signal's event id and the server binds the canonical event — **never watch an article URL**. AREA: pass a bbox.
- **update_watch** — 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.
- **delete_watch** — 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.
- **add_note** — 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.
- **delete_note** — Delete one note from a watch. The deletion itself stays in the account's action log.
- **search_entities** — Find a place in the location registry — ports, bases, airfields, power plants, chokepoints, named seas. Matches the registry's own names and aliases. At most 50 rows.
- **get_entity** — 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.**
- **get_related_events** — 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`.
- **lookup_elevation** — 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`.
- **analyze_terrain** — 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`.
- **measure_index_series** — 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`.
- **detect_ships** — 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.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "offnadir-delta-mcp": {
    "command": "npx",
    "args": ["-y","offnadir-delta-mcp"],
    "env": {
      "OFFNADIR_DELTA_API_KEY": ""
    }
  }
}
```

**Requires environment variables:** `OFFNADIR_DELTA_API_KEY` — the values above are empty placeholders; fill in real credentials before running (see the repository for what each one is for).

## Documentation

## What Off-Nadir-Lab/offnadir-delta-mcp does

Off-Nadir-Lab/offnadir-delta-mcp exposes the Off-Nadir Delta intelligence service through the Model Context Protocol. It is designed for OSINT, geopolitical-risk, and GEOINT workflows that need current information rather than a static knowledge snapshot.

The service returns geolocated event signals from global news media and other event sources, enriched with severity and GEOINT scores. Agents can inspect aggregate statistics, locate activity hotspots, read a Daily World Brief, examine claims and their evidence, and follow how an event changes over time. Event threads distinguish a newly detected event from a later update and preserve the basis used for an event's reported time.

## How it works

The hosted endpoint is available at `https://offnadir-delta.com/api/v1/mcp`. Interactive clients can authenticate with OAuth 2.1 using PKCE and Dynamic Client Registration. The service also accepts bearer API keys, which are used by servers, CI workflows, and the local stdio package.

Imagery tools separate catalog discovery from interpretation. `search_imagery` returns metadata rather than pixels and labels scenes relative to an event. `plan_event_imagery` checks Sentinel-1 GRD and Sentinel-2 L2A against one event footprint and a pre/post window. Other tools rank imaging priorities, determine whether events are observable, and predict geometric satellite-access opportunities.

`ask_analyst` is asynchronous: it returns a job identifier while a background run continues. `get_analyst_job` retrieves its status and result. Reusing the same idempotency key avoids starting and charging a second run.

## Setup and configuration

For a hosted connection, configure an MCP client with the endpoint URL and complete OAuth approval. The package includes documented connection paths for Claude, Cursor, VS Code, and Claude Code. Claude Code can register the endpoint with:

```bash
claude mcp add --transport http off-nadir-delta https://offnadir-delta.com/api/v1/mcp
```

For local stdio, run the package with Node.js through `npx` and provide `OFFNADIR_DELTA_API_KEY`:

```json
{
  "mcpServers": {
    "off-nadir-delta": {
      "command": "npx",
      "args": ["-y", "offnadir-delta-mcp"],
      "env": { "OFFNADIR_DELTA_API_KEY": "ond_..." }
    }
  }
}
```

Docker can run the same package with the API key passed as an environment variable. The local package forwards tool calls to the hosted service and can expose the generated tool catalog without credentials.

## Tools and capabilities

- Discover signals, daily briefs, statistics, hotspots, claims, developments, and event threads.
- Search imagery metadata and create deterministic plans for Sentinel-1 and Sentinel-2 observations.
- Rank imaging priorities, test event observability, and predict access opportunities across satellite families.
- Ask the Delta Analyst for a structured OSINT/GEOINT brief and retrieve asynchronous results.
- Create and manage watches, standing orders, monitored areas, notes, and account layer data.
- Check token balance and plan capabilities with `get_usage` before metered calls.

The service also exposes resources for the latest or dated brief, signal schema, current usage, system status, and watch data.

## Limitations and notes

Calls follow usage-based token metering, although twelve of the twenty-three tools are free. Returned capabilities depend on the account plan. `get_usage` is available for pre-flight checks.

Imagery search provides metadata only. A predicted satellite pass is a geometric access opportunity, not an operator tasking commitment. In imagery results, a same-day scene is classified as `same_day_unknown`, not automatically as post-event, and a scene that only clips a bounding box is not treated as covering the event.

Standing-order costs apply when an answer changes rather than on every check. Paused standing orders still count toward the plan limit. Pausing a watch stops monitored-area measurement and standing-order checks; closing one requires a reason.

_Full upstream README: https://allmcps.com/mcp/off-nadir-lab-offnadir-delta-mcp/readme_

