@cyanheads/noaa-marine-mcp-server 0.1.5 → 0.1.7

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 +3 -3
  2. package/CLAUDE.md +3 -3
  3. package/Dockerfile +10 -6
  4. package/README.md +2 -2
  5. package/changelog/0.1.x/0.1.6.md +19 -0
  6. package/changelog/0.1.x/0.1.7.md +29 -0
  7. package/changelog/template.md +5 -3
  8. package/dist/mcp-server/tools/definitions/noaa-marine-find-stations.tool.d.ts +5 -0
  9. package/dist/mcp-server/tools/definitions/noaa-marine-find-stations.tool.d.ts.map +1 -1
  10. package/dist/mcp-server/tools/definitions/noaa-marine-find-stations.tool.js +86 -80
  11. package/dist/mcp-server/tools/definitions/noaa-marine-find-stations.tool.js.map +1 -1
  12. package/dist/mcp-server/tools/definitions/noaa-marine-get-conditions.tool.d.ts +2 -2
  13. package/dist/mcp-server/tools/definitions/noaa-marine-get-conditions.tool.d.ts.map +1 -1
  14. package/dist/mcp-server/tools/definitions/noaa-marine-get-conditions.tool.js +17 -9
  15. package/dist/mcp-server/tools/definitions/noaa-marine-get-conditions.tool.js.map +1 -1
  16. package/dist/mcp-server/tools/definitions/noaa-marine-get-currents.tool.d.ts +5 -0
  17. package/dist/mcp-server/tools/definitions/noaa-marine-get-currents.tool.d.ts.map +1 -1
  18. package/dist/mcp-server/tools/definitions/noaa-marine-get-currents.tool.js +17 -8
  19. package/dist/mcp-server/tools/definitions/noaa-marine-get-currents.tool.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/noaa-marine-get-tide-predictions.tool.d.ts +5 -0
  21. package/dist/mcp-server/tools/definitions/noaa-marine-get-tide-predictions.tool.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/noaa-marine-get-tide-predictions.tool.js +17 -10
  23. package/dist/mcp-server/tools/definitions/noaa-marine-get-tide-predictions.tool.js.map +1 -1
  24. package/dist/mcp-server/tools/definitions/noaa-marine-get-water-level.tool.d.ts +5 -0
  25. package/dist/mcp-server/tools/definitions/noaa-marine-get-water-level.tool.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/definitions/noaa-marine-get-water-level.tool.js +17 -9
  27. package/dist/mcp-server/tools/definitions/noaa-marine-get-water-level.tool.js.map +1 -1
  28. package/dist/services/coops/date-range.d.ts +33 -0
  29. package/dist/services/coops/date-range.d.ts.map +1 -0
  30. package/dist/services/coops/date-range.js +56 -0
  31. package/dist/services/coops/date-range.js.map +1 -0
  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 +9 -8
  36. package/server.json +3 -3
package/AGENTS.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** noaa-marine-mcp-server
4
- **Version:** 0.1.5
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.9`
4
+ **Version:** 0.1.7
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
8
8
  **Zod:** ^4.4.3
@@ -269,7 +269,6 @@ Available skills:
269
269
  | `tool-defs-analysis` | Read-only audit of MCP definition language across the surface — voice, leaks, defaults, recovery hints, output descriptions |
270
270
  | `security-pass` | Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
271
271
  | `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
272
- | `devcheck` | Lint, format, typecheck, audit |
273
272
  | `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
274
273
  | `git-wrapup` | Land working-tree changes as a versioned commit + annotated tag — version bump, changelog, verify, tag. Local only. |
275
274
  | `release-and-publish` | Push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
@@ -283,6 +282,7 @@ Available skills:
283
282
  | `api-context` | Context interface, logger, state, progress |
284
283
  | `api-errors` | McpError, JsonRpcErrorCode, error patterns |
285
284
  | `api-linter` | Definition linter rule catalog — invoked by `bun run lint:mcp` and `devcheck` |
285
+ | `api-mirror` | MirrorService: persistent self-refreshing local mirror (embedded SQLite + FTS5) of a bulk upstream dataset — Tier 3 opt-in |
286
286
  | `api-services` | LLM, Speech, Graph services |
287
287
  | `api-testing` | createMockContext, mcpTest fixture, test patterns |
288
288
  | `techniques` | Reusable response/data-shaping patterns (outline-on-overflow, etc.) |
package/CLAUDE.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** noaa-marine-mcp-server
4
- **Version:** 0.1.5
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.9`
4
+ **Version:** 0.1.7
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
8
8
  **Zod:** ^4.4.3
