Command Palette

Search for a command to run...

UnylyUnyly
Browse all

Birding Planner

FreeNot checked

MCP server for birding trip planning with migration forecasts, hotspot analysis, and daily email briefings, integrating eBird, BirdCast, NWS, and iNaturalist da

GitHubEmbed

About

MCP server for birding trip planning with migration forecasts, hotspot analysis, and daily email briefings, integrating eBird, BirdCast, NWS, and iNaturalist data.

README

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.

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.

from github.com/minikdj/ebird-birding-planner

Install Birding Planner in Claude Desktop, Claude Code & Cursor

Recommended · one command, every IDE
unyly install birding-planner

Installs into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.

First time? Get the CLI: curl -fsSL https://unyly.org/install | sh

Or configure manually

Run in your terminal:

claude mcp add birding-planner -- npx -y github:minikdj/ebird-birding-planner

FAQ

Is Birding Planner MCP free?

Yes, Birding Planner MCP is free — one-click install via Unyly at no cost.

Does Birding Planner need an API key?

No, Birding Planner runs without API keys or environment variables.

Is Birding Planner hosted or self-hosted?

Self-hosted: the server runs locally on your machine via the install command above.

How do I install Birding Planner in Claude Desktop, Claude Code or Cursor?

Open Birding Planner on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.

Related MCPs

Compare Birding Planner with

Not sure what to pick?

Find your stack in 60 seconds

Author?

Embed badge for your README

Browse similar

All communication MCPs