@cyanheads/noaa-marine-mcp-server 0.3.0 → 0.3.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.
Files changed (36) hide show
  1. package/AGENTS.md +71 -49
  2. package/CLAUDE.md +71 -49
  3. package/Dockerfile +10 -5
  4. package/LICENSE +1 -1
  5. package/README.md +75 -81
  6. package/changelog/0.3.x/0.3.1.md +29 -0
  7. package/changelog/0.3.x/0.3.2.md +30 -0
  8. package/changelog/template.md +62 -40
  9. package/dist/index.js +6 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/mcp-server/resources/definitions/noaa-marine-station.resource.d.ts.map +1 -1
  12. package/dist/mcp-server/resources/definitions/noaa-marine-station.resource.js +1 -0
  13. package/dist/mcp-server/resources/definitions/noaa-marine-station.resource.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/noaa-marine-find-stations.tool.d.ts +23 -23
  15. package/dist/mcp-server/tools/definitions/noaa-marine-get-conditions.tool.js +1 -1
  16. package/dist/mcp-server/tools/definitions/noaa-marine-get-conditions.tool.js.map +1 -1
  17. package/dist/mcp-server/tools/definitions/noaa-marine-get-current-profile.tool.js +1 -1
  18. package/dist/mcp-server/tools/definitions/noaa-marine-get-current-profile.tool.js.map +1 -1
  19. package/dist/mcp-server/tools/definitions/noaa-marine-get-currents.tool.d.ts +2 -2
  20. package/dist/mcp-server/tools/definitions/noaa-marine-get-currents.tool.js +2 -2
  21. package/dist/mcp-server/tools/definitions/noaa-marine-get-currents.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/noaa-marine-get-ocean-observations.tool.js +1 -1
  23. package/dist/mcp-server/tools/definitions/noaa-marine-get-ocean-observations.tool.js.map +1 -1
  24. package/dist/mcp-server/tools/definitions/noaa-marine-get-tide-predictions.tool.d.ts +5 -5
  25. package/dist/mcp-server/tools/definitions/noaa-marine-get-tide-predictions.tool.js +2 -2
  26. package/dist/mcp-server/tools/definitions/noaa-marine-get-tide-predictions.tool.js.map +1 -1
  27. package/dist/mcp-server/tools/definitions/noaa-marine-get-water-level.tool.d.ts +5 -5
  28. package/dist/mcp-server/tools/definitions/noaa-marine-get-water-level.tool.js +2 -2
  29. package/dist/mcp-server/tools/definitions/noaa-marine-get-water-level.tool.js.map +1 -1
  30. package/dist/services/coops/coops-service.d.ts.map +1 -1
  31. package/dist/services/coops/coops-service.js.map +1 -1
  32. package/dist/services/ndbc/ndbc-service.d.ts.map +1 -1
  33. package/dist/services/ndbc/ndbc-service.js +3 -1
  34. package/dist/services/ndbc/ndbc-service.js.map +1 -1
  35. package/package.json +12 -11
  36. package/server.json +3 -3
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.3.0-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/noaa-marine-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/noaa-marine-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/noaa-marine-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.14-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.3.2-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/noaa-marine-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^2.0.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/noaa-marine-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/noaa-marine-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.4.0-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -27,127 +27,120 @@
27
27
 
28
28
  ---
29
29
 
30
- ## Tools
30
+ ## Overview
31
31
 
32
- Seven tools covering the full US marine operational workflow — station discovery, tide predictions, observed water levels, tidal current predictions and profiles, and live offshore buoy conditions:
32
+ US tide, current, and buoy data from NOAA CO-OPS and NDBC. Find tide, water-level, and current stations plus NDBC buoys, then fetch tide predictions, observed water levels, tidal currents, and live buoy conditions from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
33
+
34
+ ### Tools
33
35
 
34
36
  | Tool | Description |
35
37
  |:-----|:------------|
36
- | `noaa_marine_find_stations` | Find CO-OPS tide/water-level/current stations and NDBC buoys near a location or by name/state. Required first step to resolve place names or coordinates to station IDs. |
37
- | `noaa_marine_get_tide_predictions` | High/low tide predictions for a CO-OPS tide station over a date range. Supports 6-minute interval output and multiple datums (defaults to MLLW — US nautical chart standard). |
38
- | `noaa_marine_get_water_level` | Observed water level (real-time or historical) for a CO-OPS station, paired with predictions to compute storm surge or anomalous drawdown. |
39
- | `noaa_marine_get_currents` | Tidal current predictions for a CO-OPS current station: max flood/ebb speeds, slack times, and directions. Defaults to MAX_SLACK (practical passage-planning view). |
40
- | `noaa_marine_get_conditions` | Live marine conditions from an NDBC buoy: wave height/period/direction, wind, sea-surface temp, air temp, and barometric pressure. |
41
- | `noaa_marine_get_current_profile` | Observed ocean-current depth profile from an NDBC ADCP buoy: speed and direction at each depth bin. Distinct from `noaa_marine_get_currents`, which is a CO-OPS tidal-current forecast. |
42
- | `noaa_marine_get_ocean_observations` | Sub-surface water-column observations from an NDBC station: water temperature, salinity, dissolved oxygen, chlorophyll, turbidity, and pH at each reported depth. The water-column counterpart to `noaa_marine_get_conditions` (surface weather and sea state). |
38
+ | `noaa_marine_find_stations` | Find CO-OPS tide/water-level/current stations and NDBC buoys by location, name, state, or data capability. |
39
+ | `noaa_marine_get_tide_predictions` | High/low tide predictions or a 6-minute curve for a CO-OPS tide station. |
40
+ | `noaa_marine_get_water_level` | Observed water level paired with predictions for a CO-OPS station, with a storm-surge residual summary. |
41
+ | `noaa_marine_get_currents` | CO-OPS tidal current predictions — max flood/ebb/slack events or a 6-minute curve. |
42
+ | `noaa_marine_get_conditions` | Live NDBC buoy conditions: waves, wind, sea-surface and air temperature, pressure. |
43
+ | `noaa_marine_get_current_profile` | Observed ocean-current depth profile from an NDBC ADCP buoy. |
44
+ | `noaa_marine_get_ocean_observations` | Sub-surface water-column observations (temperature, salinity, oxygen, and more) from an NDBC station. |
43
45
 
