Cornell Lab of Ornithology citizen-science bird observations — 1B+ bird sightings worldwide with region trees, notable-sighting flags, and species-specific endpoints
eBird MCP demonstrates solid fundamentals: all 5 tools have clear action-verb names (recent_*, nearby_*, find_*, list_*), descriptions (avg 140 chars, within 10-1024 range), and complete input schemas with types and required fields. Parameters are well-described with constraints (e.g., 'Days back (1-30, default 14)', enum for region_type). However, output schemas are entirely undocumented, the code normalizes eBird API responses but LLMs cannot see what fields to expect. Error handling is basic (401/403/404/429 checks) but lacks recovery guidance. No tool annotations (readOnlyHint, idempotentHint). Parameter naming is consistent but could be more explicit (e.g., 'back_days' vs 'back'). Overall: good naming and input clarity, weak on output documentation and error guidance.
Search the eBird taxonomy by common or scientific name. Returns the eBird species code needed by the observation tools.
Child regions of a parent. region_type is "country", "subnational1" (states/provinces), or "subnational2" (counties). parent_region_code uses eBird codes ("world", "US", "US-CA").
Recent observations within a radius of a lat/lon. Useful for "what birds are around here right now."
Only notable (rare / out-of-range / first-of-season) sightings in a region. Sometimes the most interesting subset.
Recent bird sightings in a region. region_code is the eBird identifier — countries are 2-letter ("US", "GB"), states "US-CA", counties "US-CA-075", and birding hotspots use the "L<id>" code from eBird (e.g., "L99381"). Optionally filter to one species.
Output schemas completely undocumented. Code normalizes eBird API responses (EbirdObservation → snake_case fields) but LLMs cannot see the return structure. This forces agents to guess what fields exist and breaks downstream tool chaining.
Error handling lacks recovery guidance. Errors like 'eBird: not found (HTTP 404), check region/species codes' are generic. Should include actionable next steps: 'Region code not found. Call list_subregions() to discover valid codes.'
No tool annotations. All tools are read-only (safe to retry) but lack readOnlyHint. This prevents agents from reasoning about idempotency and retry safety.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Parameter 'back' is ambiguous, should be 'back_days' or 'days_back' to clarify units. Similarly, 'dist_km' is good but 'max_results' lacks a range hint in the description (should state '1 - 10000').
API key injection via '_apiKey' parameter is non-standard. Should use server-side secret injection (environment variable or vault). Passing secrets as parameters risks logging them in agent traces.