Install
$ agentstack add mcp-4kulia-sailing-mcp ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
sailing-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 | – | | 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.
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: 4kulia
- Source: 4kulia/sailing-mcp
- License: MIT
- Homepage: https://sailing-mcp.dutch-atlas.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.