https://raw.githubusercontent.com/cyanheads/noaa-cdo-mcp-server/HEAD/AGENTS.md
− **Version:** 0.8.0− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.18`− **Engines:** Bun ≥1.4.0, Node ≥24.0.0− NOAA Climate Data Online (CDO) API v2 — historical weather data — plus two separate NCEI bulk-CSV corpora: the Storm Events Database and Billion-Dollar Weather and Climate Disasters. 10 tools, 2 data resources, and 1 published agent skill:− - `noaa_climate_search_storm_events` — search NCEI Storm Events for one year (severe-weather events, damage, casualties, narratives)− CDO station inputs share `stationIdFilter` / `stationIdArrayFilter` and `normalizeStationId` in `shared/validation.ts`: trim, uppercase, and prefix bare 11-character GHCN aliases; generic IDs remain opaque. Successful tools compose normalization notices; the station resource keeps its existing result shape. `/data` alone checks the actual encoded query against 4000 characters before retry/fetch. Fetch-data keeps raw CDO types distinct from its output: documented PRECIP_HLY/HPCP and PRECIP_15/QPC− - `src/services/storm-events/storm-events-service.ts` — NCEI bulk CSV. No token, no JSON envelope, no `resolveCollectionTotal()`. Resolves each year's `_c<publishDate>`-suffixed filename from the live directory index (it is not constructible), decompresses explicitly (the files carry no `Content-Encoding`), and streams a year through the shared CSV reader so the decompressed ~70 MB is never held. Caches the listing and two years of compressed bytes for six hours. Damage parsing lives in `damage.− noaa-climate-*.tool.ts # 10 tool definitions− `npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. `mcpb pack` reads `.mcpbignore`, not `.gitignore`, so every root path the bundle must not ship — source, tests, docs, caches, logs, agent docs, plugin manifests, gitignored local files — needs a root-anchored line there (`/docs/`, never `docs/`, which also strips `node_modules/*/docs/`); `lint:packaging` names each missing or unanchored line. Root `skills/` ships on purpose. The pack step is followed by+ **Version:** 0.9.0+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.22`+ **Engines:** Bun ≥1.4.4, Node ≥24.0.0+ NOAA Climate Data Online (CDO) API v2 — historical weather data — plus three separate NCEI sources: the 1991–2020 U.S. Climate Normals (Access Data Service) and two bulk-CSV corpora, the Storm Events Database and Billion-Dollar Weather and Climate Disasters. 11 tools, 2 data resources, and 1 published agent skill:+ - `noaa_climate_get_normals` — read one station's 1991–2020 U.S. Climate Normals (monthly, daily, hourly, annual/seasonal) in NCEI's native units, with completeness flags; CDO's `NORMAL_*` datasets are the superseded 1981–2010 normals+ - `noaa_climate_search_storm_events` — search NCEI Storm Events for one year (severe-weather events, damage, casualties, narratives; county rows carry `cdoLocationId`, and `countyFips` selects one county)+ CDO station inputs share `stationIdFilter` / `stationIdArrayFilter` and `normalizeStationId` in `shared/validation.ts`: trim, uppercase, and prefix bare 11-character GHCN aliases; generic IDs remain opaque. `noaa_climate_get_normals` is the exception: `ghcnStationIdFilter` / `normalizeGhcnStationId` accept only a GHCN-Daily ID and send the bare form, uppercasing only an ID written all in lowercase because NCEI matches case-sensitively. Successful tools compose normalization notices; the station + - `src/services/storm-events/storm-events-service.ts` — NCEI bulk CSV. No token, no JSON envelope, no `resolveCollectionTotal()`. Resolves each year's `_c<publishDate>`-suffixed filename from the live directory index (it is not constructible), decompresses explicitly (the files carry no `Content-Encoding`), and streams a year through the shared CSV reader so the decompressed ~70 MB is never held. Caches the listing and two years of compressed bytes for six hours. Damage parsing lives in `damage.+ - `src/services/normals/normals-service.ts` — NCEI Access Data Service (`/access/services/data/v1`) for 1991–2020 normals. No token. One dataset per granularity, every datatype named explicitly (the service's own monthly default omits `MLY-TAVG-NORMAL`), `units` never sent, rows of left-padded strings parsed into one record per datatype, a bounded timeout and a total deadline around `withRetry`. A datatype outside the verified `UNITS` table gets no `unit`.+ normals/ # 1991–2020 normals: Access Data Service client, unit labels+ noaa-climate-*.tool.ts # 11 tool definitions+ `npm run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. `mcpb pack` reads `.mcpbignore`, not `.gitignore`, so every root path the bundle must not ship — source, tests, docs, caches, logs, agent docs, plugin manifests, gitignored local files — needs a root-anchored line there (`/docs/`, never `docs/`, which also strips `node_modules/*/docs/`); `lint:packaging` names each missing or unanchored line. Root `skills/` ships on purpose. The pack step is followed by