paleobiology-mcp-server
Server Details
Search fossil occurrences, taxon ranges, diversity through deep time, and the geologic time scale.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/paleobiology-mcp-server
- GitHub Stars
- 2
- Server Listing
- @cyanheads/paleobiology-mcp-server
TDQS
Scored across 7 tools
Each tool targets a clearly distinct resource or workflow: taxa, intervals, occurrences, collections, diversity curves, and staged dataframe inspection. Even the two analysis-oriented tools (get_diversity and dataframe_query) are separated by whether the user needs a precomputed curve or arbitrary SQL over staged results.
All tools share the paleobiology_ prefix and use clear snake_case names, so the set is predictable overall. The minor deviation is that dataframe_describe and dataframe_query place the object before the verb, while the other five tools use verb_object ordering (get_diversity, get_taxon, list_intervals, search_collections, search_occurrences).
Seven tools is a well-scoped size for a Paleobiology Database client: two search tools, two lookup tools, two dataframe-analysis tools, and a diversity-curve tool. Each tool earns its place without redundancy or bloat.
The surface covers the full read-only workflow: resolve taxa, look up time intervals, search occurrences and collections, compute diversity curves, and run SQL analysis over large staged occurrence sets. No obvious gaps exist for the stated domain; pagination and staging hand-offs create no dead ends.
Available Tools
7 toolspaleobiology_dataframe_describepaleobiology-mcp-server: describe staged canvas tablesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | Yes | Canvas id returned by paleobiology_search_occurrences when its result spilled. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| tables | No | Tables staged on the canvas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds useful context about what is listed, where the data comes from, and how the result should be used, which goes beyond the annotations 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with clear front-loading: the action and resource are stated first, followed by the actionable usage guidance. No filler or redundant restatement of the tool name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity introspection tool with an output schema and strong annotations, the description is complete. It tells the agent what the tool does, where the canvas_id comes from, and how to use the result, leaving no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes canvas_id, including its origin from paleobiology_search_occurrences when its result spilled. The description does not add new parameter-level semantics beyond restating the intended use context, so baseline 3 applies given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and identifies the exact resource ('tables and their columns staged on a DataCanvas'). It also names the preceding tool, paleobiology_search_occurrences, making it clear what the tool does and how it fits into the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('Call this before paleobiology_dataframe_query') and why: to discover table_name and column names for SQL. This gives an agent clear sequencing guidance versus its closest sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
paleobiology_dataframe_querypaleobiology-mcp-server: query staged occurrences with SQLARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | A read-only SQL SELECT. Reference tables by the names paleobiology_search_occurrences / _describe returned. | |
| canvas_id | Yes | Canvas id returned by paleobiology_search_occurrences when its result spilled. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Result rows (capped at the canvas row limit). Keys are the selected column names. |
| error | No | Present when the call failed. Absent on success. |
| row_count | No | Number of rows in the full result before any row cap. |
| truncated | No | True when the result exceeded the canvas row cap and rows were trimmed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description adds substantial behavioral context beyond that: staged rows are occurrences so collection-only fields like lithology are absent, classification is JSON and requires json_extract_string for rank rollups, and writes/file-reading functions are rejected. It also clarifies the relationship between search_occurrences and this staging step. This is rich disclosure beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized for a complex query tool and is front-loaded with the core purpose. Every sentence provides distinct value: use case, column hints, schema notes, prerequisites, and constraints. No filler or repetition of obvious information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two parameters and an output schema, this description covers all decision-relevant context: what the staged data is, how to reference it, what can be analyzed, what fields are missing, how to handle JSON classification, and when to call describe first. An agent has everything needed to invoke this tool safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already described in the input schema, including the read-only SQL constraint and the source of the canvas_id. The description restates those details but adds little new parameter-specific semantics beyond reinforcing that table names come from search_occurrences. Baseline 3 is appropriate because schema already covers the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run a read-only SQL SELECT against occurrence result sets staged on a DataCanvas by paleobiology_search_occurrences.' It clearly distinguishes itself from sibling search/describe tools by positioning itself as the analysis step after staging data. The purpose is unambiguous and agents can immediately tell it apart from the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'This is how you analyze a large fossil set without re-fetching it.' It also names the prerequisite alternative: 'call paleobiology_dataframe_describe first if you do not know the table or column names.' It sets clear boundaries with 'SELECT only; writes and file-reading functions are rejected,' which excludes misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
paleobiology_get_diversitypaleobiology-mcp-server: diversity through timeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | What to count per bin: "genera" (default), "species", or "families". | genera |
| max_ma | No | Older bound of the span in millions of years ago. Alternative to interval. When paired with min_ma it must be strictly greater — max_ma is the deeper-time end of the span. | |
| min_ma | No | Younger bound of the span in millions of years ago. Alternative to interval. When paired with max_ma it must be strictly smaller — min_ma is the nearer-to-present end of the span. | |
| base_id | No | Clade-inclusive taxon to count, by PBDB taxon id — the taxon_no from paleobiology_get_taxon, or accepted_no on an occurrence row. Same semantics as base_name, but unambiguous where a name is not (homonyms, synonyms, unresolved spellings). Supply this or base_name (exactly one is required, never both). | |
| interval | No | Named geologic interval bounding the span, e.g. "Mesozoic". Alternative to max_ma/min_ma. | |
| base_name | No | Clade-inclusive taxon to count, e.g. "Dinosauria" or "Ammonoidea" — this taxon and all descendants. Supply this or base_id (exactly one is required, never both). | |
| resolution | No | Bin resolution: "period" (default, coarse), "epoch", or "age" (finest). | period |
Output Schema
| Name | Required | Description |
|---|---|---|
| bins | No | Per-interval diversity bins over the span, ordered oldest-first (oldest geologic interval, highest max_ma, first). |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when the clade or span produced no bins, or when the taxon name could not be resolved and was ignored. |
| totalCount | No | Number of geologic-interval bins returned. |
| attribution | No | CC-BY data attribution for the Paleobiology Database. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already declaring readOnlyHint, idempotentHint, and openWorldHint, the description adds substantial non-obvious behavioral context: 'Counts reflect SAMPLED diversity, biased by collection effort and rock availability, not true past diversity' — an interpretive caveat that prevents an agent from drawing false conclusions about the numbers. It also discloses return semantics ('The full bin set returns inline ... so you read the curve, the turnover, and the per-bin origination/extinction directly'), which is valuable beyond any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph of about four sentences, and every sentence earns its place: function, required inputs, return semantics, and the sampling caveat. The core statement and example use case are front-loaded. It is appropriately sized for a 7-parameter tool, though slight paragraph breaks would improve scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 7 parameters, an output schema, and no required fields in the schema, the description covers every decision an agent must make: clade selection (with the exactly-one rule), time bounding (two alternative strategies), count target, bin resolution, return semantics, and the interpretive caveat. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the individual parameter descriptions in the schema are exceptionally thorough — max_ma/min_ma even explain which is the deeper-time versus nearer-to-present bound. The tool description reinforces the exact-one-of-base_name/base_id constraint and the interval-vs-range alternative, but these are already present in the schema. Baseline 3 is appropriate: the schema carries the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Compute a diversity / origination / extinction curve for a clade across geologic time, binned by period, epoch, or age.' It anchors the function with a concrete user query ('answers "plot dinosaur genus diversity across the Mesozoic"') and the scope is clearly distinct from every sibling — none of the dataframe, taxon, interval, collection, or occurrence tools compute curves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit input-routing guidance: 'Pass a clade-inclusive base_name (or base_id ... exactly one of the two)' and 'bound the span by a named interval ... or a max_ma/min_ma range.' It clearly separates the two alternative bounding strategies. It does not explicitly name a sibling to prefer in other cases, but the sibling set is functionally so different that an agent's routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
paleobiology_get_taxonpaleobiology-mcp-server: get taxon record and fossil rangeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Taxon name to resolve, e.g. "Tyrannosaurus" or "Ammonoidea". Provide this or taxon_no. | |
| taxon_no | No | PBDB taxon id from a prior get_taxon, or accepted_no on an occurrence row. Provide this or name. | |
| show_children | No | When true, include a page of the immediate child taxa of this taxon (at most 200 per call — children_truncated says whether more remain). | |
| children_offset | No | Number of immediate children to skip before the returned page — used only when show_children is true. Advance it by 200 while children_truncated is true to walk the whole child list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rank | No | Taxonomic rank, e.g. "genus", "family", "order". |
| error | No | Present when the call failed. Absent on success. |
| extant | No | True if the clade survives to the present day; false if entirely extinct. |
| notice | No | Guidance when the child list was cut off at the per-page cap (naming the children_offset that reaches the next page), or when children_offset ran past the end of the child list. |
| children | No | One page of immediate child taxa, at most 200 — present only when show_children was true. A taxon with more children than that returns a page, not the full list; read children_truncated before treating it as complete. |
| taxon_no | No | Accepted PBDB taxon id — the canonical id for this taxon. Pass it as base_id to paleobiology_search_occurrences, paleobiology_get_diversity, or paleobiology_search_collections to filter on this clade without re-sending a name. |
| parent_no | No | PBDB taxon id of the immediate parent, when known. |
| attribution | No | CC-BY data attribution for the Paleobiology Database. |
| parent_name | No | Name of the immediate parent taxon, when known. |
| accepted_name | No | PBDB accepted name (may differ from the searched name). |
| classification | No | Higher classification of the taxon. Each level is present only when PBDB resolves it. |
| children_offset | No | Position in the child list this page started at (0 is the first child). Present only when show_children was true. |
| last_appearance | No | A first- or last-appearance window. Empty when PBDB has no dated occurrences. |
| first_appearance | No | A first- or last-appearance window. Empty when PBDB has no dated occurrences. |
| occurrence_count | No | Number of fossil occurrences recorded in PBDB, when reported. |
| children_truncated | No | True when more immediate children remain past this page — re-call with children_offset advanced by 200 to read the next. False means this page runs to the end of the child list. Present only when show_children was true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly and idempotent. The description adds useful behavioral context: PBDB taxonomy is opinionated, the accepted name may differ from GBIF, and the resolved id appears as accepted_no on occurrence rows. It doesn't describe unresolved-name failure behavior, but the output schema and annotations cover most safety and side-effect concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably dense but every sentence earns its place: what it returns, when to run it, how to chain it, when to use show_children, and a relevant caveat. It is front-loaded with the main purpose and avoids boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent tool with a complete input schema and output schema, this description covers all the essential context: purpose, workflow, sibling routing, optional children retrieval, and taxonomy differences. An agent has enough to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description cover age is 100%, so the description doesn't need to re-explain parameters. It does add workflow context about choosing name vs taxon_no and using show_children, but this is more about orchestration than parameter syntax or semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's job: resolve a taxon by name or taxon_no and return accepted name, rank, higher classification, parent, occurrence count, and FAD/LAD range. It also names the sibling tools it belongs with, distinguishing this lookup-and-resolve step from the later search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs the agent to run this tool first to resolve a name into accepted name and taxon_no, then pass that id as base_id to three named siblings. It also tells when to use show_children, and warns that accepted names may differ from the searched name due to PBDB taxonomy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
paleobiology_list_intervalspaleobiology-mcp-server: list geologic intervalsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive substring of the interval name, e.g. "cretaceous" or "Jurassic". A name the bundled international scale does not carry is matched exactly against PBDB's other time scales. | |
| level | No | Restrict to one rank of the international scale: eon, era, period, epoch, or age (finest). Browsing is bounded to that scale, so the sub-stage and regional ranks are not selectable here. | |
| max_ma | No | Older bound of an age window (Ma); intervals overlapping [min_ma, max_ma] match. | |
| min_ma | No | Younger bound of an age window (Ma); intervals overlapping [min_ma, max_ma] match. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no interval matched the filters. |
| source | No | Which source answered: "bundled_ics" for the offline international-scale snapshot, "pbdb_upstream" for a name resolved live against PBDB's other time scales. |
| intervals | No | Matching geologic intervals, sorted oldest-first. |
| totalCount | No | Number of intervals matched by the filters. |
| snapshot_version | No | ICS chart version and generation date of the bundled time scale, for citation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint; the description adds substantial non-obvious behavior beyond these: offline answers on the bundled ICS snapshot, a one-PBDB-lookup cost for unsupported names, and the response naming which source/scale answered. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose and role, followed by filtering options and then offline/online behavior. It is dense but every sentence carries distinct information with no filler or repetition of schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a lookup tool with zero required parameters, an output schema, full schema coverage, and safety annotations, the description covers filter combinations, offline vs online behavior, response provenance, and the tool's role relative to siblings. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies, but the description enriches every parameter: case-insensitive substring matching vs exact PBDB matching for non-bundled names, overlap semantics of the Ma range, and the level restriction to eon/era/period/epoch/age. The no-filter browse behavior is also made explicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: look up the geologic time scale with eons, eras, periods, epochs, and ages and their Ma boundaries. It also distinguishes itself from the sibling data-query tools by declaring that it grounds every temporal filter on the other tools, so an agent can route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use the tool — as the reference grounding temporal filters on the other tools — and how to call it: filter by name substring, Ma range, level, or no filters to browse the full scale. It also clarifies the offline vs one-PBDB-lookup behavior for names not in the bundled snapshot, which is exactly the decision-relevant usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
paleobiology_search_collectionspaleobiology-mcp-server: search fossil collectionsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum localities to return per page (1–500). | |
| latmax | No | Northern edge of the bounding box, decimal degrees (−90…90). Valid on its own — a lone latitude edge filters as a half-plane. | |
| latmin | No | Southern edge of the bounding box, decimal degrees (−90…90). Valid on its own — a lone latitude edge filters as a half-plane. | |
| lngmax | No | Eastern edge of the bounding box, decimal degrees (−180…180). Longitude is a closed pair — supply lngmin with it or neither. | |
| lngmin | No | Western edge of the bounding box, decimal degrees (−180…180). Longitude is a closed pair — supply lngmax with it or neither. | |
| max_ma | No | Older age bound in millions of years ago. When paired with min_ma it must be strictly greater — max_ma is the deeper-time end of the window. | |
| min_ma | No | Younger age bound in millions of years ago. When paired with max_ma it must be strictly smaller — min_ma is the nearer-to-present end of the window. | |
| offset | No | Number of localities to skip — page with limit by advancing offset. | |
| base_id | No | Clade-inclusive taxon filter by PBDB taxon id — the taxon_no from paleobiology_get_taxon, or accepted_no on an occurrence row. Same semantics as base_name, but unambiguous where a name is not (homonyms, synonyms, unresolved spellings). Supply this or base_name, never both. | |
| interval | No | Named geologic interval bounding the age, e.g. "Maastrichtian". Alternative to max_ma/min_ma. | |
| base_name | No | Clade-inclusive taxon filter — localities yielding this taxon or its descendants, e.g. "Dinosauria". Supply this or base_id, never both. | |
| formation | No | Geologic formation name to filter by, e.g. "Hell Creek". | |
| lithology | No | Lithology (rock type) to filter by, e.g. "sandstone". | |
| environment | No | Depositional environment: "marine", "terrestrial", or "freshwater" (lacustrine + fluvial). Omit for all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The per-page limit that was applied (set when truncated). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of localities returned in this page (set when truncated). |
| notice | No | Guidance when no locality matched, when localities remain past this page, or when a filter value was not recognized and ignored. |
| truncated | No | True when localities remain past this page — advance offset for more. |
| totalCount | No | Total localities matching the filters upstream, across all pages. |
| attribution | No | CC-BY data attribution for the Paleobiology Database. |
| collections | No | Matching localities for this page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only/idempotent/open-world safety, and the description adds behavior beyond that: inline limit/offset pagination with a disclosed 'more remaining' signal, clade-inclusive taxon semantics, and edge-case filter rules (lone latitude edge, closed longitude pair, strict max_ma/min_ma ordering). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, with the core purpose first, then return fields, filters, pagination, and sibling routing in logical order. Every clause serves a distinct role and there is no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, 0-required search tool, this is complete: it covers what results contain, all meaningful filter families, pagination behavior, and how to continue into paleobiology_search_occurrences. The output schema exists, so not detailing return structure here is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, but the description adds relational meaning: base_name and base_id are mutually exclusive alternate spellings of the same clade filter, interval is an alternative to max_ma/min_ma, and collection_no from a row can be fed into the occurrence tool. This goes well beyond the per-parameter schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Find') and resource ('fossil collections (localities)'), and immediately distinguishes the tool from siblings by scoping it to area and geologic time. It also states exactly what each returned locality contains, so an agent can tell this from search_occurrences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly enumerates the filter dimensions and gives concrete examples ('Dinosauria', 'Maastrichtian', 'Hell Creek'). It names the sibling paleobiology_search_occurrences and tells the agent when to move from collections to occurrences, which is clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
paleobiology_search_occurrencespaleobiology-mcp-server: search fossil occurrencesARead-onlyIdempotentInspect
Search fossil occurrences filtered by taxon, geologic time, geography, and depositional environment — the flagship. Use base_name for a clade and all its descendants (what "Tyrannosaurus occurrences" usually means), base_id for that same clade by resolved taxon id, or taxon_name for an exact taxon. Bound the age by a named interval (e.g. "Maastrichtian") or a max_ma/min_ma range, and/or a lng/lat bounding box; scope to a single locality with collection_no (take it from a paleobiology_search_collections row). At least one filter is required — taxon, time, place, environment, or collection_no. Every row carries two distinct coordinate systems — modern lng/lat (where the rock is today) and paleo lng/lat (where the landmass sat at deposition) — plus the formation, age interval, and higher classification (phylum through genus); never plot a deep-time occurrence on a modern coastline. Resolve a name with paleobiology_get_taxon first if unsure. Broad queries return many rows: an inline preview answers the immediate question, and when the set outgrows that preview the matching occurrences — up to the per-call cap — stage on a DataCanvas (canvas_id + table_name, returned only then) for SQL via paleobiology_dataframe_query (count by interval, group by formation/country, map by region). The response reports how many occurrences matched in total, which rows this page covers, and the offset that reaches the next page — page through the whole match set with limit/offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum occurrences to pull per page (1–500). Caps the pull (further bounded by PBDB_MAX_OCCURRENCES); broad queries stage that page on the canvas for SQL. Pair with offset to walk the whole match set. | |
| latmax | No | Northern edge of the bounding box, decimal degrees (−90…90). Valid on its own — a lone latitude edge filters as a half-plane. | |
| latmin | No | Southern edge of the bounding box, decimal degrees (−90…90). Valid on its own — a lone latitude edge filters as a half-plane. | |
| lngmax | No | Eastern edge of the bounding box, decimal degrees (−180…180). Longitude is a closed pair — supply lngmin with it or neither. | |
| lngmin | No | Western edge of the bounding box, decimal degrees (−180…180). Longitude is a closed pair — supply lngmax with it or neither. | |
| max_ma | No | Older age bound in millions of years ago. Alternative to interval. When paired with min_ma it must be strictly greater — max_ma is the deeper-time end of the window. | |
| min_ma | No | Younger age bound in millions of years ago. Alternative to interval. When paired with max_ma it must be strictly smaller — min_ma is the nearer-to-present end of the window. | |
| offset | No | Number of matching occurrences to skip before this page — page with limit by advancing offset. The response notice names the exact offset that reaches the next page. | |
| base_id | No | Clade-inclusive taxon filter by PBDB taxon id — the taxon_no from paleobiology_get_taxon, or accepted_no on an occurrence row. Same clade-inclusive semantics as base_name, but unambiguous where a name is not (homonyms, synonyms, unresolved spellings). Supply this or base_name, never both. | |
| interval | No | Named geologic interval bounding the age, e.g. "Cretaceous" or "Maastrichtian". Alternative to max_ma/min_ma. | |
| base_name | No | Clade-inclusive taxon filter — this taxon and all descendants, e.g. "Dinosauria". The usual choice. Supply this or base_id, never both. | |
| canvas_id | No | Canvas id from a prior call to re-stage onto the same workspace. Reusing it REPLACES (overwrites) the prior occurrence table — each search restages the full result, it does not append to or accumulate across earlier ones. Omit to start fresh; the response returns a new id. | |
| taxon_name | No | Exact taxon filter — only this taxon, not descendants. Use instead of base_name when you want a single taxon. | |
| environment | No | Depositional environment: "marine", "terrestrial", or "freshwater" (lacustrine + fluvial). Omit for all. | |
| collection_no | No | Restrict to one collection (locality) by its PBDB collection_no — the fauna found together at that site. Take the id from a paleobiology_search_collections row to drill from a locality into its occurrences. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no occurrence matched, when results spilled to the canvas, when occurrences remain past this page (naming the offset that reaches the next one), when offset ran past the end of the match set, when a filter value was not recognized and ignored, or when DataCanvas is off. |
| spilled | No | True when the result exceeded the inline preview and the staged occurrence set was written to the canvas. |
| canvas_id | No | Canvas id holding the staged occurrence set — pass to paleobiology_dataframe_query. Present only when spilled is true; a result that fit inline stages nothing, so there is no table to query. |
| row_count | No | Rows staged on the canvas when spilled; otherwise the preview length. Capped at the per-call limit (PBDB_MAX_OCCURRENCES) — compare against the totalCount enrichment for how many matched upstream. |
| table_name | No | Canvas table holding the staged occurrence set. Present only when spilled is true. |
| totalCount | No | Total occurrences matching the filters upstream — the number this call was drawn from, which may exceed the staged set. |
| attribution | No | CC-BY data attribution for the Paleobiology Database. |
| occurrences | No | Inline preview of matching occurrences for the requested page. The staged occurrence set is on the canvas when spilled is true — it is one page of the match set rather than every match (the notice states which rows this page covers, how many matched upstream, and the offset that reaches the next page). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent hints, the description discloses important behavioral traits: the two distinct coordinate systems and the warning never to plot deep-time occurrences on a modern coastline, the staging of large result sets onto a DataCanvas, the per-call cap, and the fact that reusing a canvas_id replaces the prior table. It also explains pagination behavior with total counts, covered rows, and next-page offsets, adding real context the annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though long, the description is dense and every clause earns its place; there is no filler or restatement of the schema. It is front-loaded with the core purpose, then flows naturally from filter choices to output behavior to related tools, making the complexity navigable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter flagship search tool with many siblings, the description is unusually complete: it covers required filters, taxon resolution, age/geography/collection constraints, coordinate-system pitfalls, large-result staging, downstream SQL access, and pagination. The output schema can carry the return-value details, so the description need not restate them; nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all 15 parameters at 100% coverage, but the description adds cross-parameter semantics that the schema cannot convey: the clade-inclusive meaning of base_name vs exact taxon_name, the mutual exclusivity of base_name and base_id, the relationship between max_ma/min_ma and named intervals, and the rule that longitude must be supplied as a closed pair. It also explains that location and time filters can work together and that a lone latitude edge is valid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'Search fossil occurrences' — and enumerates the filter dimensions (taxon, time, geography, environment), so an agent immediately knows what the tool does. It also distinguishes itself from sibling tools like paleobiology_search_collections and paleobiology_get_taxon by positioning this as the occurrence-level search and referencing the others only for supporting steps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: resolve names with paleobiology_get_taxon first, take collection_no from paleobiology_search_collections rows, and route SQL-style analysis to paleobiology_dataframe_query. It also clarifies choice points among alternatives such as base_name vs base_id vs taxon_name and interval vs max_ma/min_ma, and states the hard requirement that at least one filter is supplied.
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.
7 tool updates
- First observed
paleobiology_dataframe_describe - First observed
paleobiology_dataframe_query - First observed
paleobiology_get_diversity - First observed
paleobiology_get_taxon - First observed
paleobiology_list_intervals - First observed
paleobiology_search_collections - First observed
paleobiology_search_occurrences
Related MCP Connectors
Paleobiology Database (PBDB) MCP — the global fossil record. Keyless.
Search GBIF species taxonomy, occurrence records, datasets, and publishers.
Search GBIF species taxonomy, occurrence records, datasets, and publishers.
Macrostrat MCP — geologic map / column / unit data for North America and beyond.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables querying the Paleobiology Database for global fossil records via natural language or direct tools, without requiring an API key.3 npmMIT
- AlicenseNot gradedqualityCmaintenanceMacrostrat MCP — geologic map / column / unit data for North America and beyond.1 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to query and retrieve biodiversity data from the Global Biodiversity Information Facility (GBIF), including species, occurrences, datasets, and literature.-
- AlicenseBqualityBmaintenanceEnables researchers to query and reconcile taxonomic data from the Lacewing Digital Library and Neuropterida Species of the World, including accepted names, type localities, distributions, references, and phylogeny records.21MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.