worms-marine-taxa-mcp-server
Server Details
Resolve WoRMS marine species names; fetch classifications, synonyms, distributions, traits, and IDs.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP ยท MCP 2025-11-25
- URL
- Repository
- cyanheads/worms-marine-taxa-mcp-server
- GitHub Stars
- 1
- Server Listing
- WoRMS Marine Taxa MCP Server
TDQS
Scored across 8 tools
Each tool targets a distinct WoRMS operation: name resolution, full taxon lookup, classification, synonyms, distributions, traits, external-ID crosswalk, and reference metadata. Although many tools accept AphiaID or LSID, their specific facets and outputs are clearly separated. The reference-metadata tool is broader than the others but does not overlap with data-retrieval tools.
All tools use the same worms_ prefix and snake_case verb_noun pattern: resolve_taxon, get_taxon, get_classification, and so on. The only minor stylistic quirk is list_reference using a singular noun, but the overall convention is consistent and predictable.
Eight tools are well-scoped for a read-only taxonomic data server. Each tool covers a meaningful WoRMS capability, and there is no obvious redundancy or missing major endpoint that would require splitting or merging tools.
The surface covers the main taxonomic workflows: resolving names, retrieving taxon records, classification, synonyms, distributions, traits, crosswalks, and reference metadata. Minor gaps exist because child listing, vernaculars, and sources are embedded as options rather than dedicated operations, but agents can still complete core tasks.
Available Tools
8 toolsworms_crosswalk_idWorms Crosswalk IdARead-onlyIdempotentInspect
Crosswalk an AphiaID from worms_resolve_taxon to one or all nine external identifier systems, or reverse an externalId with required type to a full taxon record. Supply exactly one selector. Forward resultOffset indexes whole identifiers across types in requested order; resume nextResultOffset with unchanged selectors. typeTotals distinguishes successful absence from IDs on another segment; failed types remain separate. IDs stay opaque, including leading zeros and LSIDs. No IDs cannot establish taxon absence; IUCN identifiers are not threat categories.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Required for reverse; omit forward to query all nine types. Codes ignore case and surrounding whitespace. See worms_list_reference external_id_types. | |
| aphiaId | No | Forward numeric AphiaID, decimal string, or canonical WoRMS LSID; mutually exclusive with externalId. | |
| externalId | No | Reverse selector; opaque identifier up to 512 characters; blank omitted. | |
| resultOffset | No | Zero-based forward identifier position across types in requested order; repeat unchanged selectors. Inactive for reverse lookup. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ids | No | This segment of answered types; consult typeTotals to distinguish empty evidence from IDs on another segment. |
| echo | No | Effective crosswalk selectors. |
| type | No | Explicitly selected identifier system. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Reverse match state; null in forward mode. |
| notice | No | Partial-outage retry guidance. |
| record | No | Reverse matched record only. |
| aphiaId | No | Supplied or matched taxon ID; null for reverse misses. |
| guidance | No | Guidance when no identifiers or reverse match are found. |
| direction | No | Selected crosswalk direction. |
| byteBudget | No | Complete serialized response byte target. |
| externalId | No | Opaque reverse identifier, preserved as text. |
| totalCount | No | Known local sequence length before pagination. |
| typeTotals | No | Answered types only; zero means successful absence; failed types are omitted. |
| attribution | No | WoRMS source attribution. |
| failedTypes | No | Failed types in fixed vocabulary order. |
| resultOffset | No | Zero-based starting position in the complete local sequence. |
| budgetLimited | No | Whether the byte budget ended this local page early. |
| oversizedItem | No | One indivisible scientific item exceeds the target; retained intact with forward progress. |
| requiredBytes | No | Serialized paired-surface result bytes for an oversized item, excluding transport-added metadata. |
| returnedCount | No | Whole scientific items returned on this segment. |
| nextResultOffset | No | Next local position; null when consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, but the description adds substantial behavioral context: identifiers stay opaque (including leading zeros and LSIDs), no IDs cannot establish taxon absence, IUCN identifiers are not threat categories, and typeTotals separates absence from another-segment IDs. These are meaningful operational caveats beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every clause carries useful information. It is somewhat dense and semicolon-packed, but there is no obvious filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. It covers the key gaps: selector rules, reverse/forward behavior, pagination resumption, opaque ID handling, and absence semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the four parameters well. The description still adds value by clarifying selector exclusivity, forward-vs-reverse type behavior, and the meaning of resultOffset as a position across identifier types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: crosswalk an AphiaID to/from external identifier systems. It also distinguishes the tool from worms_resolve_taxon and worms_list_reference, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to supply exactly one selector, that type is required for reverse lookup and omitted for forward lookup across all nine types, and that AphiaID comes from worms_resolve_taxon. It also gives pagination guidance for resultOffset and nextResultOffset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worms_get_classificationWorms Get ClassificationARead-onlyIdempotentInspect
Retrieve root-to-tip classification and optional direct children for an AphiaID or canonical WoRMS LSID. resultOffset indexes lineage followed by fetched children; consume nextResultOffset with unchanged options and upstream offset before advancing page.nextOffset and resetting resultOffset to zero. Missing ranks remain unknown; child offset and filters are inactive without includeChildren. A full fetched 50-row child page has uncertain continuation and can lead to an empty page. The submitted ID keeps its own recorded lineage; a notice names its linked accepted ID, distinguishing an accepted alternative representation from its preferred ID.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | One-based starting record, advancing by 50; default 1. | |
| aphiaId | Yes | Positive safe-integer AphiaID, decimal string, or canonical urn:lsid:marinespecies.org:taxname:<AphiaID>; outputs remain numeric. | |
| extantOnly | No | Extant children only; inactive without includeChildren. | |
| marineOnly | No | Marine children only; inactive without includeChildren. | |
| resultOffset | No | Zero-based position in lineage followed by fetched children; keep upstream offset unchanged until nextResultOffset is null. | |
| includeChildren | No | Also fetch one page of direct children. |
Output Schema
| Name | Required | Description |
|---|---|---|
| echo | No | Effective options; child-only options inactive when includeChildren is false. |
| page | No | Children pagination only. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Whether classification exists. |
| ranks | No | This segment of the root-to-tip lineage. |
| notice | No | Linked accepted/preferred-AphiaID and empty-children-page guidance, in that order. |
| aphiaId | No | Positive safe-integer AphiaID; obtain from worms_resolve_taxon. |
| children | No | One page of direct children when requested and retrieved. |
| guidance | No | Next step for absent classification. |
| byteBudget | No | Complete serialized response byte target. |
| totalCount | No | Known local sequence length before pagination. |
| attribution | No | WoRMS source attribution. |
| statusError | No | Failed taxonomic-status read; evidence is unaffected, but whether the AphiaID is its accepted name is unknown. |
| resultOffset | No | Zero-based starting position in the complete local sequence. |
| budgetLimited | No | Whether the byte budget ended this local page early. |
| childrenError | No | Optional children retrieval failure. |
| oversizedItem | No | One indivisible scientific item exceeds the target; retained intact with forward progress. |
| requiredBytes | No | Serialized paired-surface result bytes for an oversized item, excluding transport-added metadata. |
| returnedCount | No | Whole scientific items returned on this segment. |
| nextResultOffset | No | Next local position; null when consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses non-obvious behavior: missing ranks remain unknown, child filters are inactive without includeChildren, a full 50-row child page has uncertain continuation, and accepted-ID notices distinguish alternative representations. These are meaningful operational caveats for an open-world taxonomic lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the dense pagination details are relevant, but the second and final sentences are long and syntactically complex. It earns its length through operational content, though clearer structure would improve readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the available output schema, full parameter schema coverage, and safety annotations, the description is complete for correct invocation. It covers the tricky pagination lifecycle and edge cases that an agent would otherwise likely mishandle.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real value by explaining that resultOffset indexes lineage first and then fetched children, and by clarifying the interaction between nextResultOffset, page.nextOffset, and resetting resultOffset.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieve root-to-tip classification and optional direct children for an AphiaID or LSID. It clearly distinguishes what data is returned, though it does not explicitly contrast itself with sibling tools such as worms_get_taxon or worms_get_synonyms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains pagination mechanics but does not state when to use this tool instead of alternatives like worms_get_taxon, worms_get_synonyms, or worms_get_traits. It also omits the prerequisite, present only in the schema, that the AphiaID should come from worms_resolve_taxon.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worms_get_distributionsWorms Get DistributionsARead-onlyIdempotentInspect
Retrieve recorded distributions for an AphiaID or canonical WoRMS LSID in byte-budgeted segments; resume nextResultOffset as resultOffset with unchanged selectors and filters. WoRMS attaches records to individual name usages, so one AphiaID's rows can miss those of its synonyms: includeSynonyms combines the accepted taxon's rows with those of up to 10 synonyms per call, each row tagged sourceAphiaId; consume nextResultOffset before advancing synonymOffset to synonymUnion.nextSynonymOffset with resultOffset 0. Filters apply to the complete fetched set before pagination and combine by conjunction: recordStatus normalizes case and surrounding whitespace before exact matching; others use case-insensitive whole-value equality without trimming. Rows retain duplicates and source order; no rows does not prove biological or taxon absence. A notice names the linked accepted ID, distinguishing an accepted alternative representation from its preferred ID.
| Name | Required | Description | Default |
|---|---|---|---|
| aphiaId | Yes | Positive safe-integer AphiaID, decimal string, or canonical urn:lsid:marinespecies.org:taxname:<AphiaID>; outputs remain numeric. | |
| occurrence | No | Case-insensitive whole-value occurrence filter, such as Established; blank omitted. Observed values: worms_list_reference topic: distribution_terms. | |
| invasiveness | No | Case-insensitive whole-value invasiveness filter, such as Invasive; blank omitted. Observed values: worms_list_reference topic: distribution_terms. | |
| recordStatus | No | Record status valid, doubtful, or inaccurate; ignores case and surrounding whitespace; blank means no filter. | |
| resultOffset | No | Zero-based local position; resubmit unchanged selectors and options. | |
| synonymOffset | No | Zero-based synonym position; once nextResultOffset is null, resubmit synonymUnion.nextSynonymOffset here with resultOffset 0. Inactive without includeSynonyms. | |
| includeSynonyms | No | Combine the accepted taxon's records with its synonyms', 10 synonyms per call; rows then carry sourceAphiaId. | |
| establishmentMeans | No | Case-insensitive whole-value establishment filter, such as Alien; blank omitted. Observed values: worms_list_reference topic: distribution_terms. |
Output Schema
| Name | Required | Description |
|---|---|---|
| echo | No | Only effective filters; recordStatus is canonical lowercase, other populated values are unchanged. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Linked accepted/preferred-AphiaID and empty-evidence guidance, in that order. |
| aphiaId | No | Positive safe-integer AphiaID; obtain from worms_resolve_taxon. |
| byteBudget | No | Complete serialized response byte target. |
| totalCount | No | Known local sequence length before pagination. |
| attribution | No | WoRMS source attribution. |
| statusError | No | Failed taxonomic-status read; evidence is unaffected, but whether the AphiaID is its accepted name is unknown. |
| resultOffset | No | Zero-based starting position in the complete local sequence. |
| synonymUnion | No | Synonym union window; present only with includeSynonyms. |
| budgetLimited | No | Whether the byte budget ended this local page early. |
| distributions | No | Whole matching rows in this segment, in source order. |
| filteredCount | No | Rows passing every effective filter. |
| oversizedItem | No | One indivisible scientific item exceeds the target; retained intact with forward progress. |
| requiredBytes | No | Serialized paired-surface result bytes for an oversized item, excluding transport-added metadata. |
| returnedCount | No | Whole scientific items returned on this segment. |
| unfilteredCount | No | All recorded rows before filtering; with includeSynonyms, those of this window. |
| nextResultOffset | No | Next local position; null when consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly/openWorld/idempotent), and the description goes well beyond them: byte-budgeted segmentation, the exact resumption order between nextResultOffset and synonymOffset, the 10-synonym-per-call cap, duplicate retention and source ordering, and the caveat that zero rows does not prove absence. That is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and pagination contract are front-loaded and nearly every clause carries unique information. Sentences are long and multi-clause, which costs readability slightly, but there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return-format explanation is unnecessary, yet the description still explains the pagination cursors, filter semantics, synonym union behavior and the misleading-empty-result caveat. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3 baseline is already met; the description adds real value by contrasting recordStatus normalization (case and whitespace trimmed) against the other filters' untrimmed case-insensitive whole-value matching, and by spelling out the two-offset advancement sequence. It still defers observed filter values to worms_list_reference rather than defining them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (retrieve recorded distributions) plus the accepted identifier forms, which clearly separates it from get_traits, get_synonyms and get_classification. It does not explicitly name a sibling alternative, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear rule for when to set includeSynonyms (WoRMS attaches records per name usage, so synonym rows are otherwise missed) and a precise resume protocol. It offers no explicit when-not-to-use or sibling routing guidance beyond the AphiaID requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worms_get_synonymsWorms Get SynonymsARead-onlyIdempotentInspect
Retrieve synonyms for the accepted taxon linked from an AphiaID obtained with worms_resolve_taxon. Consume nextResultOffset within the same upstream offset before advancing page.nextOffset and resetting resultOffset to zero. A present name without an accepted ID has no synonym lookup; inspect it with worms_get_taxon. A full fetched 50-row page has uncertain continuation and may lead to an empty page.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | One-based starting record, advancing by 50; default 1. | |
| aphiaId | Yes | Positive safe-integer AphiaID, decimal string, or canonical urn:lsid:marinespecies.org:taxname:<AphiaID>; outputs remain numeric. | |
| resultOffset | No | Zero-based local position; resubmit unchanged selectors and options. |
Output Schema
| Name | Required | Description |
|---|---|---|
| echo | No | Effective pagination. |
| page | No | Pagination only when synonym retrieval occurred. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Whether the supplied taxon exists. |
| notice | No | Guidance for an empty synonym page past the first. |
| aphiaId | No | Positive safe-integer AphiaID; obtain from worms_resolve_taxon. |
| guidance | No | Next step when no accepted taxon is known. |
| synonyms | No | Whole synonym rows in this byte-budgeted segment. |
| byteBudget | No | Complete serialized response byte target. |
| totalCount | No | Known local sequence length before pagination. |
| attribution | No | WoRMS source attribution. |
| resultOffset | No | Zero-based starting position in the complete local sequence. |
| validAphiaId | No | Accepted taxon ID when known. |
| budgetLimited | No | Whether the byte budget ended this local page early. |
| oversizedItem | No | One indivisible scientific item exceeds the target; retained intact with forward progress. |
| requiredBytes | No | Serialized paired-surface result bytes for an oversized item, excluding transport-added metadata. |
| returnedCount | No | Whole scientific items returned on this segment. |
| nextResultOffset | No | Next local position; null when consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered; the description adds genuinely non-obvious behavior: 50-row paging, empty pages, and uncertain continuation on a full page. The offset/resultOffset interplay is stated but in dense, hard-to-parse prose that stops short of explaining why the two offsets differ.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose and no filler. The second sentence is jargon-heavy ('Consume nextResultOffset within the same upstream offset...') and costs more parse effort than its length suggests.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the ingestion path, the no-accepted-ID case, and the paging edge case. What remains unaddressed is why two offset parameters coexist, which is the one thing an agent is most likely to get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining the relationship between resultOffset and the upstream offset, which the schema documents only in isolation. It does not, however, clarify the syntax of the ID forms beyond what the schema already spells out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) and resource (synonyms) tied to a precise input (an AphiaID from worms_resolve_taxon), and implicitly distinguishes itself from worms_get_taxon, which is named for the contrasting case. An agent can tell what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit exclusion ('A present name without an accepted ID has no synonym lookup') plus the alternative to use instead (worms_get_taxon), and prescribes a pagination protocol ordering nextResultOffset consumption ahead of advancing page.nextOffset. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worms_get_taxonWorms Get TaxonARead-onlyIdempotentInspect
Retrieve full Aphia records by numeric IDs or canonical WoRMS LSIDs in byte-budgeted segments. Resume nextInputOffset as inputOffset using unchanged aphiaIds and options; inputIndex preserves duplicate and missing positions. includeVernaculars (common names) or includeSources (original description, basis of record, and other sources) requires one submitted ID, one of the two per call; resume nextVernacularOffset as vernacularOffset or nextSourceOffset as sourceOffset, repeating the full primary record. sourceUse filters whole use values ignoring case before sourceOffset; populated values are not trimmed. Successful source results report sourceTotalCount before slicing and unfilteredSourceCount only with an effective filter. Optional failure retains the record without source counts; unknown facts remain omitted or null.
| Name | Required | Description | Default |
|---|---|---|---|
| aphiaIds | Yes | Nonempty original AphiaID list, with no total-input ceiling; at most 50 positions fetched per call. Resubmit unchanged with inputOffset, without deduplicating. | |
| sourceUse | No | Case-insensitive whole-value source use, such as original description; populated values are not trimmed, blanks omitted. Filters before sourceOffset; inactive without includeSources. | |
| inputOffset | No | Zero-based local position; resubmit unchanged selectors and options. | |
| sourceOffset | No | Zero-based position in the sourceUse-selected list for the singleton ID; repeat unchanged options. Inactive without includeSources. | |
| includeSources | No | Retrieve the taxon sources, such as its original description and basis of record; requires exactly one submitted ID and cannot combine with includeVernaculars. | |
| vernacularOffset | No | Zero-based common-name position for the singleton ID; repeat unchanged options. Inactive without includeVernaculars. | |
| includeVernaculars | No | Retrieve common names; requires exactly one submitted ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| echo | No | Effective options. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance for deferred work. |
| results | No | One positional result per processed ID. |
| byteBudget | No | Complete serialized response byte target. |
| attribution | No | WoRMS source attribution. |
| budgetLimited | No | Whether the byte budget ended this local page early. |
| deferredCount | No | Number of original ID positions still deferred. |
| oversizedItem | No | One indivisible scientific item exceeds the target; retained intact with forward progress. |
| requiredBytes | No | Serialized paired-surface result bytes for an oversized item, excluding transport-added metadata. |
| nextInputOffset | No | Resume position in the unchanged original aphiaIds; null when consumed. |
| nextSourceOffset | No | Resume sources for the same singleton record; null when consumed or not requested. |
| nextVernacularOffset | No | Resume common names for the same singleton record; null when consumed or not requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the readOnly/idempotent annotations, it discloses segment budgeting, the one-of-two-per-call restriction, filter-before-offset ordering, and partial-failure behavior ('retains the record without source counts; unknown facts remain omitted or null'). The phrasing is compressed enough that the failure/count semantics take effort to parse, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and every subsequent sentence carries real information about offsets, filters, or failure modes. Some sentences are over-compressed into jargon ('sourceUse filters whole use values ignoring case before sourceOffset'), which costs readability for a complex contract.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with an output schema, the description covers the hard parts: chunking, unchanged-resubmission rule, conditional option constraints, filter ordering, and degraded-failure results. Missing only the explicit routing versus sibling tools such as worms_get_synonyms and worms_get_traits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns above that by adding cross-parameter semantics the schema cannot express: inputIndex preserves duplicate and missing positions, sourceUse matching is case-insensitive on whole values and untrimmed, and offsets resume against the filtered list. It does not restate defaults or types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Retrieve full Aphia records') plus the accepted identifier forms and the segmented-fetch framing. 'Full Aphia records' implicitly separates it from narrow siblings like worms_get_synonyms or worms_get_distributions, but no sibling is ever named, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong invocation guidance: it states the resumption recipe (nextInputOffset as inputOffset with unchanged aphiaIds/options), the one-ID requirement for includeVernaculars/includeSources, and that the two cannot be combined. It stops short of telling the agent when to pick this tool over the sibling retrieval tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worms_get_traitsWorms Get TraitsARead-onlyIdempotentInspect
Retrieve recorded attributes for an AphiaID or canonical WoRMS LSID, including inherited attributes by default. Resume nextResultOffset as resultOffset with unchanged selectors and options. Whole rows retain original preorder nodeIndex and parentIndex across pages; parents may be on earlier pages. measurementType keeps each matching node with its subtree and ancestors, indices unchanged; totalCount counts that set and unfilteredCount the whole tree. Values, references and inheritance markers remain unchanged; on an accepted taxon WoRMS also returns attributes recorded on its synonyms whatever includeInherited is set to, marked by inheritedFrom. A notice names the linked accepted ID, distinguishing an accepted alternative representation from its preferred ID. Missing traits do not prove biological absence; IUCN list membership is not a threat category.
| Name | Required | Description | Default |
|---|---|---|---|
| aphiaId | Yes | Positive safe-integer AphiaID, decimal string, or canonical urn:lsid:marinespecies.org:taxname:<AphiaID>; outputs remain numeric. | |
| resultOffset | No | Zero-based local position; resubmit unchanged selectors and options. | |
| measurementType | No | Case-insensitive whole-value measurement type, not trimmed, e.g. Body size; blank means no filter. Names come from worms_list_reference with topic: trait_types. | |
| includeInherited | No | Include attributes inherited from higher taxa; default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| echo | No | Effective options. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Linked accepted/preferred-AphiaID and absent-attribute guidance, in that order. |
| traits | No | This preorder segment; indices refer to the complete original tree. |
| aphiaId | No | Positive safe-integer AphiaID; obtain from worms_resolve_taxon. |
| byteBudget | No | Complete serialized response byte target. |
| totalCount | No | Known local sequence length before pagination. |
| attribution | No | WoRMS source attribution. |
| statusError | No | Failed taxonomic-status read; evidence is unaffected, but whether the AphiaID is its accepted name is unknown. |
| resultOffset | No | Zero-based starting position in the complete local sequence. |
| budgetLimited | No | Whether the byte budget ended this local page early. |
| oversizedItem | No | One indivisible scientific item exceeds the target; retained intact with forward progress. |
| requiredBytes | No | Serialized paired-surface result bytes for an oversized item, excluding transport-added metadata. |
| returnedCount | No | Whole scientific items returned on this segment. |
| unfilteredCount | No | Nodes in the complete tree before the measurementType filter. |
| nextResultOffset | No | Next local position; null when consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish read-only, idempotent, open-world behavior, and the description adds substantial behavioral detail beyond them: inherited-attribute semantics, stable preorder indices across pages, measurementType subtree/ancestor retention, totalCount versus unfilteredCount, synonym attribute inclusion with inheritedFrom markers, and caveats about missing traits and IUCN list membership.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loads the core purpose and avoids filler. Each sentence carries operational information, though some later sentences are packed with multiple caveats and could be easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema available, the description does not need to explain return values; it instead covers behavior, filtering, pagination, inheritance, and important interpretive caveats. The definition is complete enough for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds meaning beyond the schema by explaining how resultOffset resumes from nextResultOffset, how measurementType preserves matching nodes with subtrees and ancestors, how counts are affected, and how includeInherited interacts with synonym attributes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieving recorded attributes for an AphiaID or canonical WoRMS LSID, with inherited attributes included by default. It is clear what the tool does, but it does not explicitly distinguish itself from siblings such as worms_get_taxon or worms_get_classification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete operational guidance for resuming pagination and for using measurementType, and points to worms_list_reference for trait type names. However, it does not state when to choose this tool over the other trait/taxon siblings or describe exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worms_list_referenceWorms List ReferenceARead-onlyIdempotentInspect
List supported external identifier systems, a non-exhaustive taxonomic-status guide grouped as accepted, unaccepted, uncertain, or technical, environment-flag semantics, observed worms_get_distributions filter values, live taxonomic ranks, or live trait definitions. Resume nextResultOffset as resultOffset with the same topic. Identifier codes, statuses, environment flags, and distribution terms are available offline. A record status can be the specific reason itself, such as junior subjective synonym, rather than unaccepted. IUCN identifiers are not threat categories; null flags mean not recorded. Trait definitions retain complete-tree preorder indices across pages; parents may be on earlier pages.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Reference topic: external_id_types, statuses, environment_flags, distribution_terms, ranks, or trait_types. | |
| resultOffset | No | Zero-based local position; resubmit unchanged selectors and options. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| topic | No | Requested reference topic. |
| notice | No | Guidance for empty live references. |
| entries | No | Whole reference entries in this segment with topic-specific fields. |
| byteBudget | No | Complete serialized response byte target. |
| totalCount | No | Known local sequence length before pagination. |
| attribution | No | WoRMS source attribution. |
| resultOffset | No | Zero-based starting position in the complete local sequence. |
| budgetLimited | No | Whether the byte budget ended this local page early. |
| oversizedItem | No | One indivisible scientific item exceeds the target; retained intact with forward progress. |
| requiredBytes | No | Serialized paired-surface result bytes for an oversized item, excluding transport-added metadata. |
| returnedCount | No | Whole scientific items returned on this segment. |
| nextResultOffset | No | Next local position; null when consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, and the description goes well beyond them: it separates offline-available topics (identifier codes, statuses, environment flags, distribution terms) from live ones (ranks, trait definitions), discloses that trait definitions keep complete-tree preorder indices across pages with parents possibly on earlier pages, and warns that null flags mean not recorded and IUCN identifiers are not threat categories.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Topic enumeration and pagination contract are front-loaded and every clause carries information, but the prose is dense and run-on, and the offline-availability sentence partially restates what the topic list already implies. It is efficiently sized for six topics plus pagination caveats, just not easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be described, and the description covers all six topics, the paging invariant, and the semantic traps (null flags, IUCN codes, status granularity). What is missing is only minor: page-size behavior and a hint about which sibling tool consumes each topic.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with an enum on topic, so the baseline is 3; the description adds meaning beyond the schema by characterizing what each topic yields and by clarifying how statuses may be expressed ('junior subjective synonym' rather than 'unaccepted'). It also explains the offset contract (resubmit unchanged selectors and options), though it never states how large pages are.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (list) and resource (reference vocabularies), then enumerates the exact topic set that maps one-to-one onto the schema enum (external identifier systems, taxonomic-status guide, environment-flag semantics, distribution filter values, ranks, trait definitions). An agent can tell this is a lookup-of-controlled-vocabulary tool and distinguish it from siblings like worms_get_taxon or worms_get_traits, which return data rather than definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The pagination instruction ('Resume nextResultOffset as resultOffset with the same topic') is real usage guidance, and naming worms_get_distributions ties one topic to a concrete consumer. But there is no explicit statement of when to reach for this tool versus its siblings, nor prerequisites or exclusions โ the when-to-use is left to inference from the topic enumeration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worms_resolve_taxonWorms Resolve TaxonARead-onlyIdempotentInspect
Resolve exact or explicitly fuzzy scientific names, or search one vernacular name as a whole recorded common name or, with vernacularMatch: "contains", as part of one. Names default to marine and extant taxa; vernacular cannot filter. Resume scientific segments with nextInputOffset and nextMatchOffset against unchanged names and options; inputIndex preserves duplicates and partialGroup identifies split groups. For vernacular, consume nextResultOffset within the same upstream offset before advancing page.nextOffset and resetting resultOffset to zero. Full 50-match upstream groups remain completeness-unknown; accepted-name fields do not choose an ambiguous match.
| Name | Required | Description | Default |
|---|---|---|---|
| fuzzy | No | Explicit fuzzy scientific-name matching; unavailable for vernacular. | |
| names | No | Nonempty original scientific-name list, with no total-input ceiling; at most 50 positions fetched per call. Resubmit unchanged with continuation offsets, preserving duplicates. | |
| offset | No | Vernacular only: one-based upstream starting record, advancing by 50; default 1. Scientific names accept only 1. | |
| extantOnly | No | Filter scientific names to extant taxa; vernacular cannot filter and rejects false. | |
| marineOnly | No | Filter scientific names to marine taxa; vernacular cannot filter and rejects false. | |
| vernacular | No | Common name, mutually exclusive with names; blank means unset. | |
| inputOffset | No | Zero-based original scientific names position; inactive for vernacular. | |
| matchOffset | No | Zero-based match within the scientific-name group at inputOffset; inactive for vernacular. | |
| resultOffset | No | Zero-based match within the fetched vernacular page; keep upstream offset until consumed. Inactive for scientific names. | |
| vernacularMatch | No | Vernacular only: exact matches a whole recorded common name; contains matches every recorded common name containing the text, such as grouper in Nassau grouper. Names accept only exact; blank means exact. | exact |
Output Schema
| Name | Required | Description |
|---|---|---|
| echo | No | Effective matching options. |
| mode | No | Matching mode. |
| page | No | Vernacular page only. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Empty vernacular-page guidance, or the inputIndex of each returned 50-match scientific-name group, whose completeness is unknown, with the change that narrows it. |
| results | No | One result per processed input. |
| byteBudget | No | Complete serialized response byte target. |
| totalCount | No | Known local sequence length before pagination. |
| attribution | No | WoRMS source attribution. |
| resultOffset | No | Zero-based starting position in the complete local sequence. |
| budgetLimited | No | Whether the byte budget ended this local page early. |
| deferredCount | No | Original input positions not fully consumed. |
| oversizedItem | No | One indivisible scientific item exceeds the target; retained intact with forward progress. |
| requiredBytes | No | Serialized paired-surface result bytes for an oversized item, excluding transport-added metadata. |
| returnedCount | No | Whole scientific items returned on this segment. |
| nextInputOffset | No | Next original names position; resubmit unchanged names and options. |
| nextMatchOffset | No | Next match position at nextInputOffset; null when names consumed. |
| nextResultOffset | No | Next local position; null when consumed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered; the description adds real caveats beyond them: full 50-match upstream groups are completeness-unknown, and accepted-name fields do not disambiguate an ambiguous match. Those are non-obvious result-integrity warnings an agent would otherwise miss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a single dense block of run-on clauses dense with internal jargon (inputOffset, nextMatchOffset, partialGroup) that is never unpacked. It is information-rich but poorly structured for an agent scanning under time pressure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description still covers the resume protocol, completeness caveat, and ambiguity caveat. Only the unexplained output-side identifiers (inputIndex, partialGroup, nextResultOffset) keep it from being fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining the cross-parameter pagination protocol (consume nextResultOffset within the same upstream offset before advancing page.nextOffset and resetting resultOffset) and the meaning of inputIndex/partialGroup, which are not derivable from the input schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource: "Resolve exact or explicitly fuzzy scientific names, or search one vernacular name...", which distinguishes this from worms_get_taxon or worms_get_synonyms. The dual mode (scientific list vs. single vernacular) is stated, though the second half of the sentence is tangled enough that an agent must re-read to parse it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives in-tool usage constraints (names vs. vernacular mutual exclusivity, vernacular cannot filter, scientific names accept only offset 1), which is genuinely useful. However it never says when to choose this tool over siblings like worms_get_taxon or worms_crosswalk_id, so the alternatives guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
- First observed
worms_crosswalk_id - First observed
worms_get_classification - First observed
worms_get_distributions - First observed
worms_get_synonyms - First observed
worms_get_taxon - First observed
worms_get_traits - First observed
worms_list_reference - First observed
worms_resolve_taxon
Related MCP Connectors
Search GBIF species taxonomy, occurrence records, datasets, and publishers.
Search GBIF species taxonomy, occurrence records, datasets, and publishers.
Search iNaturalist sightings, identification threads, phenology, and look-alike species.
Look up genes, sequences, variants, homologs, and cross-database xrefs from Ensembl REST.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables keyless lookup of marine species and genus names, retrieval of full taxonomic lineages by AphiaID, and common vernacular names across languages via MCP tools.5 npmMIT
- 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
- 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 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
Glama MCP Gateway
Add one secure layer between your agents and this server.