Skip to main content
Glama
vessel-api

VesselAPI MCP Server

by vessel-api

VesselAPI MCP Server

CI npm Node License: MIT

An MCP (Model Context Protocol) server that exposes maritime data from the VesselAPI to AI assistants like Claude Desktop, Cursor, Windsurf, and Claude Code.

Prerequisites

  1. Sign up at dashboard.vesselapi.com

  2. Create an API token in your dashboard

  3. Use the token as VESSELAPI_API_KEY in the configuration below

Resources: Documentation | API Explorer | Dashboard | Contact Support

Related MCP server: @globalfishingwatch/gfw-mcp-js

Features

  • 19 tools covering vessels, ports, location search, and emissions

  • Vessel search, positions (single and batch), ETA, emissions, and casualties

  • Port search, details, port events (arrivals/departures), and global port event search

  • Geographic vessel search (bounding box and radius)

  • Manual pagination to control API quota usage

Hosted deployment

A hosted deployment is available on Fronteir AI.

Quick Start

No installation required. Configure your AI client with npx:

{
  "mcpServers": {
    "vesselapi": {
      "command": "npx",
      "args": ["-y", "vesselapi-mcp"],
      "env": {
        "VESSELAPI_API_KEY": "your-api-key"
      }
    }
  }
}

Configuration

Add the JSON above to the config file for your client:

Client

Config file

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)

Cursor

.cursor/mcp.json or ~/.cursor/mcp.json

Claude Code

claude mcp add, which writes .mcp.json in the project or ~/.claude.json for user scope

Windsurf

~/.codeium/windsurf/mcp_config.json

Tools

Vessel Tools

Tool

Description

search_vessels

Search vessels by name, IMO, MMSI, flag, type, callsign, or year built

get_vessel

Get detailed vessel information

get_vessel_position

Get current vessel position (lat/lon, speed, heading)

get_vessel_eta

Get vessel estimated time of arrival

get_vessel_emissions

Get emissions data (CO2, fuel consumption)

get_vessel_casualties

Get marine casualty records

get_vessel_positions_batch

Get positions for multiple vessels at once (with optional time range)

Port Tools

Tool

Description

search_ports

Search ports by name, country, type, size, region, harbor size, or harbor use

get_port

Get port details by UN/LOCODE

get_port_inbound

Get vessels inbound to a port within an ETA window

get_port_events

Get arrivals/departures for a port

get_port_events_by_vessel

Get port events for a vessel

list_port_events

List port events globally with filters for time, country, port, vessel, or event type

search_port_events_by_port

Search port events by port name

search_port_events_by_vessel

Search port events by vessel name

get_vessel_last_port_event

Get the most recent port event for a vessel

Emissions Tools

Tool

Description

list_emissions

List global vessel emissions data with optional year filter

Location Tools

Tool

Description

get_vessels_in_area

Find vessels in a bounding box (with optional time range)

get_vessels_in_radius

Find vessels within a radius of a point (with optional time range)

Pagination

All list endpoints support limit and nextToken parameters for manual pagination. When more results exist, the response includes a nextToken. Pass it in the next call to get the next page.

Development

git clone https://github.com/vessel-api/vesselapi-mcp.git
cd vesselapi-mcp
npm install
npm run build
npm run build        # Build the server
npm run typecheck    # Type-check without emitting
npm run clean        # Remove build artifacts

Testing with MCP Inspector

VESSELAPI_API_KEY=your-key npx @modelcontextprotocol/inspector node dist/index.js

Data Sources & Attribution

Emissions and casualty data: © European Union. Source: European Maritime Safety Agency (EMSA): THETIS-MRV (EU MRV, Regulation (EU) 2015/757) and the European Marine Casualty Information Platform (EMCIP). Reused under the European Commission reuse notice (Commission Decision 2011/833/EU), which authorises reuse for commercial and non-commercial purposes with acknowledgement of the source. Data may be transformed and combined; EMSA does not endorse this service.

License

MIT

Available Tools

19 tools
get_portA

Get detailed information about a specific port by UN/LOCODE

ParametersJSON Schema
NameRequiredDescriptionDefault
unlocodeYesUN/LOCODE of the port (e.g. NLRTM for Rotterdam)

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It only indicates a read operation ('Get detailed information'), but lacks disclosure of behavioral traits such as authentication needs, rate limits, or what constitutes 'detailed information'. More detail is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no redundant words. It front-loads the purpose and is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has only one parameter and no output schema, the description is adequate but could be more complete. It does not specify what kind of information is returned (e.g., location, facilities, depth), which would help an agent anticipate the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaningful context beyond the schema by specifying 'by UN/LOCODE' and providing an example format 'e.g. NLRTM for Rotterdam'. With 100% schema coverage, this additional guidance helps the agent understand the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get detailed information' and the resource 'port by UN/LOCODE'. It distinguishes from sibling tools like search_ports, which is about searching for ports, and get_port_events, which focuses on events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (when you have a UN/LOCODE), but does not provide explicit guidance on when not to use it or mention alternatives like search_ports. No prerequisites or contextual cues are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_port_eventsA

