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: SHEARLINE
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.
Available Tools
10 toolsbest_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.
| Name | Required | Description | Default |
|---|---|---|---|
| location | No | Region code, lat/lng, or city name. Defaults to Cincinnati. | |
| date_range | No | Date range: "this week", "this weekend", "next 5 days", "May 15-22". Defaults to this week. | |
| target_species | No | Optional common name of a target species to optimize for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It mentions combining three data sources but does not explain how the recommendation is computed, what the output format is, any limitations (e.g., data gaps, rate limits), or side effects. More detail is needed for an agent to understand the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that immediately conveys the tool's purpose. It is front-loaded, efficient, and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of combining multiple data sources (migration forecasts, historical frequency, recent trends) and the absence of an output schema, the description is insufficient. It does not specify the recommendation format, error handling, or fallback behavior, leaving an agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter having a basic description. The description adds context by stating the data sources used (BirdCast, eBird), but does not significantly enhance meaning beyond the schema. Baseline of 3 is appropriate as the schema already provides adequate documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool recommends the best day to go birding within a date range by combining multiple data sources. The verb 'recommend' and resource 'best day' are specific, and it distinguishes itself from sibling tools like migration_forecast or species_frequency by being an aggregative recommendation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions use within a date range but lacks explicit guidance on when to use this tool versus alternatives (e.g., migration_forecast for pure forecasts, species_frequency for historical data). No exclusions or when-not-to-use instructions are provided, limiting its helpfulness for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude (default 39.1 for Cincinnati). | |
| lng | No | Longitude (default -84.5 for Cincinnati). | |
| date | No | Date for forecast. Defaults to today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals that data is from NWS and interpreted, and that output is combined into migration_forecast. With no annotations, this is adequate but lacks details on side effects, rate limits, or data freshness. It adds some behavioral context beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main action, and contains no unnecessary words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of sibling tools and no output schema, the description partially explains output (combined into migration_forecast) but lacks specifics on return format or how the output relates to other tools. It is adequate for simple use but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for lat, lng, and date (including defaults). The description does not add additional parameter semantics beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets NWS weather data interpreted for birding, listing specific components like overnight wind direction/speed, morning forecast, and plain-English migration interpretation. It distinguishes itself from siblings by emphasizing interpretation and combination into migration_forecast output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for birding weather interpretation but does not provide explicit guidance on when to use this tool over alternatives like 'migration_forecast' or 'birding_window'. No when-not-to-use or prerequisite information is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
birding_windowB
Calculate sunrise, civil twilight, and recommended arrival time for a birding session at a given location and date.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude (default 39.1). | |
| lng | No | Longitude (default -84.5). | |
| date | No | Date. Defaults to today. | |
| temp_f | No | Optional forecasted temperature (°F) — adjusts activity cutoff estimate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses calculating time-related outputs and adjusting for temperature, but lacks details on output format, timezone handling, or whether it uses specific twilight definitions. This is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 18 words, conveying the core functionality without any redundant information. It is appropriately front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters and no output schema, the description should explain the output format and timezone handling. It omits these crucial details, leaving the agent uninformed about what to expect from the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds minor context (e.g., temp_f adjusts activity cutoff estimate) but does not significantly surpass the schema's existing parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool calculates sunrise, civil twilight, and recommended arrival time for a birding session, using a specific verb and resource. It distinguishes itself from siblings like best_day_to_bird or migration_forecast, which focus on different aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives. It implies usage for planning birding session timing but does not mention when not to use it or suggest other tools like plan_birding_trip for broader planning.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_hotspotsA
Compare multiple eBird hotspots side-by-side: unique species, shared species, notable sightings, and checklist activity at each.
| Name | Required | Description | Default |
|---|---|---|---|
| hotspots | Yes | Array of hotspot location IDs (e.g. ["L12345", "L67890"]) or names. | |
| location | No | Location context for name-based search (optional). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the types of output (unique species, shared species, etc.) but does not cover behavioral traits like read-only nature, permissions, rate limits, or data freshness. It is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, 15 words, front-loaded with the core action and key outputs. Every word contributes to understanding, with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple input schema with two parameters and no output schema, the description adequately captures the tool's purpose and key output categories. Minor gaps exist (e.g., maximum number of hotspots, return format), but overall it is fairly complete for a comparison tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The description adds no additional meaning beyond what the schema provides, earning a baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'compare' and the resource 'eBird hotspots', specifying what aspects are compared (unique species, shared species, notable sightings, checklist activity). This differentiates it from sibling tools like hotspot_details which focuses on a single hotspot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives. The description implies comparison use cases but does not provide when-to-use or when-not-to-use criteria, nor mentions alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hotspot_detailsA
Get detailed info about a specific eBird hotspot: recent species, notable sightings, and frequency data for this time of year.
| Name | Required | Description | Default |
|---|---|---|---|
| hotspot | Yes | Hotspot location ID (e.g. "L12345") or name to search for. | |
| location | No | Location context for name-based search (optional). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool is a read operation fetching recent sightings and frequency data, and mentions temporal context ('for this time of year'). However, it does not specify data freshness, pagination, authentication needs, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the key purpose and details. Every part is meaningful, and there is no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description should clarify return values. It mentions 'recent species, notable sightings, and frequency data' but lacks structural details (e.g., is it a list? paginated?). Sibling tools are not referenced. It is adequate for a simple retrieval, but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters well-described in the schema. The tool description does not add additional meaning beyond what the schema provides, such as examples or constraints. It merely restates the concept of a hotspot.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves detailed information about a specific eBird hotspot, listing the types of data (recent species, notable sightings, frequency data). It distinguishes itself from siblings like species_finder (which focuses on a species) or compare_hotspots (which compares multiple hotspots) by centering on a single hotspot and providing a broad overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when detailed hotspot info is needed, but it does not explicitly state when to use this tool versus alternatives. There is no mention of when not to use it or comparative guidance, leaving the agent to infer from the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| region_code | No | BirdCast region code (e.g. "US-OH-061"). Defaults to Hamilton County, OH. | |
| date | No | Date for forecast. Defaults to today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. Discloses data types (traffic, species, totals, summary) and seasonal availability. Missing details on authentication, rate limits, or return format, but adequate for a read-only forecast.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and data types, followed by a necessary constraint. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately explains return value (traffic, species, totals, summary). Also covers availability window. No missing elements for a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage. Description adds value by specifying defaults (region code defaulting to Hamilton County, OH, date defaulting to today) and providing example format for region_code.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool gets BirdCast migration data for a region and lists specific data types (last night's traffic, expected species, seasonal totals, summary). Differentiates from siblings like birding_weather or species_finder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states availability only during migration seasons (Mar-Jun, Aug-Nov), guiding when to use the tool. Does not name specific alternatives for off-season, but context signals provide sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| location | No | Region code (e.g. "US-OH-061"), lat/lng (e.g. "39.1,-84.5"), or city name (e.g. "Cincinnati"). Defaults to Cincinnati. | |
| date | No | Date for the trip: "today", "tomorrow", "this weekend", "next Saturday", "May 20", or "2026-05-20". Defaults to today. | |
| radius_km | No | Search radius in km (default 30). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the output ('ranked hotspots with migration context') but discloses no behavioral traits such as side effects, permissions, rate limits, or data freshness. The agent cannot infer whether this tool is read-only or has any constraints beyond the basic operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (one sentence) and front-loaded with the primary action. It efficiently conveys the core functionality but could benefit from a brief usage note or example. No extraneous content is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (3 parameters, no output schema), the description provides a high-level overview but lacks details on ranking criteria, return format, data sources' recency, or geographic coverage. It is adequate for basic understanding but leaves gaps for an agent needing precise information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter described (location, date, radius_km). The description adds no new meaning beyond what the schema provides, such as clarifying defaults or accepted formats. Baseline 3 is appropriate since the schema already covers parameter semantics adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: '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.' It uses a specific verb ('Plan') and resource, and distinguishes from siblings like 'migration_forecast' and 'hotspot_details' by focusing on a combined, ranked output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for planning a trip by integrating multiple data sources, but it does not explicitly state when to use this tool versus alternatives (e.g., when to use 'migration_forecast' alone or 'compare_hotspots'). No when-not-to-use guidance is provided, limiting the agent's ability to decide contextually.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
species_finderB
Find where a specific bird species has been seen recently near a location, sorted by most recent observation.
| Name | Required | Description | Default |
|---|---|---|---|
| species | Yes | Common name of the species (e.g. "Cerulean Warbler"). | |
| location | No | Region code, lat/lng, or city name. Defaults to Cincinnati. | |
| radius_km | No | Search radius in km (default 50). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description mentions sorting by recent observation but lacks details on output format, pagination, or any limitations (e.g., max results).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with clear structure; front-loaded with verb and object, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description is too sparse; it does not explain what the output contains (e.g., specific location details, timestamps), leaving an agent with incomplete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with descriptions of species, location, radius_km. The tool description adds minimal extra meaning beyond 'recently' and 'near a location'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds where a bird species has been seen recently near a location, sorted by most recent observation, distinguishing it from siblings like birding_weather or species_frequency.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly compare to siblings or state when to use this tool versus alternatives, but the purpose is clear enough for an agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| species | Yes | Common name of the species (e.g. "Tennessee Warbler"). | |
| region_code | No | eBird region code (default "US-OH-061"). | |
| date | No | Date for the lookup. Defaults to today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits. It explains the data source and return values (peak week, current probability, early/on-time/late status), but does not mention read-only nature, authentication needs, or error handling. Adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, each adding value. Front-loaded with the verb and resource. No redundant or unnecessary words. Effective and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 params, no output schema, no nested objects), the description covers the main purpose, data source, and return values. It lacks information about required parameters (species is required) and potential edge cases, but overall sufficient for a straightforward lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, so each parameter's purpose is already documented. The description does not add new meaning beyond the schema; it mentions defaults (e.g., region_code default) but that's already in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Look up historical frequency data for a species in a region using BirdCast bar chart data.' It uses a specific verb ('look up') and identifies the resource (BirdCast bar chart data). The purpose distinguishes it from sibling tools like migration_forecast (forecast) and species_finder (find species by criteria).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving historical frequency data but does not explicitly state when to use this tool versus alternatives like migration_forecast or species_finder. The context is clear, but exclusions or alternative tool references are missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| species | Yes | Common or scientific name of the species. | |
| lat | No | Latitude (default 39.1). | |
| lng | No | Longitude (default -84.5). | |
| radius_km | No | Search radius in km (default 30). | |
| days_back | No | Days to look back (default 14). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full burden. It discloses that the tool returns a confidence level and count of research-grade reports, indicating a read-only verification behavior. However, it does not mention any potential limitations, authentication needs, or what happens when no data is found, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core purpose, and contains no redundant information. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema, the description explains return values (confidence level, count) but lacks details on the format or computation of confidence. The tool involves two external data sources, so additional context on data freshness or errors would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All five parameters have descriptions in the schema (100% coverage), so the baseline is 3. The tool description adds context about cross-referencing between eBird and iNaturalist, but does not deepen meaning beyond what is already in the schema (e.g., species name, lat/lng, radius, days_back).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: cross-referencing an eBird species sighting against iNaturalist photo-verified observations. It specifies the verb (cross-reference) and the resources (eBird, iNaturalist), and distinguishes from sibling tools like best_day_to_bird or migration_forecast, which focus on timing or location rather than verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when one needs to verify a sighting with photo evidence, but it does not explicitly state when to use this tool versus alternatives like species_finder or compare_hotspots. No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
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.
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.
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.
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for weather with reasoning — umbrella advice, outdoor checks, city comparisons.
An MCP server for deep research or task groups
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
Official MCP server for subfeed.app — the cloud for agents. 15+ tools for AI agents to register, build, and deploy other agents. Zero human required. Start here: subfeed.app/skill.md
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that allows AI assistants to access bird observation data, hotspots, and taxonomy information from eBird.187MIT
- AlicenseAqualityBmaintenanceA 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.10MIT
- AlicenseNot gradedqualityDmaintenanceAn 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.18MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that provides current weather and forecasts via Open-Meteo API, with an optional ML-based next-day max temperature prediction.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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