@@ -269,7 +269,6 @@ Available skills:
269
269
  | `tool-defs-analysis` | Read-only audit of MCP definition language across the surface — voice, leaks, defaults, recovery hints, output descriptions |
270
270
  | `security-pass` | Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
271
271
  | `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
272
- | `devcheck` | Lint, format, typecheck, audit |
273
272
  | `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
274
273
  | `git-wrapup` | Land working-tree changes as a versioned commit + annotated tag — version bump, changelog, verify, tag. Local only. |
275
274
  | `release-and-publish` | Push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
@@ -283,6 +282,7 @@ Available skills:
283
282
  | `api-context` | Context interface, logger, state, progress |
284
283
  | `api-errors` | McpError, JsonRpcErrorCode, error patterns |
285
284
  | `api-linter` | Definition linter rule catalog — invoked by `bun run lint:mcp` and `devcheck` |
285
+ | `api-mirror` | MirrorService: persistent self-refreshing local mirror (embedded SQLite + FTS5) of a bulk upstream dataset — Tier 3 opt-in |
286
286
  | `api-services` | LLM, Speech, Graph services |
287
287
  | `api-testing` | createMockContext, mcpTest fixture, test patterns |
288
288
  | `techniques` | Reusable response/data-shaping patterns (outline-on-overflow, etc.) |
package/Dockerfile CHANGED
@@ -4,15 +4,17 @@
4
4
  # This stage installs all dependencies (including dev), builds the TypeScript
5
5
  # source code into JavaScript, and prepares the production assets.
6
6
  # ==============================================================================
7
- FROM oven/bun:1.3 AS build
7
+ FROM oven/bun:1.3.14 AS build
8
8
 
9
9
  WORKDIR /usr/src/app
10
10
 
11
11
  # Copy dependency manifests for optimized layer caching
12
12
  COPY package.json bun.lock ./
13
13
 
14
- # Install all dependencies (including dev dependencies for building)
15
- RUN bun install --frozen-lockfile
14
+ # Install all dependencies (including dev dependencies for building).
15
+ # The BuildKit cache mount persists Bun's global package cache across builds.
16
+ RUN --mount=type=cache,target=/root/.bun/install/cache \
17
+ bun install --frozen-lockfile --ignore-scripts
16
18
 
17
19
  # Copy the rest of the source code
18
20
  COPY . .
@@ -28,7 +30,7 @@ RUN bun run build
28
30
  # application. It uses a slim base image and only includes production
29
31
  # dependencies and build artifacts.
30
32
  # ==============================================================================
31
- FROM oven/bun:1.3-slim AS production
33
+ FROM oven/bun:1.3.14-slim AS production
32
34
 
33
35
  WORKDIR /usr/src/app
34
36
 
@@ -49,13 +51,15 @@ COPY package.json bun.lock ./
49
51
 
50
52
  # Install only production dependencies, ignoring any lifecycle scripts (like 'prepare')
51
53
  # that are not needed in the final production image.
52
- RUN bun install --production --frozen-lockfile --ignore-scripts
54
+ RUN --mount=type=cache,target=/root/.bun/install/cache \
55
+ bun install --production --frozen-lockfile --ignore-scripts
53
56
 
54
57
  # Conditionally install OpenTelemetry optional peer dependencies (Tier 3).
55
58
  # These are not bundled by default to keep the base image lean. Enable at build time
56
59
  # with: docker build --build-arg OTEL_ENABLED=true
57
60
  ARG OTEL_ENABLED=true
58
- RUN if [ "$OTEL_ENABLED" = "true" ]; then \
61
+ RUN --mount=type=cache,target=/root/.bun/install/cache \
62
+ if [ "$OTEL_ENABLED" = "true" ]; then \
59
63
  bun add @hono/otel \
60
64
  @opentelemetry/instrumentation-http \
