Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/gbif-biodiversity-mcp-server

REMOTE · GBIF-BIODIVERSITY.CASEYJHAND.COM · 2 COMPONENTS

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

−3 this week 83 Trust /100

Last scanned (17 hours ago)

Scores higher than 87% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Health and Science

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security83
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation. See how to fix → View diagnostics → Partial
  • HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
  • The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
  • DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
Schema Quality & AI Usability73
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 11799 tokens (~842/item across 14 items; 13 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management62
  • Stability check failed: schema churn in the 30 days we've observed: 0 tool removals, 10 breaking changes, 0 auth/transport breaks, 0 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
What we tested

Checks we ran (13)

  • TLS certificate
  • Authorization
  • HTTPS
  • HSTS header
  • DNSSEC
  • Transport
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Does not apply to this hosted endpoint (2)

  • Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
  • Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 1 Nov 26 −3
    • Stability: pass → fail ▼ security
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “gbif_search_occurrences” rewrote its description, which is the text the model reads security
    • Tool “gbif_get_dataset” rewrote its description, which is the text the model reads security
    • Tool “gbif_match_species” rewrote its description, which is the text the model reads security
    • Tool “gbif_occurrence_facets” rewrote its description, which is the text the model reads security
    • Tool “gbif_search_datasets” rewrote its description, which is the text the model reads security
    • Tool “gbif_bulk_match_species” rewrote its description, which is the text the model reads security
    • Tool “gbif_count_occurrences” rewrote its description, which is the text the model reads security
    • Schema quality: 679 → 842 ▼ functional
    • “gbif_search_publishers” changed the type of “offset”: number → integer ▼ functional
    • “gbif_search_publishers” changed the type of “limit”: number → integer ▼ functional
    • “gbif_search_occurrences” changed the type of “taxonKey”: number → integer ▼ functional
    • “gbif_search_occurrences” changed the type of “month”: number → integer ▼ functional
    • “gbif_search_occurrences” changed the type of “limit”: number → integer ▼ functional
    • “gbif_get_occurrence” changed the type of “occurrenceKey”: number → integer ▼ functional
    • “gbif_get_species” changed the type of “taxonKey”: number → integer ▼ functional
    • “gbif_get_species_children” changed the type of “limit”: number → integer ▼ functional
    • “gbif_get_species_children” changed the type of “offset”: number → integer ▼ functional
    • “gbif_get_species_children” changed the type of “taxonKey”: number → integer ▼ functional
    • “gbif_get_species_classification” changed the type of “taxonKey”: number → integer ▼ functional
    • “gbif_occurrence_facets” changed the type of “facetLimit”: number → integer ▼ functional
    • “gbif_occurrence_facets” changed the type of “facetOffset”: number → integer ▼ functional
    • “gbif_occurrence_facets” changed the type of “month”: number → integer ▼ functional
    • “gbif_occurrence_facets” changed the type of “taxonKey”: number → integer ▼ functional
    • “gbif_search_datasets” changed the type of “limit”: number → integer ▼ functional
    • “gbif_search_datasets” changed the type of “offset”: number → integer ▼ functional
    • “gbif_search_occurrences” changed the type of “offset”: number → integer ▼ functional
    • “gbif_search_species” changed the type of “offset”: number → integer ▼ functional
    • “gbif_search_species” changed the type of “limit”: number → integer ▼ functional
    • “gbif_count_occurrences” changed the type of “month”: number → integer ▼ functional
    • “gbif_count_occurrences” changed the type of “taxonKey”: number → integer ▼ functional
    • Schema quality: unverified → 100 ▲ functional
    • New resource “gbif-biodiversity-guide” functional
    • Server version: 0.7.7 → 0.8.0 functional
    • “gbif_search_occurrences” added an optional parameter “recordedBy” cosmetic
    • “gbif_search_occurrences” added an optional parameter “mediaType” cosmetic
    • “gbif_search_occurrences” added an optional parameter “institutionCode” cosmetic
    • “gbif_search_occurrences” added an optional parameter “gadmGid” cosmetic
    • “gbif_search_occurrences” added an optional parameter “catalogNumber” cosmetic
    • “gbif_count_occurrences” added an optional parameter “recordedBy” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “catalogNumber” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “gadmGid” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “includeLabels” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “institutionCode” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “mediaType” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “recordedBy” cosmetic
    • “gbif_count_occurrences” added an optional parameter “catalogNumber” cosmetic
    • “gbif_count_occurrences” added an optional parameter “gadmGid” cosmetic
    • “gbif_count_occurrences” added an optional parameter “institutionCode” cosmetic
    • “gbif_count_occurrences” added an optional parameter “mediaType” cosmetic
    • “gbif_search_publishers” reworded the description of “q” cosmetic
    • “gbif_search_publishers” reworded the description of “country” cosmetic
    • “gbif_search_datasets” reworded the description of “q” cosmetic
    • “gbif_occurrence_facets” reworded the description of “facet” cosmetic
    • “gbif_search_species” reworded the description of “q” cosmetic
  • 24 Oct 26 0
    • Tool “gbif_bulk_match_species” rewrote its description, which is the text the model reads security
    • Tool “gbif_search_occurrences” rewrote its description, which is the text the model reads security
    • Server version: 0.7.6 → 0.7.7 functional
    • “gbif_count_occurrences” reworded the description of “publishingCountry” cosmetic
    • “gbif_bulk_match_species” reworded the description of “names” cosmetic
    • “gbif_search_occurrences” reworded the description of “publishingCountry” cosmetic
    • “gbif_search_datasets” reworded the description of “publishingOrg” cosmetic
    • “gbif_search_datasets” reworded the description of “hostingOrg” cosmetic
    • “gbif_occurrence_facets” reworded the description of “facet” cosmetic
  • 23 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “gbif_search_species” rewrote its description, which is the text the model reads security
    • Tool “gbif_occurrence_facets” rewrote its description, which is the text the model reads security
    • Tool “gbif_count_occurrences” rewrote its description, which is the text the model reads security
    • Schema quality: 625 → 691 ▼ functional
    • Server version: 0.7.5 → 0.7.6 functional
    • “gbif_count_occurrences” added an optional parameter “coordinateUncertaintyInMeters” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “scientificName” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “month” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “isInCluster” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “hasCoordinate” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “decimalLongitude” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “decimalLatitude” cosmetic
    • “gbif_occurrence_facets” added an optional parameter “coordinateUncertaintyInMeters” cosmetic
    • “gbif_count_occurrences” added an optional parameter “scientificName” cosmetic
    • “gbif_count_occurrences” added an optional parameter “month” cosmetic
    • “gbif_count_occurrences” added an optional parameter “isInCluster” cosmetic
    • “gbif_count_occurrences” added an optional parameter “hasCoordinate” cosmetic
    • “gbif_count_occurrences” added an optional parameter “geometry” cosmetic
    • “gbif_count_occurrences” added an optional parameter “decimalLongitude” cosmetic
    • “gbif_count_occurrences” added an optional parameter “decimalLatitude” cosmetic
    • “gbif_count_occurrences” added an optional parameter “basisOfRecord” cosmetic
    • “gbif_search_occurrences” reworded the description of “geometry” cosmetic
    • “gbif_occurrence_facets” reworded the description of “geometry” cosmetic
    • “gbif_count_occurrences” reworded the description of “isGeoreferenced” cosmetic
  • 10 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • Server version: 0.7.4 → 0.7.5 functional
  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 20 Sept 26 0
    • Server version: 0.7.3 → 0.7.4 functional
  • 9 Sept 26 0
    • Stability: 0.97 → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://gbif-biodiversity.caseyjhand.com/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=caseyjhand.com CN=WE1,O=Google Trust Services,C=US 2 Nov 2026 31 Jan 2027 ECDSA 256 ECDSA-SHA256 995a30681ab772540e934241ca1d576c
SANs: caseyjhand.com, *.caseyjhand.com
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC secure

Validation of gbif-biodiversity.caseyjhand.com. — Secure

Zone DS Keys Algorithms Outcome
. Trust anchor 20326, 38696 8, 8 Verified
com. DS published 19718 13 Verified
caseyjhand.com. DS published 2371 13 Verified
gbif-biodiversity.caseyjhand.com. Verified address RRset verified with the apex keys
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Header Value
strict-transport-security max-age=63072000; includeSubDomains; preload
x-content-type-options nosniff

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://gbif-biodiversity.caseyjhand.com/mcp Verified 200
http (plaintext) http://gbif-biodiversity.caseyjhand.com/mcp HTTPS enforced 301 https://gbif-biodiversity.caseyjhand.com/mcp
MCP tools · 13 exposed · ~10,284 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
gbif_bulk_match_species ~433

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.

NameTypeReqDescription
namesarrayyesScientific 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…
strictboolean–When true, require an exact match for every name (no fuzzy matching). When false (default), GBIF applies fuzzy matching to tolerate minor misspellings.
NameTypeReqDescription
errorobject–Present when the call failed. Absent on success.
noticestring–Requested and applied batch size when names exceed the 50-name workload cap.
resultsarray–One result per processed input name, in input order (at most 50).
unprocessedNamesarray–Names beyond the first 50, in original order including duplicates. Submit these names in another call. Absent when every name was processed.

No examples provided.

gbif_count_occurrences ~1,993

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.

NameTypeReqDescription
basisOfRecordstring–Filter by how the occurrence was recorded; accepts every GBIF BasisOfRecord vocabulary member.
catalogNumberstring–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 sever…
coordinateUncertaintyInMetersstring–Coordinate uncertainty radius in meters, e.g. "0,1000"; range endpoints inclusive. Omit for any uncertainty; blank or whitespace-only is rejected.
countrystring–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 a…
datasetKeystring–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 an…
decimalLatitudestring–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.
decimalLongitudestring–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.
gadmGidstring–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…
geometrystring–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 unfilte…
hasCoordinateboolean–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_filte…
institutionCodestring–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 gbi…
isGeoreferencedboolean–Alias for hasCoordinate. True counts only georeferenced records; false only non-georeferenced records. Supplying both requires equal values.
isInClusterboolean–True counts likely duplicates; false excludes them. Omit to include all records. GBIF exposes membership only, with no cluster identifier.
iucnRedListCategorystring–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 Ext…
mediaTypestring–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 i…
monthinteger–Calendar month (1–12), matching the occurrence search filter.
occurrenceStatusstring–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. Us…
publishingCountrystring–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…
recordedBystring–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 wri…
scientificNamestring–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.
stateProvincestring–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 vocabul…
taxonKeyinteger–GBIF backbone taxon key from gbif_match_species. Matches the given taxon and all descendant taxa (subspecies, varieties, etc.).
yearstring–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…
NameTypeReqDescription
countnumber–Total occurrences matching the supplied filters.
errorobject–Present when the call failed. Absent on success.
noticestring–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 wh…
occurrenceStatusstring–The presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what the count covers.
scopeobject–Effective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.

No examples provided.

gbif_get_dataset ~196

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.

NameTypeReqDescription
contactLimitinteger–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 fro…
datasetKeystringyesDataset UUID (8-4-4-4-12 hex) from gbif_search_datasets or an occurrence record.
NameTypeReqDescription
capnumber–contactLimit applied when the list was capped. Raise it (max 100) to see more. Absent otherwise.
citationTextstring–Full citation text for academic reference. May be absent.
contactsarray–Dataset contacts, capped at contactLimit. Absent when the dataset has no contacts or contactLimit is 0.
contactsReturnednumber–Number of contacts included in this response (≤ contactLimit). Present when the dataset has any contacts.
contactsTotalnumber–Total contacts on the dataset before applying contactLimit. Present when the dataset has any contacts.
descriptionstring–Full dataset description. May be absent.
doistring–DOI for citation. May be absent.
errorobject–Present when the call failed. Absent on success.
geographicCoveragesarray–Geographic coverage descriptions declared by the dataset. May be absent.
keystring–Dataset UUID.
licensestring–License identifier. May be absent.
noticestring–How to reach contacts held back, or requested/applied values when contactLimit was clamped. Absent when neither applies.
numConstituentsnumber–Number of constituent sub-datasets. May be absent.
publishingCountrystring–Country code of the publishing organization.
publishingOrganizationKeystring–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 organizat…
recordCountnumber–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 fin…
recordCountNoticestring–Explains an unavailable supplementary count and how to retry. Absent after a successful lookup or a declared count.
shownnumber–Contacts included in this response when the list was capped. Absent otherwise.
temporalCoverageNoticestring–Discloses unsupported or unusable temporal entries omitted from the response. May be absent.
temporalCoveragesarray–Temporal coverage declared by the dataset, preserving supplied dates and verbatim periods. May be absent.
titlestring–Dataset title.
truncatedboolean–True when the dataset carries more contacts than contactLimit allowed through. Absent when every contact was returned.
typestring–Dataset type (OCCURRENCE, CHECKLIST, etc.).

No examples provided.

gbif_get_occurrence ~122

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.

NameTypeReqDescription
occurrenceKeyintegeryesGBIF occurrence key from gbif_search_occurrences results.
NameTypeReqDescription
basisOfRecordstring–How the occurrence was recorded.
canonicalNamestring–Canonical name without authorship.
catalogNumberstring–Catalog number within the collection. May be absent.
classstring–Class classification. May be absent.
classKeynumber–Backbone taxon key for the class. May be absent.
collectionCodestring–Collection code within the institution. May be absent.
continentstring–Continent name. May be absent.
coordinateUncertaintyInMetersnumber–Coordinate uncertainty radius in meters. May be absent.
countrystring–Country name. May be absent.
countryCodestring–ISO 3166-1 alpha-2 country code. May be absent.
datasetKeystring–UUID of the source dataset.
daynumber–Observation day. May be absent.
decimalLatitudenumber–Latitude in decimal degrees (WGS84). May be absent.
decimalLongitudenumber–Longitude in decimal degrees (WGS84). May be absent.
errorobject–Present when the call failed. Absent on success.
eventDatestring–Observation date as ISO 8601 string. May be absent.
eventTimestring–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.
familystring–Family classification.
gadmobject–GADM administrative geography — stable GIDs and names at levels 0–3. May be absent.
genusstring–Genus classification.
identifiedBystring–Identifier name(s). May be absent.
identifiersarray–Alternative record identifiers from the source. May be absent.
individualCountnumber–Number of individuals. May be absent.
institutionCodestring–Code of the contributing institution. May be absent.
issuesarray–GBIF data quality issue flags.
iucnRedListCategorystring–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 Conservat…
keynumber–GBIF occurrence key.
kingdomstring–Kingdom classification.
lifeStagestring–Life stage of the individual(s). May be absent.
localitystring–Locality description. May be absent.
mediaarray–Associated media (images, audio, video). May be absent.
monthnumber–Observation month (1–12). May be absent.
occurrenceIDstring–Darwin Core occurrenceID — the source record identifier, often a URL back to the origin record. May be absent.
occurrenceStatusstring–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 reco…
orderstring–Order classification.
phylumstring–Phylum classification.
publishingCountrystring–Country code of the publishing organization.
recordedBystring–Collector name(s). May be absent.
scientificNamestring–Scientific name from occurrence record.
sexstring–Sex of the individual(s). May be absent.
speciesstring–Species canonical name.
stateProvincestring–State or province. May be absent.
taxonKeynumber–Backbone taxon key.
taxonRankstring–Taxonomic rank of the identified taxon.
taxonomicStatusstring–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…
yearnumber–Observation year. May be absent.

No examples provided.

gbif_get_species ~128

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.

NameTypeReqDescription
taxonKeyintegeryesGBIF backbone taxon key from gbif_match_species or another taxonomy tool.
NameTypeReqDescription
acceptedstring–Scientific name of the accepted taxon when this record is a synonym.
acceptedKeynumber–Backbone key of the accepted taxon when this record is a synonym.
authorshipstring–Taxonomic authorship of the name.
canonicalNamestring–Scientific name without authorship.
classstring–Class classification.
classKeynumber–Taxon key for the class.
errorobject–Present when the call failed. Absent on success.
extinctboolean–True when the taxon is explicitly flagged as extinct. Absent on most records.
familystring–Family classification.
familyKeynumber–Taxon key for the family.
genusstring–Genus classification.
genusKeynumber–Taxon key for the genus.
keynumber–GBIF backbone taxon key.
kingdomstring–Kingdom classification.
kingdomKeynumber–Taxon key for the kingdom.
numDescendantsnumber–Count of child taxa in the backbone under this taxon.
numOccurrencesnumber–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.
orderstring–Order classification.
orderKeynumber–Taxon key for the order.
parentstring–Name of the immediate parent taxon.
parentKeynumber–Taxon key of the immediate parent.
phylumstring–Phylum classification.
phylumKeynumber–Taxon key for the phylum.
publishedInstring–Original description citation when available.
rankstring–Taxonomic rank (SPECIES, GENUS, FAMILY, etc.).
scientificNamestring–Full scientific name with authorship.
speciesstring–Species canonical name.
speciesKeynumber–Taxon key for the species.
taxonomicStatusstring–ACCEPTED, SYNONYM, DOUBTFUL, etc. SYNONYM means acceptedKey/accepted are populated.
vernacularNamestring–English common name when available.

No examples provided.

gbif_get_species_children ~114

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.

NameTypeReqDescription
limitinteger–Number of children to return (default 20, max 1000).
offsetinteger–Pagination offset.
taxonKeyintegeryesGBIF backbone taxon key from gbif_match_species or another taxonomy tool.
NameTypeReqDescription
capnumber–Limit applied when the result was truncated. Re-call with offset to page on.
childrenarray–Direct child taxa.
endOfRecordsboolean–True when there are no more results after this page.
errorobject–Present when the call failed. Absent on success.
limitnumber–Records returned in this page.
noticestring–Guidance when a valid taxon has no children, more pages remain, or an oversized limit was clamped. Absent when none applies.
offsetnumber–Current pagination offset.
shownnumber–Children returned in this page when the result was truncated.
truncatedboolean–True when more children exist beyond this page. Absent on the final page.

No examples provided.

gbif_get_species_classification ~142

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.

NameTypeReqDescription
taxonKeyintegeryesGBIF backbone taxon key from gbif_match_species or another taxonomy tool.
NameTypeReqDescription
classificationarray–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.
errorobject–Present when the call failed. Absent on success.
noticestring–Guidance when the chain is empty because the taxon sits at the root of the backbone. Absent when the chain has entries.

No examples provided.

gbif_match_species ~496

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.

NameTypeReqDescription
kingdomstring–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 w…
namestringyesScientific 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…
rankstring–Expected taxonomic rank. Use to avoid matching a genus when you expect a species.
strictboolean–When true, only return an exact match. When false (default), GBIF applies fuzzy matching — useful for minor spelling variations and abbreviated names.
NameTypeReqDescription
canonicalNamestring–Scientific name without authorship.
classstring–Class of the matched taxon.
classKeynumber–Backbone taxon key for the class.
confidencenumber–Match confidence score 0–100. Below 80 warrants review. A HIGHERRANK match can score above 90, so read matchType too.
errorobject–Present when the call failed. Absent on success.
familystring–Family of the matched taxon.
familyKeynumber–Backbone taxon key for the family.
genusstring–Genus of the matched taxon.
genusKeynumber–Backbone taxon key for the genus.
kingdomstring–Kingdom of the matched taxon.
kingdomKeynumber–Backbone taxon key for the kingdom.
matchTypestring–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…
matchedTaxonKeynumber–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.
noticestring–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 hig…
orderstring–Order of the matched taxon.
orderKeynumber–Backbone taxon key for the order.
phylumstring–Phylum of the matched taxon.
phylumKeynumber–Backbone taxon key for the phylum.
rankstring–Taxonomic rank of the matched taxon.
scientificNamestring–Full scientific name with authorship.
speciesstring–Species canonical name of the matched taxon.
speciesKeynumber–Backbone taxon key for the species.
statusstring–Taxonomic status: ACCEPTED, SYNONYM, or DOUBTFUL.
taxonKeynumber–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.

No examples provided.

gbif_occurrence_facets ~2,556

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.

NameTypeReqDescription
basisOfRecordstring–Scope to a specific basis of record.
catalogNumberstring–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 sever…
coordinateUncertaintyInMetersstring–Coordinate uncertainty radius in meters, e.g. "0,1000"; range endpoints inclusive. Omit for any uncertainty; blank or whitespace-only is rejected.
countrystring–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…
datasetKeystring–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 occurre…
decimalLatitudestring–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.
decimalLongitudestring–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.
facetstringyesDimension 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 oc…
facetLimitinteger–Maximum number of facet values to return (default 10, max 100).
facetOffsetinteger–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 face…
gadmGidstring–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…
geometrystring–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…
hasCoordinateboolean–True includes records with coordinates; false only records without coordinates. Omit for both.
includeLabelsboolean–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 buck…
institutionCodestring–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 gbi…
isInClusterboolean–True includes likely duplicates; false excludes them. Omit to include all records. GBIF exposes membership only, with no cluster identifier.
iucnRedListCategorystring–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 Extin…
mediaTypestring–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 i…
monthinteger–Calendar month (1–12), matching the occurrence search filter.
occurrenceStatusstring–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…
publishingCountrystring–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…
recordedBystring–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 wri…
scientificNamestring–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.
stateProvincestring–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…
taxonKeyinteger–Backbone taxon key to scope the aggregation. Matches the given taxon and all descendant taxa (subspecies, varieties, etc.).
yearstring–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 dro…
NameTypeReqDescription
capnumber–facetLimit applied when the page was capped. Re-call with facetOffset advanced by this value to page on. Absent otherwise.
countsarray–Facet values ranked by count descending — one page of up to facetLimit entries starting at facetOffset, not necessarily the top ones.
errorobject–Present when the call failed. Absent on success.
facetstring–The facet dimension aggregated.
facetLimitnumber–Maximum facet values requested.
facetOffsetnumber–Zero-based offset applied to the ranked facet values.
noticestring–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 rec…
occurrenceStatusstring–The presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what totalOccurrences and every bucket cover.
scopeobject–Effective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.
shownnumber–Facet values returned in this page when the page was capped. Absent otherwise.
totalOccurrencesnumber–Total matching occurrences across all facet values.
truncatedboolean–Present and true only when an extra upstream bucket proves another page exists. Absent on the final page, including an exactly full final page.

No examples provided.

gbif_search_datasets ~611

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.

NameTypeReqDescription
hostingOrgstring–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…
limitinteger–Number of datasets to return (default 20, max 1000).
offsetinteger–Pagination offset.
publishingCountrystring–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…
publishingOrgstring–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 organiz…
qstring–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 e…
typestring–Filter by dataset type. OCCURRENCE for observation records, CHECKLIST for species lists.
NameTypeReqDescription
datasetsarray–Matching datasets.
endOfRecordsboolean–True when there are no more results after this page.
errorobject–Present when the call failed. Absent on success.
limitnumber–Datasets returned in this page.
noticestring–Guidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies.
offsetnumber–Current pagination offset.
totalCountnumber–Total matching datasets before pagination.

No examples provided.

gbif_search_occurrences ~2,424

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.

NameTypeReqDescription
basisOfRecordstring–Filter by how the occurrence was recorded. HUMAN_OBSERVATION covers citizen science. PRESERVED_SPECIMEN covers natural history collections.
catalogNumberstring–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 sever…
coordinateUncertaintyInMetersstring–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 o…
countrystring–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.…
datasetKeystring–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…
decimalLatitudestring–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 valu…
decimalLongitudestring–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…
gadmGidstring–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…
geometrystring–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…
hasCoordinateboolean–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…
institutionCodestring–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 gbi…
isInClusterboolean–Filter 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 is…
iucnRedListCategorystring–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 Ex…
limitinteger–Number of records to return (default 20, max 300).
mediaTypestring–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 i…
monthinteger–Calendar month (1–12). Useful for seasonal distribution queries.
occurrenceStatusstring–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…
offsetinteger–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…
publishingCountrystring–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…
recordedBystring–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 wri…
scientificNamestring–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 t…
stateProvincestring–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 vocabul…
taxonKeyinteger–GBIF 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.).
yearstring–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…
NameTypeReqDescription
endOfRecordsboolean–True when there are no more results after this page.
errorobject–Present when the call failed. Absent on success.
limitnumber–Records returned in this page.
noticestring–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 n…
occurrenceStatusstring–The presence/absence filter applied upstream — PRESENT, ABSENT, or ANY when no filter was sent. Says what totalCount and the returned records cover.
occurrencesarray–Occurrence records matching the filters.
offsetnumber–Current pagination offset.
scopeobject–Effective supplied biological filters, with occurrenceStatus always included; excludes pagination and facet controls.
totalCountnumber–Total matching occurrences before pagination.

No examples provided.

gbif_search_publishers ~304

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.

NameTypeReqDescription
countrystring–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…
limitinteger–Number of organizations to return (default 20, max 1000).
offsetinteger–Pagination offset.
qstring–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 w…
NameTypeReqDescription
endOfRecordsboolean–True when there are no more results after this page.
errorobject–Present when the call failed. Absent on success.
limitnumber–Organizations returned in this page.
noticestring–Guidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies.
offsetnumber–Current pagination offset.
publishersarray–Matching organizations.
totalCountnumber–Total matching organizations before pagination.

No examples provided.

gbif_search_species ~765

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.

NameTypeReqDescription
datasetKeystring–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 datase…
familystring–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" s…
genusstring–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 su…
isExtinctboolean–Filter to extinct (true) or extant (false) taxa.
kingdomstring–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" re…
limitinteger–Number of records to return (default 20, max 1000).
offsetinteger–Pagination offset.
qstring–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 answer…
rankstring–Filter to a specific taxonomic rank.
NameTypeReqDescription
endOfRecordsboolean–True when there are no more results after this page.
errorobject–Present when the call failed. Absent on success.
limitnumber–Records returned in this page.
noticestring–Guidance when results are empty, paging overshot, or an oversized read limit was clamped. Absent when none applies.
offsetnumber–Current pagination offset.
taxaarray–Matching taxa.
taxonScopestring–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.
totalCountnumber–Total matches before pagination.

No examples provided.

Install

How do I install the io.github.cyanheads/gbif-biodiversity-mcp-server server?

io.github.cyanheads/gbif-biodiversity-mcp-server is a hosted endpoint at https://gbif-biodiversity.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · gbif-biodiversity.caseyjhand.com

# add to Claude Code
claude mcp add --transport http cyanheads-gbif-biodiversity-mcp-server 'https://gbif-biodiversity.caseyjhand.com/mcp'
Common questions

What is the io.github.cyanheads/gbif-biodiversity-mcp-server server?

io.github.cyanheads/gbif-biodiversity-mcp-server is listed in the public MCP registry as io.github.cyanheads/gbif-biodiversity-mcp-server. Search GBIF species taxonomy, occurrence records, datasets, and publishers. This page covers its hosted endpoint (https://gbif-biodiversity.caseyjhand.com/mcp).

Is the io.github.cyanheads/gbif-biodiversity-mcp-server server safe to use?

io.github.cyanheads/gbif-biodiversity-mcp-server scores 83 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.cyanheads/gbif-biodiversity-mcp-server server expose?

io.github.cyanheads/gbif-biodiversity-mcp-server exposes 13 tools: gbif_match_species, gbif_bulk_match_species, gbif_get_species, gbif_search_species, gbif_get_species_classification, and 8 more. Their descriptions and schemas cost roughly 10,284 tokens of context every time the server is loaded.

Does the io.github.cyanheads/gbif-biodiversity-mcp-server server require authentication?

No. We connected to io.github.cyanheads/gbif-biodiversity-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

Is the io.github.cyanheads/gbif-biodiversity-mcp-server server still maintained?

io.github.cyanheads/gbif-biodiversity-mcp-server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What did VerifyMCP test on the io.github.cyanheads/gbif-biodiversity-mcp-server server?

VerifyMCP ran 13 checks on io.github.cyanheads/gbif-biodiversity-mcp-server, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.