关于 gbif-mcp-server
面向 GBIF 分类、出现记录、数据集和发布者的 MCP 服务。支持物种名称匹配,以及使用 Darwin Core 筛选器查询记录,并提供数据集和发布者元数据。
主要功能
- 01匹配和浏览物种分类
- 02搜索、计数和汇总出现记录
- 03获取完整 Darwin Core 记录
- 04搜索数据集和发布者
- 05读取物种与数据集资源
适用场景
- 01将科学名称解析为 GBIF 分类单元
- 02按地点和日期筛选生物多样性记录
- 03按国家或数据集汇总记录
- 04追溯记录对应的数据集元数据
MCP 相关
通过 13 个工具和 2 个资源提供 GBIF 分类、出现记录、数据集及发布者操作。支持 STDIO 和 Streamable HTTP。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://gbif.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-gbif https://gbif.caseyjhand.com/mcp{"mcpServers":{"cyanheads-gbif":{"type":"http","url":"https://gbif.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-gbif":{"type":"http","url":"https://gbif.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-gbif":{"type":"http","url":"https://gbif.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-gbif":{"serverUrl":"https://gbif.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
@cyanheads/gbif-biodiversity-mcp-server
通过 MCP 搜索 GBIF 物种分类、分布记录、数据集和发布者。支持 STDIO 或 Streamable HTTP。
概述
来自全球生物多样性信息机构(GBIF)的物种分类、分布记录、数据集和发布者信息。将名称匹配到骨干分类体系,使用 Darwin Core 筛选条件搜索并汇总超过 39 亿条分布记录,并追溯记录所属的数据集和发布者。
工具
| 工具 | 描述 |
|---|---|
gbif_match_species | 将学名与 GBIF 主干分类匹配,返回其分类单元键、置信度和分类信息 |
gbif_bulk_match_species | 一次调用匹配最多 50 个学名,按输入顺序为每个名称返回一个结果 |
gbif_get_species | 按键获取主干分类单元:分类信息、命名者信息、异名情况、俗名和计数 |
gbif_search_species | 按名称片段、分类阶元或界、科、属名称搜索或浏览主干分类 |
gbif_get_species_classification | 返回分类单元的上级分类链,按从界到直接上级的顺序排列 |
gbif_get_species_children | 列出分类单元的直接下级分类单元,例如科中的属或属中的种 |
gbif_search_occurrences | 按分类单元、地点、日期、记录依据、存在/缺失状态和 IUCN 类别搜索 39 亿条以上的出现记录 |
gbif_count_occurrences | 统计符合筛选条件的出现记录数,不获取记录本身 |
gbif_get_occurrence | 按键获取一条完整的 Darwin Core 出现记录 |
gbif_occurrence_facets | 按国家、年份、数据集、分类单元、状态及其他维度汇总出现记录数 |
gbif_search_datasets | 按关键词、类型、发布国家或发布/托管组织搜索数据集 |
gbif_get_dataset | 按 UUID 获取完整数据集元数据:引用信息、联系人、许可证、DOI、覆盖范围 |
gbif_search_publishers | 按名称或国家搜索 GBIF 注册的发布组织 |
资源
| 资源 | 描述 |
|---|---|
gbif://species/{taxonKey} | GBIF 主干分类中的分类单元记录:分类信息、命名者信息、异名状态、俗名 |
gbif://dataset/{datasetKey} | 数据集元数据:标题、描述、引用信息、许可证、联系人、覆盖范围 |
这两种资源也可以通过 gbif_get_species 和 gbif_get_dataset 访问;许多 MCP 客户端仅支持工具,不会显示资源。
能力参考
gbif_match_species 工具
- 一个学名
name(常用名请使用gbif_search_species),可选参数包括strict、用于消除歧义的kingdom和预期的rank - 返回
taxonKey(传递给出现记录工具的已接受分类单元);如果解析出异名,还会返回matchedTaxonKey;此外还返回matchType(EXACT、FUZZY、HIGHERRANK)、confidence(0–100;低于 80 时应复核)以及各分类阶元均带键值的分类信息 matchType为NONE时以no_match失败;kingdom为空时以invalid_filter失败
gbif_bulk_match_species 工具
- 学名
names,以及strict;按输入顺序处理前 50 个名称。启用读取限制(默认)时,多出的名称会按原顺序(包括重复项)返回到unprocessedNames,供下次调用使用 - 每个结果都包含
name和matchType;匹配成功时还包含taxonKey、matchedTaxonKey(异名)和confidence;未匹配的名称为NONE,查询失败则为ERROR,并包含error和(如果已分类)reason,这两种情况都不会导致整个批次失败
gbif_get_species 工具
- 一个主干分类
taxonKey;主干中不存在的键以not_found失败;GBIF 无法解析的键(小数或超出 32 位范围)以invalid_filter失败 - 返回包含各分类阶元键的分类信息、
authorship、vernacularName、numDescendants、numOccurrences、publishedIn和parentKey;当taxonomicStatus为SYNONYM时,还会返回acceptedKey和accepted
gbif_search_species 工具
q名称片段(科学名称和俗名)、rank、isExtinct和清单datasetKey(使用主干分类时省略);每页最多 1,000 条,可通过offset分页- 分类单元包含清单用法
key、可选的来源datasetKey和映射后的主干分类nubKey、rank、taxonomicStatus、分类名称、numOccurrences和numDescendants;补充信息会报告totalCount、endOfRecords和应用的taxonScope。有nubKey时,分布记录查询会使用它;否则会通过gbif_match_species解析名称。省略datasetKey时,使用 GBIF Backbone Taxonomyd7dddbf4-2cf0-4f39-9b2a-bb099caae36c kingdom、family和genus接受名称,并按 GBIF 的大小写精确匹配;范围最窄的字段生效,同时提供kingdom和更窄范围的字段时,kingdom用于消除歧义。未知名称会导致unresolved_taxon_scope错误;不属于指定科的属会导致conflicting_taxon_scope错误;范围与非主干分类datasetKey搭配时则不会匹配到任何结果。筛选条件为空或datasetKey格式错误时,会导致invalid_filter错误
gbif_get_species_classification 工具
- 提供一个
taxonKey;返回从界到直接上级、以根为先的classification,其中每项包含key、rank、name和scientificName - 不包含所查询的分类单元(请使用
gbif_get_species);根分类单元会返回空分类链及提示,未知键会导致not_found错误,无法解析的 GBIF 键会导致invalid_filter错误
gbif_get_species_children 工具
- 提供一个
taxonKey,每页最多返回 1,000 个子级,可通过offset分页;不支持筛选。未知键会导致not_found错误,无法解析的 GBIF 键会导致invalid_filter错误 - 每个子级包含
key、canonicalName、rank、taxonomicStatus、vernacularName、numOccurrences和numDescendants;GBIF 不会报告总数,因此endOfRecords(还有更多结果时会带有truncated)是继续获取结果的信号 - 后续页面为空时会提供重置偏移量的指引;对于已存在的分类单元,只有第一页为空才表示没有直接子级
gbif_search_occurrences 工具
- 筛选条件:
taxonKey(优先使用;scientificName不匹配异名)、country、publishingCountry、stateProvince、decimalLatitude/decimalLongitude范围框或 WKTgeometry、year、month、basisOfRecord、hasCoordinate、isInCluster、coordinateUncertaintyInMeters、datasetKey、occurrenceStatus、iucnRedListCategory;每页最多 300 条 - 提供的所有空间筛选条件会取交集:将
geometry与纬度或经度范围组合时,结果会限定在它们的重叠范围内 - 记录包含
key、taxonKey、taxonomicStatus、坐标、eventDate和eventTime、basisOfRecord、occurrenceStatus、iucnRedListCategory、datasetKey和issues;补充信息会报告totalCount、endOfRecords和应用的occurrenceStatus - 搜索、计数和分面结果会回显相同的
scope:实际生效的已提供生物学筛选条件,其中始终包含occurrenceStatus,但不包含分页控制参数。回显ANY,但不会向上游传递。taxonKey和scientificName以 OR 组合。支持全部 11 种 GBIF 的记录依据值,包括FOSSIL_SPECIMEN、OBSERVATION和UNKNOWN - 纬度、经度和坐标不确定度是彼此独立的可选信息;文本会以十进制度或米为单位,显示每个已提供的值,包括零
offset + limit上限为 100,001,且 GBIF 不提供游标;请求更深的结果会导致pagination_cap_exceeded错误。如需获取更多匹配结果,可按gbif_occurrence_facets中的DATASET_KEY分面进行分区。筛选值被拒绝时,会导致invalid_filter错误
gbif_count_occurrences 工具
- 接受
gbif_search_occurrences中列出的所有生物筛选条件,并遵循相同的约束和空间相交规则。isGeoreferenced仍是hasCoordinate的别名;单独传入任一参数或同时传入且值相同均有效,值冲突则会以invalid_filter失败 - 返回
count,并在丰富数据时应用occurrenceStatus;计数超过 100,001 时会附带一条注明分区路径的提示,筛选值不被接受时会以invalid_filter失败
gbif_get_occurrence 工具
- 传入搜索结果中的一个
occurrenceKey;未知的键会以not_found失败,GBIF 无法解析的键会以invalid_filter失败 - 完整的 Darwin Core 记录:
occurrenceStatus(ABSENT表示调查未发现任何个体,并非目击记录)、坐标、gadm下的 GADM 0–3 级、包含eventTime的日期、taxonomicStatus、iucnRedListCategory、机构、馆藏和目录代码、recordedBy和identifiedBy、media、identifiers以及issues
gbif_occurrence_facets 工具
facet可以是COUNTRY、STATE_PROVINCE、YEAR、MONTH、BASIS_OF_RECORD、DATASET_KEY、PUBLISHING_COUNTRY、KINGDOM_KEY、PHYLUM_KEY、CLASS_KEY、ORDER_KEY、FAMILY_KEY、GENUS_KEY、SPECIES_KEY、OCCURRENCE_STATUS、IUCN_RED_LIST_CATEGORY之一;每页最多 100 个值(facetLimit,默认值为 10),使用facetOffset分页- 接受
gbif_search_occurrences中列出的所有生物筛选条件,并遵循相同的约束和空间相交规则。请在 facet 调用和每次分区搜索中重复这些条件,以保持总体范围不变。返回按计数排序的totalOccurrences和counts;范围值不被接受时会以invalid_filter失败 - 每个 facet 请求都会多获取一个分桶,以确认是否还有后续结果。只有在存在该分桶时才会显示
truncated、shown和cap;请按公开的页面大小递增facetOffset。最后一页若恰好填满,则不会带有截断标记。后续页面为空时会提供重置偏移量的指引;第一页为空时,则会区分没有匹配的 occurrence 与该维度没有数据 DATASET_KEY分桶合计等于范围的完整总数,因此当搜索结果过大而无法分页时,可用此 facet 进行分区;YEAR、MONTH、STATE_PROVINCE和SPECIES_KEY会排除缺少该字段的记录。若要按存在/缺失情况拆分,请传入facet: OCCURRENCE_STATUS和occurrenceStatus: ANY
gbif_search_datasets 工具
- 筛选条件:
q、type(OCCURRENCE、CHECKLIST、METADATA、SAMPLING_EVENT)、publishingCountry、publishingOrg、hostingOrg;每页最多 1,000 个 - 返回
key、title、type、license、doi、recordCount,以及 300 个字符的description预览;descriptionTruncated标记预览是否经过截断(gbif_get_dataset可获取完整文本) publishingOrg匹配拥有相关数据的组织,也是gbif_search_publishers的常用关联方式;hostingOrg匹配托管该数据集的组织,两者同时使用时取交集。二者均须使用小写 UUID 格式;其他格式,以及任何不被接受的筛选值,都会以invalid_filter失败
gbif_get_dataset 工具
- 传入一个
datasetKeyUUID 和contactLimit(默认值为 10,最大值为 100;设为0会省略联系人详情,但保留contactsTotal);键格式错误时会以invalid_filter失败,键未知时则会以not_found失败 - 返回
description、citationText、license、doi、recordCount、numConstituents、包含contactsTotal和contactsReturned的contacts、temporalCoverages以及geographicCoverages
gbif_search_publishers 工具
q名称片段和country(alpha-2 或 alpha-3 格式,不区分大小写);每页最多 1,000 个- 返回组织的
key、title、country和city;该键可作为publishingOrg用于gbif_search_datasets q为空、country为空,或 GBIF 无法解析该国家时,会以invalid_filter失败
gbif://species/{taxonKey} 资源
- 作为
application/json的分类单元记录:分类名称、authorship、vernacularName、包含acceptedKey和accepted的taxonomicStatus、numDescendants taxonKey是有符号 32 位整数范围内的有符号十进制整数。该路径段会进行一次 URI 解码,并去除前后空格;接受前导+、前导零及其百分号编码形式。未知键会报错not_found;格式错误的转义序列、后缀、小数、指数形式、十六进制形式、嵌入的空格以及超出范围的值会在发起请求前报错invalid_filter。请使用gbif_match_species返回的骨干分类键,或搜索结果中的nubKey;如果没有该映射,请解析其名称
gbif://dataset/{datasetKey} 资源
gbif_get_dataset记录,以application/json返回,联系人数量固定为 10datasetKey来自gbif_search_datasets或 occurrence 记录;未知键会报错not_found,格式错误的键会报错invalid_filter
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。
GBIF 特有功能:
- GBIF API v1 的物种、occurrence、数据集和组织端点,无需密钥,并在每个请求中使用标识性
User-Agent - 同义词安全键:
gbif_match_species会将同义词解析为已接受的分类单元,occurrence 工具会使用该taxonKey进行筛选 - 默认仅查找有记录的观测:搜索、计数和 facet 工具默认将
occurrenceStatus设为PRESENT,排除缺失记录。数据集recordCount涵盖所有状态,因此其数值会高于同一键对应的gbif_count_occurrences总数 - 严格的国家代码:在 occurrence 工具和
gbif_search_datasets中,country(记录的观测地)和publishingCountry(发布者所在国家)仅接受大写 ISO 3166-1 alpha-2 代码,因为其他形式在此处会静默匹配不到结果。stateProvince按原样区分大小写匹配,因此请从STATE_PROVINCEfacet 中获取值 - 拒绝空白筛选条件:GBIF 会将空参数视为无筛选条件,因此可选筛选字段若为空或仅包含空格,会报错
invalid_filter,而不是扩大查询范围。若不使用某个字段,请将其省略
适用于 Agent 的输出:
- 范围回显:丰富化结果会报告
totalCount、endOfRecords、应用的occurrenceStatus和解析出的taxonScope,并在结果为空、总数超过上限以及stateProvince未匹配到任何内容时提供提示 - 优雅处理部分失败:
gbif_bulk_match_species会为每个名称返回一条NONE或ERROR记录,而不是使整个批次失败 - 类型化错误:
invalid_filter、not_found、no_match、unresolved_taxon_scope、conflicting_taxon_scope和pagination_cap_exceeded,每种错误都附有恢复提示 - 省略稀疏字段,而非填充为 null:仅当 GBIF 明确标记某分类单元时,才会出现
extinct - 数据集元数据会保留时间范围、单个日期以及
1975-current等原始时段;不支持的覆盖范围条目会予以说明。若无法获取补充记录数,会保留元数据并附带recordCountNotice - 发布者描述会保留段落换行,并对数字字符引用解码一次;Markdown 输出会按字面呈现发布者文本
入门
公共托管实例
可通过 https://gbif-biodiversity.caseyjhand.com/mcp 使用公共实例,无需安装。通过 Streamable HTTP 将任意 MCP 客户端指向该实例:
{
"mcpServers": {
"gbif-biodiversity-mcp-server": {
"type": "streamable-http",
"url": "https://gbif-biodiversity.caseyjhand.com/mcp"
}
}
}
自托管 / 本地
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"gbif-biodiversity-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/gbif-biodiversity-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或者使用 npx(无需 Bun):
{
"mcpServers": {
"gbif-biodiversity-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/gbif-biodiversity-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或者使用 Docker:
{
"mcpServers": {
"gbif-biodiversity-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/gbif-biodiversity-mcp-server:latest"]
}
}
}
如需使用 Streamable HTTP,请设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前置条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需凭据:此服务调用的 GBIF 端点是公开的。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/gbif-biodiversity-mcp-server.git
- 进入目录:
cd gbif-biodiversity-mcp-server
- 安装依赖:
bun install
- 配置环境:
cp .env.example .env
# optionally set GBIF_USER_AGENT to a contact URL or email
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
GBIF_BASE_URL | GBIF API 基础 URL。 | https://api.gbif.org/v1 |
GBIF_CLAMP_READ_LIMITS | 将超出限制的读取数量限制在文档规定的上限内,并披露请求值和应用值。批量匹配会处理前 50 个名称,并在 unprocessedNames 中返回其余名称。设为 false 可改为公布并强制执行拒绝上限。严格的布尔值解析会拒绝格式错误的值。 | true |
GBIF_REQUEST_TIMEOUT_MS | 每个请求的 HTTP 超时时间,单位为毫秒。 | 10000 |
GBIF_USER_AGENT | 每次 GBIF 请求中发送的 User-Agent。GBIF 要求集成方使用联系 URL 或电子邮件地址标识自身。 | 服务名称、版本和仓库 URL |
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话模式:stateless、stateful 或 auto。src/index.ts 声明为 stateless;设置此项可覆盖该值。 | stateless |
MCP_AUTH_MODE | 身份验证:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等)。 | info |
LOG_TOOL_FAILURE_PAYLOADS | 记录每次失败的工具调用参数和结果,按键名进行脱敏,并限制在 LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES(默认 16384)以内。自由格式值中的机密不会被脱敏。 | false |
LOGS_DIR | 日志文件目录(仅限 Node.js)。 | <project-root>/logs |
STORAGE_PROVIDER_TYPE | 存储后端:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。 | in-memory |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
完整的可选覆盖项列表,请参阅 .env.example。
运行服务
本地开发
-
构建并运行生产版本:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
运行检查和测试:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Docker
docker build -t gbif-biodiversity-mcp-server .
docker run --rm -p 3010:3010 gbif-biodiversity-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/gbif-biodiversity-mcp-server。默认会安装 OpenTelemetry 对等依赖;构建时添加 --build-arg OTEL_ENABLED=false 可省略这些依赖。
项目结构
| 目录 | 用途 |
|---|---|
src/mcp-server/tools | 工具定义(*.tool.ts)和共享工具实用程序。共 13 个工具,涵盖物种分类、出现记录、数据集和发布者。 |
src/mcp-server/resources | 资源定义。包含物种和数据集资源。 |
src/services/gbif | GBIF API 服务层:提供重试、超时和错误映射的 HTTP 客户端,以及原始响应类型。 |
src/config | 使用 Zod 解析和验证服务专用环境变量。 |
tests/ | 单元测试和集成测试,目录结构与 src/ 对应。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md。简要说明:
- 处理程序抛出异常,框架负责捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录日志,使用ctx.state存储数据 - 在
src/index.ts中createApp()的数组里注册新工具和资源 - 封装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出架构;绝不伪造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
本项目采用 Apache 2.0 许可证。详情请参阅 LICENSE 文件。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。