44
- ### `noaa_marine_find_stations`
46
+ ### Resources
45
47
 
46
- Unified station discovery across CO-OPS (3,450+ tide/water-level stations, 4,430+ current stations) and NDBC (1,354+ active buoys worldwide).
48
+ | Resource | Description |
49
+ |:---|:---|
50
+ | `noaa-marine://station/{station_id}` | Metadata for a CO-OPS or NDBC station by ID: name, coordinates, source, data capabilities, and — for NDBC — physical platform class. |
47
51
 
48
- - Filter by proximity (latitude/longitude + radius), name substring, state/territory, source (CO-OPS vs NDBC), or `types`: data capabilities (tide, current, water_level, met, current_profile) or NDBC platform class (buoy)
49
- - Returns a unified station list with source, coordinates, distance, data capabilities, and — for NDBC — the physical platform class (buoy, fixed, oilrig, dart, tao, usv, other)
50
- - Station lists are cached in-memory (6-hour TTL) — first call after startup may be slightly slower
51
- - Required first step: CO-OPS and NDBC use non-overlapping ID systems; guessing a station ID reliably fails
52
+ All resource data is also reachable via tools — use `noaa_marine_find_stations` to discover station IDs before accessing the resource.
52
53
 
53
- ---
54
+ ## Capability reference
55
+
56
+ ### `noaa_marine_find_stations` <sub>tool</sub>
54
57
 
55
- ### `noaa_marine_get_tide_predictions`
58
+ - Filter by proximity (`latitude`/`longitude` + `radius_km`, default 100 km, max 1000 km), name/ID substring, US state/territory (CO-OPS only), source (`coops`/`ndbc`/`all`), or `types`: data capabilities (`tide`, `current`, `water_level`, `met`, `current_profile`) or NDBC platform class (`buoy`)
59
+ - Returns up to `limit` (default 20, max 200) unified stations with source, coordinates, distance, data capabilities, and — for NDBC — physical platform class (buoy, fixed, oilrig, dart, tao, usv, other)
60
+ - `total_found` and `truncated` report the full match count before the limit is applied
61
+ - Station lists are cached in-memory with a 6-hour TTL — first call after startup may be slightly slower
62
+ - Typed `incomplete_coordinates` error when only one of latitude/longitude is supplied; `no_results` when nothing matches
56
63
 
57
- CO-OPS MLLW tide predictions for planning tidal windows.
64
+ ---
65
+
66
+ ### `noaa_marine_get_tide_predictions` <sub>tool</sub>
58
67
 
59
- - High/low events (default) or 6-minute continuous curve
68
+ - `hilo` (default, high/low events) or `6min` continuous curve; up to 1 year per request
60
69
  - Eight datums: MLLW (default, US nautical chart), MHHW, MSL, MTL, MHW, MLW, CD, STND
61
- - Time zone options: local standard/daylight (default), GMT, local standard only
62
- - Units: English (feet, default) or metric (meters)
63
- - Maximum date range: 1 year per request (typed error `date_range_exceeded` for longer ranges)
70
+ - Time zone (`lst_ldt` default, `gmt`, `lst`) and units (`english` default feet, `metric` meters)
71
+ - Typed `date_range_exceeded`, `invalid_date_range`, `station_not_found`, and `no_predictions` errors
64
72
 
65
73
  ---
66
74
 
67
- ### `noaa_marine_get_water_level`
68
-
69
- Observed water level vs. predicted — the storm surge view.
75
+ ### `noaa_marine_get_water_level` <sub>tool</sub>
70
76
 
71
- - 6-minute observed water level readings with quality flags
72
- - Paired tide predictions fetched in parallel (failure degrades gracefully — observed levels still returned)
73
- - Optional residual summary: max surge and max drawdown when both series are present
74
- - Maximum date range: 31 days per request for 6-minute data
77
+ - 6-minute observed water level with quality flags (`p` preliminary, `v` verified) and optional sensor `sigma`
78
+ - Paired 6-minute tide predictions fetched in parallel — failure degrades gracefully, observed levels still return
79
+ - `residual_summary` (max surge, max drawdown) only when both series are present
80
+ - Up to 31 days per request; typed `date_range_exceeded`, `station_not_found`, and `no_data` errors
75
81
 
76
82
  ---
77
83
 
78
- ### `noaa_marine_get_currents`
84
+ ### `noaa_marine_get_currents` <sub>tool</sub>
79
85
 
