stlouis-pollen

stlouis-pollen

Provides access to St. Louis County pollen and mold data, including current levels, per-species counts, and historical daily reports back to 2000.

Category
Visit Server

README

stlouis-pollen

JSON API, Prometheus metrics, and MCP server for the St. Louis County pollen & mold count, with historical data back to March 2000. Runs on Cloudflare Workers.

Base URLs:

  • https://stlouis-pollen.maxhogan.dev
  • https://stlouis-pollen.pmaxhogan.workers.dev

No auth, no tokens. Please be gentle: responses are highly cacheable and rate-limited to 60 requests/minute/IP.

HTTP API

Endpoint Description
GET /health 200 OK
GET /today Today's headline levels (original, stable shape)
GET /latest Latest full daily report with per-species counts
GET /day/YYYY-MM-DD Full daily report for a date
GET /history?start=YYYY-MM-DD&end=YYYY-MM-DD[&species=true] Day-by-day summaries, max 31 days per request
GET /metrics Prometheus metrics for today's report

Examples

curl https://stlouis-pollen.maxhogan.dev/today
# {"reportDate":"2026-07-31T05:00:00.000Z","tree":"","treeLevel":null,
#  "grass":"Low","grassLevel":1,"weed":"Moderate","weedLevel":2,
#  "mold":"Moderate","moldLevel":2}

curl https://stlouis-pollen.maxhogan.dev/day/2026-07-30
# {"date":"2026-07-30","available":true,"targetId":13634,
#  "tree":{"count":0,"level":"Absent","levelValue":0}, ...,
#  "species":{"tree":[{"name":"Ash","count":0,"level":"Absent"}, ...]}}

curl "https://stlouis-pollen.maxhogan.dev/history?start=2025-04-01&end=2025-04-30"
# {"start":"2025-04-01","end":"2025-04-30","days":[
#   {"date":"2025-04-01","available":true,"tree":{"count":905,"level":"High",...}, ...},
#   {"date":"2025-04-05","available":false,"reason":"no-report"}, ...]}

Days with no published report return available: false with a reason:

  • no-report — proven report-free (weekends, holidays, skipped days)
  • not-yet-published — the date is newer than the newest published report
  • unknown — couldn't be resolved this request (rare; retry)

MCP server

Model Context Protocol server over Streamable HTTP (plus legacy SSE at /sse). No auth required.

https://stlouis-pollen.maxhogan.dev/mcp

Claude Code:

claude mcp add --transport http stlouis-pollen https://stlouis-pollen.maxhogan.dev/mcp

Claude.ai / Claude Desktop: add a custom connector with the URL above.

Tools

Tool Args Description
get_current_report — Most recent published report (per-species counts + category levels), with is_today flag
get_day_report date Full report for one date
get_history start_date, end_date, include_species? Day-by-day history, max 31 days per call

Data notes

  • Source: scraped from the county's Pollen and Mold Center. All data belongs to the Saint Louis County Department of Public Health.
  • Cadence: reports are published on weekdays only, usually by ~noon US Central, and some days are skipped entirely. Dates are US Central.
  • Coverage: daily reports back to 2000-03-03.
  • Levels: the headline tree/grass/weed/mold levels are the summed category counts mapped through the standard NAB scale (Absent=0, Low=1, Moderate=2, High=3, Very High=4), which matches how the county site derives its home-page levels. Per-species levels are reported as printed.
  • Immutability & caching: past days are never revised upstream, so they are cached permanently (Workers KV, bundled per month) and served with long/immutable cache headers. Cold historical queries scrape the county site day-by-day (Pollen_Day.aspx?TargetID=N); warm ones never touch it.

How the historical scrape works

The county site keys daily reports by a sequential TargetID (one per published report, monotonically increasing with date). There is no direct date→ID endpoint, so this worker:

  1. ships a static table of ~80 (TargetID, date) anchor pairs,
  2. resolves a date to an ID with an interpolation search between anchors (each probe is a full day page, so probes double as cache fills),
  3. walks IDs forward to cover a range, proving skipped dates report-free when consecutive IDs bracket them,
  4. memoizes every discovered pair and day to KV — searches get cheaper forever.

Free-tier KV budget: ~317 month-bundle keys exist in total; each is written only while it fills and then never again, so lifetime writes are bounded by the amount of history (≪ the 1,000 writes/day free limit) and reads are ≤3 per request.

Development

npm install
npm test          # parser unit tests against saved fixtures
npm run typecheck
npm run dev       # wrangler dev

Deploys happen automatically on push to main via the Cloudflare Workers native GitHub integration (Workers Builds). wrangler.jsonc is the source of truth for the custom domain, the workers.dev route, KV, Durable Object, and rate-limit bindings.

License

MIT. Not affiliated with St. Louis County — data is theirs; please attribute it to the Saint Louis County Pollen and Mold Center.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured