Skip to main content
Glama

gbif-biodiversity-mcp-server

Server Details

Search GBIF species taxonomy, occurrence records, datasets, and publishers.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 79 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/gbif-biodiversity-mcp-server
GitHub Stars
1
Server Listing
GBIF Biodiversity MCP Server
ChatGPT
–
Claude
–

TDQS

A4.4/5.0

Scored across 13 tools

Disambiguation5/5

Each tool targets a distinct resource+action: name matching (single vs batch vs taxonomic browse), occurrence retrieval (search vs count vs facet aggregation), and entity lookup (species, children, classification, occurrence, dataset, publisher). The descriptions actively cross-reference each other to explain when to prefer one over another (e.g. bulk vs single match, count before paginating a search, search vs match for species). The only near-neighbors — match_species and search_species — are explicitly separated by 'resolve a name' vs 'browse/fragment search'.

Naming Consistency4/5

All names share a gbif_ prefix and snake_case with verb_noun structure (get_species, search_occurrences, count_occurrences, match_species), which is very readable and predictable. Minor deviations: gbif_bulk_match_species prepends a modifier rather than a new verb, and gbif_occurrence_facets is a noun-only name with no verb, breaking the pattern in one spot.

Tool Count5/5

13 tools is squarely in the well-scoped range for a domain with three sub-areas (taxonomy, occurrences, datasets/publishers). Every tool covers a real access pattern with no redundant duplicates — the batch matcher is justified by the 50-name round-trip cost it removes, and the three species-tree tools cover genuinely different outputs.

Completeness4/5

The core GBIF workflow chain is fully covered end-to-end: match/browse taxonomy → get taxon detail/children/classification → search, count, and facet occurrences → resolve dataset and publisher provenance. Gaps are minor and acknowledged (bulk occurrence download is explicitly out of scope, and there is no map/distribution or vernacular-name-specific tool), leaving agents with workarounds via facets and search_species.

Available Tools

13 tools
gbif_bulk_match_speciesBulk Match Species NamesA
Read-onlyIdempotent
Inspect

Resolve up to 50 scientific names to GBIF backbone taxon keys in one call — the batch counterpart to gbif_match_species for checklist, inventory, and species-list workflows that would otherwise need one round trip per name. Each name is matched independently and results are returned in input order, one entry per processed name. By default, an oversized batch processes the first 50 and returns the remainder in unprocessedNames. A name GBIF matched at a higher rank yields matchType HIGHERRANK with a note naming the taxon matched and what its taxonKey covers: that whole taxon, or its accepted taxon when it is a synonym — a misspelled species can fall back to its genus or kingdom at a confidence above 90, and a bare genus name carries the label too, matched as that genus. A name with no backbone match yields matchType NONE (no taxonKey) instead of failing the batch, with a note carrying GBIF's explanation when it gives one, such as several equal matches for a name shared across kingdoms; a per-name lookup failure yields matchType ERROR carrying that name's error message and, when the failure was classified, a machine-readable reason — the rest of the batch is unaffected, and the call as a whole still succeeds. When the name GBIF matched is a synonym — the queried name, or the higher taxon a HIGHERRANK match falls back to — taxonKey is the accepted taxon it resolves to and matchedTaxonKey carries the synonym's own key. Common names are not supported — use gbif_search_species for vernacular searches. Below confidence 80, review the match.

NameRequiredDescriptionDefault
namesYesScientific names to match against the GBIF backbone. Up to 50 are matched in parallel; additional names are returned in unprocessedNames when read-limit clamping is enabled (default). Every submitted name must be valid.
strictNoWhen true, require an exact match for every name (no fuzzy matching). When false (default), GBIF applies fuzzy matching to tolerate minor misspellings.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRequested and applied batch size when names exceed the 50-name workload cap.
resultsNoOne result per processed input name, in input order (at most 50).
unprocessedNamesNoNames beyond the first 50, in original order including duplicates. Submit these names in another call. Absent when every name was processed.

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly/openWorld/idempotent annotations, it discloses per-name independence, input-order results, oversized-batch handling, unprocessedNames behavior, HIGHERRANK/NONE/ERROR semantics, and that per-name failures do not fail the batch. These are substantive behavioral details an agent needs for correct use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key purpose and batch rationale are front-loaded, and most sentences carry useful edge-case behavior. However, it is a dense single paragraph, and some match-type details make it longer than necessary for a first read.

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 complexity, annotations, full schema coverage, and output schema, the description provides enough operational context for correct selection and invocation. It also explains the important match outcomes even though the output schema exists.

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 both parameters are already documented. The description reinforces batch-size and remainder behavior for names, but does not add meaning for the strict parameter beyond what the schema says.

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 a specific verb and resource: resolve up to 50 scientific names to GBIF backbone taxon keys. It explicitly identifies itself as the batch counterpart to gbif_match_species, making the distinction from that sibling immediate.

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 names suitable workflows (checklist, inventory, species-list) and explains why the batch form is preferable to one round trip per name. It also gives an explicit exclusion: common names are not supported and vernacular searches should use gbif_search_species.

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

gbif_count_occurrencesCount OccurrencesA
Read-onlyIdempotent
Inspect

Count occurrences matching a taxon + location filter without fetching records. Use for quick totals ("how many Aves records in Sweden?") or before deciding whether to paginate a full search. Accepts taxonKey, country (uppercase ISO 3166-1 alpha-2), publishingCountry, stateProvince, gadmGid, scientificName, spatial ranges and geometry (intersected), month, basisOfRecord, hasCoordinate (alias isGeoreferenced), isInCluster, coordinateUncertaintyInMeters, datasetKey, year, catalogNumber, institutionCode, recordedBy, mediaType, occurrenceStatus, and iucnRedListCategory. Counts sightings only by default, matching gbif_search_occurrences — GBIF also indexes absence records, and for some taxa they are the overwhelming majority. A count above 100,001 is the signal to partition rather than page: gbif_search_occurrences cannot reach past that offset, so split the query by DATASET_KEY via gbif_occurrence_facets and search each dataset separately.