Get port events (arrivals/departures) for a specific port. Covers only the last 2 hours unless timeFrom is given.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
timeToNoEnd of the time window, RFC3339. Defaults to now.
timeFromNoStart of the time window, RFC3339. Without it the service returns only the last 2 hours.
unlocodeYesUN/LOCODE of the port
nextTokenNoPagination token from previous response

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose a significant behavioral trait: the default 2-hour window unless timeFrom is given. This is valuable information. However, it says nothing about authentication, rate limits, or the nature of the response (e.g., pagination, ordering). For a read-only tool, some behavior is disclosed, but not comprehensively.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, both essential. The first sentence states the purpose, the second clarifies a critical default behavior. No redundant filler or repetition of schema info. The content is front-loaded and appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters all documented in the schema and no output schema, the description provides the key missing context: the default time window. The tool is moderately simple, and the description covers the main behavioral nuance. It doesn't discuss the return structure, but without an output schema that is expected. The presence of many siblings could have been handled with differentiation, but that's a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already describes all parameters. The description adds no parameter-specific syntax or meaning beyond what the schema provides. It mentions timeFrom in relation to the default window, but that is already stated in the schema's description for timeFrom. Thus, the description adds no meaningful supplemental parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the action clearly: 'Get port events (arrivals/departures) for a specific port.' It specifies the resource (port) and the type of data (events). While it distinguishes from vessel-specific event tools like get_port_events_by_vessel, it doesn't explicitly differentiate from list_port_events or search_port_events_by_port, which are similar port-event tools. The verb 'Get' and resource 'port events' are specific enough, but sibling differentiation is incomplete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly advises on a key usage condition: 'Covers only the last 2 hours unless timeFrom is given.' That hints at when to set timeFrom. However, it provides no explicit guidance on when to choose this tool over alternatives like list_port_events or search_port_events_by_port, nor any exclusions. The context is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_port_events_by_vesselA

Get port events (arrivals/departures) for a specific vessel

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
idTypeNoIdentifier type: imo (default) or mmsi
timeToNoEnd time (ISO 8601 format)
timeFromNoStart time (ISO 8601 format)
vesselIdYesVessel identifier (IMO number by default)
eventTypeNoFilter by event type. Omit for both arrivals and departures
nextTokenNoPagination token from previous response
sortOrderNoSort order by timestamp

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of explaining behavior, but it only restates the function without noting default sorting, pagination, or filtering capabilities. The input schema covers parameter details, so the bar is lowered, but the description adds no extra behavioral context beyond what the name implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence that is appropriately front-loaded with the verb and object. It is concise and to the point without unnecessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, pagination, filtering, sorting) and the absence of an output schema, the description is insufficient. It does not explain what the response contains (e.g., a list of events, fields returned) or mention pagination behavior. The description should provide more context about the returned data and usage examples.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% parameter description coverage, so the baseline is 3. The description itself does not add any additional meaning to the parameters; it merely repeats the vessel focus. It does not clarify any ambiguous fields or provide context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and the resource ('port events') with a specific scope ('for a specific vessel'). It effectively distinguishes from siblings like 'get_port_events' (which likely targets a port) and 'search_port_events_by_vessel' (which implies search semantics vs direct retrieval).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: when you have a known vessel identifier and need its port events. However, it does not explicitly mention alternatives or situations where this tool should be avoided (e.g., when searching with flexible criteria, use 'search_port_events_by_vessel'). The guidance is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_port_inboundA

Get vessels heading to a specific port within an ETA arrival window

ParametersJSON Schema
NameRequiredDescriptionDefault
etaToNoEnd of ETA arrival window (RFC3339). Omit to default to 72 hours ahead.
limitNoResults per page, 1 to 50. Defaults to 20.
timeToNoAIS position time range end (RFC3339 format)
etaFromNoStart of ETA arrival window (RFC3339). Omit to default to now.
timeFromNoAIS position time range start (RFC3339 format)
unlocodeYesUN/LOCODE of the destination port (e.g. NLRTM for Rotterdam)
nextTokenNoPagination token from previous response

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It only states the high-level purpose and does not describe pagination behavior, default windows, return shape, or any safety/permission considerations. This leaves key behavioral details undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no filler. It is concise and front-loaded, though slightly too sparse to fully carry behavioral context on its own.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters and no output schema or annotations, the description alone is only minimally complete. It states the core use case, and the schema supplies parameter details, but return behavior, pagination semantics, and the meaning of the AIS time range in the overall flow are not described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of the parameters with useful descriptions, including defaults, ranges, and RFC3339 formats. The description itself adds little beyond the schema, so the baseline moderate score is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Get vessels heading to a specific port within an ETA arrival window.' This clearly defines the tool's scope and distinguishes it from sibling tools that focus on individual vessels, positions, or port events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear usage context: querying port-bound vessels by ETA window. It does not explicitly list alternatives or exclusions, but the stated port-and-ETA focus gives enough direction to choose this tool over vessel-position or port-event siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vesselC

Get detailed information about a specific vessel

ParametersJSON Schema
NameRequiredDescriptionDefault
idTypeNoIdentifier type: imo (default) or mmsi
vesselIdYesVessel identifier (IMO number by default)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, but it only says 'Get detailed information'. It does not mention read-only behavior, response shape, error handling, or any prerequisites, leaving significant behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. It is efficient, though somewhat generic and under-specified compared to stronger examples that also provide usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, no annotations, and many sibling vessel tools, yet the description does not explain what 'detailed information' returns or how it relates to the siblings. It is minimally viable but insufficient for confident tool selection in this context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds no parameter semantics beyond the schema, but the schema already documents vesselId and idType, including the imo default, so no major gap exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action ('Get') and resource ('detailed information about a specific vessel'). This distinguishes it by implication from sibling tools like get_vessel_position or get_vessel_eta, but it never explicitly defines what 'detailed information' includes or names alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool instead of tools like get_vessel_position, get_vessel_eta, get_vessel_emissions, or get_vessel_casualties. The intended usage is only implied by the generic phrase 'detailed information', with no exclusions or alternative recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vessel_casualtiesC

