iDigBio biodiversity specimen MCP. Keyless search across ~150M digitized natural-history museum specimen records (plants, animals, fossils) from US collections, via the iDigBio search API (search.idigbio.org/v2). Records are normalized Darwin Core indexTerms.
Three tools with complete input schemas and descriptions. Naming follows verb_noun pattern (search_, get_, count_). Descriptions are adequate (100-200 chars) but lack actionable guidance on when to use each tool vs. alternatives. Parameters have types and descriptions, but lack enums for constrained fields (e.g., 'field' in count_by_field should enumerate valid values). Output schemas are not documented, LLMs cannot predict response structure. Error handling returns basic messages but lacks recovery guidance. No tool annotations (readOnlyHint, etc.). Schemas are present and valid JSON Schema, meeting baseline requirements.
Get taxonomic/geographic specimen counts grouped by a field (top values + counts) across iDigBio. Optionally scope the counts with taxonomy/locality filters. Keyless.
Get the full normalized record for a single iDigBio specimen by its uuid. e.g. uuid "0746b188-c390-4ab1-bd20-5489a9c6c33c" (a Puma concolor record). Keyless.
Search ~150M digitized natural-history museum specimen records (plants, animals, fossils) from US collections via iDigBio. Filter by any combination of taxonomy and locality. At least one filter is required. Keyless.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields are in 'specimens' array, what 'total' and 'count' mean). Agents cannot plan downstream operations without knowing what data they'll receive.
'field' parameter in count_by_field accepts free-form strings instead of an enum. Description lists valid values as prose ('country, stateprovince, family, genus, institutioncode, basisofrecord') but LLMs frequently hallucinate invalid values. Should declare as enum with 6 options.
Error messages lack recovery guidance. Example: 'provide at least one filter' tells the LLM what went wrong but not which filters are valid or how to proceed. Should return: 'At least one filter required. Valid filters: scientific_name, genus, family, country, state_province, recorded_by.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All three tools are read-only and idempotent, but LLMs cannot infer this. Should add readOnlyHint: true to all tools to signal safety.
Descriptions include example UUIDs and field values ('0746b188-c390-4ab1-bd20-5489a9c6c33c', 'puma concolor', 'macginitie'). LLMs tend to reuse example values literally in real calls, causing failures. Replace with formal constraints (regex patterns, enums) instead.