关于 worms-marine-taxa-mcp-server
通过 MCP 提供世界海洋物种名录(WoRMS)分类数据的服务。研究人员和开发者可解析名称,并获取分类、异名、分布、性状及外部标识符。
主要功能
- 01解析学名和俗名
- 02获取分类单元记录与分类层级
- 03查询异名和分布记录
- 04获取性状与外部标识符
- 05筛选结果并分页读取
适用场景
- 01将海洋物种名称解析为 AphiaID
- 02查看分类单元的谱系和异名
- 03核查记录的分布与性状
- 04将 AphiaID 映射到外部标识符
MCP 相关
通过 STDIO 或 Streamable HTTP 向 MCP 客户端提供八种工具,调用公开的 WoRMS REST API 解析分类单元并获取相关数据。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://worms-marine-taxa.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-worms-marine-taxa https://worms-marine-taxa.caseyjhand.com/mcp{"mcpServers":{"cyanheads-worms-marine-taxa":{"type":"http","url":"https://worms-marine-taxa.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-worms-marine-taxa":{"type":"http","url":"https://worms-marine-taxa.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-worms-marine-taxa":{"type":"http","url":"https://worms-marine-taxa.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-worms-marine-taxa":{"serverUrl":"https://worms-marine-taxa.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
8| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| topic | enum | 是 | 参考主题:external_id_types、statuses、environment_flags、distribution_terms、ranks 或 trait_types。external_id_types | statuses | environment_flags | distribution_terms | ranks | trait_types |
| resultOffset | integer | 否 | 从 0 开始的本地位置;使用未更改的选择器和选项重新提交。 |
详细介绍
@cyanheads/worms-marine-taxa-mcp-server
解析 WoRMS 海洋物种名称;通过 MCP 获取分类、异名、分布、特征和 ID。支持 STDIO 或 Streamable HTTP。
概述
来自 World Register of Marine Species(WoRMS) 的海洋分类学数据。将学名或俗名解析为 AphiaID,追踪接受名,并从无需密钥的 WoRMS REST API 获取分类、异名、分布、特征和外部标识符。
每个 AphiaID 选择器都接受正的安全整数、十进制字符串或规范的 WoRMS LSID,例如 urn:lsid:marinespecies.org:taxname:137205;返回的 AphiaID 始终为数字。对于其他 LSID,请使用 worms_crosswalk_id,并传入 externalId 和 type: "lsid";也可以使用 worms_resolve_taxon 解析学名。
工具
| 工具 | 描述 |
|---|---|
worms_resolve_taxon | 将学名(精确或模糊)或一个俗名解析为 AphiaID,并提供接受名链接 |
worms_get_taxon | 按 AphiaID 获取完整的 Aphia 记录,可选包含俗名或来源 |
worms_get_classification | 获取从根到末端的分类,可选包含直接子项 |
worms_get_synonyms | 列出 AphiaID 对应的接受分类单元的同义名 |
worms_get_distributions | 获取记录的分布,可按状态、定居方式、入侵性或出现情况筛选 |
worms_get_traits | 获取属性树(体型、功能群、保护名录),包含来源和继承信息 |
worms_crosswalk_id | 将 AphiaID 映射到九种外部标识符系统,或反向解析外部 ID |
worms_list_reference | 列出标识符系统、状态、环境标记、分布筛选值、分类阶元和性状定义 |
功能参考
worms_resolve_taxon 工具
- 需提供非空的
names列表(输入总量不限,每次上游请求最多 50 个),或一个vernacular,两者不能同时提供。fuzzy: true可启用 TAXAMATCH 匹配;对于names,marineOnly和extantOnly默认均为true。俗名搜索会匹配完整的已记录俗名;设置vernacularMatch: "contains"时,则会匹配所有包含该文本的已记录名称(grouper没有精确匹配结果,但使用包含匹配可找到许多结果);俗名搜索不应用这两个筛选条件 - 每个结果都会保留其
inputIndex(包括重复项),包含每个匹配项的status、validAphiaId和validName;未匹配时会提供一行guidance;使用nextInputOffset和nextMatchOffset继续获取结果 - 俗名结果使用上游的
offset分页(从 1 开始,每次递增 50),以及本地的resultOffset
worms_get_taxon 工具
- 需提供非空的
aphiaIds列表,输入总量不限,每次请求最多获取 50 个;使用未更改的列表和nextInputOffset继续获取。未知 ID 会在原位置保留为found: false;获取前会验证每个提交的元素 includeVernaculars: true(仅限一个 ID)会添加俗名,并使用vernacularOffset分页;查找失败时,会在记录旁返回vernacularErrorincludeSources: true(仅限一个 ID,不能与includeVernaculars同时使用)会添加该分类单元的来源,例如其original description和basis of record,并原样返回reference、page、url、link、fulltext和doi。可选的sourceUse: "original description"会在应用sourceOffset和字节预算前,忽略大小写筛选完整的用途值;留空时不应用筛选,有值时则不进行修剪。使用未更改的选项和nextSourceOffset继续获取,以重复返回完整的主要记录,并按顺序重建所有选中的行- 成功的来源结果会报告完整选中书目的
sourceTotalCount;仅在实际应用筛选时报告unfilteredSourceCount。提示会区分没有匹配用途、书目为空和偏移量超出范围。查找失败时,会在记录旁返回sourcesError,且不含计数;未启用includeSources时,sourceUse不生效
worms_get_classification 工具
- 一个
aphiaId;ranks是从根到末端的谱系,WoRMS 没有记录时返回found: false includeChildren: true会添加一页直接子项(每页 50 行),可使用offset、marineOnly和extantOnly;子项查找失败时,会在谱系旁返回childrenError- 提交的 AphiaID 保留其自身记录的谱系。
notice会指出其关联的接受 AphiaID,或接受名的首选 AphiaID 表示形式;状态查找失败时,会在谱系旁返回statusError
worms_get_synonyms 工具
- 一个
aphiaId,无论是否为接受名:同义名均按其接受分类单元(validAphiaId)列出,上游offset每页 50 个 found和guidance可区分分类单元缺失与名称没有已知接受 ID 的情况
worms_get_distributions 工具
- 一个
aphiaId;可选的recordStatus(valid、doubtful、inaccurate)、establishmentMeans、invasiveness和occurrence筛选条件按 AND 组合。recordStatus不区分大小写,并忽略首尾空白,回显时使用其小写代码;其他筛选条件按不区分大小写的完整值匹配,不会去除非空字符串的首尾空白,观测到的值见worms_list_reference的distribution_terms主题。空白筛选条件会被忽略 - 报告
unfilteredCount和filteredCount;每行包含地点、其 MarineRegionslocationId以及状态字段,顺序与源数据一致 - WoRMS 会将记录关联到单个名称用法,因此默认情况下,工具只读取该 AphiaID 自身的记录。
includeSynonyms: true会合并接受分类单元及其同物异名的记录,每次调用处理 10 个同物异名,每行均标记sourceAphiaId;synonymUnion会报告处理窗口、用于继续处理的nextSynonymOffset以及任何failedSynonyms notice会指出关联的已接受 AphiaID,并区分已接受的替代表示与首选 AphiaID;若未设置includeSynonyms,状态查询失败时会在各行旁返回statusError
worms_get_traits 工具
- 一个
aphiaId;includeInherited(默认值为true)会添加记录在高阶分类单元上的属性。对于已接受的分类单元,无论includeInherited设置为何值,WoRMS 也会返回记录在其同物异名上的属性;两种情况下,inheritedFrom都会指出来源分类单元 notice会指出关联的已接受 AphiaID,并区分已接受的替代表示与首选 AphiaID;状态查询失败时会在各属性旁返回statusError- 每个节点都保留完整树中的
nodeIndex、parentIndex和depth,因此翻页时单位和限定词仍与对应值关联;值和引用均按原样返回 measurementType(按不区分大小写的完整值匹配,例如Body size)会保留每个匹配节点及其子树和祖先节点,索引保持不变;totalCount统计该结果集,unfilteredCount统计整棵树
worms_crosswalk_id 工具
aphiaId(正向查询)或带有type的externalId(反向查询)必须且只能提供一个。正向查询可读取一种type,也可读取全部九种:algaebase、bold、dyntaxa、fishbase、iucn、lsid、ncbi、tsn、gisd- 正向查询按类型返回
ids、typeTotals(0 表示没有记录)以及出错系统对应的failedTypes;反向查询返回found和完整记录。ID 保持为不透明字符串,包括前导零
worms_list_reference 工具
topic:external_id_types、statuses、environment_flags和distribution_terms离线提供;ranks和trait_types实时读取statuses涵盖 WoRMS 手册和 REST API 文档记录的 28 种状态,每种都附有一行释义和一个group(accepted、unaccepted、uncertain、technical)。记录的状态可能就是具体原因本身,例如junior subjective synonym,因此应检查group,而不是检查status === "unaccepted";此指南并未穷尽所有情况distribution_terms列出 WoRMS 分布记录中观测到的establishmentMeans、invasiveness和occurrence值,供worms_get_distributions的完整值筛选使用;列表并未穷尽所有情况- 使用
resultOffset翻页;特征定义在翻页时保留其树索引
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),并提供结构化日志记录和可选的 OpenTelemetry 跟踪。
WoRMS 专属功能:
- 精确匹配和 TAXAMATCH 模糊名称匹配,支持海洋和现存筛选;每个匹配项和记录均包含其接受名链接
- 使用共享请求队列:同一时间仅发送一个上游请求,每次请求启动间隔 500 ms,工具截止时间为 45 秒,响应上限为 8 MiB
- 每次调用单独检索,不使用缓存或批量采集,符合 WoRMS Web 服务指南的要求
- 每个响应均包含 WoRMS 署名信息(doi:10.14284/170);引用 WoRMS 编辑委员会,并在重用结果时保留每条记录的引文(条款)
便于 Agent 使用的输出:
- 按字节限制分页:读取时返回完整条目,响应上限为 24,000 字节,并标示下一个偏移量(
nextResultOffset、nextInputOffset、上游的page.nextOffset);如果上游页面包含完整的 50 行,则报告hasMore: null,而不是猜测 - 未知信息保持未知:null 和缺失字段均原样传递,null 环境标志表示未记录,空证据不会被解释为生物学上的不存在
- 部分失败:可选查询(
vernacularError、sourcesError、childrenError、statusError)、同义词集合中的failedSynonyms,以及交叉映射中的failedTypes会保留已获取的数据,并提供带类型的原因和恢复提示
开始使用
公共托管实例
公共实例已上线:https://worms-marine-taxa.caseyjhand.com/mcp,无需安装。该实例提供 Streamable HTTP;每种客户端的配置格式各不相同。
对于 Claude Code:
claude mcp add --transport http worms-marine-taxa-mcp-server https://worms-marine-taxa.caseyjhand.com/mcp
对于 Cline(cline_mcp_settings.json):
{
"mcpServers": {
"worms-marine-taxa-mcp-server": {
"type": "streamableHttp",
"url": "https://worms-marine-taxa.caseyjhand.com/mcp"
}
}
}
对于 Cursor(mcp.json):
{
"mcpServers": {
"worms-marine-taxa-mcp-server": {
"url": "https://worms-marine-taxa.caseyjhand.com/mcp"
}
}
}
Claude Desktop 可在 Settings → Connectors 下添加远程服务。
自托管 / 本地运行
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"worms-marine-taxa-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/worms-marine-taxa-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
也可以使用 npx(无需 Bun):
{
"mcpServers": {
"worms-marine-taxa-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/worms-marine-taxa-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
也可以使用 Docker:
{
"mcpServers": {
"worms-marine-taxa-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/worms-marine-taxa-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+)。
- 无需 API 密钥或账户:WoRMS REST API 是公开的。
安装
- 克隆代码仓库:
git clone https://github.com/cyanheads/worms-marine-taxa-mcp-server.git
- 进入目录:
cd worms-marine-taxa-mcp-server
- 安装依赖项:
bun install
- 配置环境:
cp .env.example .env
配置
服务没有专属变量;以下是框架通用设置。
| 变量 | 描述 | 默认值 |
|---|---|---|
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话模式:stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等)。 | info |
LOGS_DIR | 日志文件目录(仅限 Node.js)。 | <app-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
项目结构
| 目录 | 用途 |
|---|---|
src/mcp-server/tools/definitions | 工具定义(*.tool.ts)。包含八个只读工具。 |
src/services/worms | WoRMS 服务:限速传输、规范化、领域架构、响应预算和格式化。 |
docs/ | 设计约定(design.md)和生成的目录树。 |
tests/ | 服务、工具契约和 JSON-RPC 集成测试。 |
开发指南
请参阅 CLAUDE.md 了解开发指南和架构规则。简而言之:
- 处理程序抛出异常,框架负责捕获;可选查询会在主要数据旁报告分类后的失败,而不是将其丢弃
- 在
src/index.ts的createApp()数组中注册新工具 - 内部导入使用带
.js扩展名的相对 ESM 路径 - 封装外部 API 调用:校验原始数据 → 规范化为领域类型 → 返回输出架构;绝不捏造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
本项目采用 Apache 2.0 许可证。详情请参阅 LICENSE 文件。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。