80
- CO-OPS tidal current predictions for passage planning.
81
-
82
- - MAX_SLACK interval (default): max flood, max ebb, and slack events only — the actionable view for transiting inlets and channels
83
- - 6-minute interval: full continuous current curve for charting or integration
84
- - Current station IDs use alphanumeric format (e.g., `ACT4176`), distinct from numeric tide station IDs — use `find_stations` with `types: ["current"]` to discover them
86
+ - `MAX_SLACK` (default): max flood, max ebb, and slack events only — the actionable view for passage planning
87
+ - `6min`: continuous current curve; units `english` (knots, default) or `metric` (m/s)
88
+ - Current station IDs are alphanumeric (e.g. `ACT4176`), distinct from numeric tide/water-level IDs
89
+ - Up to 1 year per request; typed `date_range_exceeded`, `invalid_date_range`, `station_not_found`, and `no_predictions` errors
85
90
 
86
91
  ---
87
92
 
88
- ### `noaa_marine_get_conditions`
89
-
90
- Live NDBC buoy observations (most recent ~45 days, updated every 10 minutes).
93
+ ### `noaa_marine_get_conditions` <sub>tool</sub>
91
94
 
92
- - Wave height (m), dominant and average period (sec), mean wave direction
93
- - Wind speed and gust (m/s), wind direction
94
- - Sea-surface temperature, air temperature, dew point (°C)
95
- - Barometric pressure (hPa)
96
- - All sensor fields nullable (`null` when buoy sensor did not report — normal for offshore buoys)
97
- - All values in SI units except `TIDE` (feet) and `VIS` (nautical miles), which are rarely populated at offshore buoys
95
+ - Wave height/period/direction, wind speed/gust/direction, sea-surface and air temperature, dew point, barometric pressure
96
+ - All values SI except `tide_ft` (feet) and `visibility_nmi` (nautical miles), both rarely populated at offshore buoys
97
+ - Every sensor field is nullable — `null` when the buoy did not report, never a fabricated value
98
+ - Updated roughly every 10 minutes; typed `buoy_not_found` and `no_sensor_data` errors
98
99
 
99
100
  ---
100
101
 
101
- ### `noaa_marine_get_current_profile`
102
-
103
- Observed ocean-current depth profile from an NDBC ADCP buoy — the most recent measurement at each depth bin.
102
+ ### `noaa_marine_get_current_profile` <sub>tool</sub>
104
103
 
105
- - Depth (m), direction (degrees true, the direction the current flows toward), and speed (cm/s) per bin
106
- - Distinct from `noaa_marine_get_currents`: this is an NDBC *observed* acoustic-Doppler measurement, not a CO-OPS tidal-current *prediction*
107
- - Most NDBC stations serve no ADCP profile — use `find_stations` with `source="ndbc"` and `types: ["current_profile"]` to discover the ones that do
108
- - Direction or speed is `null` for a bin when NDBC did not report that component
104
+ - Depth (m), direction (degrees true, flow-toward), and speed (cm/s) per bin, shallowest first
105
+ - Observed NDBC ADCP measurement — distinct from `noaa_marine_get_currents`, a CO-OPS tidal-current *prediction*
106
+ - Most NDBC stations serve no ADCP profile; use `find_stations` with `types: ["current_profile"]` to discover ones that do
107
+ - Direction or speed is `null` per bin when the sensor did not report that component; typed `profile_not_found` and `no_current_data` errors
109
108
 
110
- ### `noaa_marine_get_ocean_observations`
109
+ ---
111
110
 
112
- Sub-surface water-column observations from an NDBC station — the most recent reading at each reported depth.
111
+ ### `noaa_marine_get_ocean_observations` <sub>tool</sub>
113
112
 
114
- - Water temperature (°C), conductivity (mS/cm), salinity (psu), dissolved oxygen (% saturation and ppm), chlorophyll (µg/l), turbidity (FTU), pH, and redox potential (mV) per depth
115
- - The water-column counterpart to `noaa_marine_get_conditions`: this reports what the water is doing below the surface, that one reports surface weather and sea state
116
- - Sensor coverage is sparse — most stations report only temperature and salinity; any value the station did not report comes back `null`, never a fabricated zero
117
- - Sub-surface sensors are on only a subset of NDBC stations and carry no station-catalog flag, so there is no capability filter — call it on candidate `source="ndbc"` station IDs and expect the `observations_not_found` error on the many stations that serve no ocean file
113
+ - Water temperature, conductivity, salinity, dissolved oxygen (% and ppm), chlorophyll, turbidity, pH, and redox potential per depth
114
+ - Water-column counterpart to `noaa_marine_get_conditions` (surface weather and sea state)
115
+ - Sensor coverage is sparse — most stations report only temperature and salinity; unreported values are `null`, never a fabricated zero
116
+ - No capability filter identifies ocean-sensor coverage — call on candidate `source="ndbc"` IDs and expect `observations_not_found` on stations with no `.ocean` file
118
117
 
119
- ## Resources and prompts
118
+ ---
120
119
 
121
- | Type | Name | Description |
122
- |:-----|:-----|:------------|
123
- | Resource | `noaa-marine://station/{station_id}` | Metadata for a CO-OPS or NDBC station by ID: name, coordinates, source, data capabilities, state, and — for NDBC — physical platform class. |
120
+ ### `noaa-marine://station/{station_id}` <sub>resource</sub>
124
121
 
