mcp server
sailing-mcp
Remote MCP server for sailing navigation — wind/wave forecasts, tides, currents, marinas, bridge schedules and live AIS. Stateless, multi-tenant (users bring their own API keys).
Set up
Runs on your computer. Pick your agent and operating system.
Before you start
- Node.js 20 or newer
{
"mcpServers": {
"sailing-mcp": {
"command": "npx",
"args": [
"-y",
"sailing-mcp"
]
}
}
}same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12
Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs
README
synced Oct 26, 2026sailing-mcp
A remote MCP server for sailing navigation. It gives an AI assistant (Claude Desktop, Claude.ai, Claude Code, or any MCP client) a set of tools for wind & wave forecasts, tides, tidal currents, marinas, bridge schedules and live AIS vessel traffic — with a strong focus on Dutch / North Sea waters.
It is stateless and multi-tenant by design: every user passes their own provider API keys in the MCP URL, so a single deployment can serve many people without storing anyone's credentials. Tools that need a key only appear in the tool list when that key is present.
Tools
| Tool | Source | Key required |
|---|---|---|
sailing_forecast_openmeteo | Open-Meteo — ECMWF, GFS, ICON, UKMO, Météo-France, JMA + Marine waves + optional SST | – |
wind_consensus | Open-Meteo — many models side-by-side with min/max/spread | – |
metar_taf | aviationweather.gov — real airport observations & terminal forecasts | – |
sun_moon | Local calculation (SunCalc) — sunrise/sunset, twilights, moon phase | – |
tides_nl | RWS Matroos — HW/LW, astronomical, observed, forecast + surge, water temp (preferred for NL) | – |
tides_rws | RWS Waterinfo — observed water level (fallback) | – |
marinas_osm | OpenStreetMap / Overpass — marinas, harbours, yacht clubs, anchorages, fuel | – |
bridges_nl | NDW DATEX II — scheduled bridge openings (names via OSM) | – |
notices_nl | RWS / EU NtS — official Notices to Skippers, geo-filtered | – |
fairway_nl | RWS FIS WFS — fairway depths, bridge clearance (air draft), locks | – |
checklists | Built-in — charter check-in, crew safety briefing, pre-departure, heavy weather, charter check-out. Rendered as an interactive checklist (MCP Apps) in Claude and ChatGPT | – |
list_models | Built-in reference card (models, parameters, station codes) | – |
sailing_forecast / point_forecast | Windy Point Forecast | Windy |
tides_worldtides | WorldTides — global tide predictions | WorldTides |
currents_stormglass | Stormglass — multi-source tidal/ocean currents | Stormglass |
ais_traffic | AISStream — live vessel snapshot | AISStream |
URL format
The server speaks Streamable HTTP on /mcp. Pass each provider's key as a query parameter (all optional):
https://your-host/mcp?key=WINDY&worldtidesKey=WT&stormglassKey=SG&aisstreamKey=AIS
Accepted aliases:
| Provider | Query params | Headers |
|---|---|---|
| Windy | key, windyKey, apiKey | Authorization: Bearer …, X-Windy-Key, X-API-Key |
| WorldTides | worldtidesKey, wtKey | X-WorldTides-Key |
| Stormglass | stormglassKey, sgKey | X-Stormglass-Key |
| AISStream | aisstreamKey, aisKey | X-AISStream-Key |
Where to get keys: Windy · WorldTides · Stormglass · AISStream. All except Windy have a usable free tier; everything else works with no key at all.
Local run
npm install
npm run dev # tsx watch
# or
npm run build && npm start
Quick test:
curl -sS -X POST 'http://localhost:8787/mcp' \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Deploy on a VPS
The included Dockerfile builds a small Node 22 image listening on :8787. Two ways to front it with TLS:
Option A — Docker Compose + Caddy (self-contained)
cp .env.example .env
$EDITOR .env # set DOMAIN and ACME_EMAIL
docker compose up -d --build
Caddy obtains a Let's Encrypt certificate automatically and reverse-proxies to the container.
Option B — existing nginx
Run the container bound to localhost:
docker compose -f docker-compose.prod.yml up -d --build # binds 127.0.0.1:8787
then add an nginx server block that proxies https://your-host → http://127.0.0.1:8787, with proxy_buffering off; on /mcp (the MCP Streamable HTTP transport needs unbuffered responses), and obtain a cert with certbot --nginx -d your-host.
Health check: GET /healthz → {"ok":true}. Landing page with a key-URL builder: GET /.
Connect from Claude
Claude Code
claude mcp add --transport http sailing "https://your-host/mcp?worldtidesKey=…&stormglassKey=…&aisstreamKey=…"
Claude.ai (Pro / Max / Team / Enterprise)
Settings → Connectors → Add custom connector → paste the URL. No OAuth required.
Claude Desktop (any plan, via mcp-remote)
{
"mcpServers": {
"sailing": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://your-host/mcp?...", "--transport", "http-only"]
}
}
}
Example prompts
"Tomorrow morning Den Helder → Texel: full passage plan — wind, gusts, waves, HW/LW at Marsdiep, when to leave and why."
"Wind consensus across ECMWF / GFS / ICON-EU / UKMO for Saturday at Marsdiep — where do the models disagree?"
"What ships are within 5 km of Marsdiep right now? Any TESO ferry inbound?"
"Find marinas with fuel within 20 km of IJmuiden, and the next bridge openings on the way."
Notes
- All provider keys are read per-request from the URL/headers and are never logged or persisted.
- All times returned by tools are UTC.
tides_nl(Matroos) is more accurate thantides_worldtidesin Dutch waters; prefer it there.- NDW bridge data carries only RIS-index codes + coordinates;
bridges_nlenriches them with bridge names from OpenStreetMap (nearest movable bridge within 80 m). A few may still show "(name unknown)" if OSM has no nearby named bridge. - AISStream is community-fed; coverage is excellent in coastal Europe/Americas, sparse mid-ocean.
- This is provided as-is for sailing use. Always verify against official charts, almanacs and notices before relying on it for navigation safety.
Project layout
src/
index.ts # Express + Streamable HTTP transport, per-request key extraction
server.ts # MCP server, conditional tool registration
keys.ts # RequestKeys type
landing.ts # HTML landing page (GET /)
openmeteo.ts # Open-Meteo forecast + wind consensus
windy.ts # Windy Point Forecast client
aviationweather.ts# METAR / TAF
sunmoon.ts # sun & moon (SunCalc)
matroos.ts # RWS Matroos tides (NL)
rws.ts # RWS Waterinfo (NL, fallback)
worldtides.ts # WorldTides global tides
stormglass.ts # Stormglass currents
osm.ts # OpenStreetMap / Overpass POIs
ndw.ts # NDW bridge schedule (DATEX II)
nts.ts # Notices to Skippers (RWS / EU NtS SOAP)
fairway.ts # Fairway depths / bridge clearance / locks (RWS FIS WFS)
aisstream.ts # AISStream live AIS snapshot
Dockerfile
docker-compose.yml # + Caddy
docker-compose.prod.yml # localhost-only, for existing nginx
Caddyfile
Built by @ai_kulikov.