Skip to main content
Glama

birdnet-go-mcp


Highlights

  • Native BirdNET-Go Support: Interfaces directly with BirdNET-Go's v2 REST API over LAN or localhost. No raw database locking or unmaintained Python dependencies.

  • Instant npx Run: Launch immediately with npx -y birdnet-go-mcp β€” zero Go toolchain required.

  • Zero-Dependency Static Binary: Single Go binary (CGO_ENABLED=0) compiled for Linux, macOS, and Windows.

  • Dual-Mode (CLI + MCP): Human-friendly CLI for quick terminal health checks (birdnet-mcp status), plus full stdio & SSE MCP server for AI agents.

  • Context-Protected (8KB Envelope): Hard-capped output preventing multi-hundred detection queries from overflowing model context windows.

  • Read-Only & Parallel-Safe: Omits all mutating/destructive endpoints. Annotates all tools with readOnlyHint and idempotentHint for fast parallel agent calls.

  • Audio & Clip Access: Resolves LAN Caddy/Nginx .wav clip URLs, with built-in base64 audio streaming for multimodal models.


Related MCP server: eBird MCP Server

Quick Start

No Go installation needed. Downloads the native binary for your platform automatically:

# Check station health in your terminal
npx -y birdnet-go-mcp status

# Or set target host
BIRDNET_BASE_URL="http://192.0.2.10:8080" npx -y birdnet-go-mcp recent

2. Install via Go

go install github.com/zax0rz/birdnet-go-mcp/cmd/birdnet-mcp@latest

3. Pre-Compiled Binaries

Download the latest static binary for your architecture from GitHub Releases:

  • darwin-arm64 (Apple Silicon M1/M2/M3/M4)

  • darwin-amd64 (Intel Mac)

  • linux-amd64 (x86_64 servers, Proxmox LXC, Docker)

  • linux-arm64 (Raspberry Pi 4 / 5)

  • linux-armv7 (Raspberry Pi 2 / 3 / Zero 2 W)

  • windows-amd64


Client & Harness Setup

Claude Desktop & Cursor

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS), %APPDATA%\Claude\claude_desktop_config.json (Windows), or add under Cursor Settings βž” Features βž” MCP:

Option A: Using npx (Easiest)

{
  "mcpServers": {
    "birdnet": {
      "command": "npx",
      "args": ["-y", "birdnet-go-mcp", "serve"],
      "env": {
        "BIRDNET_BASE_URL": "http://192.0.2.10:8080",
        "CLIPS_BASE_URL": "http://192.0.2.10:8091"
      }
    }
  }
}

Option B: Using Native Binary

{
  "mcpServers": {
    "birdnet": {
      "command": "/usr/local/bin/birdnet-mcp",
      "args": ["serve"],
      "env": {
        "BIRDNET_BASE_URL": "http://192.0.2.10:8080",
        "CLIPS_BASE_URL": "http://192.0.2.10:8091"
      }
    }
  }
}

Claude Code

Add directly via CLI:

claude mcp add birdnet -- npx -y birdnet-go-mcp serve

Google Antigravity

In your Antigravity MCP configuration (~/.gemini/antigravity/mcp/ or project settings):

{
  "mcpServers": {
    "birdnet": {
      "command": "birdnet-mcp",
      "args": ["serve"],
      "env": {
        "BIRDNET_BASE_URL": "http://192.0.2.10:8080",
        "CLIPS_BASE_URL": "http://192.0.2.10:8091"
      }
    }
  }
}

OpenClaw

In ~/.openclaw/openclaw.json:

{
  "mcp": {
    "servers": {
      "birdnet": {
        "command": "/Users/zach/.openclaw/mcp-servers/birdnet-go-mcp/bin/birdnet-mcp",
        "args": [],
        "env": {
          "BIRDNET_BASE_URL": "http://192.0.2.10:8080",
          "CLIPS_BASE_URL": "http://192.0.2.10:8091"
        },
        "toolFilter": {
          "include": ["*"]
        }
      }
    }
  }
}

