Skip to main content
Glama
Chuk MCP Maritime Archives

Chuk MCP Maritime Archives

by IBM

Chuk MCP Maritime Archives

Historical Maritime Archives MCP Server -- A comprehensive Model Context Protocol (MCP) server for querying historical maritime shipping records, vessel specifications, crew muster rolls, cargo manifests, shipwreck databases, historical place names, and sailing routes spanning 1497-1874. Covers Dutch (VOC), English (EIC), Portuguese (Carreira da India), Spanish (Manila Galleon), and Swedish (SOIC) maritime archives.

This is a demonstration project provided as-is for learning and testing purposes.

Python 3.11+

Features

This MCP server provides structured access to historical maritime archives and reference data through 47 tools across 11 archives and 6 nations.

All tools return fully-typed Pydantic v2 models for type safety, validation, and excellent IDE support. All tools support output_mode="text" for human-readable output alongside the default JSON.

1. Archive Discovery (maritime_list_archives, maritime_get_archive)

Browse 11 maritime archives across 6 nations:

  • Dutch Asiatic Shipping (DAS) -- 8,194 voyages (1595-1795)

  • VOC Opvarenden -- up to 774,200 crew records (1633-1794)

  • Boekhouder-Generaal Batavia -- 200 curated cargo records (1700-1795)

  • MAARER Wreck Database -- 734 wreck positions (1595-1795)

  • English East India Company (EIC) -- ~150 curated voyages, ~35 wrecks (1600-1874)

  • Portuguese Carreira da India -- ~500 voyages, ~100 wrecks (1497-1835)

  • Spanish Manila Galleon -- ~250 voyages, ~42 wrecks (1565-1815)

  • Swedish East India Company (SOIC) -- ~132 voyages, ~20 wrecks (1731-1813)

  • UK Hydrographic Office (UKHO) -- 94,000+ wrecks worldwide (1500-2024)

  • NOAA Wrecks & Obstructions (AWOIS) -- ~13,000 wrecks in US waters (1600-2024)

  • Dutch Ships and Sailors (DSS) -- GZMVOC musters + MDB crew (1691-1837)

Note: The EIC, Carreira, Galleon, and SOIC archives are curated datasets compiled from published academic sources. Carreira, Galleon, and SOIC include programmatically expanded records covering the full historical period. VOC Crew data requires running scripts/download_crew.py to download from the Nationaal Archief (774K records, ~80 MB). UKHO data requires running scripts/download_ukho.py to download from EMODnet (94K records). NOAA data requires running scripts/download_noaa.py to download from NOAA ArcGIS (13K records). Curated fallbacks of 50 representative wrecks ship with the repo via scripts/generate_ukho.py and scripts/generate_noaa.py. Cargo and EIC have download scripts (download_cargo.py, download_eic.py) for future expansion from external sources.

Search voyage records across all 5 voyage archives (DAS, EIC, Carreira, Galleon, SOIC):

  • Filter by ship name, captain, ports, date range, fate, archive

  • Multi-archive search: query all archives at once or filter by specific archive

  • Full voyage detail including incident narratives and vessel data

Search shipwreck and loss records across all 7 wreck archives (MAARER, EIC, Carreira, Galleon, SOIC, UKHO, NOAA):

  • Filter by region, cause, depth, cargo value, status, archive, flag, vessel type, GP quality

  • Multi-archive wreck search or single-archive filtering

  • UKHO adds 94,000+ global wrecks; NOAA adds ~13,000 US coastal wrecks with position quality codes

  • Position data with uncertainty estimates

  • Archaeological status and notes

Search VOC vessel records:

  • Filter by ship type, tonnage, chamber, shipyard

  • 6 ship types: retourschip, fluit, jacht, hooker, pinas, fregat

  • Construction and service history

5. Hull Profiles (maritime_get_hull_profile, maritime_list_hull_profiles)

Hydrodynamic hull data for drift modelling:

  • Dimensions, displacement, drag coefficients

  • Windage area and coefficients

  • Sinking characteristics and orientation weights

  • Reference wrecks and LLM guidance notes

Search crew records across multiple archives:

  • VOC Opvarenden (default): up to 774,200 records from Nationaal Archief (1633-1794)

  • DSS (MDB): 77,043 individual crew records from northern Dutch provinces (1803-1837)

  • Filter by name, rank, ship, origin, fate, archive

  • Personnel records: rank, pay, embarkation/service dates

  • Multi-archive dispatch: archive="voc_crew" or archive="dss"

  • Indexed lookups for fast search across large datasets

Search VOC cargo manifests (200 curated records, expandable via download scripts):

  • Filter by commodity, origin, destination, value

  • Full voyage manifests with quantities and values

  • Dutch and English commodity names

8. Position Assessment (maritime_assess_position)

Evaluate historical position quality:

  • Navigation era detection (4 technology periods)

  • 5 uncertainty levels from precise to regional

  • Recommendations for drift modelling and search planning

9. Location Gazetteer (maritime_lookup_location, maritime_list_locations)

Historical place-name resolution:

  • ~170 VOC-era place names with modern coordinates

  • Alias resolution (e.g., "Batavia" -> Jakarta, "Formosa" -> Taiwan)

  • Region classification matching wreck and route data

  • Filter by region, location type, or text search

10. Sailing Routes (maritime_list_routes, maritime_get_route, maritime_estimate_position)

Historical sailing routes with position estimation across 5 nations:

  • 18 routes: VOC (8), EIC (4), Carreira da India (2), Manila Galleon (2), SOIC (2)

  • Waypoints with coordinates, typical sailing days, stop durations

  • Hazards and seasonal navigation notes

  • Position estimation: interpolate a ship's likely position on any date

  • Speed profile enrichment: use_speed_profiles=True adds CLIWOC-derived speed statistics

11. Speed Profiles (maritime_get_speed_profile)

Historical sailing speed statistics derived from CLIWOC 2.1 daily positions:

  • 215 profiles across 6 routes (outward_outer, return, ceylon, coromandel, japan, malabar)

  • Mean, median, std dev, and percentile speeds (km/day) per route segment

  • Seasonal variation: filter by departure month for month-specific data

  • Generated from ~61K daily observations matched to standard routes

12. Ship Tracks (maritime_search_tracks, maritime_get_track, maritime_nearby_tracks)

Historical ship track data from CLIWOC 2.1 Full logbooks (1662-1855):

  • ~261K daily position observations from 8 European maritime nations

  • Search by nationality (NL, UK, ES, FR, SE, US, DE, DK), year range, and ship name

  • Geographic bounding box: filter tracks by lat_min/lat_max/lon_min/lon_max

  • Full position histories for individual voyages with ship names, company, and DAS numbers

  • Nearby ship search: find what other ships were near a position on a given date

  • Useful for wreck investigation context and route reconstruction

13. Cross-Archive Linking (maritime_get_voyage_full)

Unified voyage view with all linked records in a single call, across all archives:

  • Works with DAS, EIC, Carreira, Galleon, and SOIC voyages

  • Wreck record (linked via voyage_id, across all wreck archives)

  • Vessel record (linked via voyage_ids array, DAS voyages)

  • Hull profile (linked via ship_type)

  • CLIWOC track (linked via DAS number or ship name + nationality matching)

  • Replaces the need to call get_voyage, get_wreck, get_vessel, and get_hull_profile separately

14. Timeline (maritime_get_timeline)

Chronological event view combining all data sources for a voyage:

  • Assembles events from DAS voyages, route estimates, CLIWOC tracks, and wreck records

  • Event types: departure, waypoint estimates, CLIWOC positions, loss/wreck, arrival

  • Optional include_positions=True to sample CLIWOC daily positions into the timeline

  • GeoJSON LineString output from positioned events

15. Export & Statistics (maritime_export_geojson, maritime_get_statistics)

Export and analyse wreck data:

  • GeoJSON FeatureCollection export with optional uncertainty

  • Aggregate loss statistics by region, cause, decade

  • Artifact store integration for persistent export

Full-text search across all free-text narrative content:

  • Searches voyage particulars, wreck particulars, and loss_location across all 10 archives

  • Keyword and quoted phrase matching with AND logic

  • Filter by record type (voyage/wreck) and archive

  • Relevance-ranked results with text snippets and match context

  • Cursor-based pagination

17. Ship Musters (maritime_search_musters, maritime_get_muster, maritime_compare_wages)

GZMVOC ship-level muster records and wage comparison from the DSS Linked Data Cloud:

  • Search ship muster records from Asian waters (1691-1791)

  • Crew composition by rank, European/Asian crew counts, aggregate wages

  • Cross-link to DAS voyages via das_voyage_id

  • Compare wage distributions between time periods (GZMVOC or MDB data)

18. Track Analytics (maritime_compute_track_speeds, maritime_aggregate_track_speeds, maritime_compare_speed_groups, maritime_did_speed_test, maritime_track_tortuosity, maritime_aggregate_track_tortuosity, maritime_wind_rose, maritime_export_speeds, maritime_galleon_transit_times, maritime_wind_direction_by_year)

Server-side speed computation and statistical analysis on CLIWOC track data:

  • Per-voyage speeds: compute daily haversine-based speeds from consecutive logbook positions

  • Bulk aggregation: aggregate speeds across all matching tracks by decade, year, month, direction, or nationality

  • Statistical testing: Mann-Whitney U test comparing speed distributions between two time periods (no scipy needed)

  • Geographic bounding box filtering, speed bounds, direction filtering

  • Enables climate proxy analysis: detect wind trends, seasonal patterns, volcanic signals in historical ship speeds

  • Difference-in-differences: formal 2×2 DiD test (direction × period) with bootstrap confidence intervals

  • Route tortuosity: per-voyage and aggregate tortuosity (great-circle vs. actual distance) with optional period comparison

  • Wind rose: Beaufort wind force and wind direction distributions from CLIWOC logbooks

  • Speed export: raw speed samples for downstream statistical analysis (CSV-ready JSON)

  • Galleon transit times: compute transit durations for Manila Galleon voyages (1565–1815) by trade direction

  • Wind direction by year: year-by-year wind direction distributions for trend detection

19. Server Discovery (maritime_capabilities)

List full server capabilities for LLM workflow planning:

  • Available archives with metadata

  • All registered tools with descriptions

  • Ship types and geographic regions

Related MCP server: TDZ C64 Knowledge

Public MCP Server

A hosted instance is available at:

https://maritime-archives.chukai.io/mcp

Use this with any MCP client -- no installation required. All 47 tools and 774K crew records are available.

Installation

uvx chuk-mcp-maritime-archives
# Install from PyPI
uv pip install chuk-mcp-maritime-archives

# Or clone and install from source
git clone <repository-url>
cd chuk-mcp-maritime-archives
uv sync --dev

Using pip (Traditional)

pip install chuk-mcp-maritime-archives

Usage

With the Public Server

Point any MCP client at https://maritime-archives.chukai.io/mcp -- no local setup needed.

With Claude Desktop

Option 1: Run Locally with uvx

MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "maritime": {
      "command": "uvx",
      "args": ["chuk-mcp-maritime-archives"]
    }
  }
}

Option 2: Run Locally with pip

{
  "mcpServers": {
    "maritime": {
      "command": "chuk-mcp-maritime-archives"
    }
  }
}

Standalone

Run the server directly:

# With uvx (recommended -- always latest version)
uvx chuk-mcp-maritime-archives

# With uvx in HTTP mode
uvx chuk-mcp-maritime-archives --mode http

# Or if installed locally
chuk-mcp-maritime-archives
chuk-mcp-maritime-archives --mode http

Or with uv/Python:

# STDIO mode (default, for MCP clients)
uv run chuk-mcp-maritime-archives
# or: python -m chuk_mcp_maritime_archives.server

# HTTP mode (for web access)
uv run chuk-mcp-maritime-archives --mode http
# or: python -m chuk_mcp_maritime_archives.server --mode http

STDIO mode is for MCP clients like Claude Desktop and mcp-cli. HTTP mode runs a web server on http://localhost:8005 for HTTP-based MCP clients.

Example Prompts

Once configured with an MCP client, here are prompts organised by use case. Each prompt exercises one or more of the 47 tools and demonstrates a different capability of the server.

Exploration & Discovery

Start here. These require no domain knowledge and produce immediately compelling results.

"List the available maritime archives and tell me what each one covers."

→ maritime_list_archives · Overview of all 11 archives across 6 nations

"If I sailed from Texel on October 28, 1628, where would I be by Christmas?"

→ maritime_estimate_position · Position interpolation along historical routes

"Show me the full story of the Batavia — the voyage, the wreck, the vessel, and any crew records."

→ maritime_get_voyage_full · Cross-archive linking across DAS, MAARER, vessel registry, and CLIWOC tracks

"What other ships were sailing near the Batavia wreck site on June 4, 1629?"

→ maritime_nearby_tracks · Proximity search across 261K CLIWOC logbook positions

"Where are the coordinates for Batavia? What about the Cape of Good Hope?"

→ maritime_lookup_location · Historical place-name resolution with modern coordinates

"What route would a ship take from Texel to Batavia via the Roaring Forties?"

→ maritime_get_route · Full route with waypoints, hazards, and season notes

"Show me the timeline of the Batavia's final voyage — every event in chronological order."

→ maritime_get_timeline · Assembled from DAS voyages, route estimates, CLIWOC tracks, and wreck records

Wreck Investigation

These follow the pattern a maritime archaeologist would use: search → assess → export.

"Search for VOC wrecks near the Cape of Good Hope. How many are still unfound?"

→ maritime_search_wrecks · Region + status filtering across 7 wreck archives