NameRequiredDescriptionDefault
yearNoYear or year range (e.g., "2024" or "2020,2024"). Both endpoints inclusive. Omit the field to count across every year — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered total.
monthNoCalendar month (1–12), matching the occurrence search filter.
countryNoISO 3166-1 alpha-2 code, uppercase, of where the occurrence was recorded (e.g., "GB", "US"). Not the publisher's country — that is publishingCountry, and the two disagree on most records. Lowercase and alpha-3 forms ("gb", "USA") match nothing upstream, which is why only the uppercase two-letter form is accepted here. Take a value from a COUNTRY facet on gbif_occurrence_facets; an uppercase pair GBIF does not know ("XX") is rejected upstream by name.
gadmGidNoGADM administrative-area GID at any level: country (ESP), state or province (ESP.1_1), county or district (ESP.1.5_1), or municipality (ESP.1.6.3_1). GBIF derives a record's GIDs from its coordinates, so records without coordinates match none, and the unit can differ from the verbatim stateProvince the record carries. Matched exactly and case-sensitively, and a GID holds only uppercase letters, digits, dots, and underscores — any other character is rejected. Take one from a GADM_LEVEL_0_GID, GADM_LEVEL_1_GID, GADM_LEVEL_2_GID, or GADM_LEVEL_3_GID facet on gbif_occurrence_facets, or from the gadm field of gbif_get_occurrence; a well-formed GID GBIF does not hold matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
geometryNoWKT polygon in longitude latitude order. All supplied spatial filters intersect: decimalLatitude and decimalLongitude remain active and restrict results to the overlap. Omit to leave geometry unfiltered; blank or whitespace-only is rejected.
taxonKeyNoGBIF backbone taxon key from gbif_match_species. Matches the given taxon and all descendant taxa (subspecies, varieties, etc.).
mediaTypeNoOnly records carrying at least one media item of this type: StillImage (photographs, scans), MovingImage (video), Sound (audio), or InteractiveResource. Records without media are excluded when this is set.
datasetKeyNoFilter to a specific dataset UUID (8-4-4-4-12 hex) from gbif_search_datasets. Omit the field to count across every dataset — an empty string is rejected rather than read as no filter, because GBIF answers a blank datasetKey with the unfiltered total. The result is not the recordCount the dataset tools and the gbif://dataset/{datasetKey} resource report for the same key: that figure spans every occurrenceStatus, while this count applies occurrenceStatus below, PRESENT by default.
recordedByNoCollector or observer, matched against each name in the record's recordedBy list (GBIF splits it on "|") exactly and case-sensitively: "Charles Darwin" and "charles darwin" differ, and one person written two ways ("Charles Darwin", "Darwin, C.") is two values. Take a value from a RECORDED_BY facet on gbif_occurrence_facets scoped the same way and pass it back unchanged; an unmatched value matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
isInClusterNoTrue counts likely duplicates; false excludes them. Omit to include all records. GBIF exposes membership only, with no cluster identifier.
basisOfRecordNoFilter by how the occurrence was recorded; accepts every GBIF BasisOfRecord vocabulary member.
catalogNumberNoCatalog number a collection assigned to the specimen or record (e.g. "L.1592880"), matched as the whole value, case-insensitively. Not unique across collections — one number can name records in several datasets, so pair it with institutionCode or datasetKey to single one out. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
hasCoordinateNoTrue counts records with coordinates; false counts only records without coordinates. Omit for both. Alias isGeoreferenced may be supplied alone or with the same value; conflicts fail as invalid_filter.
stateProvinceNoState, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. GBIF stores what each dataset recorded without normalizing it, so there is no vocabulary to guess from: "England", "England - Greater London", and "Greater London" are three distinct values, and "england" is none of them. Take one from a STATE_PROVINCE facet on gbif_occurrence_facets scoped the same way and pass it back unchanged — an unmatched value counts zero rather than erroring. Omit the field to count across every state or province — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered total.
scientificNameNoScientific name; does not match synonyms. With taxonKey GBIF takes their union (OR), not their intersection. Omit to leave names unfiltered; blank or whitespace-only is rejected.
decimalLatitudeNoLatitude or latitude range "min,max" in decimal degrees (WGS84). All supplied spatial filters intersect, including geometry. Omit to leave latitude unbounded; blank or whitespace-only is rejected.
institutionCodeNoCode of the institution holding the record (e.g. "K", "CLO"), matched as the whole value, case-insensitively — part of a code or of a multi-word code matches nothing. An INSTITUTION_CODE facet on gbif_occurrence_facets lists the codes in a scope, lowercased, and this filter takes them unchanged. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
isGeoreferencedNoAlias for hasCoordinate. True counts only georeferenced records; false only non-georeferenced records. Supplying both requires equal values.
decimalLongitudeNoLongitude or longitude range "min,max" in decimal degrees (WGS84). All supplied spatial filters intersect, including geometry. Omit to leave longitude unbounded; blank or whitespace-only is rejected.
occurrenceStatusNoPresence/absence filter. Defaults to PRESENT: an ABSENT record documents a survey that looked for the taxon and did not find it, so counting one inflates the total with the opposite of a sighting. Use ANY for both (GBIF's own default), or ABSENT for non-observations alone. Matches the gbif_search_occurrences default, so the two tools agree.PRESENT
publishingCountryNoISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — distinct from where the occurrence was observed, which is country. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets. Lowercase and alpha-3 forms ("us", "USA") match nothing upstream, which is why only the uppercase two-letter form is accepted here.
iucnRedListCategoryNoCount only records whose taxon carries this IUCN Red List category: CR Critically Endangered, EN Endangered, VU Vulnerable, NT Near Threatened, LC Least Concern, DD Data Deficient, EX Extinct, EW Extinct in the Wild, CD Conservation Dependent. Records with no category are excluded when this is set.
coordinateUncertaintyInMetersNoCoordinate uncertainty radius in meters, e.g. "0,1000"; range endpoints inclusive. Omit for any uncertainty; blank or whitespace-only is rejected.

Output Schema

NameRequiredDescription
countNoTotal occurrences matching the supplied filters.
errorNoPresent when the call failed. Absent on success.
scopeNoEffective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.
noticeNoGuidance when the count is zero under an exact-match stateProvince, gadmGid, or recordedBy filter, larger than gbif_search_occurrences can page to, or narrowed by a presence/absence filter. Absent when none applies.
occurrenceStatusNoThe presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what the count covers.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds real behavioral context beyond them: counts default to sightings only because GBIF also indexes absence records that can dominate some taxa, and the search tool cannot reach past a 100,001 offset. Missing only return shape/rate-limit detail, which the output schema partly covers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the partition-vs-paginate rule are front-loaded and every one of those sentences earns its place. The long mid-sentence enumeration of all 23 parameters is largely redundant against a 100%-documented schema and is the one wasteful stretch.

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 23-parameter counting tool with annotations and an output schema, nothing an agent needs is missing: the counting semantics, the PRESENT default rationale, the offset ceiling, and the workaround are all stated. No output-format explanation is needed since the output schema exists.

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 per-parameter meaning is already fully documented upstream — baseline 3. The description's enumeration of 23 filter names adds a quick overview and flags that spatial filters intersect, but the semantics themselves (case sensitivity, ISO format, facet sourcing) all live in the schema, not here.

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+resource (count occurrences) and immediately draws the boundary against the sibling that fetches records: 'without fetching records.' An agent can distinguish it from gbif_search_occurrences without opening either schema.

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?

Gives concrete when-to-use cases (quick totals, deciding whether to paginate) and an explicit escalation path: a count above 100,001 means partition by DATASET_KEY via gbif_occurrence_facets rather than page. That names both the alternative tool and the condition that selects it.

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

gbif_get_datasetGet DatasetA
Read-onlyIdempotent
Inspect

Fetch full dataset metadata by UUID key — title, description, citation text, contacts, license, DOI, record count, numConstituents (sub-datasets), temporal/geographic coverage, and the publishing organization key, which gbif_search_datasets takes as publishingOrg. Use after gbif_search_datasets or when an occurrence record's datasetKey needs provenance detail. Contacts are capped by contactLimit (default 10); contactsTotal and contactsReturned report the full count.

NameRequiredDescriptionDefault
datasetKeyYesDataset UUID (8-4-4-4-12 hex) from gbif_search_datasets or an occurrence record.
contactLimitNoMaximum number of contacts to include (default 10, max 100). Set to 0 to omit contact detail while still reporting contactsTotal — useful when citation, license, and record count are all you need from a high-contact dataset like eBird.

Output Schema

NameRequiredDescription
capNocontactLimit applied when the list was capped. Raise it (max 100) to see more. Absent otherwise.
doiNoDOI for citation. May be absent.
keyNoDataset UUID.
typeNoDataset type (OCCURRENCE, CHECKLIST, etc.).
errorNoPresent when the call failed. Absent on success.
shownNoContacts included in this response when the list was capped. Absent otherwise.
titleNoDataset title.
noticeNoHow to reach contacts held back, or requested/applied values when contactLimit was clamped. Absent when neither applies.
licenseNoLicense identifier. May be absent.
contactsNoDataset contacts, capped at contactLimit. Absent when the dataset has no contacts or contactLimit is 0.
truncatedNoTrue when the dataset carries more contacts than contactLimit allowed through. Absent when every contact was returned.
descriptionNoFull dataset description. May be absent.
recordCountNoOccurrence records GBIF has indexed for this dataset, matching the figure gbif_search_datasets reports. Spans every occurrenceStatus: absence records — surveys that looked for a taxon and did not find it — are counted alongside sightings, and on some datasets they are the overwhelming majority. gbif_count_occurrences with this datasetKey answers the other question, defaulting to occurrenceStatus PRESENT, so the two figures are expected to differ rather than one being wrong. Fetched separately because the detail endpoint omits it; absent when that lookup does not return in time.
citationTextNoFull citation text for academic reference. May be absent.
contactsTotalNoTotal contacts on the dataset before applying contactLimit. Present when the dataset has any contacts.
numConstituentsNoNumber of constituent sub-datasets. May be absent.
contactsReturnedNoNumber of contacts included in this response (≤ contactLimit). Present when the dataset has any contacts.
publishingCountryNoCountry code of the publishing organization.
recordCountNoticeNoExplains an unavailable supplementary count and how to retry. Absent after a successful lookup or a declared count.
temporalCoveragesNoTemporal coverage declared by the dataset, preserving supplied dates and verbatim periods. May be absent.
geographicCoveragesNoGeographic coverage descriptions declared by the dataset. May be absent.
temporalCoverageNoticeNoDiscloses unsupported or unusable temporal entries omitted from the response. May be absent.
publishingOrganizationKeyNoUUID of the organization that published the dataset. Pass it to gbif_search_datasets as publishingOrg for every dataset this organization published; gbif_search_datasets rows also carry the organization's name. Absent when GBIF omits it.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds genuinely new behavioral context: contacts are capped by contactLimit (default 10) and contactsTotal/contactsReturned report the untruncated count, which an agent could not infer from annotations alone.

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 sentences, front-loaded with the core action, then the returned-field list, then usage routing and the contact-cap caveat. The field enumeration is long but each item is actionable data the caller needs.

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?

An output schema exists, annotations cover the safety profile, and both parameters are fully documented. The description fills the remaining gaps — provenance use case, sibling relationship, and truncation reporting — so an agent can call this correctly with no further reading.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds a cross-tool semantic link the schema does not: the returned publishing organization key is the publishingOrg value gbif_search_datasets accepts, explaining why the agent might call this first.

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 and resource ('Fetch full dataset metadata by UUID key') and enumerates the returned fields, so the agent knows exactly what comes back. It is clearly distinguishable from gbif_search_datasets, which is named as the discovery counterpart.

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?

Explicitly routes usage: 'Use after gbif_search_datasets or when an occurrence record's datasetKey needs provenance detail.' Both entry paths and the alternative tool are named, leaving nothing to inference.

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

gbif_get_occurrenceGet Occurrence RecordA
Read-onlyIdempotent
Inspect

Fetch a single occurrence record by its GBIF occurrence key. Returns the complete Darwin Core record — all coordinates, administrative geography (GADM levels 0–3), dates, collections metadata, collector identifiers, conservation status, media links, and quality issue flags. Check occurrenceStatus before reading the record as a sighting: ABSENT means a survey looked for the taxon and did not find it. Use the occurrence key from gbif_search_occurrences results.

NameRequiredDescriptionDefault
occurrenceKeyYesGBIF occurrence key from gbif_search_occurrences results.

Output Schema

NameRequiredDescription
dayNoObservation day. May be absent.
keyNoGBIF occurrence key.
sexNoSex of the individual(s). May be absent.
gadmNoGADM administrative geography — stable GIDs and names at levels 0–3. May be absent.
yearNoObservation year. May be absent.
classNoClass classification. May be absent.
errorNoPresent when the call failed. Absent on success.
genusNoGenus classification.
mediaNoAssociated media (images, audio, video). May be absent.
monthNoObservation month (1–12). May be absent.
orderNoOrder classification.
familyNoFamily classification.
issuesNoGBIF data quality issue flags.
phylumNoPhylum classification.
countryNoCountry name. May be absent.
kingdomNoKingdom classification.
speciesNoSpecies canonical name.
classKeyNoBackbone taxon key for the class. May be absent.
localityNoLocality description. May be absent.
taxonKeyNoBackbone taxon key.
continentNoContinent name. May be absent.
eventDateNoObservation date as ISO 8601 string. May be absent.
eventTimeNoTime of day of the observation, with seconds and UTC offset (e.g. 20:15:00+01:00) — the offset eventDate omits when it carries a local time. May be absent.
lifeStageNoLife stage of the individual(s). May be absent.
taxonRankNoTaxonomic rank of the identified taxon.
datasetKeyNoUUID of the source dataset.
recordedByNoCollector name(s). May be absent.
countryCodeNoISO 3166-1 alpha-2 country code. May be absent.
identifiersNoAlternative record identifiers from the source. May be absent.
identifiedByNoIdentifier name(s). May be absent.
occurrenceIDNoDarwin Core occurrenceID — the source record identifier, often a URL back to the origin record. May be absent.
basisOfRecordNoHow the occurrence was recorded.
canonicalNameNoCanonical name without authorship.
catalogNumberNoCatalog number within the collection. May be absent.
stateProvinceNoState or province. May be absent.
collectionCodeNoCollection code within the institution. May be absent.
scientificNameNoScientific name from occurrence record.
decimalLatitudeNoLatitude in decimal degrees (WGS84). May be absent.
individualCountNoNumber of individuals. May be absent.
institutionCodeNoCode of the contributing institution. May be absent.
taxonomicStatusNoStatus of the identification carried on this record — ACCEPTED, PROVISIONALLY_ACCEPTED, SYNONYM, DOUBTFUL, and so on. Says whether the occurrence was filed under an accepted name or a synonym. May be absent.
decimalLongitudeNoLongitude in decimal degrees (WGS84). May be absent.
occurrenceStatusNoPRESENT when the record asserts the taxon was there, ABSENT when it documents a survey that looked and did not find it. An ABSENT record is not a sighting — it carries coordinates, a date, and a recorder all the same. May be absent.
publishingCountryNoCountry code of the publishing organization.
iucnRedListCategoryNoIUCN Red List category of the taxon — CR Critically Endangered, EN Endangered, VU Vulnerable, NT Near Threatened, LC Least Concern, DD Data Deficient, EX Extinct, EW Extinct in the Wild, CD Conservation Dependent. May be absent.
coordinateUncertaintyInMetersNoCoordinate uncertainty radius in meters. May be absent.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and openWorld, so the safety profile is covered. The description adds genuine domain context beyond that: the scope of the returned Darwin Core record and the important semantic caveat that ABSENT occurrenceStatus means a survey searched and found nothing — a subtle trap an agent would otherwise fall into.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the action and key source, then return scope, then the caveat. The field enumeration is somewhat redundant given an output schema exists, but it usefully sets expectations about record breadth and costs only one sentence.

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 single-parameter, read-only lookup with an output schema and full annotations, nothing an agent needs is missing: what it does, where the key comes from, what comes back, and the one interpretive pitfall (occurrenceStatus ABSENT).

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 the sole parameter's schema description already says the key comes from gbif_search_occurrences results, so the description largely restates it. Baseline 3 applies; no additional format, range, or validation detail is contributed.

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 and resource ("Fetch a single occurrence record by its GBIF occurrence key") and implicitly distinguishes itself from the list-producing siblings gbif_search_occurrences and gbif_count_occurrences. An agent can immediately tell this is the single-record retrieval tool.

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

Usage Guidelines4/5

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

Explicitly routes the agent: "Use the occurrence key from gbif_search_occurrences results," which establishes the correct call sequence. It also gives a domain caution (check occurrenceStatus before reading as a sighting), but does not state when this tool should not be used versus alternatives like gbif_occurrence_facets.

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

gbif_get_speciesGet Species RecordA
Read-onlyIdempotent
Inspect

Fetch a single backbone taxon by its GBIF taxon key. Returns full classification, authorship, taxonomic status, vernacular name, descendant count, and publication reference. Use after gbif_match_species when you need the complete record rather than the match summary. When taxonomicStatus is SYNONYM, acceptedKey and accepted fields identify the accepted taxon. The extinct field is absent (not false) on most records — only present on explicitly flagged taxa.

NameRequiredDescriptionDefault
taxonKeyYesGBIF backbone taxon key from gbif_match_species or another taxonomy tool.

Output Schema

NameRequiredDescription
keyNoGBIF backbone taxon key.
rankNoTaxonomic rank (SPECIES, GENUS, FAMILY, etc.).
classNoClass classification.
errorNoPresent when the call failed. Absent on success.
genusNoGenus classification.
orderNoOrder classification.
familyNoFamily classification.
parentNoName of the immediate parent taxon.
phylumNoPhylum classification.
extinctNoTrue when the taxon is explicitly flagged as extinct. Absent on most records.
kingdomNoKingdom classification.
speciesNoSpecies canonical name.
acceptedNoScientific name of the accepted taxon when this record is a synonym.
classKeyNoTaxon key for the class.
genusKeyNoTaxon key for the genus.
orderKeyNoTaxon key for the order.
familyKeyNoTaxon key for the family.
parentKeyNoTaxon key of the immediate parent.
phylumKeyNoTaxon key for the phylum.
authorshipNoTaxonomic authorship of the name.
kingdomKeyNoTaxon key for the kingdom.
speciesKeyNoTaxon key for the species.
acceptedKeyNoBackbone key of the accepted taxon when this record is a synonym.
publishedInNoOriginal description citation when available.
canonicalNameNoScientific name without authorship.
numDescendantsNoCount of child taxa in the backbone under this taxon.
numOccurrencesNoOccurrence record count, when GBIF includes one. Its taxon record endpoint does not, so this is normally absent — count with gbif_count_occurrences and the taxonKey instead.
scientificNameNoFull scientific name with authorship.
vernacularNameNoEnglish common name when available.
taxonomicStatusNoACCEPTED, SYNONYM, DOUBTFUL, etc. SYNONYM means acceptedKey/accepted are populated.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish it as a safe, idempotent, open-world read. The description adds genuinely non-obvious behavior: SYNONYM records carry acceptedKey/accepted fields, and the extinct field is absent rather than false on most records. These semantic caveats are the kind of detail no annotation or schema conveys, though field enumeration partly duplicates the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with purpose then usage then edge cases; each earns its place. The return-field list is slightly redundant against the output schema but is short enough not to bloat.

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?

An output schema exists, so return values need no further prose, and the description still covers the two traps an agent would hit (synonym resolution and the absent extinct flag). Nothing needed to call or interpret this tool correctly is missing.

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?

One required parameter with 100% schema description coverage, so the schema already explains taxonKey and its source. The description reinforces the source tool but adds no format, range, or validation detail beyond what is structured — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Fetch a single backbone taxon by its GBIF taxon key' — and enumerates exactly what the record contains. An agent can distinguish it from search_species, get_species_children, and match_species without opening any schema.

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

Usage Guidelines4/5

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

Explicitly names the alternative and the condition that selects this tool: 'Use after gbif_match_species when you need the complete record rather than the match summary.' It doesn't clarify overlap with gbif_get_species_classification, which also returns classification data, so the sibling routing is not fully closed.

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

gbif_get_species_childrenGet Species ChildrenA
Read-onlyIdempotent
Inspect

List direct children of a backbone taxon — genera within a family, species within a genus, subspecies within a species. Paginated. Use gbif_match_species to get the taxonKey first, then iterate with offset for large groups.

NameRequiredDescriptionDefault
limitNoNumber of children to return (default 20, max 1000).
offsetNoPagination offset.
taxonKeyYesGBIF backbone taxon key from gbif_match_species or another taxonomy tool.

Output Schema

NameRequiredDescription
capNoLimit applied when the result was truncated. Re-call with offset to page on.
errorNoPresent when the call failed. Absent on success.
limitNoRecords returned in this page.
shownNoChildren returned in this page when the result was truncated.
noticeNoGuidance when a valid taxon has no children, more pages remain, or an oversized limit was clamped. Absent when none applies.
offsetNoCurrent pagination offset.
childrenNoDirect child taxa.
truncatedNoTrue when more children exist beyond this page. Absent on the final page.
endOfRecordsNoTrue when there are no more results after this page.

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 openWorldHint, so safety is covered. The description adds behavior the annotations don't: results are paginated, and large child sets must be walked via offset. Missing only edge-case behavior (unknown taxonKey, empty child lists), which is minor here.

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, front-loaded with the core action, followed by pagination and prerequisite guidance. No filler and no repetition of schema details.

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?

An output schema exists, so return values need no explanation, and annotations cover the safety profile. The description supplies the prerequisite and pagination story an agent needs to call it correctly; only ordering guarantees and empty-result behavior are unstated.

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

Parameters4/5

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

Schema coverage is 100%, so all three parameters are already documented, setting a baseline of 3. The description goes beyond that by tying taxonKey to its source (gbif_match_species) and explaining offset as the iteration mechanism for large groups, adding workflow meaning rather than restating field docs.

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 and resource ('List direct children of a backbone taxon') and disambiguates with concrete hierarchy examples (genera within a family, species within a genus, subspecies within a species). The word 'direct' usefully distinguishes it from lineage-style siblings such as gbif_get_species_classification.

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?

Gives a concrete workflow: call gbif_match_species first to obtain the taxonKey, then paginate with offset for large groups. It doesn't explicitly exclude alternatives (e.g., gbif_search_species for name-based lookup or gbif_get_species_classification for full ancestry), but the intended context is clear.

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

gbif_get_species_classificationGet Species ClassificationA
Read-onlyIdempotent
Inspect

Return the parent chain for a taxon — from kingdom (or domain) down to the immediate parent of the queried taxon — as an ordered array. Each entry has its rank, canonical name, and taxon key. The array is returned root-first (kingdom → phylum → class → … → immediate parent of the queried taxon); the queried taxon itself is not included — call gbif_get_species for its own record. Useful for building taxonomic trees or understanding placement without navigating the backbone level-by-level.

NameRequiredDescriptionDefault
taxonKeyYesGBIF backbone taxon key from gbif_match_species or another taxonomy tool.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when the chain is empty because the taxon sits at the root of the backbone. Absent when the chain has entries.
classificationNoClassification chain ordered from root (kingdom) to the immediate parent of the queried taxon. The queried taxon itself is not included — call gbif_get_species for its own record.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description goes beyond them by disclosing result shape and ordering (root-first), the exclusion of the queried taxon, and per-entry contents — behavior an agent cannot infer from annotations alone. It stops short of stating edge cases such as what happens for a kingdom-level or unmatched taxon key.

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?

Front-loaded with the core behavior and ordering in the first two sentences, then a routing pointer, then the rationale. Three sentences, each carrying distinct information, with no repetition of the schema or annotations.

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?

An output schema exists, yet the description still gives the shape and ordering an agent needs for planning. With one fully documented parameter and annotations covering the safety profile, nothing an agent needs in order to call this correctly is missing.

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 parameter's description already names its source (gbif_match_species or another taxonomy tool). The description adds nothing about taxonKey — no mention of what keys are valid, what happens with a non-backbone key — so the baseline 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?

States a specific verb and resource ("Return the parent chain for a taxon") and pins down the exact scope: kingdom/domain down to the immediate parent, queried taxon excluded. The root-first ordering and per-entry fields (rank, canonical name, taxon key) make it unmistakable what this returns versus a plain species lookup.

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

Usage Guidelines4/5

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

Explicitly routes the agent to gbif_get_species when it wants the queried taxon's own record, and frames the use case (building taxonomic trees, understanding placement without walking the backbone). It does not address the nearest potential confusion, gbif_get_species_children (descendants vs. ancestors), so the sibling differentiation is strong but not exhaustive.

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

gbif_match_speciesMatch Species NameA
Read-onlyIdempotent
Inspect

Match a scientific name against the GBIF backbone taxonomy. Returns the best-matching taxon with full classification and a confidence score (0–100). This is the mandatory first step for any GBIF workflow — it returns the backbone taxonKey required by gbif_search_occurrences, gbif_count_occurrences, and gbif_occurrence_facets. When the name GBIF matched is a synonym — the queried name, or the higher taxon a HIGHERRANK match falls back to — taxonKey is the accepted taxon it resolves to and matchedTaxonKey carries the synonym's own key; occurrence counts differ sharply between the two, so pass taxonKey. matchType HIGHERRANK is GBIF's label for a match made at a higher rank: a misspelled or unknown species falls back to its genus or even its kingdom, at a confidence that can exceed 90, and a bare genus name carries the label too, matched as that genus. taxonKey then covers that whole taxon, or its accepted taxon when it is a synonym, and a notice names it. Below confidence 80, the match should be reviewed. matchType NONE means no usable match was found — try removing the strict flag or broadening the name; when GBIF reports several equal matches, as for a genus name shared by an animal and a plant, set kingdom to pick one.

NameRequiredDescriptionDefault
nameYesScientific name to match. Examples: "Parus major", "Agaricus bisporus", "Homo sapiens". Fuzzy matching handles minor spelling variations. Common names are not supported — use gbif_search_species for vernacular name searches.
rankNoExpected taxonomic rank. Use to avoid matching a genus when you expect a species.
strictNoWhen true, only return an exact match. When false (default), GBIF applies fuzzy matching — useful for minor spelling variations and abbreviated names.
kingdomNoNarrow the match to a specific kingdom (e.g., "Animalia", "Plantae", "Fungi") to disambiguate names that appear in multiple kingdoms. Omit the field to match against the whole backbone — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the undisambiguated match, which is indistinguishable from a match that honored the kingdom.

Output Schema

NameRequiredDescription
rankNoTaxonomic rank of the matched taxon.
classNoClass of the matched taxon.
errorNoPresent when the call failed. Absent on success.
genusNoGenus of the matched taxon.
orderNoOrder of the matched taxon.
familyNoFamily of the matched taxon.
noticeNoGuidance when matchType is HIGHERRANK — naming the taxon and rank GBIF matched and what taxonKey covers — or when the matched name was a synonym and taxonKey was resolved to the accepted taxon. A higher-rank match on a synonym carries both. Absent on an EXACT or FUZZY match of an accepted name.
phylumNoPhylum of the matched taxon.
statusNoTaxonomic status: ACCEPTED, SYNONYM, or DOUBTFUL.
kingdomNoKingdom of the matched taxon.
speciesNoSpecies canonical name of the matched taxon.
classKeyNoBackbone taxon key for the class.
genusKeyNoBackbone taxon key for the genus.
orderKeyNoBackbone taxon key for the order.
taxonKeyNoGBIF backbone taxon key to pass to downstream tools. The accepted taxon's key when the name GBIF matched is a synonym, otherwise the matched taxon's own key.
familyKeyNoBackbone taxon key for the family.
matchTypeNoEXACT, FUZZY, HIGHERRANK, or NONE. HIGHERRANK means GBIF matched at a higher rank — a misspelled species falls back to its genus or kingdom, and a bare genus name carries it too — and taxonKey covers that whole taxon, or its accepted taxon when it is a synonym. NONE means no usable match.
phylumKeyNoBackbone taxon key for the phylum.
confidenceNoMatch confidence score 0–100. Below 80 warrants review. A HIGHERRANK match can score above 90, so read matchType too.
kingdomKeyNoBackbone taxon key for the kingdom.
speciesKeyNoBackbone taxon key for the species.
canonicalNameNoScientific name without authorship.
scientificNameNoFull scientific name with authorship.
matchedTaxonKeyNoBackbone key of the name that actually matched. Present only when it differs from taxonKey — that is, when a synonym was resolved to its accepted taxon.

TDQS

A4.6/5.0
Behavior5/5

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

The annotations already declare readOnly, openWorld, and idempotent behavior, and the description adds substantial context beyond them: confidence scores, synonym handling, HIGHERRANK fallback behavior, the difference between taxonKey and matchedTaxonKey, and the threshold for reviewing matches. Nothing contradicts 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, required use, and downstream dependencies, and each section addresses a distinct behavior. It is still dense and could be tightened, but the length is justified by the tool's complex match semantics.

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 output schema, annotations, and four parameters, the description covers everything an agent needs: mandatory workflow role, confidence interpretation, synonym and HIGHERRANK behavior, failure handling, and disambiguation. No critical behavioral or routing information is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents name, rank, strict, and kingdom, including the rejection of blank kingdom values. The description adds contextual advice about when to remove strict or set kingdom, but it does not materially deepen parameter semantics beyond what the schema provides.

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 says it matches a scientific name against the GBIF backbone and returns the best-matching taxon with classification and confidence. It also distinguishes this tool from siblings by naming gbif_search_occurrences, gbif_count_occurrences, gbif_occurrence_facets, and gbif_search_species as downstream or alternative tools.

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 explicitly says this is the mandatory first step for any GBIF workflow and names the tools that require the resulting taxonKey. It also gives concrete guidance for common names, strict matching, kingdom disambiguation, low-confidence review, and matchType NONE.

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

gbif_occurrence_facetsOccurrence Facet AggregationA
Read-onlyIdempotent
Inspect

Aggregate occurrence counts across a dimension (COUNTRY, STATE_PROVINCE, YEAR, BASIS_OF_RECORD, DATASET_KEY, KINGDOM_KEY, etc.). Returns one page of facet values ranked by count descending — the top facetLimit at facetOffset 0, a later slice of the same ranking past that. No record payloads returned. Core tool for distribution analysis and trend queries: "which countries have the most records for this species?", "how has observation volume changed since 2010?". Key dimensions (KINGDOM_KEY through SPECIES_KEY, DATASET_KEY) return bare keys; includeLabels names the taxon or dataset behind each one on the page. Scope the aggregation with taxonKey, country (uppercase ISO 3166-1 alpha-2), publishingCountry, stateProvince, gadmGid, year, scientificName, latitude/longitude ranges, month, hasCoordinate, isInCluster, coordinateUncertaintyInMeters, geometry (all spatial filters intersect), basisOfRecord, datasetKey, catalogNumber, institutionCode, recordedBy, mediaType, occurrenceStatus, or iucnRedListCategory filters. Also the way to split a result set too large for gbif_search_occurrences to page (offset+limit caps at 100,001): facet by DATASET_KEY, then search each datasetKey on its own. Aggregates sightings only by default, matching gbif_search_occurrences and gbif_count_occurrences; to measure the presence/absence split itself, pass facet OCCURRENCE_STATUS with occurrenceStatus ANY.

NameRequiredDescriptionDefault
yearNoYear or year range (e.g., "2020,2024") to scope the aggregation. Both endpoints inclusive. Omit the field to aggregate across every year — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered aggregation.
facetYesDimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY, OCCURRENCE_STATUS, IUCN_RED_LIST_CATEGORY). DATASET_KEY is the first cut when a result set is too large to page: every occurrence carries exactly one datasetKey, so its buckets cover totalOccurrences with no gap or overlap. BASIS_OF_RECORD and PUBLISHING_COUNTRY are gap-free second cuts for a dataset bucket still too large; both have a matching filter on the occurrence tools. A dimension a record can lack drops that record from every bucket: YEAR loses undated records; MONTH, STATE_PROVINCE, SPECIES_KEY, INSTITUTION_CODE, MEDIA_TYPE, and RECORDED_BY lose records lacking that dimension; GADM_LEVEL_0_GID, GADM_LEVEL_1_GID, GADM_LEVEL_2_GID, and GADM_LEVEL_3_GID lose records without coordinates or outside every GADM unit at that level — each even where the occurrence tools can filter on it. MEDIA_TYPE and RECORDED_BY buckets also overlap: a record with two media types or two collectors counts in each, so their sums can exceed totalOccurrences. GADM buckets are GIDs to pass back as gadmGid; INSTITUTION_CODE buckets come back lowercased and institutionCode takes them unchanged; RECORDED_BY buckets are the exact spellings recordedBy matches. Sums are comparable only across the same occurrenceStatus scope.
monthNoCalendar month (1–12), matching the occurrence search filter.
countryNoISO 3166-1 alpha-2 code, uppercase, of where the occurrence was recorded, to scope to one country. Not the publisher's country — that is publishingCountry, and the two disagree on most records. Scope to one country, or pass back a value this tool returned under facet COUNTRY to drill into that bucket. Lowercase and alpha-3 forms ("gb", "USA") match nothing upstream, which is why only the uppercase two-letter form is accepted here.
gadmGidNoGADM administrative-area GID at any level: country (ESP), state or province (ESP.1_1), county or district (ESP.1.5_1), or municipality (ESP.1.6.3_1). GBIF derives a record's GIDs from its coordinates, so records without coordinates match none, and the unit can differ from the verbatim stateProvince the record carries. Matched exactly and case-sensitively, and a GID holds only uppercase letters, digits, dots, and underscores — any other character is rejected. Take one from a GADM_LEVEL_0_GID, GADM_LEVEL_1_GID, GADM_LEVEL_2_GID, or GADM_LEVEL_3_GID facet on gbif_occurrence_facets, or from the gadm field of gbif_get_occurrence; a well-formed GID GBIF does not hold matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
geometryNoWKT polygon to scope the aggregation to a geographic area (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. All supplied spatial filters intersect: decimalLatitude and decimalLongitude remain active and restrict results to the overlap. Omit the field to aggregate everywhere — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered aggregation.
taxonKeyNoBackbone taxon key to scope the aggregation. Matches the given taxon and all descendant taxa (subspecies, varieties, etc.).
mediaTypeNoOnly records carrying at least one media item of this type: StillImage (photographs, scans), MovingImage (video), Sound (audio), or InteractiveResource. Records without media are excluded when this is set.
datasetKeyNoScope the aggregation to a single dataset by its GBIF dataset UUID (8-4-4-4-12 hex). Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet, or the datasetKey field on an occurrence record. Omit the field to aggregate across every dataset — an empty string is rejected rather than read as no scope, because GBIF answers a blank datasetKey with the unfiltered aggregation.
facetLimitNoMaximum number of facet values to return (default 10, max 100).
recordedByNoCollector or observer, matched against each name in the record's recordedBy list (GBIF splits it on "|") exactly and case-sensitively: "Charles Darwin" and "charles darwin" differ, and one person written two ways ("Charles Darwin", "Darwin, C.") is two values. Take a value from a RECORDED_BY facet on gbif_occurrence_facets scoped the same way and pass it back unchanged; an unmatched value matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
facetOffsetNoZero-based offset into the ranked facet values, for paging past the first facetLimit values on high-cardinality dimensions like DATASET_KEY. Advance by facetLimit to fetch the next page (0, then facetLimit, then 2×facetLimit, …).
isInClusterNoTrue includes likely duplicates; false excludes them. Omit to include all records. GBIF exposes membership only, with no cluster identifier.
basisOfRecordNoScope to a specific basis of record.
catalogNumberNoCatalog number a collection assigned to the specimen or record (e.g. "L.1592880"), matched as the whole value, case-insensitively. Not unique across collections — one number can name records in several datasets, so pair it with institutionCode or datasetKey to single one out. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
hasCoordinateNoTrue includes records with coordinates; false only records without coordinates. Omit for both.
includeLabelsNoTrue names the taxon or dataset behind each bucket on the returned page with a label: the canonicalName for a KINGDOM_KEY, PHYLUM_KEY, CLASS_KEY, ORDER_KEY, FAMILY_KEY, GENUS_KEY, or SPECIES_KEY bucket, the dataset title for a DATASET_KEY bucket. Costs one extra GBIF request per bucket, up to facetLimit, all bounded by one 10 s deadline; a bucket whose lookup fails or misses it comes back without a label and is counted in notice. Every other dimension ignores it. Leave it false when keys are enough, as when partitioning by DATASET_KEY.
stateProvinceNoState, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. Pass back a value this tool returned under facet STATE_PROVINCE rather than a guessed one: GBIF stores what each dataset recorded without normalizing it, so "England", "England - Greater London", and "Greater London" are three distinct values, "england" is none of them, and an unmatched value aggregates zero records rather than erroring. Omit the field to aggregate across every state or province — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered aggregation.
scientificNameNoScientific name; does not match synonyms. With taxonKey GBIF takes their union (OR), not their intersection. Omit to leave names unfiltered; blank or whitespace-only is rejected.
decimalLatitudeNoLatitude or latitude range "min,max" in decimal degrees (WGS84). All supplied spatial filters intersect, including geometry. Omit to leave latitude unbounded; blank or whitespace-only is rejected.
institutionCodeNoCode of the institution holding the record (e.g. "K", "CLO"), matched as the whole value, case-insensitively — part of a code or of a multi-word code matches nothing. An INSTITUTION_CODE facet on gbif_occurrence_facets lists the codes in a scope, lowercased, and this filter takes them unchanged. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
decimalLongitudeNoLongitude or longitude range "min,max" in decimal degrees (WGS84). All supplied spatial filters intersect, including geometry. Omit to leave longitude unbounded; blank or whitespace-only is rejected.
occurrenceStatusNoPresence/absence scope. Defaults to PRESENT so the aggregation counts sightings, not the surveys that looked and found nothing, and agrees with gbif_count_occurrences on the same filters. Use ANY for both — required to see both buckets when facet is OCCURRENCE_STATUS — or ABSENT for non-observations alone.PRESENT
publishingCountryNoISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — not where the occurrence was observed, which is country. Scope to one publisher country, or pass back a value this tool returned under facet PUBLISHING_COUNTRY to drill into that bucket. Lowercase and alpha-3 forms ("us", "USA") match nothing upstream, which is why only the uppercase two-letter form is accepted here.
iucnRedListCategoryNoScope to records whose taxon carries this IUCN Red List category: CR Critically Endangered, EN Endangered, VU Vulnerable, NT Near Threatened, LC Least Concern, DD Data Deficient, EX Extinct, EW Extinct in the Wild, CD Conservation Dependent. Leave unset and facet on IUCN_RED_LIST_CATEGORY to see the whole distribution instead.
coordinateUncertaintyInMetersNoCoordinate uncertainty radius in meters, e.g. "0,1000"; range endpoints inclusive. Omit for any uncertainty; blank or whitespace-only is rejected.

Output Schema

NameRequiredDescription
capNofacetLimit applied when the page was capped. Re-call with facetOffset advanced by this value to page on. Absent otherwise.
errorNoPresent when the call failed. Absent on success.
facetNoThe facet dimension aggregated.
scopeNoEffective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.
shownNoFacet values returned in this page when the page was capped. Absent otherwise.
countsNoFacet values ranked by count descending — one page of up to facetLimit entries starting at facetOffset, not necessarily the top ones.
noticeNoGuidance when no facet values were returned, a read limit was clamped, a lookahead bucket proves more remain, includeLabels left buckets without a label, an exact-match stateProvince, gadmGid, or recordedBy filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies.
truncatedNoPresent and true only when an extra upstream bucket proves another page exists. Absent on the final page, including an exactly full final page.
facetLimitNoMaximum facet values requested.
facetOffsetNoZero-based offset applied to the ranked facet values.
occurrenceStatusNoThe presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what totalOccurrences and every bucket cover.
totalOccurrencesNoTotal matching occurrences across all facet values.

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial behavior beyond annotations: ranked facet values, pagination via facetLimit/facetOffset, no record payloads, includeLabels cost and deadline, missing-dimension gaps, overlapping buckets for MEDIA_TYPE and RECORDED_BY, and comparability only within the same occurrenceStatus scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and return behavior are front-loaded, and the description is organized logically. It is long, with a filter-list sentence that duplicates the schema, but that length is partly justified by the tool's 26 parameters and complex facet semantics.

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 complex aggregation behavior, rich schema, output schema, and annotations, the description covers what the tool returns, how paging works, when to use it, how to scope it, and important caveats about gaps and overlaps. Nothing essential for correct invocation appears missing.

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 schema already documents all 26 parameters in detail. The description summarizes scoping filters and highlights a few cross-parameter interactions, but most of its parameter guidance repeats what the schema already says.

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 (aggregate), resource (occurrence counts), and dimension-based behavior. It distinguishes the tool from gbif_search_occurrences and gbif_count_occurrences by describing facet aggregation and the oversized-result workaround.

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?

Explicitly names core use cases such as distribution and trend queries, and explains when to use this instead of paging through gbif_search_occurrences. It also clarifies the default occurrenceStatus scope and how to see presence/absence via facet OCCURRENCE_STATUS with occurrenceStatus ANY.

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

gbif_search_datasetsSearch DatasetsA
Read-onlyIdempotent
Inspect

Search GBIF datasets by keyword, type, publishing country (uppercase ISO 3166-1 alpha-2), publishing organization, or hosting organization. The two organization filters answer different questions — publishingOrg matches the organization whose data it is, hostingOrg the organization whose installation serves it — and an organization key from gbif_search_publishers usually wants publishingOrg. Returns dataset title, description, license, record count, DOI, and the publishing organization's key and name; the key goes back in as publishingOrg. Use to find the source dataset behind a set of records, or to explore what data collections are available for a taxon, country, or organization.

NameRequiredDescriptionDefault
qNoFree-text search across dataset title and description. Omit the field to browse without a term — a blank or whitespace-only value is rejected rather than sent, because GBIF answers a blank one with every indexed dataset and a whitespace-only one with none, and neither is the search a caller who filled the field was asking for.
typeNoFilter by dataset type. OCCURRENCE for observation records, CHECKLIST for species lists.
limitNoNumber of datasets to return (default 20, max 1000).
offsetNoPagination offset.
hostingOrgNoUUID (8-4-4-4-12 hex, lowercase — matched case-sensitively, as publishingOrg is) of the organization whose installation serves the dataset — distinct from the organization that published it, which is publishingOrg. Most organizations publish through an installation someone else runs, so a key from gbif_search_publishers matches nothing here for them. Supplied together the two filters are intersected, not combined.
publishingOrgNoUUID (8-4-4-4-12 hex, lowercase — GBIF matches these two keys case-sensitively, so an upper-cased rendering of a real key matches nothing) of the organization that published the dataset — the organization whose data it is, and the question a key from gbif_search_publishers is usually asking. The organization that serves it is hostingOrg, which matches a different set. Supplied together the two filters are intersected, not combined, so the same key in both fields returns only what that organization both published and serves.
publishingCountryNoISO 3166-1 alpha-2 code, uppercase, of the organization that published the dataset (e.g., "GB", "US", "DE", "SE"). Lowercase and alpha-3 forms ("gb", "GBR") match nothing upstream, which is why only the uppercase two-letter form is accepted here — unlike the country filter on gbif_search_publishers, which resolves either form. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets; an uppercase pair GBIF does not assign ("XX") is rejected upstream by name.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
limitNoDatasets returned in this page.
noticeNoGuidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies.
offsetNoCurrent pagination offset.
datasetsNoMatching datasets.
totalCountNoTotal matching datasets before pagination.
endOfRecordsNoTrue when there are no more results after this page.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld, so the bar is low, but the description still adds real behavior: the publishingOrg key round-trips back in as a filter, the two org filters intersect rather than union when combined, and matching is case-sensitive downward. That is non-obvious semantics an agent could not infer from 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, purpose front-loaded, no filler. The middle sentence is dense (two em-dash clarifications plus a return-field list) but every clause carries routing or semantics information; a small trim would make it easier to skim.

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 read-only, zero-required-parameter search tool with a full output schema, the description covers purpose, filter disambiguation, key provenance, and result shape. Nothing an agent needs before calling is missing, and the return-field list is a bonus rather than a necessity.

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

Parameters4/5

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

Schema coverage is 100% and the schema itself is unusually rich, so the baseline is 3. The description still adds value by stating the uppercase ISO 3166-1 alpha-2 requirement, contrasting it with gbif_search_publishers' more lenient resolution, and explaining which of the two org keys a publisher search result usually maps to.

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?

Opens with a specific verb+resource and enumerates the actual filter axes (keyword, type, publishing country, publishing/hosting org), then states the return payload. It clearly separates this from gbif_get_dataset (lookup by key) and gbif_search_publishers (source of org keys), so an agent can route without opening a schema.

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?

Gives two concrete use cases ('find the source dataset behind a set of records', 'explore what data collections are available') and resolves the publishingOrg vs hostingOrg ambiguity with a routing rule pointing at gbif_search_publishers. It stops short of an explicit exclusion (e.g., when to prefer gbif_get_dataset once a key is known), so 4 rather than 5.

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

gbif_search_occurrencesSearch OccurrencesA
Read-onlyIdempotent
Inspect

Search GBIF occurrence records with Darwin Core filters. Use taxonKey from gbif_match_species for reliable results — it resolves synonyms automatically. Accepts country (uppercase ISO 3166-1 alpha-2, where the record was observed), publishingCountry (the publishing organization's country — a different question), stateProvince, gadmGid (a GADM administrative-area code GBIF derives from coordinates), bounding box (decimalLatitude/decimalLongitude ranges), WKT polygon geometry, year range, month, basis of record, coordinate filter, dataset key, catalogNumber, institutionCode, recordedBy (collector), and mediaType. Returns sightings only by default — GBIF also indexes absence records (surveys that looked and found nothing), and occurrenceStatus controls whether they are included. Pagination is capped at offset+limit=100,001 and GBIF offers no cursor or scroll, so a larger result set is covered only by partitioning it — facet it by DATASET_KEY with gbif_occurrence_facets and search each datasetKey separately. BASIS_OF_RECORD and PUBLISHING_COUNTRY are gap-free second cuts for a dataset bucket still over the cap; YEAR, MONTH, STATE_PROVINCE, and SPECIES_KEY lose records lacking that dimension. Repeat every biological filter on the facet call and each partition search, including the same occurrenceStatus, and compare sub-split sums against the bucket total. Bulk retrieval is outside this server: use the asynchronous GBIF Download API with a GBIF.org account or the monthly GBIF Parquet snapshot on AWS Open Data.

NameRequiredDescriptionDefault
yearNoYear or year range. Single year: "2024". Range: "2020,2024". Filters by observation year. Both endpoints inclusive. Omit the field to search every year — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set.
limitNoNumber of records to return (default 20, max 300).
monthNoCalendar month (1–12). Useful for seasonal distribution queries.
offsetNoPagination offset. GBIF serves offset+limit up to 100,001 and rejects anything past it, with no cursor or scroll to continue from. To reach a result set larger than that, split it into per-datasetKey searches using a DATASET_KEY facet from gbif_occurrence_facets — gap-free and high-cardinality, unlike YEAR, which leaves undated records in no bucket — rather than paging deeper.
countryNoISO 3166-1 alpha-2 code, uppercase, of where the occurrence was recorded (e.g., "GB", "US", "DE", "SE"). Not the publisher's country — that is publishingCountry, and the two disagree on most records. Lowercase and alpha-3 forms ("gb", "USA") match nothing upstream, which is why only the uppercase two-letter form is accepted here. Take a value from a COUNTRY facet on gbif_occurrence_facets; an uppercase pair GBIF does not know ("XX") is rejected upstream by name.
gadmGidNoGADM administrative-area GID at any level: country (ESP), state or province (ESP.1_1), county or district (ESP.1.5_1), or municipality (ESP.1.6.3_1). GBIF derives a record's GIDs from its coordinates, so records without coordinates match none, and the unit can differ from the verbatim stateProvince the record carries. Matched exactly and case-sensitively, and a GID holds only uppercase letters, digits, dots, and underscores — any other character is rejected. Take one from a GADM_LEVEL_0_GID, GADM_LEVEL_1_GID, GADM_LEVEL_2_GID, or GADM_LEVEL_3_GID facet on gbif_occurrence_facets, or from the gadm field of gbif_get_occurrence; a well-formed GID GBIF does not hold matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
geometryNoWKT polygon for geographic filtering (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. All supplied spatial filters intersect: decimalLatitude and decimalLongitude remain active and restrict results to the overlap. Omit the field to search everywhere — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set.
taxonKeyNoGBIF backbone taxon key from gbif_match_species. Preferred over scientificName — matches all synonyms automatically. Matches the given taxon and all descendant taxa (subspecies, varieties, etc.).
mediaTypeNoOnly records carrying at least one media item of this type: StillImage (photographs, scans), MovingImage (video), Sound (audio), or InteractiveResource. Records without media are excluded when this is set.
datasetKeyNoRestrict results to a single dataset by its GBIF dataset UUID (8-4-4-4-12 hex). Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet (gbif_occurrence_facets), or the datasetKey field on an occurrence record. Omit the field to search every dataset — an empty string is rejected rather than read as no filter, because GBIF answers a blank datasetKey with the unfiltered result set.
recordedByNoCollector or observer, matched against each name in the record's recordedBy list (GBIF splits it on "|") exactly and case-sensitively: "Charles Darwin" and "charles darwin" differ, and one person written two ways ("Charles Darwin", "Darwin, C.") is two values. Take a value from a RECORDED_BY facet on gbif_occurrence_facets scoped the same way and pass it back unchanged; an unmatched value matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
isInClusterNoFilter to records flagged as likely duplicates (true) or exclude them (false). Omit to include all. Note: GBIF does not expose a cluster identifier — only the membership flag. To de-duplicate, set isInCluster: false to exclude all clustered records.
basisOfRecordNoFilter by how the occurrence was recorded. HUMAN_OBSERVATION covers citizen science. PRESERVED_SPECIMEN covers natural history collections.
catalogNumberNoCatalog number a collection assigned to the specimen or record (e.g. "L.1592880"), matched as the whole value, case-insensitively. Not unique across collections — one number can name records in several datasets, so pair it with institutionCode or datasetKey to single one out. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
hasCoordinateNoWhen true, return only georeferenced records (those with coordinates). When false, return ONLY records without coordinates. Omit the parameter entirely to include all records regardless of coordinate presence.
stateProvinceNoState, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. GBIF stores what each dataset recorded without normalizing it, so there is no vocabulary to guess from: "England", "England - Greater London", and "Greater London" are three distinct values, and "england" is none of them. Take one from a STATE_PROVINCE facet on gbif_occurrence_facets scoped the same way and pass it back unchanged — an unmatched value returns zero records rather than an error. Omit the field to search every state or province — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set. Records carrying no stateProvince match no value, so this cannot partition a scope.
scientificNameNoScientific name filter. Less precise than taxonKey — does not match synonyms. Use taxonKey from gbif_match_species for reliable results. Supplying both does not narrow the search: GBIF combines the two taxon filters with OR, so the result is the union of the two, not their intersection. Omit the field to search every name — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set.
decimalLatitudeNoLatitude range as "min,max" (e.g., "47.0,48.5"). Decimal degrees, WGS84. Combine with decimalLongitude for a bounding box. Omit the field to leave latitude unbounded — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set.
institutionCodeNoCode of the institution holding the record (e.g. "K", "CLO"), matched as the whole value, case-insensitively — part of a code or of a multi-word code matches nothing. An INSTITUTION_CODE facet on gbif_occurrence_facets lists the codes in a scope, lowercased, and this filter takes them unchanged. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.
decimalLongitudeNoLongitude range as "min,max" (e.g., "8.0,9.5"). Decimal degrees, WGS84. Combine with decimalLatitude for a bounding box. Omit the field to leave longitude unbounded — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set.
occurrenceStatusNoPresence/absence filter. Defaults to PRESENT: an ABSENT record documents a survey that looked for the taxon and did not find it, so including one would read as a sighting of the opposite. Use ANY for both (GBIF's own default), or ABSENT for non-observations alone.PRESENT
publishingCountryNoISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — distinct from where the occurrence was observed, which is country. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets. Lowercase and alpha-3 forms ("us", "USA") match nothing upstream, which is why only the uppercase two-letter form is accepted here.
iucnRedListCategoryNoRestrict to records whose taxon carries this IUCN Red List category: CR Critically Endangered, EN Endangered, VU Vulnerable, NT Near Threatened, LC Least Concern, DD Data Deficient, EX Extinct, EW Extinct in the Wild, CD Conservation Dependent. Records with no category are excluded when this is set.
coordinateUncertaintyInMetersNoFilter by coordinate uncertainty radius in meters. Range format: "min,max" (e.g., "0,1000" for sub-kilometer precision). Both endpoints inclusive. Omit the field to accept any uncertainty — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
limitNoRecords returned in this page.
scopeNoEffective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.
noticeNoGuidance when results are empty, paging overshot, a read limit was clamped, the match is larger than the pagination cap can reach, or a presence/absence filter narrowed the result. Absent only when none applies.
offsetNoCurrent pagination offset.
totalCountNoTotal matching occurrences before pagination.
occurrencesNoOccurrence records matching the filters.
endOfRecordsNoTrue when there are no more results after this page.
occurrenceStatusNoThe presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what totalCount and the returned records cover.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, but the description adds operational behavior that matters: default exclusion of absence records, the 100,001 offset+limit cap with no cursor/scroll, and the required partitioning workflow via datasetKey facets. It also explains that filters must be repeated across partition searches and that sums should be reconciled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and then moves through filters, default behavior, pagination limits, partitioning strategy, and bulk alternatives. It is dense but appropriately sized for a 24-parameter tool. The long filter enumeration borders on redundancy with the schema, and bullet-like structure could improve scanability, keeping it from a 5.

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 complex 24-parameter search tool with an output schema, the description covers the necessary operational context: what it returns by default, how absence records behave, the hard pagination limit, how to partition large result sets, and when to leave the server for bulk downloads. Nothing critical for correct invocation appears missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already carries most parameter detail. The description still adds value by surfacing high-impact distinctions in the main text, notably country versus publishingCountry, taxonKey versus scientificName, and the default occurrenceStatus behavior. It does not add much syntax beyond the schema, but it organizes the key semantic traps for the agent.

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 a specific verb and resource: "Search GBIF occurrence records with Darwin Core filters." It names relevant siblings (gbif_match_species, gbif_occurrence_facets) and clearly scopes the tool as occurrence retrieval rather than species matching, dataset lookup, or counting. An agent can distinguish its purpose without opening the schema.

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 routing guidance: use taxonKey from gbif_match_species for synonym-resolving searches, use gbif_occurrence_facets to partition result sets beyond the pagination cap, and use the external GBIF Download API or Parquet snapshot for bulk retrieval. It also states when occurrenceStatus defaults to PRESENT versus when ANY or ABSENT is appropriate.

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

gbif_search_publishersSearch PublishersA
Read-onlyIdempotent
Inspect

Search organizations registered with GBIF by name fragment or country. Returns organization key, title, and country — sufficient to chain into gbif_search_datasets as publishingOrg for the datasets an organization published, or as hostingOrg for the ones its own installation serves, or to understand who publishes data for a region. publishingOrg is the usual chain: most organizations publish through an installation someone else runs, so hostingOrg matches nothing for them.

NameRequiredDescriptionDefault
qNoName fragment to search for. Matches organization names. Omit the field to browse without a term — a blank or whitespace-only value is rejected rather than sent, because the registry answers either with every registered organization.
limitNoNumber of organizations to return (default 20, max 1000).
offsetNoPagination offset.
countryNoISO 3166-1 country code to filter organizations by country. The alpha-2 form ("GB") is canonical; unlike the country codes on the occurrence tools and gbif_search_datasets, this one also resolves the alpha-3 form ("GBR") and is case-insensitive, because the registry endpoint matches the parsed country rather than the string. A value GBIF cannot parse as a country errors rather than returning an empty list. Omit the field to search every country — an empty string is rejected rather than read as no filter, because the registry answers a blank country with every registered organization.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
limitNoOrganizations returned in this page.
noticeNoGuidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies.
offsetNoCurrent pagination offset.
publishersNoMatching organizations.
totalCountNoTotal matching organizations before pagination.
endOfRecordsNoTrue when there are no more results after this page.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint and idempotentHint, so the safety profile is covered. The description adds real value beyond that by describing the return fields and the semantics of the returned key as a chaining identifier. It stops short of any operational behavior (result ordering, what an empty result means, rate limits), so it is a solid but not rich addition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence and the return fields follow immediately. The second sentence is long and packs three use cases plus a caveat into one clause chain, which costs a little readability but each clause carries information an agent needs to chain correctly.

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 an output schema present, the description need not explain return values, yet it still names the key fields that matter for chaining, which is the highest-value information here. Combined with annotations and full schema coverage, an agent has enough to call this correctly; only minor gaps (ordering, empty-result semantics) remain.

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%, including the unusual country-code leniency and the omit-vs-blank-string distinction, so the description does not need to re-document parameters. It adds no parameter-level meaning beyond the schema; its added value is about output chaining rather than inputs. Baseline 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?

States a specific verb and resource ('Search organizations registered with GBIF') plus the two filters that shape the query (name fragment, country). It also names what comes back (organization key, title, country), so the agent knows this is not the dataset search tool in the sibling list.

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?

Explicitly routes the agent forward: use the returned key as publishingOrg or hostingOrg in gbif_search_datasets, and it states which one is the usual chain and why ('most organizations publish through an installation someone else runs, so hostingOrg matches nothing for them'). It also names a third use case, regional publisher discovery. That is genuine when-and-how guidance, not just context.

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

gbif_search_speciesSearch Species TaxonomyA
Read-onlyIdempotent
Inspect

Search or browse the GBIF backbone taxonomy by default, or an explicit checklist datasetKey. Accepts scientific name fragments, rank filters, and higher-taxon constraints. Useful for exploring what species exist under a higher taxon (e.g., "list all families of Coleoptera"), for simple name-fragment searches, or when gbif_match_species returns too narrow a result. kingdom, family, and genus scope the browse to a higher taxon: each is resolved to its backbone key before the search runs, so the narrowest one supplied is what scopes, an alternative name resolves to the taxon it is a synonym of, and a name that matches no backbone taxon at that rank fails rather than returning the whole index. Names are capitalized as GBIF writes them ("Paridae", not "paridae") and are matched exactly, not fuzzily. Paginated — use limit and offset to walk through results.

NameRequiredDescriptionDefault
qNoName fragment to search for. Matches scientific and vernacular names. Omit the field to browse without a name term — a blank or whitespace-only value is rejected rather than sent, because GBIF answers a blank one with the whole name index and a whitespace-only one with nothing, and neither is the search a caller who filled the field was asking for.
rankNoFilter to a specific taxonomic rank.
genusNoScope the search to a genus, by name — "Quercus", "Parus". Resolved to its backbone key before the search runs, and it is the narrowest of the three, so it is what scopes when kingdom or family is supplied too. Matched exactly and capitalized as GBIF writes it; a name shared across kingdoms ("Prunella", "Oenanthe") resolves only when kingdom is supplied with it. Omit the field to browse every genus; a blank or whitespace-only value is rejected rather than dropped.
limitNoNumber of records to return (default 20, max 1000).
familyNoScope the search to a family, by name — "Paridae", "Fagaceae". Resolved to its backbone key before the search runs, so an alternative family name lands on the taxon it is a synonym of ("Compositae" scopes to Asteraceae). Matched exactly and capitalized as GBIF writes it; a name that is not a backbone family fails rather than being ignored. Supplied with genus, it must be that genus's own family. Omit the field to browse every family; a blank or whitespace-only value is rejected rather than dropped.
offsetNoPagination offset.
kingdomNoScope the search to a kingdom, by name — "Animalia", "Plantae", "Fungi". Resolved to its backbone key before the search runs, and matched exactly: capitalize it as GBIF writes it, since "animalia" resolves to nothing. Supplied alongside family or genus it disambiguates that name rather than scoping on its own — "Prunella" alone names both a bird genus and a plant genus and resolves to neither. Omit the field to browse every kingdom; a blank or whitespace-only value is rejected rather than dropped.
isExtinctNoFilter to extinct (true) or extant (false) taxa.
datasetKeyNoScope to a specific checklist dataset UUID (8-4-4-4-12 hex). Omit the field to search the GBIF backbone — an empty string is rejected rather than read as no scope, because GBIF answers a blank datasetKey with the unfiltered backbone result.

Output Schema

NameRequiredDescription
taxaNoMatching taxa.
errorNoPresent when the call failed. Absent on success.
limitNoRecords returned in this page.
noticeNoGuidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies.
offsetNoCurrent pagination offset.
taxonScopeNoThe higher-taxon scope actually applied — which of kingdom, family, or genus scoped the search, the backbone taxon its name resolved to, and that taxon key. Absent when none of the three was supplied.
totalCountNoTotal matches before pagination.
endOfRecordsNoTrue when there are no more results after this page.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered; the description adds genuinely non-obvious behavior: names are matched exactly and case-sensitively as GBIF writes them, alternate names resolve to their synonym taxon, and an unmatched higher-taxon name fails instead of silently returning the whole index. One wobble: it claims 'max 1000' for limit while the schema's maximum is unbounded, a mismatch an agent may trip over.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and use cases, then the scoping/precedence rules, then pagination — a sensible ordering with no filler sentences. It is long, but for a 9-parameter search tool most sentences carry distinct information; a few clauses (the capitalization remark) recur in both description and schema.

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?

An output schema exists, so return values needn't be described, and annotations cover the read-only/idempotent profile. What an agent needs to call this correctly — optionality, scoping precedence, ambiguity resolution, failure modes, and pagination — is all present.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds a rule the schema states only in fragments: of kingdom/family/genus the narrowest supplied is what actually scopes, and kingdom alongside family/genus serves as a disambiguator rather than a scope. That precedence is real added meaning; the rest largely restates schema prose.

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?

Specific verb+resource: searches/browses the GBIF backbone taxonomy or an explicit checklist datasetKey, accepting name fragments, rank filters and higher-taxon constraints. It explicitly contrasts itself with gbif_match_species ('when gbif_match_species returns too narrow a result'), so an agent can separate the two without opening a schema. Scope (whole backbone vs. datasetKey) is stated up front.

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?

Gives concrete use cases (list all families of Coleoptera, simple name-fragment searches, fallback when gbif_match_species is too narrow) plus an operational instruction to page with limit/offset. It does not, however, distinguish itself from gbif_get_species_children or gbif_get_species, which plausibly cover the same 'enumerate taxa under a higher taxon' need — that overlap is left for the agent to guess.

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. 13 tool updates
    • Changedgbif_bulk_match_species5 fields changed
      • changedOutput schema / properties / results / items / properties / confidence / description
        Previous value: -"Match confidence 0–100. Below 80 warrants review. Absent on ERROR."New value: +"Match confidence 0–100. Below 80 warrants review; a HIGHERRANK match can score above 90, so read matchType too. Absent on ERROR."
      • changedOutput schema / properties / results / items / properties / matchType / description
        Previous value: -"EXACT, FUZZY, or HIGHERRANK for a match; NONE when GBIF found no usable match; ERROR when the lookup itself failed for this name (see error)."New value: +"EXACT or FUZZY for a match; HIGHERRANK when GBIF matched at a higher rank — a misspelled species falls back to its genus or kingdom, and a bare genus name carries it too — so taxonKey covers that whole taxon, or its accepted taxon when it is a synonym (see note); NONE when GBIF found no usable match; ERROR when the lookup itself failed for this name (see error)."
      • addedOutput schema / properties / results / items / properties / note
        Added value: +{
        +  "description": "On HIGHERRANK, names the taxon and rank GBIF matched and what taxonKey covers: that whole taxon, or its accepted taxon when it is a synonym. On NONE, GBIF's own explanation when it gave one — for a name shared across kingdoms, its report of several equal matches, with a pointer to retry that name through gbif_match_species with kingdom. Absent on EXACT, FUZZY, and ERROR entries, and on a NONE GBIF did not explain.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / properties / reason / description
        Previous value: -"Machine-readable failure identifier when matchType is ERROR — e.g. invalid_filter when GBIF rejected a supplied value. Absent when the failure carried no classification, and absent on every non-ERROR entry."New value: +"Machine-readable failure identifier when matchType is ERROR and the failure was classified. Absent when the failure carried no classification, and absent on every non-ERROR entry."
      • changedOutput schema / properties / results / items / properties / taxonKey / description
        Previous value: -"GBIF backbone taxon key to pass to gbif_search_occurrences, gbif_count_occurrences, and gbif_occurrence_facets — the accepted taxon's key when this name is a synonym, otherwise the matched taxon's own key. Absent when matchType is NONE or ERROR."New value: +"GBIF backbone taxon key to pass to gbif_search_occurrences, gbif_count_occurrences, and gbif_occurrence_facets — the accepted taxon's key when the name GBIF matched is a synonym, otherwise the matched taxon's own key. Absent when matchType is NONE or ERROR."
    • Changedgbif_count_occurrences11 fields changed
      • addedInput schema / properties / catalogNumber
        Added value: +{
        +  "description": "Catalog number a collection assigned to the specimen or record (e.g. \"L.1592880\"), matched as the whole value, case-insensitively. Not unique across collections — one number can name records in several datasets, so pair it with institutionCode or datasetKey to single one out. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / gadmGid
        Added value: +{
        +  "description": "GADM administrative-area GID at any level: country (ESP), state or province (ESP.1_1), county or district (ESP.1.5_1), or municipality (ESP.1.6.3_1). GBIF derives a record's GIDs from its coordinates, so records without coordinates match none, and the unit can differ from the verbatim stateProvince the record carries. Matched exactly and case-sensitively, and a GID holds only uppercase letters, digits, dots, and underscores — any other character is rejected. Take one from a GADM_LEVEL_0_GID, GADM_LEVEL_1_GID, GADM_LEVEL_2_GID, or GADM_LEVEL_3_GID facet on gbif_occurrence_facets, or from the gadm field of gbif_get_occurrence; a well-formed GID GBIF does not hold matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / institutionCode
        Added value: +{
        +  "description": "Code of the institution holding the record (e.g. \"K\", \"CLO\"), matched as the whole value, case-insensitively — part of a code or of a multi-word code matches nothing. An INSTITUTION_CODE facet on gbif_occurrence_facets lists the codes in a scope, lowercased, and this filter takes them unchanged. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mediaType
        Added value: +{
        +  "description": "Only records carrying at least one media item of this type: StillImage (photographs, scans), MovingImage (video), Sound (audio), or InteractiveResource. Records without media are excluded when this is set.",
        +  "enum": [
        +    "StillImage",
        +    "MovingImage",
        +    "Sound",
        +    "InteractiveResource"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / month / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / recordedBy
        Added value: +{
        +  "description": "Collector or observer, matched against each name in the record's recordedBy list (GBIF splits it on \"|\") exactly and case-sensitively: \"Charles Darwin\" and \"charles darwin\" differ, and one person written two ways (\"Charles Darwin\", \"Darwin, C.\") is two values. Take a value from a RECORDED_BY facet on gbif_occurrence_facets scoped the same way and pass it back unchanged; an unmatched value matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / taxonKey / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / taxonKey / minimum
        Added value: +0
      • changedInput schema / properties / taxonKey / type
        Previous value: -"number"New value: +"integer"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A filter was supplied blank or whitespace-only, hasCoordinate conflicts with isGeoreferenced, datasetKey is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected another filter value as malformed. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A string filter other than country and publishingCountry was supplied blank or whitespace-only (a blank country or publishingCountry fails earlier, at its uppercase pattern, as -32602 invalid_arguments), hasCoordinate conflicts with isGeoreferenced, datasetKey is not an 8-4-4-4-12 hex UUID, gadmGid holds a character other than an uppercase letter, digit, dot, or underscore, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected another filter value as malformed. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when the count is zero under a verbatim stateProvince filter, larger than gbif_search_occurrences can page to, or narrowed by a presence/absence filter. Absent when none applies."New value: +"Guidance when the count is zero under an exact-match stateProvince, gadmGid, or recordedBy filter, larger than gbif_search_occurrences can page to, or narrowed by a presence/absence filter. Absent when none applies."
    • Changedgbif_get_dataset1 field changed
      • addedOutput schema / properties / publishingOrganizationKey
        Added value: +{
        +  "description": "UUID of the organization that published the dataset. Pass it to gbif_search_datasets as publishingOrg for every dataset this organization published; gbif_search_datasets rows also carry the organization's name. Absent when GBIF omits it.",
        +  "type": "string"
        +}
    • Changedgbif_get_occurrence9 fields changed
      • addedInput schema / properties / occurrenceKey / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / occurrenceKey / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / occurrenceKey / type
        Previous value: -"number"New value: +"integer"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The occurrenceKey does not exist in GBIF. `invalid_filter`: GBIF rejected the occurrenceKey as unparseable — a fraction, or a value past the largest integer the endpoint accepts. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The occurrenceKey does not exist in GBIF. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_found",
        -  "invalid_filter"
        -]New value: +[
        +  "not_found"
        +]
      • changedOutput schema / properties / gadm / properties / level0 / properties / gid / description
        Previous value: -"GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). May be absent."New value: +"GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). Pass it as gadmGid to gbif_search_occurrences, gbif_count_occurrences, or gbif_occurrence_facets to filter on this unit. May be absent."
      • changedOutput schema / properties / gadm / properties / level1 / properties / gid / description
        Previous value: -"GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). May be absent."New value: +"GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). Pass it as gadmGid to gbif_search_occurrences, gbif_count_occurrences, or gbif_occurrence_facets to filter on this unit. May be absent."
      • changedOutput schema / properties / gadm / properties / level2 / properties / gid / description
        Previous value: -"GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). May be absent."New value: +"GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). Pass it as gadmGid to gbif_search_occurrences, gbif_count_occurrences, or gbif_occurrence_facets to filter on this unit. May be absent."
      • changedOutput schema / properties / gadm / properties / level3 / properties / gid / description
        Previous value: -"GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). May be absent."New value: +"GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). Pass it as gadmGid to gbif_search_occurrences, gbif_count_occurrences, or gbif_occurrence_facets to filter on this unit. May be absent."
    • Changedgbif_get_species5 fields changed
      • addedInput schema / properties / taxonKey / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / taxonKey / minimum
        Added value: +0
      • changedInput schema / properties / taxonKey / type
        Previous value: -"number"New value: +"integer"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a fraction, or a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / numOccurrences / description
        Previous value: -"Occurrence record count in GBIF."New value: +"Occurrence record count, when GBIF includes one. Its taxon record endpoint does not, so this is normally absent — count with gbif_count_occurrences and the taxonKey instead."
    • Changedgbif_get_species_children9 fields changed
      • addedInput schema / properties / limit / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / offset / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / taxonKey / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / taxonKey / minimum
        Added value: +0
      • changedInput schema / properties / taxonKey / type
        Previous value: -"number"New value: +"integer"
      • changedOutput schema / properties / children / items / properties / numOccurrences / description
        Previous value: -"Occurrence record count."New value: +"Occurrence record count, present only when GBIF supplies one. GBIF's children listing does not, so this is normally absent; for a count, pass key as taxonKey to gbif_count_occurrences."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a fraction, or a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler."
    • Changedgbif_get_species_classification4 fields changed
      • addedInput schema / properties / taxonKey / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / taxonKey / minimum
        Added value: +0
      • changedInput schema / properties / taxonKey / type
        Previous value: -"number"New value: +"integer"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a fraction, or a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler."
    • Changedgbif_match_species5 fields changed
      • changedOutput schema / properties / confidence / description
        Previous value: -"Match confidence score 0–100. Below 80 warrants review."New value: +"Match confidence score 0–100. Below 80 warrants review. A HIGHERRANK match can score above 90, so read matchType too."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_match`: matchType is NONE — no candidate met the match threshold. `invalid_filter`: kingdom was supplied blank or whitespace-only, which disambiguates nothing. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_match`: matchType is NONE — no candidate met the match threshold, or several equal candidates tied; the message then carries GBIF's note. `invalid_filter`: kingdom was supplied blank or whitespace-only, which disambiguates nothing. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / matchType / description
        Previous value: -"EXACT, FUZZY, HIGHERRANK, or NONE. NONE means no usable match."New value: +"EXACT, FUZZY, HIGHERRANK, or NONE. HIGHERRANK means GBIF matched at a higher rank — a misspelled species falls back to its genus or kingdom, and a bare genus name carries it too — and taxonKey covers that whole taxon, or its accepted taxon when it is a synonym. NONE means no usable match."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when the queried name was a synonym and taxonKey was resolved to the accepted taxon. Absent when the matched name is already the accepted one."New value: +"Guidance when matchType is HIGHERRANK — naming the taxon and rank GBIF matched and what taxonKey covers — or when the matched name was a synonym and taxonKey was resolved to the accepted taxon. A higher-rank match on a synonym carries both. Absent on an EXACT or FUZZY match of an accepted name."
      • changedOutput schema / properties / taxonKey / description
        Previous value: -"GBIF backbone taxon key to pass to downstream tools. The accepted taxon's key when the queried name is a synonym, otherwise the matched taxon's own key."New value: +"GBIF backbone taxon key to pass to downstream tools. The accepted taxon's key when the name GBIF matched is a synonym, otherwise the matched taxon's own key."
    • Changedgbif_occurrence_facets19 fields changed
      • addedInput schema / properties / catalogNumber
        Added value: +{
        +  "description": "Catalog number a collection assigned to the specimen or record (e.g. \"L.1592880\"), matched as the whole value, case-insensitively. Not unique across collections — one number can name records in several datasets, so pair it with institutionCode or datasetKey to single one out. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • changedInput schema / properties / facet / description
        Previous value: -"Dimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY, OCCURRENCE_STATUS, IUCN_RED_LIST_CATEGORY). DATASET_KEY is the first cut when a result set is too large to page: every occurrence carries exactly one datasetKey, so its buckets cover totalOccurrences with no gap or overlap. BASIS_OF_RECORD and PUBLISHING_COUNTRY are gap-free second cuts for a dataset bucket still too large; both have a matching filter on the occurrence tools. A dimension a record can lack drops that record from every bucket: YEAR loses undated records; MONTH, STATE_PROVINCE, and SPECIES_KEY lose records lacking that dimension, even where the occurrence tools can filter on it. Sums are comparable only across the same occurrenceStatus scope."New value: +"Dimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY, OCCURRENCE_STATUS, IUCN_RED_LIST_CATEGORY). DATASET_KEY is the first cut when a result set is too large to page: every occurrence carries exactly one datasetKey, so its buckets cover totalOccurrences with no gap or overlap. BASIS_OF_RECORD and PUBLISHING_COUNTRY are gap-free second cuts for a dataset bucket still too large; both have a matching filter on the occurrence tools. A dimension a record can lack drops that record from every bucket: YEAR loses undated records; MONTH, STATE_PROVINCE, SPECIES_KEY, INSTITUTION_CODE, MEDIA_TYPE, and RECORDED_BY lose records lacking that dimension; GADM_LEVEL_0_GID, GADM_LEVEL_1_GID, GADM_LEVEL_2_GID, and GADM_LEVEL_3_GID lose records without coordinates or outside every GADM unit at that level — each even where the occurrence tools can filter on it. MEDIA_TYPE and RECORDED_BY buckets also overlap: a record with two media types or two collectors counts in each, so their sums can exceed totalOccurrences. GADM buckets are GIDs to pass back as gadmGid; INSTITUTION_CODE buckets come back lowercased and institutionCode takes them unchanged; RECORDED_BY buckets are the exact spellings recordedBy matches. Sums are comparable only across the same occurrenceStatus scope."
      • changedInput schema / properties / facet / enum
        Previous value: -[
        -  "BASIS_OF_RECORD",
        -  "COUNTRY",
        -  "STATE_PROVINCE",
        -  "YEAR",
        -  "DATASET_KEY",
        -  "KINGDOM_KEY",
        -  "PHYLUM_KEY",
        -  "CLASS_KEY",
        -  "ORDER_KEY",
        -  "FAMILY_KEY",
        -  "GENUS_KEY",
        -  "SPECIES_KEY",
        -  "PUBLISHING_COUNTRY",
        -  "MONTH",
        -  "OCCURRENCE_STATUS",
        -  "IUCN_RED_LIST_CATEGORY"
        -]New value: +[
        +  "BASIS_OF_RECORD",
        +  "COUNTRY",
        +  "STATE_PROVINCE",
        +  "YEAR",
        +  "DATASET_KEY",
        +  "KINGDOM_KEY",
        +  "PHYLUM_KEY",
        +  "CLASS_KEY",
        +  "ORDER_KEY",
        +  "FAMILY_KEY",
        +  "GENUS_KEY",
        +  "SPECIES_KEY",
        +  "PUBLISHING_COUNTRY",
        +  "MONTH",
        +  "OCCURRENCE_STATUS",
        +  "IUCN_RED_LIST_CATEGORY",
        +  "GADM_LEVEL_0_GID",
        +  "GADM_LEVEL_1_GID",
        +  "GADM_LEVEL_2_GID",
        +  "GADM_LEVEL_3_GID",
        +  "INSTITUTION_CODE",
        +  "MEDIA_TYPE",
        +  "RECORDED_BY"
        +]
      • addedInput schema / properties / facetLimit / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / facetLimit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / facetOffset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / facetOffset / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / gadmGid
        Added value: +{
        +  "description": "GADM administrative-area GID at any level: country (ESP), state or province (ESP.1_1), county or district (ESP.1.5_1), or municipality (ESP.1.6.3_1). GBIF derives a record's GIDs from its coordinates, so records without coordinates match none, and the unit can differ from the verbatim stateProvince the record carries. Matched exactly and case-sensitively, and a GID holds only uppercase letters, digits, dots, and underscores — any other character is rejected. Take one from a GADM_LEVEL_0_GID, GADM_LEVEL_1_GID, GADM_LEVEL_2_GID, or GADM_LEVEL_3_GID facet on gbif_occurrence_facets, or from the gadm field of gbif_get_occurrence; a well-formed GID GBIF does not hold matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / includeLabels
        Added value: +{
        +  "default": false,
        +  "description": "True names the taxon or dataset behind each bucket on the returned page with a label: the canonicalName for a KINGDOM_KEY, PHYLUM_KEY, CLASS_KEY, ORDER_KEY, FAMILY_KEY, GENUS_KEY, or SPECIES_KEY bucket, the dataset title for a DATASET_KEY bucket. Costs one extra GBIF request per bucket, up to facetLimit, all bounded by one 10 s deadline; a bucket whose lookup fails or misses it comes back without a label and is counted in notice. Every other dimension ignores it. Leave it false when keys are enough, as when partitioning by DATASET_KEY.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / institutionCode
        Added value: +{
        +  "description": "Code of the institution holding the record (e.g. \"K\", \"CLO\"), matched as the whole value, case-insensitively — part of a code or of a multi-word code matches nothing. An INSTITUTION_CODE facet on gbif_occurrence_facets lists the codes in a scope, lowercased, and this filter takes them unchanged. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mediaType
        Added value: +{
        +  "description": "Only records carrying at least one media item of this type: StillImage (photographs, scans), MovingImage (video), Sound (audio), or InteractiveResource. Records without media are excluded when this is set.",
        +  "enum": [
        +    "StillImage",
        +    "MovingImage",
        +    "Sound",
        +    "InteractiveResource"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / month / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / recordedBy
        Added value: +{
        +  "description": "Collector or observer, matched against each name in the record's recordedBy list (GBIF splits it on \"|\") exactly and case-sensitively: \"Charles Darwin\" and \"charles darwin\" differ, and one person written two ways (\"Charles Darwin\", \"Darwin, C.\") is two values. Take a value from a RECORDED_BY facet on gbif_occurrence_facets scoped the same way and pass it back unchanged; an unmatched value matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / taxonKey / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / taxonKey / minimum
        Added value: +0
      • changedInput schema / properties / taxonKey / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / counts / items / properties / label
        Added value: +{
        +  "description": "Name of the taxon (its canonicalName) or dataset (its title) the key identifies. Present only with includeLabels on a KINGDOM_KEY through SPECIES_KEY or DATASET_KEY facet, and only when the lookup for this bucket succeeded.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A scope filter was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected another filter as malformed. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A string scope filter other than country and publishingCountry was supplied blank or whitespace-only (a blank country or publishingCountry fails earlier, at its uppercase pattern, as -32602 invalid_arguments), datasetKey is not an 8-4-4-4-12 hex UUID, gadmGid holds a character other than an uppercase letter, digit, dot, or underscore, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected another filter as malformed. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no facet values were returned, a read limit was clamped, a lookahead bucket proves more remain, a verbatim stateProvince filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."New value: +"Guidance when no facet values were returned, a read limit was clamped, a lookahead bucket proves more remain, includeLabels left buckets without a label, an exact-match stateProvince, gadmGid, or recordedBy filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."
    • Changedgbif_search_datasets8 fields changed
      • addedInput schema / properties / limit / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / offset / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / q / description
        Previous value: -"Free-text search across dataset title and description. Omit the field to browse without a term — a blank or whitespace-only value is rejected rather than sent, because GBIF answers a blank one with all 123,527 indexed datasets and a whitespace-only one with none, and neither is the search a caller who filled the field was asking for."New value: +"Free-text search across dataset title and description. Omit the field to browse without a term — a blank or whitespace-only value is rejected rather than sent, because GBIF answers a blank one with every indexed dataset and a whitespace-only one with none, and neither is the search a caller who filled the field was asking for."
      • addedOutput schema / properties / datasets / items / properties / publishingOrganizationKey
        Added value: +{
        +  "description": "UUID of the organization that published the dataset. Pass it back to gbif_search_datasets as publishingOrg for every dataset this organization published. Absent when GBIF omits it.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / datasets / items / properties / publishingOrganizationTitle
        Added value: +{
        +  "description": "Name of the organization that published the dataset, as GBIF records it. Absent when GBIF omits it.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A filter was supplied blank or whitespace-only, publishingOrg or hostingOrg is not a lowercase 8-4-4-4-12 hex UUID, publishingCountry is a two-letter code GBIF does not assign, or GBIF rejected another filter value as malformed. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A string filter other than publishingCountry was supplied blank or whitespace-only (a blank publishingCountry fails earlier, at its uppercase pattern, as -32602 invalid_arguments), publishingOrg or hostingOrg is not a lowercase 8-4-4-4-12 hex UUID, publishingCountry is a two-letter code GBIF does not assign, or GBIF rejected another filter value as malformed. Other values are possible when a failure originates below the handler."
    • Changedgbif_search_occurrences16 fields changed
      • addedInput schema / properties / catalogNumber
        Added value: +{
        +  "description": "Catalog number a collection assigned to the specimen or record (e.g. \"L.1592880\"), matched as the whole value, case-insensitively. Not unique across collections — one number can name records in several datasets, so pair it with institutionCode or datasetKey to single one out. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / gadmGid
        Added value: +{
        +  "description": "GADM administrative-area GID at any level: country (ESP), state or province (ESP.1_1), county or district (ESP.1.5_1), or municipality (ESP.1.6.3_1). GBIF derives a record's GIDs from its coordinates, so records without coordinates match none, and the unit can differ from the verbatim stateProvince the record carries. Matched exactly and case-sensitively, and a GID holds only uppercase letters, digits, dots, and underscores — any other character is rejected. Take one from a GADM_LEVEL_0_GID, GADM_LEVEL_1_GID, GADM_LEVEL_2_GID, or GADM_LEVEL_3_GID facet on gbif_occurrence_facets, or from the gadm field of gbif_get_occurrence; a well-formed GID GBIF does not hold matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / institutionCode
        Added value: +{
        +  "description": "Code of the institution holding the record (e.g. \"K\", \"CLO\"), matched as the whole value, case-insensitively — part of a code or of a multi-word code matches nothing. An INSTITUTION_CODE facet on gbif_occurrence_facets lists the codes in a scope, lowercased, and this filter takes them unchanged. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / mediaType
        Added value: +{
        +  "description": "Only records carrying at least one media item of this type: StillImage (photographs, scans), MovingImage (video), Sound (audio), or InteractiveResource. Records without media are excluded when this is set.",
        +  "enum": [
        +    "StillImage",
        +    "MovingImage",
        +    "Sound",
        +    "InteractiveResource"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / month / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / offset / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / recordedBy
        Added value: +{
        +  "description": "Collector or observer, matched against each name in the record's recordedBy list (GBIF splits it on \"|\") exactly and case-sensitively: \"Charles Darwin\" and \"charles darwin\" differ, and one person written two ways (\"Charles Darwin\", \"Darwin, C.\") is two values. Take a value from a RECORDED_BY facet on gbif_occurrence_facets scoped the same way and pass it back unchanged; an unmatched value matches zero records rather than erroring. Omit the field to leave it unfiltered — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered scope.",
        +  "type": "string"
        +}
      • addedInput schema / properties / taxonKey / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / taxonKey / minimum
        Added value: +0
      • changedInput schema / properties / taxonKey / type
        Previous value: -"number"New value: +"integer"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `pagination_cap_exceeded`: offset + limit exceeds 100,001, the deepest page GBIF serves. `invalid_filter`: A filter value is unusable — any filter supplied blank or whitespace-only, a datasetKey that is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code GBIF does not know, or a WKT geometry or range GBIF rejects. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `pagination_cap_exceeded`: offset + limit exceeds 100,001, the deepest page GBIF serves. `invalid_filter`: A filter value is unusable — a string filter other than country and publishingCountry supplied blank or whitespace-only (a blank country or publishingCountry fails earlier, at its uppercase pattern, as -32602 invalid_arguments), a datasetKey that is not an 8-4-4-4-12 hex UUID, a gadmGid holding a character other than an uppercase letter, digit, dot, or underscore, a two-letter country or publishingCountry code GBIF does not know, or a WKT geometry or range GBIF rejects. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / occurrences / items / properties / catalogNumber
        Added value: +{
        +  "description": "Catalog number the holding collection assigned — the value the catalogNumber filter matches. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / occurrences / items / properties / institutionCode
        Added value: +{
        +  "description": "Code of the institution holding the record — the value the institutionCode filter matches. May be absent.",
        +  "type": "string"
        +}
    • Changedgbif_search_publishers6 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 country code to filter organizations by country. The alpha-2 form (\"GB\") is canonical; unlike the country codes on the occurrence tools and gbif_search_datasets, this one also resolves the alpha-3 form (\"GBR\") and is case-insensitive, because the registry endpoint matches the parsed country rather than the string. A value GBIF cannot parse as a country errors rather than returning an empty list. Omit the field to search every country — an empty string is rejected rather than read as no filter, because the registry answers a blank country with all 3,561 organizations."New value: +"ISO 3166-1 country code to filter organizations by country. The alpha-2 form (\"GB\") is canonical; unlike the country codes on the occurrence tools and gbif_search_datasets, this one also resolves the alpha-3 form (\"GBR\") and is case-insensitive, because the registry endpoint matches the parsed country rather than the string. A value GBIF cannot parse as a country errors rather than returning an empty list. Omit the field to search every country — an empty string is rejected rather than read as no filter, because the registry answers a blank country with every registered organization."
      • addedInput schema / properties / limit / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / offset / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / q / description
        Previous value: -"Name fragment to search for. Matches organization names. Omit the field to browse without a term — a blank or whitespace-only value is rejected rather than sent, because the registry answers either with all 3,561 registered organizations."New value: +"Name fragment to search for. Matches organization names. Omit the field to browse without a term — a blank or whitespace-only value is rejected rather than sent, because the registry answers either with every registered organization."
    • Changedgbif_search_species8 fields changed
      • addedInput schema / properties / limit / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / offset / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / q / description
        Previous value: -"Name fragment to search for. Matches scientific and vernacular names. Omit the field to browse without a name term — a blank or whitespace-only value is rejected rather than sent, because GBIF answers a blank one with the whole 46,623,754-name index and a whitespace-only one with nothing, and neither is the search a caller who filled the field was asking for."New value: +"Name fragment to search for. Matches scientific and vernacular names. Omit the field to browse without a name term — a blank or whitespace-only value is rejected rather than sent, because GBIF answers a blank one with the whole name index and a whitespace-only one with nothing, and neither is the search a caller who filled the field was asking for."
      • changedOutput schema / properties / taxa / items / description
        Previous value: -"A checklist taxon usage with classification, status, and occurrence counts."New value: +"A checklist taxon usage with classification, status, common name, and descendant count."
      • changedOutput schema / properties / taxa / items / properties / numOccurrences / description
        Previous value: -"Occurrence record count in GBIF."New value: +"Occurrence record count, present only when GBIF supplies a positive value. GBIF's species search sends 0 on every row as a placeholder, so this is normally absent; for a count, pass nubKey as taxonKey to gbif_count_occurrences, or facet by SPECIES_KEY with gbif_occurrence_facets."
      • changedOutput schema / properties / taxa / items / properties / vernacularName / description
        Previous value: -"Common name when available."New value: +"Common name. GBIF's own vernacularName when the row carries one. Otherwise one of the row's English (eng) vernacular names: the first that contains q, case-insensitively, when q is set and does not occur in the row's canonicalName or scientificName; else the first English one. Absent when the row carries neither."
  2. 9 tool updates
    • Changedgbif_bulk_match_species5 fields changed
      • changedInput schema / properties / names / description
        Previous value: -"Scientific names to match against the GBIF backbone. 1–50 per call, matched in parallel."New value: +"Scientific names to match against the GBIF backbone. Up to 50 are matched in parallel; additional names are returned in unprocessedNames when read-limit clamping is enabled (default). Every submitted name must be valid."
      • removedInput schema / properties / names / maxItems
        Removed value: -50
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Requested and applied batch size when names exceed the 50-name workload cap.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / description
        Previous value: -"One result per input name, in input order."New value: +"One result per processed input name, in input order (at most 50)."
      • addedOutput schema / properties / unprocessedNames
        Added value: +{
        +  "description": "Names beyond the first 50, in original order including duplicates. Submit these names in another call. Absent when every name was processed.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedgbif_count_occurrences1 field changed
      • changedInput schema / properties / publishingCountry / description
        Previous value: -"ISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — not where the occurrence was observed, which is country. The two differ constantly: of 60,290,950 records observed in GB, 1,548,928 were published by US organizations. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets. Lowercase and alpha-3 forms (\"us\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here."New value: +"ISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — distinct from where the occurrence was observed, which is country. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets. Lowercase and alpha-3 forms (\"us\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here."
    • Changedgbif_get_dataset10 fields changed
      • changedInput schema / properties / contactLimit / maximum
        Previous value: -100New value: +9007199254740991
      • changedOutput schema / properties / notice / description
        Previous value: -"How to reach the contacts contactLimit held back. Absent when every contact was returned."New value: +"How to reach contacts held back, or requested/applied values when contactLimit was clamped. Absent when neither applies."
      • addedOutput schema / properties / recordCountNotice
        Added value: +{
        +  "description": "Explains an unavailable supplementary count and how to retry. Absent after a successful lookup or a declared count.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / temporalCoverageNotice
        Added value: +{
        +  "description": "Discloses unsupported or unusable temporal entries omitted from the response. May be absent.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / temporalCoverages / description
        Previous value: -"Temporal coverage ranges declared by the dataset. May be absent."New value: +"Temporal coverage declared by the dataset, preserving supplied dates and verbatim periods. May be absent."
      • changedOutput schema / properties / temporalCoverages / items / description
        Previous value: -"A temporal coverage range."New value: +"A temporal coverage range, single date, or verbatim period."
      • addedOutput schema / properties / temporalCoverages / items / properties / @type
        Added value: +{
        +  "description": "GBIF coverage representation: range, single, or verbatim. May be absent on legacy ranges.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / temporalCoverages / items / properties / date
        Added value: +{
        +  "description": "Single coverage date as supplied by GBIF. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / temporalCoverages / items / properties / period
        Added value: +{
        +  "description": "Verbatim coverage period. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / temporalCoverages / items / properties / type
        Added value: +{
        +  "description": "Verbatim period type. May be absent.",
        +  "type": "string"
        +}
    • Changedgbif_get_species_children2 fields changed
      • removedInput schema / properties / limit / maximum
        Removed value: -1000
      • changedOutput schema / properties / notice / description
        Previous value: -"Agent guidance — a no-children note for a valid taxon, or a pagination note when the page was capped. Absent on a complete single page."New value: +"Guidance when a valid taxon has no children, more pages remain, or an oversized limit was clamped. Absent when none applies."
    • Changedgbif_occurrence_facets3 fields changed
      • changedInput schema / properties / facet / description
        Previous value: -"Dimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY, OCCURRENCE_STATUS, IUCN_RED_LIST_CATEGORY). DATASET_KEY is the dimension to split on when a result set is too large to page: every occurrence carries exactly one datasetKey, so its buckets sum to totalOccurrences with no gap and no overlap, and it has the cardinality to cut a large scope into pageable pieces. BASIS_OF_RECORD and PUBLISHING_COUNTRY are gap-free too and both have a matching filter on the occurrence tools, so either can drive a further split of a bucket still too large — but on that same scope they return 9 and 41 buckets against DATASET_KEY's 550, so neither replaces it as the first cut. A dimension a record can lack silently drops that record: faceting one 60,290,950-record scope by YEAR returned 224 buckets summing to 59,407,400, leaving 883,550 undated records in no bucket at all, and MONTH, STATE_PROVINCE, and SPECIES_KEY lose records the same way — stateProvince included, even though the occurrence tools can now filter on it. Sums are comparable only across the same occurrenceStatus scope."New value: +"Dimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY, OCCURRENCE_STATUS, IUCN_RED_LIST_CATEGORY). DATASET_KEY is the first cut when a result set is too large to page: every occurrence carries exactly one datasetKey, so its buckets cover totalOccurrences with no gap or overlap. BASIS_OF_RECORD and PUBLISHING_COUNTRY are gap-free second cuts for a dataset bucket still too large; both have a matching filter on the occurrence tools. A dimension a record can lack drops that record from every bucket: YEAR loses undated records; MONTH, STATE_PROVINCE, and SPECIES_KEY lose records lacking that dimension, even where the occurrence tools can filter on it. Sums are comparable only across the same occurrenceStatus scope."
      • removedInput schema / properties / facetLimit / maximum
        Removed value: -100
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no facet values were returned, a lookahead bucket proves more remain, a verbatim stateProvince filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."New value: +"Guidance when no facet values were returned, a read limit was clamped, a lookahead bucket proves more remain, a verbatim stateProvince filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."
    • Changedgbif_search_datasets4 fields changed
      • changedInput schema / properties / hostingOrg / description
        Previous value: -"UUID (8-4-4-4-12 hex, lowercase — matched case-sensitively, as publishingOrg is) of the organization whose installation serves the dataset — not the organization that published it, which is publishingOrg. Most organizations publish through an installation someone else runs, so a key from gbif_search_publishers matches nothing here for them: of the first 25 GB organizations the registry lists, all 25 host no datasets while 13 publish one or two. Supplied together the two filters are intersected, not combined."New value: +"UUID (8-4-4-4-12 hex, lowercase — matched case-sensitively, as publishingOrg is) of the organization whose installation serves the dataset — distinct from the organization that published it, which is publishingOrg. Most organizations publish through an installation someone else runs, so a key from gbif_search_publishers matches nothing here for them. Supplied together the two filters are intersected, not combined."
      • removedInput schema / properties / limit / maximum
        Removed value: -1000
      • changedInput schema / properties / publishingOrg / description
        Previous value: -"UUID (8-4-4-4-12 hex, lowercase — GBIF matches these two keys case-sensitively, so an upper-cased rendering of a real key matches nothing) of the organization that published the dataset — the organization whose data it is, and the question a key from gbif_search_publishers is usually asking. Not the organization that serves it, which is hostingOrg and matches a different set: Butterfly Conservation (0d72dd7f-6f05-46af-85c2-8b6e77ce5534) publishes 3 datasets and hosts none, while the National Biodiversity Network (07f617d0-c688-11d8-bf62-b8a03c50a862) hosts 984 — those 3 among them — and publishes 1. Supplied together the two filters are intersected, not combined, so the same key in both fields returns only what that organization both published and serves."New value: +"UUID (8-4-4-4-12 hex, lowercase — GBIF matches these two keys case-sensitively, so an upper-cased rendering of a real key matches nothing) of the organization that published the dataset — the organization whose data it is, and the question a key from gbif_search_publishers is usually asking. The organization that serves it is hostingOrg, which matches a different set. Supplied together the two filters are intersected, not combined, so the same key in both fields returns only what that organization both published and serves."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty or paging overshot. Absent on successful result pages."New value: +"Guidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies."
    • Changedgbif_search_occurrences3 fields changed
      • removedInput schema / properties / limit / maximum
        Removed value: -300
      • changedInput schema / properties / publishingCountry / description
        Previous value: -"ISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — not where the occurrence was observed, which is country. The two differ constantly: of 60,290,950 records observed in GB, 1,548,928 were published by US organizations. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets. Lowercase and alpha-3 forms (\"us\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here."New value: +"ISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — distinct from where the occurrence was observed, which is country. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets. Lowercase and alpha-3 forms (\"us\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty, paging overshot, the match is larger than the pagination cap can reach, or a presence/absence filter narrowed the result. Absent only when none applies."New value: +"Guidance when results are empty, paging overshot, a read limit was clamped, the match is larger than the pagination cap can reach, or a presence/absence filter narrowed the result. Absent only when none applies."
    • Changedgbif_search_publishers2 fields changed
      • removedInput schema / properties / limit / maximum
        Removed value: -1000
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty or paging overshot. Absent on successful result pages."New value: +"Guidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies."
    • Changedgbif_search_species2 fields changed
      • removedInput schema / properties / limit / maximum
        Removed value: -1000
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty or paging overshot. Absent on successful result pages."New value: +"Guidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies."
  3. 4 tool updates
    • Changedgbif_count_occurrences13 fields changed
      • addedInput schema / properties / basisOfRecord
        Added value: +{
        +  "description": "Filter by how the occurrence was recorded; accepts every GBIF BasisOfRecord vocabulary member.",
        +  "enum": [
        +    "HUMAN_OBSERVATION",
        +    "MACHINE_OBSERVATION",
        +    "PRESERVED_SPECIMEN",
        +    "LIVING_SPECIMEN",
        +    "MATERIAL_SAMPLE",
        +    "MATERIAL_CITATION",
        +    "OCCURRENCE",
        +    "LITERATURE",
        +    "FOSSIL_SPECIMEN",
        +    "OBSERVATION",
        +    "UNKNOWN"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / coordinateUncertaintyInMeters
        Added value: +{
        +  "description": "Coordinate uncertainty radius in meters, e.g. \"0,1000\"; range endpoints inclusive. Omit for any uncertainty; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • addedInput schema / properties / decimalLatitude
        Added value: +{
        +  "description": "Latitude or latitude range \"min,max\" in decimal degrees (WGS84). All supplied spatial filters intersect, including geometry. Omit to leave latitude unbounded; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • addedInput schema / properties / decimalLongitude
        Added value: +{
        +  "description": "Longitude or longitude range \"min,max\" in decimal degrees (WGS84). All supplied spatial filters intersect, including geometry. Omit to leave longitude unbounded; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • addedInput schema / properties / geometry
        Added value: +{
        +  "description": "WKT polygon in longitude latitude order. All supplied spatial filters intersect: decimalLatitude and decimalLongitude remain active and restrict results to the overlap. Omit to leave geometry unfiltered; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • addedInput schema / properties / hasCoordinate
        Added value: +{
        +  "description": "True counts records with coordinates; false counts only records without coordinates. Omit for both. Alias isGeoreferenced may be supplied alone or with the same value; conflicts fail as invalid_filter.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / isGeoreferenced / description
        Previous value: -"When true, count only georeferenced records. When false, count only non-georeferenced records."New value: +"Alias for hasCoordinate. True counts only georeferenced records; false only non-georeferenced records. Supplying both requires equal values."
      • addedInput schema / properties / isInCluster
        Added value: +{
        +  "description": "True counts likely duplicates; false excludes them. Omit to include all records. GBIF exposes membership only, with no cluster identifier.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / month
        Added value: +{
        +  "description": "Calendar month (1–12), matching the occurrence search filter.",
        +  "maximum": 12,
        +  "minimum": 1,
        +  "type": "number"
        +}
      • addedInput schema / properties / scientificName
        Added value: +{
        +  "description": "Scientific name; does not match synonyms. With taxonKey GBIF takes their union (OR), not their intersection. Omit to leave names unfiltered; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "count",
        -      "occurrenceStatus"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "count",
        +      "scope",
        +      "occurrenceStatus"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A filter was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected another filter value as malformed. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A filter was supplied blank or whitespace-only, hasCoordinate conflicts with isGeoreferenced, datasetKey is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected another filter value as malformed. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / scope
        Added value: +{
        +  "additionalProperties": {
        +    "type": [
        +      "string",
        +      "number",
        +      "boolean"
        +    ]
        +  },
        +  "description": "Effective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedgbif_occurrence_facets14 fields changed
      • changedInput schema / properties / basisOfRecord / enum
        Previous value: -[
        -  "HUMAN_OBSERVATION",
        -  "MACHINE_OBSERVATION",
        -  "PRESERVED_SPECIMEN",
        -  "LIVING_SPECIMEN",
        -  "MATERIAL_SAMPLE",
        -  "MATERIAL_CITATION",
        -  "OCCURRENCE",
        -  "LITERATURE"
        -]New value: +[
        +  "HUMAN_OBSERVATION",
        +  "MACHINE_OBSERVATION",
        +  "PRESERVED_SPECIMEN",
        +  "LIVING_SPECIMEN",
        +  "MATERIAL_SAMPLE",
        +  "MATERIAL_CITATION",
        +  "OCCURRENCE",
        +  "LITERATURE",
        +  "FOSSIL_SPECIMEN",
        +  "OBSERVATION",
        +  "UNKNOWN"
        +]
      • addedInput schema / properties / coordinateUncertaintyInMeters
        Added value: +{
        +  "description": "Coordinate uncertainty radius in meters, e.g. \"0,1000\"; range endpoints inclusive. Omit for any uncertainty; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • addedInput schema / properties / decimalLatitude
        Added value: +{
        +  "description": "Latitude or latitude range \"min,max\" in decimal degrees (WGS84). All supplied spatial filters intersect, including geometry. Omit to leave latitude unbounded; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • addedInput schema / properties / decimalLongitude
        Added value: +{
        +  "description": "Longitude or longitude range \"min,max\" in decimal degrees (WGS84). All supplied spatial filters intersect, including geometry. Omit to leave longitude unbounded; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • changedInput schema / properties / geometry / description
        Previous value: -"WKT polygon to scope the aggregation to a geographic area (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. Omit the field to aggregate everywhere — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered aggregation."New value: +"WKT polygon to scope the aggregation to a geographic area (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. All supplied spatial filters intersect: decimalLatitude and decimalLongitude remain active and restrict results to the overlap. Omit the field to aggregate everywhere — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered aggregation."
      • addedInput schema / properties / hasCoordinate
        Added value: +{
        +  "description": "True includes records with coordinates; false only records without coordinates. Omit for both.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / isInCluster
        Added value: +{
        +  "description": "True includes likely duplicates; false excludes them. Omit to include all records. GBIF exposes membership only, with no cluster identifier.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / month
        Added value: +{
        +  "description": "Calendar month (1–12), matching the occurrence search filter.",
        +  "maximum": 12,
        +  "minimum": 1,
        +  "type": "number"
        +}
      • addedInput schema / properties / scientificName
        Added value: +{
        +  "description": "Scientific name; does not match synonyms. With taxonKey GBIF takes their union (OR), not their intersection. Omit to leave names unfiltered; blank or whitespace-only is rejected.",
        +  "type": "string"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "facet",
        -      "totalOccurrences",
        -      "counts",
        -      "facetLimit",
        -      "facetOffset",
        -      "occurrenceStatus"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "facet",
        +      "totalOccurrences",
        +      "counts",
        +      "scope",
        +      "facetLimit",
        +      "facetOffset",
        +      "occurrenceStatus"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A scope filter was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected the geometry or year scope as malformed. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_filter`: A scope filter was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected another filter as malformed. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no facet values were returned, the page came back full and more values may remain, a verbatim stateProvince filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."New value: +"Guidance when no facet values were returned, a lookahead bucket proves more remain, a verbatim stateProvince filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."
      • addedOutput schema / properties / scope
        Added value: +{
        +  "additionalProperties": {
        +    "type": [
        +      "string",
        +      "number",
        +      "boolean"
        +    ]
        +  },
        +  "description": "Effective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"Heuristic continuation flag: present and true when this page returned a full facetLimit of values, so more distinct values may exist past facetOffset + facetLimit. GBIF exposes no total distinct-value count, so this is an estimate, not exact. Absent when the page came back short, which is the only proof the ranking is exhausted."New value: +"Present and true only when an extra upstream bucket proves another page exists. Absent on the final page, including an exactly full final page."
    • Changedgbif_search_occurrences4 fields changed
      • changedInput schema / properties / basisOfRecord / enum
        Previous value: -[
        -  "HUMAN_OBSERVATION",
        -  "MACHINE_OBSERVATION",
        -  "PRESERVED_SPECIMEN",
        -  "LIVING_SPECIMEN",
        -  "MATERIAL_SAMPLE",
        -  "MATERIAL_CITATION",
        -  "OCCURRENCE",
        -  "LITERATURE"
        -]New value: +[
        +  "HUMAN_OBSERVATION",
        +  "MACHINE_OBSERVATION",
        +  "PRESERVED_SPECIMEN",
        +  "LIVING_SPECIMEN",
        +  "MATERIAL_SAMPLE",
        +  "MATERIAL_CITATION",
        +  "OCCURRENCE",
        +  "LITERATURE",
        +  "FOSSIL_SPECIMEN",
        +  "OBSERVATION",
        +  "UNKNOWN"
        +]
      • changedInput schema / properties / geometry / description
        Previous value: -"WKT polygon for geographic filtering (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. Takes precedence over decimalLatitude/decimalLongitude. Omit the field to search everywhere — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set."New value: +"WKT polygon for geographic filtering (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. All supplied spatial filters intersect: decimalLatitude and decimalLongitude remain active and restrict results to the overlap. Omit the field to search everywhere — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "occurrences",
        -      "totalCount",
        -      "offset",
        -      "limit",
        -      "endOfRecords",
        -      "occurrenceStatus"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "occurrences",
        +      "scope",
        +      "totalCount",
        +      "offset",
        +      "limit",
        +      "endOfRecords",
        +      "occurrenceStatus"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / scope
        Added value: +{
        +  "additionalProperties": {
        +    "type": [
        +      "string",
        +      "number",
        +      "boolean"
        +    ]
        +  },
        +  "description": "Effective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedgbif_search_species4 fields changed
      • changedOutput schema / properties / taxa / items / description
        Previous value: -"A backbone taxon with classification, status, and occurrence counts."New value: +"A checklist taxon usage with classification, status, and occurrence counts."
      • addedOutput schema / properties / taxa / items / properties / datasetKey
        Added value: +{
        +  "description": "Source checklist dataset UUID, when GBIF supplies it.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / taxa / items / properties / key / description
        Previous value: -"GBIF backbone taxon key."New value: +"Taxon usage key within the source checklist; not necessarily a backbone key."
      • addedOutput schema / properties / taxa / items / properties / nubKey
        Added value: +{
        +  "description": "Mapped backbone taxon key for occurrence queries, when GBIF supplies it. Otherwise resolve the name with gbif_match_species.",
        +  "type": "number"
        +}
  4. 1 tool update
    • Changedgbif_search_species1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_filter`: q, kingdom, family, genus, or datasetKey was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, or GBIF rejected another filter value as malformed. `unresolved_taxon_scope`: kingdom, family, or genus named no GBIF backbone taxon at that rank — a misspelling, a lowercase name, a name entered under the wrong rank, or a name shared across kingdoms with no kingdom supplied to separate them. `conflicting_taxon_scope`: the supplied family and genus each resolved, but to taxa in different lineages — the genus does not sit in that family. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_filter`: q, kingdom, family, genus, or datasetKey was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, or GBIF rejected another filter value as malformed. `unresolved_taxon_scope`: kingdom, family, or genus named no GBIF backbone taxon at that rank — a misspelling, a lowercase name, a name entered under the wrong rank, or a name shared across kingdoms with no kingdom supplied to separate them. `conflicting_taxon_scope`: The supplied family and genus each resolved, but to taxa in different lineages — the genus does not sit in that family. Other values are possible when a failure originates below the handler."
  5. 13 tool updates
    • Changedgbif_bulk_match_species6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results"
        -]
    • Changedgbif_count_occurrences6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "count",
        +      "occurrenceStatus"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_filter`: A filter was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected another filter value as malformed. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "count",
        -  "occurrenceStatus"
        -]
    • Changedgbif_get_dataset9 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    }
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "contactLimit applied when the list was capped. Raise it (max 100) to see more. Absent otherwise.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The datasetKey UUID does not match any dataset in GBIF. `invalid_filter`: datasetKey is not a UUID, or GBIF rejected the request as malformed. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "How to reach the contacts contactLimit held back. Absent when every contact was returned.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Contacts included in this response when the list was capped. Absent otherwise.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the dataset carries more contacts than contactLimit allowed through. Absent when every contact was returned.",
        +  "type": "boolean"
        +}
    • Changedgbif_get_occurrence5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    }
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The occurrenceKey does not exist in GBIF. `invalid_filter`: GBIF rejected the occurrenceKey as unparseable — a fraction, or a value past the largest integer the endpoint accepts. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedgbif_get_species5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    }
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a fraction, or a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedgbif_get_species_children6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "children",
        +      "offset",
        +      "limit",
        +      "endOfRecords"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a fraction, or a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "children",
        -  "offset",
        -  "limit",
        -  "endOfRecords"
        -]
    • Changedgbif_get_species_classification6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "classification"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The taxonKey does not exist in the GBIF backbone. `invalid_filter`: GBIF rejected the taxonKey as unparseable — a fraction, or a value outside the 32-bit signed integer range. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "classification"
        -]
    • Changedgbif_match_species5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    }
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_match`: matchType is NONE — no candidate met the match threshold. `invalid_filter`: kingdom was supplied blank or whitespace-only, which disambiguates nothing. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_match",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
    • Changedgbif_occurrence_facets11 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "facet",
        +      "totalOccurrences",
        +      "counts",
        +      "facetLimit",
        +      "facetOffset",
        +      "occurrenceStatus"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "facetLimit applied when the page was capped. Re-call with facetOffset advanced by this value to page on. Absent otherwise.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_filter`: A scope filter was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code is one GBIF does not know, or GBIF rejected the geometry or year scope as malformed. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / properties / moreValuesLikely
        Removed value: -{
        -  "description": "Heuristic continuation flag: true when this page returned a full facetLimit of values, so more distinct values may exist past facetOffset + facetLimit (re-call with facetOffset advanced by facetLimit). GBIF exposes no total distinct-value count, so this is an estimate, not exact.",
        -  "type": "boolean"
        -}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no facet values were returned, a verbatim stateProvince filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."New value: +"Guidance when no facet values were returned, the page came back full and more values may remain, a verbatim stateProvince filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Facet values returned in this page when the page was capped. Absent otherwise.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "Heuristic continuation flag: present and true when this page returned a full facetLimit of values, so more distinct values may exist past facetOffset + facetLimit. GBIF exposes no total distinct-value count, so this is an estimate, not exact. Absent when the page came back short, which is the only proof the ranking is exhausted.",
        +  "type": "boolean"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "facet",
        -  "totalOccurrences",
        -  "counts",
        -  "facetLimit",
        -  "facetOffset",
        -  "moreValuesLikely",
        -  "occurrenceStatus"
        -]
    • Changedgbif_search_datasets6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "datasets",
        +      "totalCount",
        +      "offset",
        +      "limit",
        +      "endOfRecords"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_filter`: A filter was supplied blank or whitespace-only, publishingOrg or hostingOrg is not a lowercase 8-4-4-4-12 hex UUID, publishingCountry is a two-letter code GBIF does not assign, or GBIF rejected another filter value as malformed. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "datasets",
        -  "totalCount",
        -  "offset",
        -  "limit",
        -  "endOfRecords"
        -]
    • Changedgbif_search_occurrences6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "occurrences",
        +      "totalCount",
        +      "offset",
        +      "limit",
        +      "endOfRecords",
        +      "occurrenceStatus"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `pagination_cap_exceeded`: offset + limit exceeds 100,001, the deepest page GBIF serves. `invalid_filter`: A filter value is unusable — any filter supplied blank or whitespace-only, a datasetKey that is not an 8-4-4-4-12 hex UUID, a two-letter country or publishingCountry code GBIF does not know, or a WKT geometry or range GBIF rejects. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "pagination_cap_exceeded",
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "occurrences",
        -  "totalCount",
        -  "offset",
        -  "limit",
        -  "endOfRecords",
        -  "occurrenceStatus"
        -]
    • Changedgbif_search_publishers6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "publishers",
        +      "totalCount",
        +      "offset",
        +      "limit",
        +      "endOfRecords"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_filter`: q was supplied blank or whitespace-only, country is the empty string, or GBIF could not parse the country value as a country. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_filter"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "publishers",
        -  "totalCount",
        -  "offset",
        -  "limit",
        -  "endOfRecords"
        -]
    • Changedgbif_search_species6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "taxa",
        +      "totalCount",
        +      "offset",
        +      "limit",
        +      "endOfRecords"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_filter`: q, kingdom, family, genus, or datasetKey was supplied blank or whitespace-only, datasetKey is not an 8-4-4-4-12 hex UUID, or GBIF rejected another filter value as malformed. `unresolved_taxon_scope`: kingdom, family, or genus named no GBIF backbone taxon at that rank — a misspelling, a lowercase name, a name entered under the wrong rank, or a name shared across kingdoms with no kingdom supplied to separate them. `conflicting_taxon_scope`: the supplied family and genus each resolved, but to taxa in different lineages — the genus does not sit in that family. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_filter",
        +            "unresolved_taxon_scope",
        +            "conflicting_taxon_scope"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "taxa",
        -  "totalCount",
        -  "offset",
        -  "limit",
        -  "endOfRecords"
        -]
  6. 7 tool updates
    • Changedgbif_count_occurrences3 fields changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Filter to a specific dataset UUID (8-4-4-4-12 hex) from gbif_search_datasets. The result is not the recordCount the dataset tools and the gbif://dataset/{datasetKey} resource report for the same key: that figure spans every occurrenceStatus, while this count applies occurrenceStatus below, PRESENT by default."New value: +"Filter to a specific dataset UUID (8-4-4-4-12 hex) from gbif_search_datasets. Omit the field to count across every dataset — an empty string is rejected rather than read as no filter, because GBIF answers a blank datasetKey with the unfiltered total. The result is not the recordCount the dataset tools and the gbif://dataset/{datasetKey} resource report for the same key: that figure spans every occurrenceStatus, while this count applies occurrenceStatus below, PRESENT by default."
      • changedInput schema / properties / stateProvince / description
        Previous value: -"State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. GBIF stores what each dataset recorded without normalizing it, so there is no vocabulary to guess from: \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, and \"england\" is none of them. Take one from a STATE_PROVINCE facet on gbif_occurrence_facets scoped the same way and pass it back unchanged — an unmatched value counts zero rather than erroring."New value: +"State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. GBIF stores what each dataset recorded without normalizing it, so there is no vocabulary to guess from: \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, and \"england\" is none of them. Take one from a STATE_PROVINCE facet on gbif_occurrence_facets scoped the same way and pass it back unchanged — an unmatched value counts zero rather than erroring. Omit the field to count across every state or province — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered total."
      • changedInput schema / properties / year / description
        Previous value: -"Year or year range (e.g., \"2024\" or \"2020,2024\"). Both endpoints inclusive."New value: +"Year or year range (e.g., \"2024\" or \"2020,2024\"). Both endpoints inclusive. Omit the field to count across every year — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered total."
    • Changedgbif_match_species1 field changed
      • changedInput schema / properties / kingdom / description
        Previous value: -"Narrow the match to a specific kingdom (e.g., \"Animalia\", \"Plantae\", \"Fungi\") to disambiguate names that appear in multiple kingdoms."New value: +"Narrow the match to a specific kingdom (e.g., \"Animalia\", \"Plantae\", \"Fungi\") to disambiguate names that appear in multiple kingdoms. Omit the field to match against the whole backbone — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the undisambiguated match, which is indistinguishable from a match that honored the kingdom."
    • Changedgbif_occurrence_facets4 fields changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Scope the aggregation to a single dataset by its GBIF dataset UUID (8-4-4-4-12 hex). Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet, or the datasetKey field on an occurrence record."New value: +"Scope the aggregation to a single dataset by its GBIF dataset UUID (8-4-4-4-12 hex). Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet, or the datasetKey field on an occurrence record. Omit the field to aggregate across every dataset — an empty string is rejected rather than read as no scope, because GBIF answers a blank datasetKey with the unfiltered aggregation."
      • changedInput schema / properties / geometry / description
        Previous value: -"WKT polygon to scope the aggregation to a geographic area (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude."New value: +"WKT polygon to scope the aggregation to a geographic area (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. Omit the field to aggregate everywhere — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered aggregation."
      • changedInput schema / properties / stateProvince / description
        Previous value: -"State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. Pass back a value this tool returned under facet STATE_PROVINCE rather than a guessed one: GBIF stores what each dataset recorded without normalizing it, so \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, \"england\" is none of them, and an unmatched value aggregates zero records rather than erroring."New value: +"State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. Pass back a value this tool returned under facet STATE_PROVINCE rather than a guessed one: GBIF stores what each dataset recorded without normalizing it, so \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, \"england\" is none of them, and an unmatched value aggregates zero records rather than erroring. Omit the field to aggregate across every state or province — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered aggregation."
      • changedInput schema / properties / year / description
        Previous value: -"Year or year range (e.g., \"2020,2024\") to scope the aggregation. Both endpoints inclusive."New value: +"Year or year range (e.g., \"2020,2024\") to scope the aggregation. Both endpoints inclusive. Omit the field to aggregate across every year — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered aggregation."
    • Changedgbif_search_datasets3 fields changed
      • changedInput schema / properties / hostingOrg / description
        Previous value: -"UUID (8-4-4-4-12 hex) of the hosting organization. From gbif_search_publishers results."New value: +"UUID (8-4-4-4-12 hex, lowercase — matched case-sensitively, as publishingOrg is) of the organization whose installation serves the dataset — not the organization that published it, which is publishingOrg. Most organizations publish through an installation someone else runs, so a key from gbif_search_publishers matches nothing here for them: of the first 25 GB organizations the registry lists, all 25 host no datasets while 13 publish one or two. Supplied together the two filters are intersected, not combined."
      • addedInput schema / properties / publishingOrg
        Added value: +{
        +  "description": "UUID (8-4-4-4-12 hex, lowercase — GBIF matches these two keys case-sensitively, so an upper-cased rendering of a real key matches nothing) of the organization that published the dataset — the organization whose data it is, and the question a key from gbif_search_publishers is usually asking. Not the organization that serves it, which is hostingOrg and matches a different set: Butterfly Conservation (0d72dd7f-6f05-46af-85c2-8b6e77ce5534) publishes 3 datasets and hosts none, while the National Biodiversity Network (07f617d0-c688-11d8-bf62-b8a03c50a862) hosts 984 — those 3 among them — and publishes 1. Supplied together the two filters are intersected, not combined, so the same key in both fields returns only what that organization both published and serves.",
        +  "type": "string"
        +}
      • changedInput schema / properties / q / description
        Previous value: -"Free-text search across dataset title and description."New value: +"Free-text search across dataset title and description. Omit the field to browse without a term — a blank or whitespace-only value is rejected rather than sent, because GBIF answers a blank one with all 123,527 indexed datasets and a whitespace-only one with none, and neither is the search a caller who filled the field was asking for."
    • Changedgbif_search_occurrences8 fields changed
      • changedInput schema / properties / coordinateUncertaintyInMeters / description
        Previous value: -"Filter by coordinate uncertainty radius in meters. Range format: \"min,max\" (e.g., \"0,1000\" for sub-kilometer precision). Both endpoints inclusive."New value: +"Filter by coordinate uncertainty radius in meters. Range format: \"min,max\" (e.g., \"0,1000\" for sub-kilometer precision). Both endpoints inclusive. Omit the field to accept any uncertainty — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set."
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Restrict results to a single dataset by its GBIF dataset UUID (8-4-4-4-12 hex). Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet (gbif_occurrence_facets), or the datasetKey field on an occurrence record."New value: +"Restrict results to a single dataset by its GBIF dataset UUID (8-4-4-4-12 hex). Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet (gbif_occurrence_facets), or the datasetKey field on an occurrence record. Omit the field to search every dataset — an empty string is rejected rather than read as no filter, because GBIF answers a blank datasetKey with the unfiltered result set."
      • changedInput schema / properties / decimalLatitude / description
        Previous value: -"Latitude range as \"min,max\" (e.g., \"47.0,48.5\"). Decimal degrees, WGS84. Combine with decimalLongitude for a bounding box."New value: +"Latitude range as \"min,max\" (e.g., \"47.0,48.5\"). Decimal degrees, WGS84. Combine with decimalLongitude for a bounding box. Omit the field to leave latitude unbounded — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set."
      • changedInput schema / properties / decimalLongitude / description
        Previous value: -"Longitude range as \"min,max\" (e.g., \"8.0,9.5\"). Decimal degrees, WGS84. Combine with decimalLatitude for a bounding box."New value: +"Longitude range as \"min,max\" (e.g., \"8.0,9.5\"). Decimal degrees, WGS84. Combine with decimalLatitude for a bounding box. Omit the field to leave longitude unbounded — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set."
      • changedInput schema / properties / geometry / description
        Previous value: -"WKT polygon for geographic filtering (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. Takes precedence over decimalLatitude/decimalLongitude."New value: +"WKT polygon for geographic filtering (e.g., POLYGON((8 47, 9 47, 9 48, 8 48, 8 47))). Coordinates are longitude latitude. Takes precedence over decimalLatitude/decimalLongitude. Omit the field to search everywhere — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set."
      • changedInput schema / properties / scientificName / description
        Previous value: -"Scientific name filter. Less precise than taxonKey — does not match synonyms. Use taxonKey from gbif_match_species for reliable results. Supplying both does not narrow the search: GBIF combines the two taxon filters with OR, so the result is the union of the two, not their intersection."New value: +"Scientific name filter. Less precise than taxonKey — does not match synonyms. Use taxonKey from gbif_match_species for reliable results. Supplying both does not narrow the search: GBIF combines the two taxon filters with OR, so the result is the union of the two, not their intersection. Omit the field to search every name — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set."
      • changedInput schema / properties / stateProvince / description
        Previous value: -"State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. GBIF stores what each dataset recorded without normalizing it, so there is no vocabulary to guess from: \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, and \"england\" is none of them. Take one from a STATE_PROVINCE facet on gbif_occurrence_facets scoped the same way and pass it back unchanged — an unmatched value returns zero records rather than an error. Records carrying no stateProvince match no value, so this cannot partition a scope."New value: +"State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. GBIF stores what each dataset recorded without normalizing it, so there is no vocabulary to guess from: \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, and \"england\" is none of them. Take one from a STATE_PROVINCE facet on gbif_occurrence_facets scoped the same way and pass it back unchanged — an unmatched value returns zero records rather than an error. Omit the field to search every state or province — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set. Records carrying no stateProvince match no value, so this cannot partition a scope."
      • changedInput schema / properties / year / description
        Previous value: -"Year or year range. Single year: \"2024\". Range: \"2020,2024\". Filters by observation year. Both endpoints inclusive."New value: +"Year or year range. Single year: \"2024\". Range: \"2020,2024\". Filters by observation year. Both endpoints inclusive. Omit the field to search every year — a blank or whitespace-only value is rejected rather than dropped, because GBIF answers one with the unfiltered result set."
    • Changedgbif_search_publishers3 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 country code to filter organizations by country. The alpha-2 form (\"GB\") is canonical; unlike the country codes on the occurrence tools and gbif_search_datasets, this one also resolves the alpha-3 form (\"GBR\") and is case-insensitive, because the registry endpoint matches the parsed country rather than the string. A value GBIF cannot parse as a country errors rather than returning an empty list."New value: +"ISO 3166-1 country code to filter organizations by country. The alpha-2 form (\"GB\") is canonical; unlike the country codes on the occurrence tools and gbif_search_datasets, this one also resolves the alpha-3 form (\"GBR\") and is case-insensitive, because the registry endpoint matches the parsed country rather than the string. A value GBIF cannot parse as a country errors rather than returning an empty list. Omit the field to search every country — an empty string is rejected rather than read as no filter, because the registry answers a blank country with all 3,561 organizations."
      • changedInput schema / properties / q / description
        Previous value: -"Name fragment to search for. Matches organization names."New value: +"Name fragment to search for. Matches organization names. Omit the field to browse without a term — a blank or whitespace-only value is rejected rather than sent, because the registry answers either with all 3,561 registered organizations."
      • changedOutput schema / properties / publishers / items / properties / key / description
        Previous value: -"Organization UUID for gbif_search_datasets hostingOrg parameter."New value: +"Organization UUID. Chains into gbif_search_datasets as publishingOrg for the datasets this organization published, or as hostingOrg for the ones its own installation serves — publishingOrg is the usual one, since most organizations host nothing."
    • Changedgbif_search_species6 fields changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Scope to a specific checklist dataset UUID (8-4-4-4-12 hex). Omit to search the GBIF backbone."New value: +"Scope to a specific checklist dataset UUID (8-4-4-4-12 hex). Omit the field to search the GBIF backbone — an empty string is rejected rather than read as no scope, because GBIF answers a blank datasetKey with the unfiltered backbone result."
      • changedInput schema / properties / family / description
        Previous value: -"Scope search to a family name."New value: +"Scope the search to a family, by name — \"Paridae\", \"Fagaceae\". Resolved to its backbone key before the search runs, so an alternative family name lands on the taxon it is a synonym of (\"Compositae\" scopes to Asteraceae). Matched exactly and capitalized as GBIF writes it; a name that is not a backbone family fails rather than being ignored. Supplied with genus, it must be that genus's own family. Omit the field to browse every family; a blank or whitespace-only value is rejected rather than dropped."
      • changedInput schema / properties / genus / description
        Previous value: -"Scope search to a genus name."New value: +"Scope the search to a genus, by name — \"Quercus\", \"Parus\". Resolved to its backbone key before the search runs, and it is the narrowest of the three, so it is what scopes when kingdom or family is supplied too. Matched exactly and capitalized as GBIF writes it; a name shared across kingdoms (\"Prunella\", \"Oenanthe\") resolves only when kingdom is supplied with it. Omit the field to browse every genus; a blank or whitespace-only value is rejected rather than dropped."
      • changedInput schema / properties / kingdom / description
        Previous value: -"Scope search to a kingdom (e.g., \"Animalia\", \"Plantae\")."New value: +"Scope the search to a kingdom, by name — \"Animalia\", \"Plantae\", \"Fungi\". Resolved to its backbone key before the search runs, and matched exactly: capitalize it as GBIF writes it, since \"animalia\" resolves to nothing. Supplied alongside family or genus it disambiguates that name rather than scoping on its own — \"Prunella\" alone names both a bird genus and a plant genus and resolves to neither. Omit the field to browse every kingdom; a blank or whitespace-only value is rejected rather than dropped."
      • changedInput schema / properties / q / description
        Previous value: -"Name fragment to search for. Matches scientific and vernacular names."New value: +"Name fragment to search for. Matches scientific and vernacular names. Omit the field to browse without a name term — a blank or whitespace-only value is rejected rather than sent, because GBIF answers a blank one with the whole 46,623,754-name index and a whitespace-only one with nothing, and neither is the search a caller who filled the field was asking for."
      • addedOutput schema / properties / taxonScope
        Added value: +{
        +  "description": "The higher-taxon scope actually applied — which of kingdom, family, or genus scoped the search, the backbone taxon its name resolved to, and that taxon key. Absent when none of the three was supplied.",
        +  "type": "string"
        +}
  7. 5 tool updates
    • Changedgbif_count_occurrences2 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 alpha-2 code of where the occurrence was recorded (e.g., \"GB\", \"US\"). Not the publisher's country — that is publishingCountry, and the two disagree on most records."New value: +"ISO 3166-1 alpha-2 code, uppercase, of where the occurrence was recorded (e.g., \"GB\", \"US\"). Not the publisher's country — that is publishingCountry, and the two disagree on most records. Lowercase and alpha-3 forms (\"gb\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here. Take a value from a COUNTRY facet on gbif_occurrence_facets; an uppercase pair GBIF does not know (\"XX\") is rejected upstream by name."
      • addedInput schema / properties / country / pattern
        Added value: +"^[A-Z]{2}$"
    • Changedgbif_occurrence_facets2 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 alpha-2 code of where the occurrence was recorded, to scope to one country. Not the publisher's country — that is publishingCountry, and the two disagree on most records."New value: +"ISO 3166-1 alpha-2 code, uppercase, of where the occurrence was recorded, to scope to one country. Not the publisher's country — that is publishingCountry, and the two disagree on most records. Scope to one country, or pass back a value this tool returned under facet COUNTRY to drill into that bucket. Lowercase and alpha-3 forms (\"gb\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here."
      • addedInput schema / properties / country / pattern
        Added value: +"^[A-Z]{2}$"
    • Changedgbif_search_datasets2 fields changed
      • changedInput schema / properties / publishingCountry / description
        Previous value: -"ISO 3166-1 alpha-2 country code of the publishing organization."New value: +"ISO 3166-1 alpha-2 code, uppercase, of the organization that published the dataset (e.g., \"GB\", \"US\", \"DE\", \"SE\"). Lowercase and alpha-3 forms (\"gb\", \"GBR\") match nothing upstream, which is why only the uppercase two-letter form is accepted here — unlike the country filter on gbif_search_publishers, which resolves either form. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets; an uppercase pair GBIF does not assign (\"XX\") is rejected upstream by name."
      • addedInput schema / properties / publishingCountry / pattern
        Added value: +"^[A-Z]{2}$"
    • Changedgbif_search_occurrences2 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 alpha-2 code of where the occurrence was recorded (e.g., \"GB\", \"US\", \"DE\", \"SE\"). Not the publisher's country — that is publishingCountry, and the two disagree on most records."New value: +"ISO 3166-1 alpha-2 code, uppercase, of where the occurrence was recorded (e.g., \"GB\", \"US\", \"DE\", \"SE\"). Not the publisher's country — that is publishingCountry, and the two disagree on most records. Lowercase and alpha-3 forms (\"gb\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here. Take a value from a COUNTRY facet on gbif_occurrence_facets; an uppercase pair GBIF does not know (\"XX\") is rejected upstream by name."
      • addedInput schema / properties / country / pattern
        Added value: +"^[A-Z]{2}$"
    • Changedgbif_search_publishers1 field changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 alpha-2 country code to filter organizations by country."New value: +"ISO 3166-1 country code to filter organizations by country. The alpha-2 form (\"GB\") is canonical; unlike the country codes on the occurrence tools and gbif_search_datasets, this one also resolves the alpha-3 form (\"GBR\") and is case-insensitive, because the registry endpoint matches the parsed country rather than the string. A value GBIF cannot parse as a country errors rather than returning an empty list."
  8. 3 tool updates
    • Changedgbif_count_occurrences4 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 alpha-2 country code (e.g., \"GB\", \"US\")."New value: +"ISO 3166-1 alpha-2 code of where the occurrence was recorded (e.g., \"GB\", \"US\"). Not the publisher's country — that is publishingCountry, and the two disagree on most records."
      • addedInput schema / properties / publishingCountry
        Added value: +{
        +  "description": "ISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — not where the occurrence was observed, which is country. The two differ constantly: of 60,290,950 records observed in GB, 1,548,928 were published by US organizations. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets. Lowercase and alpha-3 forms (\"us\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here.",
        +  "pattern": "^[A-Z]{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / stateProvince
        Added value: +{
        +  "description": "State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. GBIF stores what each dataset recorded without normalizing it, so there is no vocabulary to guess from: \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, and \"england\" is none of them. Take one from a STATE_PROVINCE facet on gbif_occurrence_facets scoped the same way and pass it back unchanged — an unmatched value counts zero rather than erroring.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when a presence/absence filter narrowed the count. Absent when occurrenceStatus is ANY."New value: +"Guidance when the count is zero under a verbatim stateProvince filter, larger than gbif_search_occurrences can page to, or narrowed by a presence/absence filter. Absent when none applies."
    • Changedgbif_occurrence_facets5 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 alpha-2 country code to scope to one country."New value: +"ISO 3166-1 alpha-2 code of where the occurrence was recorded, to scope to one country. Not the publisher's country — that is publishingCountry, and the two disagree on most records."
      • changedInput schema / properties / facet / description
        Previous value: -"Dimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY, OCCURRENCE_STATUS, IUCN_RED_LIST_CATEGORY)."New value: +"Dimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY, OCCURRENCE_STATUS, IUCN_RED_LIST_CATEGORY). DATASET_KEY is the dimension to split on when a result set is too large to page: every occurrence carries exactly one datasetKey, so its buckets sum to totalOccurrences with no gap and no overlap, and it has the cardinality to cut a large scope into pageable pieces. BASIS_OF_RECORD and PUBLISHING_COUNTRY are gap-free too and both have a matching filter on the occurrence tools, so either can drive a further split of a bucket still too large — but on that same scope they return 9 and 41 buckets against DATASET_KEY's 550, so neither replaces it as the first cut. A dimension a record can lack silently drops that record: faceting one 60,290,950-record scope by YEAR returned 224 buckets summing to 59,407,400, leaving 883,550 undated records in no bucket at all, and MONTH, STATE_PROVINCE, and SPECIES_KEY lose records the same way — stateProvince included, even though the occurrence tools can now filter on it. Sums are comparable only across the same occurrenceStatus scope."
      • addedInput schema / properties / publishingCountry
        Added value: +{
        +  "description": "ISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — not where the occurrence was observed, which is country. Scope to one publisher country, or pass back a value this tool returned under facet PUBLISHING_COUNTRY to drill into that bucket. Lowercase and alpha-3 forms (\"us\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here.",
        +  "pattern": "^[A-Z]{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / stateProvince
        Added value: +{
        +  "description": "State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. Pass back a value this tool returned under facet STATE_PROVINCE rather than a guessed one: GBIF stores what each dataset recorded without normalizing it, so \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, \"england\" is none of them, and an unmatched value aggregates zero records rather than erroring.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no facet values were returned or a presence/absence filter narrowed the aggregation. Absent only when neither applies."New value: +"Guidance when no facet values were returned, a verbatim stateProvince filter matched nothing, or a presence/absence filter narrowed the aggregation. Absent only when none applies."
    • Changedgbif_search_occurrences5 fields changed
      • changedInput schema / properties / country / description
        Previous value: -"ISO 3166-1 alpha-2 country code (e.g., \"GB\", \"US\", \"DE\", \"SE\")."New value: +"ISO 3166-1 alpha-2 code of where the occurrence was recorded (e.g., \"GB\", \"US\", \"DE\", \"SE\"). Not the publisher's country — that is publishingCountry, and the two disagree on most records."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset. GBIF serves offset+limit up to 100,001 and rejects anything past it — use gbif_occurrence_facets for aggregate analysis beyond that."New value: +"Pagination offset. GBIF serves offset+limit up to 100,001 and rejects anything past it, with no cursor or scroll to continue from. To reach a result set larger than that, split it into per-datasetKey searches using a DATASET_KEY facet from gbif_occurrence_facets — gap-free and high-cardinality, unlike YEAR, which leaves undated records in no bucket — rather than paging deeper."
      • addedInput schema / properties / publishingCountry
        Added value: +{
        +  "description": "ISO 3166-1 alpha-2 code, uppercase, of the organization that published the record — not where the occurrence was observed, which is country. The two differ constantly: of 60,290,950 records observed in GB, 1,548,928 were published by US organizations. Take a value from a PUBLISHING_COUNTRY facet on gbif_occurrence_facets. Lowercase and alpha-3 forms (\"us\", \"USA\") match nothing upstream, which is why only the uppercase two-letter form is accepted here.",
        +  "pattern": "^[A-Z]{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / stateProvince
        Added value: +{
        +  "description": "State, province, or first-level administrative division, matched as a verbatim string — exact and case-sensitive. GBIF stores what each dataset recorded without normalizing it, so there is no vocabulary to guess from: \"England\", \"England - Greater London\", and \"Greater London\" are three distinct values, and \"england\" is none of them. Take one from a STATE_PROVINCE facet on gbif_occurrence_facets scoped the same way and pass it back unchanged — an unmatched value returns zero records rather than an error. Records carrying no stateProvince match no value, so this cannot partition a scope.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty, paging overshot, or a presence/absence filter narrowed the result. Absent only when none applies."New value: +"Guidance when results are empty, paging overshot, the match is larger than the pagination cap can reach, or a presence/absence filter narrowed the result. Absent only when none applies."
  9. 6 tool updates
    • Changedgbif_count_occurrences6 fields changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Filter to a specific dataset UUID (8-4-4-4-12 hex) from gbif_search_datasets."New value: +"Filter to a specific dataset UUID (8-4-4-4-12 hex) from gbif_search_datasets. The result is not the recordCount the dataset tools and the gbif://dataset/{datasetKey} resource report for the same key: that figure spans every occurrenceStatus, while this count applies occurrenceStatus below, PRESENT by default."
      • addedInput schema / properties / iucnRedListCategory
        Added value: +{
        +  "description": "Count only records whose taxon carries this IUCN Red List category: CR Critically Endangered, EN Endangered, VU Vulnerable, NT Near Threatened, LC Least Concern, DD Data Deficient, EX Extinct, EW Extinct in the Wild, CD Conservation Dependent. Records with no category are excluded when this is set.",
        +  "enum": [
        +    "CR",
        +    "EN",
        +    "VU",
        +    "NT",
        +    "LC",
        +    "DD",
        +    "EX",
        +    "EW",
        +    "CD"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / occurrenceStatus
        Added value: +{
        +  "default": "PRESENT",
        +  "description": "Presence/absence filter. Defaults to PRESENT: an ABSENT record documents a survey that looked for the taxon and did not find it, so counting one inflates the total with the opposite of a sighting. Use ANY for both (GBIF's own default), or ABSENT for non-observations alone. Matches the gbif_search_occurrences default, so the two tools agree.",
        +  "enum": [
        +    "PRESENT",
        +    "ABSENT",
        +    "ANY"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when a presence/absence filter narrowed the count. Absent when occurrenceStatus is ANY.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / occurrenceStatus
        Added value: +{
        +  "description": "The presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what the count covers.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "count"
        -]New value: +[
        +  "count",
        +  "occurrenceStatus"
        +]
    • Changedgbif_get_dataset1 field changed
      • changedOutput schema / properties / recordCount / description
        Previous value: -"Occurrence records GBIF has indexed for this dataset, matching the figure gbif_search_datasets reports. Fetched separately for OCCURRENCE datasets because the detail endpoint omits it; absent for other dataset types and when that lookup does not return in time."New value: +"Occurrence records GBIF has indexed for this dataset, matching the figure gbif_search_datasets reports. Spans every occurrenceStatus: absence records — surveys that looked for a taxon and did not find it — are counted alongside sightings, and on some datasets they are the overwhelming majority. gbif_count_occurrences with this datasetKey answers the other question, defaulting to occurrenceStatus PRESENT, so the two figures are expected to differ rather than one being wrong. Fetched separately because the detail endpoint omits it; absent when that lookup does not return in time."
    • Changedgbif_get_occurrence6 fields changed
      • addedOutput schema / properties / eventTime
        Added value: +{
        +  "description": "Time of day of the observation, with seconds and UTC offset (e.g. 20:15:00+01:00) — the offset eventDate omits when it carries a local time. May be absent.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / gadm / description
        Previous value: -"GADM administrative geography — stable GIDs and names at levels 0–2. May be absent."New value: +"GADM administrative geography — stable GIDs and names at levels 0–3. May be absent."
      • addedOutput schema / properties / gadm / properties / level3
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "GADM level 3 — municipality/ward, the finest level GBIF indexes. Absent where the country does not subdivide that far.",
        +  "properties": {
        +    "gid": {
        +      "description": "GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). May be absent.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Administrative-unit name. May be absent.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / iucnRedListCategory
        Added value: +{
        +  "description": "IUCN Red List category of the taxon — CR Critically Endangered, EN Endangered, VU Vulnerable, NT Near Threatened, LC Least Concern, DD Data Deficient, EX Extinct, EW Extinct in the Wild, CD Conservation Dependent. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / occurrenceStatus
        Added value: +{
        +  "description": "PRESENT when the record asserts the taxon was there, ABSENT when it documents a survey that looked and did not find it. An ABSENT record is not a sighting — it carries coordinates, a date, and a recorder all the same. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / taxonomicStatus
        Added value: +{
        +  "description": "Status of the identification carried on this record — ACCEPTED, PROVISIONALLY_ACCEPTED, SYNONYM, DOUBTFUL, and so on. Says whether the occurrence was filed under an accepted name or a synonym. May be absent.",
        +  "type": "string"
        +}
    • Changedgbif_occurrence_facets7 fields changed
      • changedInput schema / properties / facet / description
        Previous value: -"Dimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY)."New value: +"Dimension to aggregate by (e.g., COUNTRY, YEAR, BASIS_OF_RECORD, SPECIES_KEY, OCCURRENCE_STATUS, IUCN_RED_LIST_CATEGORY)."
      • changedInput schema / properties / facet / enum
        Previous value: -[
        -  "BASIS_OF_RECORD",
        -  "COUNTRY",
        -  "STATE_PROVINCE",
        -  "YEAR",
        -  "DATASET_KEY",
        -  "KINGDOM_KEY",
        -  "PHYLUM_KEY",
        -  "CLASS_KEY",
        -  "ORDER_KEY",
        -  "FAMILY_KEY",
        -  "GENUS_KEY",
        -  "SPECIES_KEY",
        -  "PUBLISHING_COUNTRY",
        -  "MONTH"
        -]New value: +[
        +  "BASIS_OF_RECORD",
        +  "COUNTRY",
        +  "STATE_PROVINCE",
        +  "YEAR",
        +  "DATASET_KEY",
        +  "KINGDOM_KEY",
        +  "PHYLUM_KEY",
        +  "CLASS_KEY",
        +  "ORDER_KEY",
        +  "FAMILY_KEY",
        +  "GENUS_KEY",
        +  "SPECIES_KEY",
        +  "PUBLISHING_COUNTRY",
        +  "MONTH",
        +  "OCCURRENCE_STATUS",
        +  "IUCN_RED_LIST_CATEGORY"
        +]
      • addedInput schema / properties / iucnRedListCategory
        Added value: +{
        +  "description": "Scope to records whose taxon carries this IUCN Red List category: CR Critically Endangered, EN Endangered, VU Vulnerable, NT Near Threatened, LC Least Concern, DD Data Deficient, EX Extinct, EW Extinct in the Wild, CD Conservation Dependent. Leave unset and facet on IUCN_RED_LIST_CATEGORY to see the whole distribution instead.",
        +  "enum": [
        +    "CR",
        +    "EN",
        +    "VU",
        +    "NT",
        +    "LC",
        +    "DD",
        +    "EX",
        +    "EW",
        +    "CD"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / occurrenceStatus
        Added value: +{
        +  "default": "PRESENT",
        +  "description": "Presence/absence scope. Defaults to PRESENT so the aggregation counts sightings, not the surveys that looked and found nothing, and agrees with gbif_count_occurrences on the same filters. Use ANY for both — required to see both buckets when facet is OCCURRENCE_STATUS — or ABSENT for non-observations alone.",
        +  "enum": [
        +    "PRESENT",
        +    "ABSENT",
        +    "ANY"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no facet values were returned. Absent when counts are non-empty."New value: +"Guidance when no facet values were returned or a presence/absence filter narrowed the aggregation. Absent only when neither applies."
      • addedOutput schema / properties / occurrenceStatus
        Added value: +{
        +  "description": "The presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what totalOccurrences and every bucket cover.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "facet",
        -  "totalOccurrences",
        -  "counts",
        -  "facetLimit",
        -  "facetOffset",
        -  "moreValuesLikely"
        -]New value: +[
        +  "facet",
        +  "totalOccurrences",
        +  "counts",
        +  "facetLimit",
        +  "facetOffset",
        +  "moreValuesLikely",
        +  "occurrenceStatus"
        +]
    • Changedgbif_search_datasets1 field changed
      • changedOutput schema / properties / datasets / items / properties / recordCount / description
        Previous value: -"Number of records in the dataset."New value: +"Occurrence records GBIF has indexed for this dataset, spanning every occurrenceStatus: absence records — surveys that looked for a taxon and did not find it — are counted alongside sightings, and on some datasets they are the overwhelming majority. For the sightings-only figure, call gbif_count_occurrences with this key; it defaults to occurrenceStatus PRESENT, so the two figures are expected to differ rather than one being wrong."
    • Changedgbif_search_occurrences10 fields changed
      • addedInput schema / properties / iucnRedListCategory
        Added value: +{
        +  "description": "Restrict to records whose taxon carries this IUCN Red List category: CR Critically Endangered, EN Endangered, VU Vulnerable, NT Near Threatened, LC Least Concern, DD Data Deficient, EX Extinct, EW Extinct in the Wild, CD Conservation Dependent. Records with no category are excluded when this is set.",
        +  "enum": [
        +    "CR",
        +    "EN",
        +    "VU",
        +    "NT",
        +    "LC",
        +    "DD",
        +    "EX",
        +    "EW",
        +    "CD"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / occurrenceStatus
        Added value: +{
        +  "default": "PRESENT",
        +  "description": "Presence/absence filter. Defaults to PRESENT: an ABSENT record documents a survey that looked for the taxon and did not find it, so including one would read as a sighting of the opposite. Use ANY for both (GBIF's own default), or ABSENT for non-observations alone.",
        +  "enum": [
        +    "PRESENT",
        +    "ABSENT",
        +    "ANY"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / scientificName / description
        Previous value: -"Scientific name filter. Less precise than taxonKey — does not match synonyms. Use taxonKey from gbif_match_species for reliable results."New value: +"Scientific name filter. Less precise than taxonKey — does not match synonyms. Use taxonKey from gbif_match_species for reliable results. Supplying both does not narrow the search: GBIF combines the two taxon filters with OR, so the result is the union of the two, not their intersection."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when results are empty or paging overshot. Absent on successful result pages."New value: +"Guidance when results are empty, paging overshot, or a presence/absence filter narrowed the result. Absent only when none applies."
      • addedOutput schema / properties / occurrenceStatus
        Added value: +{
        +  "description": "The presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what totalCount and the returned records cover.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / occurrences / items / properties / eventTime
        Added value: +{
        +  "description": "Time of day of the observation, with seconds and UTC offset (e.g. 20:15:00+01:00) — the offset eventDate omits when it carries a local time. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / occurrences / items / properties / iucnRedListCategory
        Added value: +{
        +  "description": "IUCN Red List category of the taxon — CR, EN, VU, NT, LC, DD, EX, EW, or CD. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / occurrences / items / properties / occurrenceStatus
        Added value: +{
        +  "description": "PRESENT when the record asserts the taxon was there, ABSENT when it documents a survey that looked and did not find it. An ABSENT record is not a sighting. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / occurrences / items / properties / taxonomicStatus
        Added value: +{
        +  "description": "Status of the identification carried on this record — ACCEPTED, PROVISIONALLY_ACCEPTED, SYNONYM, DOUBTFUL, and so on. Says whether the occurrence was filed under an accepted name or a synonym. May be absent.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "occurrences",
        -  "totalCount",
        -  "offset",
        -  "limit",
        -  "endOfRecords"
        -]New value: +[
        +  "occurrences",
        +  "totalCount",
        +  "offset",
        +  "limit",
        +  "endOfRecords",
        +  "occurrenceStatus"
        +]
  10. 4 tool updates
    • Changedgbif_bulk_match_species4 fields changed
      • changedOutput schema / properties / results / items / properties / error / description
        Previous value: -"Failure reason when matchType is ERROR. Absent otherwise."New value: +"Failure message when matchType is ERROR. Absent otherwise."
      • addedOutput schema / properties / results / items / properties / matchedTaxonKey
        Added value: +{
        +  "description": "Backbone key of the name that actually matched. Present only when it differs from taxonKey — that is, when a synonym was resolved to its accepted taxon.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / results / items / properties / reason
        Added value: +{
        +  "description": "Machine-readable failure identifier when matchType is ERROR — e.g. invalid_filter when GBIF rejected a supplied value. Absent when the failure carried no classification, and absent on every non-ERROR entry.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / properties / taxonKey / description
        Previous value: -"Matched GBIF backbone taxon key — use in gbif_search_occurrences, gbif_count_occurrences, and gbif_occurrence_facets. Absent when matchType is NONE or ERROR."New value: +"GBIF backbone taxon key to pass to gbif_search_occurrences, gbif_count_occurrences, and gbif_occurrence_facets — the accepted taxon's key when this name is a synonym, otherwise the matched taxon's own key. Absent when matchType is NONE or ERROR."
    • Changedgbif_get_species_classification1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when the chain is empty because the taxon sits at the root of the backbone. Absent when the chain has entries.",
        +  "type": "string"
        +}
    • Changedgbif_match_species3 fields changed
      • addedOutput schema / properties / matchedTaxonKey
        Added value: +{
        +  "description": "Backbone key of the name that actually matched. Present only when it differs from taxonKey — that is, when a synonym was resolved to its accepted taxon.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when the queried name was a synonym and taxonKey was resolved to the accepted taxon. Absent when the matched name is already the accepted one.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / taxonKey / description
        Previous value: -"GBIF backbone taxon key. Use this in downstream tools. Absent when matchType is NONE."New value: +"GBIF backbone taxon key to pass to downstream tools. The accepted taxon's key when the queried name is a synonym, otherwise the matched taxon's own key."
    • Changedgbif_occurrence_facets1 field changed
      • changedOutput schema / properties / counts / description
        Previous value: -"Facet values ranked by count descending (top facetLimit entries)."New value: +"Facet values ranked by count descending — one page of up to facetLimit entries starting at facetOffset, not necessarily the top ones."
  11. 6 tool updates
    • Changedgbif_count_occurrences1 field changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Filter to a specific dataset UUID."New value: +"Filter to a specific dataset UUID (8-4-4-4-12 hex) from gbif_search_datasets."
    • Changedgbif_get_dataset2 fields changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Dataset UUID from gbif_search_datasets or an occurrence record."New value: +"Dataset UUID (8-4-4-4-12 hex) from gbif_search_datasets or an occurrence record."
      • changedOutput schema / properties / recordCount / description
        Previous value: -"Number of records in the dataset. May be absent."New value: +"Occurrence records GBIF has indexed for this dataset, matching the figure gbif_search_datasets reports. Fetched separately for OCCURRENCE datasets because the detail endpoint omits it; absent for other dataset types and when that lookup does not return in time."
    • Changedgbif_occurrence_facets1 field changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Scope the aggregation to a single dataset by its GBIF dataset UUID. Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet, or the datasetKey field on an occurrence record."New value: +"Scope the aggregation to a single dataset by its GBIF dataset UUID (8-4-4-4-12 hex). Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet, or the datasetKey field on an occurrence record."
    • Changedgbif_search_datasets1 field changed
      • changedInput schema / properties / hostingOrg / description
        Previous value: -"UUID of the hosting organization. From gbif_search_publishers results."New value: +"UUID (8-4-4-4-12 hex) of the hosting organization. From gbif_search_publishers results."
    • Changedgbif_search_occurrences2 fields changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Restrict results to a single dataset by its GBIF dataset UUID. Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet (gbif_occurrence_facets), or the datasetKey field on an occurrence record."New value: +"Restrict results to a single dataset by its GBIF dataset UUID (8-4-4-4-12 hex). Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet (gbif_occurrence_facets), or the datasetKey field on an occurrence record."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset. GBIF caps offset+limit at approximately 100,000 — use gbif_occurrence_facets for aggregate analysis beyond this."New value: +"Pagination offset. GBIF serves offset+limit up to 100,001 and rejects anything past it — use gbif_occurrence_facets for aggregate analysis beyond that."
    • Changedgbif_search_species1 field changed
      • changedInput schema / properties / datasetKey / description
        Previous value: -"Scope to a specific checklist dataset UUID. Omit to search the GBIF backbone."New value: +"Scope to a specific checklist dataset UUID (8-4-4-4-12 hex). Omit to search the GBIF backbone."
  12. 3 tool updates
    • Changedgbif_get_species_classification1 field changed
      • changedOutput schema / properties / classification / description
        Previous value: -"Classification chain ordered from root (kingdom) to the immediate parent of the queried taxon."New value: +"Classification chain ordered from root (kingdom) to the immediate parent of the queried taxon. The queried taxon itself is not included — call gbif_get_species for its own record."
    • Changedgbif_occurrence_facets4 fields changed
      • addedInput schema / properties / facetOffset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based offset into the ranked facet values, for paging past the first facetLimit values on high-cardinality dimensions like DATASET_KEY. Advance by facetLimit to fetch the next page (0, then facetLimit, then 2×facetLimit, …).",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedOutput schema / properties / facetOffset
        Added value: +{
        +  "description": "Zero-based offset applied to the ranked facet values.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / moreValuesLikely
        Added value: +{
        +  "description": "Heuristic continuation flag: true when this page returned a full facetLimit of values, so more distinct values may exist past facetOffset + facetLimit (re-call with facetOffset advanced by facetLimit). GBIF exposes no total distinct-value count, so this is an estimate, not exact.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "facet",
        -  "totalOccurrences",
        -  "counts",
        -  "facetLimit"
        -]New value: +[
        +  "facet",
        +  "totalOccurrences",
        +  "counts",
        +  "facetLimit",
        +  "facetOffset",
        +  "moreValuesLikely"
        +]
    • Changedgbif_search_datasets2 fields changed
      • changedOutput schema / properties / datasets / items / properties / description / description
        Previous value: -"Brief description. May be absent."New value: +"Brief description, truncated to a 300-character preview. May be absent."
      • addedOutput schema / properties / datasets / items / properties / descriptionTruncated
        Added value: +{
        +  "description": "True when the description was shortened to the 300-char preview; call gbif_get_dataset with this key for the full text. Omitted when the dataset has no description.",
        +  "type": "boolean"
        +}
  13. 2 tool updates
    • Changedgbif_get_dataset2 fields changed
      • addedOutput schema / properties / geographicCoverages
        Added value: +{
        +  "description": "Geographic coverage descriptions declared by the dataset. May be absent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A geographic coverage entry.",
        +    "properties": {
        +      "description": {
        +        "description": "Geographic coverage description (e.g. \"Worldwide\"). May be absent.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / temporalCoverages
        Added value: +{
        +  "description": "Temporal coverage ranges declared by the dataset. May be absent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A temporal coverage range.",
        +    "properties": {
        +      "end": {
        +        "description": "Coverage end as an ISO 8601 date-time. May be absent.",
        +        "type": "string"
        +      },
        +      "start": {
        +        "description": "Coverage start as an ISO 8601 date-time. May be absent.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedgbif_get_occurrence5 fields changed
      • addedOutput schema / properties / class
        Added value: +{
        +  "description": "Class classification. May be absent.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / classKey
        Added value: +{
        +  "description": "Backbone taxon key for the class. May be absent.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / gadm
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "GADM administrative geography — stable GIDs and names at levels 0–2. May be absent.",
        +  "properties": {
        +    "level0": {
        +      "additionalProperties": false,
        +      "description": "GADM level 0 — country. May be absent.",
        +      "properties": {
        +        "gid": {
        +          "description": "GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). May be absent.",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "Administrative-unit name. May be absent.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "level1": {
        +      "additionalProperties": false,
        +      "description": "GADM level 1 — state/province. May be absent.",
        +      "properties": {
        +        "gid": {
        +          "description": "GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). May be absent.",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "Administrative-unit name. May be absent.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "level2": {
        +      "additionalProperties": false,
        +      "description": "GADM level 2 — county/district. May be absent.",
        +      "properties": {
        +        "gid": {
        +          "description": "GADM GID — stable administrative-unit identifier (e.g. SWE, SWE.2_1). May be absent.",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "Administrative-unit name. May be absent.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / identifiers
        Added value: +{
        +  "description": "Alternative record identifiers from the source. May be absent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "An alternative identifier for the occurrence record.",
        +    "properties": {
        +      "identifier": {
        +        "description": "The identifier value. May be absent.",
        +        "type": "string"
        +      },
        +      "type": {
        +        "description": "Identifier type (e.g. URL, DOI, GBIF_PORTAL). May be absent.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / occurrenceID
        Added value: +{
        +  "description": "Darwin Core occurrenceID — the source record identifier, often a URL back to the origin record. May be absent.",
        +  "type": "string"
        +}
  14. 3 tool updates
    • Addedgbif_bulk_match_species
    • Changedgbif_get_species_children6 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "Limit applied when the result was truncated. Re-call with offset to page on.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when no children are found for a valid taxon. Absent on successful result pages."New value: +"Agent guidance — a no-children note for a valid taxon, or a pagination note when the page was capped. Absent on a complete single page."
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Children returned in this page when the result was truncated.",
        +  "type": "number"
        +}
      • removedOutput schema / properties / totalCount
        Removed value: -{
        -  "description": "Total direct children before pagination.",
        -  "type": "number"
        -}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when more children exist beyond this page. Absent on the final page.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "children",
        -  "totalCount",
        -  "offset",
        -  "limit",
        -  "endOfRecords"
        -]New value: +[
        +  "children",
        +  "offset",
        +  "limit",
        +  "endOfRecords"
        +]
    • Changedgbif_match_species1 field changed
      • changedOutput schema / properties / matchType / description
        Previous value: -"EXACT, FUZZY, HIGHERORDER, or NONE. NONE means no usable match."New value: +"EXACT, FUZZY, HIGHERRANK, or NONE. NONE means no usable match."
  15. 2 tool updates
    • Changedgbif_occurrence_facets1 field changed
      • addedInput schema / properties / datasetKey
        Added value: +{
        +  "description": "Scope the aggregation to a single dataset by its GBIF dataset UUID. Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet, or the datasetKey field on an occurrence record.",
        +  "type": "string"
        +}
    • Changedgbif_search_occurrences2 fields changed
      • addedInput schema / properties / datasetKey
        Added value: +{
        +  "description": "Restrict results to a single dataset by its GBIF dataset UUID. Obtain one from gbif_search_datasets, gbif_get_dataset, a DATASET_KEY facet (gbif_occurrence_facets), or the datasetKey field on an occurrence record.",
        +  "type": "string"
        +}
      • changedInput schema / properties / hasCoordinate / description
        Previous value: -"When true, return only georeferenced records. When false, include records without coordinates."New value: +"When true, return only georeferenced records (those with coordinates). When false, return ONLY records without coordinates. Omit the parameter entirely to include all records regardless of coordinate presence."
  16. 1 tool update
    • Changedgbif_get_dataset4 fields changed
      • addedInput schema / properties / contactLimit
        Added value: +{
        +  "default": 10,
        +  "description": "Maximum number of contacts to include (default 10, max 100). Set to 0 to omit contact detail while still reporting contactsTotal — useful when citation, license, and record count are all you need from a high-contact dataset like eBird.",
        +  "maximum": 100,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / contacts / description
        Previous value: -"Dataset contacts. May be absent."New value: +"Dataset contacts, capped at contactLimit. Absent when the dataset has no contacts or contactLimit is 0."
      • addedOutput schema / properties / contactsReturned
        Added value: +{
        +  "description": "Number of contacts included in this response (≤ contactLimit). Present when the dataset has any contacts.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / contactsTotal
        Added value: +{
        +  "description": "Total contacts on the dataset before applying contactLimit. Present when the dataset has any contacts.",
        +  "type": "number"
        +}

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Enables AI assistants to query and retrieve biodiversity data from the Global Biodiversity Information Facility (GBIF), including species, occurrences, datasets, and literature.
    58
    74 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying biodiversity data from the Global Biodiversity Information Facility (GBIF) API v1, supporting species occurrence searches and other GBIF endpoints through natural language.
    466 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables searching ENA's public sequencing data by organism, study, platform, country or date, retrieving FASTQ/BAM download URLs and checksums, and discovering available result types and fields.
    454 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.