Birding Planner
Birding Planner helps birders plan trips and get migration insights by combining eBird hotspot data, BirdCast forecasts, NWS weather, and iNaturalist verification. It defaults to Cincinnati, OH but works for any region.
Plan a birding trip – Find and rank nearby hotspots by recent species diversity, notable sightings, and migration activity.
Get migration forecasts – View BirdCast data on last night's traffic, expected species, and seasonal totals (available Mar–Jun and Aug–Nov).
Explore hotspot details – See recent species, notable sightings, and seasonal frequency for a specific eBird hotspot.
Compare hotspots – Side-by-side comparison of unique/shared species, notable sightings, and checklist activity.
Find a species – Locate where a specific bird has been seen recently near a location, sorted by most recent observation.
Find the best day to bird – Get an optimal day recommendation within a date range based on migration, weather, and historical frequency; supports targeting a specific species.
Get birding weather – NWS forecasts interpreted for birding, including overnight wind (key migration predictor) and morning conditions.
Verify a sighting – Cross-reference an eBird report against iNaturalist photo-verified observations for a confidence level and research-grade record count.
Calculate your birding window – Get sunrise, civil twilight, and recommended arrival time for a location and date, with optional temperature-based activity cutoff.
Check species frequency – Look up a species' historical peak week, current probability, and phenology status (early/on-time/late).
Sends daily briefing emails about birding migration conditions via Resend's email API.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Birding PlannerPlan a birding trip near Cincinnati this weekend"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Ranks nearby hotspots by recent species count + migration activity |
| BirdCast radar data + NWS weather interpretation |
| Recent species and notable sightings at a single hotspot |
| Side-by-side species comparison with iNaturalist verification |
| Where a species has been seen recently near a location |
| Recommends the best day in a date range using migration + weather |
| NWS overnight/morning forecast interpreted for migration prediction |
| Cross-references eBird reports against iNaturalist photo-verified obs |
| Sunrise, civil twilight, and recommended arrival time |
| Historical peak week and current phenology status via BirdCast |
| 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: MCP Weather Free
Setup
1. API keys
eBird API key (required): https://ebird.org/api/keygen — free
BirdCast API key (required): contact https://birdcast.info
Resend API key (for email): https://resend.com — 3,000 emails/month free
Anthropic API key (for on-demand briefing only): console.anthropic.com
2. Environment
cp .env.example .env # then fill in keysEvery env var is documented in SPEC §6.2.
3. Install dependencies
npm installajv 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.
Routine runs at 09:00 UTC daily
scripts/triage.jsoutputs a JSON decision (FULL_BRIEFING / QUIET_PERIOD / SILENT_SKIP)scripts/aggregate.jsruns comprehensive data aggregation → single JSON blob (conforms toschemas/aggregate-output.schema.json)Agent reads the JSON, writes the email body as HTML, saves to
./briefing-draft.jsonscripts/send.jsdelivers 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 systemSee SPEC.md for the full specification.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/minikdj/ebird-birding-planner'
If you have feedback or need assistance with the MCP directory API, please join our Discord server