"Find all wrecks with cargo worth over 1 million guilders."

→ maritime_search_wrecks · Cargo value filtering

"Get the wreck record for the Batavia, then assess the position quality."

→ maritime_get_wreck + maritime_assess_position · Position uncertainty with navigation-era detection

"Export all Cape wrecks as GeoJSON so I can plot them on a map."

→ maritime_export_geojson · GeoJSON FeatureCollection with uncertainty radii

"Get the hull profile for a retourschip — I need drag coefficients for drift modelling."

→ maritime_get_hull_profile · Hydrodynamic data for 6 ship types

"Show me loss statistics by decade across all archives. What were the deadliest decades?"

→ maritime_get_statistics · Aggregate losses by region, cause, and decade

"Search for UKHO wrecks flagged as Dutch in the Indian Ocean."

→ maritime_search_wrecks · UKHO 94K+ global wrecks with nationality filtering

"Find NOAA wrecks in the Gulf of Mexico with high position quality."

→ maritime_search_wrecks · NOAA AWOIS wrecks with GP quality codes

Multi-Nation Voyages

The server covers Dutch, English, Portuguese, Spanish, and Swedish maritime archives.

"Search for EIC voyages involving the Earl of Abergavenny."

→ maritime_search_voyages · English East India Company (~150 voyages)

"Find Portuguese Carreira voyages commanded by Vasco da Gama."

→ maritime_search_voyages · Portuguese Carreira da India (~500 voyages, 1497–1835)

"Show me Manila Galleon wrecks in the Pacific."

→ maritime_search_wrecks · Spanish Manila Galleon (~42 wrecks)

"Search for Swedish East India Company voyages of the Gotheborg."

→ maritime_search_voyages · SOIC (~132 voyages, 1731–1813)

"Compare Portuguese Carreira wrecks with VOC wrecks in the same regions — different loss causes?"

→ maritime_search_wrecks + maritime_get_statistics · Cross-archive comparison

Crew & Social History

774,000 VOC crew records enable prosopographical research at scale.

"What crew served on the Ridderschap van Holland?"

→ maritime_search_crew · Crew muster roll search

"Show me crew survival rates by rank across the full VOC period. Were officers more likely to survive?"

→ maritime_crew_survival_analysis · Mortality and desertion rates by dimension

"What were the most common ranks on VOC ships? How did the distribution change by decade?"

→ maritime_crew_demographics · Aggregate statistics across 774K records

"Reconstruct the career of any crew member named Pietersz from Amsterdam."

→ maritime_crew_career · Career tracing across multiple voyages with rank progression

"Compare crew wages between 1691–1740 and 1741–1791. Did wages keep up?"

→ maritime_compare_wages · GZMVOC muster wage comparison between time periods

Search across all free-text fields in all archives.

"Find all mentions of monsoon across all archives."

→ maritime_search_narratives · Full-text search across voyage and wreck particulars

"Which wrecks mention cannon in their descriptions?"

→ maritime_search_narratives · Keyword search with snippet extraction

"Search for narratives about storms near the Cape of Good Hope."

→ maritime_search_narratives · Phrase matching with relevance ranking

Climate Science & Speed Analytics

Ship speeds as wind proxies — original research capability using 261K CLIWOC logbook positions.

"Aggregate Dutch ship speeds in the Roaring Forties by decade from 1750 to 1860, eastbound only.
Then do the same for westbound. Are ships getting faster, and is the trend different by direction?"

→ maritime_aggregate_track_speeds · If eastbound increases faster than westbound, that's wind (strengthening westerlies), not technology. This is the core climate proxy signal.

"Compare ship speeds in the Roaring Forties between 1780–1782 (pre-Laki) and 1784–1786 (post-Laki).
Did the 1783 Laki eruption in Iceland measurably affect Southern Ocean wind patterns?"

→ maritime_compare_speed_groups · Mann-Whitney U test for volcanic signal detection. The Laki eruption injected massive SO₂ into the atmosphere — a speed dip in this window indicates weakened westerlies detectable in 240-year-old logbook data.

"Aggregate ship speeds in the Roaring Forties by month across all years. Which months have the
strongest winds? Then compare seasonal amplitude between 1750–1789 and 1820–1859."

→ maritime_aggregate_track_speeds · Seasonal wind cycle decomposition

"Compare ship speeds in the western Indian Ocean (lon 15–60) versus the eastern Indian Ocean
(lon 60–110) for the same latitude band. Do wind patterns differ between the two basins?"

→ maritime_aggregate_track_speeds · Spatial variation in Southern Ocean wind strength

"Search for Dutch ship tracks passing through the Roaring Forties in the 1780s."

→ maritime_search_tracks · Geographic bounding box filtering on CLIWOC data

"What were the typical sailing speeds on the outward route via the Roaring Forties?"

→ maritime_get_speed_profile · CLIWOC-derived speed statistics per route segment

Cargo & Trade

"Search for pepper shipments from the Malabar coast."

→ maritime_search_cargo · Commodity search across 200 curated BGB records

"What cargo was on the most valuable VOC voyage?"

→ maritime_search_cargo + maritime_get_cargo_manifest · Value filtering and full manifests

Advanced: Multi-Tool Investigation Chains

These prompts naturally trigger 3–8 tool calls as the model builds a complete picture.

"Investigate the Batavia wreck: find the voyage, get the full linked record with crew,
assess the position quality, get the hull profile for drift modelling, and check what other
ships were in the area when it wrecked."

→ Chains: maritime_search_voyages → maritime_get_voyage_full → maritime_assess_position → maritime_get_hull_profile → maritime_nearby_tracks

"I want to understand VOC losses in the Cape region. Search for all Cape wrecks, show me the
statistics by cause, export the found wrecks as GeoJSON, and tell me which unfound wrecks
have the best position data for a search expedition."

→ Chains: maritime_search_wrecks → maritime_get_statistics → maritime_export_geojson → maritime_assess_position (for each candidate)

"Plan a historical sailing voyage: pick a route from Texel to Batavia, show me the waypoints
and hazards, estimate where I'd be after 90 days, and tell me what speeds to expect based on
historical data. Also find any wrecks along the route."

→ Chains: maritime_list_routes → maritime_get_route → maritime_estimate_position → maritime_get_speed_profile → maritime_search_wrecks

"Full climate analysis: aggregate Roaring Forties speeds by decade, test for a Laki volcanic
signal, decompose by month for seasonal patterns, and compare the western vs eastern Indian
Ocean for spatial variation."

→ Chains: maritime_aggregate_track_speeds (×4 with different parameters) → maritime_compare_speed_groups · Complete climate research workflow

Running the Examples

The examples/ directory contains runnable demo scripts that call MCP tools directly:

cd examples

# Quick start (no network required)
python capabilities_demo.py        # server capabilities, ship types, regions
python hull_profiles_demo.py       # hydrodynamic data for all 6 ship types
python location_lookup_demo.py     # VOC gazetteer: place names to coordinates
python route_explorer_demo.py      # sailing routes + position estimation
python track_explorer_demo.py      # CLIWOC ship tracks + nearby search
python cross_archive_demo.py      # unified voyage view across 5 archives
python ukho_global_wrecks_demo.py  # UKHO 94K+ global wrecks: flag, depth, type filters
python noaa_us_wrecks_demo.py     # NOAA 13K+ US wrecks: GP quality, Gulf, Great Lakes
python narrative_search_demo.py   # full-text search across all narrative fields
python speed_profile_demo.py       # CLIWOC-derived speed statistics per segment
python climate_proxy_demo.py       # ship speeds as climate proxies (wind & monsoon)
python volcanic_signal_demo.py    # volcanic signals, E/W ratios, spatial variation
python dss_crew_demo.py           # DSS musters, MDB crew, wage comparison
python entity_resolution_demo.py  # fuzzy matching, confidence scores, link auditing
python timeline_demo.py            # chronological voyage timeline from all sources

# Core tool demos (network required)
python voyage_search_demo.py       # search + detail workflow
python wreck_investigation_demo.py # search, assess, export workflow
python vessel_search_demo.py       # vessel search + ship type comparison
python crew_muster_demo.py         # crew search + detail retrieval
python cargo_trade_demo.py         # cargo search + commodity analysis
python geojson_export_demo.py      # GeoJSON export + filtering
python statistics_demo.py          # aggregate loss statistics

# Full case study (network required)
python batavia_case_study_demo.py  # 12-tool chain investigating the Batavia wreck

Script

Network

Tools Demonstrated

capabilities_demo.py

No

maritime_capabilities, maritime_list_archives, maritime_list_hull_profiles

hull_profiles_demo.py

No

maritime_list_hull_profiles, maritime_get_hull_profile

location_lookup_demo.py

No

maritime_lookup_location, maritime_list_locations

route_explorer_demo.py

No

maritime_list_routes, maritime_get_route, maritime_estimate_position

track_explorer_demo.py

No

maritime_search_tracks, maritime_get_track, maritime_nearby_tracks

cross_archive_demo.py

Partial

maritime_search_voyages, maritime_get_voyage_full (EIC/Carreira/Galleon/SOIC offline, DAS needs network)

speed_profile_demo.py

No

maritime_get_speed_profile, maritime_estimate_position

climate_proxy_demo.py

No

maritime_compute_track_speeds, maritime_get_speed_profile, maritime_get_route, maritime_aggregate_track_speeds, maritime_compare_speed_groups

volcanic_signal_demo.py

No

maritime_aggregate_track_speeds, maritime_compare_speed_groups (Laki eruption, E/W ratio, seasonal amplitude, spatial variation)

dss_crew_demo.py

No

maritime_search_musters, maritime_get_muster, maritime_compare_wages, maritime_search_crew (DSS musters, MDB crew, wage comparison)

entity_resolution_demo.py

No

maritime_get_voyage_full, maritime_audit_links (fuzzy matching, confidence scores, link auditing)

timeline_demo.py

No

maritime_get_timeline, maritime_search_voyages

ukho_global_wrecks_demo.py

No

maritime_search_wrecks, maritime_get_wreck, maritime_get_statistics, maritime_export_geojson (UKHO flag/type/depth filters)

noaa_us_wrecks_demo.py

No

maritime_search_wrecks, maritime_get_wreck, maritime_export_geojson (NOAA GP quality, Gulf, Great Lakes)

narrative_search_demo.py

No

maritime_search_narratives (keyword, phrase, archive/type filters, pagination)

voyage_search_demo.py

Partial

maritime_search_voyages, maritime_get_voyage (DAS needs network, EIC/Carreira/Galleon/SOIC offline)

wreck_investigation_demo.py

Partial

maritime_search_wrecks, maritime_get_wreck, maritime_assess_position, maritime_export_geojson (multi-archive, mostly offline)

vessel_search_demo.py

Yes

maritime_search_vessels, maritime_get_vessel, maritime_get_hull_profile

crew_muster_demo.py

Partial

maritime_search_crew, maritime_get_crew_member (requires download_crew.py first)

cargo_trade_demo.py

No

maritime_search_cargo, maritime_get_cargo_manifest (200 curated records included)

geojson_export_demo.py

Yes

maritime_export_geojson, maritime_search_wrecks

statistics_demo.py

Partial

maritime_get_statistics, maritime_search_wrecks (multi-archive, mostly offline)

batavia_case_study_demo.py

Yes

All tool categories chained together

Tool Reference

All tools accept an optional output_mode parameter ("json" default, or "text" for human-readable output). All search tools support cursor-based pagination via cursor, max_results, next_cursor, has_more, and total_count.

Tool

Category

Description

maritime_list_archives

Archives

List all available maritime archives

maritime_get_archive

Archives

Get archive detail by ID

maritime_search_voyages

Voyages

Search voyages with filters

maritime_get_voyage

Voyages

Get voyage detail by ID

maritime_search_wrecks

Wrecks

Search wreck records

maritime_get_wreck

Wrecks

Get wreck detail by ID

maritime_search_vessels

Vessels

Search vessel records

maritime_get_vessel

Vessels

Get vessel detail by ID

maritime_get_hull_profile

Vessels

Hydrodynamic profile for ship type

maritime_list_hull_profiles

Vessels

Available ship types

maritime_search_crew

Crew

Search crew muster rolls

maritime_get_crew_member

Crew

Get crew member detail

maritime_search_cargo

Cargo

Search cargo manifests

maritime_get_cargo_manifest

Cargo

Full cargo manifest for a voyage

maritime_lookup_location

Location

Look up historical place name in VOC gazetteer

maritime_list_locations

Location

Search/browse gazetteer by region, type, or text

maritime_list_routes

Routes

List historical sailing routes (18 routes, 5 nations)

maritime_get_route

Routes

Full route with waypoints, hazards, season notes

maritime_estimate_position

Routes

Estimate ship position on a date from route

maritime_search_tracks

Tracks

Search CLIWOC ship tracks by nationality and date

maritime_get_track

Tracks

Get full position history for a CLIWOC voyage

maritime_nearby_tracks

Tracks

Find ships near a position on a given date

maritime_get_speed_profile

Speed

Historical sailing speed statistics per segment

maritime_get_voyage_full

Linking

Unified voyage view with all linked records

maritime_get_timeline

Timeline

Chronological event view for a voyage

maritime_assess_position

Position

Position quality and uncertainty assessment

maritime_export_geojson

Export

GeoJSON wreck position export

maritime_get_statistics

Export

Aggregate loss statistics

maritime_search_musters

Musters

Search GZMVOC ship muster records

maritime_get_muster

Musters

Get full muster record details

maritime_compare_wages

Musters

