WoRMS Marine Taxa MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@WoRMS Marine Taxa MCP Serverlook up the AphiaID and classification for Aurelia aurita"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Overview
Explore the World Register of Marine Species (WoRMS): resolve scientific or common names to AphiaIDs, follow accepted names, and retrieve taxonomic and biological evidence. The public REST API needs no key.
Tools
Tool | Description |
| Resolve exact or fuzzy scientific names, or search a common name |
| Fetch full Aphia records and optional vernacular names |
| Fetch root-to-tip classification and optional direct children |
| Follow the accepted taxon and fetch a synonym page |
| Fetch recorded distributions with optional local filters |
| Fetch attributes, references, and inheritance evidence |
| Map AphiaIDs to external identifiers, or reverse an external ID |
| Inspect identifier codes, statuses, environment flags, ranks, and trait definitions |
Related MCP server: mcp-catalogueoflife
Capability reference
Names, external IDs, and text filters accept up to 512 characters. AphiaIDs are positive safe integers; paged tools use one-based offsets advancing by 50.
Reads return whole items within a 24,000-byte paired-surface response target. Keep the original inputs and options when following zero-based continuation selectors; null means consumed. budgetLimited identifies an early byte cut. One indivisible oversized scientific item is retained intact with oversizedItem: true and requiredBytes, then continuation advances. Values are never clipped. Continuations refetch upstream data, so changes at the source can affect later segments.
worms_resolve_taxon tool
Supply either
names(up to 500 scientific names) or onevernacular; scientific reads use at most 50-name windows and return originalinputIndexpositions, preserving duplicates. ResumenextInputOffsetandnextMatchOffsetasinputOffsetandmatchOffsetagainst the unchanged names;deferredCountcounts unfinished input positionsScientific names match exactly by default;
fuzzy: trueopts in.marineOnlyandextantOnlydefault totrue; inspect every match and itsvalidAphiaId/validNamerather than assuming an ambiguous name has one answerVernacular mode accepts upstream
offset(one-based, default1) and localresultOffset(zero-based, default0); it cannot apply fuzzy matching or marine/extant filters. ConsumenextResultOffsetat the same upstream offset before advancingpage.nextOffsetand resettingresultOffsetto zeroFull 50-row upstream pages have uncertain continuation:
page.nextOffsetcan lead to an empty page. Local scientific-match continuation exposes all fetched matches; a 50-match scientific group still has unknown upstream completeness
worms_get_taxon tool
Up to 500
aphiaIds; read at most 50 frominputOffsetand resumenextInputOffsetusing the original array.inputIndexpreserves duplicate and missing positions (found: false,record: null);deferredCountcounts unfinished positionsincludeVernaculars: truerequires exactly one submitted ID; follownextVernacularOffsetasvernacularOffset, repeating the full unchanged primary record. An optional lookup failure appears asvernacularErrorwhile retaining the recordRecords preserve citations, accepted-name links, and unknown fields; a null environment flag means unknown, not false
worms_get_classification tool
One
aphiaIdreturns root-to-tiprankssegments;founddistinguishes absent classification.resultOffsetindexes the complete lineage followed by fetched children; follownextResultOffsetwith unchanged optionsincludeChildren: trueadds one page of direct children, with one-basedoffset,marineOnly: true, andextantOnly: truedefaults; these options are inactive without childrenConsume local segments at the same upstream offset before advancing
page.nextOffsetand resettingresultOffsetto zero. A full fetched 50-row children page has uncertain continuation;childrenErrorretains the lineage when optional retrieval fails
worms_get_synonyms tool
One
aphiaIdfollows the accepted taxon'svalidAphiaIdbefore retrieving synonyms;foundandguidancedistinguish a missing taxon from a name without a known accepted IDOne-based
offsetdefaults to1; consumenextResultOffsetas zero-basedresultOffsetat the same upstream offset before advancingpage.nextOffsetand resettingresultOffsetto zero. A full fetched 50-row page has uncertain continuation
worms_get_distributions tool
One
aphiaIdreturns recorded distributions in source order, retaining duplicates; follownextResultOffsetasresultOffsetwith unchanged filtersOptional
recordStatus(valid,doubtful,inaccurate),establishmentMeans,invasiveness, andoccurrencefilters combine by conjunction; status uses exact equality, the others case-insensitive whole-value equalityFiltering scans the complete fetched set before pagination.
unfilteredCountandfilteredCountdescribe complete local evidence;returnedCountdescribes this segment. No rows does not establish biological or taxon absence
worms_get_traits tool
One
aphiaId;includeInheriteddefaults totrueFollow
nextResultOffsetasresultOffsetwith unchanged options. Attribute evidence retains values, references, inheritance markers, and complete-tree topology (nodeIndex,parentIndex,depth) in preorder; parents may be on earlier segmentsMissing traits do not prove biological absence; IUCN list membership is not a Red List threat category
worms_crosswalk_id tool
Supply exactly one of
aphiaId(forward) orexternalId(reverse); reverse requirestype, while forward can omit it to query all nine systemsTypes:
algaebase,bold,dyntaxa,fishbase,iucn,lsid,ncbi,tsn,gisd; IDs remain opaque strings, including leading zeros and LSIDsForward
resultOffsetindexes whole identifiers across types in request order; follownextResultOffsetwith unchanged selectors.idscontains this segment;typeTotalsdistinguishes successful absence (zero) from IDs on other segments, and omitsfailedTypes. Reverse returnsfoundand a fullrecord;resultOffsetis inactive. No external IDs does not prove taxon absence, and an IUCN ID is not a threat assessment
worms_list_reference tool
Required
topic:external_id_types,statuses,environment_flags,ranks, ortrait_typesThe first three are available offline; statuses are a non-exhaustive guide. Ranks and trait definitions are retrieved live, with trait-key topology preserved
Follow
nextResultOffsetasresultOffsetwith the same topic;totalCountis the complete fetched entry count. Tree indices stay global across segments
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
WoRMS-specific:
Accepted-name relationships, sparse scientific facts, complete classifications, and trait hierarchy retained
Shared conservative pacing: one active upstream request and at least 500 ms between starts; bounded calls rather than register harvesting
A 45-second tool deadline and 8 MiB upstream response ceiling fail explicitly instead of clipping scientific data
Agent-friendly output:
The same data in structured output and readable text, including effective options, continuation guidance, and attribution
Optional enrichment and multi-system crosswalk outages retain useful results with typed errors; required reads fail explicitly
Credit the WoRMS Editorial Board (doi:10.14284/170) and preserve per-record citations when reusing results; see WoRMS terms of use
Getting started
Self-Hosted / Local
Add this to your MCP client configuration:
{
"mcpServers": {
"worms-marine-taxa-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/worms-marine-taxa-mcp-server@latest"]
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"worms-marine-taxa-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/worms-marine-taxa-mcp-server@latest"]
}
}
}Or with 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"]
}
}
}For Streamable HTTP, run from the installed repository:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher, or Node.js v24+ to run the built package
No WoRMS account or API key required
Installation
git clone https://github.com/cyanheads/worms-marine-taxa-mcp-server.git
cd worms-marine-taxa-mcp-server
bun install
cp .env.example .env
bun run rebuildConfiguration
No server-specific environment variables are required.
Variable | Description | Default |
| Transport: |
|
| HTTP bind address. |
|
| HTTP server port. |
|
| MCP endpoint path. |
|
| HTTP session mode: |
|
| Authentication: |
|
| Log level. |
|
| Directory for log files (Node.js only). |
|
| Framework storage backend. |
|
| Enable OpenTelemetry. |
|
See .env.example for common framework overrides.
Running the server
Local development
bun run rebuild
bun run start:stdio
# or
bun run start:httpRun checks and tests:
bun run devcheck
bun run testProject structure
Directory | Purpose |
| Eight read-only tool definitions. |
| WoRMS transport, normalization, schemas, and lossless formatting. |
| Service, tool-contract, and JSON-RPC integration tests. |
| Build, validation, documentation, and packaging commands. |
See docs/tree.md for the full tree.
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches; optional enrichment reports classified failures without discarding primary evidence
Register tools in the
createApp()arrays insrc/index.tsUse relative ESM
.jspaths for internal source imports; package imports use their package namesValidate upstream responses and preserve missing facts, source order, and attribution
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
WoRMS (World Register of Marine Species) MCP — keyless.
- groundOAuthfyi.ground
Reference data API for classification systems, real-time world data, and unit conversions
Look up genes, sequences, variants, homologs, and cross-database xrefs from Ensembl REST.
Search and fetch Wikidata entities, execute SPARQL queries, and resolve external identifiers.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides access to FishBase marine biology data including species information, ecological data, distribution records, and morphological details. Enables species name validation and conversion between common and scientific names through natural language queries.8MIT
- AlicenseNot gradedqualityBmaintenanceEnables queries about global taxonomic data, including scientific name matching, classification chains, common names, and synonyms from the Catalogue of Life index.11 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to resolve scientific names to Taxonomic Serial Numbers, traverse complete taxonomic lineages from kingdom to children, and retrieve vernacular names in all languages from an authoritative US-government taxonomy.9 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to resolve marine species names to OBIS taxon records, retrieve georeferenced ocean occurrence records with optional date filtering, and pull aggregate statistics such as record counts, contributing datasets, and observed year ranges. Queries the Ocean Biodiversity Information System keylessly over the Pipeworx gateway or as a local stdio server.8 npmMIT