AIS Trail
Server Details
Live AIS ship positions, vessel history, port calls and events, plus sanctions flags. Read-only.
- Status
- Healthy
- Uptime
- 99.9% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- aistrail/mcp
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 11 tools
Tools target distinct resources and actions: live vessel details vs vessel search vs bulk archive lookup, port calls by port vs by vessel, and area vs radius queries. Some boundaries such as search_vessels/lookup_vessels/get_vessel and port_calls/vessel_port_calls require reading the descriptions, but they are explicitly differentiated.
All names use snake_case and domain terms, but conventions are mixed: some are verb-first (find_port, get_vessel, lookup_vessels, search_vessels) while most are resource/entity phrases (data_status, port_calls, vessel_events, vessel_track). The singular/plural vessel convention is somewhat predictable, but the set does not follow one naming pattern.
11 tools are well-scoped for a rich read-only AIS/port analytics domain. Each tool covers a distinct query surface such as status, ports, vessels, calls, events, tracks, and area/nearby queries, without redundant near-duplicates.
The surface covers live status, port lookup, vessel identity/search/archive lookup, port calls in both directions, events, tracks, and area/nearby queries, so core AIS workflows are available. Minor gaps remain for historical area queries, zone/anchorage lookup, or direct port detail by id, but agents can mostly work around them.
Available Tools
11 toolsdata_statusCoverage and freshnessARead-onlyIdempotentInspect
How many ships are live now (live_ships_private: how many of them are private vessels, counted only), how many are known from the last 7 days, the date range of the history archive per source with available_until (the latest time vessel_track can return for that source on plans without live data), and the service status: ok or degraded, with reason codes in reasons.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: what live_ships_private counts (private vessels only, counted not listed), the 7-day lookback, what available_until means for vessel_track on live-less plans, and the degraded/reasons failure model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single very long sentence with nested parentheticals, cramming four distinct concepts (live counts, 7-day counts, archive ranges, service status) into one clause chain. Information density is high, but the structure makes it harder to parse than a short bulleted breakdown would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and full annotation coverage of the safety profile, the description carries the return-value burden and does so credibly, enumerating the key response fields. Some field names (e.g. the 7-day known-vessel count) remain unnamed, so an agent cannot map every value to an exact key.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly implies no arguments are needed and instead spends its words explaining the response fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (coverage/freshness status) and enumerates the exact information returned: live ship counts, 7-day known vessels, per-source archive date range, available_until, and ok/degraded service status with reason codes. It is clearly distinguishable from the vessel-querying siblings, though it never explicitly frames itself as the metadata/health endpoint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is a pre-flight check before querying vessel data, and available_until is tied to vessel_track's behavior on plans without live data. However, there is no explicit 'use this when...' or exclusion guidance, and no sibling tool is named as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_portFind portsARead-onlyIdempotentInspect
Find ports by name (or part of it), UN/LOCODE (e.g. FIHEL) or two-letter country code (e.g. FI) in the port reference (World Port Index and UN/LOCODE ports): id (for port_calls), name, country, UN/LOCODE, position, harbor size (World Port Index ports only) and the radius of the port area used to detect port calls. At most 20 ports, larger harbors first. No API key needed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of ports to return | |
| query | No | Port name | |
| locode | No | UN/LOCODE | |
| country | No | ISO 3166-1 alpha-2 country code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the bar is lower; the description still adds real context: a hard 20-result cap, deterministic ordering ('larger harbors first'), no API key requirement, and the caveat that harbor size only exists for World Port Index ports. It does not say what an empty result looks like, but the operational profile is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The accepted query modes are front-loaded in the first clause, followed by the return fields, then two short constraint sentences. It is dense but every clause carries information; the only mild cost is a long comma-laden first sentence that takes effort to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so by enumerating every field, plus the port-area radius used for port-call detection. Combined with the result cap and ordering, an agent has everything needed to call this reference-lookup tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by clarifying that 'query' matches on part of a name, giving format examples for locode and country, and reinforcing the 20-item ceiling that pairs with the limit parameter. It stops short of explaining precedence when multiple filters are supplied together.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('find') and resource ('ports') and enumerates the three accepted lookup modes with concrete examples (FIHEL, FI). It also lists exactly what comes back (id, name, country, UN/LOCODE, position, harbor size, port-area radius), so an agent can distinguish it from vessel-oriented siblings like get_vessel or port_calls at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implicitly defines when the tool is appropriate by spelling out the three valid query forms, and the note that id is 'for port_calls' hints at the downstream sibling relationship. But there is no explicit 'use this instead of X' or exclusion guidance against port_calls or vessels_near, leaving the routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vesselShip details and positionARead-onlyIdempotentInspect
Everything known about one ship now: identity (name, IMO, call sign, flag, type, size), last position, speed, course, heading, navigational status, destination (port codes decoded) and ETA as given by the crew, how long ago it was heard, its track over the last 40 minutes, and the data sources to credit. flag (ISO code) and flag_country come from the MMSI: the flag of the radio licence, usually but not always the registry flag. dwt_estimate is an estimate from the AIS dimensions (tonnes, size class such as Panamax or VLCC, hull, draught used), not a registry value; null for tugs, pleasure craft and other types where deadweight does not apply. For archive records and sanctions flags, use lookup_vessels (API key).
| Name | Required | Description | Default |
|---|---|---|---|
| mmsi | Yes | 9-digit MMSI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses meaningful behavioral context: the response includes 'how long ago it was heard' (freshness), a 40-minute track window, and 'the data sources to credit'. It also flags two substantive caveats — flag is the radio-licence flag from the MMSI and may differ from the registry flag, and dwt_estimate is derived from AIS dimensions and is null for tugs and pleasure craft.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the returned-field inventory, then caveats, then the alternative. It is dense and long, but with no output schema each clause is doing real work; only the field enumeration borders on sprawling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates fully by describing return contents, freshness semantics, provenance, and the limits of two derived fields, plus a routing note. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single mmsi parameter, so the schema already carries the burden and baseline is 3. The description adds some meaning by explaining what the MMSI encodes (radio licence flag) and what is derived from it, but it adds nothing about the parameter's format or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates exactly what 'get_vessel' returns for a single ship: identity, position, motion, navigational status, destination, ETA, freshness, a 40-minute track, and provenance. It is unmistakably a single-vessel detail lookup, and it explicitly separates itself from lookup_vessels for archive/sanctions data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete routing rule: 'For archive records and sanctions flags, use lookup_vessels (API key)', implying this tool serves live/current snapshots. It does not distinguish against other close siblings like vessel_track or vessels_near, so 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.
lookup_vesselsShip records and sanctions (API key)ARead-onlyIdempotentInspect
Records of up to 20 ships at once from the AIS Trail archive, by mmsi and/or imo (lists): identity and particulars (name, IMO, call sign, type, flag from the MMSI, length, beam, estimated deadweight, first and last seen) and sanctions flags by IMO number from three official lists: OFAC SDN, UK Sanctions List and EU Regulation 833/2014 Annex XLII (list, programmes, date listed). An IMO number resolves to the MMSI that reported it last; ships not in the plan's sources come back with found false. Sanctions flags are informational, not a compliance determination: only ships a list names by IMO number are matched, ownership-based sanctions are not covered. Needs an AIS Trail API key sent by the MCP client as the HTTP header 'Authorization: Bearer ap_live_…'. Credits: 1 per ship returned (none for ships not found); the plan's sources and 24-hour delay (on plans without live data) apply.
| Name | Required | Description | Default |
|---|---|---|---|
| imo | No | 7-digit IMO numbers; mmsi and imo together at most 20 | |
| mmsi | No | 9-digit MMSIs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, idempotent, open-world, non-destructive profile, and the description layers on genuinely new operational context: required 'Authorization: Bearer ap_live_…' header, credit cost (1 per ship returned, free for misses), the plan's source set and 24-hour delay, and the explicit limits of the sanctions matching. This is well beyond what the structured fields convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and inputs are front-loaded in the opening clause, and the later sentences (sanctions caveat, auth, credits, delay) all carry decision-relevant information rather than filler. It is a single dense block that would read better broken into lines, but little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so thoroughly: enumerates identity/particular fields, sanctions fields (list, programmes, date listed), and the found-false sentinel. Auth, cost, and data-freshness caveats complete the picture for a 2-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: the 20-item cap applies to mmsi and imo combined, and 'an IMO number resolves to the MMSI that reported it last' explains resolution behavior the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (lookup) plus resource (ships/vessels) and pins down the input mode: batch of up to 20 by mmsi and/or imo lists from the AIS Trail archive. That scope statement is enough to distinguish it from single-vessel or name-based siblings, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the batch-of-20, identifier-list framing tells an agent this is for bulk identity resolution rather than search or tracking, and the 'found false' note covers the miss case. There is no explicit when-to-use/when-not or named alternative (e.g. search_vessels for name lookup, get_vessel for a single ship).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
port_callsPort arrivals and departures (API key)ARead-onlyIdempotentInspect
Ships that called at one port between two times (UTC, ISO 8601), from the AIS Trail archive: ship (with its flag from the MMSI), arrival, departure, draught on arrival and departure, cargo estimate, previous and next port. Get the port_id from find_port. event: any (in port at any time in the range, default), arrival or departure. The sanctions column gives the codes of the sanctions lists (OFAC, UK, EU) that name the ship's IMO number; informational only, not a compliance determination. Needs an AIS Trail API key sent by the MCP client as the HTTP header 'Authorization: Bearer ap_live_…'. At most 100 port calls per call and at most 366 days; the plan's rules and credits (1 per port call returned) apply as for vessel_port_calls.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End, e.g. 2026-09-02T00:00:00Z | |
| from | Yes | Start, e.g. 2026-09-01T00:00:00Z | |
| event | No | any: in port at any time in the range; arrival: arrived in the range; departure: departed in the range | any |
| port_id | Yes | Port id from find_port |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnly/idempotent annotations: discloses the required API key and exact header format, the 100-call and 366-day caps, the 1-credit-per-port-call cost model, and explicitly frames the sanctions column as informational rather than a compliance determination. These are the operational constraints an agent would otherwise trip over.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads the resource and scope, then moves to routing, filters, caveats, and limits in a sensible order. It is long-ish but nearly every clause carries a constraint an agent needs; the sanctions sentence and the vessel_port_calls billing pointer could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by listing the returned columns including the sanctions codes and their caveat. Auth, pagination-style caps, date-range limits, and credit cost are all covered, leaving nothing material unstated for a read-only lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds value by stating times are UTC ISO 8601 and by reinforcing that port_id comes from find_port and that event defaults to 'any' with its in-port-anytime semantics. It does not add anything for the from/to boundary inclusivity, but coverage is otherwise solid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Ships that called at one port between two times') and enumerates the returned fields (ship/flag, arrival, departure, draught, cargo estimate, previous/next port). It distinguishes itself from fixed siblings by naming find_port for the port_id and pointing at vessel_port_calls for plan rules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear prerequisites ('Get the port_id from find_port') and defines the event selector's three modes with defaults, which is exactly what an agent needs to choose parameters. It does not explicitly state when to prefer this over a sibling like vessel_port_calls or vessel_events, only that billing follows vessel_port_calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_vesselsSearch shipsARead-onlyIdempotentInspect
Find ships by name (or part of it), MMSI (9 digits) or IMO number (7 digits). Returns live ships first, then ships out of range with their last known position (up to 7 days). List results are compact rows (mmsi, name, category, flag (ISO code from the MMSI), lat, lon, speed_kn, course_deg, length_m, destination, age_s, status, source); call get_vessel for full details of one ship. Private vessels (pleasure craft, sailing vessels and Class B transponders without a valid IMO number) are never listed or looked up individually; area and nearby results report how many were left out (private_vessels).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of ships to return | |
| query | Yes | Ship name, MMSI (9 digits) or IMO (7 digits) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses result ordering (live ships first, then out-of-range with last known position up to 7 days) and a privacy rule excluding private vessels/Class B without IMO, with a private_vessels count reported in other tools. These are non-obvious behavioral traits an agent could not infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the search capability and identifiers, then the return-row contract, then the sibling pointer. It is dense but every clause carries information; the long field enumeration is the only mildly heavy element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the return contract: exact compact row fields include mmsi, name, flag ISO code derivation, speed/course units, age_s, status, source. Combined with the ordering and privacy rules, an agent has everything needed to interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented. The description adds only marginal meaning—confirming partial-name matching, which the schema does not state—but says nothing about the limit parameter or its 1–20 cap. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Find ships') and names the exact identifier types accepted (name fragment, 9-digit MMSI, 7-digit IMO). It also explicitly routes detail lookups to a named sibling ('call get_vessel for full details'), distinguishing it from the broader lookup/nearby/area tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly implies the right context (identifier-based lookup) and names the alternative for full records ('call get_vessel'). It does not explicitly exclude the other search-like siblings (lookup_vessels, vessels_near), so the agent must infer when identifier search beats area search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vessel_eventsShip events (API key)ARead-onlyIdempotentInspect
Events of a ship between two times (UTC, ISO 8601), computed from the AIS Trail archive. from and to are optional: without to, now (24 hours ago on plans without live data); without from, 7 days before to (on Free, no earlier than the oldest day the plan includes), as on the REST endpoint. Give mmsi or imo (with imo, every MMSI that reported that IMO number in the range). Types: ENTER_ZONE and EXIT_ZONE (arrival at and departure from a port or anchorage; port_id for port_calls, zone port or anchorage), STATE_CHANGED (MOVING, NOT_MOVING, LONG_STOP), NAME_CHANGED, IMO_CHANGED, CALLSIGN_CHANGED, DESTINATION_CHANGED and DRAUGHT_CHANGED (old and new value); only when asked by name or with types ['all']: AIS_GAP (long AIS silence while under way; old_value hours, new_value nautical miles), ENCOUNTER (slow close approach to another ship outside port areas, a candidate ship-to-ship transfer; new_value the other ship's MMSI), FLAG_CHANGED (the IMO number reappears under an MMSI with another flag) and POSITION_JUMP (a physically impossible position jump). Rows: [time, event, old_value, new_value, lat, lon, mmsi, port_id, zone, sanctions, detail]; detail says more about behaviour events. The sanctions column gives the codes of the sanctions lists (OFAC, UK, EU) that name the ship's IMO number; informational only, not a compliance determination. Needs an AIS Trail API key sent by the MCP client as the HTTP header 'Authorization: Bearer ap_live_…'. At most 200 events per call and at most 31 days; the plan's history depth, credits (1 per event returned), rate limit and 24-hour delay (on plans without live data) apply.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End, e.g. 2026-10-08T00:00:00Z; default: now (24 hours ago on plans without live data) | |
| imo | No | 7-digit IMO number; covers every MMSI that reported it in the range. Give mmsi or imo | |
| from | No | Start, e.g. 2026-10-01T00:00:00Z; default: 7 days before to (on Free, no earlier than the oldest day the plan includes) | |
| mmsi | No | 9-digit MMSI of the ship; give mmsi or imo | |
| types | No | Event types; default: every type except AIS_GAP, ENCOUNTER, FLAG_CHANGED, POSITION_JUMP. ['all'] for every type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: 200-event and 31-day hard caps, 1 credit per event returned, rate limits, plan history depth, the 24-hour delay on non-live plans, and the required 'Authorization: Bearer ap_live_…' header. It also warns that the sanctions column is informational only and not a compliance determination, which is exactly the kind of caveat an agent could otherwise misapply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and nearly every sentence carries operational information. The single dense paragraph, especially the event-type enumeration, is harder to scan than it needs to be, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the exact row shape [time, event, old_value, new_value, lat, lon, mmsi, port_id, zone, sanctions, detail] and explains per-type old_value/new_value semantics. Combined with auth, limits, and defaulting behavior, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema documents ranges and defaults, but the description goes further: it explains what each event type means (e.g. ENCOUNTER as a candidate ship-to-ship transfer, AIS_GAP with hours/miles in old_value/new_value), how imo expands to every reporting MMSI, and the row layout for results. Value added is real, though it restates some defaults already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Events of a ship between two times') and grounds it in the AIS Trail archive, plus a full enumeration of event types that makes it clearly distinct from track-position tools. It never names a sibling tool explicitly, so an agent must infer the boundary with vessel_track or port_calls rather than being told.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: give mmsi or imo, defaults for from/to, and the rule that heavy event types (AIS_GAP, ENCOUNTER, FLAG_CHANGED, POSITION_JUMP) are returned only when requested by name or via ['all']. However, it gives no explicit when-to-use-this-vs-alternative statement for the sibling tools that also return ship/port data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vessel_port_callsShip port calls (API key)ARead-onlyIdempotentInspect
Port calls of a ship between two times (UTC, ISO 8601), from the AIS Trail archive: port, arrival, departure, draught on arrival and departure, cargo estimate (loaded, ballast or unchanged, from the draught change), previous and next port. Give mmsi or imo. A port call starts when the ship stops inside a port area and ends when it leaves; departure is null while it is still in port. The sanctions column gives the codes of the sanctions lists (OFAC, UK, EU) that name the ship's IMO number; informational only, not a compliance determination. Needs an AIS Trail API key sent by the MCP client as the HTTP header 'Authorization: Bearer ap_live_…'. At most 100 port calls per call and at most 366 days; the plan's history depth, credits (1 per port call returned), rate limit and 24-hour delay (on plans without live data) apply.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End, e.g. 2026-10-01T00:00:00Z | |
| imo | No | 7-digit IMO number of the ship; give mmsi or imo | |
| from | Yes | Start, e.g. 2026-09-01T00:00:00Z | |
| mmsi | No | 9-digit MMSI of the ship; give mmsi or imo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: defines port-call semantics (starts when stopped inside a port area, ends on leaving), notes departure is null while in port, flags the sanctions column as informational only, and discloses credit cost, rate limits and the 24-hour delay on non-live plans.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and return fields, then constraints and auth in descending priority. It is a dense single paragraph; splitting the access/limit caveats into their own sentence would scan better, but no clause is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by listing every returned field (port, arrival, departure, draughts, cargo estimate, adjacent ports, sanctions) and covering auth, limits and known-unknown behaviors like the null departure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by stating 'give mmsi or imo' — the schema marks neither as required, so this clarifies a real constraint the structured data leaves ambiguous, and confirms UTC/ISO 8601 for the time bounds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Port calls of a ship between two times ... from the AIS Trail archive') and enumerates the returned fields, so the agent knows exactly what it gets. The archive/API-key framing plus the title's '(API key)' distinguishes it from the sibling port_calls variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: supply mmsi or imo, a UTC ISO 8601 window, max 100 calls and 366 days, and that an AIS Trail API key is required via the Authorization header. It does not explicitly contrast with siblings like vessel_events or vessel_track, so an agent must infer which to prefer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vessels_in_areaShips in an areaARead-onlyIdempotentInspect
Ships heard in the last hour inside a box (at most 5° on each side), largest first. List results are compact rows (mmsi, name, category, flag (ISO code from the MMSI), lat, lon, speed_kn, course_deg, length_m, destination, age_s, status, source); call get_vessel for full details of one ship. Private vessels (pleasure craft, sailing vessels and Class B transponders without a valid IMO number) are never listed or looked up individually; area and nearby results report how many were left out (private_vessels).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of ships to return | |
| max_lat | Yes | Northern edge of the box, decimal degrees | |
| max_lon | Yes | Eastern edge of the box, decimal degrees | |
| min_lat | Yes | Southern edge of the box, decimal degrees | |
| min_lon | Yes | Western edge of the box, decimal degrees | |
| ship_type | No | Optional type filter |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safe-read profile (readOnly, idempotent, non-destructive), and the description adds substantive behavior beyond them: a one-hour recency window, a maximum 5° box, largest-first ordering, and the non-obvious policy that private vessels are never returned but are counted in a private_vessels field. That exclusion rule is the kind of hidden behavior an agent could not infer from schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core scope, constraint and ordering before the detail list, with zero filler. The compact row field enumeration is long but justified because there is no output schema; it could still be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter read tool with no output schema, the description supplies the return shape, the recency semantics, the bounding-box limit, the ranking, the private-vessel exclusion with its counter, and the escalation path to get_vessel. Only the failure mode for an oversized box is unstated, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, giving a baseline of 3, but the description contributes meaning the schema lacks: the 5° per-side cap on min/max lat/lon and the 'largest first' implication for the limit parameter. Only ship_type is left unmentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (ships), a precise scope (heard in the last hour inside a bounding box), a hard constraint (box at most 5° per side) and an ordering (largest first). This clearly separates it from the radius-based vessels_near and the name-based lookup_vessels/search_vessels siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to get_vessel when full detail on a single ship is needed, and the box-size cap tells the agent this tool is not usable for wide-area queries. It never names a competing sibling (e.g. vessels_near for radius searches) or states exclusions, so it falls short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vessels_nearShips near a point or shipARead-onlyIdempotentInspect
Ships heard in the last hour within a radius (at most 50 nautical miles) of a point or of another ship, nearest first. List results are compact rows (mmsi, name, category, flag (ISO code from the MMSI), lat, lon, speed_kn, course_deg, length_m, destination, age_s, status, source); call get_vessel for full details of one ship. Private vessels (pleasure craft, sailing vessels and Class B transponders without a valid IMO number) are never listed or looked up individually; area and nearby results report how many were left out (private_vessels).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude of the centre, decimal degrees (with lon, or give mmsi) | |
| lon | No | Longitude of the centre, decimal degrees (with lat, or give mmsi) | |
| mmsi | No | Use this ship's position as the centre instead of lat/lon | |
| limit | No | Maximum number of ships to return | |
| radius_nm | No | Search radius in nautical miles |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description adds substantial behaviour: a one-hour recency window, a hard 50 nm cap, nearest-first ordering, and a documented privacy exclusion for private vessels with a private_vessels count returned. That privacy rule is a non-obvious constraint that would otherwise cause silent under-reporting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with scope, then the return shape, then the alternative, then the caveat — a sensible order. The parenthetical field enumeration is long but earns its place because there is no output schema; it is still dense enough that a skim could miss the privacy clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the compact row fields end to end, and it discloses both the truncation cap and the private-vessel exclusion count. An agent has everything needed to call this correctly and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so lat/lon/mmsi/limit/radius_nm are all documented with the centre-or-ship choice and defaults. The description's radius cap restates the schema maximum rather than adding syntax or tie-breaking detail, so it stays at the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (ships) with precise scope: heard in the last hour, within a radius, centred on a point or another ship, nearest first. The radius framing cleanly distinguishes it from area-based siblings like vessels_in_area, and the get_vessel pointer handles the single-ship case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to get_vessel when full details of one ship are needed, and the radius framing implies a proximity use case. It does not, however, contrast itself with the other nearby siblings (vessels_in_area, search_vessels, lookup_vessels), so the agent must infer that boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vessel_trackShip history (API key)ARead-onlyIdempotentInspect
Where a ship has been between two times (UTC, ISO 8601), from the AIS Trail archive. Needs an AIS Trail API key sent by the MCP client as the HTTP header 'Authorization: Bearer ap_live_…' (keys at https://aistrail.com); clients that cannot add headers (OAuth-only web connectors) cannot use it yet. Resolution: raw (up to 24 h per call), 1m (up to 7 days) or 1h (up to 366 days); at most 200 points per call, as rows of [time, lat, lon, speed_kn, course_deg]. The plan's history depth, credits (as on the track endpoint: 1 per vessel-day) and rate limit apply, and the 24-hour delay on recent data on plans without live data. sources_through gives, per source, the time up to which the archive holds its data; pending_days lists days in the range a source has not delivered yet, so no points on those days does not mean the ship was absent.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End, e.g. 2026-10-02T00:00:00Z | |
| from | Yes | Start, e.g. 2026-10-01T00:00:00Z | |
| mmsi | Yes | 9-digit MMSI of the ship | |
| resolution | No | raw: every position (up to 24 h per call); 1m: one point per minute (up to 7 days); 1h: one point per hour (up to 366 days) | 1m |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/openWorld annotations: it discloses the API-key requirement and exact header format, plan-dependent history depth, credit cost (1 per vessel-day), rate limiting, the 24-hour delay on recent data for plans without live data, a 200-point cap per call, and the row shape returned. It also explains that missing points may reflect undelivered source days via sources_through/pending_days rather than vessel absence — a genuinely important behavioral caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then constraints, then return semantics — a sensible order. The prose is dense with long parenthetical clauses (auth, resolution, credits) that could be split for scanability, but every sentence carries operative information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates fully by describing the returned row format ([time, lat, lon, speed_kn, course_deg]) and the sources_through/pending_days metadata. Auth, limits, cost, and data-freshness caveats are all covered, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by adding the hard limits tied to each resolution value and the 200-point-per-call ceiling, which constrain how an agent should set the range and resolution. mmsi and from/to are left to the schema, which already documents them adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — where a ship has been between two times — plus the data source (AIS Trail archive). It is clearly distinguishable from siblings like vessel_events, port_calls, or get_vessel, which return events, port visits, or current/static data rather than a positional track.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection guidance for the resolution parameter (raw up to 24 h, 1m up to 7 days, 1h up to 366 days) and an explicit exclusion: clients that cannot add HTTP headers (OAuth-only web connectors) cannot use this tool. It does not name sibling tools as alternatives for narrower questions, so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
- Changed
find_port1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of ports to return"
- Changed
port_calls2 fields changed- added
Input schema / properties / event / descriptionAdded value: +"any: in port at any time in the range; arrival: arrived in the range; departure: departed in the range" - added
Input schema / properties / port_id / descriptionAdded value: +"Port id from find_port"
- Changed
search_vessels1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of ships to return"
- Changed
vessel_events2 fields changed- added
Input schema / properties / imo / descriptionAdded value: +"7-digit IMO number; covers every MMSI that reported it in the range. Give mmsi or imo" - added
Input schema / properties / mmsi / descriptionAdded value: +"9-digit MMSI of the ship; give mmsi or imo"
- Changed
vessel_port_calls2 fields changed- added
Input schema / properties / imo / descriptionAdded value: +"7-digit IMO number of the ship; give mmsi or imo" - added
Input schema / properties / mmsi / descriptionAdded value: +"9-digit MMSI of the ship; give mmsi or imo"
- Changed
vessel_track2 fields changed- added
Input schema / properties / mmsi / descriptionAdded value: +"9-digit MMSI of the ship" - added
Input schema / properties / resolution / descriptionAdded value: +"raw: every position (up to 24 h per call); 1m: one point per minute (up to 7 days); 1h: one point per hour (up to 366 days)"
- Changed
vessels_in_area5 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of ships to return" - added
Input schema / properties / max_lat / descriptionAdded value: +"Northern edge of the box, decimal degrees" - added
Input schema / properties / max_lon / descriptionAdded value: +"Eastern edge of the box, decimal degrees" - added
Input schema / properties / min_lat / descriptionAdded value: +"Southern edge of the box, decimal degrees" - added
Input schema / properties / min_lon / descriptionAdded value: +"Western edge of the box, decimal degrees"
- Changed
vessels_near4 fields changed- added
Input schema / properties / lat / descriptionAdded value: +"Latitude of the centre, decimal degrees (with lon, or give mmsi)" - added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of ships to return" - added
Input schema / properties / lon / descriptionAdded value: +"Longitude of the centre, decimal degrees (with lat, or give mmsi)" - added
Input schema / properties / radius_nm / descriptionAdded value: +"Search radius in nautical miles"
1 tool update
- Changed
vessel_events3 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start, e.g. 2026-10-01T00:00:00Z"New value: +"Start, e.g. 2026-10-01T00:00:00Z; default: 7 days before to (on Free, no earlier than the oldest day the plan includes)" - changed
Input schema / properties / to / descriptionPrevious value: -"End, e.g. 2026-10-08T00:00:00Z"New value: +"End, e.g. 2026-10-08T00:00:00Z; default: now (24 hours ago on plans without live data)" - changed
Input schema / requiredPrevious value: -[ - "from", - "to" -]New value: +[]
2 tool updates
- Added
lookup_vessels - Added
vessel_events
9 tool updates
- First observed
data_status - First observed
find_port - First observed
get_vessel - First observed
port_calls - First observed
search_vessels - First observed
vessel_port_calls - First observed
vessel_track - First observed
vessels_in_area - First observed
vessels_near
Related MCP Connectors
Maritime intelligence: vessels, tracks, port calls, company fleets and sanctions screening, sourced.
Live AIS vessel positions by MMSI, name, area, or radius, plus coverage. No sign-in, no key.
Vessel tracking for 750,000+ ships, with ownership, inspections, port records, routes, and more.
Vessel Tracking — live worldwide ship positions from AIS.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides live vessel positions from Fintraffic's AIS receivers in Finnish and Baltic waters, with tools to query vessels near a point, count vessels in an area, and get details by MMSI. No authentication required.211 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables vessel screening by IMO number for sanctions matches, ownership opacity, and A–E vetting grades, along with batch screening and retrieval of stored records. Also resolves port names or countries to UN/LOCODEs and scores voyage risk between two ports.MIT

Datalastic MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceEnables real-time vessel tracking, port data, maritime weather, and maritime intelligence through 25 tools, allowing AI clients to query live vessel positions, registry, port info, area searches, weather, and more.MIT- AlicenseAqualityBmaintenanceRead-only MCP server for vessel identity lookup, AIS-style positions, tracks, port calls, carrier schedules, vessel schedules, and delay heuristics with source attribution and BYOK provider support.1453 npm8MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.