Compare wage distributions between time periods

maritime_search_narratives

Narratives

Full-text search across all narrative fields

maritime_compute_track_speeds

Analytics

Compute daily sailing speeds for a CLIWOC voyage

maritime_aggregate_track_speeds

Analytics

Aggregate track speeds by decade, year, month, direction, or nationality

maritime_compare_speed_groups

Analytics

Compare speed distributions between two time periods (Mann-Whitney U)

maritime_did_speed_test

Analytics

Formal 2×2 Difference-in-Differences test (direction × period)

maritime_track_tortuosity

Analytics

Compute route tortuosity for a single CLIWOC voyage

maritime_aggregate_track_tortuosity

Analytics

Aggregate route tortuosity across CLIWOC tracks

maritime_wind_rose

Analytics

Beaufort wind force and direction distributions from CLIWOC logbooks

maritime_export_speeds

Analytics

Export raw speed samples for downstream statistical analysis

maritime_galleon_transit_times

Analytics

Compute transit times for Manila Galleon voyages (1565–1815)

maritime_wind_direction_by_year

Analytics

Year-by-year wind direction distributions from CLIWOC logbooks

maritime_crew_demographics

Demographics

Aggregate crew statistics by rank, origin, fate, decade, or ship

maritime_crew_career

Demographics

Reconstruct individual crew careers across multiple voyages

maritime_crew_survival_analysis

Demographics

Crew survival, mortality, and desertion rates by dimension

maritime_capabilities

Discovery

Server capabilities and reference data

maritime_search_narratives

{
  "query": "monsoon",                            # required, keywords or "quoted phrase"
  "record_type": "voyage",                       # optional: "voyage", "wreck", or null (both)
  "archive": "eic",                              # optional, restrict to one archive
  "max_results": 50,                             # optional, default 50, max 500
  "cursor": null                                 # optional, from previous next_cursor
}

maritime_search_voyages

{
  "ship_name": "Batavia",                       # optional, substring match
  "captain": "Jacobsz",                         # optional
  "date_range": "1620/1640",                     # optional, YYYY/YYYY
  "departure_port": "Texel",                     # optional
  "fate": "wrecked",                             # optional
  "max_results": 10,                             # optional, default 50, max 500
  "cursor": "eyJvIjoxMH0"                       # optional, from previous next_cursor
}

maritime_search_wrecks

{
  "region": "cape",                              # optional, region code
  "cause": "storm",                              # optional
  "status": "unfound",                           # optional
  "min_depth_m": 100,                            # optional
  "min_cargo_value": 100000,                     # optional, guilders
  "max_results": 50,                             # optional, default 100, max 500
  "cursor": null                                 # optional, from previous next_cursor
}

maritime_search_musters

{
  "ship_name": "Middelburg",                     # optional, substring match
  "captain": "Pietersz",                         # optional
  "location": "Batavia",                         # optional, muster location
  "year_start": 1720,                            # optional, earliest year
  "year_end": 1760,                              # optional, latest year
  "date_range": "1720/1760",                     # optional, YYYY/YYYY
  "das_voyage_id": "das:1234",                   # optional, cross-link to DAS voyage
  "max_results": 50,                             # optional, default 50, max 500
  "cursor": null                                 # optional, from previous next_cursor
}

maritime_compare_wages

{
  "group1_start": 1691,                          # required, first group start year
  "group1_end": 1740,                            # required, first group end year
  "group2_start": 1741,                          # required, second group start year
  "group2_end": 1791,                            # required, second group end year
  "rank": "matroos",                             # optional, rank filter
  "origin": "Groningen",                         # optional, origin filter (MDB only)
  "source": "musters"                            # "musters" (GZMVOC) or "crews" (MDB)
}

maritime_search_crew

{
  "ship_name": "Ridderschap van Holland",        # optional
  "rank": "schipper",                            # optional
  "fate": "died_voyage",                         # optional
  "archive": "voc_crew",                         # optional: "voc_crew" or "dss"
  "max_results": 50,                             # optional, default 100, max 500
  "cursor": null                                 # optional, from previous next_cursor
}

maritime_search_cargo

{
  "commodity": "pepper",                         # optional, substring match
  "origin": "Malabar",                           # optional
  "min_value": 100000,                           # optional, guilders
  "max_results": 50,                             # optional, default 100, max 500
  "cursor": null                                 # optional, from previous next_cursor
}

maritime_assess_position

{
  "wreck_id": "maarer:VOC-0789",                 # assess wreck position
  "source_description": "GPS surveyed site"      # position source info
}

maritime_export_geojson

{
  "region": "cape",                              # optional filter
  "status": "found",                             # optional filter
  "include_uncertainty": true,                   # include uncertainty radius
  "include_voyage_data": true                    # include ship/cargo data
}

maritime_lookup_location

{
  "name": "Batavia"                              # place name or alias
}

maritime_list_locations

{
  "query": "spice",                              # optional, text search
  "region": "indonesia",                         # optional, region code
  "location_type": "port",                       # optional: port, island, cape, etc.
  "max_results": 50                              # optional, default 50
}

maritime_list_routes

{
  "direction": "outward",                        # optional: outward, return, intra_asian, pacific_westbound, pacific_eastbound
  "departure_port": "Texel",                     # optional, substring match
  "destination_port": "Batavia"                  # optional, substring match
}

maritime_get_route

{
  "route_id": "outward_outer"                    # route identifier
}

maritime_estimate_position

{
  "route_id": "outward_outer",                   # route identifier
  "departure_date": "1629-10-28",                # YYYY-MM-DD
  "target_date": "1630-02-15",                   # date to estimate position
  "use_speed_profiles": true                     # optional: enrich with CLIWOC speed data
}

maritime_get_speed_profile

{
  "route_id": "outward_outer",                   # route identifier
  "departure_month": 10                          # optional: month (1-12) for seasonal data
}

maritime_get_timeline

{
  "voyage_id": "das:0372.1",                     # voyage ID from any archive
  "include_positions": true,                     # optional: include CLIWOC daily positions
  "max_positions": 20                            # optional: max CLIWOC positions to sample
}

maritime_get_voyage_full

{
  "voyage_id": "eic:0062"                          # voyage ID from any archive (das, eic, carreira, galleon, soic)
}

maritime_search_tracks

{
  "nationality": "NL",                            # optional: NL, UK, ES, FR, SE, US, DE, DK
  "year_start": 1780,                             # optional, earliest year
  "year_end": 1800,                               # optional, latest year
  "ship_name": "BATAVIA",                         # optional, substring match (CLIWOC 2.1 Full)
  "lat_min": -50,                                 # optional, bounding box min latitude
  "lat_max": -30,                                 # optional, bounding box max latitude
  "lon_min": 15,                                  # optional, bounding box min longitude
  "lon_max": 110,                                 # optional, bounding box max longitude
  "max_results": 50,                              # optional, default 50, max 500
  "cursor": null                                  # optional, from previous next_cursor
}

maritime_get_track

{
  "voyage_id": 118                                # CLIWOC voyage ID (integer)
}

maritime_nearby_tracks

{
  "lat": -28.49,                                  # latitude of search point
  "lon": 113.79,                                  # longitude of search point
  "date": "1629-06-04",                           # date to search (YYYY-MM-DD)
  "radius_km": 200,                               # optional, default 200km
  "max_results": 20                               # optional, default 20
}

maritime_get_hull_profile

{
  "ship_type": "retourschip"                     # ship type code
}

maritime_compute_track_speeds

{
  "voyage_id": 118,                               # required, CLIWOC voyage ID
  "lat_min": -50,                                 # optional, bounding box
  "lat_max": -30,
  "lon_min": 15,
  "lon_max": 110,
  "min_speed_km_day": 5.0,                        # optional, filter slow/anchored
  "max_speed_km_day": 400.0                        # optional, filter errors
}

maritime_aggregate_track_speeds

{
  "group_by": "decade",                            # "decade", "year", "month", "direction", "nationality"
  "lat_min": -50,                                  # optional, bounding box
  "lat_max": -30,
  "lon_min": 15,
  "lon_max": 110,
  "nationality": "NL",                             # optional, filter by nationality
  "year_start": 1750,                              # optional
  "year_end": 1800,                                # optional
  "direction": "eastbound",                        # optional, "eastbound" or "westbound"
  "min_speed_km_day": 5.0,                         # optional
  "max_speed_km_day": 400.0                        # optional
}

maritime_compare_speed_groups

{
  "period1_years": "1750/1789",                     # required, first period
  "period2_years": "1820/1859",                     # required, second period
  "lat_min": -50,                                  # optional, bounding box
  "lat_max": -30,
  "lon_min": 15,
  "lon_max": 110,
  "nationality": "NL",                             # optional
  "direction": "eastbound"                         # optional
}

Development

Setup

# Clone the repository
git clone <repository-url>
cd chuk-mcp-maritime-archives

# Install with uv (recommended)
uv sync --dev

# Or with pip
pip install -e ".[dev]"

Running Tests

# Run tests
pytest tests/

# Run tests with coverage
pytest tests/ --cov=src/chuk_mcp_maritime_archives --cov-report=term-missing

# Run a specific test file
pytest tests/test_archive_manager.py -v

Code Quality

# Run all checks (lint, typecheck, security, test)
make check

# Lint and format with ruff
ruff check src/ tests/
ruff format src/ tests/

# Type checking
mypy src/

# Security scan
bandit -r src/ -x tests/

Building

# Build package
python -m build

# Or with uv
uv build

Data Pipeline

All download and generation scripts support --force to regenerate even if cached data exists:

# Download/generate all datasets
python scripts/download_all.py

# Force regeneration of all data
python scripts/download_all.py --force

# Individual scripts
python scripts/download_das.py          # VOC voyages/vessels/wrecks from Huygens API
python scripts/download_cliwoc.py       # CLIWOC ship tracks (~261K positions)
python scripts/download_crew.py         # VOC crew from Nationaal Archief (~774K records, ~80 MB)
python scripts/download_cargo.py        # BGB cargo from Zenodo RDF
python scripts/download_eic.py          # EIC from ThreeDecks
python scripts/generate_carreira.py     # Portuguese Carreira (~500 voyages, ~100 wrecks)
python scripts/generate_galleon.py      # Manila Galleon (~250 voyages, ~42 wrecks)
python scripts/generate_soic.py         # Swedish SOIC (~132 voyages, ~20 wrecks)
python scripts/generate_cargo.py        # Curated cargo fallback (~200 records)
python scripts/generate_dss.py          # DSS musters + MDB crew (~70 musters, ~101 crew)
python scripts/download_dss.py          # DSS .ttl download from DANS (falls back to generate)
python scripts/generate_reference.py    # Gazetteer, routes, hull profiles
python scripts/generate_speed_profiles.py  # CLIWOC speed statistics

Data volume: Core reference data is ~35 MB. With crew data downloaded, total is ~115 MB. The data/cache/ directory (raw downloads) is gitignored.

Configuration

Environment Variables

Variable

Default

Description

CHUK_ARTIFACTS_PROVIDER

memory

Storage backend: memory, filesystem, s3

CHUK_ARTIFACTS_PATH

-

Filesystem storage path

BUCKET_NAME

-

S3 bucket name

AWS_ACCESS_KEY_ID

-

AWS access key for S3

AWS_SECRET_ACCESS_KEY

-

AWS secret key for S3

AWS_ENDPOINT_URL_S3

-

Custom S3 endpoint (MinIO, etc.)

MCP_STDIO

-

Set to any value to force stdio mode

REDIS_URL

-

Redis URL for session management

MARITIME_REFERENCE_MANIFEST

-

Artifact ID of reference data manifest (see below)

.env File

The server loads environment variables from a .env file via python-dotenv. Copy .env.example for a documented template:

cp .env.example .env

Minimal local development (no S3):

CHUK_ARTIFACTS_PROVIDER=memory

With filesystem storage:

CHUK_ARTIFACTS_PROVIDER=filesystem
CHUK_ARTIFACTS_PATH=/tmp/maritime-artifacts

S3-Backed Reference Data

For multi-server deployments, reference data (~35 MB across 18 JSON files) can be stored in S3 and preloaded at startup, eliminating the need to run download scripts on each server.

  1. Configure S3 credentials in .env:

    CHUK_ARTIFACTS_PROVIDER=s3
    BUCKET_NAME=your-maritime-bucket
    AWS_ACCESS_KEY_ID=...
    AWS_SECRET_ACCESS_KEY=...
  2. Upload reference data to the artifact store:

    python scripts/upload_reference_data.py
  3. Set the manifest ID printed by the script:

    MARITIME_REFERENCE_MANIFEST=<manifest-artifact-id>
  4. New servers will automatically download missing data files from S3 at startup.

Docker

Build

docker build -t chuk-mcp-maritime-archives .

Run

# HTTP mode (default in container)
docker run -p 8005:8005 chuk-mcp-maritime-archives

# With S3 storage
docker run -p 8005:8005 \
  -e CHUK_ARTIFACTS_PROVIDER=s3 \
  -e BUCKET_NAME=my-bucket \
  -e AWS_ACCESS_KEY_ID=... \
  -e AWS_SECRET_ACCESS_KEY=... \
  chuk-mcp-maritime-archives

Architecture