61
65
  @opentelemetry/exporter-metrics-otlp-http \
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.1.5-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.11-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.1.7-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
 
@@ -211,7 +211,7 @@ MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
211
211
 
212
212
  ### Prerequisites
213
213
 
214
- - [Bun v1.3.11](https://bun.sh/) or higher (or Node.js v24+).
214
+ - [Bun v1.3.14](https://bun.sh/) or higher (or Node.js v24+).
215
215
  - No external API keys needed — NOAA CO-OPS and NDBC are fully open.
216
216
 
217
217
  ### Installation
@@ -0,0 +1,19 @@
1
+ ---
2
+ summary: "Four bug fixes: CO-OPS invalid/reversed date ranges validate locally as invalid_date_range instead of station_not_found, sensorless buoys keep no_sensor_data, a state filter excludes state-less NDBC buoys, and blank NDBC names become NDBC <id> labels; dev-dependency refresh"
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.1.6 — 2026-06-30
8
+
9
+ ## Fixed
10
+
11
+ - **CO-OPS date tools (`noaa_marine_get_tide_predictions`, `noaa_marine_get_water_level`, `noaa_marine_get_currents`)** — invalid calendar dates (`20250231`) and reversed ranges (`begin_date` after `end_date`) now reject locally as `invalid_date_range` (`ValidationError`) with date-specific recovery, instead of reaching CO-OPS and surfacing its HTTP 400 as a misleading `station_not_found`. New shared validator `validateCoopsDateRange` (`src/services/coops/date-range.ts`) strictly parses `YYYYMMDD`; each tool keeps its own span limit. ([#7](https://github.com/cyanheads/noaa-marine-mcp-server/issues/7))
12
+ - **`noaa_marine_get_conditions`** — a buoy whose realtime file exists but carries no usable sensor values now preserves the service-level `no_sensor_data` reason and recovery; the handler inspects `err.data.reason` before reclassifying, reserving `buoy_not_found` for genuine 404s. ([#6](https://github.com/cyanheads/noaa-marine-mcp-server/issues/6))
13
+ - **`noaa_marine_find_stations`** — a `state` filter with the default `source="all"` no longer admits state-less NDBC buoys; NDBC is excluded whenever `state` is set, so a state-scoped search returns CO-OPS stations rather than global buoys. ([#5](https://github.com/cyanheads/noaa-marine-mcp-server/issues/5))
14
+ - **NDBC station names** — blank or whitespace-only `name` attributes in the active-stations XML are normalized to an `NDBC <id>` label (uppercased ID) before caching, so buoys no longer sort first with empty names or render blank in the station resource. ([#8](https://github.com/cyanheads/noaa-marine-mcp-server/issues/8))
15
+
16
+ ## Dependencies
17
+
18
+ - `@biomejs/biome` ^2.5.0 → ^2.5.1
19
+ - `@types/node` ^26.0.0 → ^26.0.1
@@ -0,0 +1,29 @@
1
+ ---
2
+ summary: "Four bug fixes: noaa_marine_find_stations rejects incomplete lat/lon pairs, fixes its NDBC met filter and type field; noaa_marine_get_conditions guidance now points at conditions-capable stations; mcp-ts-core ^0.10.14, supply-chain hardening"
3
+ breaking: false
4
+ security: true
5
+ ---
6
+
7
+ # 0.1.7 — 2026-07-15
8
+
9
+ ## Fixed
10
+
11
+ - **`noaa_marine_find_stations`** — a lone `latitude` or `longitude` now rejects locally as `incomplete_coordinates` (`ValidationError`) instead of silently dropping the proximity filter and returning the full station list sorted by name; a whitespace-only `query` is trimmed and treated as omitted rather than matching runs of spaces in station names. ([#9](https://github.com/cyanheads/noaa-marine-mcp-server/issues/9))
12
+ - **`noaa_marine_find_stations`** — the NDBC `types` filter now matches each station's computed `capabilities` array instead of a `type`-string heuristic, so a `met` filter no longer admits stations NDBC flags `met="n"`; met-capable stations no longer fall through to a plain `buoy` match. ([#10](https://github.com/cyanheads/noaa-marine-mcp-server/issues/10))
13
+ - **`noaa_marine_find_stations`** — the returned `type` field now reflects the capability that matched a `types` filter (falling back to the station's first capability when unfiltered) instead of always the first-computed CO-OPS capability or a hardcoded `"buoy"` for every NDBC row. ([#12](https://github.com/cyanheads/noaa-marine-mcp-server/issues/12))
14
+ - **`noaa_marine_get_conditions`** — description and both `buoy_not_found`/`no_sensor_data` recovery messages now point to `noaa_marine_find_stations` with `source="ndbc"` and `types=["met"]` instead of an unfiltered search that could return the same non-conditions-capable station. ([#11](https://github.com/cyanheads/noaa-marine-mcp-server/issues/11))
15
+
16
+ ## Security
17
+
18
+ - **`bunfig.toml`** — `install.minimumReleaseAge` set to 3 days (`259200`s), blocking freshly-published package versions from `bun install`/`bun update` as a guard against newly-compromised releases; `@cyanheads/mcp-ts-core` is excluded via `minimumReleaseAgeExcludes` for same-day framework adoption. `install.security.scanner` set to `@socketsecurity/bun-security-scanner` (new dependency), scanning every package before install.
19
+ - **`Dockerfile`** — the build stage's `bun install` now runs with `--ignore-scripts` (previously ran devDependency lifecycle scripts unrestricted); both stages pin the exact `oven/bun:1.3.14` / `1.3.14-slim` images instead of the floating `1.3` / `1.3-slim` tags.
20
+
21
+ ## Dependencies
22
+
23
+ - `@cyanheads/mcp-ts-core` ^0.10.9 → ^0.10.14
24
+ - `@types/node` ^26.0.1 → ^26.1.1
25
+ - `ignore` ^7.0.5 → ^7.0.6
26
+ - `vitest` ^4.1.9 → ^4.1.10
27
+ - `@socketsecurity/bun-security-scanner` ^1.1.2 (new)
28
+
29
+ Bun `packageManager` pin bumped `1.3.11` → `1.3.14`. `package.json` `author` standardized to `Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)`. Skills under `skills/` re-synced to mcp-ts-core 0.10.14.
@@ -15,9 +15,11 @@ summary: ""
15
15
  # usage. Flagged as `Breaking` in the rollup.
16
16
  breaking: false
17
17
 
18
- # Set `true` if this release contains any security fix. Pairs with the
19
- # `## Security` section below. Flagged as `Security` in the rollup so
20
- # users can triage upgrade urgency at a glance.
18
+ # Set `true` ONLY for a security fix in THIS project's own source code — a
19
+ # vulnerability or hardening in code you ship. A dependency or transitive CVE
20
+ # bump is routine maintenance, NOT a security release: record it under
21
+ # `## Dependencies` (with the advisory ID) and leave this `false`. When true,
22
+ # pairs with the `## Security` section below and flags `Security` in the rollup.
21
23
  security: false
22
24
 
23
25
  # Optional free-form notes for maintenance agents processing this release.
@@ -102,5 +102,10 @@ export declare const noaaMarineFindStations: import("@cyanheads/mcp-ts-core").To
102
102
  readonly code: JsonRpcErrorCode.NotFound;
103
103
  readonly when: "No stations match the query, location, or filters.";
104
104
  readonly recovery: "Widen the search by increasing radius_km, removing type filters, or using a broader query.";
105
+ }, {
106
+ readonly reason: "incomplete_coordinates";
107
+ readonly code: JsonRpcErrorCode.InvalidParams;
108
+ readonly when: "Only one of latitude/longitude was supplied — proximity search needs the pair.";
109
+ readonly recovery: "Supply both latitude and longitude to search by proximity, or drop both and search by query or state instead.";
105
110
  }], undefined>;
106
111
  //# sourceMappingURL=noaa-marine-find-stations.tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"noaa-marine-find-stations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/noaa-marine-find-stations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AA0EjE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAkVjC,CAAC"}
1
+ {"version":3,"file":"noaa-marine-find-stations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/noaa-marine-find-stations.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AA0EjE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmWjC,CAAC"}
@@ -80,7 +80,7 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
80
80
  'This is the required first step to resolve place names or coordinates to station IDs before calling data tools. ' +
81
81
  'CO-OPS station IDs are numeric (e.g. 9447130 for Seattle); current station IDs are alphanumeric (e.g. ACT4176). ' +
82
82
  'NDBC buoy IDs are 5-character alphanumeric codes (e.g. 46041). ' +
83
- 'Provide latitude/longitude for proximity search, or query/state for name-based search — both may be combined. ' +
83
+ 'Provide latitude and longitude together for proximity search, or query/state for name-based search — both may be combined. ' +
84
84
  'Note: CO-OPS current stations are cataloged by monitoring capability, not prediction availability. ' +
85
85
  'If noaa_marine_get_currents returns no_predictions for a station, try the next nearest current station.',
86
86
  annotations: { readOnlyHint: true, openWorldHint: true },
@@ -90,13 +90,15 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
90
90
  .min(-90)
91
91
  .max(90)
92
92
  .optional()
93
- .describe('Center latitude in decimal degrees for proximity search. Pair with longitude and optionally radius_km.'),
93
+ .describe('Center latitude in decimal degrees for proximity search. Required together with longitude — ' +
94
+ 'supplying only one is rejected rather than silently ignored. Optionally pair with radius_km.'),
94
95
  longitude: z
95
96
  .number()
96
97
  .min(-180)
97
98
  .max(180)
98
99
  .optional()
99
- .describe('Center longitude in decimal degrees for proximity search. Pair with latitude and optionally radius_km.'),
100
+ .describe('Center longitude in decimal degrees for proximity search. Required together with latitude — ' +
101
+ 'supplying only one is rejected rather than silently ignored. Optionally pair with radius_km.'),
100
102
  radius_km: z
101
103
  .number()
102
104
  .min(1)
@@ -106,11 +108,14 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
106
108
  query: z
107
109
  .string()
108
110
  .optional()
109
- .describe('Station name substring to search (case-insensitive token match). E.g. "seattle", "puget sound".'),
111
+ .describe('Station name substring to match, case-insensitive. E.g. "seattle", "puget sound". ' +
112
+ 'NDBC rows also match on station ID. Blank or whitespace-only values are treated as omitted.'),
110
113
  state: z
111
114
  .enum(STATE_CODES)
112
115
  .optional()
113
- .describe('Filter by 2-letter US state or territory code (CO-OPS stations only). E.g. "WA", "CA", "PR".'),
116
+ .describe('Filter by 2-letter US state or territory code. Applies to CO-OPS stations only — ' +
117
+ 'providing it restricts results to CO-OPS and excludes NDBC buoys (which carry no state). ' +
118
+ 'E.g. "WA", "CA", "PR".'),
114
119
  source: z
115
120
  .enum(['coops', 'ndbc', 'all'])
116
121
  .default('all')
@@ -118,10 +123,14 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
118
123
  types: z
119
124
  .array(z
120
125
  .enum(['tide', 'current', 'water_level', 'buoy', 'met'])
121
- .describe('Station capability type: tide (CO-OPS tide predictions), current (CO-OPS current predictions), ' +
122
- 'water_level (CO-OPS observed water levels), buoy (NDBC buoy), met (NDBC meteorological).'))
126
+ .describe('Station capability, matched against the capabilities list of each station: tide (CO-OPS tide predictions), ' +
127
+ 'current (CO-OPS current predictions), water_level (CO-OPS observed water levels), ' +
128
+ 'met (NDBC meteorological — the stations noaa_marine_get_conditions reads), ' +
129
+ 'buoy (NDBC station reporting neither met nor currents).'))
123
130
  .optional()
124
- .describe('Filter by station type/capability. Omit to return all types.'),
131
+ .describe('Filter by station capability. Every returned station carries at least one of the requested values in its ' +
132
+ 'capabilities list. Omit to return all types. NDBC stations whose only capability is currents match none ' +
133
+ 'of these values — reach them with source="ndbc" and no types filter, or by name/ID via query.'),
125
134
  limit: z
126
135
  .number()
127
136
  .int()
@@ -141,7 +150,10 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
141
150
  .describe('Data source: coops (CO-OPS) or ndbc (NDBC buoy).'),
142
151
  type: z
143
152
  .string()
144
- .describe('Station type/capability string, e.g. "tide", "current", "water_level", "buoy".'),
153
+ .describe('The capability this row leads with — always one of the values in capabilities. When a types filter ' +
154
+ 'is set this is the first requested capability the station has, so it never contradicts the filter; ' +
155
+ 'otherwise it is the first capability. This is a data-product capability, not the physical platform ' +
156
+ 'classification — for that, read the noaa-marine://station/{station_id} resource.'),
145
157
  latitude: z.number().describe('Station latitude in decimal degrees.'),
146
158
  longitude: z.number().describe('Station longitude in decimal degrees.'),
147
159
  distance_km: z
@@ -173,17 +185,45 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
173
185
  when: 'No stations match the query, location, or filters.',
174
186
  recovery: 'Widen the search by increasing radius_km, removing type filters, or using a broader query.',
175
187
  },
188
+ {
189
+ reason: 'incomplete_coordinates',
190
+ code: JsonRpcErrorCode.InvalidParams,
191
+ when: 'Only one of latitude/longitude was supplied — proximity search needs the pair.',
192
+ recovery: 'Supply both latitude and longitude to search by proximity, or drop both and search by query or state instead.',
193
+ },
176
194
  ],
177
195
  async handler(input, ctx) {
178
196
  const coopsSvc = getCoopsService();
179
197
  const ndbcSvc = getNdbcService();
198
+ // A lone latitude or longitude cannot anchor a proximity search. Reject the pair
199
+ // outright rather than silently dropping the distance filter and returning the
200
+ // global list sorted by name, which reads as a successful location search.
201
+ const { latitude: lat, longitude: lon } = input;
202
+ if ((lat === undefined) !== (lon === undefined)) {
203
+ const missing = lat === undefined ? 'latitude' : 'longitude';
204
+ throw ctx.fail('incomplete_coordinates', `Proximity search needs both latitude and longitude — ${missing} is missing.`, { ...ctx.recoveryFor('incomplete_coordinates') });
205
+ }
206
+ const center = lat !== undefined && lon !== undefined ? { lat, lon } : undefined;
207
+ // Blank/whitespace-only queries carry no search intent — treat them as omitted
208
+ // rather than substring-matching station names that contain runs of spaces.
209
+ const query = input.query?.trim().toLowerCase();
210
+ // An empty types array means the same thing as no types array.
211
+ const typeFilter = input.types?.length ? input.types : undefined;
212
+ /** True when the station carries at least one of the requested capabilities. */
213
+ const matchesTypeFilter = (capabilities) => !typeFilter || typeFilter.some((t) => capabilities.includes(t));
214
+ /**
215
+ * The capability a row leads with. Under a types filter this is the first requested
216
+ * capability the station actually has, so `type` can never contradict the filter that
217
+ * selected the row; unfiltered, it is the station's first capability. Both this and
218
+ * matchesTypeFilter read the same capabilities array, so the two agree by construction.
219
+ */
220
+ const primaryTypeFor = (capabilities) => typeFilter?.find((t) => capabilities.includes(t)) ?? capabilities[0] ?? 'unknown';
180
221
  const results = [];
181
- const lat = input.latitude;
182
- const lon = input.longitude;
183
- const hasLatLon = lat !== undefined && lat !== null && lon !== undefined && lon !== null;
184
- // Fetch CO-OPS and NDBC lists in parallel
222
+ // Fetch CO-OPS and NDBC lists in parallel.
223
+ // `state` is a CO-OPS-only filter — NDBC buoys carry no state, so a state-scoped
224
+ // search must exclude them (otherwise state-less global buoys flood the results).
185
225
  const includeCoops = input.source === 'all' || input.source === 'coops';
186
- const includeNdbc = input.source === 'all' || input.source === 'ndbc';
226
+ const includeNdbc = (input.source === 'all' || input.source === 'ndbc') && !input.state;
187
227
  const [coopsResults, ndbcResult] = await Promise.allSettled([
188
228
  includeCoops
189
229
  ? Promise.all([
@@ -197,70 +237,40 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
197
237
  // Process CO-OPS stations
198
238
  if (coopsResults.status === 'fulfilled' && coopsResults.value) {
199
239
  const [tideStations, currentStations, waterLevelStations] = coopsResults.value;
200
- const tideSet = new Set();
201
- const currentSet = new Set();
202
- const waterLevelSet = new Set();
203
- for (const s of tideStations)
204
- tideSet.add(s.id);
205
- for (const s of currentStations)
206
- currentSet.add(s.id);
207
- for (const s of waterLevelStations)
208
- waterLevelSet.add(s.id);
209
- // Build unique station map — a station can appear in multiple lists
240
+ // Build unique station map — a station can appear in multiple lists, and each list
241
+ // it appears in IS one of its capabilities, so membership needs no separate index.
210
242
  const allCoops = new Map();
211
- for (const s of tideStations) {
212
- if (!allCoops.has(s.id))
213
- allCoops.set(s.id, { ...s, capabilities: [] });
214
- const entry = allCoops.get(s.id);
215
- if (entry && !entry.capabilities.includes('tide'))
216
- entry.capabilities.push('tide');
217
- }
218
- for (const s of currentStations) {
219
- if (!allCoops.has(s.id))
220
- allCoops.set(s.id, { ...s, capabilities: [] });
221
- const entry = allCoops.get(s.id);
222
- if (entry && !entry.capabilities.includes('current'))
223
- entry.capabilities.push('current');
224
- }
225
- for (const s of waterLevelStations) {
226
- if (!allCoops.has(s.id))
227
- allCoops.set(s.id, { ...s, capabilities: [] });
228
- const entry = allCoops.get(s.id);
229
- if (entry && !entry.capabilities.includes('water_level'))
230
- entry.capabilities.push('water_level');
231
- }
232
- for (const [, s] of allCoops) {
233
- // Apply type filter
234
- if (input.types && input.types.length > 0) {
235
- const hasMatch = input.types.some((t) => (t === 'tide' && tideSet.has(s.id)) ||
236
- (t === 'current' && currentSet.has(s.id)) ||
237
- (t === 'water_level' && waterLevelSet.has(s.id)));
238
- if (!hasMatch)
239
- continue;
243
+ const addCapability = (stations, capability) => {
244
+ for (const s of stations) {
245
+ const entry = allCoops.get(s.id) ?? { ...s, capabilities: [] };
246
+ if (!entry.capabilities.includes(capability))
247
+ entry.capabilities.push(capability);
248
+ allCoops.set(s.id, entry);
240
249
  }
241
- // Apply state filter
250
+ };
251
+ addCapability(tideStations, 'tide');
252
+ addCapability(currentStations, 'current');
253
+ addCapability(waterLevelStations, 'water_level');
254
+ for (const s of allCoops.values()) {
255
+ if (!matchesTypeFilter(s.capabilities))
256
+ continue;
242
257
  if (input.state && s.state !== input.state)
243
258
  continue;
244
- // Apply name query
245
- if (input.query) {
246
- const q = input.query.toLowerCase();
247
- if (!s.name.toLowerCase().includes(q))
248
- continue;
249
- }
250
- const primaryType = s.capabilities[0] ?? 'tide';
259
+ if (query && !s.name.toLowerCase().includes(query))
260
+ continue;
251
261
  const entry = {
252
262
  station_id: s.id,
253
263
  name: s.name,
254
264
  source: 'coops',
255
- type: primaryType,
265
+ type: primaryTypeFor(s.capabilities),
256
266
  latitude: s.lat,
257
267
  longitude: s.lng,
258
268
  capabilities: s.capabilities,
259
269
  };
260
270
  if (s.state)
261
271
  entry.state = s.state;
262
- if (hasLatLon && lat !== undefined && lon !== undefined) {
263
- const dist = haversineKm(lat, lon, s.lat, s.lng);
272
+ if (center) {
273
+ const dist = haversineKm(center.lat, center.lon, s.lat, s.lng);
264
274
  if (dist > input.radius_km)
265
275
  continue;
266
276
  entry.distance_km = Math.round(dist * 10) / 10;
@@ -271,18 +281,10 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
271
281
  // Process NDBC stations
272
282
  if (ndbcResult.status === 'fulfilled' && ndbcResult.value) {
273
283
  for (const s of ndbcResult.value) {
274
- // Apply type filter
275
- if (input.types && input.types.length > 0) {
276
- const hasMatch = input.types.some((t) => (t === 'buoy' || t === 'met') && (s.hasMet || s.type?.toLowerCase().includes('buoy')));
277
- if (!hasMatch)
278
- continue;
279
- }
280
- // Apply name query
281
- if (input.query) {
282
- const q = input.query.toLowerCase();
283
- if (!s.name.toLowerCase().includes(q) && !s.id.toLowerCase().includes(q))
284
- continue;
285
- }
284
+ // Derive capabilities from the NDBC flags BEFORE filtering, so the filter and the
285
+ // reported capabilities read the same array. The station's `type` attribute is a
286
+ // platform classification (buoy/fixed/oilrig/dart/…), not a capability — matching
287
+ // it against a `met` filter admits buoys NDBC flags as met="n".
286
288
  const capabilities = [];
287
289
  if (s.hasMet)
288
290
  capabilities.push('met');
@@ -290,17 +292,21 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
290
292
  capabilities.push('currents');
291
293
  if (capabilities.length === 0)
292
294
  capabilities.push('buoy');
295
+ if (!matchesTypeFilter(capabilities))
296
+ continue;
297
+ if (query && !s.name.toLowerCase().includes(query) && !s.id.toLowerCase().includes(query))
298
+ continue;
293
299
  const entry = {
294
300
  station_id: s.id,
295
301
  name: s.name,
296
302
  source: 'ndbc',
297
- type: 'buoy',
303
+ type: primaryTypeFor(capabilities),
298
304
  latitude: s.lat,
299
305
  longitude: s.lon,
300
306
  capabilities,
301
307
  };
302
- if (hasLatLon && lat !== undefined && lon !== undefined) {
303
- const dist = haversineKm(lat, lon, s.lat, s.lon);
308
+ if (center) {
309
+ const dist = haversineKm(center.lat, center.lon, s.lat, s.lon);
304
310
  if (dist > input.radius_km)
305
311
  continue;
306
312
  entry.distance_km = Math.round(dist * 10) / 10;
@@ -309,7 +315,7 @@ export const noaaMarineFindStations = tool('noaa_marine_find_stations', {
309
315
  }
310
316
  }
311
317
  // Sort: by distance if lat/lon provided, otherwise by name
312
- if (hasLatLon) {
318
+ if (center) {
313
319
  results.sort((a, b) => (a.distance_km ?? 9999) - (b.distance_km ?? 9999));
314
320
  }
315
321
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"noaa-marine-find-stations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/noaa-marine-find-stations.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"noaa-marine-find-stations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/noaa-marine-find-stations.tool.ts"],"names":[],"mappings":"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"}
@@ -30,11 +30,11 @@ export declare const noaaMarineGetConditions: import("@cyanheads/mcp-ts-core").T
30
30
  readonly reason: "buoy_not_found";
31
31
  readonly code: JsonRpcErrorCode.NotFound;
32
32
  readonly when: "NDBC returned 404 for the station ID.";
33
- readonly recovery: "Verify the station ID using noaa_marine_find_stations with source=\"ndbc\" and try again.";
33
+ readonly recovery: "Find a conditions-capable station with noaa_marine_find_stations using source=\"ndbc\" and types=[\"met\"] — an unfiltered NDBC search returns stations that have no observation file.";
34
34
  }, {
35
35
  readonly reason: "no_sensor_data";
36
36
  readonly code: JsonRpcErrorCode.NotFound;
37
37
  readonly when: "Buoy file exists but all sensor fields are MM (missing) — buoy offline or sensor failure.";
38
- readonly recovery: "The buoy may be temporarily offline. Try a nearby buoy via noaa_marine_find_stations.";
38
+ readonly recovery: "This station may be temporarily offline — try a nearby one from noaa_marine_find_stations with source=\"ndbc\" and types=[\"met\"].";
39
39
  }], undefined>;
40
40
  //# sourceMappingURL=noaa-marine-get-conditions.tool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"noaa-marine-get-conditions.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/noaa-marine-get-conditions.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,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAmLlC,CAAC"}
1
+ {"version":3,"file":"noaa-marine-get-conditions.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/noaa-marine-get-conditions.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,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+LlC,CAAC"}