Skip to main content
Glama
Birding Planner
by minikdj

Birding Planner

MCP server + daily / on-demand email briefing for migration monitoring. Defaults to Cincinnati, configurable for any region.

Full specification: SPEC.md. Tests: TESTING.md. Email rendering rules: routine-prompt.md.

MCP Server Tools

All 11 tools, used interactively from Claude Desktop:

Tool

What it does

plan_birding_trip

Ranks nearby hotspots by recent species count + migration activity

migration_forecast

BirdCast radar data + NWS weather interpretation

hotspot_details

Recent species and notable sightings at a single hotspot

compare_hotspots

Side-by-side species comparison with iNaturalist verification

species_finder

Where a species has been seen recently near a location

best_day_to_bird

Recommends the best day in a date range using migration + weather

birding_weather

NWS overnight/morning forecast interpreted for migration prediction

verify_sighting

Cross-references eBird reports against iNaturalist photo-verified obs

birding_window

Sunrise, civil twilight, and recommended arrival time

species_frequency

Historical peak week and current phenology status via BirdCast

plan_vacation_birding

Discovery report for a travel destination: target species, top hotspots, birding window. Works weeks or months ahead using historical bar-chart data.

Per-tool details (inputs/outputs, edge cases) are in SPEC §3.5; each tool lives in src/handlers/<name>.js.

Related MCP server: SHEARLINE

Setup

1. API keys

2. Environment

cp .env.example .env   # then fill in keys

Every env var is documented in SPEC §6.2.

3. Install dependencies

npm install

ajv is required for schema validation; sanitize-html for email delivery. Both ship in package.json dependencies — no extra steps.

4. Claude Desktop integration

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "ebird-birding-planner": {
      "command": "node",
      "args": ["/absolute/path/to/ebird-birding-planner/src/index.js"],
      "env": {
        "EBIRD_API_KEY": "your_key_here",
        "BIRDCAST_API_KEY": "your_key_here",
        "EBIRD_LIFE_LIST_CSV": "/path/to/MyEBirdData.csv"
      }
    }
  }
}

Daily briefing (Anthropic Routine)

Cloud-hosted scheduled agent — no machine needs to be on.

  1. Routine runs at 09:00 UTC daily

  2. scripts/triage.js outputs a JSON decision (FULL_BRIEFING / QUIET_PERIOD / SILENT_SKIP)

  3. scripts/aggregate.js runs comprehensive data aggregation → single JSON blob (conforms to schemas/aggregate-output.schema.json)

  4. Agent reads the JSON, writes the email body as HTML, saves to ./briefing-draft.json

  5. scripts/send.js delivers via Resend (SendGrid + disk fallbacks)

See routine-prompt.md for the exact prompt to paste into the Routine. Required secrets: SPEC §6.2.

On-demand reports (mobile)

Trigger an ad-hoc report from your iPhone via the home-screen web app (bird-report.html). The page POSTs workflow_dispatch to .github/workflows/report-on-demand.yml, which runs the same triage → aggregate → generate-email → send pipeline with claude-sonnet-4-5 (Anthropic SDK, tool-use mode) writing the HTML.

The PAT stored in localStorage must be a fine-grained PAT scoped to this repo only, Actions Read+Write. Classic PATs are not supported (see SPEC §5.2). Workflow rate-capped at 20 dispatches per 24h.

Local testing

npm run test:unit                                  # 171 unit tests, no keys
node scripts/test-regressions.js                   # ~30 security/contract tests
BRIEFING_TEST_FIXTURE=full_lifer npm run aggregate # offline fixture run
node scripts/aggregate.js | npm run validate:schema -- /dev/stdin
node scripts/triage.js                             # live triage (keys required)

Fixture scenarios: full_lifer, full_rain, full_fallout, quiet_period, silent_skip. See TESTING.md.

Architecture (post Wave 2C decomp)

src/
  index.js              entry: loadConfig + clients + startServer
  server.js             MCP stdio dispatch
  config.js             frozen env-var config object
  lifelist.js           JSON-cache-first life list loader
  migration-scoring.js  unified rateNight() + threshold loader
  utils.js              Cache, fetchWithRetry, resolveLocation, …
  handlers/             one file per MCP tool
    _shared.js          createContext(), InputError, helpers
    index.js            HANDLERS[] + TOOL_HANDLERS Map
    <tool>.js           { tool, handle } per tool
  *-client.js           6 external API wrappers (retry + timeout + redaction)

