AIS Trail
by aistrail.com · remote · no sign-in to list tools · v1.5.1 · published by com.aistrail
Live AIS ship positions, vessel history, port calls and events, plus sanctions flags. Read-only.
11 tools: 4 do something that can't be undone, 2 change things and 5 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone4Claude Code: ask: see these tools
- Changes things2Claude Code: ask: see these tools
- Only reads5Claude Code: allow: see these tools
4 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http ais https://api.aistrail.com/mcpFindings
Matches of fixed checks, with the text they matched.
- Warnvessel_track
The server marks "vessel_track" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.
The server marks "vessel_port_calls" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "vessel_port_calls" says "call": a word for a change.
- Warnport_calls
The server marks "port_calls" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "port_calls" says "call": a word for a change.
- Warnvessel_events
The server marks "vessel_events" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
11 tools
Can't be undone 4Claude Code: ask
port_callsShips 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 departur…1 finding
Why it is in this group
- The name "port_calls" says "call": a word for a change.
- The input addresses people (input.to): what it sends cannot be taken back.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "port_calls" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "port_calls" says "call": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
- title: Port arrivals and departures (API key)
vessel_eventsEvents of a ship between two times (UTC, ISO 8601), computed from the AIS Trail archive.1 finding
Why it is in this group
- The input addresses people (input.to): what it sends cannot be taken back.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "vessel_events" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
- title: Ship events (API key)
vessel_port_callsPort 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 u…1 finding
Why it is in this group
- The name "vessel_port_calls" says "call": a word for a change.
- The input addresses people (input.to): what it sends cannot be taken back.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "vessel_port_calls" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "vessel_port_calls" says "call": a word for a change.
Description, as the server wrote it 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 for at least 15 minutes 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
- title: Ship port calls (API key)
vessel_trackWhere a ship has been between two times (UTC, ISO 8601), from the AIS Trail archive.1 finding
Why it is in this group
- The input addresses people (input.to): what it sends cannot be taken back.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "vessel_track" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The input addresses people (input.to): what it sends cannot be taken back.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
- title: Ship history (API key)
Changes things 2Claude Code: ask
vessels_in_areaShips heard in the last hour inside a box (at most 5° on each side), largest first.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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).
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Ships in an area
vessels_nearShips heard in the last hour within a radius (at most 50 nautical miles) of a point or of another ship, nearest first.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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).
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Ships near a point or ship
Only reads 5Claude Code: allow
data_statusHow 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…No findings
Why it is in this group
- The name "data_status" says "status": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Coverage and freshness
find_portFind ports by name (or part of it), UN/LOCODE (e.g.No findings
Why it is in this group
- The name "find_port" says "find": a word for reading.
Description, as the server wrote it Find ports by name (or part of it), UN/LOCODE (e.g. NLRTM) or two-letter country code (e.g. NL) 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Find ports
get_vesselEverything known about one ship now: identity (name, IMO, call sign, flag, type, size), last position, speed, course, heading, navigational status, destination (port codes decoded)…No findings
Why it is in this group
- The name "get_vessel" says "get": a word for reading.
Description, as the server wrote it 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).
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Ship details and position
lookup_vesselsRecords 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, es…No findings
Why it is in this group
- The name "lookup_vessels" says "lookup": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
- title: Ship records and sanctions (API key)
search_vesselsFind ships by name (or part of it), MMSI (9 digits) or IMO number (7 digits).No findings
Why it is in this group
- The name "search_vessels" says "search": a word for reading.
Description, as the server wrote it 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).
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Search ships
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.5.1. Values in angle brackets are yours to fill in.
claude mcp add --transport http ais https://api.aistrail.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__ais__search_vessels",
"mcp__ais__get_vessel",
"mcp__ais__data_status",
"mcp__ais__find_port",
"mcp__ais__lookup_vessels"
],
"ask": [
"mcp__ais__vessels_in_area",
"mcp__ais__vessels_near",
"mcp__ais__vessel_track",
"mcp__ais__vessel_port_calls",
"mcp__ais__port_calls",
"mcp__ais__vessel_events"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as ais. Review it before you use it.