@cyanheads/noaa-marine-mcp-server 0.2.0 → 0.3.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/AGENTS.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** noaa-marine-mcp-server
4
- **Version:** 0.2.0
4
+ **Version:** 0.3.0
5
5
  **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.14`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
package/CLAUDE.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** noaa-marine-mcp-server
4
- **Version:** 0.2.0
4
+ **Version:** 0.3.0
5
5
  **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.14`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  <div align="center">
2
2
  <h1>@cyanheads/noaa-marine-mcp-server</h1>
3
3
  <p><b>Find NOAA tide stations and NDBC buoys, fetch tide predictions, water levels, tidal currents, and live buoy conditions via MCP. STDIO or Streamable HTTP.</b>
4
- <div>6 Tools • 1 Resource</div>
4
+ <div>7 Tools • 1 Resource</div>
5
5
  </p>
6
6
  </div>
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.2.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.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/)
11
11
 
12
12
  </div>
13
13
 
@@ -29,7 +29,7 @@
29
29
 
30
30
  ## Tools
31
31
 
32
- Six 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
+ 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:
33
33
 
34
34
  | Tool | Description |
35
35
  |:-----|:------------|
@@ -39,6 +39,7 @@ Six tools covering the full US marine operational workflow — station discovery
39
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
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
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). |
42
43
 
43
44
  ### `noaa_marine_find_stations`
44
45
 
@@ -106,6 +107,15 @@ Observed ocean-current depth profile from an NDBC ADCP buoy — the most recent
106
107
  - Most NDBC stations serve no ADCP profile — use `find_stations` with `source="ndbc"` and `types: ["current_profile"]` to discover the ones that do
107
108
  - Direction or speed is `null` for a bin when NDBC did not report that component
108
109
 
110
+ ### `noaa_marine_get_ocean_observations`
111
+
112
+ Sub-surface water-column observations from an NDBC station — the most recent reading at each reported depth.
113
+
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
118
+
109
119
  ## Resources and prompts
110
120
 
111
121
  | Type | Name | Description |
@@ -0,0 +1,15 @@
1
+ ---
2
+ summary: "Adds noaa_marine_get_ocean_observations — NDBC .ocean sub-surface water-column data (temperature, salinity, dissolved oxygen, chlorophyll, turbidity, pH at depth)"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.3.0 — 2026-07-16
8
+
9
+ ## Added
10
+
11
+ - **`noaa_marine_get_ocean_observations`** — new tool reading an NDBC station's `.ocean` realtime feed for the latest sub-surface water-column observation: at each reported depth, water temperature (°C), conductivity (mS/cm), salinity (psu), dissolved oxygen (% saturation and ppm), chlorophyll (µg/l), turbidity (FTU), pH, and redox potential (mV). A station reporting several depths at one timestamp returns one reading per depth. The water-column counterpart to `noaa_marine_get_conditions`, which returns surface meteorology and sea state. Ocean-sensor coverage carries no station-catalog flag, so it is a best-effort call on NDBC station IDs — a typed `observations_not_found` error is returned where no `.ocean` file exists, and `latitude`/`longitude` are `null` when the station is absent from the active-stations list. ([#16](https://github.com/cyanheads/noaa-marine-mcp-server/issues/16))
12
+
13
+ ## Changed
14
+
15
+ - **`tsc-alias`** `^1.8.17 → ^1.9.1` (dev dependency) — keeps the devcheck Outdated gate green after the pinned version aged past the release-age hold.
package/dist/index.js CHANGED
@@ -10,6 +10,7 @@ import { noaaMarineFindStations } from './mcp-server/tools/definitions/noaa-mari
10
10
  import { noaaMarineGetConditions } from './mcp-server/tools/definitions/noaa-marine-get-conditions.tool.js';
11
11
  import { noaaMarineGetCurrentProfile } from './mcp-server/tools/definitions/noaa-marine-get-current-profile.tool.js';
12
12
  import { noaaMarineGetCurrents } from './mcp-server/tools/definitions/noaa-marine-get-currents.tool.js';
13
+ import { noaaMarineGetOceanObservations } from './mcp-server/tools/definitions/noaa-marine-get-ocean-observations.tool.js';
13
14
  import { noaaMarineGetTidePredictions } from './mcp-server/tools/definitions/noaa-marine-get-tide-predictions.tool.js';
14
15
  import { noaaMarineGetWaterLevel } from './mcp-server/tools/definitions/noaa-marine-get-water-level.tool.js';
15
16
  import { initCoopsService } from './services/coops/coops-service.js';
