Skip to main content
Glama
minikdj
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.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationNoRegion code, lat/lng, or city name. Defaults to Cincinnati.
date_rangeNoDate range: "this week", "this weekend", "next 5 days", "May 15-22". Defaults to this week.
target_speciesNoOptional common name of a target species to optimize for.

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude (default 39.1 for Cincinnati).
lngNoLongitude (default -84.5 for Cincinnati).
dateNoDate for forecast. Defaults to today.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latNoLatitude (default 39.1).
lngNoLongitude (default -84.5).
dateNoDate. Defaults to today.
temp_fNoOptional forecasted temperature (°F) — adjusts activity cutoff estimate.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hotspotsYesArray of hotspot location IDs (e.g. ["L12345", "L67890"]) or names.
locationNoLocation context for name-based search (optional).

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hotspotYesHotspot location ID (e.g. "L12345") or name to search for.
locationNoLocation context for name-based search (optional).

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
region_codeNoBirdCast region code (e.g. "US-OH-061"). Defaults to Hamilton County, OH.
dateNoDate for forecast. Defaults to today.

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationNoRegion code (e.g. "US-OH-061"), lat/lng (e.g. "39.1,-84.5"), or city name (e.g. "Cincinnati"). Defaults to Cincinnati.
dateNoDate for the trip: "today", "tomorrow", "this weekend", "next Saturday", "May 20", or "2026-05-20". Defaults to today.
radius_kmNoSearch radius in km (default 30).

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
speciesYesCommon name of the species (e.g. "Cerulean Warbler").
locationNoRegion code, lat/lng, or city name. Defaults to Cincinnati.
radius_kmNoSearch radius in km (default 50).

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
speciesYesCommon name of the species (e.g. "Tennessee Warbler").
region_codeNoeBird region code (default "US-OH-061").
dateNoDate for the lookup. Defaults to today.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
speciesYesCommon or scientific name of the species.
latNoLatitude (default 39.1).
lngNoLongitude (default -84.5).
radius_kmNoSearch radius in km (default 30).
days_backNoDays to look back (default 14).

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

A4/5.0
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

ActivityStale
ResponsivenessSyncing

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

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.
    18
    7
    MIT
  • A
    license
    A
    quality
    B
    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
    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.
    18
    MIT

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