@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

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/search needs at least 3 characters in query; limit maxes at 50. A since cursor carries its own page size — pass since with a smaller limit and you still get the original page’s worth back, so do not read returned as 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 bare includes[] form is a 422. Identity is nested under two parallel arrays — selfReportedInfo (what the vessel broadcast) and registryInfo (what a registry holds) — which can disagree. The pack lifts the common fields and keeps both arrays.
  • /v3/events takes start-date / end-date on GET (hyphenated) but startDate / endDate in a POST body (camelCase). This pack uses GET.
  • /v3/4wings/report is a POST: the grid parameters go in the query string (spatial-resolution, temporal-resolution, group-by, date-range as YYYY-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-resolution is one of HOURLY, DAILY, MONTHLY, YEARLY, ENTIRE. Its entries are 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 behin
  • 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_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

Regenerated from source · build October 27, 2026