Get marine casualty records for a vessel

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
idTypeNoIdentifier type: imo (default) or mmsi
vesselIdYesVessel identifier (IMO number by default)
nextTokenNoPagination token from previous response

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full burden of behavioral disclosure. It only states that records are retrieved, but does not disclose pagination behavior, read-only nature, potential response structure, or any side effects. The description adds minimal value beyond the name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, concise and front-loaded. There is zero wasted text or redundancy. It is appropriately minimal, which is a strength given the low complexity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lacks necessary context for a tool with no output schema and no annotations. It does not explain what casualty records include, the return format, or any specific behavioral aspects. Given the complexity (4 parameters, pagination), a richer description is warranted to make the tool fully usable without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not add any parameter information beyond the schema. Schema coverage is 100%, with clear descriptions for limit, idType, vesselId, and nextToken. The phrase 'for a vessel' corresponds to vesselId, but the description adds nothing extra, so the baseline 3 for high schema coverage applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Get) and the resource (marine casualty records) with a scope (for a vessel). It is distinct from sibling tools like get_vessel_position or get_vessel_emissions, as the resource type is unique. However, it lacks specificity on what 'casualty records' entails, so it doesn't fully distinguish edge cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It does not mention any prerequisites, limitations, or alternatives. The one-line description offers no context for selection among the many sibling vessel-related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vessel_emissionsB

Get emissions data for a vessel (CO2, fuel consumption)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
idTypeNoIdentifier type: imo (default) or mmsi
vesselIdYesVessel identifier (IMO number by default)
nextTokenNoPagination token from previous response

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'Get emissions data,' which implies a read operation, but does not disclose pagination behavior (nextToken), default identifier type, rate limits, or any other behavioral traits. The description adds no context beyond the action itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with a clear verb and purpose, front-loaded with 'Get emissions data.' No wasted words, though it could include sibling differentiation or usage hints without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description is adequate but minimal. It does not mention pagination tokens, identifier defaults, or how this tool compares to list_emissions. For a tool with four parameters and many siblings, richer context would help, but the schema already covers parameter meanings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (all four parameters have descriptions), so the baseline is 3. The description does not add parameter-level meaning beyond the schema; it mentions data fields (CO2, fuel consumption) but not how parameters affect the output. No credit is needed beyond the schema's existing coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get'), the resource ('emissions data for a vessel'), and the data scope ('CO2, fuel consumption'). This distinguishes it from sibling vessel tools like get_vessel_position and get_vessel_eta, and the 'for a vessel' qualifier separates it from list_emissions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives. The sibling list_emissions likely provides fleet-level emissions data, but the description does not mention trade-offs or exclusions. There is no 'when not to use' or reference to other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vessel_etaB

Get the estimated time of arrival for a vessel

ParametersJSON Schema
NameRequiredDescriptionDefault
idTypeNoIdentifier type: imo (default) or mmsi
vesselIdYesVessel identifier (IMO number by default)

TDQS

B3/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but adds nothing beyond the name's implication. It does not disclose return format, units, calculation basis, failure scenarios, or any other behavioral trait. It is effectively a tautology of the tool name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no filler. The core purpose is stated clearly and immediately with minimal words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool's apparent simplicity, there is no output schema and no annotation to compensate. The description leaves the agent without information about what the ETA response looks like, whether units are hours/dates, or how it differs from related position/port tools. This is too sparse for reliable tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add parameter details, but the schema already documents both vesselId and idType well, including the enum values and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Get' with a precise resource 'estimated time of arrival for a vessel'. This directly differentiates it from sibling tools like get_vessel_position or get_vessel_emissions by focusing on ETA.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives. Sibling tools like get_vessel_position and get_vessel_emissions are not mentioned, nor are any exclusions or contextual triggers provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vessel_last_port_eventB

Get the most recent port event (arrival or departure) for a vessel

ParametersJSON Schema
NameRequiredDescriptionDefault
idTypeNoIdentifier type: imo (default) or mmsi
vesselIdYesVessel identifier (IMO number by default)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It indicates a read operation ('Get') but does not explain behavior in edge cases (e.g., no events found, invalid vessel ID), whether the result is a single event or a list, or what fields are returned. This is insufficient for a tool with no schema annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that fully conveys the core action without any unnecessary words. It is front-loaded and efficient, earning the highest score for conciseness and structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is relatively simple with only two parameters, and the description adequately captures the primary intent. However, since there is no output schema, the description does not specify the shape or content of the returned event, which would improve completeness. Given the simplicity, this is still acceptable but leaves some ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100% as both parameters (idType and vesselId) have descriptions in the schema. Per the rubric, when coverage is high, the baseline score is 3. The tool description itself adds no extra meaning to the parameters beyond what the schema already provides, so no bonus is warranted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: getting the most recent port event (arrival or departure) for a vessel. It uses a specific verb and resource, making the purpose unambiguous. However, it does not explicitly differentiate from sibling tools like get_port_events_by_vessel or list_port_events, so it misses the full mark for sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It offers no context about scenarios where this tool is preferred or when other tools should be used. There is no mention of exclusions, prerequisites, or alternative approaches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vessel_positionB

Get the current position of a vessel (latitude, longitude, speed, heading)

ParametersJSON Schema
NameRequiredDescriptionDefault
satNoFall back to a satellite position when no recent terrestrial one exists. Charged per call against a prepaid balance, so use it only when a stored position is genuinely insufficient.
idTypeNoIdentifier type: imo (default) or mmsi
vesselIdYesVessel identifier (IMO number by default)

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It mentions satellite fallback is charged per call (via the 'sat' parameter), which is useful, but it doesn't disclose the default behavior (e.g., what happens if no terrestrial position exists without sat=true? Does it return null or error?). It also doesn't mention data freshness or potential delays. The description adds minimal behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the purpose. Zero waste, effectively communicates the core function. The schema handles parameter details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a moderately simple read operation with no output schema and full schema parameter coverage. The description covers the return value but doesn't discuss edge cases (e.g., no position available, satellite fallback behavior) or whether it's a direct lookup vs. historical. With no annotations, it could benefit from a note on default behavior, but it's adequate for basic selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains all parameters. The description adds value by explicitly listing the returned fields (latitude, longitude, speed, heading), which helps agents understand the output. The 'sat' parameter guidance about prepaid balance is also valuable. Baseline 3, plus extra context, justifies 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns current position data (latitude, longitude, speed, heading) for a specific vessel. It distinguishes from siblings like get_vessel (general info) and get_vessel_eta (estimated arrival), though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The schema's 'sat' parameter includes guidance on when to use satellite fallback (only when stored position is insufficient), which implies usage context. However, the description itself doesn't specify when to use this tool versus alternative position tools like get_vessel_positions_batch or get_vessels_in_area. The description lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vessel_positions_batchA

Get positions for multiple vessels at once by MMSI or IMO numbers

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesComma-separated list of MMSI or IMO numbers
limitNoResults per page, 1 to 50. Defaults to 20.
idTypeNoIdentifier type: imo (default) or mmsi
timeToNoEnd time filter in RFC3339 format (defaults to current time)
timeFromNoStart time filter in RFC3339 format (defaults to 2 hours ago)
nextTokenNoPagination token from previous response

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden for behavioral transparency. It only states what the tool does without disclosing details such as pagination (nextToken), default time ranges, limits on batch size, or potential rate limits. This is a significant gap for a batch operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that is front-loaded with the core purpose. It avoids redundancy and is well-structured, every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's batch nature and lack of output schema, the description provides only the bare minimum. It does not explain that the response will contain positions for each requested vessel or mention pagination, which are relevant for a batch API. The schema partially compensates, but the description could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides descriptions for all parameters (100% coverage), so the baseline is 3. The description adds minimal extra meaning beyond the schema (e.g., 'by MMSI or IMO numbers' is already in the ids parameter description). No contradictions or additional insights.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get positions for multiple vessels at once by MMSI or IMO numbers'. It specifies the action (get positions), the resource (multiple vessels), and the identifier types, which distinguishes it from sibling tools like get_vessel_position (single vessel) and search_vessels.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for batch position retrieval ('multiple vessels at once'), which contrasts with single-vessel tools in the sibling list. However, it does not explicitly state when not to use this tool or reference alternatives. The context is clear but not prescriptive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vessels_in_areaA

Find all vessels within a rectangular bounding box (latitude/longitude)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
latMaxYesNorthern boundary latitude
latMinYesSouthern boundary latitude
lonMaxYesEastern boundary longitude
lonMinYesWestern boundary longitude
timeToNoEnd of the time window, RFC3339. Defaults to now. The window may not exceed 4 hours.
timeFromNoStart of the time window, RFC3339. Defaults to 2 hours ago. The window may not exceed 4 hours.
nextTokenNoPagination token from previous response

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description implies a read-only operation ('Find') without explicitly stating side effects, permissions, or return values. While it likely does not modify data, the lack of clarity about outputs or potential restrictions limits transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that accurately summarizes the tool's primary function without redundancy. It omits details that are appropriately captured in the schema, maintaining a clean and focused structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description and schema cover the inputs well, the tool lacks an output schema, and the description does not specify what the response contains (e.g., vessel IDs, full details). The presence of pagination and time window parameters suggests additional context, but the lack of response documentation reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All parameters are listed and described in the schema, including their purpose and constraints (e.g., limit has maximum 50, time window limits). The bounding box and pagination fields are clearly explained, and the required parameters are self-evident. This provides excellent parameter clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The tool name 'get_vessels_in_area' and description unambiguously specify the operation: retrieving vessels within a rectangular bounding box defined by latitude/longitude. The description is concise and direct, making the purpose immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does but does not explicitly state when to use it relative to other similar tools like 'get_vessels_in_radius' or 'search_vessels'. It also does not mention prerequisites or typical use cases, leaving some ambiguity for a user choosing between sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vessels_in_radiusA