In your agent's tools.allow list:

"tools": {
  "allow": [
    "birdnet__get_recent_detections",
    "birdnet__search_detections",
    "birdnet__get_detection_detail",
    "birdnet__get_today_summary",
    "birdnet__get_new_arrivals",
    "birdnet__get_station_health",
    "birdnet__get_audio_clip",
    "birdnet__get_audio_clip_base64"
  ]
}

Remote / Headless Agents (SSE HTTP Mode)

If your agent runs on another machine or in the cloud without access to local stdio:

# Start background SSE server on port 8092
birdnet-mcp serve --sse --port 8092

Point your agent to: http://<your-server-ip>:8092/sse


Interactive CLI Commands

birdnet-mcp is a full CLI tool for humans as well as an MCP server for agents.

Check Station & RTSP Mic Health

$ birdnet-mcp status

πŸ” Connecting to BirdNET-Go at http://192.0.2.10:8080...

=== AUDIO STREAMS ===
NAME          TYPE   HEALTH      STATE     THROUGHPUT   LAST RECEIVED
birdz0rz-pi   rtsp   🟒 HEALTHY   running   74.8 KB/s    2026-09-04T20:38:53-04:00

=== DETECTOR HOST ===
Host:         birdz0rz (Debian Linux, x86_64)
CPU:          AMD Ryzen 5 PRO 2400G (2 cores)
Uptime:       15d 3h 6m (Host) | 6d 4h 47m (BirdNET-Go)
Kernel:       7.0.14-12-pve
Environment:  LXC

View Recent Sightings

$ birdnet-mcp recent --limit 5 --min-conf 0.80

ID     TIME                  SPECIES   COMMON NAME        CONF   NEW?   CLIP URL
#129   2026-09-04 19:59:35   easblu    Eastern Bluebird   84%    -      http://192.0.2.10:8091/2026/09/sialia_sialis_84p_20260904T195937Z.wav
#128   2026-09-04 19:58:17   easblu    Eastern Bluebird   95%    -      http://192.0.2.10:8091/2026/09/sialia_sialis_95p_20260904T195819Z.wav
#127   2026-09-04 19:05:23   blujay    Blue Jay           84%    -      http://192.0.2.10:8091/2026/09/cyanocitta_cristata_84p_20260904T190525Z.wav
#126   2026-09-04 18:46:16   carwre    Carolina Wren      96%    -      http://192.0.2.10:8091/2026/09/thryothorus_ludovicianus_96p_20260904T184618Z.wav
#124   2026-09-04 18:35:34   houfin    House Finch        90%    -      http://192.0.2.10:8091/2026/09/haemorhous_mexicanus_90p_20260904T183536Z.wav

Download Audio Recording

$ birdnet-mcp clip sialia_sialis_95p_20260904T195819Z.wav --download --out bluebird.wav
βœ… Saved 1440044 bytes to bluebird.wav

MCP Tool Reference

Tool

Parameters

Description

get_recent_detections

limit (int, 1-25)min_confidence (0.0-1.0)species_code (string)

Fetches the most recent bird acoustic detections with confidence scores, timestamps, and audio clip URLs.

search_detections

date (YYYY-MM-DD)species (name/code)min_confidence (0.0-1.0)limit (int)

Historical search through detection records stored in SQLite.

get_detection_detail

id (int, required)

Inspects a single detection: weather conditions at detection time, confidence breakdown, and audio clip info.

get_today_summary

(none)

Aggregate summary of today's observatory run: total count, species diversity, and top visitors.

get_new_arrivals

(none)

Identifies species heard for the first time ever or new this season/year (vital for tracking migration).

get_station_health

(none)

Real-time diagnostic telemetry: RTSP mic stream state, ingest bit rate, dropped packets, and host uptime.