125
- All resource data is also reachable via tools. Use `noaa_marine_find_stations` to discover station IDs before accessing the resource.
122
+ - Station record as `application/json` — name, coordinates, source, capabilities, state, and (NDBC) platform class
123
+ - `station_id` comes from `noaa_marine_find_stations`
124
+ - Cached with a 6-hour TTL (`cacheHint`)
126
125
 
127
126
  ## Features
128
127
 
129
- Built on [`@cyanheads/mcp-ts-core`](https://www.npmjs.com/package/@cyanheads/mcp-ts-core):
130
-
131
- - Declarative tool and resource definitions — single file per primitive, framework handles registration and validation
132
- - Unified error handling — handlers throw, framework catches, classifies, and formats with typed error contracts
133
- - Structured logging with optional OpenTelemetry tracing
134
- - STDIO and Streamable HTTP transports
135
- - Pluggable auth: `none`, `jwt`, `oauth`
128
+ Built on [`@cyanheads/mcp-ts-core`](https://github.com/cyanheads/mcp-ts-core): stdio and Streamable HTTP transports, pluggable auth (`none` / `jwt` / `oauth`), swappable storage (`in-memory`, `filesystem`, `Supabase`, `Cloudflare KV/R2/D1`), structured logging with optional OpenTelemetry tracing.
136
129
 
137
- NOAA-specific:
130
+ CO-OPS / NDBC-specific:
138
131
 
139
132
  - In-memory station cache (6-hour TTL) for CO-OPS and NDBC station lists — discovery is fast after first startup
140
133
  - CO-OPS and NDBC integrated in a unified station model — `find_stations` fans out across both sources in parallel
141
- - NDBC fixed-width text parser: `MM` (missing sensor data) normalized to `null`, not passed through as strings
142
- - Paired water-level + prediction fetches for storm surge residual computation
134
+ - NDBC fixed-width text parser normalizes `MM` (missing sensor data) to `null`, never passes it through as a string
135
+ - Paired water-level and prediction fetches for storm-surge residual computation
143
136
  - CO-OPS `application=` courtesy parameter sent on every request (configurable via `NOAA_APPLICATION_ID`)
144
137
 
145
138
  Agent-friendly output:
146
139
 
147
- - Datum echoed on every tide/water-level response — agents can state units and reference correctly without assumptions
148
- - `total_found` on `find_stations` shows count before `limit` slice so agents know whether to re-query
149
- - All NDBC sensor fields explicitly nullable with per-field unit documentation — agents don't fabricate missing readings
150
- - Typed station source (`coops` | `ndbc`) on every station record, plus a data-capability `type` and (NDBC only) a `platform` class where applicable — agents can branch on data, not string parsing
140
+ - Datum echoed on every tide/water-level response so agents state units and reference correctly without assumptions
141
+ - `total_found` on `find_stations` shows the count before the `limit` slice, so agents know whether to re-query
142
+ - All NDBC sensor fields explicitly nullable — agents don't fabricate missing readings
143
+ - Typed station `source` (`coops` | `ndbc`) plus a data-capability `type` and (NDBC only) a `platform` class — agents branch on data, not string parsing
151
144
 
152
145
  ## Getting started
153
146
 
@@ -168,7 +161,7 @@ Connect directly via Streamable HTTP — no install, no API key:
168
161
  }
169
162
  ```
170
163
 
171
- ### Self-hosted / local
164
+ ### Self-Hosted / Local
172
165
 
173
166
  Add the following to your MCP client configuration file:
174
167
 
@@ -233,7 +226,7 @@ MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
233
226
 
234
227
  ### Prerequisites
235
228
 
236
- - [Bun v1.3.14](https://bun.sh/) or higher (or Node.js v24+).
229
+ - [Bun v1.4.0](https://bun.sh/) or higher (or Node.js v24+).
237
230
  - No external API keys needed — NOAA CO-OPS and NDBC are fully open.
238
231
 
239
232
  ### Installation
@@ -271,6 +264,7 @@ cp .env.example .env
271
264
  | `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http`. | `stdio` |
272
265
  | `MCP_HTTP_PORT` | Port for HTTP server. | `3010` |
273
266
  | `MCP_AUTH_MODE` | Auth mode: `none`, `jwt`, or `oauth`. | `none` |
267
+ | `MCP_SESSION_MODE` | HTTP session mode: `auto`, `stateful`, or `stateless`. The server declares `stateless` in `src/index.ts`; set this to override. | `stateless` |
274
268
  | `MCP_LOG_LEVEL` | Log level (RFC 5424). | `info` |
275
269
  | `LOGS_DIR` | Directory for log files (Node.js only). | `<project-root>/logs` |
276
270
  | `OTEL_ENABLED` | Enable [OpenTelemetry instrumentation](https://github.com/cyanheads/mcp-ts-core/tree/main/docs/telemetry). | `false` |
@@ -316,7 +310,7 @@ The Dockerfile defaults to HTTP transport, stateless session mode, and logs to `
316
310
  | `src/config/` | `NOAA_APPLICATION_ID` env var parsing with Zod. |
317
311
  | `src/services/coops/` | CO-OPS Tides & Currents API client: station list cache, data fetch, error detection. |
318
312
  | `src/services/ndbc/` | NDBC buoy service: active stations XML parser, realtime text parser. |
319
- | `src/mcp-server/tools/` | Five tool definitions (`*.tool.ts`). |
313
+ | `src/mcp-server/tools/` | Seven tool definitions (`*.tool.ts`). |
320
314
  | `src/mcp-server/resources/` | Station metadata resource (`noaa-marine-station.resource.ts`). |
321
315
  | `tests/` | Vitest tests mirroring `src/`. |
322
316
  | `docs/` | Design doc and directory tree. |
@@ -333,7 +327,7 @@ See [`CLAUDE.md`/`AGENTS.md`](./CLAUDE.md) for development guidelines and archit
333
327
 
334
328
  ## Contributing
335
329
 
336
- Issues and pull requests are welcome. Run checks and tests before submitting:
330
+ Issues are welcome. Run checks and tests before submitting:
337
331
 
338
332
  ```sh
339
333
  bun run devcheck
@@ -0,0 +1,29 @@
1
+ ---
2
+ summary: "Adopts mcp-ts-core 0.12.3 with MCP 2026-07-28 compatibility, strict tool inputs, cache hints, and an explicit stateless HTTP default"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.3.1 — 2026-08-24
8
+
9
+ ## Added
10
+
11
+ - **MCP cache hints** — definition lists advertise a 24-hour public TTL, while station metadata advertises a 6-hour public TTL to MCP 2026-07-28 clients.
12
+ - **Community health files** — adds contribution guidance and a code of conduct; private vulnerability reports use `security@caseyjhand.com`.
13
+
14
+ ## Changed
15
+
16
+ - **MCP protocol behavior** — `@cyanheads/mcp-ts-core` `^0.10.14 → 0.12.3` serves MCP 2026-07-28 and 2025-era clients, rejects undeclared root tool arguments, and declares the structured error envelope.
17
+ - **HTTP sessions** — `.env.example`, the Docker image, and README now explicitly use `MCP_SESSION_MODE=stateless`; the framework's `auto` schema default remains documented as resolving to stateful.
18
+ - **Framework contracts** — services pass the unified `Context` directly, and CO-OPS/NDBC error mapping reads the canonical `data.status` field.
19
+ - **Project tooling** — adopts the current mcp-ts-core TypeScript, packaging, MCPB cleanup, dependency, documentation, and skill scaffolds.
20
+
21
+ ## Dependencies
22
+
23
+ - `@cyanheads/mcp-ts-core` `^0.10.14 → 0.12.3`
24
+ - `@biomejs/biome` `^2.5.1 → ^2.5.10`
25
+ - `@types/node` `^26.1.1 → ^26.2.0`
26
+ - `tsc-alias` `^1.9.1 → ^1.9.2`
27
+ - `typescript` `^6.0.3 → ^7.0.2`
28
+ - `vitest` `^4.1.10 → ^4.1.11`
29
+ - Bun `packageManager` and Docker images `1.3.14 → 1.4.0`
@@ -0,0 +1,30 @@
1
+ ---
2
+ summary: "Adopts mcp-ts-core 0.13.2: sessionMode is declared in src/index.ts rather than left to MCP_SESSION_MODE, argument rejections carry the structured error envelope, a CO-OPS/NDBC 500 now retries, and the framework skill tree moves to framework-skills/."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.3.2 — 2026-09-16
8
+
9
+ ## Added
10
+
11
+ - **`createApp({ sessionMode: 'stateless' })`** declares the HTTP session posture in `src/index.ts` instead of relying on the `MCP_SESSION_MODE` env default; the `/.well-known/mcp.json` server card now publishes the resolved mode under `_meta` key `io.github.cyanheads.mcp-ts-core/sessionMode`.
12
+ - **`bun run audit:fix`** (`bun audit fix`) — first response to a transitive advisory, ahead of `bun update <name>`, `bun dedupe`, and `audit:refresh`.
13
+
14
+ ## Changed
15
+
16
+ - **Framework** `@cyanheads/mcp-ts-core` `0.12.3` → `^0.13.2`.
17
+ - **Argument rejections carry `structuredContent.error`** — an invalid tool call now returns `isError: true` with `error.code` `-32602` alongside the existing readable text.
18
+ - **A CO-OPS/NDBC upstream 500 retries** instead of failing on the first attempt; a 501 carries `data.retryable: false` (cyanheads/mcp-ts-core#323).
19
+ - **`NOAA_APPLICATION_ID`** reads an empty string or an unsubstituted `${…}` placeholder as unset, falling back to the `noaa-marine-mcp-server` default instead of sending the literal text (cyanheads/mcp-ts-core#427).
20
+ - **`SIGTERM`/`SIGINT` end the process explicitly** — exit `0` once shutdown settles, `1` on the 10s ceiling.
21
+ - **Bun engines floor raised to `>=1.4.0`.**
22
+ - **Framework skill tree moved `skills/` → `framework-skills/`** so the `.mcpb` bundle and plugin installs no longer ship development skills (cyanheads/mcp-ts-core#428).
23
+ - **Repo docs refreshed** — README restructured around an Overview and a per-primitive capability reference; issue forms, `CONTRIBUTING.md`, and `.claude-plugin/plugin.json` (`$schema`, keywords) updated for the current conventions.
24
+
25
+ ## Dependencies
26
+
27
+ - `zod` `^4.4.3` → `^4.6.4`
28
+ - `@biomejs/biome` `^2.5.10` → `^2.5.13`
29
+ - `ignore` `^7.0.6` → `^7.0.9`
30
+ - `tsc-alias` `^1.9.2` → `^1.9.5`
@@ -4,10 +4,11 @@
4
4
  # to author a new release. Set that file's H1 to `# <version> — YYYY-MM-DD`
5
5
  # with a concrete date.
6
6
 
7
- # Required. One-line GitHub Release-style headline. 350 character cap.
8
- # Default short and scannable. Don't pad, don't stitch unrelated changes with
9
- # semicolons — pick the headline. Quotes required: unquoted YAML treats `: `
10
- # inside the value as a key separator and fails GitHub's strict parser.
7
+ # Required. One-line GitHub Release-style headline. 350 character cap — a
8
+ # ceiling, not a target. Default short and scannable. Don't pad, don't stitch
9
+ # unrelated changes with commas/semicolons into an inventory — pick the
10
+ # headline, like a tag's theme line. Quotes required: unquoted YAML treats
11
+ # `: ` inside the value as a key separator and fails GitHub's strict parser.
11
12
  summary: ""
12
13
 
13
14
  # Set `true` when consumers must change code to upgrade: API removals,
@@ -24,9 +25,10 @@ security: false
24
25
 
25
26
  # Optional free-form notes for maintenance agents processing this release.
26
27
  # Not rendered in CHANGELOG — consumed by agents running `maintenance` on
27
- # downstream servers. Use for adoption instructions that don't fit the
28
- # human-facing sections: new files to create, fields to populate, one-time
29
- # migration steps. Omit the field entirely when there's nothing to say.
28
+ # downstream servers. ADOPTION STEPS ONLY — new files to create, fields to
29
+ # populate, one-time migration steps. Never a second rendering of the body:
30
+ # if a body bullet already says it, name the bullet's symbol instead of
31
+ # re-explaining. Omit the field entirely when there's nothing to say.
30
32
  # agent-notes: |
31
33
  # <instructions for downstream maintenance agents>
32
34
  ---
@@ -41,17 +43,54 @@ security: false
41
43
  each bullet with the symbol or concept name in **bold** so they can skip
42
44
  what's irrelevant and zoom in on what's not.
43
45
 
44
- Tone: terse, fact-dense, not verbose. Default to one sentence per bullet —
45
- name the symbol, state what changed, stop. Use a second sentence only when
46
- it carries weight. If a bullet feels long, it is.
47
-
48
- Cut: mechanism walkthroughs (those belong in JSDoc, CLAUDE.md/AGENTS.md, or the
49
- relevant skill), ceremonial framings ("This release introduces…",
50
- backwards-compat paragraphs), file-by-file test enumerations, internal
51
- implementation notes. Prefer code/symbol names over English re-explanations.
46
+ Tone: terse, fact-dense, not verbose. Bullet shape: **symbol** + what
47
+ changed + at most one consumer-facing caveat. One sentence by default, two
48
+ when the second carries weight — a bullet past ~40 words or three sentences
49
+ is wrong. The depth lives one hop away: the linked issue carries the why,
50
+ the commit diff carries the how. The changelog names what changed and what
51
+ a consumer does about it; a reader who wants mechanism opens the link.
52
+
53
+ Model length on THIS guide, never on the previous entry — entries modeled
54
+ on entries compound.
55
+
56
+ Cut (each has shipped as a wall of text; these are the cruft):
57
+ - History/justification narration — how the bug worked, why the old
58
+ behavior was wrong. One short clause at most; the issue carries the story.
59
+ - Design-rationale defense — "chosen over Y because…", "guarding the
60
+ getter is not enough…". That is the author arguing with a reviewer;
61
+ reviewers read the PR, not the changelog.
62
+ - Defensive unchanged-clauses — "X is unchanged", "byte-identical to
63
+ <prev>". Keep one only where its absence would cause a real misread,
64
+ as a short parenthetical.
65
+ - Edge-case inventories — marker lists, not-flagged lists, escape tables.
66
+ Tests and the issue carry those.
67
+ - Mechanism walkthroughs (JSDoc, CLAUDE.md/AGENTS.md, or the relevant
68
+ skill own those), ceremonial framings ("This release introduces…"),
69
+ backwards-compat paragraphs, file-by-file test enumerations. Prefer
70
+ code/symbol names over English re-explanations.
71
+
72
+ Verified ≠ included: the every-claim-verified-from-the-diff rule bounds
73
+ the TRUTH of what you write, never the AMOUNT.
74
+
75
+ Example — same fact, right size:
76
+
77
+ TOO LONG: **`fetchWithTimeout`'s `timeoutMs` bounds the whole exchange**
78
+ (#341). `fetch` resolves once headers arrive and the deadline was
79
+ cleared as the helper returned, so a peer that answered promptly and
80
+ then stalled the stream held the request open indefinitely. A 2xx
81
+ carrying a body now comes back as a passthrough wrapper that disarms
82
+ the deadline when the body closes, errors, or is cancelled; …
83
+ [+90 more words of mechanism and edge cases]
84
+
85
+ RIGHT: **`fetchWithTimeout`'s `timeoutMs` now bounds the whole
86
+ exchange, not just the headers** (#341). A stalled body aborts with
87
+ the same `Timeout` error; the returned `Response` is a wrapper, so
88
+ identity assertions (`toBe(response)`) no longer hold.
52
89
 
53
90
  Narrative intro: skip by default. Add one short sentence only when the
54
- release theme genuinely needs framing the bullets can't carry.
91
+ release theme genuinely needs framing the bullets can't carry. When many
92
+ bullets share one upgrade consequence, state it ONCE — intro line or
93
+ agent-notes — never per bullet.
55
94
 
56
95
  Sections: Keep a Changelog order — Added, Changed, Deprecated, Removed,
57
96
  Fixed, Security. Include only sections with entries; delete the rest
@@ -78,30 +117,13 @@ security: false
78
117
  in that unrelated item's metadata.
79
118
 
80
119
  TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
81
- via `gh release create --notes-from-tag`. The tag is a derivative of this
82
- changelog entry — a condensed, scannable version, not a copy. Format:
83
-
84
- <theme — omit version number, GitHub prepends it>
85
- ← blank line
86
- <1-2 sentence context: what this release does>
87
- ← blank line
88
- Dependency bumps: ← section header
89
- ← blank line
90
- - `@cyanheads/mcp-ts-core` ^0.9.1 → ^0.9.6 ← bullet
91
- ← blank line
92
- Changed: ← only sections with entries
93
- ← blank line
94
- - `format()` output includes `query` in text mode
95
- ← blank line
96
- Added:
97
- ← blank line
98
- - `manifest.json` scaffolded for MCPB bundle support
99
- - Install badges (Claude Desktop, Cursor, VS Code)
100
- ← blank line
101
- <N> tests pass; `bun run devcheck` clean. ← footer
102
-
103
- Never a flat comma-separated string. Always structured markdown with
104
- sections. The tag must scan well as a rendered GitHub Release page.
120
+ via `gh release create --notes-from-tag`. It is a condensed digest of this
121
+ entry, never a copy, and its format is owned by the `release-and-publish`
122
+ skill (step 4, "Create the annotated tag"): the entry's `summary:` as the
123
+ theme line without the version, flat headline bullets — no Keep-a-Changelog
124
+ section headers, no gates line — at most one deps line, issue backlinks,
125
+ and the changelog link last. In release-PR mode the `git-wrapup` skill
126
+ authors that digest as the PR body's `## Changes` and the tag copies it.
105
127
  -->
106
128
 
107
129
  ## Added
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ import { initNdbcService } from './services/ndbc/ndbc-service.js';
18
18
  await createApp({
19
19
  name: 'noaa-marine-mcp-server',
20
20
  title: 'noaa-marine-mcp-server',
21
+ sessionMode: 'stateless',
21
22
  tools: [
22
23
  noaaMarineFindStations,
23
24
  noaaMarineGetTidePredictions,
@@ -29,6 +30,11 @@ await createApp({
29
30
  ],
30
31
  resources: [noaaMarineStationResource],
31
32
  prompts: [],
33
+ cacheHints: {
34
+ 'tools/list': { ttlMs: 86_400_000, cacheScope: 'public' },
35
+ 'resources/list': { ttlMs: 86_400_000, cacheScope: 'public' },
36
+ 'resources/templates/list': { ttlMs: 86_400_000, cacheScope: 'public' },
37
+ },
32
38
  instructions: 'US marine conditions via NOAA CO-OPS and NDBC. ' +
33
39
  'Start with noaa_marine_find_stations to resolve a location or name to station IDs, ' +
34
40
  'then call the appropriate data tool. ' +
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oEAAoE,CAAC;AAC/G,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,uBAAuB,EAAE,MAAM,mEAAmE,CAAC;AAC5G,OAAO,EAAE,2BAA2B,EAAE,MAAM,wEAAwE,CAAC;AACrH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iEAAiE,CAAC;AACxG,OAAO,EAAE,8BAA8B,EAAE,MAAM,2EAA2E,CAAC;AAC3H,OAAO,EAAE,4BAA4B,EAAE,MAAM,yEAAyE,CAAC;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,SAAS,CAAC;IACd,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,wBAAwB;IAC/B,KAAK,EAAE;QACL,sBAAsB;QACtB,4BAA4B;QAC5B,uBAAuB;QACvB,qBAAqB;QACrB,uBAAuB;QACvB,2BAA2B;QAC3B,8BAA8B;KAC/B;IACD,SAAS,EAAE,CAAC,yBAAyB,CAAC;IACtC,OAAO,EAAE,EAAE;IACX,YAAY,EACV,iDAAiD;QACjD,qFAAqF;QACrF,uCAAuC;QACvC,uEAAuE;QACvE,uEAAuE;QACvE,4DAA4D;QAC5D,mGAAmG;QACnG,2EAA2E;QAC3E,qIAAqI;QACrI,mGAAmG;QACnG,gFAAgF;QAChF,mFAAmF;IAErF,KAAK,CAAC,IAAI;QACR,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1D,eAAe,EAAE,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oEAAoE,CAAC;AAC/G,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,EAAE,uBAAuB,EAAE,MAAM,mEAAmE,CAAC;AAC5G,OAAO,EAAE,2BAA2B,EAAE,MAAM,wEAAwE,CAAC;AACrH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iEAAiE,CAAC;AACxG,OAAO,EAAE,8BAA8B,EAAE,MAAM,2EAA2E,CAAC;AAC3H,OAAO,EAAE,4BAA4B,EAAE,MAAM,yEAAyE,CAAC;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,SAAS,CAAC;IACd,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EAAE,WAAW;IACxB,KAAK,EAAE;QACL,sBAAsB;QACtB,4BAA4B;QAC5B,uBAAuB;QACvB,qBAAqB;QACrB,uBAAuB;QACvB,2BAA2B;QAC3B,8BAA8B;KAC/B;IACD,SAAS,EAAE,CAAC,yBAAyB,CAAC;IACtC,OAAO,EAAE,EAAE;IACX,UAAU,EAAE;QACV,YAAY,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE;QACzD,gBAAgB,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE;QAC7D,0BAA0B,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE;KACxE;IACD,YAAY,EACV,iDAAiD;QACjD,qFAAqF;QACrF,uCAAuC;QACvC,uEAAuE;QACvE,uEAAuE;QACvE,4DAA4D;QAC5D,mGAAmG;QACnG,2EAA2E;QAC3E,qIAAqI;QACrI,mGAAmG;QACnG,gFAAgF;QAChF,mFAAmF;IAErF,KAAK,CAAC,IAAI;QACR,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC1D,eAAe,EAAE,CAAC;IACpB,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"noaa-marine-station.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/noaa-marine-station.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAKrD,eAAO,MAAM,yBAAyB;;wCAoGpC,CAAC"}
1
+ {"version":3,"file":"noaa-marine-station.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/noaa-marine-station.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAKrD,eAAO,MAAM,yBAAyB;;wCAqGpC,CAAC"}
@@ -16,6 +16,7 @@ export const noaaMarineStationResource = resource('noaa-marine://station/{statio
16
16
  'NDBC station IDs are 5-character alphanumeric codes. ' +
17
17
  'Use noaa_marine_find_stations to discover station IDs.',
18
18
  mimeType: 'application/json',
19
+ cacheHint: { ttlMs: 21_600_000, cacheScope: 'public' },
19
20
  params: z.object({
20
21
  station_id: z
21
22
  .string()
@@ -1 +1 @@
1
- {"version":3,"file":"noaa-marine-station.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/noaa-marine-station.resource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"noaa-marine-station.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/noaa-marine-station.resource.ts"],"names":[],"mappings":"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"}
@@ -10,75 +10,75 @@ export declare const noaaMarineFindStations: import("@cyanheads/mcp-ts-core").To
10
10
  radius_km: z.ZodDefault<z.ZodNumber>;
11
11
  query: z.ZodOptional<z.ZodString>;
12
12
  state: z.ZodOptional<z.ZodEnum<{
13
- ID: "ID";
14
- AL: "AL";
15
13
  AK: "AK";
16
- AZ: "AZ";
14
+ AL: "AL";
17
15
  AR: "AR";
16
+ AS: "AS";
17
+ AZ: "AZ";
18
18
  CA: "CA";
19
19
  CO: "CO";
20
20
  CT: "CT";
21
+ DC: "DC";
21
22
  DE: "DE";
22
23
  FL: "FL";
23
24
  GA: "GA";
25
+ GU: "GU";
24
26
  HI: "HI";
27
+ IA: "IA";
28
+ ID: "ID";
25
29
  IL: "IL";
26
30
  IN: "IN";
27
- IA: "IA";
28
31
  KS: "KS";
29
32
  KY: "KY";
30
33
  LA: "LA";
31
- ME: "ME";
32
- MD: "MD";
33
34
  MA: "MA";
35
+ MD: "MD";
36
+ ME: "ME";
34
37
  MI: "MI";
35
38
  MN: "MN";
36
- MS: "MS";
37
39
  MO: "MO";
40
+ MP: "MP";
41
+ MS: "MS";
38
42
  MT: "MT";
43
+ NC: "NC";
44
+ ND: "ND";
39
45
  NE: "NE";
40
- NV: "NV";
41
46
  NH: "NH";
42
47
  NJ: "NJ";
43
48
  NM: "NM";
49
+ NV: "NV";
44
50
  NY: "NY";
45
- NC: "NC";
46
- ND: "ND";
47
51
  OH: "OH";
48
52
  OK: "OK";
49
53
  OR: "OR";
50
54
  PA: "PA";
55
+ PR: "PR";
51
56
  RI: "RI";
52
57
  SC: "SC";
53
58
  SD: "SD";
54
59
  TN: "TN";
55
60
  TX: "TX";
56
61
  UT: "UT";
57
- VT: "VT";
58
62
  VA: "VA";
63
+ VI: "VI";
64
+ VT: "VT";
59
65
  WA: "WA";
60
- WV: "WV";
61
66
  WI: "WI";
67
+ WV: "WV";
62
68
  WY: "WY";
63
- DC: "DC";
64
- PR: "PR";
65
- VI: "VI";
66
- GU: "GU";
67
- AS: "AS";
68
- MP: "MP";
69
69
  }>>;
70
70
  source: z.ZodDefault<z.ZodEnum<{
71
+ all: "all";
71
72
  coops: "coops";
72
73
  ndbc: "ndbc";
73
- all: "all";
74
74
  }>>;
75
75
  types: z.ZodOptional<z.ZodArray<z.ZodEnum<{
76
- water_level: "water_level";
77
- met: "met";
78
- tide: "tide";
76
+ buoy: "buoy";
79
77
  current: "current";
80
78
  current_profile: "current_profile";
81
- buoy: "buoy";
79
+ met: "met";
80
+ tide: "tide";
81
+ water_level: "water_level";
82
82
  }>>>;
83
83
  limit: z.ZodDefault<z.ZodNumber>;
84
84
  }, z.core.$strip>, z.ZodObject<{