Built on top of chuk-mcp-server, this server uses:

  • Async-First: Native async/await with sync HTTP wrapped in asyncio.to_thread()

  • Type-Safe: Pydantic v2 models with extra="forbid" for all responses, extra="allow" for domain models

  • In-Memory Caching: Data loaded once from JSON via _load_json() and cached in instance attributes

  • Reproducible Data: Download scripts fetch real data from DAS, CLIWOC, and Nationaal Archief; curated generation scripts for Carreira, Galleon, SOIC; all scripts support --force and cache-check pattern

  • Pluggable Storage: Artifact storage via chuk-artifacts (memory, filesystem, S3)

  • No External HTTP Deps: Uses stdlib urllib.request -- no requests/httpx dependency

  • Indexed Lookups: Lazy-built in-memory indexes for large datasets (774K crew records)

  • Cross-Archive Linking: Unified voyage view with wreck, vessel, hull profile, and CLIWOC track linking

  • Multi-Archive Dispatch: 11 archives across 6 nations (Dutch, English, Portuguese, Spanish, Swedish, American) with unified query interface

  • Dual Output: All 47 tools support output_mode="text" for human-readable responses

  • Domain Reference Data: ~170 place gazetteer, 18 routes (5 nations), 6 hull profiles, 215 speed profiles, ~261K ship positions, 22 regions, 7 navigation eras

  • Cursor-Based Pagination: All 8 search tools support cursor / next_cursor / has_more for paging through large result sets

  • 1042+ Tests: Across 15 test modules with 96%+ branch coverage

Supported Archives

Archive

Records

Period

Source

Dutch Asiatic Shipping (DAS)

8,194 voyages

1595-1795

resources.huygens.knaw.nl/das

VOC Opvarenden

up to 774,200 crew

1633-1794

nationaalarchief.nl

Boekhouder-Generaal Batavia

200 cargo (curated)

1700-1795

bgb.huygens.knaw.nl

MAARER Wrecks

734 wrecks

1595-1795

Compiled dataset

CLIWOC Ship Tracks

~261,000 positions

1662-1855

historicalclimatology.com (CLIWOC 2.1 Full)

English East India Company (EIC)

~150 voyages, ~35 wrecks

1600-1874

Hardy/Farrington (curated)

Portuguese Carreira da India

~500 voyages, ~100 wrecks

1497-1835

Guinote/Frutuoso/Lopes (curated + expanded)

Spanish Manila Galleon

~250 voyages, ~42 wrecks

1565-1815

Schurz (curated + expanded)

Swedish East India Company (SOIC)

~132 voyages, ~20 wrecks

1731-1813

Koninckx (curated + expanded)

Dutch Ships and Sailors (DSS)

~70 musters, ~101 crew

1691-1837

CLARIN-IV DSS (GZMVOC + MDB)

Reference Data

Dataset

Records

Source

VOC Gazetteer

~170 place names

Curated from historical sources

Historical Routes

18 sailing routes

Bruijn, Gaastra & Schoffer (1987) + multi-nation sources

Speed Profiles

215 profiles, 6 routes

Generated from CLIWOC 2.1 daily positions

Hull Profiles

6 ship types

Archaeological measurements

EIC Archives

~150 voyages, ~35 wrecks

Hardy's Register of Ships (1835), Farrington (1999)

Carreira Archives

~500 voyages, ~100 wrecks

Guinote/Frutuoso/Lopes "As Armadas da India"

Galleon Archives

~250 voyages, ~42 wrecks

Schurz "The Manila Galleon" (1939)

SOIC Archives

~132 voyages, ~20 wrecks

Koninckx "First and Second Charters of the SEIC" (1980)

See ARCHITECTURE.md for design principles and data flow diagrams. See SPEC.md for the full tool specification with parameter tables. See ROADMAP.md for the development roadmap and planned features.

Roadmap

Completed (v0.1.0 - v0.3.0)

  • 26 MCP tools across 13 categories (voyages, wrecks, vessels, crew, cargo, position, export, discovery, archives, hull profiles, location, routes, tracks)

  • 4 archive clients: DAS, VOC Crew, BGB Cargo, MAARER Wrecks

  • CLIWOC ship tracks: ~261K logbook positions (1662-1855, 8 nationalities)

  • VOC Gazetteer, sailing routes, position estimation, hull profiles

  • Reproducible data pipeline: download scripts for DAS and CLIWOC

Completed (v0.4.0)

  • 27 MCP tools across 14 categories (added cross-archive linking)

  • Cross-archive linking: maritime_get_voyage_full returns unified voyage view with wreck, vessel, hull profile, and CLIWOC track

  • CLIWOC 2.1 Full upgrade: ship names, company, DAS numbers for direct cross-archive linking

  • Ship name search: maritime_search_tracks now supports ship name filtering

  • 430 tests, 97%+ branch coverage

Completed (v0.5.0)

  • 29 MCP tools across 16 categories (added speed profiles and timeline)

  • Speed profiles: maritime_get_speed_profile returns CLIWOC-derived speed statistics per route segment with seasonal variation

  • Timeline view: maritime_get_timeline assembles chronological events from all data sources for a voyage

  • Enhanced position estimation: maritime_estimate_position now supports use_speed_profiles=True for CLIWOC-enriched estimates

  • 483 tests, 97%+ branch coverage

Completed (v0.6.0)

  • Artifact store integration: GeoJSON exports and timeline tracks stored to chuk-artifacts with scope="sandbox"

  • S3-backed reference data: scripts/upload_reference_data.py + MARITIME_REFERENCE_MANIFEST for automatic preloading

  • .env.example configuration template documenting all environment variables

  • 499 tests, 97%+ branch coverage

Completed (v0.7.0)

  • 8 archives across 5 nations: English East India Company (EIC), Portuguese Carreira da India, Spanish Manila Galleon, Swedish East India Company (SOIC)

  • Multi-archive dispatch: search_voyages(archive="eic") queries one archive; no filter queries all

  • ~450 new voyage records, ~112 new wrecks from curated academic sources

  • Coverage expanded: 1497-1874 (from 1595-1795)

  • 585 tests, 97%+ branch coverage

Completed (v0.8.0)

  • Expanded curated archives: Carreira 120->500 voyages/100 wrecks, Galleon 100->250 voyages/42 wrecks, SOIC 80->132 voyages/20 wrecks

  • Download infrastructure: shared download_utils.py with cache-check-download pattern and --force flag

  • VOC crew pipeline: download_crew.py downloads 774K records from Nationaal Archief; crew_client.py with indexed lookups for O(1) voyage/ID searches

  • Cargo pipeline: download_cargo.py for BGB Zenodo RDF, generate_cargo.py for curated fallback

  • EIC pipeline: download_eic.py for ThreeDecks scraping, generate_eic.py as curated fallback

  • All scripts retrofitted with --force and cache-check pattern via download_utils.py

  • download_all.py orchestrator runs all 10 scripts with --force passthrough

Completed (v0.9.0)

  • Cursor-based pagination for all 6 search tools (voyages, wrecks, crew, cargo, vessels, tracks)

  • cursor parameter on all search tools; total_count, next_cursor, has_more in all search responses

  • Page through 774K crew records or 8,194 voyages incrementally

  • PaginatedResult dataclass and _paginate() in ArchiveManager; deterministic sort for multi-archive queries

  • 597 tests, 97%+ branch coverage

Completed (v0.11.0)

  • UKHO Global Wrecks: 94,000+ wrecks worldwide from UK Hydrographic Office via EMODnet (Open Government Licence v3.0)

  • 9 archives across 6 nations: added UKHO as wrecks-only archive with global coverage (1500-2024)

  • New wreck filters: flag (vessel nationality) and vessel_type on wreck search

  • 5 new global regions: north_atlantic, mediterranean, baltic, north_pacific, australia_nz

  • Dual data pipeline: download_ukho.py (EMODnet WFS, 94K records) + generate_ukho.py (50 curated fallback wrecks)

  • 616 tests, 97%+ branch coverage

Completed (v0.12.0 - v0.13.0)

  • NOAA Wrecks & Obstructions: ~13,000 wrecks in US coastal waters from NOAA AWOIS (public domain)

  • 10 archives across 6 nations: added NOAA as wrecks-only archive with US coverage (1600-2024)

  • New search filter: gp_quality for NOAA position accuracy codes

  • 2 new US regions: gulf_of_mexico, great_lakes

  • 30 MCP tools across 17 categories (added narrative search)

  • Full-text narrative search: maritime_search_narratives searches voyage particulars, wreck particulars, and loss_location across all 10 archives with phrase matching, relevance ranking, and snippet extraction

  • 647 tests, 97%+ branch coverage

Completed (v0.14.0)

  • 33 MCP tools across 18 categories (added track analytics)

  • Track analytics: maritime_compute_track_speeds, maritime_aggregate_track_speeds, maritime_compare_speed_groups for server-side speed computation, aggregation by decade/year/month/direction/nationality, and Mann-Whitney U statistical testing

  • Geographic search: maritime_search_tracks now supports lat/lon bounding box filtering

  • 762 tests, 97%+ branch coverage

Completed (v0.15.0)

  • 36 MCP tools across 19 categories (added ship musters)

  • Dutch Ships and Sailors (DSS): GZMVOC ship-level muster records (1691-1791) + MDB individual crew records (1803-1837)

  • New tools: maritime_search_musters, maritime_get_muster, maritime_compare_wages

  • Multi-archive crew dispatch: maritime_search_crew now supports archive="dss" for MDB records

  • 810 tests, 97%+ branch coverage

Completed (v0.16.0 - v0.17.0)

  • 37 MCP tools across 19 categories (added entity resolution + link audit)

  • Entity resolution: pure-Python fuzzy matching for ship names (Levenshtein, Soundex, composite scoring)

  • Link confidence: 0.0-1.0 confidence scores on all cross-archive links in maritime_get_voyage_full

  • Link audit: maritime_audit_links for precision/recall metrics

  • 18 sailing routes across 5 nations: VOC (8), EIC (4), Carreira (2), Manila Galleon (2), SOIC (2)

  • New route directions: pacific_westbound, pacific_eastbound for Manila Galleon Pacific crossings

  • Gazetteer expansion: ~170 places including London, Lisbon, Gothenburg, Acapulco, Guam, Azores

  • Position estimation: works with all 18 routes across all archive nations

  • 968+ tests, 96%+ branch coverage

Completed (v0.18.0 - v0.18.1)

  • 40 MCP tools across 20 categories (added crew demographics & network analysis)

  • Crew demographics: maritime_crew_demographics for aggregate statistics by rank, origin, fate, decade, or ship

  • Career reconstruction: maritime_crew_career reconstructs individual careers across multiple voyages with rank progression

  • Survival analysis: maritime_crew_survival_analysis for mortality and desertion rates by dimension

  • Voyage ID prefix normalisation fix: cross-archive wreck and vessel lookups now handle unprefixed IDs (e.g. "0372.1" matching "das:0372.1")

  • Date-line crossing fix: position estimation now correctly interpolates longitude across the ±180° date line (Manila Galleon Pacific routes)

  • 1042+ tests, 96%+ branch coverage

Planned

  • Drift modelling: available as chuk-mcp-ocean-drift (10 tools, v0.1.0) — forward/backtrack/Monte Carlo drift computation using hull profiles and position data from this server

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository

  2. Create your feature branch (git checkout -b feature/amazing-feature)

  3. Commit your changes (git commit -m 'Add amazing feature')

  4. Push to the branch (git push origin feature/amazing-feature)

  5. Open a Pull Request

License

Apache License 2.0 -- See LICENSE for details.

Acknowledgments

  • Huygens Institute for the Dutch Asiatic Shipping database

  • Nationaal Archief for VOC crew and cargo records

  • CLIWOC for the Climatological Database for World's Oceans

  • Dani Arribas-Bel for the CLIWOC Slim and Routes dataset

  • Model Context Protocol for the MCP specification

  • Anthropic for Claude and MCP support

  • J.R. Bruijn, F.S. Gaastra, and I. Schoffer for Dutch-Asiatic Shipping in the 17th and 18th Centuries (1987)

  • C.R. Hardy for A Register of Ships Employed in the Service of the East India Company (1835)

  • A. Farrington for Catalogue of East India Company Ships' Journals and Logs (1999)

  • P. Guinote, E. Frutuoso, and A. Lopes for As Armadas da India 1497-1835

  • W.L. Schurz for The Manila Galleon (1939)

  • C. Koninckx for The First and Second Charters of the Swedish East India Company (1980)

  • Dutch Ships and Sailors CLARIN-IV project for the DSS Linked Data Cloud (GZMVOC and MDB datasets)

Available Tools

47 tools
maritime_aggregate_track_speedsA

Aggregate daily sailing speeds across all matching CLIWOC tracks.

Computes haversine-based daily speeds from consecutive logbook positions, filters by geographic region, and aggregates by the requested dimension. Returns descriptive statistics per group.

Args: group_by: Grouping dimension. Options: - "decade" — group by decade (e.g., 1750, 1760, ...) - "year" — group by individual year (e.g., 1783, 1784, ...) - "month" — group by month (1-12) - "direction" — group by eastbound/westbound - "nationality" — group by ship nationality (NL, UK, ES, ...) - "beaufort" — group by Beaufort wind force (0-12) lat_min: Minimum latitude for position bounding box lat_max: Maximum latitude for position bounding box lon_min: Minimum longitude for position bounding box lon_max: Maximum longitude for position bounding box nationality: Filter tracks by nationality code (NL, UK, ES, FR, etc.) year_start: Filter tracks starting from this year year_end: Filter tracks ending at this year direction: Filter observations by "eastbound" or "westbound" month_start: Filter by start month (1-12). Supports wrap-around with month_end (e.g., month_start=11, month_end=2 = Nov-Feb) month_end: Filter by end month (1-12). Used with month_start aggregate_by: Unit of analysis — "observation" (default, each daily speed is a data point) or "voyage" (one mean speed per voyage, statistically independent samples) min_speed_km_day: Minimum speed filter (default: 5.0) max_speed_km_day: Maximum speed filter (default: 400.0) wind_force_min: Minimum Beaufort force (0-12). Requires wind data wind_force_max: Maximum Beaufort force (0-12). Requires wind data output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with per-group statistics (n, mean, median, std, 95% CI, percentiles)