get_audio_clip

clip_name (string)detection_date (string)

Resolves the accessible LAN URL on Caddy/Nginx (:8091) for Discord/web embedding.

get_audio_clip_base64

clip_name (string)detection_date (string)

Downloads and base64-encodes the raw .wav audio clip for multimodal models with direct audio input capabilities.⚠️ Token budget warning: A 15-second WAV clip is ~1.4–1.9MB base64 (~350,000–500,000 tokens into Gemini/Claude multimodal models). Use selectively for verification; never put this in automated high-frequency briefing crons!

MCP Resources

  • birdnet://station/health β€” Live JSON snapshot of the Pi mic stream and BirdNET-Go engine.

  • birdnet://detections/recent β€” The 10 most recent detections.

  • birdnet://species/summary β€” Aggregated species occurrence summary.

MCP Prompts

  • daily_backyard_brief β€” Morning dispatch workflow template for resident bird agents.

  • investigate_detection β€” Deep-dive template for evaluating anomalous sightings against eBird.


Configuration Reference

Environment Variable

CLI Flag

Default

Description

BIRDNET_BASE_URL

--birdnet-url

http://localhost:8080

BirdNET-Go v2 REST API base URL

CLIPS_BASE_URL

--clips-url

http://localhost:8091

Base URL for audio clips file server

BIRDNET_USERNAME

--user

(empty)

Optional HTTP Basic Auth username

BIRDNET_PASSWORD

--pass

(empty)

Optional HTTP Basic Auth password

BIRDNET_AUTH_TOKEN

--token

(empty)

Optional Bearer authorization token

REQUEST_TIMEOUT_SECONDS

(none)

5

HTTP client timeout in seconds


Field-Tested in Production: The Origin Story & Hardening

birdnet-go-mcp wasn't built in a theoretical vacuum β€” it was forged and verified against a live backyard bioacoustic observatory:

  • Mic Station: Raspberry Pi Zero 2 W mounted outdoors with a weather-sealed electret microphone streaming 48kHz mono audio via RTSP (mediamtx) at ~75 KB/s over Wi-Fi.

  • Detector Host: BirdNET-Go running inside a Debian 12 Proxmox LXC container (amd64, AMD Ryzen 5 PRO), analyzing audio chunks with the Cornell Lab of Ornithology neural network.

  • Clip Web Server: Caddy reverse proxy serving /var/lib/birdnet-go/clips/ over HTTP on port 8091.

  • Agent Mesh: OpenClaw on an Apple Silicon Mac Mini running autonomous resident agents:

    • Blenda (Infra agent, GLM-5.3): Monitors server health, manages gateway restarts, and oversees tool permissions.

    • Leopold (Resident Naturalist, Gemini 3.8 Flash): Composes daily backyard wildlife briefings, flags unusual species (Eastern Bluebirds, Carolina Wrens, Pileated Woodpeckers), and inspects audio spectrograms.

Real-World Lessons & "Incident Zero"

  1. The Caddy Directory Permission Trap (Incident Zero): BirdNET-Go creates monthly clip directories (/clips/YYYY/MM/) with 750 permissions (drwxr-x---). External web servers (Caddy, Nginx) running as their own system user will hit HTTP 403 Forbidden when serving audio clips to agents or Discord webhooks. Fix: Set permissions to 755 on existing month folders and add your web server user to the birdnet group:

    sudo chmod -R 755 /var/lib/birdnet-go/clips
    sudo usermod -aG birdnet caddy
  2. Apple Silicon AMFI & Cross-Compilation: When cross-compiling Go binaries from Linux for macOS (GOOS=darwin GOARCH=arm64) with stripped debug symbols (-ldflags="-s -w"), macOS Apple Mobile File Integrity (AMFI) will immediately terminate the process with SIGKILL (exit code 137). All Darwin ARM64 releases are properly ad-hoc codesigned (codesign -s - --force).

  3. Context Window Token Budget Guard: Feeding raw base64 WAV recordings into multimodal LLMs is magical for verifying difficult bird calls, but a single 15-second WAV consumes ~1.9MB (approx. 500,000 tokens). That can consume 50% of a 1M-token context window in one tool invocation. birdnet-go-mcp strictly caps all structured JSON tool responses at an 8KB envelope cap, while keeping get_audio_clip_base64 explicitly exempt so models can call it intentionally without risk of accidental context blowup in daily briefing routines.


