offnadir-delta-mcp 1.25.0 → 1.27.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
- `38` tools · MCP server version `1.25.0` · [full reference](https://offnadir-delta.com/docs/mcp)
19
+ `40` tools · MCP server version `1.27.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
- 21 of the 38 tools cost nothing, so the first thing you run is free:
80
+ 23 of the 40 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.
@@ -150,6 +150,8 @@ Stand up continuous coverage and be told only when the answer changes. Creating
150
150
  | `create_watch` | Add a target to the Watchlist. | free |
151
151
  | `update_watch` | Rename a watch, or pause and resume it. | free |
152
152
  | `delete_watch` | Delete a watch by id. | free |
153
+ | `add_note` | Add a note to a watch, start a thread on it, or reply to one — one append-only ledger. | free |
154
+ | `delete_note` | Delete one note from a watch. | free |
153
155
 
154
156
  ### Workspace
155
157
 
@@ -203,7 +205,7 @@ Keys are shown once at creation, hashed at rest, and revocable at any time from
203
205
  | `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. |
204
206
  | `status://current` | How current the data is (ingestion/enrichment frontier), the Daily World Brief status, and an Operational/Delayed/Degraded roll-up. Free. |
205
207
  | `brief://{date}` | The Daily World Brief for a specific UTC date (YYYY-MM-DD). Free. |
206
- | `watch://{watch_id}` | A Watchlist entry with its current state, latest meaningful change, measurements and (for event watches) the full event thread — the same body get_watch returns. Free. |
208
+ | `watch://{watch_id}` | A Watchlist entry with its current state, latest meaningful change, measurements, (for event watches) the full event thread, and the notes kept against it. The same body get_watch returns. Free. |
207
209
 
208
210
  | Prompt | Description |
209
211
  | --- | --- |
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.25.0.
16
+ // Generated for Off-Nadir Delta MCP 1.27.0.
17
17
  export const TOOLS = [
18
18
  {
19
19
  "name": "query_signals",
@@ -815,10 +815,11 @@ export const TOOLS = [
815
815
  "synspective",
816
816
  "iqps",
817
817
  "radarsat-2",
818
- "cosmo-skymed"
818
+ "cosmo-skymed",
819
+ "nisar"
819
820
  ]
820
821
  },
821
- "description": "Families to consider. Omit for all seven. Use this to compare \"free systematic only\" against \"what could I task\"."
822
+ "description": "Families to consider. Omit for all thirteen. Use this to compare \"free systematic only\" (Sentinel, Landsat, NISAR) against \"what could I task\"."
822
823
  },
823
824
  "max_passes": {
824
825
  "type": "number",
@@ -1841,7 +1842,7 @@ export const TOOLS = [
1841
1842
  },
1842
1843
  {
1843
1844
  "name": "get_watch",
1844
- "description": "One watch end to end, in a single call: its target, current state, latest meaningful change, measurements with their recent series, standing-order questions, and — for an event watch — the event’s verification state, casualty/attribution fields, recent developments, imagery availability, and the full event thread (timeline + sources). Built so an agent does not need a chain of follow-up calls to answer \"what is the state of what I watch\". Free of token charges unless include_passes is set; an area watch’s FULL measurement history remains get_monitored_area (export-gated) — this returns the recent series.",
1845
+ "description": "One watch end to end, in a single call: its target, current state, latest meaningful change, measurements with their recent series, standing-order questions, and — for an event watch — the event’s verification state, casualty/attribution fields, recent developments, imagery availability, and the full event thread (timeline + sources). Also returns what this account has written on the watch: the one line saying what it is tracking, and the notes and judgments kept against it, newest first. Built so an agent does not need a chain of follow-up calls to answer \"what is the state of what I watch\". Free of token charges unless include_passes is set; an area watch’s FULL measurement history remains get_monitored_area (export-gated) — this returns the recent series.",
1845
1846
  "inputSchema": {
1846
1847
  "type": "object",
1847
1848
  "properties": {
@@ -2033,6 +2034,126 @@ export const TOOLS = [
2033
2034
  "idempotentHint": true
2034
2035
  }
2035
2036
  },
2037
+ {
2038
+ "name": "add_note",
2039
+ "description": "Add a note to a watch, start a thread on it, or reply to one — one append-only ledger. Give a title and the note becomes a THREAD others can reply to (pass its id as parent_id); give neither and it is a plain note. Replies are one level deep and carry no title of their own. Separately, the difference between a note and a judgment is whether you state a confidence. With no confidence it is a NOTE: something worth writing down about this target, kept with it and superseding nothing. With confidence (high/moderate/low) it is a JUDGMENT, and it supersedes the previous judgment instead of overwriting it, so the record of what was thought when survives; likelihood (ICD 203 terms) separately says how probable the thing itself is. Gaps and a next check can be recorded alongside — what would change this, and when to look again. This is the account’s own record about its own target; it does not change the event’s public verification state. Free of token charges.",
2040
+ "inputSchema": {
2041
+ "type": "object",
2042
+ "properties": {
2043
+ "watch_id": {
2044
+ "type": "string",
2045
+ "description": "The id from list_watches or create_watch."
2046
+ },
2047
+ "note": {
2048
+ "type": "string",
2049
+ "description": "What you want kept with this watch."
2050
+ },
2051
+ "title": {
2052
+ "type": "string",
2053
+ "description": "Give it a heading and the note becomes a thread others can reply to. Omit for a plain note. A reply cannot have one."
2054
+ },
2055
+ "parent_id": {
2056
+ "type": "string",
2057
+ "description": "Reply to this note id (from get_watch). One level deep — reply to the thread, not to a reply."
2058
+ },
2059
+ "confidence": {
2060
+ "type": "string",
2061
+ "enum": [
2062
+ "high",
2063
+ "moderate",
2064
+ "low"
2065
+ ],
2066
+ "description": "How sure this judgment is — a statement about the evidence, not the event. Omit it and the entry is kept as a plain note, which supersedes nothing."
2067
+ },
2068
+ "likelihood": {
2069
+ "type": "string",
2070
+ "enum": [
2071
+ "very unlikely",
2072
+ "unlikely",
2073
+ "roughly even chance",
2074
+ "likely",
2075
+ "very likely",
2076
+ "almost certain"
2077
+ ],
2078
+ "description": "How probable the thing itself is (ICD 203). Omit rather than guess."
2079
+ },
2080
+ "gaps": {
2081
+ "type": "array",
2082
+ "items": {
2083
+ "type": "string"
2084
+ },
2085
+ "description": "What is missing — what would change this judgment. Only meaningful with a confidence."
2086
+ },
2087
+ "next_check": {
2088
+ "type": "string",
2089
+ "description": "When or what to look at next."
2090
+ }
2091
+ },
2092
+ "required": [
2093
+ "watch_id",
2094
+ "note"
2095
+ ]
2096
+ },
2097
+ "outputSchema": {
2098
+ "type": "object",
2099
+ "properties": {
2100
+ "summary": {
2101
+ "type": "string",
2102
+ "description": "One-line natural-language summary of the result, ready to relay to a user."
2103
+ },
2104
+ "note": {
2105
+ "type": "object"
2106
+ }
2107
+ },
2108
+ "required": [
2109
+ "note"
2110
+ ]
2111
+ },
2112
+ "annotations": {
2113
+ "readOnlyHint": false,
2114
+ "openWorldHint": false,
2115
+ "destructiveHint": false
2116
+ }
2117
+ },
2118
+ {
2119
+ "name": "delete_note",
2120
+ "description": "Delete one note from a watch. The note itself is removed; the fact that it was deleted stays in the account’s action log, so nothing disappears without a trace. If the note was a judgment that a later judgment superseded, the later one stays — it simply stops pointing at what it replaced. Free of token charges.",
2121
+ "inputSchema": {
2122
+ "type": "object",
2123
+ "properties": {
2124
+ "watch_id": {
2125
+ "type": "string",
2126
+ "description": "The id from list_watches or create_watch."
2127
+ },
2128
+ "note_id": {
2129
+ "type": "string",
2130
+ "description": "The note id from get_watch or add_note."
2131
+ }
2132
+ },
2133
+ "required": [
2134
+ "watch_id",
2135
+ "note_id"
2136
+ ]
2137
+ },
2138
+ "outputSchema": {
2139
+ "type": "object",
2140
+ "properties": {
2141
+ "summary": {
2142
+ "type": "string",
2143
+ "description": "One-line natural-language summary of the result, ready to relay to a user."
2144
+ },
2145
+ "deleted": {
2146
+ "type": "string"
2147
+ }
2148
+ }
2149
+ },
2150
+ "annotations": {
2151
+ "readOnlyHint": false,
2152
+ "openWorldHint": false,
2153
+ "destructiveHint": true,
2154
+ "idempotentHint": true
2155
+ }
2156
+ },
2036
2157
  {
2037
2158
  "name": "search_entities",
2038
2159
  "description": "Find a place in the location registry — ports and harbours, military bases and airfields, power and energy plants, maritime chokepoints and named seas. Use it to turn a name into something the other tools can anchor on, or to check whether Delta knows a facility at all. Matches the registry’s own names and aliases; a facility whose only recorded name is in the local script is findable by that name, not by an English one that does not exist in the source. Returns at most 50 rows and has no pagination — this is a lookup, not a data export. Costs 1 token per lookup. Cite the returned attribution wherever a registry name is shown.",
@@ -2649,7 +2770,7 @@ export const RESOURCE_TEMPLATES = [
2649
2770
  {
2650
2771
  "uriTemplate": "watch://{watch_id}",
2651
2772
  "name": "One watch, end to end",
2652
- "description": "A Watchlist entry with its current state, latest meaningful change, measurements and (for event watches) the full event thread — the same body get_watch returns. Free.",
2773
+ "description": "A Watchlist entry with its current state, latest meaningful change, measurements, (for event watches) the full event thread, and the notes kept against it. The same body get_watch returns. Free.",
2653
2774
  "mimeType": "application/json"
2654
2775
  }
2655
2776
  ];
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.25.0';
24
+ const VERSION = '1.27.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;
@@ -38,7 +38,16 @@ async function getRemote() {
38
38
  }
39
39
  connecting = (async () => {
40
40
  const transport = new StreamableHTTPClientTransport(REMOTE_URL, {
41
- requestInit: { headers: { Authorization: `Bearer ${apiKey}` } },
41
+ requestInit: {
42
+ headers: {
43
+ Authorization: `Bearer ${apiKey}`,
44
+ // Identify the proxy in the server's request log. Without it every call through this
45
+ // package arrives as a bare `node` and cannot be told apart from any other Node client,
46
+ // so "how much traffic comes through npm" has no answer. Same shape as the Python SDK
47
+ // (`offnadir-delta-python/x.y.z`), which the server already parses.
48
+ 'User-Agent': `offnadir-delta-mcp/${VERSION}`,
49
+ },
50
+ },
42
51
  });
43
52
  const client = new Client({ name: 'offnadir-delta-mcp-proxy', version: VERSION }, { capabilities: {} });
44
53
  await client.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "offnadir-delta-mcp",
3
- "version": "1.25.0",
3
+ "version": "1.27.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": {