Tips for LLMs: - Use lat_min=-50, lat_max=-30 for the Roaring Forties wind belt - group_by="decade" shows speed trends over time - group_by="direction" shows eastbound vs westbound asymmetry - group_by="beaufort" shows speed profiles by wind force - Use aggregate_by="voyage" for statistically independent samples - Use wind_force_min/max to condition on wind strength - Use maritime_compare_speed_groups for significance testing - Use maritime_did_speed_test for direction x period interaction

Inputs: group_by, lat_min, lat_max, lon_min, +13 more.

maritime_aggregate_track_tortuosityA

Aggregate route tortuosity across CLIWOC tracks with optional comparison.

Tests the chronometer hypothesis: if marine chronometers improved navigation, tortuosity should decrease over time. If tortuosity stays constant while speed DiD shows asymmetric gains, that confirms wind change rather than better routing.

Args: group_by: "decade", "year", "direction", "nationality" lat_min/lat_max/lon_min/lon_max: Bounding box nationality: Filter by nationality code year_start/year_end: Filter by year range direction: Filter by "eastbound" or "westbound" month_start/month_end: Month filter (supports wrap-around) min_speed_km_day: Minimum speed filter (default: 5.0) max_speed_km_day: Maximum speed filter (default: 400.0) min_positions: Minimum positions in bbox (default: 5) r_min: Minimum tortuosity R to include (e.g. 1.0 excludes artifacts) r_max: Maximum tortuosity R to include (e.g. 5.0 excludes loiterers) period1_years: First period as "YYYY/YYYY" range or "YYYY,YYYY,..." list period2_years: Second period as "YYYY/YYYY" range or "YYYY,YYYY,..." list n_bootstrap: Bootstrap iterations (default: 10000) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with per-group tortuosity stats, optional comparison

Tips for LLMs: - group_by="decade" to see tortuosity trends over time - Use direction="eastbound" vs "westbound" separately - r_min=1.0, r_max=5.0 focuses on normal transit voyages - period1_years/period2_years for formal comparison with CI - Periods accept "YYYY/YYYY" ranges or "YYYY,YYYY,..." year lists - Combine with maritime_did_speed_test for complete decomposition - min_positions=5 filters out short transits

Inputs: group_by, lat_min, lat_max, lon_min, +16 more.

maritime_assess_positionA

Assess the quality and uncertainty of a historical position.

Evaluates a position based on the navigation technology available at the time, the source quality, and known factors. Returns a quality score, uncertainty radius, and recommendations for drift modelling and search planning.

Provide either a voyage_id, wreck_id, or explicit lat/lon coordinates. The assessment considers the era of navigation technology (cross-staff, backstaff, octant, chronometer) and the source description.

Args: voyage_id: Voyage identifier to assess its incident position wreck_id: Wreck identifier to assess its recorded position latitude: Explicit latitude in decimal degrees (WGS84) longitude: Explicit longitude in decimal degrees (WGS84) source_description: Description of position source for quality scoring. Keywords that improve scoring: "GPS", "surveyed", "multiple sources", "triangulated". Keywords that lower scoring: "dead reckoning", "approximate", "regional" date: Date for navigation era lookup (YYYY or YYYY-MM-DD), used when no voyage_id or wreck_id is provided output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with position quality assessment

Tips for LLMs: - Provide voyage_id or wreck_id to automatically look up the position and date from the archive - The quality_score ranges from 0 (unknown) to 1 (precise GPS) - uncertainty_radius_km defines the search area envelope - The recommendations field provides actionable guidance for drift modelling and search planning - For modern surveyed wrecks, include "GPS" or "surveyed" in source_description to get a precise assessment - For historical positions from ship logs, include "dead reckoning" to reflect the navigational limitations - Navigation accuracy improved over time: 1595-1650 (~30km), 1650-1700 (~25km), 1700-1760 (~20km), 1760-1795 (~10km)

Inputs: voyage_id, wreck_id, latitude, longitude, +3 more.

maritime_capabilitiesA

List full server capabilities: archives, tools, and reference data.

Returns a comprehensive overview of this maritime archives server including all available archives, registered tools, supported ship types, and geographic regions. Call this first to understand what the server can do.

Args: output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with server capabilities

Tips for LLMs: - Call this FIRST to plan a research workflow - The archives list shows available data sources and their coverage periods - The tools list shows every registered tool with its category and description - ship_types lists valid values for vessel type filters - regions lists valid values for geographic region filters - Typical workflow: maritime_capabilities -> maritime_search_voyages or maritime_search_wrecks -> detail tools -> export/analysis

Inputs: output_mode.

maritime_compare_speed_groupsA

Compare sailing speed distributions between two time periods.

Computes daily speeds for each period, then runs a Mann-Whitney U test to determine if the difference is statistically significant. Also returns Cohen's d effect size.

Args: period1_years: First period as "YYYY/YYYY" range or "YYYY,YYYY,..." list period2_years: Second period as "YYYY/YYYY" range or "YYYY,YYYY,..." list lat_min: Minimum latitude for position bounding box lat_max: Maximum latitude for position bounding box lon_min: Minimum longitude for position bounding box lon_max: Maximum longitude for position bounding box nationality: Filter tracks by nationality code direction: Filter by "eastbound" or "westbound" month_start: Filter by start month (1-12). Supports wrap-around month_end: Filter by end month (1-12). Used with month_start aggregate_by: Unit of analysis — "observation" (default) or "voyage" (one mean per voyage, statistically independent) include_samples: If True, include raw speed arrays in response min_speed_km_day: Minimum speed filter (default: 5.0) max_speed_km_day: Maximum speed filter (default: 400.0) wind_force_min: Minimum Beaufort force (0-12). Requires wind data wind_force_max: Maximum Beaufort force (0-12). Requires wind data exclude_years: Years to exclude from both periods, as "YYYY/YYYY" range or "YYYY,YYYY,..." list. output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with group statistics, Mann-Whitney U, z-score, p-value, and Cohen's d effect size

Tips for LLMs: - Use aggregate_by="voyage" for statistically independent samples - Use wind_force_min/max to condition on Beaufort force - Use maritime_did_speed_test for formal direction x period interaction - p < 0.05 indicates statistically significant difference - Cohen's d > 0.8 indicates a large effect size - Periods accept comma-separated year lists for non-contiguous years (e.g., "1720,1728,1747" for ENSO El Nino years)

Inputs: period1_years (required), period2_years (required), lat_min, lat_max, +14 more.

maritime_compare_wagesA

Compare crew wage distributions between two time periods.

Calculates mean and median wages for two year ranges and reports the percentage difference. Can use GZMVOC aggregate muster data (1691-1791) or MDB individual crew records (1803-1837).

Args: group1_start: Start year for first comparison group group1_end: End year for first comparison group group2_start: Start year for second comparison group group2_end: End year for second comparison group rank: Optional rank filter (e.g., matroos, stuurman) origin: Optional place of origin filter (MDB crews only) source: Data source - "musters" for GZMVOC aggregate data, "crews" for MDB individual records output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with wage comparison statistics

Tips for LLMs: - Use source="musters" for VOC Asian muster data (1691-1791) - Use source="crews" for post-VOC individual records (1803-1837) - The difference_pct shows group2 relative to group1 - Combine with rank filter to compare wages for specific roles - origin filter only works with source="crews" (MDB records) - Consider inflation: guilder purchasing power changed over time

Inputs: group1_start (required), group1_end (required), group2_start (required), group2_end (required), +4 more.

maritime_compute_track_speedsA

Compute daily sailing speeds for a single CLIWOC voyage.

Calculates haversine distance between consecutive daily logbook positions and returns speed in km/day. Optionally filters by geographic bounding box and speed bounds.

Args: voyage_id: CLIWOC voyage ID (from maritime_search_tracks) lat_min: Minimum latitude for position filtering lat_max: Maximum latitude for position filtering lon_min: Minimum longitude for position filtering lon_max: Maximum longitude for position filtering min_speed_km_day: Minimum speed to include (default: 5.0, filters out anchored/drifting) max_speed_km_day: Maximum speed to include (default: 400.0, filters out data errors) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with daily speed observations for the voyage

Tips for LLMs: - Get voyage_id from maritime_search_tracks results - Use lat/lon bounds to focus on a specific ocean region - Speeds are in km/day (a sailing ship typically does 100-300 km/day) - Wind-driven: faster speeds indicate stronger winds - Use maritime_aggregate_track_speeds for bulk analysis across many voyages

Inputs: voyage_id (required), lat_min, lat_max, lon_min, +4 more.

maritime_crew_careerA

Reconstruct career history for crew members matching a name.

Searches the VOC Opvarenden dataset for all records matching the given name, groups them by individual (using name + origin), and reconstructs each person's career chronologically.

Args: name: Name to search for (substring, case-insensitive) origin: Optional origin city to disambiguate (exact match) output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with career reconstruction(s)

Tips for LLMs: - Common names may match multiple individuals; use origin to disambiguate - Look at ranks_held to see career progression (e.g. matroos -> stuurman -> schipper) - career_span_years shows how long someone served the VOC - final_fate shows how their career ended - Each voyage includes ship_name, rank, and embarkation_date

Inputs: name (required), origin, output_mode.

maritime_crew_demographicsA

Aggregate crew demographics by rank, origin, fate, decade, or ship.

Analyses the VOC Opvarenden dataset (774K crew records) to show distributions and patterns in crew composition.

Args: group_by: Dimension to group by — "rank", "origin", "fate", "decade", or "ship_name" date_range: Filter by embarkation date (e.g. "1700/1750") rank: Filter by rank substring (e.g. "matroos") origin: Filter by origin substring (e.g. "Amsterdam") fate: Filter by exact fate (e.g. "deserted") ship_name: Filter by ship name substring top_n: Number of top groups to return (default 25) output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with demographic breakdown

Tips for LLMs: - Use group_by="origin" to study labour migration patterns - Use group_by="decade" to track workforce trends over time - Use group_by="rank" for crew composition analysis - Use group_by="fate" to see overall outcome distribution - Combine filters: rank="matroos" + group_by="decade" shows sailor recruitment trends - Each group includes a fate sub-distribution for deeper analysis

Inputs: group_by, date_range, rank, origin, +4 more.

maritime_crew_survival_analysisA

Analyse survival, mortality, and desertion rates for VOC crews.

Computes rates from the service_end_reason field across the VOC Opvarenden dataset, grouped by the chosen dimension.

Args: group_by: Dimension to group by — "rank", "origin", "fate", "decade", or "ship_name" date_range: Filter by embarkation date (e.g. "1700/1750") rank: Filter by rank substring (e.g. "soldaat") origin: Filter by origin substring (e.g. "Rotterdam") top_n: Number of top groups to return (default 25) output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with survival analysis

Tips for LLMs: - group_by="rank" reveals which ranks had highest mortality - group_by="decade" shows how mortality changed over the VOC era - group_by="origin" shows whether origin city affected survival - survival_rate = percentage who returned home - mortality_rate = percentage who died (voyage + Asia combined) - desertion_rate = percentage who deserted - Rates are per 100 crew with known fate

Inputs: group_by, date_range, rank, origin, +2 more.

maritime_did_speed_testA

Formal 2x2 Difference-in-Differences test: direction x period.

Tests whether the difference between eastbound and westbound speeds changed significantly between two time periods. A significant DiD means one direction gained more than the other — isolating wind changes from symmetric technology improvements.

DiD = (period2_east - period1_east) - (period2_west - period1_west)

Uses bootstrap resampling for confidence intervals and p-values. Defaults to voyage-level aggregation for statistically independent samples (daily observations within a voyage are autocorrelated).

Args: period1_years: First period as "YYYY/YYYY" range or "YYYY,YYYY,..." list period2_years: Second period as "YYYY/YYYY" range or "YYYY,YYYY,..." list lat_min: Minimum latitude for position bounding box lat_max: Maximum latitude for position bounding box lon_min: Minimum longitude for position bounding box lon_max: Maximum longitude for position bounding box nationality: Filter tracks by nationality code month_start: Filter by start month (1-12). Supports wrap-around month_end: Filter by end month (1-12). Used with month_start aggregate_by: "voyage" (default, independent samples) or "observation" (more data but autocorrelated) n_bootstrap: Bootstrap iterations (default: 10000) min_speed_km_day: Minimum speed filter (default: 5.0) max_speed_km_day: Maximum speed filter (default: 400.0) wind_force_min: Minimum Beaufort force (0-12). Requires wind data wind_force_max: Maximum Beaufort force (0-12). Requires wind data exclude_years: Years to exclude from both periods, as "YYYY/YYYY" range or "YYYY,YYYY,..." list. output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with 4-cell summary, marginal diffs, DiD estimate, bootstrap 95% CI, and p-value

Tips for LLMs: - Always splits by direction (eastbound vs westbound) - Use lat_min=-50, lat_max=-30 for the Roaring Forties - Positive DiD = eastbound gained more = wind strengthened - Use wind_force_min/max for Beaufort-stratified DiD - Default aggregate_by="voyage" gives correct p-values - If DiD scales with Beaufort, that is genuine wind change - Periods accept comma-separated year lists for non-contiguous years (e.g., "1720,1728,1747" for ENSO El Nino years)