Contributing & Development

# Clone
git clone https://github.com/zax0rz/birdnet-go-mcp.git
cd birdnet-go-mcp

# Run unit tests
make test

# Build for local OS
make build

# Cross-compile for Darwin ARM64 (Apple Silicon)
make build-mac

Credits & License

Available Tools

8 tools
get_audio_clipA
Read-onlyIdempotent

Resolve a detection's audio clip (.wav) into a full HTTP URL on the clips file server, for sharing or embedding in messages and web pages. The URL is only reachable from the same network as the clips server. Use get_audio_clip_base64 instead when the audio data must be returned inline to the model.

ParametersJSON Schema
NameRequiredDescriptionDefault
clip_nameYesClip file name exactly as returned in a detection record, e.g. 'sialia_sialis_96p_20260829T192351Z.wav'
detection_dateNoDetection date in YYYY-MM-DD format; used as a fallback to locate the clip's folder when the filename embeds no parseable date

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond those annotations: the generated URL is only reachable from the same network as the clips server, and this tool returns a URL rather than inline data. This is useful and does not contradict the annotations.

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 three sentences with no filler. It front-loads the core action and output, then states the network caveat, then gives the routing instruction to the sibling tool. Every sentence earns its place.

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?

For a simple URL-resolution tool with rich annotations and full schema coverage, the description is complete. It explains what is returned, flags a critical network limitation, and points to the appropriate alternative when inline data is needed. No important guidance is missing for an agent to select and use it correctly.

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%, so the input schema already documents both clip_name and detection_date in sufficient detail. The description does not add substantial semantic information about the parameters beyond what the schema provides, so the baseline score of 3 applies.

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 states a specific verb ('Resolve'), a specific resource ('a detection's audio clip (.wav)'), and the output form ('full HTTP URL'), with the purpose of sharing or embedding. It also distinguishes itself from the sibling get_audio_clip_base64, so an agent can clearly tell what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative tool get_audio_clip_base64 and gives the exact condition for choosing it: when the audio data must be returned inline to the model. It also conveys a constraint on URL reachability, which helps an agent decide whether this tool is appropriate for a given context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_audio_clip_base64A
Read-onlyIdempotent

Download a detection's audio clip (.wav) and return it base64-encoded, for multimodal models that accept audio input directly. WARNING: a 15-second clip is roughly 350,000-500,000 tokens. Call sparingly for single-clip verification only β€” never inside high-frequency or scheduled workflows. Use get_audio_clip for a lightweight shareable URL instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
clip_nameYesClip file name exactly as returned in a detection record, e.g. 'sialia_sialis_96p_20260829T192351Z.wav'
detection_dateNoDetection date in YYYY-MM-DD format; used as a fallback to locate the clip's folder when the filename embeds no parseable date

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations by disclosing the severe token cost (350k-500k per 15s clip) and warning about appropriate invocation frequency. This is crucial behavioral context for an AI agent deciding whether to call the tool, and it complements the readOnlyHint and idempotentHint without contradicting them.

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?

Every sentence serves a distinct purpose: what the tool does, why it exists, a critical warning, and a pointer to the lighter alternative. No filler, and the most important operational caution (token size) is front-loaded.

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?

For a simple two-parameter download tool with no output schema, the description covers the essential behavioral aspects: output format, cost implications, usage frequency constraints, and the alternative. Everything an agent needs to decide whether to invoke this tool and how to do so safely is present.

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% and both parameters are adequately documented in the schema itself. The tool description adds no additional parameter-level detail, which is acceptable given the schema already explains clip_name and detection_date thoroughly. 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?

States a specific verb ('Download'), a specific resource (detection's .wav audio clip), and a specific output format (base64-encoded). This makes the tool's purpose unambiguous and clearly distinguishes it from the sibling get_audio_clip by explaining what makes this version different (direct audio input for multimodal models).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance: use for single-clip verification only, never in high-frequency or scheduled workflows, and names the alternative get_audio_clip for when a lightweight shareable URL is sufficient. These are clear when-to-use and when-not-to-use instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_detection_detailA
Read-onlyIdempotent

Get comprehensive details for a single detection by its numeric ID (obtained from get_recent_detections or search_detections): weather conditions at detection time, confidence score, and audio clip URL. Use after an interesting detection ID has been identified.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric detection ID, as returned by get_recent_detections or search_detections

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive, and open-world behavior, so the bar for additional disclosure is lower. The description adds useful context about the return contents (weather, confidence, audio URL). It does not mention potential edge cases such as missing detections or whether the audio URL requires further authentication, but this is acceptable given the annotation coverage.

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 with no filler. The first sentence front-loads the core action, resource, and ID source; the second sentence gives a clear usage trigger. Every piece of information earns its place.

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?

For a single-parameter lookup tool with no output schema, the description provides the essential information: what the tool does, what it returns, where the ID comes from, and when to use it. It could be slightly more explicit about the response shape or error behavior, but the description is sufficient for an agent to invoke the tool correctly.

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% and the single 'id' parameter is well-described in the schema as a numeric detection ID returned by get_recent_detections or search_detections. The description reinforces this same information but does not add significant new semantic detail beyond the schema, so the baseline score of 3 applies.

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 states a specific verb ('Get'), a specific resource ('comprehensive details for a single detection'), and the key identifier (numeric ID). It also lists the specific content returned (weather conditions, confidence score, audio clip URL), making the tool's purpose both concrete and distinguishable from sibling tools focused on audio clips, summaries, and list searches.

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 clearly indicates when to use the tool: 'Use after an interesting detection ID has been identified.' It also specifies how to obtain the ID, from get_recent_detections or search_detections. It does not explicitly name alternatives or exclusion cases, but the contextual guidance is strong enough for an agent to select this tool appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_new_arrivalsA
Read-onlyIdempotent

List species detected for the first time ever, or newly arrived this season/year. Use this to spot migration events, rare visitors, or new residents.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, clearly establishing safe read-only behavior. The description adds no further behavioral details, but with annotations present, the bar is lower for additional context. The tool has no side effects, so the annotation coverage is sufficient.

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, direct, and free of extraneous detail. It states the function and the intended use without redundancy, achieving high clarity in minimal length.

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?

The description provides a complete definition and clear use cases, allowing an agent to decide when to call this tool. Since it is a read-only list with no parameters and the sibling tools are differentiated, no further context is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing to explain. The schema coverage is 100% (empty object), and the description does not need to add parameter meaning. This dimension is trivially satisfied.

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 lists species detected for the first time ever or newly arrived this season/year, providing a specific verb (list) and resource (species). It distinguishes itself from siblings like get_recent_detections and get_today_summary by focusing on new arrivals rather than all recent activity.

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 gives explicit use cases: 'Use this to spot migration events, rare visitors, or new residents.' This tells the agent when to invoke the tool, though it does not explicitly contrast with sibling tools. However, the purpose clarity already differentiates it from alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recent_detectionsA
Read-onlyIdempotent

Retrieve the most recent bird acoustic detections from the BirdNET-Go observatory. Returns species names, confidence scores, timestamps, and audio clip URLs. Use this as the primary tool for 'what birds were heard recently?' questions; use search_detections for historical lookups or get_today_summary for aggregates. All output is capped at 8KB to protect the agent context window.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of detections to return (default: 10, max: 25)
species_codeNoOptional 6-letter species code filter (e.g. 'easblu', 'blujay', 'rebwoo')
min_confidenceNoMinimum confidence score between 0.0 and 1.0 (default: 0.70)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is clear. The description adds useful behavioral context beyond the annotations by noting that output is capped at 8KB to protect the agent context window and by listing typical return fields.

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 concise and well-structured: purpose first, then return contents, then explicit sibling-tool routing, then the output cap note. Every sentence adds value and there is no redundancy.

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 moderate complexity (three optional parameters, no output schema), the description is largely complete: it states the resource, the return fields, the primary use case, and a system constraint (8KB cap). It does not explicitly mention error behavior or empty results, but the 'most recent' wording and output cap cover the main operational context an agent needs.

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% and every parameter has its own description with defaults and bounds (limit, species_code, min_confidence). The description does not need to add much, and it does not; it provides no extra semantic information beyond the schema.

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 a specific action ('Retrieve the most recent bird acoustic detections') and a specific resource ('BirdNET-Go observatory'), and it lists the returned data fields. It also differentiates itself from sibling tools by naming search_detections and get_today_summary for other use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Use this as the primary tool for "what birds were heard recently?" questions' and directs users to search_detections for historical lookups and get_today_summary for aggregates. This removes ambiguity about tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_station_healthA
Read-onlyIdempotent

Get real-time health telemetry for the monitoring station: audio stream state and ingest throughput, packet loss, and host uptime/CPU. Use this to diagnose a silent station or missing detections before other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds the 'real-time' nature of the data and the concrete telemetry fields, which gives the agent useful expectations beyond the annotations. No contradictions or hidden side effects are indicated.

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 with no filler: the first front-loads what the tool returns, and the second clarifies when to use it. Every sentence earns its place and the structure is easy to scan.

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?

With no output schema, the description appropriately lists the returned telemetry content and explains a concrete use case. The absence of an explicit response format or caveats is a minor gap, but zero required parameters and strong annotations keep this sufficiently complete.

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?

The tool takes zero parameters and schema description coverage is 100%, so there is no parameter-documentation burden. The description is not required to explain inputs and adds no irrelevant parameter detail; the baseline of 4 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 uses a specific verb ('Get') with a clear resource ('real-time health telemetry for the monitoring station') and enumerates the included metrics. None of the sibling tool names overlap with health-telemetry scope, so it is immediately distinguishable.

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?

It explicitly states the diagnostic scenario ('silent station or missing detections') and gives ordering guidance ('before other tools'). It does not name alternatives or state when not to use it, but the intended context is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_today_summaryA
Read-onlyIdempotent

Get an aggregate summary of today's observatory activity: per-species detection counts plus first and last heard times. Use for daily briefings or 'what happened today' questions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, so no contradiction exists. The description adds transparency about the content returned (per-species counts and time ranges), which goes beyond the annotations and helps the agent anticipate output. This additional context earns a solid score.

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 concise, using two short sentences to convey the tool's purpose and use cases without unnecessary fluff. It is well-structured, front-loading the core function and then providing context. Every word adds value, making it highly efficient.

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 the tool's simplicity (no parameters) and the richness of the schema annotations, the description fully covers what the agent needs to know. It specifies the output content (per-species counts, first/last heard times) and the intended scenarios ('daily briefings', 'what happened today'), making it complete. The absence of an output schema is not an issue here as the description fills that gap.

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?

The tool has zero parameters, so the baseline score of 4 applies. The description correctly omits parameter details since none exist, and the schema provides full coverage at 100%. No additional semantic explanation is needed, but the score reflects the baseline for parameterless tools.

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 with a specific verb ('Get'), resource ('aggregate summary of today's observatory activity'), and scope (per-species detection counts, first/last heard times). It distinguishes itself from sibling tools by its unique focus on daily summary aggregates, and the mention of use cases further clarifies its intent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides usage guidance by stating 'Use for daily briefings or 'what happened today' questions,' making it clear when to deploy this tool. It also implies when not to use it (e.g., for detailed per-detection queries, which are covered by other siblings), though it doesn't name alternatives directly, but the explicit use cases are sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_detectionsA
Read-onlyIdempotent

Search historical detection records by date, species name/code, and minimum confidence. Use this to answer questions about a specific day, date range, or species across history. For the latest activity use get_recent_detections instead. Dates must be YYYY-MM-DD.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoFilter by date in YYYY-MM-DD format (e.g. '2026-08-29')
limitNoMax results to return (default: 10, max: 25)
speciesNoSpecies common name or 6-letter code (e.g. 'Eastern Bluebird' or 'easblu')
min_confidenceNoMinimum confidence score between 0.0 and 1.0 (default: 0.70)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context by clarifying that this searches historical records rather than live activity and by requiring YYYY-MM-DD dates. It does not describe result ordering or pagination, but the schema's limit parameter and the safety annotations keep this a minor omission.

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?

Three short sentences with no fluff: the action and resource come first, usage context and the sibling alternative follow, and the format constraint is stated plainly. Every sentence earns its place.

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?

For a read-only, idempotent search tool with 0 required parameters and no output schema, this description covers purpose, when to use it, the key alternative, and the required date format. It stops short of describing the return value structure or ordering, but that is a modest gap given the rich annotations and fully documented params. The phrase 'date range' is slightly underspecified since the schema only exposes a single date parameter.

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%, so the baseline is 3; the schema already documents each parameter's format and defaults. The description reinforces the same filters ('date, species name/code, and minimum confidence') but adds little semantic value beyond the schema, aside from emphasizing the date format.

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 opens with 'Search historical detection records by date, species name/code, and minimum confidence,' naming a specific verb, resource, and the exact filter dimensions. It also explicitly contrasts with get_recent_detections, so the agent can distinguish this history search from the latest-activity sibling without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact conditions for use ('specific day, date range, or species across history') and names the alternative for the excluded case ('For the latest activity use get_recent_detections instead'). This is an explicit when/alternative routing with nothing left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv1.0.0
    • First observedget_audio_clip
    • First observedget_audio_clip_base64
    • First observedget_detection_detail
    • First observedget_new_arrivals
    • First observedget_recent_detections
    • First observedget_station_health
    • First observedget_today_summary
    • First observedsearch_detections

TDQS

A4.4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool serves a distinct purpose: audio retrieval (URL vs base64), detection details, recent/search/summary views, health status, and new arrivals. No overlapping functionality or ambiguous boundaries.

Naming Consistency5/5

All tools follow a consistent get_ prefix for retrieval operations, with search_ appropriately used for the query tool. The base64 suffix clearly differentiates the inline-data variant from the URL variant.

Tool Count5/5

With 8 tools, the set is well-scoped for a bird-observation monitoring serviceβ€”covering the essential read and search operations without redundancy or bloat.

Completeness5/5

The surface covers all likely read-oriented needs for this domain: recent detections, historical search, summaries, per-detection details, audio retrieval (both URL and base64), health status, and new arrivals. No significant gaps are evident.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Integrates the eBird API with Claude to query bird observation data, including recent sightings, rare bird reports, contributor statistics, hotspot locations, and taxonomy information through natural language.
    5
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An AI-powered birding companion that connects Claude to eBird and Xeno-canto APIs, enabling personalized birding with life list tracking, route-based hotspot discovery, and recording enrichment.
    28
    2
    MIT
  • F
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to interact with Frigate NVR security camera systems, supporting camera management, event detection, snapshots, recordings, and system stats via natural language.
    7
    10
    -