Chuk MCP Maritime Archives
Integrates with the NOAA ArcGIS platform to ingest and query historical shipwreck and obstruction records, providing detailed data for approximately 13,000 wrecks in US waters.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Chuk MCP Maritime ArchivesFind historical records and voyage details for the VOC ship Batavia."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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.pyto download from the Nationaal Archief (774K records, ~80 MB). UKHO data requires runningscripts/download_ukho.pyto download from EMODnet (94K records). NOAA data requires runningscripts/download_noaa.pyto download from NOAA ArcGIS (13K records). Curated fallbacks of 50 representative wrecks ship with the repo viascripts/generate_ukho.pyandscripts/generate_noaa.py. Cargo and EIC have download scripts (download_cargo.py,download_eic.py) for future expansion from external sources.
2. Voyage Search (maritime_search_voyages, maritime_get_voyage)
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
3. Wreck Search (maritime_search_wrecks, maritime_get_wreck)
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
4. Vessel Search (maritime_search_vessels, maritime_get_vessel)
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
6. Crew Search (maritime_search_crew, maritime_get_crew_member)
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"orarchive="dss"Indexed lookups for fast search across large datasets
7. Cargo Search (maritime_search_cargo, maritime_get_cargo_manifest)
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=Trueadds 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_maxFull 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=Trueto sample CLIWOC daily positions into the timelineGeoJSON 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
16. Narrative Search (maritime_search_narratives)
Full-text search across all free-text narrative content:
Searches voyage
particulars, wreckparticulars, andloss_locationacross all 10 archivesKeyword 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_idCompare 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/mcpUse this with any MCP client -- no installation required. All 47 tools and 774K crew records are available.
Installation
Using uvx (Recommended -- No Installation Required!)
uvx chuk-mcp-maritime-archivesUsing uv (Recommended for Development)
# 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 --devUsing pip (Traditional)
pip install chuk-mcp-maritime-archivesUsage
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 httpOr 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 httpSTDIO 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
Narrative & Full-Text Search
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 wreckScript | Network | Tools Demonstrated |
| No |
|
| No |
|
| No |
|
| No |
|
| No |
|
| Partial |
|
| No |
|
| No |
|
| No |
|
| No |
|
| No |
|
| No |
|
| No |
|
| No |
|
| No |
|
| Partial |
|
| Partial |
|
| Yes |
|
| Partial |
|
| No |
|
| Yes |
|
| Partial |
|
| 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 |
| Archives | List all available maritime archives |
| Archives | Get archive detail by ID |
| Voyages | Search voyages with filters |
| Voyages | Get voyage detail by ID |
| Wrecks | Search wreck records |
| Wrecks | Get wreck detail by ID |
| Vessels | Search vessel records |
| Vessels | Get vessel detail by ID |
| Vessels | Hydrodynamic profile for ship type |
| Vessels | Available ship types |
| Crew | Search crew muster rolls |
| Crew | Get crew member detail |
| Cargo | Search cargo manifests |
| Cargo | Full cargo manifest for a voyage |
| Location | Look up historical place name in VOC gazetteer |
| Location | Search/browse gazetteer by region, type, or text |
| Routes | List historical sailing routes (18 routes, 5 nations) |
| Routes | Full route with waypoints, hazards, season notes |
| Routes | Estimate ship position on a date from route |
| Tracks | Search CLIWOC ship tracks by nationality and date |
| Tracks | Get full position history for a CLIWOC voyage |
| Tracks | Find ships near a position on a given date |
| Speed | Historical sailing speed statistics per segment |
| Linking | Unified voyage view with all linked records |
| Timeline | Chronological event view for a voyage |
| Position | Position quality and uncertainty assessment |
| Export | GeoJSON wreck position export |
| Export | Aggregate loss statistics |
| Musters | Search GZMVOC ship muster records |
| Musters | Get full muster record details |
| Musters | Compare wage distributions between time periods |
| Narratives | Full-text search across all narrative fields |
| Analytics | Compute daily sailing speeds for a CLIWOC voyage |
| Analytics | Aggregate track speeds by decade, year, month, direction, or nationality |
| Analytics | Compare speed distributions between two time periods (Mann-Whitney U) |
| Analytics | Formal 2×2 Difference-in-Differences test (direction × period) |
| Analytics | Compute route tortuosity for a single CLIWOC voyage |
| Analytics | Aggregate route tortuosity across CLIWOC tracks |
| Analytics | Beaufort wind force and direction distributions from CLIWOC logbooks |
| Analytics | Export raw speed samples for downstream statistical analysis |
| Analytics | Compute transit times for Manila Galleon voyages (1565–1815) |
| Analytics | Year-by-year wind direction distributions from CLIWOC logbooks |
| Demographics | Aggregate crew statistics by rank, origin, fate, decade, or ship |
| Demographics | Reconstruct individual crew careers across multiple voyages |
| Demographics | Crew survival, mortality, and desertion rates by dimension |
| 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 -vCode 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 buildData 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 statisticsData 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 |
|
| Storage backend: |
| - | Filesystem storage path |
| - | S3 bucket name |
| - | AWS access key for S3 |
| - | AWS secret key for S3 |
| - | Custom S3 endpoint (MinIO, etc.) |
| - | Set to any value to force stdio mode |
| - | Redis URL for session management |
| - | 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 .envMinimal local development (no S3):
CHUK_ARTIFACTS_PROVIDER=memoryWith filesystem storage:
CHUK_ARTIFACTS_PROVIDER=filesystem
CHUK_ARTIFACTS_PATH=/tmp/maritime-artifactsS3-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.
Configure S3 credentials in
.env:CHUK_ARTIFACTS_PROVIDER=s3 BUCKET_NAME=your-maritime-bucket AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...Upload reference data to the artifact store:
python scripts/upload_reference_data.pySet the manifest ID printed by the script:
MARITIME_REFERENCE_MANIFEST=<manifest-artifact-id>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-archivesArchitecture
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 modelsIn-Memory Caching: Data loaded once from JSON via
_load_json()and cached in instance attributesReproducible Data: Download scripts fetch real data from DAS, CLIWOC, and Nationaal Archief; curated generation scripts for Carreira, Galleon, SOIC; all scripts support
--forceand cache-check patternPluggable Storage: Artifact storage via chuk-artifacts (memory, filesystem, S3)
No External HTTP Deps: Uses stdlib
urllib.request-- no requests/httpx dependencyIndexed 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 responsesDomain 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_morefor paging through large result sets1042+ 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_fullreturns unified voyage view with wreck, vessel, hull profile, and CLIWOC trackCLIWOC 2.1 Full upgrade: ship names, company, DAS numbers for direct cross-archive linking
Ship name search:
maritime_search_tracksnow supports ship name filtering430 tests, 97%+ branch coverage
Completed (v0.5.0)
29 MCP tools across 16 categories (added speed profiles and timeline)
Speed profiles:
maritime_get_speed_profilereturns CLIWOC-derived speed statistics per route segment with seasonal variationTimeline view:
maritime_get_timelineassembles chronological events from all data sources for a voyageEnhanced position estimation:
maritime_estimate_positionnow supportsuse_speed_profiles=Truefor CLIWOC-enriched estimates483 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_MANIFESTfor automatic preloading.env.exampleconfiguration template documenting all environment variables499 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.pywith cache-check-download pattern and--forceflagVOC crew pipeline:
download_crew.pydownloads 774K records from Nationaal Archief;crew_client.pywith indexed lookups for O(1) voyage/ID searchesCargo pipeline:
download_cargo.pyfor BGB Zenodo RDF,generate_cargo.pyfor curated fallbackEIC pipeline:
download_eic.pyfor ThreeDecks scraping,generate_eic.pyas curated fallbackAll scripts retrofitted with
--forceand cache-check pattern viadownload_utils.pydownload_all.pyorchestrator runs all 10 scripts with--forcepassthrough
Completed (v0.9.0)
Cursor-based pagination for all 6 search tools (voyages, wrecks, crew, cargo, vessels, tracks)
cursorparameter on all search tools;total_count,next_cursor,has_morein all search responsesPage through 774K crew records or 8,194 voyages incrementally
PaginatedResultdataclass and_paginate()in ArchiveManager; deterministic sort for multi-archive queries597 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) andvessel_typeon wreck search5 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_qualityfor NOAA position accuracy codes2 new US regions:
gulf_of_mexico,great_lakes30 MCP tools across 17 categories (added narrative search)
Full-text narrative search:
maritime_search_narrativessearches voyageparticulars, wreckparticulars, andloss_locationacross all 10 archives with phrase matching, relevance ranking, and snippet extraction647 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_groupsfor server-side speed computation, aggregation by decade/year/month/direction/nationality, and Mann-Whitney U statistical testingGeographic search:
maritime_search_tracksnow supports lat/lon bounding box filtering762 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_wagesMulti-archive crew dispatch:
maritime_search_crewnow supportsarchive="dss"for MDB records810 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_fullLink audit:
maritime_audit_linksfor precision/recall metrics18 sailing routes across 5 nations: VOC (8), EIC (4), Carreira (2), Manila Galleon (2), SOIC (2)
New route directions:
pacific_westbound,pacific_eastboundfor Manila Galleon Pacific crossingsGazetteer 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_demographicsfor aggregate statistics by rank, origin, fate, decade, or shipCareer reconstruction:
maritime_crew_careerreconstructs individual careers across multiple voyages with rank progressionSurvival analysis:
maritime_crew_survival_analysisfor mortality and desertion rates by dimensionVoyage 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.
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing-feature)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 toolsmaritime_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
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | decade | |
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| nationality | No | ||
| year_start | No | ||
| year_end | No | ||
| direction | No | ||
| month_start | No | ||
| month_end | No | ||
| aggregate_by | No | observation | |
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| wind_force_min | No | ||
| wind_force_max | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains the computation, filtering, aggregation, and output statistics (mean, median, std, CI). It does not explicitly state read-only behavior or prerequisites, but for an aggregation tool, transparency is good.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary, parameter list, returns, and tips. Though lengthy, every sentence adds value given the number of parameters and zero schema coverage. It is front-loaded and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 17 parameters, no output schema, and no annotations, the description is very complete. It explains all parameters, the output format, and provides usage tips. It also references sibling tools for further analysis, covering the tool's capabilities fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It lists all 17 parameters with explanations, allowed values, defaults, and constraints (e.g., group_by options, Beaufort range 0-12). This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it aggregates daily sailing speeds across CLIWOC tracks, computing haversine-based daily speeds and grouping by dimension. It mentions returns descriptive statistics per group, distinguishing it from siblings like maritime_compute_track_speeds or maritime_aggregate_track_tortuosity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit tips for when to use specific parameters (e.g., lat_min/lat_max for Roaring Forties) and directs to sibling tools for significance testing and interaction effects, clearly guiding the agent on alternatives and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | decade | |
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| nationality | No | ||
| year_start | No | ||
| year_end | No | ||
| direction | No | ||
| month_start | No | ||
| month_end | No | ||
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| min_positions | No | ||
| r_min | No | ||
| r_max | No | ||
| period1_years | No | ||
| period2_years | No | ||
| n_bootstrap | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must disclose behavior. It explains aggregation, hypothesis, and parameter effects. However, it does not explicitly state that it is a read-only operation, though it is implied by the analysis nature. Adequately transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with sections (main description, Args, Returns, Tips). It is somewhat long but each sentence adds value. Minor redundancy could be trimmed (e.g., repeating period format in Args and Tips).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 20 parameters and no output schema, the description covers purpose, parameters, and tips comprehensively. It lacks detailed return format beyond 'JSON or text', but the hypothesis context compensates. Mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description fully explains each parameter, including defaults, constraints, and examples. The 'Args' section adds meaning beyond the schema, covering all 20 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool aggregates route tortuosity across CLIWOC tracks to test the chronometer hypothesis. It distinguishes itself from sibling tools like 'maritime_track_tortuosity' (singular track) and 'maritime_did_speed_test' (speed decomposition) by specifying the aggregate and comparison functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use: for testing chronometer hypothesis, comparing periods. Provides usage guidelines and tips, including combining with other tools like maritime_did_speed_test. Implicitly advises against using for individual track analysis.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | No | ||
| wreck_id | No | ||
| latitude | No | ||
| longitude | No | ||
| source_description | No | ||
| date | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It adequately describes the outputs (quality score, uncertainty radius, recommendations) and mentions navigation era lookup. However, it does not clarify behavior with conflicting inputs (e.g., both voyage_id and lat/lon) or error handling, leaving some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with a one-line summary, explanatory paragraph, Args section, Returns, and Tips. It is front-loaded with purpose. While slightly verbose, it remains organized and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations or output schema, the description covers key aspects: inputs, outputs, navigation era details, and actionable tips. It misses some edge cases (e.g., param precedence) but is largely complete for practical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All seven parameters are explained in detail despite 0% schema description coverage. Description includes units (decimal degrees), format (YYYY-MM-DD), default (output_mode), and tips for source_description keywords. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it assesses the quality and uncertainty of a historical position, specifying inputs like voyage_id, wreck_id, or coordinates, and outputs like quality score and uncertainty radius. It distinguishes from siblings like maritime_estimate_position by focusing on assessment rather than estimation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description provides clear guidance on when to use the tool, mentioning options to provide voyage_id, wreck_id, or explicit lat/lon. It also offers tips for improving scoring via source_description keywords. However, it does not explicitly compare against sibling tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
maritime_audit_linksA
Audit cross-archive link quality against known ground truth.
Evaluates the precision and recall of entity resolution across all archive linking strategies. Uses known DAS-CLIWOC direct links (tracks with DAS numbers) and wreck records (with voyage_id fields) as ground truth.
Args: output_mode: Response format - "json" (default) or "text"
Returns: JSON or text with precision/recall metrics and confidence distributions for wreck, CLIWOC track, and crew links
Tips for LLMs: - Run this to check linking quality after data updates - The confidence distribution shows how many links are high quality vs marginal - Target: 200+ CLIWOC fuzzy matches with mean confidence > 0.7 - Wreck links use exact voyage_id matching (precision = 1.0) - CLIWOC links use fuzzy ship name + date matching
| Name | Required | Description | Default |
|---|---|---|---|
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full burden. It reveals that wreck links use exact matching (precision=1.0) and CLIWOC links use fuzzy matching. It also describes output format (JSON/text with metrics). No mention of destructive actions or permissions, but it implies read-only audit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with a summary, details, and tips. Concise yet informative. One minor point: the 'Returns' section could be merged with the summary, but overall effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers return values (precision/recall, confidence distributions) despite no output schema. Includes example targets for LLM guidance. Single parameter fully explained. No gaps in context for usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter (output_mode) is described in the Args section with default and valid values ('json' or 'text'), adding meaning beyond the schema which only shows a default. Schema coverage is 0%, so description compensates well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool audits cross-archive link quality against known ground truth, with specific details on precision/recall evaluation for different link types (CLIWOC tracks, wrecks). It clearly distinguishes itself from sibling tools like search or aggregate functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides tips for when to run (after data updates) and targets (200+ CLIWOC fuzzy matches, mean confidence > 0.7). Does not explicitly state when not to use, but context makes it clear this is a specific audit tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the comprehensive nature of the response, including archives, tools, ship types, and regions. Explains that output can be JSON or text based on the output_mode parameter. No annotations exist, so description carries full burden; it does so thoroughly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections (title, description, args, returns, tips). Each sentence adds value, and important information is front-loaded. No unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
As a capability-listing tool, the description covers what it returns, how to use it, and its role in a workflow. No output schema exists, but the description adequately details the output structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, output_mode, has a default but no enum in schema. The description adds valid values ('json' or 'text') and explains its effect, which compensates for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool lists full server capabilities (archives, tools, reference data) and instructs to 'Call this first to understand what the server can do.' This distinguishes it from sibling tools that perform searches or retrieve specific records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to call this first for workflow planning, provides a typical workflow sequence, and explains the contents of each section of the output. This gives clear when-to-use and how-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| period1_years | Yes | ||
| period2_years | Yes | ||
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| nationality | No | ||
| direction | No | ||
| month_start | No | ||
| month_end | No | ||
| aggregate_by | No | observation | |
| include_samples | No | ||
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| wind_force_min | No | ||
| wind_force_max | No | ||
| exclude_years | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It explains the computation steps (daily speeds, statistical test) and optional return of raw arrays, but does not explicitly declare read-only or non-destructive nature. Given the analytical context, it is adequately transparent but could be more explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: purpose, method, parameter list, returns, and tips. It is front-loaded with the main objective. While not extremely concise, each sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 18 parameters and no output schema, the description covers the core functionality, parameter semantics, and return format. Tips address common use cases. Minor gaps: it doesn't mention data prerequisites (e.g., wind data required for wind_force filters) or edge cases like missing values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 18 parameters are documented in the Args section with descriptions that add meaning beyond schema names. Some descriptions are brief (e.g., 'nationality' lacks code format), but overall they clarify usage significantly. The 0% schema coverage is fully compensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Compare sailing speed distributions between two time periods.' It specifies the statistical method (Mann-Whitney U test) and effect size (Cohen's d), and differentiates from sibling tool maritime_did_speed_test via tips.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context through a 'Tips' section, advising when to use aggregate_by='voyage' for independent samples, and mentions an alternative tool (maritime_did_speed_test). However, it does not explicitly state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| group1_start | Yes | ||
| group1_end | Yes | ||
| group2_start | Yes | ||
| group2_end | Yes | ||
| rank | No | ||
| origin | No | ||
| source | No | musters | |
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full burden. It discloses that the tool calculates mean and median wage differences, uses two data sources with specific time ranges, and reports a percentage difference. It also mentions that the origin filter is only effective with MDB records. It does not describe error handling or data availability scenarios, but overall it covers key behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized with a clear front-loaded purpose. It uses bullet points for parameters and tips, making it scannable. A few sentences could be trimmed, but overall it is efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no output schema, and no annotations, the description covers the tool's functionality, parameters, return format, and usage tips. It explains the data sources and filter limitations. It lacks details on error cases or extreme inputs, but provides enough for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must describe each parameter. It does so by listing each argument with a brief explanation (e.g., 'group1_start: Start year for first comparison group'). It also provides defaults and tips for source and output_mode, adding meaning beyond the schema's type information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool compares crew wage distributions between two time periods, calculates mean and median wages, and reports percentage difference. It distinguishes itself from sibling tools like maritime_compare_speed_groups by focusing on wages. The verb 'compare' and resource 'wage distributions' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides tips for LLMs on data source selection and filter constraints (e.g., origin only works with source='crews'). However, it does not explicitly state when to use this tool over alternatives like maritime_crew_demographics or search_crew. It gives clear context for usage but lacks exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | Yes | ||
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the algorithm (haversine distance, speed in km/day), default filters (min_speed=5, max_speed=400), and typical speed ranges for sailing ships. No annotations provided, but description adequately informs behavior, though could explicitly state read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections: overview, Args, Returns, Tips. Informative but slightly lengthy; every sentence adds value, though some redundancy could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers parameter semantics, algorithm, output format, and usage tips. Lacks explanation of error handling or edge cases, but sufficient for a computation tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description includes a detailed 'Args' section explaining each parameter's meaning, defaults, and constraints (e.g., 'min_speed_km_day: filters out anchored/drifting'). Adds significant value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it 'Compute daily sailing speeds for a single CLIWOC voyage' using haversine distance, distinguishing from sibling 'maritime_aggregate_track_speeds' for bulk analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Get voyage_id from maritime_search_tracks results', 'Use lat/lon bounds to focus on a specific ocean region', and mentions alternative 'maritime_aggregate_track_speeds for bulk analysis'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| origin | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and explains the search, grouping, reconstruction process, output format options (json/text), and result fields (ranks_held, career_span_years, final_fate, voyage details). It does not mention rate limits or edge cases but is sufficiently transparent for safe use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured starting with purpose, then process, then parameters, then tips. Every sentence provides valuable information without redundancy. It is concise yet comprehensive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, no output schema, and no annotations, the description is remarkably complete: it explains the overall behavior, parameter details, return format, and practical usage tips. No important aspect is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, which it does thoroughly: name (substring, case-insensitive), origin (optional, exact match, disambiguate), output_mode (json default or text). This adds substantial meaning beyond the basic schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reconstructs career history for crew members by name, which distinguishes it from sibling tools like maritime_search_crew (just search) and maritime_get_crew_member (single member). It specifies the action (reconstruct, searches, groups, reconstructs), resource (VOC Opvarenden dataset), and scope (chronological career).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides tips on when to use origin to disambiguate and what fields to look at, but does not explicitly state when to use this tool versus alternatives like maritime_search_crew or maritime_get_crew_member. It implies usage context but lacks explicit when-not or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | rank | |
| date_range | No | ||
| rank | No | ||
| origin | No | ||
| fate | No | ||
| ship_name | No | ||
| top_n | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the tool as analyzing and showing distributions, implying a read-only operation. However, it does not explicitly state that no data is modified or disclose any potential side effects or limitations. The context makes the behavior clear, but there is room for explicit safety statements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary line, dataset context, detailed Args list, and tips. It is concise yet thorough, with no extraneous information. The Args list is slightly long but necessary for clarity, earning a high but not perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 8 parameters and no output schema, the description explains the output as 'JSON or text with demographic breakdown' and mentions 'fate sub-distribution'. However, it does not specify the exact structure or edge cases, leaving some ambiguity for the agent. More details on output format would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description provides detailed explanations for all 8 parameters in the Args section, including defaults and examples. It goes beyond schema by giving concrete usage tips and expected values, fully compensating for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear verb ('Aggregate') and resource ('crew demographics'), and specifies the grouping dimensions (rank, origin, fate, decade, ship). This distinguishes it from sibling tools like maritime_crew_career or search_crew, which focus on individual records or different analyses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section provides explicit guidance on when to use each group_by option and how to combine filters, e.g., using group_by='decade' for trends or combining rank and decade for sailor recruitment. While it does not explicitly mention when not to use the tool, the tips are clear and practical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | rank | |
| date_range | No | ||
| rank | No | ||
| origin | No | ||
| top_n | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description transparently explains that rates are computed from service_end_reason and defines survival/mortality/desertion rates. It also clarifies that rates are per 100 crew with known fate. No destructive behavior is implied, and the tool appears safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a clear main sentence, followed by Args, Returns, and Tips sections. Every sentence adds useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all key aspects: purpose, data source, parameters, output format, and interpretive tips. No output schema exists, but the returns section explains the format. It could mention error handling or edge cases, but overall it's sufficiently complete for a six-parameter, no-enum tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the 'Args' section fully describes each parameter, including allowed values for group_by, date_range format example, substring filtering for rank/origin, default for top_n, and output_mode options. This significantly exceeds the schema's value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it analyzes survival, mortality, and desertion rates for VOC crews from the Opvarenden dataset, with specific grouping options. This distinguishes it from sibling tools like maritime_crew_demographics or maritime_crew_career.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section provides concrete examples of when to use different group_by values (e.g., 'group_by='rank' reveals which ranks had highest mortality'), offering good usage guidance. However, it does not explicitly state when not to use this tool or compare it to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| period1_years | Yes | ||
| period2_years | Yes | ||
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| nationality | No | ||
| month_start | No | ||
| month_end | No | ||
| aggregate_by | No | voyage | |
| n_bootstrap | No | ||
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| wind_force_min | No | ||
| wind_force_max | No | ||
| exclude_years | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses DiD formula, bootstrap resampling, aggregation rationale, and default parameters. No annotations provided, so description carries behavioral burden well. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections, formula, and LLM tips. Slightly verbose in parameter descriptions (some redundancy with schema defaults), but overall efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully covers purpose, methodology, all parameters, return format (4-cell summary, marginal diffs, DiD estimate, bootstrap CI, p-value), and interpretation. No output schema, but description compensates completely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, description thoroughly explains all 17 parameters, including defaults, formats (e.g., 'YYYY/YYYY' range), examples (lat_min=-50 for Roaring Forties), and usage guidance (wind_force_min/max for Beaufort-stratified DiD).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it's a 'Formal 2x2 Difference-in-Differences test: direction x period' and explains what it measures (difference between eastbound and westbound speeds over two periods). Distinct from sibling tools like maritime_compare_speed_groups or maritime_wind_direction_by_year.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides tips for LLMs on when to use (e.g., wind change analysis), how to interpret results (positive DiD = wind strengthened), and defaults (aggregate_by='voyage'). Doesn't explicitly mention alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| route_id | Yes | ||
| departure_date | Yes | ||
| target_date | Yes | ||
| use_speed_profiles | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description explains interpolation method, typical sailing times, confidence levels, and limitations (weather, ship condition). Sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections: description, Args, Returns, Tips. Every sentence adds value; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensive for a tool with no output schema or annotations. Explains return values, confidence levels, and suggests related tools. Covers all necessary information for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description includes an 'Args' section that explains every parameter in detail. Also provides tips for LLMs on how to choose route_id and get departure_date.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it estimates a ship's position on a specific date using linear interpolation. Distinguishes from siblings like maritime_assess_position and maritime_get_track.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit tips on when to use (investigating wreck locations) and how to get inputs (via maritime_get_voyage, maritime_list_routes). Mentions combining with maritime_assess_position, but does not explicitly state when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| wreck_ids | No | ||
| region | No | ||
| status | No | ||
| archive | No | ||
| include_uncertainty | No | ||
| include_voyage_data | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given no annotations, the description carries full burden. It discloses that it creates a GeoJSON document with WGS84 coordinates, explains properties added by booleans, and notes output formats. It does not mention potential errors, rate limits, or performance implications, but for a read-only export tool, it provides sufficient behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections, but includes a 'Tips for LLMs' section that partly repeats information from the Args. It is fairly concise for the level of detail, earning a slightly above-average score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 7 parameters and no output schema, the description covers all parameter functionality, explains the return format (GeoJSON FeatureCollection with count), and provides usage context. It is comprehensive enough for an agent to use the tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description fully compensates by explaining each parameter's purpose and options (e.g., region list, status options, default values for booleans, output_mode choices). This adds significant meaning beyond the bare JSON schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it exports wreck positions as a GeoJSON FeatureCollection. This distinguishes it from sibling tools like search_wrecks (list/search) and get_wreck (single wreck details), as it specifically creates a GIS-ready format.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit tips on using specific parameters (wreck_ids, region, status) and explains the benefits of include_uncertainty and include_voyage_data. However, it does not explicitly contrast with alternative tools like maritime_search_wrecks or maritime_get_wreck, leaving some ambiguity for when to use this export tool vs. other data retrieval methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| nationality | No | ||
| year_start | No | ||
| year_end | No | ||
| direction | No | ||
| month_start | No | ||
| month_end | No | ||
| aggregate_by | No | voyage | |
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| wind_force_min | No | ||
| wind_force_max | No | ||
| max_results | No | ||
| offset | No | ||
| fields | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool returns raw speed records with full metadata, supports pagination (max_results, offset, next_offset), and offers different aggregation modes. It does not mention potential side effects (e.g., no destructive actions), but the non-destructive nature is clear. Some additional details like rate limits are missing, but overall transparency is high.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, Tips for LLMs) and front-loads the purpose. While it is lengthy due to comprehensive parameter explanations and usage tips, each sentence adds value. The structure aids readability, but some trimming of redundant tips (e.g., multiple examples of pagination) could improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (19 parameters, no output schema, no annotations), the description is remarkably complete. It covers all parameters, explains return formats (JSON, text, CSV), pagination mechanism, and provides concrete analysis examples. The absence of an output schema is compensated by a clear description of returned fields for each mode. The description leaves little ambiguity for an AI agent to select and use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% parameter coverage (no descriptions), but the description provides extensive semantics for all 19 parameters. It explains each parameter's purpose, default values, and usage tips (e.g., 'aggregate_by: "voyage" (one mean speed per voyage, recommended for statistical independence)'). It also clarifies the 'fields' parameter with a detailed list of available fields for different aggregation modes. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'export' and clearly identifies the resource as 'raw speed samples'. It explicitly distinguishes from the sibling tool 'maritime_aggregate_track_speeds', stating 'Unlike... which groups and summarises, this tool returns the underlying data.' This provides a specific verb+resource and differentiates from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Essential for analyses requiring non-contiguous year comparisons... ENJO phase classification, volcanic event detection'. It also provides 'Tips for LLMs' with concrete scenarios (e.g., tidal analysis, Laki 1783) and recommendations on output_mode, fields, and pagination. This fully guides when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| trade_direction | No | ||
| year_start | No | ||
| year_end | No | ||
| fate | No | ||
| max_results | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It discloses the return type (per-voyage transit days with summary statistics), data completeness (213 of 250 voyages have complete data), and typical values (mean and std). No destructive behavior is implied; it reads as read-only. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively long but well-structured with clear sections (description, args, returns, tips). Each sentence adds value, though some tips might be considered extra. It is front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is fairly complete. It covers purpose, parameters, return format, and usage guidelines. It could mention error handling or output format details more, but it is sufficient for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description fully compensates by explaining each parameter in the 'Args' block, including purpose, examples, and constraints (e.g., default values, direction-specific details). This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it computes transit times for Manila Galleon voyages, with a specific verb 'Compute' and resource 'transit times'. It distinguishes from siblings by focusing on galleon voyages and ENSO proxy, which is unique among the maritime tools listed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use the tool (e.g., 'Use trade_direction="eastbound" for ENSO analysis') and offers tips for LLMs. However, it does not explicitly state when not to use the tool or name alternative sibling tools for similar tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| archive_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It clearly states this is a read operation retrieving metadata, specifies the return format (JSON or text), and lists the content. No side effects are implied. A small gap is that it doesn't explicitly state that it does not modify data, but given the context it's clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line purpose, bulleted list of returned info, parameter descriptions, return format, and a dedicated tips section. Every sentence adds value, and it is front-loaded with the key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains what is returned (organisation, coverage period, etc.). It also provides tips for usage and archive meanings, making it complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions (0% coverage), so the description must compensate. It does so by explaining that archive_id takes values like das, voc_crew, voc_cargo, maarer, and that output_mode defaults to 'json'. This adds essential meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Get detailed metadata for a specific maritime archive' and lists the specific metadata fields returned (organisation, coverage period, record types, etc.), making the purpose clear and distinct from sibling tools like maritime_list_archives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section provides explicit guidance: use maritime_list_archives first to see valid IDs, and explains the purpose of each archive. This helps the agent decide when to use this tool and what parameters to supply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses returns (fields like commodity, quantity, unit, value in guilders), output modes (json/text), currency denomination, archival date ranges, and the fact that not all voyages have records. This fully compensates for missing annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a concise summary, bullet-point return values, clear Args and Returns sections, and a separate Tips block. Every sentence adds value without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, parameters, returns, usage workflow, and historical context. For a tool with no output schema and two parameters, it leaves no gaps in understanding how to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description adds essential meaning: voyage_id connects to search results or DAS ID, output_mode has default 'json' and alternative 'text'. This fully explains the parameters beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get the full cargo manifest') and the resource ('for a specific voyage'), distinguishing it from sibling tools like maritime_get_wreck or maritime_get_voyage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section explicitly advises to use maritime_search_voyages first and suggests combining with maritime_get_wreck, along with notes on archival coverage. This provides clear when-to-use and contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| crew_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description compensates by listing returned fields (name, rank, origin, etc.), explaining pay units (guilders) and meaning of fate values (survived, died_voyage, etc.). It does not mention side effects, but as a read operation, it is adequately transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections and front-loaded purpose, but includes some repetition (e.g., listing fields in both the initial sentence and the return explanation). Every sentence adds value, but could be slightly more compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter tool with no output schema, the description covers all aspects: parameters, return data fields, units, and cross-reference suggestions. It is fully self-contained for the agent to use effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description adds full meaning: crew_id is 'Crew member identifier (from search results)' and output_mode options are explained ('json' or 'text'). It also provides domain knowledge about pay and fate constants, far exceeding baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get full details for a specific crew member' with a specific verb and resource. It distinguishes itself from sibling tools like maritime_search_crew which is for finding IDs, and other 'get' tools by focusing on crew members.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use maritime_search_crew first to obtain crew_id, and suggests cross-referencing with maritime_get_voyage for full context. It also explains the output_mode parameter options, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| ship_type | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description explains it's a retrieval operation returning hull profile data. Does not explicitly state idempotent/read-only, but is implied. Adds context on returned fields and purpose, though could mention no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections: description, args, returns, tips. No redundant sentences, front-loaded with key info, efficiently covers all needed aspects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema or annotations, description covers purpose, parameters, return content, and usage tips. Domain-specific advice makes it complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has no enums and 0% coverage. Description adds full parameter details: lists allowed ship_type values and output_mode options (json/text), exceeding schema info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Get hydrodynamic hull profile for a VOC ship type' with specific fields listed. Distinguishes from sibling 'maritime_list_hull_profiles' which lists types, while this retrieves the profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit tips: use with maritime_list_hull_profiles to see types, essential for drift modelling, notes retourschip as most common. Tells when to use and references sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| muster_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Describes returned data fields (ranks_summary, total_european, etc.) and output modes, but lacks error handling or prerequisite details. Overall good behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-organized with sections (summary, details, Args, Returns, Tips) but slightly verbose. Every sentence adds value, though 'Tips for LLMs' could be integrated into main text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and sibling tools (search_musters, get_voyage, etc.), description covers what is returned, how to use, and related actions. Lacks mention of error handling or edge cases, but sufficient for a get-by-id tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description adds meaning: gives an example for muster_id ('dss_muster:0001') and explains output_mode default. Compensates well for missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Get full details for a specific ship muster record.' and distinguishes from sibling tools like maritime_search_musters, which are used to find the muster_id first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit tips: use maritime_search_musters to find muster_id, compares with maritime_search_crew for related data, and suggests using maritime_get_voyage if das_voyage_id is set. Clearly tells when to use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| route_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool returns waypoints with coordinates, durations, hazards, and seasonal notes, and the tips add behavioral details about cumulative_days and stop_days. However, it does not mention potential side effects, permissions, or error scenarios, which for a read-only data retrieval tool is acceptable but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into summary, return description, args, return specification, and tips. Each sentence adds value without redundancy. It is appropriately concise for the amount of information needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description must explain the return format. It does so adequately, listing included fields. The tips provide additional context about waypoint structure. Minor omissions: no mention of error responses or handling invalid route_ids, but overall complete for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates excellently by listing all valid route_id values grouped by company and route, explaining the output_mode parameter with defaults. This adds significant meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool retrieves full details of a historical sailing route, specifying verb+resource+scope. The description distinguishes it from siblings like maritime_list_routes (list only) and maritime_estimate_position (position estimation) by focusing on comprehensive route details including waypoints, hazards, and seasonal notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section provides explicit guidance on complementary tools (maritime_lookup_location, maritime_estimate_position) and how to use the output for further analysis. However, it does not explicitly state when not to use this tool or contrast it with all siblings, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| route_id | Yes | ||
| departure_month | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description partially bears the burden. It discloses data source (CLIWOC) and output details but omits side effects, auth requirements, or rate limits. The description implies read-only behavior but doesn't confirm it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with summary, Args, Returns, and Tips sections. It front-loads the core purpose. While comprehensive, it could be slightly more concise without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and three parameters, the description is fully complete: it explains output format (JSON/text), lists return fields (mean_km_day, std_dev, sample_count) in tips, and covers all inputs. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description fully compensates by detailing each parameter: route_id usage, departure_month as optional filter, output_mode with default and examples. It adds significant meaning beyond the schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets historical sailing speed statistics for a route, including specific metrics (mean, median, std dev) and optional seasonal filtering. It effectively distinguishes the tool from siblings by focusing on route-level speed profiles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides tips for LLMs on comparing months and using with other tools, implying appropriate use cases. However, it does not explicitly state when not to use this tool or contrast it with alternatives like maritime_aggregate_track_speeds.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| archive | No | ||
| date_range | No | ||
| group_by | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on the full burden. It explains the tool computes summary statistics and lists the breakdowns in the response (losses_by_region, losses_by_cause, etc.), but does not disclose potential side effects, rate limits, or authentication needs. It accurately describes the read-only nature implicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening, bullet-like lists for computed statistics and parameters, and dedicated tips. Though somewhat lengthy, every section adds value and no information is redundant. It could be slightly shortened but remains effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (4 parameters, no output schema), the description is complete. It covers what the tool does, what parameters mean, and what the response contains. Tips for LLMs provide actionable guidance (e.g., comparing decades or regions). No missing critical information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet the description provides detailed explanations for all 4 parameters: archive (default all), date_range (format YYYY/YYYY, default 1595-1795), group_by (reserved), output_mode (json or text, default json). Tips further illustrate usage (e.g., 'Use date_range to focus statistics'). This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get aggregate statistics across maritime archives' and specifies it computes summary statistics for VOC shipping losses. This differentiates it from sibling tools that focus on individual records or specific aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for aggregate summaries rather than detailed records, but it does not explicitly state when to use this tool versus alternatives like maritime_search_vessels or maritime_get_voyage. No exclusion criteria or alternative tools are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | Yes | ||
| include_positions | No | ||
| max_positions | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It reveals that events combine multiple archives, may have conflicting dates, that include_positions can add many events, and that output includes geojson LineString. Nearly comprehensive, though lacks mention of read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with headings (first sentence, paragraph, Args, Returns, Tips for LLMs). Approximately 150 words, no redundancy. Could be slightly more compact, but is clear and organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, parameters, output format, and data sources. Tips provide practical advice. Lacks error handling details or ordering criteria, but overall complete for a complex tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but description compensates fully with an Args section explaining each parameter: voyage_id with example, include_positions with default and effect, max_positions with default, output_mode with format options.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description starts with 'Build a chronological timeline of events for a voyage.' which is a specific verb+resource. It distinguishes from sibling 'maritime_get_voyage_full' by stating it returns non-chronological linked data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (chronological timeline) and when-not (non-chronological linked data). Tips for LLMs offer practical usage guidance: start with include_positions=False, then set True for detailed track.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It explains return structure (dated lat/lon positions daily), data nature (logbook readings, gaps), and accuracy (±20-50km). Does not explicitly state read-only, but 'get' implies it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with sections, concise yet informative. Every sentence adds value, including tips for LLMs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters and no output schema, description covers return type, data frequency, and accuracy. Could mention if dates are included explicitly, but 'dated lat/lon positions' suffices.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description explains voyage_id as integer from search results and output_mode with default and options, adding meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'Get' and resource 'full position history for a CLIWOC voyage', clearly distinguishing from sibling tools like maritime_search_tracks and maritime_export_geojson.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context via tips: get voyage_id from search, positions are daily, gaps indicate missing entries, combine with export. Lacks explicit when-not-to-use but covers prerequisites and application.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| vessel_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations were provided, so the description bears full responsibility. It clearly describes the tool as a retrieval operation returning vessel details, with no mention of side effects or destructive actions. While it doesn't explicitly state 'read-only', the description implies it. Additional context on rate limits or auth would improve transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for Args, Returns, and Tips. It is slightly verbose (e.g., 'Tips for LLMs' heading) but each sentence adds value. Could be tightened while retaining clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain return values. It lists the fields included in the full vessel record and mentions JSON or text formats. Tips help integrate with other tools. Some detail about the structure of the record would enhance completeness, but it's adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It provides detailed explanations for both parameters: vessel_id as an identifier from search results, and output_mode with 'json' (default) or 'text'. This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it 'Get full details for a specific vessel' and lists the fields returned (name, type, tonnage, etc.), clearly distinguishing it from search tools like maritime_search_vessels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes specific guidance: use maritime_search_vessels first to find vessel_id, and provides cross-references to maritime_get_hull_profile and maritime_search_voyages with context on when to use them. It also explains tonnage units.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses that incident details are included if the voyage ended in shipwreck, adding useful behavioral context. However, it does not mention any potential side effects or authentication requirements, but for a read operation this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, front-loaded with the main purpose, and structured with tips in a bullet-like list. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 parameters, no output schema), the description fully covers what the tool does, what it returns, and how to use it. It also guides the agent to related tools, ensuring complete contextual guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully explains both parameters: voyage_id's source (search results or DAS ID) and output_mode's values (json or text). This adds meaning far beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get full details for a specific voyage' and enumerates what the response includes (ship info, captain, route, dates, fate, incident details), distinguishing it from sibling tools like maritime_search_voyages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states that the voyage must be found by a prior maritime_search_voyages call or specified by DAS identifier, and provides tips for further exploration with other tools. This gives clear when-to-use and how-to-chain instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | Yes | ||
| include_crew | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description discloses behavioral traits: returns enriched data with confidence scores, optional crew inclusion, and output format choices. It does not mention mutability or safety, but read-only nature is implied by 'get'. Sufficient transparency for tool selection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args, Returns, and Tips sections. It is informative but could be slightly more concise; for example, the Tips section repeats some info. Still efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a unified view with multiple linked records, the description covers key aspects: what is returned, how confidence works, and optional crew. Missing exact output structure but sufficient for an agent to understand capabilities.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully explains each parameter: voyage_id with examples, include_crew with effect, output_mode with options. It adds context beyond schema (e.g., confidence interpretation, link fields). This compensates for missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a unified voyage view with all linked records, distinguishing it from sibling tools like get_voyage, get_wreck, etc. It specifies what is included (wreck, vessel, hull profile, CLIWOC track, crew) and provides a specific action verb 'get unified view'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: start with maritime_search_voyages, and notes this tool replaces separate calls. It provides tips on include_crew and confidence scores, and mentions cross-referencing. This is comprehensive guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| wreck_id | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden; it discloses that the tool returns a complete record and lists output fields. It could explicitly state it is read-only, but the 'Get' verb implies no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with clear sections (purpose, content list, args, returns, tips) and front-loaded. Slightly verbose but every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and 0% schema coverage, the description covers the return contents, parameters, prerequisites, and suggests follow-up actions. Could mention error handling or limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description adds necessary meaning: it explains wreck_id comes from search results and output_mode determines format, compensating for the schema's lack of documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get full details for a specific wreck record' and lists included fields, differentiating it from sibling tools like maritime_search_wrecks (which returns summaries) and other get tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tips for LLMs' section explicitly advises using maritime_search_wrecks first to obtain the wreck_id, and suggests complementary tools (assess_position, export_geojson, get_voyage), providing a clear workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses that the tool returns metadata without side effects. It provides tips for usage. However, it could mention any potential limitations (e.g., number of archives) or whether the output is always a list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured with a summary, arguments, returns, and tips. Every sentence adds value, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one optional parameter, no output schema, no annotations), the description is thoroughly complete. It covers purpose, parameters, return format, and practical usage advice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema coverage is 0%, so the description's 'Args' section is essential. It explains the output_mode parameter's meaning and default, adding value beyond the schema. The parameter is simple and well-described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all available maritime archives, providing specific metadata fields and distinguishing it from many sibling tools. It includes a clear verb ('List') and resource ('archives').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises to call this first and suggests using maritime_capabilities for an overview. It gives context on archive IDs and their contents, implicitly guiding when to use this tool. However, it lacks explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses return format options (JSON or text) and the nature of output (VOC ship type identifiers). With no annotations, this covers essential behavior for a simple list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with main purpose, args, returns, and tips. Front-loaded and efficient, though the Arg/Return sections could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a simple list tool with one optional parameter: explains purpose, usage, return details, and provides common examples. Does not need output schema as return is self-explanatory.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema_description_coverage, the description explains the output_mode parameter's values and default, compensating fully for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists available ship types with hull profiles, using specific verbs ('List', 'Returns') and distinguishes itself from sibling maritime_get_hull_profile by explicitly recommending prior use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit instruction to use before calling maritime_get_hull_profile and lists common ship types. However, does not mention when not to use or alternative tools beyond the one get function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| region | No | ||
| location_type | No | ||
| max_results | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden and discloses important behaviors: returns a list with coordinates and region classifications, uses case-insensitive substring match for query, supports JSON or text output. It also notes the default max_results. While it doesn't detail auth or performance, it sufficiently describes the core behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (overview, Args, Returns, Tips) and each sentence adds value. It is slightly longer but not wasteful, as the tips provide actionable guidance. Could be slightly more concise by integrating some tips into the main description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters, no output schema, and no annotations, the description is comprehensive. It covers purpose, all parameters with options, return format, and usage strategies. The tips section further enhances completeness by showing the agent how to effectively use the tool in context with sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description compensates with a detailed 'Args' section, listing each parameter, its purpose, and options (e.g., region values, location_type options, defaults). This adds significant meaning beyond the schema structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches or browses a VOC historical gazetteer, returns locations with coordinates and region classifications. It distinguishes itself from the sibling 'maritime_lookup_location', which is for full details on a specific place, by focusing on listing/browsing with filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool, including tips for LLMs such as calling without filters to see all locations, using region and location_type filters, and following up with maritime_lookup_location. However, it does not explicitly state when not to use it or compare to other siblings beyond the one mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | ||
| departure_port | No | ||
| destination_port | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains that the tool lists routes, covers specific historical types, and returns summaries with durations. It does not mention any side effects, rate limits, or permissions, but for a read-only listing tool, this is sufficient. The description does not contradict any annotations (none provided).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a brief intro, parameter details in a clear bullet-like format, and a tips section. It is concise but contains all necessary information. Minor redundancy (route types listed twice) prevents a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (list command, no output schema, 4 optional parameters), the description is complete. It explains what is returned, provides parameter usage examples, and suggests follow-up tools. The low schema coverage is fully compensated by the detailed parameter descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 4 parameters with no descriptions (0% coverage). The description compensates fully by detailing each parameter: direction with possible values, departure_port and destination_port as substring matches, and output_mode with 'json' (default) or 'text'. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List available historical sailing routes.' It specifies the types of routes covered (VOC, EIC, Carreira da India, etc.) and what is returned (summaries with typical durations). This distinguishes it from sibling tools that focus on tracks, vessels, or crew.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a 'Tips for LLMs' section that provides explicit usage guidance: use direction='outward' for Europe-to-Asia routes, use departure_port and destination_port to find specific routes, and suggests follow-ups with maritime_get_route and maritime_estimate_position. This helps the agent decide when to use this tool and what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses automatic handling of historical spellings, approximate coordinates, and output formats. However, it does not mention side effects, rate limits, or authentication needs, which would push it to 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, Tips). It is concise, every sentence adds value, and the tips section is particularly useful without being verbose. Front-loaded with the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains the return format (JSON or text with coordinates, region, historical notes). It also contextualizes integration with other tools. For a lookup tool with two parameters, this is complete and falls within expected complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'name' parameter with concrete examples ('Batavia', 'Texel') and notes historical Dutch support. The 'output_mode' parameter is described with default and two values. This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it looks up historical place names in the VOC gazetteer, returning coordinates, region, and historical context. It uses specific verbs and resources, and differentiates from sibling tools like maritime_list_locations and maritime_assess_position via the tips section.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool: after reading a voyage's 'particulars' field for geocoding. It also suggests alternatives (maritime_list_locations to browse places, maritime_assess_position for position accuracy evaluation), giving clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | ||
| lon | Yes | ||
| date | Yes | ||
| radius_km | No | ||
| max_results | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses behavioral traits well: searches 'all CLIWOC logbook positions for the specified date', notes the coverage years (1662-1855), that earlier dates have fewer records, and that results include distance_km and matching position. It does not contradict any annotations (none present).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a brief overview, a clear Args section, and a list of tips. Every sentence adds value, no redundancy. Front-loaded with purpose and context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and no annotations, the description is highly complete. It explains the data source (CLIWOC 1662-1855), how to adjust for sparsity, date handling, output format (JSON or text with distance_km), and even suggests combinatory usage. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning no parameter descriptions in the schema. The description compensates fully with an 'Args' section that explains each parameter (lat, lon, date, radius_km, max_results, output_mode), including defaults and format. This adds essential meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Find ships near a given position on a given date.' It specifies the resource (CLIWOC logbook positions) and verb (find, searches, returns), and distinguishes from sibling tools like maritime_search_tracks by focusing on proximity to a point. No ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'Useful for finding what other ships were in an area when a wreck or incident occurred.' It includes tips such as increasing radius if no results, using exact date format, trying adjacent dates, and combining with maritime_assess_position. However, it does not explicitly state when not to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | No | ||
| commodity | No | ||
| origin | No | ||
| destination | No | ||
| date_range | No | ||
| min_value | No | ||
| archive | No | ||
| max_results | No | ||
| cursor | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses key behavioral traits: all parameters optional, AND logic, cursor-based pagination, response format options, default and max values. Lacks mention of auth or rate limits, but search tool context mitigates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (description, args, returns, tips). Every sentence is informative, no redundancy. Efficiently packed with necessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all 10 parameters, pagination, response format, example commodities, and cross-references sibling tool. No missing context given lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, but the description's Args section adds rich meaning: date_range format, min_value unit (guilders), archive default, cursor usage, output_mode options. Fully compensates for lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for VOC cargo records' and specifies the database (BGB) and time period (1700-1795). It distinguishes from sibling maritime_get_cargo_manifest by noting that alternative should be used for a full list on a specific voyage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit tips for LLMs, including when to use each parameter, combination with maritime_search_voyages, and when to use an alternative tool (maritime_get_cargo_manifest). Also notes that all parameters are optional and combined with AND logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| rank | No | ||
| ship_name | No | ||
| voyage_id | No | ||
| origin | No | ||
| date_range | No | ||
| fate | No | ||
| archive | No | ||
| max_results | No | ||
| cursor | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully carries disclosure. It reveals querying multiple archives, default vs. alternate, pagination with cursor, output modes, and historical spelling. Lacks details on rate limits or authentication, but covers core behavior well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is long but well-structured with Args and Tips sections. Main purpose and usage are front-loaded. Some redundancy in Tips (e.g., archive again), but overall efficient given parameter count.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 11 parameters, no annotations, and no output schema, the description is comprehensive. Covers pagination, output formats, cross-referencing with other tools, and historical context, making it fully actionable for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% coverage, so description adds all meaning. Args section explains each of 11 parameters, including allowed values for fate, archive, max_results default, and cursor usage. This fully compensates for missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Search for crew members' verb+resource. Additionally contrasts with sibling maritime_get_crew_member for follow-up, and lists many sibling tools that are distinct, so no confusion with other search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use for each parameter (e.g., voyage_id for full crew, fate filter for survival analysis), archive selection by era, and tips for LLMs on pagination and cross-references. Implicitly warns against using without filters via default behavior (VOC archive).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| ship_name | No | ||
| captain | No | ||
| date_range | No | ||
| location | No | ||
| das_voyage_id | No | ||
| year_start | No | ||
| year_end | No | ||
| max_results | No | ||
| cursor | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It describes the search functionality and parameters, and mentions pagination and output modes, but does not explicitly disclose behavioral traits such as read-only nature, rate limits, or authentication requirements. The search implies read-only, but lacks explicit confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with a clear one-line summary, followed by database context, a detailed parameter list, return description, and usage tips. Every sentence serves a purpose, and the critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 10 parameters with no required fields and no output schema, the description covers all parameters and hints at the return structure (matching muster records and pagination metadata). The tips provide guidance for effective use with sibling tools, making it complete for an LLM to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides meaningful explanations for all 10 parameters, including defaults and maximums for max_results, and practical notes for each (e.g., case-insensitive for ship_name, format for date_range). This adds significant value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches GZMVOC ship-level muster records from Asian waters, specifying the database and time period. It distinguishes from sibling tools like maritime_get_muster and maritime_compare_wages, and mentions complementing VOC Opvarenden.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit tips for LLMs on when to use location, year_start/year_end filters, and cross-linking with das_voyage_id. It also suggests follow-ups with maritime_get_muster and maritime_compare_wages, but does not explicitly state when not to use this tool or alternatives beyond those mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| record_type | No | ||
| archive | No | ||
| max_results | No | ||
| cursor | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavioral details: AND logic, exact phrase matching, relevance ranking, pagination via cursor, and output formats. No behavioral surprises.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections and front-loaded purpose, but it is somewhat verbose with LLM tips and examples. Could be trimmed slightly without loss of clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no output schema, the description covers all aspects: usage, behavior, parameters, pagination, and return format. It is sufficiently complete for an LLM to use effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage (by context signals), the description includes an Args section explaining each parameter with examples (e.g., 'monsoon', 'Cape of Good Hope', archive IDs, max_results limits, cursor usage). This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches free-text narrative content across maritime archives, with specific fields listed. It distinguishes from sibling tools that focus on structured data (e.g., maritime_search_voyages, maritime_search_wrecks) by targeting narratives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed usage tips, including AND logic, quoted phrases, and result ranking. It suggests follow-up tools (maritime_get_voyage, maritime_get_wreck) but does not explicitly state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| nationality | No | ||
| year_start | No | ||
| year_end | No | ||
| ship_name | No | ||
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| max_results | No | ||
| cursor | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses cursor-based pagination, has_more/next_cursor fields, and that ship_name requires CLIWOC 2.1 Full data. It clearly indicates it is a read-only search operation. However, it does not mention authentication or rate limits, though these may not be applicable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections (summary, Args, Returns, Tips). It is front-loaded with the essential purpose. Some redundancy exists (e.g., the period is mentioned twice), but overall it is efficient and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (11 parameters, no output schema), the description is complete. It covers all parameters, pagination, return format, and provides tips on using filters and combining with other tools. It also clarifies data scope and limitations (CLIWOC period, nationality counts).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description fully compensates. It explains each parameter in detail, including nationality options, bounding box meaning (track must have at least one position in box), and pagination mechanics. This adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches historical ship tracks from the CLIWOC database (1662-1855), a specific verb and resource. It distinguishes from siblings by mentioning alternatives like maritime_get_track for full position data and maritime_nearby_tracks for nearby ships.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool (searching tracks with filters) and when to use alternatives (e.g., 'Follow up with maritime_get_track to get full position data' and 'Use maritime_nearby_tracks to find ships near a wreck site'). It also includes tips for effective use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| ship_type | No | ||
| built_range | No | ||
| shipyard | No | ||
| chamber | No | ||
| min_tonnage | No | ||
| max_tonnage | No | ||
| archive | No | ||
| max_results | No | ||
| cursor | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully bears the burden of behavioral disclosure. It accurately describes cursor-based pagination, optional parameters, and output formats. It does not mention destructive actions or rate limits, but those are not expected for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately lengthy but well-organized into sections (purpose, parameters, returns, tips). Although it includes a separate 'Tips for LLMs' section, every sentence adds value, and the structure aids readability. It earns a 4 rather than 5 due to slight verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (11 optional parameters, no required, no output schema), the description covers parameter semantics, pagination, and tips for chaining with other tools. The 'Returns' paragraph describes the general structure. It could be improved by including an example response, but it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must fully explain each parameter. It does so by detailing built_range format ('YYYY/YYYY'), enumerating chamber options, specifying defaults for max_results and output_mode, and explaining the cursor parameter. This adds significant value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for VOC vessels by name, type, or construction details,' with a specific verb and resource. It distinguishes itself from siblings like maritime_get_vessel and maritime_search_voyages by focusing on the search functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance, including 'All search parameters are optional and combined with AND logic,' and LLM tips that recommend when to use this tool versus alternatives (e.g., 'Follow up with maritime_get_vessel for full construction details'). It clearly states context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| ship_name | No | ||
| captain | No | ||
| date_range | No | ||
| departure_port | No | ||
| destination_port | No | ||
| route | No | ||
| fate | No | ||
| archive | No | ||
| max_results | No | ||
| cursor | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses that the tool queries multiple archives, uses AND logic, supports cursor pagination, and returns JSON or text. It also describes response fields like has_more and total_count. No destructive behavior is indicated, and no contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (intro, archives, args, returns, tips) and is front-loaded. While slightly long, it earns its length given the complexity of parameters and archives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, no annotations, and no output schema, the description covers all necessary information: parameter semantics, pagination, response structure, and usage tips. It feels complete for an LLM to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully documents all 11 parameters with formats, defaults, and allowed values (e.g., archive options, date range format, fate values). This exceeds the schema's bare types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches for maritime voyages matching criteria, lists multiple archives, and provides examples of usage. It distinguishes itself from sibling search tools (e.g., maritime_search_cargo) by focusing specifically on voyages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides tips for LLMs on how to narrow down searches and mentions following up with maritime_get_voyage for full details, implying when to use that tool. However, it does not explicitly compare to other search tools or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| ship_name | No | ||
| date_range | No | ||
| region | No | ||
| cause | No | ||
| status | No | ||
| min_depth_m | No | ||
| max_depth_m | No | ||
| min_cargo_value | No | ||
| flag | No | ||
| vessel_type | No | ||
| gp_quality | No | ||
| archive | No | ||
| max_results | No | ||
| cursor | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even without annotations, the description fully discloses behavior: all params optional with AND logic, cursor-based pagination, list of archives, default and max results, return format (JSON or text), and pagination metadata. It also notes that subsequent pages are obtained via cursor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for archives, arguments, returns, and tips. It is front-loaded with the main purpose and uses bullet-like format. While slightly long, each sentence provides value, making it efficient for an LLM to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 optional parameters, no output schema, and no annotations, the description is remarkably complete. It explains return values (pagination metadata, wreck records), lists all archives, and provides actionable tips for common use cases. No gap in essential information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description compensates for 0% schema description coverage by providing detailed parameter explanations (e.g., case-insensitive ship name, cause list, archive abbreviations, range formats). This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search for maritime shipwreck records across all archives' with a specific verb and resource. It distinguishes itself from sibling tools like maritime_search_vessels and maritime_search_tracks by focusing solely on wrecks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context for when to use the tool, including tips for LLMs (e.g., set status='unfound' to find unlooted wrecks) and suggests follow-up tools like maritime_get_wreck and maritime_export_geojson. However, it lacks explicit exclusions or when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| voyage_id | Yes | ||
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fully explains the behavioral traits: it computes tortuosity using a specific formula, compares distances, and returns specific fields (path_km, net_km, etc.). No annotations are provided, but the description carries the burden transparently.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with sections for overview, formula, args, returns, and tips. It is slightly verbose but front-loaded with the core purpose, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no output schema, and no annotations, the description is exceptionally complete: it explains the formula, return values, and provides practical tips for usage, leaving no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description includes an 'Args' section that documents all 8 parameters, adding context such as practical lat/lon ranges and default speed values, which goes beyond the schema alone. The schema coverage is effectively 100% in the description despite the indicator.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Compute route tortuosity for a single CLIWOC voyage.' using a specific verb and resource, and distinguishes from the sibling tool 'maritime_aggregate_track_tortuosity' for bulk analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit tips for LLMs on when to use specific lat/lon ranges and how to interpret tortuosity values, and mentions using 'maritime_aggregate_track_tortuosity' for bulk analysis, offering good alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| nationality | No | ||
| year_start | No | ||
| year_end | No | ||
| direction | No | ||
| month_start | No | ||
| month_end | No | ||
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full transparency burden. It discloses the return format (JSON or text), coverage (97.5%), and period (1662-1854), and explains behavioral traits like ENSO analysis. It lacks explicit mention of non-destructive nature, but the read-only intent is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but somewhat lengthy, with separate 'Args' and 'Tips' sections. It is well-structured and front-loaded with purpose, but could be more concise. However, every sentence adds value, so it earns a mid-range score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description explains return values ('per-year sector distributions') and provides extensive context on coverage, period, ENSO detection, and parameter usage. It fully compensates for missing annotations and schema details, making it complete for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description lists all 13 parameters with brief explanations (e.g., 'Bounding box filter', 'Year range filter'), adding meaning beyond the raw schema. While not exhaustive, it covers each parameter's role sufficiently for an AI agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns year-by-year wind direction distributions from CLIWOC logbooks, with a specific verb 'Returns' and resource '8-compass-sector wind direction distributions'. It distinguishes from siblings by focusing on wind direction and ENSO detection, a unique capability among the listed tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance in the 'Tips for LLMs' section, including when to use (e.g., for ENSO detection, trade wind analysis) and contextual constraints (e.g., 97.5% coverage, 1662-1854 period). It does not explicitly state when not to use or name alternative tools, but the tips effectively guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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
| Name | Required | Description | Default |
|---|---|---|---|
| lat_min | No | ||
| lat_max | No | ||
| lon_min | No | ||
| lon_max | No | ||
| nationality | No | ||
| year_start | No | ||
| year_end | No | ||
| direction | No | ||
| month_start | No | ||
| month_end | No | ||
| period1_years | No | ||
| period2_years | No | ||
| min_speed_km_day | No | ||
| max_speed_km_day | No | ||
| output_mode | No | json |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description comprehensively discloses behavior: it counts observations by Beaufort force and direction, optionally compares periods, includes distance calibration, and notes data availability percentages (97% direction, 17% Beaufort). It also explains the meaning of the ratio and that anchored positions are excluded. With no annotations provided, the description fully carries the behavioral burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat long but well-structured: overview, Args, Returns, and Tips. Information is front-loaded with the core purpose, and each section adds value. Minor verbosity, but no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters, no output schema, and no annotations, the description covers all parameters, explains return values (JSON or text with distributions and calibration), and provides usage tips. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description provides an 'Args' section explaining every parameter in detail, including types, defaults, and special formatting for periods. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides Beaufort wind force and wind direction distributions from CLIWOC logbooks, with optional period comparison and distance calibration. It distinguishes itself from related tools like maritime_wind_direction_by_year by its specific focus on distributions and calibration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given for using period1_years/period2_years to compare distributions, and tips for LLMs indicate when to use different features (e.g., wind direction available without Beaufort force). No negative exclusions are provided, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
47 tool updates
v0.2.11- First observed
maritime_aggregate_track_speeds - First observed
maritime_aggregate_track_tortuosity - First observed
maritime_assess_position - First observed
maritime_audit_links - First observed
maritime_capabilities - First observed
maritime_compare_speed_groups - First observed
maritime_compare_wages - First observed
maritime_compute_track_speeds - First observed
maritime_crew_career - First observed
maritime_crew_demographics - First observed
maritime_crew_survival_analysis - First observed
maritime_did_speed_test - First observed
maritime_estimate_position - First observed
maritime_export_geojson - First observed
maritime_export_speeds - First observed
maritime_galleon_transit_times - First observed
maritime_get_archive - First observed
maritime_get_cargo_manifest - First observed
maritime_get_crew_member - First observed
maritime_get_hull_profile - First observed
maritime_get_muster - First observed
maritime_get_route - First observed
maritime_get_speed_profile - First observed
maritime_get_statistics - First observed
maritime_get_timeline - First observed
maritime_get_track - First observed
maritime_get_vessel - First observed
maritime_get_voyage - First observed
maritime_get_voyage_full - First observed
maritime_get_wreck - First observed
maritime_list_archives - First observed
maritime_list_hull_profiles - First observed
maritime_list_locations - First observed
maritime_list_routes - First observed
maritime_lookup_location - First observed
maritime_nearby_tracks - First observed
maritime_search_cargo - First observed
maritime_search_crew - First observed
maritime_search_musters - First observed
maritime_search_narratives - First observed
maritime_search_tracks - First observed
maritime_search_vessels - First observed
maritime_search_voyages - First observed
maritime_search_wrecks - First observed
maritime_track_tortuosity - First observed
maritime_wind_direction_by_year - First observed
maritime_wind_rose
TDQS
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.
All tools follow a consistent 'maritime_verb_noun' pattern (e.g., maritime_search_voyages, maritime_aggregate_track_speeds). The naming is predictable and uniform.
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.
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Open Archives: Dutch genealogical records and historical page transcriptions.
MCP server giving AI agents one-connection access to supply-chain & logistics data: AIS vessel track
Search and discover 25,000+ MCP servers across all major registries. Connect and pay autonomously.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA fully MCP-compliant, open-source maritime data service that provides real-time vessel tracking, port information, route planning, and weather/tide data for maritime applications.14MIT
- FlicenseBqualityBmaintenanceAn 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.941-
- AlicenseAqualityCmaintenanceAn 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.4MIT
- AlicenseAqualityBmaintenanceRead-only MCP server for vessel identity lookup, AIS-style positions, tracks, port calls, carrier schedules, vessel schedules, and delay heuristics with source attribution and BYOK provider support.14584MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/IBM/chuk-mcp-maritime-archives'
If you have feedback or need assistance with the MCP directory API, please join our Discord server