Inputs: period1_years (required), period2_years (required), lat_min, lat_max, +13 more.

maritime_estimate_positionA

Estimate a ship's position on a specific date based on its route.

Uses linear interpolation between historical route waypoints to estimate where a ship would have been on a given date, assuming typical sailing times. Works with all 18 routes across VOC, EIC, Carreira, Galleon, and SOIC. Essential for investigating wreck locations and lost voyages.

Args: route_id: Route identifier (from maritime_list_routes or maritime_get_route). See maritime_get_route for full list. departure_date: Ship's departure date as YYYY-MM-DD target_date: Date to estimate position for as YYYY-MM-DD (e.g., last known date, or estimated loss date) use_speed_profiles: If True, enrich estimate with CLIWOC-derived speed statistics for the current route segment (default False) output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with estimated lat/lon, region, route segment, confidence level, and caveats

Tips for LLMs: - Get the departure_date from maritime_get_voyage - Choose route_id based on the voyage's departure/destination ports (use maritime_list_routes to find matching routes) - The estimate is based on TYPICAL sailing times — actual positions varied due to weather, ship condition, and orders - Confidence is "high" at known ports, "moderate" between waypoints, "low" past the expected arrival date - Use maritime_lookup_location on the estimated region for more geographic context - Combine with maritime_assess_position for uncertainty analysis

Inputs: route_id (required), departure_date (required), target_date (required), use_speed_profiles, +1 more.

maritime_export_geojsonA

Export wreck positions as a GeoJSON FeatureCollection.

Creates a GeoJSON document with Point features for each wreck site. Can export specific wrecks by ID or all wrecks matching filter criteria. Suitable for mapping and GIS analysis.

Args: wreck_ids: Specific wreck IDs to export (overrides other filters) region: Region filter. Options: north_sea, atlantic_europe, atlantic_crossing, cape, mozambique_channel, indian_ocean, malabar, coromandel, ceylon, bengal, malacca, indonesia, south_china_sea, japan, caribbean status: Wreck status filter - found, unfound, approximate archive: Restrict to a specific archive include_uncertainty: Include position uncertainty radius in properties (default: true) include_voyage_data: Include ship type, tonnage, loss cause, lives lost, and depth in properties (default: true) output_mode: Response format - "json" (default) or "text"

Returns: JSON with GeoJSON FeatureCollection and feature count

Tips for LLMs: - Provide wreck_ids for a targeted export of specific sites - Use region and status filters for geographic or discovery status based exports - The GeoJSON uses WGS84 coordinates (EPSG:4326) - Include_uncertainty adds uncertainty_km to each feature's properties (useful for drawing search area buffers) - Include_voyage_data enriches features with vessel and loss context (useful for thematic mapping) - Use the output for mapping, spatial analysis, or as input to drift modelling tools

Inputs: wreck_ids, region, status, archive, +3 more.

maritime_export_speedsA

Export raw speed samples for downstream statistical analysis.

Returns individual speed records with full metadata (voyage_id, year, month, direction, nationality, ship_name, wind data) so models can perform arbitrary grouping and statistical tests.

Unlike maritime_aggregate_track_speeds which groups and summarises, this tool returns the underlying data. Essential for analyses requiring non-contiguous year comparisons (e.g. ENSO phase classification, volcanic event detection, arbitrary epoch testing).

Args: lat_min/lat_max/lon_min/lon_max: Bounding box nationality: Filter by nationality code year_start/year_end: Filter by year range direction: Filter by "eastbound" or "westbound" month_start/month_end: Month filter (supports wrap-around) aggregate_by: "voyage" (one mean speed per voyage, recommended for statistical independence) or "observation" (each daily speed with position and wind data) min_speed_km_day: Minimum speed filter (default: 5.0) max_speed_km_day: Maximum speed filter (default: 400.0) wind_force_min/wind_force_max: Beaufort force bounds max_results: Records per page (default: 500). Use with offset for pagination through large result sets. offset: Skip this many records (default: 0). Use next_offset from previous response to get the next page. fields: Comma-separated list of fields to include in output. Observation fields: voyage_id, date, year, month, day, direction, speed_km_day, nationality, ship_name, lat, lon, wind_force, wind_direction. Voyage fields: voyage_id, year, month, direction, speed_km_day, nationality, ship_name, n_observations. Omit for all fields. output_mode: Response format - "json" (default), "text", or "csv". Use "csv" for compact tabular output (~3-4x fewer tokens than JSON). CSV includes a # metadata header.

Returns: JSON, text, or CSV with speed samples and metadata

Tips for LLMs: - Use output_mode="csv" to reduce token usage by ~3-4x - Combine fields="voyage_id,year,speed_km_day" with csv for minimal token footprint (~10 tokens/row vs ~50 in JSON) - Use aggregate_by="observation" to get individual dated records with full date (ISO YYYY-MM-DD), lat, lon, wind data — essential for lunar phase, tidal, or day-level temporal analyses - Use aggregate_by="voyage" for statistically independent samples - Each observation-level sample includes date, year, month, day for precise temporal correlation (e.g. lunar phase, tidal cycles) - Combine with known ENSO chronology to classify years and compute El Nino vs La Nina vs Neutral speed distributions - For tidal analysis: export observations in narrow channels (e.g. Mozambique Channel lat -26/-12, lon 35/45), use date field to compute lunar phase, correlate with speed - For Laki 1783: compare 1782-1784 samples vs surrounding years - Paginate large results: check has_more and use next_offset - Default page size is 500 records; adjust max_results as needed

Inputs: lat_min, lat_max, lon_min, lon_max, +15 more.

maritime_galleon_transit_timesA

Compute transit times for Manila Galleon voyages (1565-1815).

Returns per-voyage transit days (arrival_date - departure_date) for 250 years of Pacific crossings. The galleon trade provides direct tropical Pacific exposure through the ENSO-affected trade wind belt, making transit times a potential ENSO proxy.

Args: trade_direction: "eastbound" (Acapulco→Manila, trade-wind route, ~75 days) or "westbound" (Manila→Acapulco, northern route, ~165 days) year_start: Earliest departure year (inclusive) year_end: Latest departure year (inclusive) fate: Filter by voyage fate ("completed", "wrecked", etc.) max_results: Maximum records to return (default: 500) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with transit records and summary statistics

Tips for LLMs: - Eastbound galleons are the best ENSO detector: they sail directly through the trade wind belt - During El Nino (weakened trades), eastbound crossings should take LONGER; during La Nina (stronger trades), FASTER - Westbound route goes north via Kuroshio Current at ~38N, less directly affected by tropical ENSO - Use trade_direction="eastbound" for ENSO analysis - Compare transit_days across known ENSO years vs neutral years - 213 voyages have complete transit data (of 250 total) - Mean eastbound: 75 days (std 14); westbound: 165 days (std 17)

Inputs: trade_direction, year_start, year_end, fate, +2 more.

maritime_get_archiveA

Get detailed metadata for a specific maritime archive.

Returns full information about the archive including organisation, coverage period, record types, citation, licence, and access method.

Args: archive_id: Archive identifier (das, voc_crew, voc_cargo, maarer) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with archive details

Tips for LLMs: - Use maritime_list_archives first to see valid archive IDs - DAS (Dutch Asiatic Shipping) is the primary source for voyages and vessels - voc_crew links to personnel muster rolls - voc_cargo links to trade goods manifests - maarer covers compiled wreck position data

Inputs: archive_id (required), output_mode.

maritime_get_cargo_manifestA

Get the full cargo manifest for a specific voyage.

Returns all cargo entries recorded for the voyage, including commodity, quantity, unit, and value in guilders.

Args: voyage_id: Voyage identifier (from search results or DAS ID) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with all cargo entries for the voyage

Tips for LLMs: - Use maritime_search_voyages first to find the voyage_id - The manifest lists all goods loaded on the ship - Values are in contemporary Dutch guilders - Useful for estimating the total value of cargo lost in a shipwreck — combine with maritime_get_wreck - Not all voyages have cargo records; the BGB archive covers 1700-1795 while DAS voyages start from 1595

Inputs: voyage_id (required), output_mode.

maritime_get_crew_memberA

Get full details for a specific crew member.

Returns the complete crew record including name, rank, origin, ship name, voyage, monthly pay, embarkation date, and fate.

Args: crew_id: Crew member identifier (from search results) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with full crew member record

Tips for LLMs: - Use maritime_search_crew first to find the crew_id - Pay is in guilders per month; compare with rank averages - The fate field indicates what happened to the crew member (survived, died_voyage, died_asia, deserted, discharged) - Cross-reference with maritime_get_voyage using the voyage_id for full voyage context

Inputs: crew_id (required), output_mode.

maritime_get_hull_profileA

Get hydrodynamic hull profile for a VOC ship type.

Returns detailed hull characteristics including dimensions, displacement, drag coefficients, windage area, and drift modelling parameters. Used for calculating how a ship or wreckage would drift in ocean currents.

Args: ship_type: Ship type identifier. Options: retourschip, fluit, jacht, hooker, pinas, fregat output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with hull profile data

Tips for LLMs: - Use maritime_list_hull_profiles to see available types - Essential for drift modelling: provides drag coefficients, windage area, and sinking characteristics - The dimensions_typical field gives length, beam, and draught ranges for that ship type - The llm_guidance field contains domain-specific advice for using the profile in calculations - Retourschip is the most common VOC vessel type

Inputs: ship_type (required), output_mode.

maritime_get_musterA

Get full details for a specific ship muster record.

Returns the complete GZMVOC muster record including ship name, captain, crew composition by rank, total European and Asian crew, aggregate wages, and linked DAS voyage ID.

Args: muster_id: Muster record identifier (e.g., "dss_muster:0001") output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with full muster record details

Tips for LLMs: - Use maritime_search_musters first to find the muster_id - ranks_summary shows crew counts per rank (Dutch names) - total_european + total_asian = total_crew - mean_wage_guilders is the average monthly wage across all crew - If das_voyage_id is set, use maritime_get_voyage to get voyage context - Compare with maritime_search_crew archive="dss" for individual MDB crew records from the post-VOC era (1803-1837)

Inputs: muster_id (required), output_mode.

maritime_get_routeA

Get full details of a historical sailing route.

Returns all waypoints with coordinates, typical sailing times, stop durations, hazards, and seasonal notes for a specific route.

Args: route_id: Route identifier. Options: VOC (Dutch): outward_outer, outward_inner, return, japan, spice_islands, ceylon, coromandel, malabar EIC (British): eic_outward, eic_china, eic_return, eic_country Carreira (Portuguese): carreira_outward, carreira_return Manila Galleon (Spanish): galleon_westbound, galleon_eastbound SOIC (Swedish): soic_outward, soic_return output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with full route including waypoints, durations, hazards, and seasonal notes

Tips for LLMs: - Each waypoint has cumulative_days (typical elapsed days from departure) and stop_days (typical port stay duration) - The outer route (south of Madagascar) was preferred from the 1660s for speed; the inner route used Mozambique Channel - Use the waypoints with maritime_lookup_location for details on each port - Use maritime_estimate_position with this route_id and a departure date to estimate a ship's position on any date

Inputs: route_id (required), output_mode.

maritime_get_speed_profileA

Get historical sailing speed statistics for a route.

Returns per-segment speed profiles derived from CLIWOC ship track data, including mean, median, and standard deviation of daily distances (km/day). Optionally filtered by departure month for seasonal variation.

Args: route_id: Route identifier (e.g., "outward_outer", "return"). Use maritime_list_routes to see available routes. departure_month: Optional month (1-12) for seasonal speed data. If not provided, returns all-months aggregate. output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with per-segment speed statistics

Tips for LLMs: - Compare different months to see seasonal wind patterns (e.g., monsoon effects on Indian Ocean segments) - Use with maritime_estimate_position for more informed position estimation - High std_dev indicates variable conditions on a segment - Low sample_count means less reliable statistics - The mean_km_day can help assess whether a voyage was running ahead or behind schedule

Inputs: route_id (required), departure_month, output_mode.

maritime_get_statisticsA

Get aggregate statistics across maritime archives.

Computes summary statistics for VOC shipping losses including total losses, lives lost, cargo value, and breakdowns by region, cause, status, and decade.

Args: archive: Restrict to a specific archive (default: all) date_range: Date range as "YYYY/YYYY" (default: 1595-1795) group_by: Grouping dimension (reserved for future use) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with aggregate statistics

Tips for LLMs: - Use date_range to focus statistics on a specific period (e.g., "1700/1750" for the early 18th century) - The response includes losses_by_region, losses_by_cause, losses_by_status, and losses_by_decade breakdowns - Total cargo_value_guilders_total gives the aggregate value of goods lost in all matched wrecks - Compare decades to identify trends in shipping safety - Compare regions to identify the most dangerous routes

Inputs: archive, date_range, group_by, output_mode.

maritime_get_timelineA

Build a chronological timeline of events for a voyage.

Combines data from multiple archives — DAS voyages, MAARER wrecks, CLIWOC ship tracks, and route estimates — into a single chronological sequence of events. Optionally includes CLIWOC position data.

Args: voyage_id: DAS voyage identifier (e.g., "5999.1") include_positions: Include CLIWOC track positions as events (default False, can add many events) max_positions: Maximum CLIWOC positions to include (default 20) output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with chronological event list, optional GeoJSON track, and list of data sources consulted