scripts/
  triage.js             fast decision (~10s)
  aggregate.js          comprehensive data (~25s, schema-validated)
  generate-email.js     on-demand: Anthropic tool-use → draft
  send.js               sanitize → Resend → SendGrid → disk; idempotency
  validate-schema.js    Ajv against schemas/aggregate-output.schema.json
  test-unit.js          171 tests
  test-regressions.js   ~30 security + contract invariants
  fixtures/             pre-baked triage / aggregate JSON

schemas/aggregate-output.schema.json   data contract (CI-gated)
.github/workflows/report-on-demand.yml on-demand pipeline
routine-prompt.md                       daily briefing prompt + design system

See SPEC.md for the full specification.

Available Tools

10 tools
best_day_to_birdB

Recommend the best day to go birding within a date range, combining BirdCast migration forecasts, historical eBird frequency data, and recent observation trends.

Inputs: location, date_range, target_species.

birding_weatherA

Get NWS weather data interpreted for birding: overnight wind direction/speed (the key migration predictor), morning forecast, and a plain-English migration interpretation. Automatically combined into migration_forecast output.

Inputs: lat, lng, date.

birding_windowB

Calculate sunrise, civil twilight, and recommended arrival time for a birding session at a given location and date.

Inputs: lat, lng, date, temp_f.

compare_hotspotsA

Compare multiple eBird hotspots side-by-side: unique species, shared species, notable sightings, and checklist activity at each.

Inputs: hotspots (required), location.

hotspot_detailsA

Get detailed info about a specific eBird hotspot: recent species, notable sightings, and frequency data for this time of year.

Inputs: hotspot (required), location.

migration_forecastA

Get BirdCast migration data for a region: last night's traffic, expected species, seasonal totals, and a plain-English summary. Only available during migration seasons (Mar-Jun, Aug-Nov).

Inputs: region_code, date.

plan_birding_tripB

Plan a birding trip by finding the best nearby hotspots, combining recent species diversity, notable sightings, and BirdCast migration data. Returns ranked hotspots with migration context.

Inputs: location, date, radius_km.

species_finderB

Find where a specific bird species has been seen recently near a location, sorted by most recent observation.

Inputs: species (required), location, radius_km.

species_frequencyA

Look up historical frequency data for a species in a region using BirdCast bar chart data. Returns peak week, current probability, and whether the species is early/on-time/late relative to its historical peak.

Inputs: species (required), region_code, date.

verify_sightingA

Cross-reference an eBird species sighting against iNaturalist photo-verified observations nearby. Returns confidence level and count of research-grade (photo-verified) reports.

Inputs: species (required), lat, lng, radius_km, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 10 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: from finding the best day, weather, and timing to hotspot comparison, species finding, and sighting verification. There is no overlapping functionality; even related tools like 'best_day_to_bird' and 'migration_forecast' serve different needs.

    Naming Consistency4/5

    Tool names are predominantly descriptive with a consistent verb_noun or noun_noun pattern using snake_case (e.g., 'compare_hotspots', 'species_finder'). The only minor inconsistency is 'best_day_to_bird', which uses a phrase instead, but it remains clear and does not cause confusion.

    Tool Count5/5

    With 10 tools, the server is well-scoped for the birding planning domain. Each tool covers a specific aspect without redundancy, and the number is neither too few nor too many for effective use by an agent.

    Completeness5/5

    The tool set offers comprehensive coverage of birding planning: trip planning, weather, timing, hotspot details, species frequency, migration forecasts, and sighting verification. There are no obvious gaps; users can perform end-to-end planning without dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol server that allows AI assistants to access bird observation data, hotspots, and taxonomy information from eBird.
      29 npm
      8
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      A free, MIT-licensed MCP server that provides AI agents with analyst-grade US severe-weather tools, including live warning polygons, SPC outlooks, radar-derived hail and rotation products, and a composite threat brief.
      10
      28 PyPI
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that integrates with the eBird API to help plan bird-watching trips through Claude, enabling hotspot discovery, recent observations, rare bird sightings, and species information retrieval.
      29 npm
      MIT