{"id":50565631,"url":"https://github.com/4kulia/sailing-mcp","last_synced_at":"2026-06-04T14:30:30.952Z","repository":{"id":361019060,"uuid":"1252727543","full_name":"4kulia/sailing-mcp","owner":"4kulia","description":"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).","archived":false,"fork":false,"pushed_at":"2026-05-28T21:31:44.000Z","size":117,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-28T22:18:10.463Z","etag":null,"topics":["ais","claude","mcp","model-context-protocol","sailing","tides","typescript","weather"],"latest_commit_sha":null,"homepage":"https://sailing-mcp.dutch-atlas.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/4kulia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-28T20:08:32.000Z","updated_at":"2026-05-28T21:31:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/4kulia/sailing-mcp","commit_stats":null,"previous_names":["4kulia/sailing-mcp"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/4kulia/sailing-mcp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4kulia%2Fsailing-mcp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4kulia%2Fsailing-mcp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4kulia%2Fsailing-mcp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4kulia%2Fsailing-mcp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/4kulia","download_url":"https://codeload.github.com/4kulia/sailing-mcp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/4kulia%2Fsailing-mcp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33910136,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-04T02:00:06.755Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ais","claude","mcp","model-context-protocol","sailing","tides","typescript","weather"],"created_at":"2026-06-04T14:30:29.771Z","updated_at":"2026-06-04T14:30:30.947Z","avatar_url":"https://github.com/4kulia.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sailing-mcp\n\nA remote [MCP](https://modelcontextprotocol.io) 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 \u0026 wave forecasts, tides, tidal currents, marinas, bridge schedules and live AIS vessel traffic** — with a strong focus on Dutch / North Sea waters.\n\nIt 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.\n\n## Tools\n\n| Tool | Source | Key required |\n| --- | --- | --- |\n| `sailing_forecast_openmeteo` | [Open-Meteo](https://open-meteo.com) — ECMWF, GFS, ICON, UKMO, Météo-France, JMA + Marine waves + optional SST | – |\n| `wind_consensus` | Open-Meteo — many models side-by-side with min/max/spread | – |\n| `metar_taf` | [aviationweather.gov](https://aviationweather.gov) — real airport observations \u0026 terminal forecasts | – |\n| `sun_moon` | Local calculation (SunCalc) — sunrise/sunset, twilights, moon phase | – |\n| `tides_nl` | [RWS Matroos](https://noos.matroos.rws.nl) — HW/LW, astronomical, observed, forecast + surge, water temp (preferred for NL) | – |\n| `tides_rws` | [RWS Waterinfo](https://waterinfo.rws.nl) — observed water level (fallback) | – |\n| `marinas_osm` | [OpenStreetMap / Overpass](https://overpass-api.de) — marinas, harbours, yacht clubs, anchorages, fuel | – |\n| `bridges_nl` | [NDW](https://opendata.ndw.nu) DATEX II — scheduled bridge openings (names via OSM) | – |\n| `notices_nl` | [RWS / EU NtS](https://www.vaarweginformatie.nl) — official Notices to Skippers, geo-filtered | – |\n| `fairway_nl` | [RWS FIS WFS](https://www.vaarweginformatie.nl) — fairway depths, bridge clearance (air draft), locks | – |\n| `list_models` | Built-in reference card (models, parameters, station codes) | – |\n| `sailing_forecast` / `point_forecast` | [Windy Point Forecast](https://api.windy.com) | Windy |\n| `tides_worldtides` | [WorldTides](https://www.worldtides.info) — global tide predictions | WorldTides |\n| `currents_stormglass` | [Stormglass](https://stormglass.io) — multi-source tidal/ocean currents | Stormglass |\n| `ais_traffic` | [AISStream](https://aisstream.io) — live vessel snapshot | AISStream |\n\n## URL format\n\nThe server speaks **Streamable HTTP** on `/mcp`. Pass each provider's key as a query parameter (all optional):\n\n```\nhttps://your-host/mcp?key=WINDY\u0026worldtidesKey=WT\u0026stormglassKey=SG\u0026aisstreamKey=AIS\n```\n\nAccepted aliases:\n\n| Provider | Query params | Headers |\n| --- | --- | --- |\n| Windy | `key`, `windyKey`, `apiKey` | `Authorization: Bearer …`, `X-Windy-Key`, `X-API-Key` |\n| WorldTides | `worldtidesKey`, `wtKey` | `X-WorldTides-Key` |\n| Stormglass | `stormglassKey`, `sgKey` | `X-Stormglass-Key` |\n| AISStream | `aisstreamKey`, `aisKey` | `X-AISStream-Key` |\n\nWhere to get keys: [Windy](https://api.windy.com/keys) · [WorldTides](https://www.worldtides.info/developer) · [Stormglass](https://dashboard.stormglass.io/) · [AISStream](https://aisstream.io/apikeys). All except Windy have a usable free tier; everything else works with no key at all.\n\n## Local run\n\n```bash\nnpm install\nnpm run dev          # tsx watch\n# or\nnpm run build \u0026\u0026 npm start\n```\n\nQuick test:\n\n```bash\ncurl -sS -X POST 'http://localhost:8787/mcp' \\\n  -H 'content-type: application/json' \\\n  -H 'accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'\n```\n\n## Deploy on a VPS\n\nThe included `Dockerfile` builds a small Node 22 image listening on `:8787`. Two ways to front it with TLS:\n\n### Option A — Docker Compose + Caddy (self-contained)\n\n```bash\ncp .env.example .env\n$EDITOR .env          # set DOMAIN and ACME_EMAIL\ndocker compose up -d --build\n```\n\nCaddy obtains a Let's Encrypt certificate automatically and reverse-proxies to the container.\n\n### Option B — existing nginx\n\nRun the container bound to localhost:\n\n```bash\ndocker compose -f docker-compose.prod.yml up -d --build   # binds 127.0.0.1:8787\n```\n\nthen 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`.\n\nHealth check: `GET /healthz` → `{\"ok\":true}`. Landing page with a key-URL builder: `GET /`.\n\n## Connect from Claude\n\n### Claude Code\n\n```bash\nclaude mcp add --transport http sailing \"https://your-host/mcp?worldtidesKey=…\u0026stormglassKey=…\u0026aisstreamKey=…\"\n```\n\n### Claude.ai (Pro / Max / Team / Enterprise)\n\nSettings → **Connectors** → **Add custom connector** → paste the URL. No OAuth required.\n\n### Claude Desktop (any plan, via `mcp-remote`)\n\n```json\n{\n  \"mcpServers\": {\n    \"sailing\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-remote\", \"https://your-host/mcp?...\", \"--transport\", \"http-only\"]\n    }\n  }\n}\n```\n\n## Example prompts\n\n\u003e \"Tomorrow morning Den Helder → Texel: full passage plan — wind, gusts, waves, HW/LW at Marsdiep, when to leave and why.\"\n\n\u003e \"Wind consensus across ECMWF / GFS / ICON-EU / UKMO for Saturday at Marsdiep — where do the models disagree?\"\n\n\u003e \"What ships are within 5 km of Marsdiep right now? Any TESO ferry inbound?\"\n\n\u003e \"Find marinas with fuel within 20 km of IJmuiden, and the next bridge openings on the way.\"\n\n## Notes\n\n- All provider keys are read per-request from the URL/headers and are never logged or persisted.\n- All times returned by tools are **UTC**.\n- `tides_nl` (Matroos) is more accurate than `tides_worldtides` in Dutch waters; prefer it there.\n- NDW bridge data carries only RIS-index codes + coordinates; `bridges_nl` enriches 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.\n- AISStream is community-fed; coverage is excellent in coastal Europe/Americas, sparse mid-ocean.\n- This is provided as-is for sailing use. **Always verify against official charts, almanacs and notices before relying on it for navigation safety.**\n\n## Project layout\n\n```\nsrc/\n  index.ts          # Express + Streamable HTTP transport, per-request key extraction\n  server.ts         # MCP server, conditional tool registration\n  keys.ts           # RequestKeys type\n  landing.ts        # HTML landing page (GET /)\n  openmeteo.ts      # Open-Meteo forecast + wind consensus\n  windy.ts          # Windy Point Forecast client\n  aviationweather.ts# METAR / TAF\n  sunmoon.ts        # sun \u0026 moon (SunCalc)\n  matroos.ts        # RWS Matroos tides (NL)\n  rws.ts            # RWS Waterinfo (NL, fallback)\n  worldtides.ts     # WorldTides global tides\n  stormglass.ts     # Stormglass currents\n  osm.ts            # OpenStreetMap / Overpass POIs\n  ndw.ts            # NDW bridge schedule (DATEX II)\n  nts.ts            # Notices to Skippers (RWS / EU NtS SOAP)\n  fairway.ts        # Fairway depths / bridge clearance / locks (RWS FIS WFS)\n  aisstream.ts      # AISStream live AIS snapshot\nDockerfile\ndocker-compose.yml        # + Caddy\ndocker-compose.prod.yml   # localhost-only, for existing nginx\nCaddyfile\n```\n\nBuilt by [@ai_kulikov](https://x.com/ai_kulikov).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F4kulia%2Fsailing-mcp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F4kulia%2Fsailing-mcp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F4kulia%2Fsailing-mcp/lists"}