Tips for LLMs: - Start with include_positions=False to see major events - Set include_positions=True for detailed track reconstruction - Events from different sources may have conflicting dates - The geojson field contains a LineString of all positioned events - Use maritime_get_voyage_full for non-chronological linked data

Inputs: voyage_id (required), include_positions, max_positions, output_mode.

maritime_get_trackA

Get full position history for a CLIWOC voyage.

Returns the complete track including all dated lat/lon positions from the ship's logbook. Positions are daily observations recorded by the ship's navigator.

Args: voyage_id: CLIWOC voyage ID (integer, from search results) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with full track including positions

Tips for LLMs: - Get voyage_id from maritime_search_tracks results - Positions are daily logbook readings, not continuous - Gaps in dates indicate missing logbook entries - Use positions to reconstruct the ship's route on a map - Combine with maritime_export_geojson for mapping - Position accuracy varies: typically ±20-50km for this era

Inputs: voyage_id (required), output_mode.

maritime_get_vesselA

Get full details for a specific vessel.

Returns the complete vessel record including name, type, tonnage, construction year, shipyard, VOC chamber, dimensions, and service history.

Args: vessel_id: Vessel identifier (from search results) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with full vessel record

Tips for LLMs: - Use maritime_search_vessels first to find the vessel_id - Tonnage is measured in lasten (approximately 2 metric tonnes) - Use maritime_get_hull_profile with the ship type for hydrodynamic characteristics - Cross-reference with maritime_search_voyages using the vessel name to find its voyage history

Inputs: vessel_id (required), output_mode.

maritime_get_voyageA

Get full details for a specific voyage.

Returns the complete voyage record including ship information, captain, route, dates, fate, and any incident details. The voyage must have been found by a prior maritime_search_voyages call or specified by its DAS voyage identifier.

Args: voyage_id: Voyage identifier (from search results or DAS ID) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with full voyage record

Tips for LLMs: - Use maritime_search_voyages first to find the voyage_id - The response includes incident details if the voyage ended in shipwreck (loss date, position, cause) - Use the voyage_id with maritime_search_crew to find the crew - Use the voyage_id with maritime_get_cargo_manifest for cargo - Use with maritime_assess_position to evaluate wreck position quality

Inputs: voyage_id (required), output_mode.

maritime_get_voyage_fullA

Get a unified view of a voyage with all linked records.

Returns the voyage record enriched with related wreck, vessel, hull profile, CLIWOC track, and optionally crew data. Each link includes a confidence score (0.0-1.0) indicating match quality.

Args: voyage_id: Voyage identifier (e.g. "das:0372.1", "eic:0042") include_crew: If true, also find crew records linked to this voyage output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with unified voyage view including all linked records

Tips for LLMs: - Start with maritime_search_voyages to find the voyage_id - This tool replaces the need to call get_voyage, get_wreck, get_vessel, and get_hull_profile separately - The links_found field shows which related records exist - The link_confidence field shows match quality (1.0 = exact ID match, lower values indicate fuzzy name+date matching) - Use include_crew=true to find crew/muster records for a voyage - Cross-reference: a wreck's voyage_id links to the originating voyage - The cliwoc_track field shows logbook positions (requires CLIWOC 2.1 Full data for ship name matching)

Inputs: voyage_id (required), include_crew, output_mode.

maritime_get_wreckA

Get full details for a specific wreck record.

Returns the complete wreck record including ship information, loss date, cause, position with uncertainty, depth estimate, discovery status, and archaeological notes.

Args: wreck_id: Wreck identifier (from search results) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with full wreck record

Tips for LLMs: - Use maritime_search_wrecks first to find the wreck_id - The position field includes lat, lon, and uncertainty_km - Use maritime_assess_position with this wreck_id to get a detailed position quality assessment - Use maritime_export_geojson with wreck_ids to map the location - Cross-reference with maritime_get_voyage using the linked voyage_id

Inputs: wreck_id (required), output_mode.

maritime_list_archivesA

List all available maritime archives.

Returns metadata for each archive including name, organisation, coverage period, record types, and a brief description.

Args: output_mode: Response format - "json" (default) or "text"

Returns: JSON or text listing of available archives

Tips for LLMs: - Call this first to discover which archives are available - Use maritime_capabilities for a full overview of all tools and reference data - Archive IDs: das, voc_crew, voc_cargo, maarer - DAS covers voyages/vessels, voc_crew covers personnel, voc_cargo covers trade goods, maarer covers wreck sites

Inputs: output_mode.

maritime_list_hull_profilesA

List all available ship types with hull profiles.

Returns a list of VOC ship type identifiers for which hydrodynamic hull profile data is available.

Args: output_mode: Response format - "json" (default) or "text"

Returns: JSON or text list of ship types

Tips for LLMs: - Use this to discover which ship types have hull profiles before calling maritime_get_hull_profile - Common types: retourschip (large Asia trader), fluit (cargo), jacht (fast patrol)

Inputs: output_mode.

maritime_list_locationsA

Search or browse the VOC historical gazetteer.

Returns a list of known VOC-era locations with coordinates and region classifications. Use filters to narrow results.

Args: query: Text to search in place names, aliases, and notes (case-insensitive substring match) region: Filter by region. Options: north_sea, atlantic_europe, atlantic_crossing, cape, mozambique_channel, indian_ocean, malabar, coromandel, ceylon, bengal, malacca, indonesia, south_china_sea, japan, caribbean location_type: Filter by type. Options: port, island, cape, anchorage, waterway, coast, channel, region max_results: Maximum results (default: 50) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with matching locations

Tips for LLMs: - Call without filters to see all available locations - Use region filter to find all ports/islands in a specific area - Use location_type="port" to find VOC trading posts - Use query to search by historical or modern name - The 'region' values match those used in maritime_search_wrecks - Follow up with maritime_lookup_location for full details on a specific place

Inputs: query, region, location_type, max_results, +1 more.

maritime_list_routesA

List available historical sailing routes.

Returns summaries of all known routes with typical durations. Covers VOC (Dutch), EIC (British), Carreira da India (Portuguese), Manila Galleon (Spanish), and SOIC (Swedish) routes.

Args: direction: Filter by route direction — "outward" (Europe to Asia), "return" (Asia to Europe), "intra_asian" (between Asian ports), "pacific_westbound" (Acapulco to Manila), or "pacific_eastbound" (Manila to Acapulco) departure_port: Filter routes containing this departure port (substring match, e.g., "Texel", "Downs", "Lisbon") destination_port: Filter routes containing this destination (substring match, e.g., "Batavia", "Canton", "Manila") output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with list of available routes

Tips for LLMs: - Use direction="outward" to see Europe-to-Asia routes for all nations (VOC, EIC, Carreira, SOIC) - Use departure_port and destination_port to find routes matching a specific voyage - Follow up with maritime_get_route for full waypoint details - Use maritime_estimate_position with a route_id to estimate where a ship was on a specific date

Inputs: direction, departure_port, destination_port, output_mode.

maritime_lookup_locationA

Look up a historical place name in the VOC gazetteer.

Returns coordinates (lat/lon), region classification, and historical context for a place name mentioned in voyage or wreck records. Handles historical spellings and aliases automatically.

Args: name: Place name to look up (e.g., "Batavia", "Texel", "Abrolhos", "Kaap de Goede Hoop"). Supports historical Dutch spellings and modern equivalents. output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with coordinates, region, and historical notes

Tips for LLMs: - Use this after reading a voyage's 'particulars' field to geocode places mentioned in the text - Handles common VOC-era place names and their modern equivalents (e.g., "Batavia" -> Jakarta, "Formosa" -> Taiwan) - The 'region' field matches the regions used by maritime_search_wrecks and maritime_get_statistics - Coordinates are approximate centres for historical locations - Use maritime_list_locations to browse available places by region or type - Combine with maritime_assess_position to evaluate position accuracy for a given location and time period

Inputs: name (required), output_mode.

maritime_nearby_tracksA

Find ships near a given position on a given date.

Searches all CLIWOC logbook positions for the specified date and returns tracks with positions within the search radius. Useful for finding what other ships were in an area when a wreck or incident occurred.

Args: lat: Latitude of search point (decimal degrees) lon: Longitude of search point (decimal degrees) date: Date to search (YYYY-MM-DD format) radius_km: Search radius in kilometres (default: 200) max_results: Maximum results (default: 20) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with nearby tracks sorted by distance

Tips for LLMs: - Use with wreck positions to find potential witness ships - Increase radius_km if no results (ships were sparse) - Date must be exact YYYY-MM-DD — logbook entries are daily - Try adjacent dates if exact date yields no results - Results include distance_km and matching position - CLIWOC covers 1662-1855; earlier dates have fewer records - Combine with maritime_assess_position for uncertainty context

Inputs: lat (required), lon (required), date (required), radius_km, +2 more.

maritime_search_cargoA

Search for VOC cargo records.

Queries the Boekhouder-Generaal Batavia (BGB) cargo database for trade goods shipped between Asia and the Netherlands, 1700-1795. All search parameters are optional and combined with AND logic. Supports cursor-based pagination.

Args: voyage_id: Filter by specific voyage commodity: Commodity name or partial name (e.g., pepper, cloves, textiles, silver, porcelain) origin: Origin port or region destination: Destination port or region date_range: Date range as "YYYY/YYYY" or "YYYY-MM-DD/YYYY-MM-DD" min_value: Minimum cargo value in guilders archive: Restrict to a specific archive (default: voc_cargo) max_results: Maximum results per page (default: 100, max: 500) cursor: Pagination cursor from a previous result's next_cursor field output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with matching cargo records and pagination metadata

Tips for LLMs: - Use commodity to search for specific trade goods - Use voyage_id to see all cargo on a specific voyage; alternatively use maritime_get_cargo_manifest for the full list - Common VOC commodities: pepper, cloves, nutmeg, mace, cinnamon, textiles, porcelain, silver, copper, tea, coffee, sugar - Values are in contemporary Dutch guilders - If has_more is true, pass next_cursor as cursor to get the next page - Combine with maritime_search_voyages to find the voyage context

Inputs: voyage_id, commodity, origin, destination, +6 more.

maritime_search_crewA

Search for crew members in muster roll records.

Queries crew databases across multiple archives. By default queries the VOC Opvarenden database (774,200 personnel records, 1633-1794). Set archive="dss" to query MDB individual crew records from northern Dutch provinces (77,043 records, 1803-1837).

Args: name: Crew member name or partial name (case-insensitive) rank: Rank or role (e.g., schipper, stuurman, matroos, soldaat) ship_name: Ship name or partial name voyage_id: Specific voyage identifier to list all crew origin: Place of origin or partial name date_range: Date range as "YYYY/YYYY" or "YYYY-MM-DD/YYYY-MM-DD" fate: Crew fate - survived, died_voyage, died_asia, deserted, discharged (VOC Opvarenden only) archive: Archive to search - "voc_crew" (default, 1633-1794) or "dss" (MDB northern provinces, 1803-1837) max_results: Maximum results per page (default: 100, max: 500) cursor: Pagination cursor from a previous result's next_cursor field output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with matching crew records and pagination metadata

Tips for LLMs: - Use voyage_id to list the complete crew of a specific voyage - Set fate="died_voyage" to find crew lost at sea (VOC only) - Names are in historical Dutch spelling; try partial matches - If has_more is true, pass next_cursor as cursor to get the next page - Follow up with maritime_get_crew_member for full details including pay and embarkation date - Set archive="dss" for post-VOC era crew from Groningen, Friesland, Drenthe, Overijssel (1803-1837) - Combine with maritime_search_voyages to cross-reference ship and voyage information

Inputs: name, rank, ship_name, voyage_id, +7 more.

maritime_search_mustersA

Search GZMVOC ship-level muster records from Asian waters.

Queries the Generale Zeemonsterrollen VOC database containing ship crew composition, wages, and staffing data from VOC ships stationed in Asia, 1691-1791. Complements VOC Opvarenden which records departures from the Netherlands.

Args: ship_name: Ship name or partial name (case-insensitive) captain: Captain name or partial name date_range: Date range as "YYYY/YYYY" or "YYYY-MM-DD/YYYY-MM-DD" location: Muster location (e.g., Batavia, Makassar, Ceylon) das_voyage_id: Link to a specific DAS voyage identifier year_start: Filter musters from this year onward year_end: Filter musters up to this year max_results: Maximum results per page (default: 50, max: 500) cursor: Pagination cursor from a previous result's next_cursor field output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with matching muster records and pagination metadata

Tips for LLMs: - Musters record crew composition at Asian ports, not departures - Use location to filter by port (Batavia, Makassar, Colombo, etc.) - Use year_start/year_end for temporal queries within 1691-1791 - Cross-link to DAS voyages using das_voyage_id field - Follow up with maritime_get_muster for full crew breakdown - Use maritime_compare_wages to analyze wage trends over time

Inputs: ship_name, captain, date_range, location, +6 more.

maritime_search_narrativesA

Search free-text narrative content across all maritime archives.

Performs full-text search across voyage particulars, wreck particulars, and loss location descriptions. All query terms must be present in a record for it to match (AND logic). Use quoted phrases for exact multi-word matching (e.g. "Cape of Good Hope").

Narrative fields searched: - Voyage particulars: DAS, EIC, Carreira, Galleon, SOIC - Wreck particulars: MAARER, EIC, Carreira, Galleon - Wreck loss_location: all wreck archives

Args: query: Search text — keywords or quoted phrases (e.g. "monsoon", '"Cape of Good Hope"', "storm cannon") record_type: Limit to "voyage" or "wreck" (default: both) archive: Restrict to a specific archive ID (e.g. "eic", "carreira") max_results: Maximum results per page (default: 50, max: 500) cursor: Pagination cursor from a previous result's next_cursor output_mode: Response format — "json" (default) or "text"