@@ -24,6 +25,7 @@ await createApp({
24
25
  noaaMarineGetCurrents,
25
26
  noaaMarineGetConditions,
26
27
  noaaMarineGetCurrentProfile,
28
+ noaaMarineGetOceanObservations,
27
29
  ],
28
30
  resources: [noaaMarineStationResource],
29
31
  prompts: [],
@@ -33,8 +35,9 @@ await createApp({
33
35
  'CO-OPS provides tide predictions (noaa_marine_get_tide_predictions), ' +
34
36
  'observed water levels and storm surge (noaa_marine_get_water_level), ' +
35
37
  'and tidal-current predictions (noaa_marine_get_currents). ' +
36
- 'NDBC provides live buoy conditions — waves, wind, sea-surface temp (noaa_marine_get_conditions) — ' +
37
- 'and observed ocean-current depth profiles (noaa_marine_get_current_profile). ' +
38
+ 'NDBC provides live buoy conditions — waves, wind, sea-surface temp (noaa_marine_get_conditions), ' +
39
+ 'observed ocean-current depth profiles (noaa_marine_get_current_profile), ' +
40
+ 'and sub-surface water-column observations — temperature, salinity, dissolved oxygen and more (noaa_marine_get_ocean_observations). ' +
38
41
  'The two current tools are distinct: get_currents is CO-OPS tidal-current predictions (forecast), ' +
39
42
  'get_current_profile is NDBC observed depth-binned currents from an ADCP buoy. ' +
40
43
  'All water height data is referenced to MLLW by default (US nautical chart datum).',
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,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;KAC5B;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,oGAAoG;QACpG,+EAA+E;QAC/E,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,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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @fileoverview noaa_marine_get_ocean_observations tool — sub-surface water-column observations from an NDBC station.
3
+ * @module mcp-server/tools/definitions/noaa-marine-get-ocean-observations.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const noaaMarineGetOceanObservations: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ station_id: z.ZodString;
9
+ }, z.core.$strip>, z.ZodObject<{
10
+ station_id: z.ZodString;
11
+ station_name: z.ZodString;
12
+ latitude: z.ZodNullable<z.ZodNumber>;
13
+ longitude: z.ZodNullable<z.ZodNumber>;
14
+ observed_at: z.ZodString;
15
+ source: z.ZodString;
16
+ reading_count: z.ZodNumber;
17
+ readings: z.ZodArray<z.ZodObject<{
18
+ depth_m: z.ZodNumber;
19
+ water_temp_c: z.ZodNullable<z.ZodNumber>;
20
+ conductivity_ms_cm: z.ZodNullable<z.ZodNumber>;
21
+ salinity_psu: z.ZodNullable<z.ZodNumber>;
22
+ oxygen_percent: z.ZodNullable<z.ZodNumber>;
23
+ oxygen_ppm: z.ZodNullable<z.ZodNumber>;
24
+ chlorophyll_ug_l: z.ZodNullable<z.ZodNumber>;
25
+ turbidity_ftu: z.ZodNullable<z.ZodNumber>;
26
+ ph: z.ZodNullable<z.ZodNumber>;
27
+ redox_mv: z.ZodNullable<z.ZodNumber>;
28
+ }, z.core.$strip>>;
29
+ }, z.core.$strip>, readonly [{
30
+ readonly reason: "observations_not_found";
31
+ readonly code: JsonRpcErrorCode.NotFound;
32
+ readonly when: "NDBC returned 404 for the station — no .ocean oceanographic file exists for it.";
33
+ readonly recovery: "Oceanographic sensors are on only a subset of NDBC stations with no station-catalog flag to filter on — browse other NDBC stations with noaa_marine_find_stations using source=\"ndbc\" and try their IDs.";
34
+ }, {
35
+ readonly reason: "no_ocean_data";
36
+ readonly code: JsonRpcErrorCode.NotFound;
37
+ readonly when: "The .ocean file exists but has no usable data rows — station offline or every depth row missing.";
38
+ readonly recovery: "This station may be temporarily offline — try another NDBC station from noaa_marine_find_stations with source=\"ndbc\".";
39
+ }], undefined>;
40
+ //# sourceMappingURL=noaa-marine-get-ocean-observations.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noaa-marine-get-ocean-observations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/noaa-marine-get-ocean-observations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAY,MAAM,+BAA+B,CAAC;AAG3E,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgNzC,CAAC"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * @fileoverview noaa_marine_get_ocean_observations tool — sub-surface water-column observations from an NDBC station.
3
+ * @module mcp-server/tools/definitions/noaa-marine-get-ocean-observations.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getNdbcService } from '../../../services/ndbc/ndbc-service.js';
8
+ export const noaaMarineGetOceanObservations = tool('noaa_marine_get_ocean_observations', {
9
+ title: 'Get Ocean Observations',
10
+ description: "Live sub-surface oceanographic observations from an NDBC station's water-quality sensors: at each " +
11
+ 'reported depth, water temperature, conductivity, salinity, dissolved oxygen (both saturation percent ' +
12
+ 'and concentration in ppm), chlorophyll, turbidity, pH, and redox potential. This is the water-column ' +
13
+ 'counterpart to noaa_marine_get_conditions, which returns surface meteorological and wave data (wind, ' +
14
+ 'waves, sea-surface temperature) — use this tool for what the water is doing below the surface, that ' +
15
+ 'one for weather and sea state at the buoy. Returns the most recent observation as one reading per ' +
16
+ 'reported depth; most stations report a single depth, but some report several at the same time. Sensor ' +
17
+ 'coverage is sparse — most stations populate only water temperature and salinity — and any value the ' +
18
+ 'station did not report comes back null rather than a fabricated zero. Latitude and longitude are null ' +
19
+ 'when the station is absent from the NDBC active-stations list. Sub-surface sensors are on only a subset ' +
20
+ 'of NDBC stations and are not marked by any station-catalog flag, so no capability filter guarantees ' +
21
+ 'coverage: call this on candidate NDBC station IDs from noaa_marine_find_stations with source="ndbc", ' +
22
+ 'and expect the observations_not_found error on the many stations that serve no .ocean file.',
23
+ annotations: { readOnlyHint: true, openWorldHint: true },
24
+ input: z.object({
25
+ station_id: z
26
+ .string()
27
+ .regex(/^[A-Za-z0-9_-]{1,20}$/)
28
+ .describe('NDBC station ID (5-character alphanumeric, e.g. "44033" or "TIBC1"). ' +
29
+ 'Obtain candidate IDs from noaa_marine_find_stations with source="ndbc" — ocean-sensor ' +
30
+ 'coverage is not flagged in the catalog, so this is a best-effort call on any NDBC station.'),
31
+ }),
32
+ output: z.object({
33
+ station_id: z.string().describe('Station ID echoed from the request — for chaining.'),
34
+ station_name: z.string().describe('Station name from the NDBC active stations list.'),
35
+ latitude: z
36
+ .number()
37
+ .nullable()
38
+ .describe('Station latitude in decimal degrees. Null when the station is absent from the NDBC active-stations list — the .ocean feed carries observations but no coordinates.'),
39
+ longitude: z
40
+ .number()
41
+ .nullable()
42
+ .describe('Station longitude in decimal degrees. Null when the station is absent from the NDBC active-stations list.'),
43
+ observed_at: z.string().describe('ISO 8601 UTC timestamp of the observation.'),
44
+ source: z.string().describe('Data source — always "ndbc" for this tool.'),
45
+ reading_count: z
46
+ .number()
47
+ .describe('Number of per-depth readings in the latest observation (usually 1).'),
48
+ readings: z
49
+ .array(z
50
+ .object({
51
+ depth_m: z.number().describe('Measurement depth below the surface in meters (DEPTH).'),
52
+ water_temp_c: z
53
+ .number()
54
+ .nullable()
55
+ .describe('Water temperature in °C (OTMP). Null when the station did not report it.'),
56
+ conductivity_ms_cm: z
57
+ .number()
58
+ .nullable()
59
+ .describe('Conductivity in mS/cm (COND). Null when the station did not report it.'),
60
+ salinity_psu: z
61
+ .number()
62
+ .nullable()
63
+ .describe('Salinity in practical salinity units (SAL). Null when the station did not report it.'),
64
+ oxygen_percent: z
65
+ .number()
66
+ .nullable()
67
+ .describe('Dissolved-oxygen saturation in percent (O2%). Null when the station did not report it.'),
68
+ oxygen_ppm: z
69
+ .number()
70
+ .nullable()
71
+ .describe('Dissolved-oxygen concentration in ppm (O2PPM). Null when the station did not report it.'),
72
+ chlorophyll_ug_l: z
73
+ .number()
74
+ .nullable()
75
+ .describe('Chlorophyll concentration in µg/l (CLCON). Null when the station did not report it.'),
76
+ turbidity_ftu: z
77
+ .number()
78
+ .nullable()
79
+ .describe('Turbidity in Formazin Turbidity Units (TURB). Null when the station did not report it.'),
80
+ ph: z
81
+ .number()
82
+ .nullable()
83
+ .describe('pH, dimensionless (PH). Null when the station did not report it.'),
84
+ redox_mv: z
85
+ .number()
86
+ .nullable()
87
+ .describe('Oxidation-reduction (redox) potential in mV (EH). Null when the station did not report it.'),
88
+ })
89
+ .describe('Water-column sensor readings at a single depth.'))
90
+ .describe('Per-depth readings sharing the most recent observation timestamp, in NDBC source order.'),
91
+ }),
92
+ errors: [
93
+ {
94
+ reason: 'observations_not_found',
95
+ code: JsonRpcErrorCode.NotFound,
96
+ when: 'NDBC returned 404 for the station — no .ocean oceanographic file exists for it.',
97
+ recovery: 'Oceanographic sensors are on only a subset of NDBC stations with no station-catalog flag to filter on — browse other NDBC stations with noaa_marine_find_stations using source="ndbc" and try their IDs.',
98
+ },
99
+ {
100
+ reason: 'no_ocean_data',
101
+ code: JsonRpcErrorCode.NotFound,
102
+ when: 'The .ocean file exists but has no usable data rows — station offline or every depth row missing.',
103
+ recovery: 'This station may be temporarily offline — try another NDBC station from noaa_marine_find_stations with source="ndbc".',
104
+ },
105
+ ],
106
+ async handler(input, ctx) {
107
+ const ndbcSvc = getNdbcService();
108
+ // Station metadata for name/coordinates.
109
+ const stations = await ndbcSvc.getActiveStations(ctx);
110
+ const meta = stations.find((s) => s.id.toUpperCase() === input.station_id.toUpperCase());
111
+ let observation;
112
+ try {
113
+ observation = await ndbcSvc.fetchOceanObservations(input.station_id, ctx);
114
+ }
115
+ catch (err) {
116
+ // A missing .ocean file and an existing-but-empty one both surface as NotFound:
117
+ // fetchWithTimeout throws a bare 404 (data.statusCode: 404, no reason) before the
118
+ // service's own check runs, while the service's notFound() for an existing-but-empty
119
+ // file carries data.reason: 'no_ocean_data'. Inspect the reason so an offline station
120
+ // isn't mislabeled as one that serves no ocean data at all.
121
+ if (err instanceof McpError && err.code === JsonRpcErrorCode.NotFound) {
122
+ const reason = err.data?.reason;
123
+ if (reason === 'no_ocean_data') {
124
+ throw ctx.fail('no_ocean_data', `NDBC station ${input.station_id} reported no usable oceanographic data — the .ocean file exists but every depth row is missing (station offline or sensor failure).`, { ...ctx.recoveryFor('no_ocean_data') });
125
+ }
126
+ throw ctx.fail('observations_not_found', `NDBC has no oceanographic (.ocean) file for station ${input.station_id} — sub-surface sensors are on only a subset of NDBC stations. Use noaa_marine_find_stations with source="ndbc" to browse other station IDs to try.`, { ...ctx.recoveryFor('observations_not_found') });
127
+ }
128
+ throw err;
129
+ }
130
+ ctx.log.info('NDBC ocean observations fetched', {
131
+ station_id: input.station_id,
132
+ observed_at: observation.observedAt,
133
+ reading_count: observation.readings.length,
134
+ });
135
+ return {
136
+ station_id: input.station_id.toUpperCase(),
137
+ station_name: meta?.name ?? input.station_id,
138
+ latitude: meta?.lat ?? null,
139
+ longitude: meta?.lon ?? null,
140
+ observed_at: observation.observedAt,
141
+ source: 'ndbc',
142
+ reading_count: observation.readings.length,
143
+ readings: observation.readings.map((r) => ({
144
+ depth_m: r.depthM,
145
+ water_temp_c: r.waterTempC,
146
+ conductivity_ms_cm: r.conductivityMsCm,
147
+ salinity_psu: r.salinityPsu,
148
+ oxygen_percent: r.oxygenPercent,
149
+ oxygen_ppm: r.oxygenPpm,
150
+ chlorophyll_ug_l: r.chlorophyllUgL,
151
+ turbidity_ftu: r.turbidityFtu,
152
+ ph: r.ph,
153
+ redox_mv: r.redoxMv,
154
+ })),
155
+ };
156
+ },
157
+ format: (result) => {
158
+ const fmt = (v, unit) => (v !== null ? `${v} ${unit}` : 'not reported');
159
+ const lines = [
160
+ `## Ocean Observations — ${result.station_name} (${result.station_id})`,
161
+ `**Observed at:** ${result.observed_at} · **Source:** ${result.source} · **Depths:** ${result.reading_count}`,
162
+ `**Location:** ${result.latitude ?? 'unknown'}, ${result.longitude ?? 'unknown'}`,
163
+ ];
164
+ for (const r of result.readings) {
165
+ lines.push('', `### Depth ${r.depth_m} m`, `Water temp: ${fmt(r.water_temp_c, '°C')} · Conductivity: ${fmt(r.conductivity_ms_cm, 'mS/cm')} · Salinity: ${fmt(r.salinity_psu, 'psu')}`, `Oxygen: ${fmt(r.oxygen_percent, '%')} saturation · ${fmt(r.oxygen_ppm, 'ppm')}`, `Chlorophyll: ${fmt(r.chlorophyll_ug_l, 'µg/l')} · Turbidity: ${fmt(r.turbidity_ftu, 'FTU')} · pH: ${r.ph ?? 'not reported'} · Redox: ${fmt(r.redox_mv, 'mV')}`);
166
+ }
167
+ return [{ type: 'text', text: lines.join('\n') }];
168
+ },
169
+ });
170
+ //# sourceMappingURL=noaa-marine-get-ocean-observations.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noaa-marine-get-ocean-observations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/noaa-marine-get-ocean-observations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC,oCAAoC,EAAE;IACvF,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EACT,oGAAoG;QACpG,uGAAuG;QACvG,uGAAuG;QACvG,uGAAuG;QACvG,sGAAsG;QACtG,oGAAoG;QACpG,wGAAwG;QACxG,sGAAsG;QACtG,wGAAwG;QACxG,0GAA0G;QAC1G,sGAAsG;QACtG,uGAAuG;QACvG,6FAA6F;IAC/F,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAExD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,KAAK,CAAC,uBAAuB,CAAC;aAC9B,QAAQ,CACP,uEAAuE;YACrE,wFAAwF;YACxF,4FAA4F,CAC/F;KACJ,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QACrF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACrF,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,oKAAoK,CACrK;QACH,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,2GAA2G,CAC5G;QACH,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAC9E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACzE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,CAAC,qEAAqE,CAAC;QAClF,QAAQ,EAAE,CAAC;aACR,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;YACtF,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,0EAA0E,CAAC;YACvF,kBAAkB,EAAE,CAAC;iBAClB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wEAAwE,CAAC;YACrF,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,sFAAsF,CACvF;YACH,cAAc,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,wFAAwF,CACzF;YACH,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,yFAAyF,CAC1F;YACH,gBAAgB,EAAE,CAAC;iBAChB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,qFAAqF,CACtF;YACH,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,wFAAwF,CACzF;YACH,EAAE,EAAE,CAAC;iBACF,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;YAC/E,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,4FAA4F,CAC7F;SACJ,CAAC;aACD,QAAQ,CAAC,iDAAiD,CAAC,CAC/D;aACA,QAAQ,CACP,yFAAyF,CAC1F;KACJ,CAAC;IAEF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,wBAAwB;YAChC,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,iFAAiF;YACvF,QAAQ,EACN,0MAA0M;SAC7M;QACD;YACE,MAAM,EAAE,eAAe;YACvB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,kGAAkG;YACxG,QAAQ,EACN,uHAAuH;SAC1H;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QAEjC,yCAAyC;QACzC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzF,IAAI,WAAuE,CAAC;QAC5E,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gFAAgF;YAChF,kFAAkF;YAClF,qFAAqF;YACrF,sFAAsF;YACtF,4DAA4D;YAC5D,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,CAAC,QAAQ,EAAE,CAAC;gBACtE,MAAM,MAAM,GAAI,GAAG,CAAC,IAA4C,EAAE,MAAM,CAAC;gBACzE,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;oBAC/B,MAAM,GAAG,CAAC,IAAI,CACZ,eAAe,EACf,gBAAgB,KAAK,CAAC,UAAU,qIAAqI,EACrK,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,CACxC,CAAC;gBACJ,CAAC;gBACD,MAAM,GAAG,CAAC,IAAI,CACZ,wBAAwB,EACxB,uDAAuD,KAAK,CAAC,UAAU,oJAAoJ,EAC3N,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,wBAAwB,CAAC,EAAE,CACjD,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE;YAC9C,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,WAAW,CAAC,UAAU;YACnC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM;SAC3C,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE;YAC1C,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,UAAU;YAC5C,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;YAC3B,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;YAC5B,WAAW,EAAE,WAAW,CAAC,UAAU;YACnC,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM;YAC1C,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzC,OAAO,EAAE,CAAC,CAAC,MAAM;gBACjB,YAAY,EAAE,CAAC,CAAC,UAAU;gBAC1B,kBAAkB,EAAE,CAAC,CAAC,gBAAgB;gBACtC,YAAY,EAAE,CAAC,CAAC,WAAW;gBAC3B,cAAc,EAAE,CAAC,CAAC,aAAa;gBAC/B,UAAU,EAAE,CAAC,CAAC,SAAS;gBACvB,gBAAgB,EAAE,CAAC,CAAC,cAAc;gBAClC,aAAa,EAAE,CAAC,CAAC,YAAY;gBAC7B,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,QAAQ,EAAE,CAAC,CAAC,OAAO;aACpB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,CAAC,CAAgB,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC/F,MAAM,KAAK,GAAa;YACtB,2BAA2B,MAAM,CAAC,YAAY,KAAK,MAAM,CAAC,UAAU,GAAG;YACvE,oBAAoB,MAAM,CAAC,WAAW,kBAAkB,MAAM,CAAC,MAAM,kBAAkB,MAAM,CAAC,aAAa,EAAE;YAC7G,iBAAiB,MAAM,CAAC,QAAQ,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,EAAE;SAClF,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CACR,EAAE,EACF,aAAa,CAAC,CAAC,OAAO,IAAI,EAC1B,eAAe,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,kBAAkB,EAAE,OAAO,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,EAC1I,WAAW,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAChF,gBAAgB,GAAG,CAAC,CAAC,CAAC,gBAAgB,EAAE,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,cAAc,aAAa,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAChK,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;CACF,CAAC,CAAC"}
@@ -3,7 +3,7 @@
3
3
  * @module services/ndbc/ndbc-service
4
4
  */
5
5
  import type { Context } from '@cyanheads/mcp-ts-core';
6
- import type { NdbcCurrentProfile, NdbcObservation, NdbcStation } from './types.js';
6
+ import type { NdbcCurrentProfile, NdbcObservation, NdbcOceanObservation, NdbcStation } from './types.js';
7
7
  export declare class NdbcService {
8
8
  private stationCache;
9
9
  /** Fetch (or return cached) NDBC active stations. */
@@ -14,6 +14,8 @@ export declare class NdbcService {
14
14
  fetchObservation(stationId: string, ctx: Context): Promise<NdbcObservation>;
15
15
  /** Fetch and parse the latest ADCP current profile for a station from the realtime2 `.adcp` feed. */
16
16
  fetchCurrentProfile(stationId: string, ctx: Context): Promise<NdbcCurrentProfile>;
17
+ /** Fetch and parse the latest oceanographic observation for a station from the realtime2 `.ocean` feed. */
18
+ fetchOceanObservations(stationId: string, ctx: Context): Promise<NdbcOceanObservation>;
17
19
  /**
18
20
  * Parse an NDBC ADCP (`.adcp`) realtime file into the most recent current profile.
19
21
  * Layout: two `#`-prefixed header lines (`#YY MM DD hh mm DEP01 DIR01 SPD01 …`,
@@ -24,6 +26,17 @@ export declare class NdbcService {
24
26
  * is present; direction and speed become null when their token is `MM`.
25
27
  */
26
28
  parseAdcpText(text: string, stationId: string): NdbcCurrentProfile;
29
+ /**
30
+ * Parse an NDBC oceanographic (`.ocean`) realtime file into the most recent observation.
31
+ * Layout: two `#`-prefixed header lines
32
+ * (`#YY MM DD hh mm DEPTH OTMP COND SAL O2% O2PPM CLCON TURB PH EH`, then a units line),
33
+ * followed by data rows most-recent-first. Columns are fixed-position: five time columns,
34
+ * then depth (m) and the nine water-column sensors. A station reports one row per depth, so
35
+ * a single timestamp can carry several rows — the latest observation is every row that shares
36
+ * the first (most recent) row's timestamp. Any sensor token may be the literal `MM`
37
+ * (missing → null); a reading is emitted only when its depth is present to anchor it.
38
+ */
39
+ parseOceanText(text: string, stationId: string): NdbcOceanObservation;
27
40
  /** Parse NDBC active stations XML into NdbcStation array. */
28
41
  private parseActiveStationsXml;
29
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ndbc-service.d.ts","sourceRoot":"","sources":["../../../src/services/ndbc/ndbc-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,KAAK,EAAkB,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAcnG,qBAAa,WAAW;IACtB,OAAO,CAAC,YAAY,CAA6B;IAEjD,qDAAqD;IAC/C,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiC7D,qEAAqE;IAC/D,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,iFAAiF;IAC3E,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAyBjF,qGAAqG;IAC/F,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyBvF;;;;;;;;OAQG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,kBAAkB;IAkElE,6DAA6D;IAC7D,OAAO,CAAC,sBAAsB;IA8C9B;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe;CA+GpE;AAMD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
1
+ {"version":3,"file":"ndbc-service.d.ts","sourceRoot":"","sources":["../../../src/services/ndbc/ndbc-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGtD,OAAO,KAAK,EAEV,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EAEpB,WAAW,EACZ,MAAM,YAAY,CAAC;AAgBpB,qBAAa,WAAW;IACtB,OAAO,CAAC,YAAY,CAA6B;IAEjD,qDAAqD;IAC/C,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiC7D,qEAAqE;IAC/D,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,iFAAiF;IAC3E,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAyBjF,qGAAqG;IAC/F,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyBvF,2GAA2G;IACrG,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyB5F;;;;;;;;OAQG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,kBAAkB;IAkElE;;;;;;;;;OASG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB;IAgFrE,6DAA6D;IAC7D,OAAO,CAAC,sBAAsB;IA8C9B;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe;CA+GpE;AAMD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,cAAc,IAAI,WAAW,CAK5C"}
@@ -7,6 +7,7 @@ import { fetchWithTimeout, withRetry } from '@cyanheads/mcp-ts-core/utils';
7
7
  const ACTIVE_STATIONS_URL = 'https://www.ndbc.noaa.gov/activestations.xml';
8
8
  const REALTIME_URL = (id) => `https://www.ndbc.noaa.gov/data/realtime2/${id.toUpperCase()}.txt`;
9
9
  const ADCP_URL = (id) => `https://www.ndbc.noaa.gov/data/realtime2/${id.toUpperCase()}.adcp`;
10
+ const OCEAN_URL = (id) => `https://www.ndbc.noaa.gov/data/realtime2/${id.toUpperCase()}.ocean`;
10
11
  const CACHE_TTL_MS = 6 * 60 * 60 * 1000; // 6 hours
11
12
  export class NdbcService {
12
13
  stationCache = null;
@@ -77,6 +78,26 @@ export class NdbcService {
77
78
  signal: ctx.signal,
78
79
  });
79
80
  }
81
+ /** Fetch and parse the latest oceanographic observation for a station from the realtime2 `.ocean` feed. */
82
+ async fetchOceanObservations(stationId, ctx) {
83
+ return await withRetry(async () => {
84
+ const url = OCEAN_URL(stationId);
85
+ const response = await fetchWithTimeout(url, 10_000, ctx, {
86
+ signal: ctx.signal,
87
+ });
88
+ const text = await response.text();
89
+ if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
90
+ throw serviceUnavailable('NDBC ocean endpoint returned HTML — likely rate-limited.');
91
+ }
92
+ return this.parseOceanText(text, stationId);
93
+ }, {
94
+ operation: `NdbcService.fetchOceanObservations(${stationId})`,
95
+ context: ctx,
96
+ baseDelayMs: 1000,
97
+ maxRetries: 2,
98
+ signal: ctx.signal,
99
+ });
100
+ }
80
101
  /**
81
102
  * Parse an NDBC ADCP (`.adcp`) realtime file into the most recent current profile.
82
103
  * Layout: two `#`-prefixed header lines (`#YY MM DD hh mm DEP01 DIR01 SPD01 …`,
@@ -140,6 +161,82 @@ export class NdbcService {
140
161
  : new Date().toISOString();
141
162
  return { observedAt, bins };
142
163
  }
164
+ /**
165
+ * Parse an NDBC oceanographic (`.ocean`) realtime file into the most recent observation.
166
+ * Layout: two `#`-prefixed header lines
167
+ * (`#YY MM DD hh mm DEPTH OTMP COND SAL O2% O2PPM CLCON TURB PH EH`, then a units line),
168
+ * followed by data rows most-recent-first. Columns are fixed-position: five time columns,
169
+ * then depth (m) and the nine water-column sensors. A station reports one row per depth, so
170
+ * a single timestamp can carry several rows — the latest observation is every row that shares
171
+ * the first (most recent) row's timestamp. Any sensor token may be the literal `MM`
172
+ * (missing → null); a reading is emitted only when its depth is present to anchor it.
173
+ */
174
+ parseOceanText(text, stationId) {
175
+ const lines = text
176
+ .split('\n')
177
+ .map((l) => l.trim())
178
+ .filter(Boolean);
179
+ if (!lines.some((l) => l.startsWith('#'))) {
180
+ throw serviceUnavailable(`NDBC ocean file for ${stationId} has no header row.`);
181
+ }
182
+ const dataLines = lines.filter((l) => !l.startsWith('#'));
183
+ const firstDataLine = dataLines[0];
184
+ if (firstDataLine === undefined) {
185
+ throw notFound(`NDBC station ${stationId} has no oceanographic data rows — station may be offline.`, { stationId, reason: 'no_ocean_data' });
186
+ }
187
+ // A token that is absent or the literal `MM` (NDBC's missing marker) becomes null.
188
+ const parseValue = (tok) => {
189
+ if (tok === undefined || tok === 'MM')
190
+ return null;
191
+ const n = Number.parseFloat(tok);
192
+ return Number.isNaN(n) ? null : n;
193
+ };
194
+ // Rows are reverse-chronological, so the first data row is the latest observation. Its five
195
+ // time columns key that observation; collect every row sharing them, since a station reporting
196
+ // multiple depths emits one row per depth at the same timestamp. Older observations sort after,
197
+ // so stopping at the first differing timestamp captures exactly the latest observation.
198
+ const firstTokens = firstDataLine.split(/\s+/);
199
+ const timeKey = firstTokens.slice(0, 5).join(' ');
200
+ const readings = [];
201
+ for (const line of dataLines) {
202
+ const tokens = line.split(/\s+/);
203
+ if (tokens.slice(0, 5).join(' ') !== timeKey)
204
+ break;
205
+ // Column index 5 is depth; a reading needs a real depth to anchor it (mirrors parseAdcpText).
206
+ const depthTok = tokens[5];
207
+ if (depthTok === undefined || depthTok === 'MM')
208
+ continue;
209
+ const depthM = Number.parseFloat(depthTok);
210
+ if (Number.isNaN(depthM))
211
+ continue;
212
+ readings.push({
213
+ depthM,
214
+ waterTempC: parseValue(tokens[6]),
215
+ conductivityMsCm: parseValue(tokens[7]),
216
+ salinityPsu: parseValue(tokens[8]),
217
+ oxygenPercent: parseValue(tokens[9]),
218
+ oxygenPpm: parseValue(tokens[10]),
219
+ chlorophyllUgL: parseValue(tokens[11]),
220
+ turbidityFtu: parseValue(tokens[12]),
221
+ ph: parseValue(tokens[13]),
222
+ redoxMv: parseValue(tokens[14]),
223
+ });
224
+ }
225
+ if (readings.length === 0) {
226
+ throw notFound(`NDBC station ${stationId} reported no usable oceanographic readings — every depth row in the latest observation is missing (station offline or sensor failure).`, { stationId, reason: 'no_ocean_data' });
227
+ }
228
+ // Build the ISO timestamp from the YY MM DD hh mm columns. NDBC emits 4-digit years in
229
+ // the YY column, so treat values ≥ 1000 as already-full years (mirrors parseAdcpText).
230
+ const [yy, mo, dd, hh, mn] = firstTokens;
231
+ const observedAt = yy && mo && dd && hh && mn
232
+ ? (() => {
233
+ const n = Number.parseInt(yy, 10);
234
+ const year = n >= 1000 ? n : n < 50 ? 2000 + n : 1900 + n;
235
+ return `${year}-${mo.padStart(2, '0')}-${dd.padStart(2, '0')}T${hh.padStart(2, '0')}:${mn.padStart(2, '0')}:00Z`;
236
+ })()
237
+ : new Date().toISOString();
238
+ return { observedAt, readings };
239
+ }
143
240
  /** Parse NDBC active stations XML into NdbcStation array. */
144
241
  parseActiveStationsXml(xml) {
145
242
  const stations = [];
@@ -1 +1 @@
1
- {"version":3,"file":"ndbc-service.js","sourceRoot":"","sources":["../../../src/services/ndbc/ndbc-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ndbc-service.js","sourceRoot":"","sources":["../../../src/services/ndbc/ndbc-service.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,46 @@ export interface NdbcCurrentProfile {
40
40
  /** ISO 8601 UTC timestamp of the observation row. */
41
41
  observedAt: string;
42
42
  }
43
+ /**
44
+ * A single depth reading from an NDBC oceanographic (`.ocean`) file — the
45
+ * sub-surface water-column sensors at one measurement depth. Every sensor value
46
+ * is null when NDBC reported the literal `MM` for that column; only the depth is
47
+ * guaranteed, since a reading is emitted only when its depth is present to anchor it.
48
+ */
49
+ export interface NdbcOceanReading {
50
+ /** Chlorophyll concentration µg/l (CLCON) — null if MM. */
51
+ chlorophyllUgL: number | null;
52
+ /** Conductivity mS/cm (COND) — null if MM. */
53
+ conductivityMsCm: number | null;
54
+ /** Measurement depth below the surface in meters (DEPTH). */
55
+ depthM: number;
56
+ /** Dissolved-oxygen saturation percent (O2%) — null if MM. */
57
+ oxygenPercent: number | null;
58
+ /** Dissolved-oxygen concentration ppm (O2PPM) — null if MM. */
59
+ oxygenPpm: number | null;
60
+ /** pH, dimensionless (PH) — null if MM. */
61
+ ph: number | null;
62
+ /** Oxidation-reduction (redox) potential mV (EH) — null if MM. */
63
+ redoxMv: number | null;
64
+ /** Salinity psu (SAL) — null if MM. */
65
+ salinityPsu: number | null;
66
+ /** Turbidity FTU (TURB) — null if MM. */
67
+ turbidityFtu: number | null;
68
+ /** Water temperature °C (OTMP) — null if MM. */
69
+ waterTempC: number | null;
70
+ }
71
+ /**
72
+ * Parsed NDBC oceanographic observation — the readings sharing the most recent
73
+ * timestamp in an `<ID>.ocean` realtime file. A station usually reports one depth
74
+ * (a single reading), but some report several depths at the same time, so the
75
+ * latest observation is an ordered list of per-depth readings.
76
+ */
77
+ export interface NdbcOceanObservation {
78
+ /** ISO 8601 UTC timestamp of the observation. */
79
+ observedAt: string;
80
+ /** Per-depth readings at the latest observation time, in NDBC source order. */
81
+ readings: NdbcOceanReading[];
82
+ }
43
83
  /**
44
84
  * Parsed NDBC realtime observation.
45
85
  * All sensor fields are null when the buoy did not report a value (MM in source).
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/ndbc/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,WAAW,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oDAAoD;IACpD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,sDAAsD;IACtD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,2CAA2C;IAC3C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,8DAA8D;IAC9D,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;OAGG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wDAAwD;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,uDAAuD;IACvD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/ndbc/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,WAAW,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,kEAAkE;IAClE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uCAAuC;IACvC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,yCAAyC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oDAAoD;IACpD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,sDAAsD;IACtD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,2CAA2C;IAC3C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,8DAA8D;IAC9D,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;OAGG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wDAAwD;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,uDAAuD;IACvD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4CAA4C;IAC5C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/noaa-marine-mcp-server",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "mcpName": "io.github.cyanheads/noaa-marine-mcp-server",
5
5
  "description": "Find NOAA tide stations and NDBC buoys, fetch tide predictions, water levels, tidal currents, and live buoy conditions via MCP. STDIO or Streamable HTTP.",
6
6
  "type": "module",
@@ -99,7 +99,7 @@
99
99
  "@types/node": "^26.1.1",
100
100
  "depcheck": "^1.4.7",
101
101
  "ignore": "^7.0.6",
102
- "tsc-alias": "^1.8.17",
102
+ "tsc-alias": "^1.9.1",
103
103
  "typescript": "^6.0.3",
104
104
  "vitest": "^4.1.10"
105
105
  }
package/server.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/cyanheads/noaa-marine-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.2.0",
9
+ "version": "0.3.0",
10
10
  "remotes": [
11
11
  {
12
12
  "type": "streamable-http",
@@ -19,7 +19,7 @@
19
19
  "registryBaseUrl": "https://registry.npmjs.org",
20
20
  "identifier": "@cyanheads/noaa-marine-mcp-server",
21
21
  "runtimeHint": "bun",
22
- "version": "0.2.0",
22
+ "version": "0.3.0",
23
23
  "packageArguments": [
24
24
  {
25
25
  "type": "positional",
@@ -55,7 +55,7 @@
55
55
  "registryBaseUrl": "https://registry.npmjs.org",
56
56
  "identifier": "@cyanheads/noaa-marine-mcp-server",
57
57
  "runtimeHint": "bun",
58
- "version": "0.2.0",
58
+ "version": "0.3.0",
59
59
  "packageArguments": [
60
60
  {
61
61
  "type": "positional",