Shiptrail MCP
An official MCP server providing live AIS ship tracking data. It allows AI agents to search for ships by name, MMSI, or IMO, retrieve detailed vessel information, search for ports, and view port arrivals and departures. The server operates over Streamable HTTP without requiring authentication keys or sessions.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://shiptrail.io/mcpWhat its tools do
4 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (4)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to shiptrail.io ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Find a ship's current position, speed, and destination by name or MMSI
- Retrieve detailed vessel facts including flag, type, size, and photographs
- Search for ports by name or UN/LOCODE
- View a port's current arrivals, departures, and ships in port
Source and maintenance
Protocol and capabilities
- Server
- shiptrail 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 4 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
4 advertised
search_ships — Search ships
Find ships by name, MMSI (9 digits) or IMO number (7 digits): every ship with a Shiptrail page, any class, on the map now or heard in the last year. Ships on the map now come first. Use get_ship with an MMSI for the whole record.
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 20,
"minimum": 1,
"description": "At most this many ships."
},
"query": {
"type": "string",
"maxLength": 40,
"minLength": 3,
"description": "A ship's name or part of it, an MMSI or an IMO number."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"query",
"ships"
],
"properties": {
"note": {
"type": "string",
"description": "Why the list may be short."
},
"query": {
"type": "string"
},
"ships": {
"type": "array",
"items": {
"type": "object",
"required": [
"mmsi",
"name",
"onMap",
"url"
],
"properties": {
"imo": {
"type": "integer"
},
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"flag": {
"type": "string",
"description": "Flag state, from her MMSI."
},
"kind": {
"enum": [
"cargo",
"tanker",
"passenger",
"highspeed",
"fishing",
"tug",
"sail",
"military",
"other"
],
"type": "string",
"description": "The map's class for her AIS type."
},
"mmsi": {
"type": "integer"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"description": "Her AIS type in words."
},
"onMap": {
"type": "boolean",
"description": "True when she is on the live map now."
},
"lengthM": {
"type": "number"
},
"callSign": {
"type": "string"
},
"lastHeard": {
"type": "string",
"format": "date-time",
"description": "Her last position report."
},
"nearMatch": {
"type": "boolean",
"description": "Matched allowing a typo."
}
}
}
}
}
}{
"readOnlyHint": true,
"openWorldHint": false
}get_ship — Get a ship
Everything Shiptrail's page shows about one ship, by MMSI: identity, size, position, speed, course and status, destination and ETA, where she came from, recent port calls, particulars and registry facts, photo and its credit, a Wikipedia summary, and, with includeNearby, the ships near her. No history over time.
{
"type": "object",
"required": [
"mmsi"
],
"properties": {
"mmsi": {
"type": "integer",
"maximum": 999999999,
"minimum": 0,
"description": "Her MMSI, 9 digits."
},
"includeNearby": {
"type": "boolean",
"default": false,
"description": "Also list the ships near her. Off by default; leave it off unless the question is about her surroundings."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"mmsi",
"name",
"onMap",
"url"
],
"properties": {
"imo": {
"type": "integer"
},
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"flag": {
"type": "string"
},
"kind": {
"enum": [
"cargo",
"tanker",
"passenger",
"highspeed",
"fishing",
"tug",
"sail",
"military",
"other"
],
"type": "string",
"description": "The map's class for her AIS type."
},
"mmsi": {
"type": "integer"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"beamM": {
"type": "number"
},
"onMap": {
"type": "boolean"
},
"photo": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri"
},
"page": {
"type": "string",
"format": "uri",
"description": "Its page on Wikimedia Commons; link it with the credit."
},
"credit": {
"type": "string"
},
"license": {
"type": "string"
},
"licenseUrl": {
"type": "string",
"format": "uri"
}
}
},
"nearby": {
"type": "array",
"items": {
"type": "object",
"required": [
"mmsi",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"flag": {
"type": "string"
},
"kind": {
"enum": [
"cargo",
"tanker",
"passenger",
"highspeed",
"fishing",
"tug",
"sail",
"military",
"other"
],
"type": "string",
"description": "The map's class for her AIS type."
},
"mmsi": {
"type": "integer"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"lengthM": {
"type": "number"
},
"distanceNm": {
"type": "number"
}
}
}
},
"voyage": {
"type": "object",
"properties": {
"eta": {
"type": "string",
"format": "date-time",
"description": "ETA as the crew typed it, placed in the nearest year."
},
"from": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"inPort": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"boundFor": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"departed": {
"type": "string",
"format": "date-time",
"description": "When she left the port she came from."
},
"etaPassed": {
"type": "boolean"
},
"destination": {
"type": "string",
"description": "As the crew typed it."
},
"etaAsBroadcast": {
"type": "string"
}
}
},
"dossier": {
"enum": [
"complete",
"pending",
"none"
],
"type": "string",
"description": "pending: her particulars and photo are still being looked up; ask again in a minute."
},
"lengthM": {
"type": "number"
},
"aisClass": {
"enum": [
"A",
"B"
],
"type": "string"
},
"callSign": {
"type": "string"
},
"draughtM": {
"type": "number"
},
"position": {
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"at": {
"type": "string",
"format": "date-time",
"description": "When the fix was made."
},
"lat": {
"type": "number"
},
"lon": {
"type": "number"
},
"status": {
"type": "string",
"description": "Navigational status as she reports it."
},
"speedKn": {
"type": "number"
},
"courseDeg": {
"type": "number"
},
"headingDeg": {
"type": "number"
}
},
"description": "Where she is, as she last broadcast it. For a ship off the map, where she was last heard."
},
"lastHeard": {
"type": "string",
"format": "date-time",
"description": "Her last position report."
},
"wikipedia": {
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri"
},
"summary": {
"type": "string"
}
}
},
"particulars": {
"type": "object",
"properties": {
"built": {
"type": "string"
},
"owner": {
"type": "string"
},
"builder": {
"type": "string"
},
"service": {
"type": "string"
},
"operator": {
"type": "string"
},
"registry": {
"type": "string"
},
"deadweight": {
"type": "number"
},
"netTonnage": {
"type": "number"
},
"yardNumber": {
"type": "string"
},
"description": {
"type": "string"
},
"formerNames": {
"type": "array",
"items": {
"type": "string"
}
},
"sisterShips": {
"type": "array",
"items": {
"type": "object",
"properties": {
"imo": {
"type": "integer"
},
"name": {
"type": "string"
}
}
}
},
"vesselClass": {
"type": "string"
},
"grossTonnage": {
"type": "number"
},
"portOfRegistry": {
"type": "string"
}
},
"description": "From Wikidata and the US Coast Guard, where they know her."
},
"recentCalls": {
"type": "array",
"items": {
"type": "object",
"required": [
"port"
],
"properties": {
"port": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"arrived": {
"type": "string",
"format": "date-time",
"description": "Arrived."
},
"departed": {
"type": "string",
"format": "date-time",
"description": "Left; absent while she is there."
}
}
}
},
"sharesImoWith": {
"type": "array",
"items": {
"type": "object",
"required": [
"mmsi",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"mmsi": {
"type": "integer"
},
"name": {
"type": "string"
}
}
},
"description": "Other MMSIs heard with her IMO number."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false
}search_ports — Search ports
Find ports by name or UN/LOCODE. Busy ports come first, with how many ships are in port, en route and lately departed. Use get_port with a UN/LOCODE for its boards.
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 20,
"minimum": 1,
"description": "At most this many ports."
},
"query": {
"type": "string",
"maxLength": 40,
"minLength": 2,
"description": "A port's name or part of it, or its UN/LOCODE."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"query",
"ports"
],
"properties": {
"ports": {
"type": "array",
"items": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"lat": {
"type": "number"
},
"lon": {
"type": "number"
},
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"inPort": {
"type": "integer",
"description": "Ships in port now; absent for a port that is not busy."
},
"locode": {
"type": "string"
},
"country": {
"type": "string"
},
"enRoute": {
"type": "integer"
},
"departed": {
"type": "integer",
"description": "Ships that left in the last 48 hours."
}
}
}
},
"query": {
"type": "string"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false
}get_port — Get a port
A port's Arrivals board (ships in port now, then ships en route by ETA) and Departures board (ships that left in the last 48 hours), as its Shiptrail page shows them, by UN/LOCODE. Each row carries the ship's MMSI for get_ship.
{
"type": "object",
"required": [
"locode"
],
"properties": {
"limit": {
"type": "integer",
"default": 100,
"maximum": 500,
"minimum": 1,
"description": "At most this many rows on each list; the counts are always whole."
},
"locode": {
"type": "string",
"pattern": "^[A-Za-z]{2}[A-Za-z0-9]{3}$",
"description": "The port's UN/LOCODE, such as USHNL."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"port",
"counts",
"arrivals",
"departures",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"port": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"lat": {
"type": "number"
},
"lon": {
"type": "number"
},
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string"
},
"country": {
"type": "string"
}
}
},
"counts": {
"type": "object",
"required": [
"inPort",
"enRoute",
"departed"
],
"properties": {
"inPort": {
"type": "integer"
},
"enRoute": {
"type": "integer"
},
"departed": {
"type": "integer"
}
}
},
"arrivals": {
"type": "object",
"required": [
"inPort",
"enRoute"
],
"properties": {
"inPort": {
"type": "array",
"items": {
"type": "object",
"required": [
"mmsi",
"name",
"url"
],
"properties": {
"eta": {
"type": "string",
"format": "date-time",
"description": "ETA as the crew typed it, placed in the nearest year."
},
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"flag": {
"type": "string",
"description": "Flag state, from her MMSI."
},
"from": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"kind": {
"enum": [
"cargo",
"tanker",
"passenger",
"highspeed",
"fishing",
"tug",
"sail",
"military",
"other"
],
"type": "string",
"description": "The map's class for her AIS type."
},
"mmsi": {
"type": "integer"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"description": "Her AIS type in words."
},
"onMap": {
"type": "boolean"
},
"etaDay": {
"type": "string",
"description": "The UTC day of her ETA, YYYY-MM-DD: the board groups by it."
},
"status": {
"type": "string",
"description": "Navigational status as she reports it."
},
"speedKn": {
"type": "number"
},
"boundFor": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"departed": {
"type": "string",
"format": "date-time",
"description": "When she left."
},
"lastHeard": {
"type": "string",
"format": "date-time",
"description": "For a ship no longer on the map: when she was last heard."
},
"inPortSince": {
"type": "string",
"format": "date-time",
"description": "When she stopped here, when known."
},
"etaAsBroadcast": {
"type": "string",
"description": "An ETA that is no real time, as broadcast."
}
}
}
},
"enRoute": {
"type": "array",
"items": {
"type": "object",
"required": [
"mmsi",
"name",
"url"
],
"properties": {
"eta": {
"type": "string",
"format": "date-time",
"description": "ETA as the crew typed it, placed in the nearest year."
},
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"flag": {
"type": "string",
"description": "Flag state, from her MMSI."
},
"from": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"kind": {
"enum": [
"cargo",
"tanker",
"passenger",
"highspeed",
"fishing",
"tug",
"sail",
"military",
"other"
],
"type": "string",
"description": "The map's class for her AIS type."
},
"mmsi": {
"type": "integer"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"description": "Her AIS type in words."
},
"onMap": {
"type": "boolean"
},
"etaDay": {
"type": "string",
"description": "The UTC day of her ETA, YYYY-MM-DD: the board groups by it."
},
"status": {
"type": "string",
"description": "Navigational status as she reports it."
},
"speedKn": {
"type": "number"
},
"boundFor": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"departed": {
"type": "string",
"format": "date-time",
"description": "When she left."
},
"lastHeard": {
"type": "string",
"format": "date-time",
"description": "For a ship no longer on the map: when she was last heard."
},
"inPortSince": {
"type": "string",
"format": "date-time",
"description": "When she stopped here, when known."
},
"etaAsBroadcast": {
"type": "string",
"description": "An ETA that is no real time, as broadcast."
}
}
}
}
}
},
"truncated": {
"type": "boolean",
"description": "True when a list was cut to the limit."
},
"departures": {
"type": "array",
"items": {
"type": "object",
"required": [
"mmsi",
"name",
"url"
],
"properties": {
"eta": {
"type": "string",
"format": "date-time",
"description": "ETA as the crew typed it, placed in the nearest year."
},
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"flag": {
"type": "string",
"description": "Flag state, from her MMSI."
},
"from": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"kind": {
"enum": [
"cargo",
"tanker",
"passenger",
"highspeed",
"fishing",
"tug",
"sail",
"military",
"other"
],
"type": "string",
"description": "The map's class for her AIS type."
},
"mmsi": {
"type": "integer"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"description": "Her AIS type in words."
},
"onMap": {
"type": "boolean"
},
"etaDay": {
"type": "string",
"description": "The UTC day of her ETA, YYYY-MM-DD: the board groups by it."
},
"status": {
"type": "string",
"description": "Navigational status as she reports it."
},
"speedKn": {
"type": "number"
},
"boundFor": {
"type": "object",
"required": [
"locode",
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Her page, or the port's, on shiptrail.io."
},
"name": {
"type": "string"
},
"locode": {
"type": "string",
"description": "UN/LOCODE, five letters."
},
"country": {
"type": "string"
}
}
},
"departed": {
"type": "string",
"format": "date-time",
"description": "When she left."
},
"lastHeard": {
"type": "string",
"format": "date-time",
"description": "For a ship no longer on the map: when she was last heard."
},
"inPortSince": {
"type": "string",
"format": "date-time",
"description": "When she stopped here, when known."
},
"etaAsBroadcast": {
"type": "string",
"description": "An ETA that is no real time, as broadcast."
}
}
}
}
}
}{
"readOnlyHint": true,
"openWorldHint": false
}Prompts
Not advertised
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 254 ms
- 95th percentile latency
- 254 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 254 ms · metadata changed · 4 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http shiptrail-mcp https://shiptrail.io/mcpCodex
codex mcp add shiptrail-mcp --url https://shiptrail.io/mcpCursor
{
"mcpServers": {
"shiptrail-mcp": {
"url": "https://shiptrail.io/mcp"
}
}
}Cline
{
"mcpServers": {
"shiptrail-mcp": {
"type": "streamableHttp",
"url": "https://shiptrail.io/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"shiptrail-mcp": {
"type": "http",
"url": "https://shiptrail.io/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http shiptrail-mcp https://shiptrail.io/mcpClaude Desktop
https://shiptrail.io/mcpWindsurf
{
"mcpServers": {
"shiptrail-mcp": {
"serverUrl": "https://shiptrail.io/mcp"
}
}
}Let your agent find its tools
Find servers like Shiptrail MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other data and analytics servers
Do you run Shiptrail MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.