vesselapi-mcp 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +11 -15
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this server are documented here.
|
|
4
4
|
This project follows [Semantic Versioning](https://semver.org/).
|
|
5
5
|
|
|
6
|
+
## [2.0.1] - 2026-10-08
|
|
7
|
+
|
|
8
|
+
Documentation only. No tool, parameter or response changed.
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Tool descriptions now say what each endpoint actually returns and where its
|
|
13
|
+
limits are: `get_vessel_position` is the latest stored position, which may be
|
|
14
|
+
hours or days old; `get_vessel_eta` is the ETA the vessel last reported, not a
|
|
15
|
+
prediction; `get_vessel_emissions` and `list_emissions` are EU MRV reports;
|
|
16
|
+
the port event tools state the 2-hour default window and cover "all covered
|
|
17
|
+
ports" rather than "global"; `get_vessels_in_area` and `get_vessels_in_radius`
|
|
18
|
+
describe the time window (default 2 hours, at most 4) and the 4-degree
|
|
19
|
+
bounding box span; `get_port_inbound` describes its ETA window.
|
|
20
|
+
|
|
21
|
+
### Removed
|
|
22
|
+
|
|
23
|
+
- The README section on a third-party hosted deployment.
|
|
24
|
+
|
|
6
25
|
## [2.0.0] - 2026-08-13
|
|
7
26
|
|
|
8
27
|
Vessel ownership, classification and inspection data, and NAVTEX messages were
|
package/README.md
CHANGED
|
@@ -23,14 +23,10 @@ An [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) server that
|
|
|
23
23
|
|
|
24
24
|
- **19 tools** covering vessels, ports, location search, and emissions
|
|
25
25
|
- Vessel search, positions (single and batch), ETA, emissions, and casualties
|
|
26
|
-
- Port search, details, port events (arrivals/departures), and
|
|
26
|
+
- Port search, details, port events (arrivals/departures), and port event search across all covered ports
|
|
27
27
|
- Geographic vessel search (bounding box and radius)
|
|
28
28
|
- Manual pagination to control API quota usage
|
|
29
29
|
|
|
30
|
-
## Hosted deployment
|
|
31
|
-
|
|
32
|
-
A hosted deployment is available on [Fronteir AI](https://fronteir.ai/mcp/vessel-api-vesselapi-mcp).
|
|
33
|
-
|
|
34
30
|
## Quick Start
|
|
35
31
|
|
|
36
32
|
No installation required. Configure your AI client with `npx`:
|
|
@@ -68,9 +64,9 @@ Add the JSON above to the config file for your client:
|
|
|
68
64
|
|---|---|
|
|
69
65
|
| `search_vessels` | Search vessels by name, IMO, MMSI, flag, type, callsign, or year built |
|
|
70
66
|
| `get_vessel` | Get detailed vessel information |
|
|
71
|
-
| `get_vessel_position` | Get
|
|
72
|
-
| `get_vessel_eta` | Get vessel
|
|
73
|
-
| `get_vessel_emissions` | Get emissions
|
|
67
|
+
| `get_vessel_position` | Get the latest stored vessel position (lat/lon, speed, heading, timestamp); it may be hours or days old |
|
|
68
|
+
| `get_vessel_eta` | Get the ETA the vessel last reported (declared, not predicted) |
|
|
69
|
+
| `get_vessel_emissions` | Get EU MRV emissions reports (CO2, fuel consumption) |
|
|
74
70
|
| `get_vessel_casualties` | Get marine casualty records |
|
|
75
71
|
| `get_vessel_positions_batch` | Get positions for multiple vessels at once (with optional time range) |
|
|
76
72
|
|
|
@@ -80,10 +76,10 @@ Add the JSON above to the config file for your client:
|
|
|
80
76
|
|---|---|
|
|
81
77
|
| `search_ports` | Search ports by name, country, type, size, region, harbor size, or harbor use |
|
|
82
78
|
| `get_port` | Get port details by UN/LOCODE |
|
|
83
|
-
| `get_port_inbound` | Get vessels
|
|
84
|
-
| `get_port_events` | Get arrivals/departures for a port |
|
|
85
|
-
| `get_port_events_by_vessel` | Get port events for a vessel |
|
|
86
|
-
| `list_port_events` | List port events
|
|
79
|
+
| `get_port_inbound` | Get vessels reporting a port as their destination, within an ETA window |
|
|
80
|
+
| `get_port_events` | Get arrivals/departures for a port (last 2 hours unless `timeFrom` is given) |
|
|
81
|
+
| `get_port_events_by_vessel` | Get port events for a vessel (last 2 hours unless `timeFrom` is given) |
|
|
82
|
+
| `list_port_events` | List port events across all covered ports, with filters for time, country, port, vessel, or event type |
|
|
87
83
|
| `search_port_events_by_port` | Search port events by port name |
|
|
88
84
|
| `search_port_events_by_vessel` | Search port events by vessel name |
|
|
89
85
|
| `get_vessel_last_port_event` | Get the most recent port event for a vessel |
|
|
@@ -92,14 +88,14 @@ Add the JSON above to the config file for your client:
|
|
|
92
88
|
|
|
93
89
|
| Tool | Description |
|
|
94
90
|
|---|---|
|
|
95
|
-
| `list_emissions` | List
|
|
91
|
+
| `list_emissions` | List EU MRV emissions reports, with an optional reporting-year filter |
|
|
96
92
|
|
|
97
93
|
### Location Tools
|
|
98
94
|
|
|
99
95
|
| Tool | Description |
|
|
100
96
|
|---|---|
|
|
101
|
-
| `get_vessels_in_area` | Find vessels in a bounding box (
|
|
102
|
-
| `get_vessels_in_radius` | Find vessels within a radius of a point (
|
|
97
|
+
| `get_vessels_in_area` | Find vessels with an AIS position in a bounding box (default last 2 hours, at most 4 hours) |
|
|
98
|
+
| `get_vessels_in_radius` | Find vessels with an AIS position within a radius of a point (default last 2 hours, at most 4 hours) |
|
|
103
99
|
|
|
104
100
|
|
|
105
101
|
## Pagination
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
6
6
|
import { VesselClient } from "vesselapi";
|
|
7
7
|
|
|
8
8
|
// src/version.ts
|
|
9
|
-
var VERSION = "2.0.
|
|
9
|
+
var VERSION = "2.0.1";
|
|
10
10
|
|
|
11
11
|
// src/tools/location.ts
|
|
12
12
|
import { z } from "zod";
|
|
@@ -59,7 +59,7 @@ function handleToolError(error) {
|
|
|
59
59
|
function registerLocationTools(server2, client2) {
|
|
60
60
|
server2.tool(
|
|
61
61
|
"get_vessels_in_area",
|
|
62
|
-
"Find
|
|
62
|
+
"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.",
|
|
63
63
|
{
|
|
64
64
|
latMin: z.number().describe("Southern boundary latitude"),
|
|
65
65
|
latMax: z.number().describe("Northern boundary latitude"),
|
|
@@ -90,7 +90,7 @@ function registerLocationTools(server2, client2) {
|
|
|
90
90
|
);
|
|
91
91
|
server2.tool(
|
|
92
92
|
"get_vessels_in_radius",
|
|
93
|
-
"Find
|
|
93
|
+
"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.",
|
|
94
94
|
{
|
|
95
95
|
latitude: z.number().describe("Center latitude"),
|
|
96
96
|
longitude: z.number().describe("Center longitude"),
|
|
@@ -172,13 +172,13 @@ function registerPortTools(server2, client2) {
|
|
|
172
172
|
);
|
|
173
173
|
server2.tool(
|
|
174
174
|
"get_port_inbound",
|
|
175
|
-
"Get vessels
|
|
175
|
+
"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.",
|
|
176
176
|
{
|
|
177
177
|
unlocode: z2.string().describe("UN/LOCODE of the destination port (e.g. NLRTM for Rotterdam)"),
|
|
178
178
|
etaFrom: z2.string().optional().describe("Start of ETA arrival window (RFC3339). Omit to default to now."),
|
|
179
179
|
etaTo: z2.string().optional().describe("End of ETA arrival window (RFC3339). Omit to default to 72 hours ahead."),
|
|
180
|
-
timeFrom: z2.string().optional().describe("
|
|
181
|
-
timeTo: z2.string().optional().describe("
|
|
180
|
+
timeFrom: z2.string().optional().describe("Only use reports received after this time, RFC3339. Defaults to 24 hours ago."),
|
|
181
|
+
timeTo: z2.string().optional().describe("Only use reports received before this time, RFC3339. Defaults to now."),
|
|
182
182
|
limit: z2.number().int().min(1).max(50).optional().describe("Results per page, 1 to 50. Defaults to 20."),
|
|
183
183
|
nextToken: z2.string().optional().describe("Pagination token from previous response")
|
|
184
184
|
},
|
|
@@ -224,14 +224,14 @@ function registerPortTools(server2, client2) {
|
|
|
224
224
|
);
|
|
225
225
|
server2.tool(
|
|
226
226
|
"get_port_events_by_vessel",
|
|
227
|
-
"Get port events (arrivals/departures) for a specific vessel",
|
|
227
|
+
"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.",
|
|
228
228
|
{
|
|
229
229
|
vesselId: z2.string().describe("Vessel identifier (IMO number by default)"),
|
|
230
230
|
idType: z2.enum(["imo", "mmsi"]).optional().describe("Identifier type: imo (default) or mmsi"),
|
|
231
231
|
eventType: z2.enum(["arrival", "departure", "all"]).optional().describe("Filter by event type. Omit for both arrivals and departures"),
|
|
232
232
|
sortOrder: z2.enum(["asc", "desc"]).optional().describe("Sort order by timestamp"),
|
|
233
|
-
timeFrom: z2.string().optional().describe("Start time
|
|
234
|
-
timeTo: z2.string().optional().describe("End time
|
|
233
|
+
timeFrom: z2.string().optional().describe("Start of the time window, RFC3339. Without it the service returns only the last 2 hours."),
|
|
234
|
+
timeTo: z2.string().optional().describe("End of the time window, RFC3339. Defaults to now."),
|
|
235
235
|
limit: z2.number().int().min(1).max(50).optional().describe("Results per page, 1 to 50. Defaults to 20."),
|
|
236
236
|
nextToken: z2.string().optional().describe("Pagination token from previous response")
|
|
237
237
|
},
|
|
@@ -254,10 +254,10 @@ function registerPortTools(server2, client2) {
|
|
|
254
254
|
);
|
|
255
255
|
server2.tool(
|
|
256
256
|
"list_port_events",
|
|
257
|
-
"List port events (arrivals/departures)
|
|
257
|
+
"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.",
|
|
258
258
|
{
|
|
259
|
-
timeFrom: z2.string().optional().describe("Start time
|
|
260
|
-
timeTo: z2.string().optional().describe("End time
|
|
259
|
+
timeFrom: z2.string().optional().describe("Start of the time window, RFC3339. Without it the service returns only the last 2 hours."),
|
|
260
|
+
timeTo: z2.string().optional().describe("End of the time window, RFC3339. Defaults to now."),
|
|
261
261
|
country: z2.string().optional().describe("Filter by port country (case-insensitive)"),
|
|
262
262
|
unlocode: z2.string().optional().describe("Filter by port UN/LOCODE"),
|
|
263
263
|
eventType: z2.enum(["arrival", "departure", "all"]).optional().describe("Filter by event type. Omit for both arrivals and departures"),
|
|
@@ -355,7 +355,7 @@ function registerPortTools(server2, client2) {
|
|
|
355
355
|
);
|
|
356
356
|
server2.tool(
|
|
357
357
|
"list_emissions",
|
|
358
|
-
"List
|
|
358
|
+
"List EU MRV annual emissions reports (ships calling at EU and EEA ports), with an optional reporting-year filter",
|
|
359
359
|
{
|
|
360
360
|
period: z2.number().optional().describe("Reporting year filter (e.g. 2024)"),
|
|
361
361
|
limit: z2.number().int().min(1).max(50).optional().describe("Results per page, 1 to 50. Defaults to 20."),
|
|
@@ -438,7 +438,7 @@ function registerVesselTools(server2, client2) {
|
|
|
438
438
|
);
|
|
439
439
|
server2.tool(
|
|
440
440
|
"get_vessel_position",
|
|
441
|
-
"Get the
|
|
441
|
+
"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.",
|
|
442
442
|
{
|
|
443
443
|
vesselId: z3.string().describe("Vessel identifier (IMO number by default)"),
|
|
444
444
|
idType: z3.enum(["imo", "mmsi"]).optional().describe("Identifier type: imo (default) or mmsi"),
|
|
@@ -458,7 +458,7 @@ function registerVesselTools(server2, client2) {
|
|
|
458
458
|
);
|
|
459
459
|
server2.tool(
|
|
460
460
|
"get_vessel_eta",
|
|
461
|
-
"Get the
|
|
461
|
+
"Get the most recent ETA the vessel itself reported in its AIS voyage data. This is the declared ETA, not a prediction.",
|
|
462
462
|
{
|
|
463
463
|
vesselId: z3.string().describe("Vessel identifier (IMO number by default)"),
|
|
464
464
|
idType: z3.enum(["imo", "mmsi"]).optional().describe("Identifier type: imo (default) or mmsi")
|
|
@@ -476,7 +476,7 @@ function registerVesselTools(server2, client2) {
|
|
|
476
476
|
);
|
|
477
477
|
server2.tool(
|
|
478
478
|
"get_vessel_emissions",
|
|
479
|
-
"Get emissions
|
|
479
|
+
"Get EU MRV annual emissions reports for a vessel (CO2, fuel consumption). Only ships that report under EU MRV have data.",
|
|
480
480
|
{
|
|
481
481
|
vesselId: z3.string().describe("Vessel identifier (IMO number by default)"),
|
|
482
482
|
idType: z3.enum(["imo", "mmsi"]).optional().describe("Identifier type: imo (default) or mmsi"),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/version.ts","../src/tools/location.ts","../src/errors.ts","../src/tools/ports.ts","../src/tools/vessels.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { VesselClient } from \"vesselapi\";\n\nimport { VERSION } from \"./version.js\";\nimport { registerLocationTools } from \"./tools/location.js\";\nimport { registerPortTools } from \"./tools/ports.js\";\nimport { registerVesselTools } from \"./tools/vessels.js\";\n\n// Fail with a readable line rather than a stack trace. Without a key the client\n// throws while this module is still evaluating, so the transport never connects\n// and the calling application sees the process die mid-handshake with no reason.\nif (!process.env.VESSELAPI_API_KEY) {\n process.stderr.write(\n \"vesselapi-mcp: VESSELAPI_API_KEY is not set. Add it to the env block of your \" +\n \"MCP client configuration. Keys are issued at https://dashboard.vesselapi.com\\n\",\n );\n process.exit(1);\n}\n\nconst client = new VesselClient(undefined, { userAgent: `vesselapi-mcp/${VERSION}` });\n\nconst server = new McpServer({\n name: \"vesselapi\",\n version: VERSION,\n});\n\nregisterVesselTools(server, client);\nregisterPortTools(server, client);\nregisterLocationTools(server, client);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","// Version advertised by the McpServer handshake. package.json and server.json\n// carry their own copies and are NOT derived from this — keep all three in step\n// when bumping.\nexport const VERSION = \"2.0.0\";\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { VesselClient } from \"vesselapi\";\nimport { z } from \"zod\";\nimport { formatResult, handleToolError } from \"../errors.js\";\n\nexport function registerLocationTools(server: McpServer, client: VesselClient): void {\n server.tool(\n \"get_vessels_in_area\",\n \"Find all vessels within a rectangular bounding box (latitude/longitude)\",\n {\n latMin: z.number().describe(\"Southern boundary latitude\"),\n latMax: z.number().describe(\"Northern boundary latitude\"),\n lonMin: z.number().describe(\"Western boundary longitude\"),\n lonMax: z.number().describe(\"Eastern boundary longitude\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Defaults to 2 hours ago. The window may not exceed 4 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now. The window may not exceed 4 hours.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.location.vesselsBoundingBox({\n latMin: params.latMin,\n latMax: params.latMax,\n lonMin: params.lonMin,\n lonMax: params.lonMax,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessels_in_radius\",\n \"Find all vessels within a radius of a point. The radius is in METRES, not nautical miles or kilometres.\",\n {\n latitude: z.number().describe(\"Center latitude\"),\n longitude: z.number().describe(\"Center longitude\"),\n radius: z.number().describe(\"Search radius in METRES, maximum 100000 (100 km). One nautical mile is 1852 metres.\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Defaults to 2 hours ago. The window may not exceed 4 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now. The window may not exceed 4 hours.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.location.vesselsRadius({\n latitude: params.latitude,\n longitude: params.longitude,\n radius: params.radius,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n}\n","import {\n VesselAPIError,\n VesselAuthError,\n VesselForbiddenError,\n VesselNotFoundError,\n VesselPaymentRequiredError,\n VesselRateLimitError,\n VesselServerError,\n} from \"vesselapi\";\n\nexport function formatResult(data: unknown): { content: { type: \"text\"; text: string }[] } {\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n}\n\n/**\n * Turn an SDK error into something a model can act on.\n *\n * The distinction that matters to a caller is whether retrying can ever help.\n * A 4xx is the request's fault and will fail identically until the caller\n * changes something, so each one says what to change. Only 429 and 5xx are\n * worth trying again. Where the API supplies a machine-readable `code` it is\n * included, since the prose message is free-form and may be reworded.\n */\nexport function handleToolError(error: unknown): { isError: true; content: { type: \"text\"; text: string }[] } {\n let message: string;\n\n if (error instanceof VesselAuthError) {\n message = \"Authentication failed. Check your VESSELAPI_API_KEY. Do not retry.\";\n } else if (error instanceof VesselPaymentRequiredError) {\n message =\n \"Out of satellite credits, and no stored position was available to fall back on. \" +\n \"Retry without the satellite option to use stored data, or top up the balance at \" +\n \"https://dashboard.vesselapi.com. Retrying the same request will not help.\";\n } else if (error instanceof VesselForbiddenError) {\n message =\n error.code === \"feature_not_available\"\n ? \"This endpoint is not included in the current plan. Do not retry; a different plan is required.\"\n : \"The API key is suspended, usually for sustained quota abuse. Do not retry; \" +\n \"check the account at https://dashboard.vesselapi.com.\";\n } else if (error instanceof VesselNotFoundError) {\n message = `Resource not found. Verify the ID or parameters. ${error.message}`;\n } else if (error instanceof VesselRateLimitError) {\n message = \"Rate limit exceeded. Retrying later may succeed; reduce request frequency.\";\n } else if (error instanceof VesselServerError) {\n message = `Server error, retrying later may succeed: ${error.message}`;\n } else if (error instanceof VesselAPIError) {\n // Remaining 4xx: the request itself is wrong. Name the code so the model can\n // tell an unparseable time range from an out-of-range coordinate.\n const code = error.code ? ` (code: ${error.code})` : \"\";\n const retry = error.statusCode >= 400 && error.statusCode < 500 ? \" Do not retry without changing the request.\" : \"\";\n message = `Request rejected${code}: ${error.message}.${retry}`;\n } else if (error instanceof Error) {\n message = error.message;\n } else {\n message = String(error);\n }\n\n return {\n isError: true,\n content: [{ type: \"text\", text: message }],\n };\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { VesselClient } from \"vesselapi\";\nimport { z } from \"zod\";\nimport { formatResult, handleToolError } from \"../errors.js\";\n\nexport function registerPortTools(server: McpServer, client: VesselClient): void {\n server.tool(\n \"search_ports\",\n \"Search for ports by name, country, type, size, region, harbor size, or harbor use\",\n {\n name: z.string().optional().describe(\"Port name (partial match)\"),\n country: z.string().optional().describe(\"Country (ISO code)\"),\n portType: z.string().optional().describe(\"Port type classification\"),\n size: z.string().optional().describe(\"Port size classification\"),\n region: z.string().optional().describe(\"Geographic region (partial match)\"),\n harborSize: z.string().optional().describe(\"Harbor size classification\"),\n harborUse: z.string().optional().describe(\"Primary harbor use\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.search.ports({\n filterName: params.name,\n filterCountry: params.country,\n filterPortType: params.portType,\n filterSize: params.size,\n filterRegion: params.region,\n filterHarborSize: params.harborSize,\n filterHarborUse: params.harborUse,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_port\",\n \"Get detailed information about a specific port by UN/LOCODE\",\n {\n unlocode: z.string().describe(\"UN/LOCODE of the port (e.g. NLRTM for Rotterdam)\"),\n },\n async (params) => {\n try {\n const data = await client.ports.get(params.unlocode);\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_port_inbound\",\n \"Get vessels heading to a specific port within an ETA arrival window\",\n {\n unlocode: z.string().describe(\"UN/LOCODE of the destination port (e.g. NLRTM for Rotterdam)\"),\n etaFrom: z.string().optional().describe(\"Start of ETA arrival window (RFC3339). Omit to default to now.\"),\n etaTo: z.string().optional().describe(\"End of ETA arrival window (RFC3339). Omit to default to 72 hours ahead.\"),\n timeFrom: z.string().optional().describe(\"AIS position time range start (RFC3339 format)\"),\n timeTo: z.string().optional().describe(\"AIS position time range end (RFC3339 format)\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.ports.inbound(params.unlocode, {\n filterEtaFrom: params.etaFrom,\n filterEtaTo: params.etaTo,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_port_events\",\n \"Get port events (arrivals/departures) for a specific port. Covers only the last 2 hours unless timeFrom is given.\",\n {\n unlocode: z.string().describe(\"UN/LOCODE of the port\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Without it the service returns only the last 2 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.byPort(params.unlocode, {\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_port_events_by_vessel\",\n \"Get port events (arrivals/departures) for a specific vessel\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n eventType: z.enum([\"arrival\", \"departure\", \"all\"]).optional().describe(\"Filter by event type. Omit for both arrivals and departures\"),\n sortOrder: z.enum([\"asc\", \"desc\"]).optional().describe(\"Sort order by timestamp\"),\n timeFrom: z.string().optional().describe(\"Start time (ISO 8601 format)\"),\n timeTo: z.string().optional().describe(\"End time (ISO 8601 format)\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.byVessel(params.vesselId, {\n filterIdType: params.idType,\n filterEventType: params.eventType,\n filterSortOrder: params.sortOrder,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"list_port_events\",\n \"List port events (arrivals/departures) globally with optional filters for time, country, port, vessel, or event type\",\n {\n timeFrom: z.string().optional().describe(\"Start time (RFC3339 format)\"),\n timeTo: z.string().optional().describe(\"End time (RFC3339 format)\"),\n country: z.string().optional().describe(\"Filter by port country (case-insensitive)\"),\n unlocode: z.string().optional().describe(\"Filter by port UN/LOCODE\"),\n eventType: z.enum([\"arrival\", \"departure\", \"all\"]).optional().describe(\"Filter by event type. Omit for both arrivals and departures\"),\n vesselName: z.string().optional().describe(\"Filter by vessel name (full-text search)\"),\n portName: z.string().optional().describe(\"Filter by port name (full-text search)\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.list({\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n filterCountry: params.country,\n filterUnlocode: params.unlocode,\n filterEventType: params.eventType,\n filterVesselName: params.vesselName,\n filterPortName: params.portName,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"search_port_events_by_port\",\n \"Search port events by port name. Covers only the last 2 hours unless timeFrom is given.\",\n {\n portName: z.string().describe(\"Port name to search for\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Without it the service returns only the last 2 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.byPorts({\n filterPortName: params.portName,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"search_port_events_by_vessel\",\n \"Search port events by vessel name. Covers only the last 2 hours unless timeFrom is given.\",\n {\n vesselName: z.string().describe(\"Vessel name to search for\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Without it the service returns only the last 2 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.byVessels({\n filterVesselName: params.vesselName,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_last_port_event\",\n \"Get the most recent port event (arrival or departure) for a vessel\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.lastByVessel(params.vesselId, {\n filterIdType: params.idType,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"list_emissions\",\n \"List global vessel emissions data with optional year filter\",\n {\n period: z.number().optional().describe(\"Reporting year filter (e.g. 2024)\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.emissions.list({\n filterPeriod: params.period,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { VesselClient } from \"vesselapi\";\nimport { z } from \"zod\";\nimport { formatResult, handleToolError } from \"../errors.js\";\n\nexport function registerVesselTools(server: McpServer, client: VesselClient): void {\n server.tool(\n \"search_vessels\",\n \"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.\",\n {\n q: z.string().optional().describe(\"Free-text search across name, IMO, MMSI, ENI and callsign. Use this when the type of identifier is unknown.\"),\n name: z.string().optional().describe(\"Vessel name (partial match)\"),\n imo: z.string().optional().describe(\"IMO number\"),\n mmsi: z.string().optional().describe(\"MMSI number\"),\n eni: z.string().optional().describe(\"ENI number, used for inland waterway vessels\"),\n flag: z.string().optional().describe(\"Flag state (ISO country code)\"),\n vesselType: z.string().optional().describe(\"Vessel type\"),\n callsign: z.string().optional().describe(\"Radio callsign\"),\n yearBuiltMin: z.number().optional().describe(\"Minimum year built\"),\n yearBuiltMax: z.number().optional().describe(\"Maximum year built\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.search.vessels({\n q: params.q,\n filterEni: params.eni,\n filterName: params.name,\n filterImo: params.imo,\n filterMmsi: params.mmsi,\n filterFlag: params.flag,\n filterVesselType: params.vesselType,\n filterCallsign: params.callsign,\n filterYearBuiltMin: params.yearBuiltMin,\n filterYearBuiltMax: params.yearBuiltMax,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel\",\n \"Get detailed information about a specific vessel\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.get(params.vesselId, {\n filterIdType: params.idType,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_position\",\n \"Get the current position of a vessel (latitude, longitude, speed, heading)\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n sat: z.boolean().optional().describe(\"Fall back to a satellite position when no recent terrestrial one exists. Charged per call against a prepaid balance, so use it only when a stored position is genuinely insufficient.\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.position(params.vesselId, {\n filterSat: params.sat,\n filterIdType: params.idType,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_eta\",\n \"Get the estimated time of arrival for a vessel\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.eta(params.vesselId, {\n filterIdType: params.idType,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_emissions\",\n \"Get emissions data for a vessel (CO2, fuel consumption)\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.emissions(params.vesselId, {\n filterIdType: params.idType,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_casualties\",\n \"Get marine casualty records for a vessel\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.casualties(params.vesselId, {\n filterIdType: params.idType,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_positions_batch\",\n \"Get positions for multiple vessels at once by MMSI or IMO numbers\",\n {\n ids: z.string().describe(\"Comma-separated list of MMSI or IMO numbers\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n timeFrom: z.string().optional().describe(\"Start time filter in RFC3339 format (defaults to 2 hours ago)\"),\n timeTo: z.string().optional().describe(\"End time filter in RFC3339 format (defaults to current time)\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.positions({\n filterIds: params.ids,\n filterIdType: params.idType,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n}\n"],"mappings":"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","names":["server","client","z","server","client","z","z","server","client","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/version.ts","../src/tools/location.ts","../src/errors.ts","../src/tools/ports.ts","../src/tools/vessels.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { VesselClient } from \"vesselapi\";\n\nimport { VERSION } from \"./version.js\";\nimport { registerLocationTools } from \"./tools/location.js\";\nimport { registerPortTools } from \"./tools/ports.js\";\nimport { registerVesselTools } from \"./tools/vessels.js\";\n\n// Fail with a readable line rather than a stack trace. Without a key the client\n// throws while this module is still evaluating, so the transport never connects\n// and the calling application sees the process die mid-handshake with no reason.\nif (!process.env.VESSELAPI_API_KEY) {\n process.stderr.write(\n \"vesselapi-mcp: VESSELAPI_API_KEY is not set. Add it to the env block of your \" +\n \"MCP client configuration. Keys are issued at https://dashboard.vesselapi.com\\n\",\n );\n process.exit(1);\n}\n\nconst client = new VesselClient(undefined, { userAgent: `vesselapi-mcp/${VERSION}` });\n\nconst server = new McpServer({\n name: \"vesselapi\",\n version: VERSION,\n});\n\nregisterVesselTools(server, client);\nregisterPortTools(server, client);\nregisterLocationTools(server, client);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","// Version advertised by the McpServer handshake. package.json and server.json\n// carry their own copies and are NOT derived from this — keep all three in step\n// when bumping.\nexport const VERSION = \"2.0.1\";\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { VesselClient } from \"vesselapi\";\nimport { z } from \"zod\";\nimport { formatResult, handleToolError } from \"../errors.js\";\n\nexport function registerLocationTools(server: McpServer, client: VesselClient): void {\n server.tool(\n \"get_vessels_in_area\",\n \"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.\",\n {\n latMin: z.number().describe(\"Southern boundary latitude\"),\n latMax: z.number().describe(\"Northern boundary latitude\"),\n lonMin: z.number().describe(\"Western boundary longitude\"),\n lonMax: z.number().describe(\"Eastern boundary longitude\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Defaults to 2 hours ago. The window may not exceed 4 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now. The window may not exceed 4 hours.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.location.vesselsBoundingBox({\n latMin: params.latMin,\n latMax: params.latMax,\n lonMin: params.lonMin,\n lonMax: params.lonMax,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessels_in_radius\",\n \"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.\",\n {\n latitude: z.number().describe(\"Center latitude\"),\n longitude: z.number().describe(\"Center longitude\"),\n radius: z.number().describe(\"Search radius in METRES, maximum 100000 (100 km). One nautical mile is 1852 metres.\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Defaults to 2 hours ago. The window may not exceed 4 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now. The window may not exceed 4 hours.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.location.vesselsRadius({\n latitude: params.latitude,\n longitude: params.longitude,\n radius: params.radius,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n}\n","import {\n VesselAPIError,\n VesselAuthError,\n VesselForbiddenError,\n VesselNotFoundError,\n VesselPaymentRequiredError,\n VesselRateLimitError,\n VesselServerError,\n} from \"vesselapi\";\n\nexport function formatResult(data: unknown): { content: { type: \"text\"; text: string }[] } {\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n}\n\n/**\n * Turn an SDK error into something a model can act on.\n *\n * The distinction that matters to a caller is whether retrying can ever help.\n * A 4xx is the request's fault and will fail identically until the caller\n * changes something, so each one says what to change. Only 429 and 5xx are\n * worth trying again. Where the API supplies a machine-readable `code` it is\n * included, since the prose message is free-form and may be reworded.\n */\nexport function handleToolError(error: unknown): { isError: true; content: { type: \"text\"; text: string }[] } {\n let message: string;\n\n if (error instanceof VesselAuthError) {\n message = \"Authentication failed. Check your VESSELAPI_API_KEY. Do not retry.\";\n } else if (error instanceof VesselPaymentRequiredError) {\n message =\n \"Out of satellite credits, and no stored position was available to fall back on. \" +\n \"Retry without the satellite option to use stored data, or top up the balance at \" +\n \"https://dashboard.vesselapi.com. Retrying the same request will not help.\";\n } else if (error instanceof VesselForbiddenError) {\n message =\n error.code === \"feature_not_available\"\n ? \"This endpoint is not included in the current plan. Do not retry; a different plan is required.\"\n : \"The API key is suspended, usually for sustained quota abuse. Do not retry; \" +\n \"check the account at https://dashboard.vesselapi.com.\";\n } else if (error instanceof VesselNotFoundError) {\n message = `Resource not found. Verify the ID or parameters. ${error.message}`;\n } else if (error instanceof VesselRateLimitError) {\n message = \"Rate limit exceeded. Retrying later may succeed; reduce request frequency.\";\n } else if (error instanceof VesselServerError) {\n message = `Server error, retrying later may succeed: ${error.message}`;\n } else if (error instanceof VesselAPIError) {\n // Remaining 4xx: the request itself is wrong. Name the code so the model can\n // tell an unparseable time range from an out-of-range coordinate.\n const code = error.code ? ` (code: ${error.code})` : \"\";\n const retry = error.statusCode >= 400 && error.statusCode < 500 ? \" Do not retry without changing the request.\" : \"\";\n message = `Request rejected${code}: ${error.message}.${retry}`;\n } else if (error instanceof Error) {\n message = error.message;\n } else {\n message = String(error);\n }\n\n return {\n isError: true,\n content: [{ type: \"text\", text: message }],\n };\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { VesselClient } from \"vesselapi\";\nimport { z } from \"zod\";\nimport { formatResult, handleToolError } from \"../errors.js\";\n\nexport function registerPortTools(server: McpServer, client: VesselClient): void {\n server.tool(\n \"search_ports\",\n \"Search for ports by name, country, type, size, region, harbor size, or harbor use\",\n {\n name: z.string().optional().describe(\"Port name (partial match)\"),\n country: z.string().optional().describe(\"Country (ISO code)\"),\n portType: z.string().optional().describe(\"Port type classification\"),\n size: z.string().optional().describe(\"Port size classification\"),\n region: z.string().optional().describe(\"Geographic region (partial match)\"),\n harborSize: z.string().optional().describe(\"Harbor size classification\"),\n harborUse: z.string().optional().describe(\"Primary harbor use\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.search.ports({\n filterName: params.name,\n filterCountry: params.country,\n filterPortType: params.portType,\n filterSize: params.size,\n filterRegion: params.region,\n filterHarborSize: params.harborSize,\n filterHarborUse: params.harborUse,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_port\",\n \"Get detailed information about a specific port by UN/LOCODE\",\n {\n unlocode: z.string().describe(\"UN/LOCODE of the port (e.g. NLRTM for Rotterdam)\"),\n },\n async (params) => {\n try {\n const data = await client.ports.get(params.unlocode);\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_port_inbound\",\n \"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.\",\n {\n unlocode: z.string().describe(\"UN/LOCODE of the destination port (e.g. NLRTM for Rotterdam)\"),\n etaFrom: z.string().optional().describe(\"Start of ETA arrival window (RFC3339). Omit to default to now.\"),\n etaTo: z.string().optional().describe(\"End of ETA arrival window (RFC3339). Omit to default to 72 hours ahead.\"),\n timeFrom: z.string().optional().describe(\"Only use reports received after this time, RFC3339. Defaults to 24 hours ago.\"),\n timeTo: z.string().optional().describe(\"Only use reports received before this time, RFC3339. Defaults to now.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.ports.inbound(params.unlocode, {\n filterEtaFrom: params.etaFrom,\n filterEtaTo: params.etaTo,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_port_events\",\n \"Get port events (arrivals/departures) for a specific port. Covers only the last 2 hours unless timeFrom is given.\",\n {\n unlocode: z.string().describe(\"UN/LOCODE of the port\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Without it the service returns only the last 2 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.byPort(params.unlocode, {\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_port_events_by_vessel\",\n \"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.\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n eventType: z.enum([\"arrival\", \"departure\", \"all\"]).optional().describe(\"Filter by event type. Omit for both arrivals and departures\"),\n sortOrder: z.enum([\"asc\", \"desc\"]).optional().describe(\"Sort order by timestamp\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Without it the service returns only the last 2 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.byVessel(params.vesselId, {\n filterIdType: params.idType,\n filterEventType: params.eventType,\n filterSortOrder: params.sortOrder,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"list_port_events\",\n \"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.\",\n {\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Without it the service returns only the last 2 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now.\"),\n country: z.string().optional().describe(\"Filter by port country (case-insensitive)\"),\n unlocode: z.string().optional().describe(\"Filter by port UN/LOCODE\"),\n eventType: z.enum([\"arrival\", \"departure\", \"all\"]).optional().describe(\"Filter by event type. Omit for both arrivals and departures\"),\n vesselName: z.string().optional().describe(\"Filter by vessel name (full-text search)\"),\n portName: z.string().optional().describe(\"Filter by port name (full-text search)\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.list({\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n filterCountry: params.country,\n filterUnlocode: params.unlocode,\n filterEventType: params.eventType,\n filterVesselName: params.vesselName,\n filterPortName: params.portName,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"search_port_events_by_port\",\n \"Search port events by port name. Covers only the last 2 hours unless timeFrom is given.\",\n {\n portName: z.string().describe(\"Port name to search for\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Without it the service returns only the last 2 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.byPorts({\n filterPortName: params.portName,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"search_port_events_by_vessel\",\n \"Search port events by vessel name. Covers only the last 2 hours unless timeFrom is given.\",\n {\n vesselName: z.string().describe(\"Vessel name to search for\"),\n timeFrom: z.string().optional().describe(\"Start of the time window, RFC3339. Without it the service returns only the last 2 hours.\"),\n timeTo: z.string().optional().describe(\"End of the time window, RFC3339. Defaults to now.\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.byVessels({\n filterVesselName: params.vesselName,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_last_port_event\",\n \"Get the most recent port event (arrival or departure) for a vessel\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n },\n async (params) => {\n try {\n const data = await client.portEvents.lastByVessel(params.vesselId, {\n filterIdType: params.idType,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"list_emissions\",\n \"List EU MRV annual emissions reports (ships calling at EU and EEA ports), with an optional reporting-year filter\",\n {\n period: z.number().optional().describe(\"Reporting year filter (e.g. 2024)\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.emissions.list({\n filterPeriod: params.period,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { VesselClient } from \"vesselapi\";\nimport { z } from \"zod\";\nimport { formatResult, handleToolError } from \"../errors.js\";\n\nexport function registerVesselTools(server: McpServer, client: VesselClient): void {\n server.tool(\n \"search_vessels\",\n \"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.\",\n {\n q: z.string().optional().describe(\"Free-text search across name, IMO, MMSI, ENI and callsign. Use this when the type of identifier is unknown.\"),\n name: z.string().optional().describe(\"Vessel name (partial match)\"),\n imo: z.string().optional().describe(\"IMO number\"),\n mmsi: z.string().optional().describe(\"MMSI number\"),\n eni: z.string().optional().describe(\"ENI number, used for inland waterway vessels\"),\n flag: z.string().optional().describe(\"Flag state (ISO country code)\"),\n vesselType: z.string().optional().describe(\"Vessel type\"),\n callsign: z.string().optional().describe(\"Radio callsign\"),\n yearBuiltMin: z.number().optional().describe(\"Minimum year built\"),\n yearBuiltMax: z.number().optional().describe(\"Maximum year built\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.search.vessels({\n q: params.q,\n filterEni: params.eni,\n filterName: params.name,\n filterImo: params.imo,\n filterMmsi: params.mmsi,\n filterFlag: params.flag,\n filterVesselType: params.vesselType,\n filterCallsign: params.callsign,\n filterYearBuiltMin: params.yearBuiltMin,\n filterYearBuiltMax: params.yearBuiltMax,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel\",\n \"Get detailed information about a specific vessel\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.get(params.vesselId, {\n filterIdType: params.idType,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_position\",\n \"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.\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n sat: z.boolean().optional().describe(\"Fall back to a satellite position when no recent terrestrial one exists. Charged per call against a prepaid balance, so use it only when a stored position is genuinely insufficient.\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.position(params.vesselId, {\n filterSat: params.sat,\n filterIdType: params.idType,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_eta\",\n \"Get the most recent ETA the vessel itself reported in its AIS voyage data. This is the declared ETA, not a prediction.\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.eta(params.vesselId, {\n filterIdType: params.idType,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_emissions\",\n \"Get EU MRV annual emissions reports for a vessel (CO2, fuel consumption). Only ships that report under EU MRV have data.\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.emissions(params.vesselId, {\n filterIdType: params.idType,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_casualties\",\n \"Get marine casualty records for a vessel\",\n {\n vesselId: z.string().describe(\"Vessel identifier (IMO number by default)\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.casualties(params.vesselId, {\n filterIdType: params.idType,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n\n server.tool(\n \"get_vessel_positions_batch\",\n \"Get positions for multiple vessels at once by MMSI or IMO numbers\",\n {\n ids: z.string().describe(\"Comma-separated list of MMSI or IMO numbers\"),\n idType: z.enum([\"imo\", \"mmsi\"]).optional().describe(\"Identifier type: imo (default) or mmsi\"),\n timeFrom: z.string().optional().describe(\"Start time filter in RFC3339 format (defaults to 2 hours ago)\"),\n timeTo: z.string().optional().describe(\"End time filter in RFC3339 format (defaults to current time)\"),\n limit: z.number().int().min(1).max(50).optional().describe(\"Results per page, 1 to 50. Defaults to 20.\"),\n nextToken: z.string().optional().describe(\"Pagination token from previous response\"),\n },\n async (params) => {\n try {\n const data = await client.vessels.positions({\n filterIds: params.ids,\n filterIdType: params.idType,\n timeFrom: params.timeFrom,\n timeTo: params.timeTo,\n paginationLimit: params.limit,\n paginationNextToken: params.nextToken,\n });\n return formatResult(data);\n } catch (error) {\n return handleToolError(error);\n }\n },\n );\n}\n"],"mappings":"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","names":["server","client","z","server","client","z","z","server","client","z"]}
|
package/package.json
CHANGED