Skip to main content
Glama
VesselAPI MCP Server

VesselAPI MCP Server

VesselAPI MCP Server

CI npm Node License: MIT

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

Server page: vesselapi.com/mcp-server

Prerequisites

  1. Sign up at dashboard.vesselapi.com

  2. Create an API token in your dashboard

  3. Use the token as VESSELAPI_API_KEY in the configuration below

Resources: Documentation | API Explorer | Dashboard | Contact Support

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

Features

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

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

  • Port search, details, port events (arrivals/departures), and port event search across all covered ports

  • Geographic vessel search (bounding box and radius)

  • Manual pagination to control API quota usage

Quick Start

No installation required. Configure your AI client with npx:

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

Configuration

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

Client

Config file

Claude Desktop

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

Cursor

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

Claude Code

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

Windsurf

~/.codeium/windsurf/mcp_config.json

Tools

Vessel Tools

Tool

Description

search_vessels

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

get_vessel

Get detailed vessel information

get_vessel_position

Get the latest stored vessel position (lat/lon, speed, heading, timestamp); it may be hours or days old

get_vessel_eta

Get the ETA the vessel last reported (declared, not predicted)

get_vessel_emissions

Get EU MRV emissions reports (CO2, fuel consumption)

get_vessel_casualties

Get marine casualty records

get_vessel_positions_batch

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

Port Tools

Tool

Description

search_ports

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

get_port

Get port details by UN/LOCODE

get_port_inbound

Get vessels reporting a port as their destination, within an ETA window

get_port_events

Get arrivals/departures for a port (last 2 hours unless timeFrom is given)

get_port_events_by_vessel

Get port events for a vessel (last 2 hours unless timeFrom is given)

list_port_events

List port events across all covered ports, with filters for time, country, port, vessel, or event type

search_port_events_by_port

Search port events by port name

search_port_events_by_vessel

Search port events by vessel name

get_vessel_last_port_event

Get the most recent port event for a vessel

Emissions Tools

Tool

Description

list_emissions

List EU MRV emissions reports, with an optional reporting-year filter

Location Tools

Tool

Description

get_vessels_in_area

Find vessels with an AIS position in a bounding box (default last 2 hours, at most 4 hours)

get_vessels_in_radius

Find vessels with an AIS position within a radius of a point (default last 2 hours, at most 4 hours)

Pagination

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

Development

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

Testing with MCP Inspector

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

Attribution

Data attribution is listed at https://vesselapi.com/disclaimer#sources.

License

MIT

Available Tools

19 tools
get_portB

Get detailed information about a specific port by UN/LOCODE

Inputs: unlocode (required).

get_port_eventsA

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

Inputs: unlocode (required), limit, timeTo, timeFrom, +1 more.

get_port_events_by_vesselA

Get port events (arrivals/departures) for a specific vessel. Covers only the last 2 hours unless timeFrom is given. Events are kept for 31 days.

Inputs: vesselId (required), limit, idType, timeTo, +4 more.

get_port_inboundA

Get vessels whose own reported destination is this port, with a declared ETA inside the arrival window. ETAs are reported by the vessels, not predicted.

Inputs: unlocode (required), etaTo, limit, timeTo, +3 more.

get_vesselC

Get detailed information about a specific vessel

Inputs: vesselId (required), idType.

get_vessel_casualtiesC

Get marine casualty records for a vessel

Inputs: vesselId (required), limit, idType, nextToken.

get_vessel_emissionsB

Get EU MRV annual emissions reports for a vessel (CO2, fuel consumption). Only ships that report under EU MRV have data.

Inputs: vesselId (required), limit, idType, nextToken.

get_vessel_etaA

Get the most recent ETA the vessel itself reported in its AIS voyage data. This is the declared ETA, not a prediction.

Inputs: vesselId (required), idType.

get_vessel_last_port_eventA

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

Inputs: vesselId (required), idType.

get_vessel_positionA

Get the latest stored position of a vessel (latitude, longitude, speed, heading, timestamp). Check the timestamp: the fix may be hours or days old, especially for a vessel away from the coast. The response also carries the vessel's particulars, the destination and ETA it last reported, and a check against its previous position (minutes and distance between that report and this one, implied speed and course, whether the identifiers match). minutes_since_previous is not the age of this position; read vesselPosition.timestamp for that. A separate get_vessel_eta call is needed only when vesselEta is missing.

Inputs: vesselId (required), sat, idType, satMaxAgeMinutes, +1 more.

get_vessel_positions_batchB

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

Inputs: ids (required), limit, idType, timeTo, +2 more.

get_vessels_in_areaA

Find vessels with an AIS position inside a rectangular bounding box during the time window (default the last 2 hours, at most 4 hours). The latitude span plus the longitude span may not exceed 4 degrees.

Inputs: latMax (required), latMin (required), lonMax (required), lonMin (required), +4 more.

get_vessels_in_radiusA

Find vessels with an AIS position within a radius of a point during the time window (default the last 2 hours, at most 4 hours). The radius is in METRES, not nautical miles or kilometres.

Inputs: radius (required), latitude (required), longitude (required), limit, +3 more.

list_emissionsA

List EU MRV annual emissions reports (ships calling at EU and EEA ports), with an optional reporting-year filter

Inputs: limit, period, nextToken.

list_port_eventsA

List port events (arrivals/departures) across all covered ports, with optional filters for time, country, port, vessel, or event type. Covers only the last 2 hours unless timeFrom is given. Events are kept for 31 days.

Inputs: limit, timeTo, country, portName, +5 more.

search_port_events_by_portA

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

Inputs: portName (required), limit, timeTo, timeFrom, +1 more.

search_port_events_by_vesselA

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

Inputs: vesselName (required), limit, timeTo, timeFrom, +1 more.

search_portsB

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

Inputs: name, size, limit, region, +5 more.

search_vesselsA

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

Inputs: q, eni, imo, flag, +8 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 19 tools

    Disambiguation2/5

    The port-events family is badly overlapping: get_port_events, list_port_events, search_port_events_by_port, search_port_events_by_vessel, and get_port_events_by_vessel all retrieve the same arrivals/departures data, and the distinction between get_*_by_vessel vs search_*_by_vessel is opaque because the by_vessel tool is described identically to its search counterpart. Position tools are more distinct, but an agent could easily misselect among the five port-event tools.

    Naming Consistency3/5

    Names are all snake_case verb_noun, which is readable, but the verbs (get/search/list) are applied inconsistently to the same resource, so 'search_port_events_by_vessel' and 'get_port_events_by_vessel' look synonymous rather than modeling different operations. This erodes the predictability of the verb pattern.

    Tool Count3/5

    19 tools is on the heavy side for the domain, and much of that weight comes from the redundant five-tool port-events cluster rather than from genuinely distinct capabilities.

    Completeness4/5

    The surface covers core workflows well: vessel lookup, port lookup, positions (single/batch/area/radius), declared ETA, emissions, casualties, and port events. A dedicated vessel schedule or route tool would help, but agents can work around the gaps.

    Maintenance

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers