Search fossil occurrences, resolve taxon fossil ranges, plot diversity through deep time, and look up the geologic time scale via MCP. STDIO or Streamable HTTP.
Strong tool definitions with comprehensive descriptions (avg 250+ chars), well-structured schemas, and clear parameter documentation. All 7 tools have explicit input schemas with typed parameters and descriptions. Tool names follow verb_noun convention (search_, get_, list_, paleobiology_*). Descriptions are LLM-optimized and include context on when to call each tool and what it returns. Minor gaps: no explicit output schema documentation in source, limited error recovery guidance, and no per-tool idempotency hints despite some tools being read-only.
List the tables and their columns staged on a DataCanvas by paleobiology_search_occurrences. Call this before paleobiology_dataframe_query to discover the exact table_name and column names to reference in SQL.
Drop a single staged table from a DataCanvas to free memory before its TTL expires. Reference the table by the table_name paleobiology_search_occurrences returned or paleobiology_dataframe_describe listed. Dropping a table that does not exist is reported as dropped=false, not an error.
Run a read-only SQL SELECT against occurrence result sets staged on a DataCanvas by paleobiology_search_occurrences. This is how you analyze a large fossil set without re-fetching it: count occurrences by early_interval, group by formation, country (cc), or accepted_name, or filter by a paleo/modern coordinate range. The classification column is JSON — roll up by rank with json_extract_string(classification, '$.family') (also $.phylum, $.class, $.order, $.genus). Staged rows are occurrences, so collection-only fields such as lithology are not present. Reference tables by the table_name that search_occurrences returned — call paleobiology_dataframe_describe first if you do not know the table or column names. SELECT only; writes and file-reading functions are rejected.
Compute a diversity / origination / extinction curve for a clade across geologic time, binned by period, epoch, or age — answers "plot dinosaur genus diversity across the Mesozoic." Pass a clade-inclusive base_name (or base_id, the same clade by resolved taxon id — exactly one of the two) and bound the span by a named interval (e.g. "Mesozoic") or a max_ma/min_ma range; choose what to count (genera, species, or families) and the bin resolution. The full bin set returns inline — a diversity series is a bounded set of geologic intervals — so you read the curve, the turnover, and the per-bin origination/extinction directly. Counts reflect SAMPLED diversity, biased by collection effort and rock availability, not true past diversity.
Output schemas not documented in source code. Tool descriptions explain what is returned (e.g., 'returns inline diversity series'), but formal output schema definitions are not visible in the provided source.
No explicit error recovery guidance in tool descriptions. While descriptions are comprehensive, they lack actionable error messages or recovery hints (e.g., 'If canvas_id is invalid, call paleobiology_search_occurrences again').
Tool annotations present (READ_ONLY, DESTRUCTIVE) but not integrated into schema. Annotations are declared in source but not visible as JSON Schema properties (readOnlyHint, destructiveHint, idempotentHint).
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Resolve a taxon by name (e.g. "Tyrannosaurus") or by integer taxon_no to its accepted name, rank, higher classification, immediate parent, fossil occurrence count, and first/last appearance (FAD/LAD) range in millions of years — "when did this clade exist, and what is it." Run this first to resolve a name into the accepted name and taxon_no, then pass that id as base_id to paleobiology_search_occurrences, paleobiology_get_diversity, or paleobiology_search_collections for a clade-inclusive filter that carries no name ambiguity (the same id also appears as accepted_no on occurrence rows). Set show_children to also list immediate child taxa. PBDB taxonomy is opinionated and can differ from GBIF's backbone, so the accepted name may differ from the name you searched.
Look up the geologic time scale — eons, eras, periods, epochs, and ages with their absolute-age boundaries in millions of years (Ma) and nesting. This is the reference that grounds every temporal filter on the other tools and translates a named interval like "Late Cretaceous" to its 100.5–66.0 Ma boundaries (and back). Filter by a name substring, a Ma range (overlap match), and/or a level; call with no filters to browse the full scale. Browsing and every name on the bundled ICS international-scale snapshot are answered offline. A name the snapshot does not carry — the sub-stage and regional names that occurrence and collection rows report, such as "Late Maastrichtian" or "Lancian" — costs one PBDB lookup across its other time scales; the response names which source answered and which scale the interval belongs to.
Find fossil collections (localities) by area and geologic time — "what has been dug up here, and from what rock." Each locality returns its location, age (named interval and Ma), formation and strata, lithology, depositional environment, and the count of co-occurring fossils. Filter by a clade-inclusive base_name (or base_id, the same clade by resolved taxon id), a named interval or max_ma/min_ma range, a lng/lat bounding box, a formation or lithology name, and/or an environment. Results page inline via limit/offset (the response discloses when more remain). Take a collection_no from a row and pass it — or the same bbox+interval — to paleobiology_search_occurrences to see the actual fauna found together.
Mutually exclusive parameters not explicitly documented. paleobiology_get_diversity requires exactly one of (base_name, base_id) and exactly one of (interval, max_ma/min_ma), but descriptions do not state 'supply exactly one' or 'mutually exclusive'.
No pagination guidance for large result sets. paleobiology_search_collections accepts limit/offset but does not document max result size, recommended defaults, or when pagination is required.