Find all vessels within a radius of a point. The radius is in METRES, not nautical miles or kilometres.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
radiusYesSearch radius in METRES, maximum 100000 (100 km). One nautical mile is 1852 metres.
timeToNoEnd of the time window, RFC3339. Defaults to now. The window may not exceed 4 hours.
latitudeYesCenter latitude
timeFromNoStart of the time window, RFC3339. Defaults to 2 hours ago. The window may not exceed 4 hours.
longitudeYesCenter longitude
nextTokenNoPagination token from previous response

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses the unit requirement (METRES) and implies a read-only operation (find), but does not mention pagination, time window constraints, or any side effects. The description adds some value beyond the schema by emphasizing units, but lacks deeper behavioral context like rate limits or data freshness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that front-loads the core purpose and adds a critical unit warning. No wasted words, perfectly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 7 parameters, no output schema, and no annotations, the description is minimal. It covers the core purpose and unit, but does not address pagination, time window behavior, or result format. For a tool with this complexity, more context would be helpful, but the schema covers parameter details. The description is adequate but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds the critical unit clarification for radius, which is valuable. However, it does not explain the relationship between parameters (e.g., timeFrom/timeTo window) beyond what the schema provides. Baseline 3 is appropriate given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Find all vessels within a radius of a point.' It specifies the resource (vessels) and the action (find within radius), and the emphasis on units (METRES) adds precision. It distinguishes from siblings like get_vessels_in_area by the radius-based search, though it doesn't explicitly name the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for radius-based vessel search but does not provide explicit guidance on when to use this tool versus alternatives like get_vessels_in_area or search_vessels. The unit clarification is helpful but not a usage guideline. No exclusions or alternative tool names are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_emissionsB

List global vessel emissions data with optional year filter

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
periodNoReporting year filter (e.g. 2024)
nextTokenNoPagination token from previous response

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of disclosing behavior. It mentions filtering but does not disclose pagination behavior beyond the schema's nextToken parameter, nor does it explain whether the output includes aggregated or per-vessel details, whether results are sorted, or if any data is excluded. For a list operation with pagination, this is a notable gap in behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that is front-loaded with the main action ('List global vessel emissions data') and immediately identifies the key parameter ('optional year filter'). Every word earns its place; there is zero redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema and no annotations, the description provides only a basic overview. It successfully communicates the core purpose and the main filter, but it omits details about pagination semantics (other than the schema's nextToken) and what constitutes 'emissions data' (e.g., CO2, NOx). For a list tool with no output schema, the description could be more complete to guide agents on expected results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 100% of parameters with descriptions (limit, period, nextToken). The description adds the insight that 'period' is a reporting year filter, which aligns with the schema, and it mentions the year filter as the key optional feature. However, it does not add detail beyond the schema's own parameter descriptions, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'List global vessel emissions data with optional year filter' clearly states the verb (list), resource (global vessel emissions data), and key capability (optional year filter). It distinguishes itself from sibling tools like get_vessel_emissions (which likely targets a specific vessel) by explicitly saying 'global', though it does not directly name an alternative. Thus it's clear but slightly short of fully differentiating from related emission tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for listing emissions data, and the 'optional year filter' hints at when to apply filtering. However, it does not provide explicit guidance on when to use this tool versus alternatives like get_vessel_emissions for a specific vessel or search_vessels. There are no exclusions or alternative tool names, so it's adequate but lacks explicit decision support.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_port_eventsA

List port events (arrivals/departures) globally with optional filters for time, country, port, vessel, or event type

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
timeToNoEnd time (RFC3339 format)
countryNoFilter by port country (case-insensitive)
portNameNoFilter by port name (full-text search)
timeFromNoStart time (RFC3339 format)
unlocodeNoFilter by port UN/LOCODE
eventTypeNoFilter by event type. Omit for both arrivals and departures
nextTokenNoPagination token from previous response
vesselNameNoFilter by vessel name (full-text search)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses global scope and that the events are arrivals/departures, and 'List' implies a read-only operation. However, it does not mention pagination, default time behavior, ordering, or response contents, which are important for a 9-parameter filter tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb and resource, then compactly summarizes the optional filter groups. There is no filler, redundancy, or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description conveys core purpose and filter categories, and the schema covers all parameter details. However, there is no output schema and the description omits operational details such as pagination semantics, time-range behavior, and what fields are returned for each event, leaving some important context for the agent to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 9 parameters with descriptions. The tool description only summarizes filter categories (time, country, port, vessel, event type) without adding meaning beyond the schema, which matches the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') with a clear resource ('port events') and scope ('globally'), and enumerates the main filter categories: time, country, port, vessel, and event type. This clearly distinguishes it from sibling tools like get_port_events or search_port_events_by_vessel, which target a single port or vessel.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'globally' provides clear context that this tool is for cross-port event searches rather than port-specific or vessel-specific lookups. It does not explicitly name sibling alternatives or state when not to use it, but the global scope plus optional filters gives an agent enough context to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_port_events_by_portA

Search port events by port name. Covers only the last 2 hours unless timeFrom is given.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
timeToNoEnd of the time window, RFC3339. Defaults to now.
portNameYesPort name to search for
timeFromNoStart of the time window, RFC3339. Without it the service returns only the last 2 hours.
nextTokenNoPagination token from previous response

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It usefully discloses a non-obvious time-window default ('only the last 2 hours unless timeFrom is given'), which is important. But it omits other behavioral details such as result ordering, output shape, or explicit read-only confirmation, so it is adequate but incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It states the core action and the most important behavioral caveat efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is relatively simple with no output schema and 5 parameters. The description covers the primary search behavior and the key time-window caveat, but it does not describe return values, pagination behavior, or how this relates to similar sibling tools, leaving some context gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds little beyond the schema, though it reinforces the relationship between timeFrom and the 2-hour default already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Search'), names the resource ('port events'), and identifies the filtering dimension ('by port name'). This clearly distinguishes it from sibling tools like search_port_events_by_vessel.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when looking up port events by port name, and it notes the 2-hour default window. However, it does not explicitly mention alternatives or when not to use this tool, leaving selection guidance mostly to the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_port_events_by_vesselA

