@pipeworx/global-fishing-watch
Connect: https://pipeworx.io/mcp — every tool in the catalog, including @pipeworx/global-fishing-watch’s. Install: one-click buttons
Connect to just the @pipeworx/global-fishing-watch pack
https://gateway.pipeworx.io/global-fishing-watch/mcp — only @pipeworx/global-fishing-watch’s own tools, nothing else in the catalog.
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 3
Global Fishing Watch API v3 — AIS-derived vessel identity, at-sea events (apparent fishing, encounters, loitering, port visits, AIS gaps) and aggregated apparent fishing effort.
Tools
gfwfish_vessels_search(query, datasets?, limit?, offset?, _apiKey)— vessel identity by name, MMSI, IMO or call sign.gfwfish_events(start_date, end_date, vessel_id?, event_type?, limit?, offset?, _apiKey)— events over a date range.gfwfish_4wings_report(bbox, start_date, end_date, group_by?, temporal_resolution?, spatial_resolution?, datasets?, _apiKey)— apparent fishing effort aggregated over a bounding box.
Auth
Platform-backed since 2026-09-18. PLATFORM_GFW_FISHING_TOKEN is in the
encrypted keystore (GFW API application “pipeworx”, non-commercial intended
use); the gateway injects it as _apiKey, and a caller may pass their own
instead. Every v3 endpoint requires a Bearer token — there is no keyless or
demo path. Free non-commercial tokens:
https://globalfishingwatch.org/our-apis/tokens.
Distinct from PLATFORM_GFW_KEY, which is Global Forest Watch — different
organisation, different API, similar abbreviation.
licence: non-commercial is set on the pack: GFW data is free for
non-commercial use and commercial use needs their permission.
Data sources
- https://gateway.api.globalfishingwatch.org/v3/vessels/search
- https://gateway.api.globalfishingwatch.org/v3/events
- https://gateway.api.globalfishingwatch.org/v3/4wings/report (POST; the region geometry goes in the body, the resolution/grouping in the query string)
A 401 from this API proves nothing about the path. An unauthenticated
request to any path — including one that does not exist, verified against
/v3/zzz-not-a-path on 2026-09-17 — answers 401 {"error":"invalid token"}.
That is why the shapes shipped on 2026-09-17 were unverifiable, and why the
first probe on a real token returned a 422.
The two paging schemes are different, and mixing them is the 422.
/v3/vessels/search pages by CURSOR: the response carries since, you pass it
back as since, and sending offset is rejected 422 Unprocessable Entity.
/v3/events pages the ordinary way — offset and limit are both required,
and the response carries nextOffset. Do not unify them.
Other shape facts, each from the v3 docs and then proved live (fleet #2245):
- Multi-value parameters use indexed square brackets:
datasets[0]=...,vessels[0]=...,filters[0]=.... /v3/vessels/searchneeds at least 3 characters inquery;limitmaxes at 50. Asincecursor carries its own page size — passsincewith a smallerlimitand you still get the original page’s worth back, so do not readreturnedas proof the limit was honoured (measured live: limit 2 plus a cursor from a limit-5 call returned 5).- Every repeated parameter on this endpoint takes INDEXED brackets:
datasets[0],includes[0]. The bareincludes[]form is a 422. Identity is nested under two parallel arrays —selfReportedInfo(what the vessel broadcast) andregistryInfo(what a registry holds) — which can disagree. The pack lifts the common fields and keeps both arrays. /v3/eventstakesstart-date/end-dateon GET (hyphenated) butstartDate/endDatein a POST body (camelCase). This pack uses GET./v3/4wings/reportis a POST: the grid parameters go in the query string (spatial-resolution,temporal-resolution,group-by,date-rangeasYYYY-MM-DD,YYYY-MM-DD,format=JSON) and the AREA goes in the body — either a named region,{"region":{"dataset":"public-eez-areas","id":8371}}, or a custom polygon under a top-level"geojson"key.temporal-resolutionis one of HOURLY, DAILY, MONTHLY, YEARLY, ENTIRE. Itsentriesare arrays of grouped rows rather than rows, so the pack flattens them.
Tools
- gfwfish_vessels_search — Search the Global Fishing Watch vessel identity database by name, MMSI, IMO or call sign. Returns each matching vessel with its GFW vessel id (pass it to gfwfish_events), flag state, gear type, regist
- gfwfish_events — Global Fishing Watch vessel events over a date range — apparent fishing, encounters between vessels at sea, loitering, port visits and AIS gaps (transmission switched off). Each event carries its posi
- gfwfish_4wings_report — Aggregate apparent fishing effort (hours) from Global Fishing Watch over a bounding box and date range, grouped by flag state, gear type or vessel. This is the AIS-derived fishing-pressure layer behin
Tools
gfwfish_4wings_report— Aggregate apparent fishing effort (hours) from Global Fishing Watch over a bounding box and date range, grouped by flag state, gear type or vessel. This is the AIS-derived fishing-pressure layer behingfwfish_events— Global Fishing Watch vessel events over a date range — apparent fishing, encounters between vessels at sea, loitering, port visits and AIS gaps (transmission switched off). Each event carries its posigfwfish_vessels_search— Search the Global Fishing Watch vessel identity database by name, MMSI, IMO or call sign. Returns each matching vessel with its GFW vessel id (pass it to gfwfish_events), flag state, gear type, regist