Returns: JSON or text with matching narrative excerpts, snippets, and pagination metadata

Tips for LLMs: - Use this tool for research questions like "find mentions of monsoon across all archives" - Quoted phrases match exactly: '"East India"' finds only that phrase, not "East" and "India" separately - Multiple unquoted words use AND logic: "storm cape" finds records containing both "storm" AND "cape" - Results are ranked by relevance (number of term occurrences) - Use record_type="voyage" or "wreck" to narrow results - Use archive to limit to one archive (e.g. archive="carreira") - Follow up with maritime_get_voyage or maritime_get_wreck for full record details - If has_more is true, pass next_cursor as cursor to get the next page

Inputs: query (required), record_type, archive, max_results, +2 more.

maritime_search_tracksA

Search historical ship tracks from the CLIWOC database (1662-1855).

Returns voyage track summaries from ~261K daily logbook observations recorded by 8 European maritime nations. Each track represents one voyage with dated lat/lon positions from the ship's logbook. Supports cursor-based pagination and geographic bounding box filtering.

Args: nationality: Two-letter nationality code to filter by. Options: NL (Dutch), UK (British), ES (Spanish), FR (French), SE (Swedish), US (American), DE (German), DK (Danish) year_start: Earliest year to include (e.g., 1700) year_end: Latest year to include (e.g., 1750) ship_name: Ship name or partial name (case-insensitive; requires CLIWOC 2.1 Full data) lat_min: Minimum latitude — track must have at least one position in the bounding box (e.g., -50 for Roaring Forties south bound) lat_max: Maximum latitude (e.g., -30 for Roaring Forties north bound) lon_min: Minimum longitude (e.g., 15 for Indian Ocean west bound) lon_max: Maximum longitude (e.g., 110 for Indian Ocean east bound) max_results: Maximum results per page (default: 50, max: 500) cursor: Pagination cursor from a previous result's next_cursor field output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with matching track summaries and pagination metadata

Tips for LLMs: - Use nationality filter to find ships of a specific nation - Combine year_start/year_end to narrow to a specific period - Use lat_min/lat_max/lon_min/lon_max to find tracks passing through a geographic region (e.g., lat_min=-50, lat_max=-30 for Roaring Forties) - Results show track summaries (start/end dates, position count) - If has_more is true, pass next_cursor as cursor to get the next page - Follow up with maritime_get_track to get full position data - Use maritime_nearby_tracks to find ships near a wreck site - CLIWOC covers 1662-1855 with most data from 1750-1850 - Nationality breakdown: UK (732), NL (677), ES (472), FR (85)

Inputs: nationality, year_start, year_end, ship_name, +7 more.

maritime_search_vesselsA

Search for VOC vessels by name, type, or construction details.

Queries the DAS vessel registry for ships used by the VOC. All search parameters are optional and combined with AND logic. Supports cursor-based pagination.

Args: name: Vessel name or partial name (case-insensitive) ship_type: Ship type filter. Options: retourschip, fluit, jacht, hooker, pinas, fregat built_range: Build year range as "YYYY/YYYY" shipyard: Shipyard name or partial name chamber: VOC chamber - Amsterdam, Zeeland, Delft, Rotterdam, Hoorn, Enkhuizen min_tonnage: Minimum tonnage in lasten max_tonnage: Maximum tonnage in lasten archive: Restrict to a specific archive (default: all) max_results: Maximum results per page (default: 50, max: 500) cursor: Pagination cursor from a previous result's next_cursor field output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with matching vessel records and pagination metadata

Tips for LLMs: - Use ship_type to filter by vessel class (retourschip is the standard large Asia-route ship) - Chamber indicates which of the six VOC offices commissioned the vessel - If has_more is true, pass next_cursor as cursor to get the next page - Follow up with maritime_get_vessel for full construction details - Use maritime_get_hull_profile for hydrodynamic characteristics of a ship type (useful for drift modelling) - Combine with maritime_search_voyages to find voyages by this vessel

Inputs: name, ship_type, built_range, shipyard, +7 more.

maritime_search_voyagesA

Search for maritime voyages matching one or more criteria.

Queries multiple maritime archives for voyages. All search parameters are optional and combined with AND logic. Supports cursor-based pagination for browsing large result sets.

Archives available: - das: Dutch Asiatic Shipping (VOC), 1595-1795 - eic: English East India Company, 1600-1874 - carreira: Portuguese Carreira da India, 1497-1835 - galleon: Spanish Manila Galleon, 1565-1815 - soic: Swedish East India Company, 1731-1813

Args: ship_name: Ship name or partial name (case-insensitive) captain: Captain / skipper name or partial name date_range: Date range as "YYYY/YYYY" or "YYYY-MM-DD/YYYY-MM-DD" departure_port: Departure port name or partial name destination_port: Destination port name or partial name route: Route keyword (searches departure, destination, and summary) fate: Voyage outcome - completed, wrecked, captured, scuttled, missing archive: Restrict to specific archive - das, eic, carreira, galleon, soic (default: all) max_results: Maximum results per page (default: 50, max: 500) cursor: Pagination cursor from a previous result's next_cursor field output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with matching voyages and pagination metadata

Tips for LLMs: - Start broad (ship_name only) and narrow down with additional filters - Use date_range to focus on a specific century or decade - Set fate="wrecked" to find shipwreck voyages - Use archive="eic" for English East India Company voyages - If has_more is true, pass next_cursor as cursor to get the next page - total_count shows how many records match before pagination - Follow up with maritime_get_voyage for full voyage details

Inputs: ship_name, captain, date_range, departure_port, +7 more.

maritime_search_wrecksA

Search for maritime shipwreck records across all archives.

Queries wreck databases for known and suspected wreck sites. All search parameters are optional and combined with AND logic. Supports cursor-based pagination.

Archives with wreck data: - maarer: MAARER VOC Wrecks, 1595-1795 - eic: English East India Company wrecks, 1600-1874 - carreira: Portuguese Carreira da India wrecks, 1497-1835 - galleon: Spanish Manila Galleon wrecks, 1565-1815 - soic: Swedish East India Company wrecks, 1731-1813 - ukho: UK Hydrographic Office Global Wrecks, 1500-2024 - noaa: NOAA Wrecks & Obstructions (AWOIS), 1600-2024

Args: ship_name: Ship name or partial name (case-insensitive) date_range: Date range as "YYYY/YYYY" or "YYYY-MM-DD/YYYY-MM-DD" region: Geographic region filter (e.g., cape, pacific, gulf_of_mexico) cause: Loss cause filter - storm, reef, fire, battle, grounding, scuttled, collision, unknown status: Wreck discovery status - found, unfound, approximate min_depth_m: Minimum estimated depth in metres max_depth_m: Maximum estimated depth in metres min_cargo_value: Minimum cargo value in guilders flag: Vessel nationality/flag (substring match, e.g. "UK", "NL", "US") vessel_type: Vessel type classification (substring match, e.g. "liner", "warship") gp_quality: NOAA position accuracy code (1=High, 2=Medium, 3=Low, 4=Poor) archive: Restrict to specific archive - maarer, eic, carreira, galleon, soic, ukho, noaa (default: all) max_results: Maximum results per page (default: 100, max: 500) cursor: Pagination cursor from a previous result's next_cursor field output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with matching wreck records and pagination metadata

Tips for LLMs: - Use region to focus on a geographic area (e.g., "cape", "pacific") - Set status="unfound" to find wrecks that have not been located - If has_more is true, pass next_cursor as cursor to get the next page - Follow up with maritime_get_wreck for full details including position - Use maritime_export_geojson to map wreck positions - Use flag to filter by nationality (e.g. "UK", "NL", "US") - Use vessel_type to filter by ship classification (e.g. "liner", "warship") - Use gp_quality=1 to find NOAA wrecks with high-accuracy positions

Inputs: ship_name, date_range, region, cause, +11 more.

maritime_track_tortuosityA

Compute route tortuosity for a single CLIWOC voyage.

Tortuosity = path_km / net_km. A value of 1.0 means perfectly direct; higher values indicate meandering. Compares actual sailed distance (sum of position-to-position haversine legs) to great-circle distance (first to last position in bbox).

Args: voyage_id: CLIWOC voyage ID (from maritime_search_tracks) lat_min: Minimum latitude for bounding box lat_max: Maximum latitude for bounding box lon_min: Minimum longitude for bounding box lon_max: Maximum longitude for bounding box min_speed_km_day: Minimum speed filter (default: 5.0) max_speed_km_day: Maximum speed filter (default: 400.0) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with path_km, net_km, tortuosity_r, inferred_direction, n_in_box

Tips for LLMs: - Use lat_min=-50, lat_max=-30 for the Roaring Forties - Tortuosity ~1.0-1.1 = direct sailing, >1.3 = detours - Compare pre/post-chronometer voyages to test navigation - Use maritime_aggregate_track_tortuosity for bulk analysis

Inputs: voyage_id (required), lat_min, lat_max, lon_min, +4 more.

maritime_wind_direction_by_yearA

Year-by-year wind direction distributions from CLIWOC logbooks.

Returns 8-compass-sector wind direction distributions for each year, with ~97.5% coverage across the full 1662-1854 period. This makes it a powerful tool for detecting long-term atmospheric circulation shifts, including ENSO phases and Walker circulation changes.

Args: lat_min/lat_max/lon_min/lon_max: Bounding box filter nationality: Filter by nationality code year_start/year_end: Year range filter direction: "eastbound" or "westbound" month_start/month_end: Month filter (1-12, supports wrap-around) min_speed_km_day: Minimum speed filter (default: 5.0) max_speed_km_day: Maximum speed filter (default: 400.0) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with per-year sector distributions

Tips for LLMs: - Wind direction has 97.5% coverage (vs 17% for Beaufort force) - Covers full 1662-1854 period — ideal for ENSO detection - In trade wind belt (lat -30 to 30): expect E/SE dominance - During El Nino: trades weaken, may shift toward variable/W - During La Nina: trades strengthen, E/SE percentages increase - Compare sector percentages across known ENSO/neutral years - Use month_start=11, month_end=2 for peak ENSO season

Inputs: lat_min, lat_max, lon_min, lon_max, +9 more.

maritime_wind_roseA

Beaufort wind force and wind direction distributions from CLIWOC logbooks.

Counts observations by Beaufort force (0-12) and compass direction (N, NE, E, SE, S, SW, W, NW) with mean speed at each level. Optionally compares distributions between two periods.

Also includes distance calibration: compares logged distances from ship logbooks against haversine-computed distances from lat/lon positions. Ratio near 1.0 indicates good position accuracy.

Key tool for the Kelly and O Grada approach: if recorded Beaufort distributions shift between periods, that indicates genuine wind change. If distributions are stable while speeds increase, that indicates technology improvement (hull, sails, routing).

Wind direction is available for ~97% of observations. Beaufort force is available for ~17%. Returns has_wind_data/has_direction_data flags. Anchored positions are excluded by default.

Args: lat_min/lat_max/lon_min/lon_max: Bounding box nationality: Filter by nationality code year_start/year_end: Filter by year range direction: Filter by "eastbound" or "westbound" month_start/month_end: Month filter (supports wrap-around) period1_years: First period as "YYYY/YYYY" range or "YYYY,YYYY,..." list period2_years: Second period as "YYYY/YYYY" range or "YYYY,YYYY,..." list min_speed_km_day: Minimum speed filter (default: 5.0) max_speed_km_day: Maximum speed filter (default: 400.0) output_mode: Response format - "json" (default) or "text"

Returns: JSON or text with Beaufort + direction distribution, calibration, and optional period splits

Tips for LLMs: - Use period1_years/period2_years to compare distributions - Periods accept "YYYY/YYYY" ranges or "YYYY,YYYY,..." year lists - Wind direction available even without Beaufort force data - direction_counts show prevailing wind patterns by compass sector - distance_calibration compares logged vs computed distances - Combine with group_by="beaufort" on aggregate tool for speed profiles at each wind force

Inputs: lat_min, lat_max, lon_min, lon_max, +11 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 47 tools

    Disambiguation4/5

    Tools are largely distinct by entity type (search, get, aggregate, compare) but there is minor overlap between single-voyage and aggregate speed/tortuosity tools. However, detailed descriptions mitigate confusion.

    Naming Consistency5/5

    All tools follow a consistent 'maritime_verb_noun' pattern (e.g., maritime_search_voyages, maritime_aggregate_track_speeds). The naming is predictable and uniform.

    Tool Count4/5

    47 tools is high but justifiable for a comprehensive maritime archives server covering voyages, wrecks, crew, cargo, tracks, routes, and analysis. A few tools could be merged (e.g., export functions) but overall scope supports the count.

    Completeness5/5

    The tool surface covers all major operations expected for historical maritime research: search, retrieve details, aggregate, compare, export, and specialized analysis (speed, tortuosity, wind, DID tests). No obvious gaps in the domain.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      B
      quality
      B
      maintenance
      An MCP server for indexing and searching Commodore 64 documentation using full-text, semantic, and fuzzy search across multiple file formats. It enables RAG-based question answering, entity extraction, and interactive timeline or knowledge graph visualizations.
      94
      1
      -
    • A
      license
      A
      quality
      D
      maintenance
      An MCP server designed for interacting with the Model Context Protocol Registry API to discover and retrieve information about available MCP servers. It provides tools to search, list, and view detailed configurations and version history for servers within the registry.
      4
      MIT