Search port events by vessel name. Covers only the last 2 hours unless timeFrom is given.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoResults per page, 1 to 50. Defaults to 20.
timeToNoEnd of the time window, RFC3339. Defaults to now.
timeFromNoStart of the time window, RFC3339. Without it the service returns only the last 2 hours.
nextTokenNoPagination token from previous response
vesselNameYesVessel name to search for

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations provided, so the description carries the full burden. The description adds the crucial behavior about the 2-hour default window, which is not exposed elsewhere in the schema (the schema only says 'without it the service returns only the last 2 hours' in timeFrom, but that is part of schema). The description also states 'Covers only the last 2 hours unless timeFrom is given' which reinforces that. However, it does not disclose other behaviors like pagination, rate limits, whether the search supports partial matching, or if it might be slow. Given the schema already mentions the time window in the timeFrom parameter description, the description adds little beyond that; it repeats the schema's info. With no annotations, a score of 3 is appropriate because it adds some context (emphasizing the default window) but lacks deeper behavioral disclosure such as ordering, filtering, or error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one sentence, but it's front-loaded with the core purpose and then adds a critical qualifier about the time window. It's efficient with no waste. However, it might have been more structured with a second sentence on usage context, but given its brevity, it's well-organized. It earns a 4 because it is concise but slightly dense; it could have been split for clarity, but it's not a problem.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (5 params, 1 required), the description is sufficient for basic usage but lacks some completeness. It tells the agent the basic action and the time default, but it doesn't specify the output structure (no output schema), nor does it mention if there are any prerequisites (e.g., requiring a valid vessel name) or any limitations like only covering certain types of port events. With no output schema, a description of return value would be valuable but is absent. The schema covers parameters well, but the tool's behavior around the search (e.g., does it return events in chronological order? Does it support wildcard?) is missing. So 3 is fair.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already describes all five parameters: vesselName, timeFrom, timeTo, limit, nextToken. The description adds minimal parameter semantics beyond what's in the schema; it highlights the timeFrom dependency for extending beyond 2 hours, but that is also in the schema. It doesn't explain the relationship between timeFrom and timeTo or how pagination works, but the schema covers that. With full schema coverage, the baseline is 3, and the description offers no extra depth about parameter usage, so 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Search port events by vessel name.' The verb 'search' specifies the action, the resource 'port events' is specified, and the parameter 'vessel name' distinguishes it from the sibling tools like 'get_port_events_by_vessel' (which may imply a different retrieval mode) and 'search_vessels' (which searches for vessel details). It uniquely targets port events filtered by vessel name, which is not covered by other siblings such as 'get_vessel' or 'get_port_events'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for searching port events filtered by vessel name, and it provides a significant usage context: the default time window is only the last 2 hours unless 'timeFrom' is provided. This guides the agent on when to use it (e.g., for recent events or specific time range with timeFrom) and implicitly contrasts with tools like 'get_vessel_last_port_event' or 'get_port_inbound' that might retrieve specific events. However, it doesn't explicitly mention when not to use it or list alternatives, but the time window caveat is very useful for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_portsB

Search for ports by name, country, type, size, region, harbor size, or harbor use

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPort name (partial match)
sizeNoPort size classification
limitNoResults per page, 1 to 50. Defaults to 20.
regionNoGeographic region (partial match)
countryNoCountry (ISO code)
portTypeNoPort type classification
harborUseNoPrimary harbor use
nextTokenNoPagination token from previous response
harborSizeNoHarbor size classification

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must disclose behavioral traits. It does not mention pagination, result limits, partial matching behavior, or any side effects. The schema includes limit and nextToken, but the description does not clarify that this is a paginated listing or how results are structured.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that directly states the tool's purpose without padding. Every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema and the tool's complexity (9 optional parameters), the description is adequate but incomplete. It does not explain the return format, pagination workflow, or any constraints beyond the schema. An agent might infer pagination from limit/nextToken but there is no explicit guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 restates the parameters in natural language but adds no additional semantic meaning beyond what the schema provides (e.g., data formats, examples, or dependencies). It does not compensate for any gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (search) and the resource (ports) and lists the search criteria (name, country, type, size, region, harbor size, harbor use). It is specific and verb-driven, distinguishing it from tools like get_port which fetch individual ports.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No mention of when to use this tool versus alternatives (e.g., get_port, search_vessels) or any context on typical use cases. The description provides no guidance on exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_vesselsA

Search for vessels. Use q when you have an identifier but do not know which kind it is; use the specific filters to narrow a fleet.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text search across name, IMO, MMSI, ENI and callsign. Use this when the type of identifier is unknown.
eniNoENI number, used for inland waterway vessels
imoNoIMO number
flagNoFlag state (ISO country code)
mmsiNoMMSI number
nameNoVessel name (partial match)
limitNoResults per page, 1 to 50. Defaults to 20.
callsignNoRadio callsign
nextTokenNoPagination token from previous response
vesselTypeNoVessel type
yearBuiltMaxNoMaximum year built
yearBuiltMinNoMinimum year built

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It does not disclose pagination behavior, return format, or any side effects. It only explains search semantics; for a read-only search this is minimal, but safety implications are left unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with clear front-loading: 'Search for vessels.' followed by targeted usage guidance. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has many optional parameters and no output schema. The description is brief but the schema covers parameter details. Missing info on pagination or response structure, though limit/nextToken are in schema. It orients the user but is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage of all 12 parameters with descriptions, so the baseline is 3. The description adds strategic semantics about q for unknown identifiers and specific filters for narrowing a fleet, adding value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Search for vessels.' It also distinguishes between using 'q' for unknown identifiers and specific filters for narrowing a fleet, which helps differentiate from sibling get_vessel* tools that fetch by known IDs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance: use 'q' when the identifier type is unknown, and use specific filters to narrow a fleet. However, it does not mention alternatives like get_vessel for known IDs or compare with other sibling search tools, so it's clear but not exhaustive.

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. Dates show when Glama detected each change.

  1. 23 tool updatesv2.0.0
    • Removedget_navtex_messages
    • Changedget_port_events6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / timeFrom
        Added value: +{
        +  "description": "Start of the time window, RFC3339. Without it the service returns only the last 2 hours.",
        +  "type": "string"
        +}
      • addedInput schema / properties / timeTo
        Added value: +{
        +  "description": "End of the time window, RFC3339. Defaults to now.",
        +  "type": "string"
        +}
    • Changedget_port_events_by_vessel10 fields changed
      • changedInput schema / properties / eventType / description
        Previous value: -"Filter by event type (arrival, departure)"New value: +"Filter by event type. Omit for both arrivals and departures"
      • addedInput schema / properties / eventType / enum
        Added value: +[
        +  "arrival",
        +  "departure",
        +  "all"
        +]
      • changedInput schema / properties / idType / description
        Previous value: -"Identifier type: imo (default), mmsi, or vesselId"New value: +"Identifier type: imo (default) or mmsi"
      • addedInput schema / properties / idType / enum
        Added value: +[
        +  "imo",
        +  "mmsi"
        +]
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / sortOrder / description
        Previous value: -"Sort order by timestamp (asc or desc)"New value: +"Sort order by timestamp"
      • addedInput schema / properties / sortOrder / enum
        Added value: +[
        +  "asc",
        +  "desc"
        +]
    • Changedget_port_inbound7 fields changed
      • changedInput schema / properties / etaFrom / description
        Previous value: -"Start of ETA arrival window (RFC3339 format, e.g. 2026-03-07T00:00:00Z)"New value: +"Start of ETA arrival window (RFC3339). Omit to default to now."
      • changedInput schema / properties / etaTo / description
        Previous value: -"End of ETA arrival window (RFC3339 format, e.g. 2026-03-14T00:00:00Z)"New value: +"End of ETA arrival window (RFC3339). Omit to default to 72 hours ahead."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / required
        Previous value: -[
        -  "unlocode",
        -  "etaFrom",
        -  "etaTo"
        -]New value: +[
        +  "unlocode"
        +]
    • Changedget_vessel2 fields changed
      • changedInput schema / properties / idType / description
        Previous value: -"Identifier type: imo (default), mmsi, or vesselId"New value: +"Identifier type: imo (default) or mmsi"
      • addedInput schema / properties / idType / enum
        Added value: +[
        +  "imo",
        +  "mmsi"
        +]
    • Changedget_vessel_casualties6 fields changed
      • changedInput schema / properties / idType / description
        Previous value: -"Identifier type: imo (default), mmsi, or vesselId"New value: +"Identifier type: imo (default) or mmsi"
      • addedInput schema / properties / idType / enum
        Added value: +[
        +  "imo",
        +  "mmsi"
        +]
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
    • Removedget_vessel_classification
    • Changedget_vessel_emissions6 fields changed
      • changedInput schema / properties / idType / description
        Previous value: -"Identifier type: imo (default), mmsi, or vesselId"New value: +"Identifier type: imo (default) or mmsi"
      • addedInput schema / properties / idType / enum
        Added value: +[
        +  "imo",
        +  "mmsi"
        +]
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
    • Changedget_vessel_eta2 fields changed
      • changedInput schema / properties / idType / description
        Previous value: -"Identifier type: imo (default), mmsi, or vesselId"New value: +"Identifier type: imo (default) or mmsi"
      • addedInput schema / properties / idType / enum
        Added value: +[
        +  "imo",
        +  "mmsi"
        +]
    • Removedget_vessel_inspection_detail
    • Removedget_vessel_inspections
    • Changedget_vessel_last_port_event2 fields changed
      • changedInput schema / properties / idType / description
        Previous value: -"Identifier type: imo (default), mmsi, or vesselId"New value: +"Identifier type: imo (default) or mmsi"
      • addedInput schema / properties / idType / enum
        Added value: +[
        +  "imo",
        +  "mmsi"
        +]
    • Removedget_vessel_ownership
    • Changedget_vessel_position3 fields changed
      • changedInput schema / properties / idType / description
        Previous value: -"Identifier type: imo (default), mmsi, or vesselId"New value: +"Identifier type: imo (default) or mmsi"
      • addedInput schema / properties / idType / enum
        Added value: +[
        +  "imo",
        +  "mmsi"
        +]
      • addedInput schema / properties / sat
        Added value: +{
        +  "description": "Fall back to a satellite position when no recent terrestrial one exists. Charged per call against a prepaid balance, so use it only when a stored position is genuinely insufficient.",
        +  "type": "boolean"
        +}
    • Changedget_vessel_positions_batch5 fields changed
      • addedInput schema / properties / idType / enum
        Added value: +[
        +  "imo",
        +  "mmsi"
        +]
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
    • Changedget_vessels_in_area6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / timeFrom / description
        Previous value: -"Start time filter in RFC3339 format (defaults to 2 hours ago)"New value: +"Start of the time window, RFC3339. Defaults to 2 hours ago. The window may not exceed 4 hours."
      • changedInput schema / properties / timeTo / description
        Previous value: -"End time filter in RFC3339 format (defaults to current time)"New value: +"End of the time window, RFC3339. Defaults to now. The window may not exceed 4 hours."
    • Changedget_vessels_in_radius7 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • changedInput schema / properties / radius / description
        Previous value: -"Radius in nautical miles"New value: +"Search radius in METRES, maximum 100000 (100 km). One nautical mile is 1852 metres."
      • changedInput schema / properties / timeFrom / description
        Previous value: -"Start time filter in RFC3339 format (defaults to 2 hours ago)"New value: +"Start of the time window, RFC3339. Defaults to 2 hours ago. The window may not exceed 4 hours."
      • changedInput schema / properties / timeTo / description
        Previous value: -"End time filter in RFC3339 format (defaults to current time)"New value: +"End of the time window, RFC3339. Defaults to now. The window may not exceed 4 hours."
    • Changedlist_emissions4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
    • Changedlist_port_events6 fields changed
      • changedInput schema / properties / eventType / description
        Previous value: -"Filter by event type (arrival, departure)"New value: +"Filter by event type. Omit for both arrivals and departures"
      • addedInput schema / properties / eventType / enum
        Added value: +[
        +  "arrival",
        +  "departure",
        +  "all"
        +]
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
    • Changedsearch_port_events_by_port6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / timeFrom
        Added value: +{
        +  "description": "Start of the time window, RFC3339. Without it the service returns only the last 2 hours.",
        +  "type": "string"
        +}
      • addedInput schema / properties / timeTo
        Added value: +{
        +  "description": "End of the time window, RFC3339. Defaults to now.",
        +  "type": "string"
        +}
    • Changedsearch_port_events_by_vessel6 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / timeFrom
        Added value: +{
        +  "description": "Start of the time window, RFC3339. Without it the service returns only the last 2 hours.",
        +  "type": "string"
        +}
      • addedInput schema / properties / timeTo
        Added value: +{
        +  "description": "End of the time window, RFC3339. Defaults to now.",
        +  "type": "string"
        +}
    • Changedsearch_ports4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
    • Changedsearch_vessels8 fields changed
      • removedInput schema / properties / classSociety
        Removed value: -{
        -  "description": "Classification society (case-insensitive)",
        -  "type": "string"
        -}
      • addedInput schema / properties / eni
        Added value: +{
        +  "description": "ENI number, used for inland waterway vessels",
        +  "type": "string"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Max results per page"New value: +"Results per page, 1 to 50. Defaults to 20."
      • addedInput schema / properties / limit / maximum
        Added value: +50
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • removedInput schema / properties / owner
        Removed value: -{
        -  "description": "Owner name (partial match, case-insensitive)",
        -  "type": "string"
        -}
      • addedInput schema / properties / q
        Added value: +{
        +  "description": "Free-text search across name, IMO, MMSI, ENI and callsign. Use this when the type of identifier is unknown.",
        +  "type": "string"
        +}
  2. 24 tool updatesv1.3.0
    • Addedget_navtex_messages
    • Addedget_port
    • Addedget_port_events
    • Addedget_port_events_by_vessel
    • Addedget_port_inbound
    • Addedget_vessel
    • Addedget_vessel_casualties
    • Addedget_vessel_classification
    • Addedget_vessel_emissions
    • Addedget_vessel_eta
    • Addedget_vessel_inspection_detail
    • Addedget_vessel_inspections
    • Addedget_vessel_last_port_event
    • Addedget_vessel_ownership
    • Addedget_vessel_position
    • Addedget_vessel_positions_batch
    • Addedget_vessels_in_area
    • Addedget_vessels_in_radius
    • Addedlist_emissions
    • Addedlist_port_events
    • Addedsearch_port_events_by_port
    • Addedsearch_port_events_by_vessel
    • Addedsearch_ports
    • Addedsearch_vessels

TDQS

B3.2/5.0
Disambiguation2/5

Several tools have heavily overlapping purposes, especially the port event family: search_port_events_by_vessel, get_port_events_by_vessel, search_port_events_by_port, get_port_events, and list_port_events all query similar event data with only subtle filter differences. get_vessel_last_port_event, get_vessel_position, and get_vessel_positions_batch also create boundary confusion. An agent could easily select the wrong tool despite the descriptions.

Naming Consistency3/5

The tools mostly use snake_case verb_noun naming with get_, search_, and list_ prefixes, but the mix of verbs is inconsistent for similar actions. For example, port events are exposed as get_port_events, search_port_events_by_vessel, get_port_events_by_vessel, and list_port_events, making the naming pattern feel arbitrary. Still, the convention is readable and not chaotic.

Tool Count3/5

Nineteen tools is on the heavy side for a vessel/port data API, especially since several tools appear to cover nearly the same port event queries. The core domain is broad enough to justify many endpoints, but the overlapping tools inflate the count and make the surface feel larger than necessary.

Completeness4/5

The server covers the main read-only vessel and port domain well: vessel lookup, positions, ETA, emissions, casualties, port details, port events, and area/radius queries are all present. Minor gaps exist, such as no historical vessel track or port call summary endpoint, but agents can generally accomplish core workflows without dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vessel-api/vesselapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server