Skip to content

OhMyWind

by ohmywind.fr · remote · no sign-in to list tools · v1.10.0 · published by fr.ohmywind

Sailing passage planner for any coast, with high-precision tides on the French Atlantic.

Changes · 11 high finding

5 tools: 1 change things and 4 only read.

Scanned Oct 21, 2026

4 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http sailing-planner https://mcp.ohmywind.fr/mcp

Findings

Matches of fixed checks, with the text they matched.

1 high3 info
  • The description contains "never show the user", an instruction to keep something from the user.

    Matched text

    description: "...place named. Redraw it and call again; never show the user a route over land. The shorelin..."

    What this check looks for
  • The description is 2,405 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...Note: the first request after inactivity may incur ~5s of cold-start."

    What this check looks for
  • The description is 2,364 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...and the few times that back it: no widget comes with this tool."

    What this check looks for
  • The description is 14,446 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...names the failing model and suggests longer-range alternatives."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

5 tools

Changes things 1Claude Code: ask
  • plan_passagePlan an A→B passage.2 findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • High

      The description contains "never show the user", an instruction to keep something from the user.

      Matched text

      description: "...place named. Redraw it and call again; never show the user a route over land. The shorelin..."

      What this check looks for
    • Info

      The description is 14,446 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...names the failing model and suggests longer-range alternatives."

      What this check looks for
    Description, as the server wrote it
    Plan an A→B passage. Compare departure windows by default; pin a single departure only when the user gives an explicit time. ## Tool routing: read this first Before calling, classify the user's question: 1. **Pure weather lookup at a point** ("y aura-t-il du vent à Cassis samedi à 14h ?", "quelles vagues dimanche au cap Sicié ?"): call ``get_marine_forecast`` and answer in text. Do NOT call ``plan_passage``: there's no route to plan. 2. **Trajet question with a flexible date** ("Marseille → Porquerolles ce week-end", "demain ou après-demain", "dans les prochains jours"): call ``plan_passage`` in **compare-windows mode**, passing ``latest_departure`` (e.g. earliest+48h) and ``sweep_interval_hours`` (3 or 6 typically) so the user sees several departure scenarios side-by-side. Then pick 2-3 good ones and let the user choose. This is the **default** for trajet planning: same API cost as a single passage thanks to cache prewarm, much more value. 3. **Trajet with a precise hour pinned by the user** ("je pars demain à 8h", "départ Saturday 9am"): call ``plan_passage`` in single mode (no ``latest_departure``). Used for the final "show me the detailed plan for THIS departure" view, often after step 2. 4. **Two ways to go** ("nord ou sud du Fromveur pour Ouessant ?", "par l'intérieur ou l'extérieur des Glénan ?", "Ré ou Aix demain ?"): one ``plan_passage`` call, the first route in ``waypoints`` and the others in ``alternatives`` (two at most), each with a short ``label`` saying how it goes ("Par le nord du Fromveur"). Every route is computed for the same departures, so the widget compares them cell by cell. Do not make one call per route. 5. **When to be at a pass** ("à quelle heure au Raz de Sein ?", "quand renverse le courant au Fromveur ?"): ``get_tidal_stream`` at the pass, with the course you will steer, and ``plan_passage`` comparing departures, both in the same turn; then pick the departure that brings you there in the favourable window. 6. **Methodology question** ("comment c'est calculé ?", "quelle efficacité par défaut ?"): call ``read_me``. Rule of thumb: if the user does NOT give an exact hour, prefer compare-windows. The widget renders one of the windows by default and the chat lets the user pick another. ## Waypoints must stay in the water This server runs a coarse land check before anything else: a leg that runs a couple of kilometres over land, or a waypoint inland, gets the call refused before any forecast request, with the leg and the place named. Redraw it and call again; never show the user a route over land. The shoreline is coarse (about 1 km, the coast widened by 2 km so harbours stay at sea): a spit narrower than about 4 km, or a leg that shaves a headland, passes the check and is timed as drawn, too short, too fast, and scored on conditions the boat would never meet. So the route is still yours to draw. Between every consecutive pair of waypoints the straight line must stay at sea. Add intermediate waypoints to round anything the direct line would cut: headlands, peninsulas, islands, shoals. - Toulon to Saint-Tropez: the direct line crosses the Massif des Maures. Pass south of the presqu'île de Giens, then round cap Bénat and cap Camarat before turning north into the gulf. - Brest to Douarnenez: the direct line crosses the presqu'île de Crozon. Exit the goulet, round the cap de la Chèvre, then head east into the bay. Keep about 1 NM of clearance off headlands, more with onshore wind or swell, and do not shave the inside of islands. Extra waypoints are close to free: the cap is 50, and sampling cost follows ``segment_length_nm`` and total distance, not the waypoint count. When in doubt, add the waypoint. A waypoint that lands ashore has a second effect. Open-Meteo returns no sea state over land, so those samples carry a null wave height and the complexity score silently falls back to wind only, dropping the axis that would have flagged a rough passage. Name the capes you routed around in your reply ("passage au large du cap Bénat"), so the user can correct a leg you drew wrong. ## Returned payload Every time comes back in the UTC offset of ``departure``: send the user's own (``+02:00`` for France in summer) and read the times as their clock. Single mode: - ``passage``: per-segment timing report (distance_nm, duration_h, model used, segments[] with TWS/TWA/boat_speed/Hs, warnings). - ``complexity``: 1-5 difficulty score with wind/sea breakdown and a human-readable rationale. - ``openwind_url``: deep-link to ohmywind.fr/plan that renders the same passage in the standalone web app. - ``waypoints``: the route as you sent it, which the widget draws on a map. - ``route_label`` and ``alternatives[]``, only when you passed alternatives: each alternative has its ``label``, ``waypoints``, ``passage``, ``complexity`` and ``openwind_url``. - ``disclaimer``: usage warning to relay (see below). Compare-windows mode (``latest_departure`` set): - ``mode``: ``"multi_window"``. - ``sweep``: ``earliest`` / ``latest`` / ``interval_hours`` / ``window_count``. - ``windows[]``: each entry has ``departure``, its ``weekday``, ``arrival``, ``duration_h``, ``distance_… [8446 more characters not shown]

    Annotations the server declares

    • title: Plan a passage
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Only reads 4Claude Code: allow
  • get_marine_forecastWind, sea, and where it matters current and tide, at one point.1 finding

    Why it is in this group

    • The name "get_marine_forecast" says "get": a word for reading.

    Findings

    • Info

      The description is 2,405 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...Note: the first request after inactivity may incur ~5s of cold-start."

      What this check looks for
    Description, as the server wrote it
    Wind, sea, and where it matters current and tide, at one point. For the questions about a place rather than a passage: how hard it blows at Groix this afternoon, when the thermal breeze fills in, when the mistral eases, whether the models agree, what the swell does at a harbour entrance tonight. Args: lat: latitude in degrees. lon: longitude in degrees. start: ISO-8601 datetime with the user's UTC offset (e.g. "2026-05-01T08:00:00+02:00"). Every time in the answer comes back in that offset. end: ISO-8601 datetime, timezone-aware. models: optional list of model names. Leave it unset for the automatic choice: AROME (1.3 km) wherever it reaches the window, and the next model that reaches its end when the window runs past two days. Name several models (``["arome", "icon_eu", "ecmwf", "gfs"]``) only when the user asks whether the models agree: each one costs a request. Returns hourly ``wind`` per model (speed, direction it comes from, gusts, in knots), ``sea`` (wave height, period, direction), and, only where they are material, ``current`` (speed in knots, direction it flows to, from a tidal atlas where one covers the point) and ``tide`` (height around mean sea level: read the range and the times of high and low water from it, not a depth over chart datum). Each series is a table: ``columns`` names the fields once, each of ``rows`` is one hour. Also ``openwind_url``, the OhMyWind map centred on the point. Answer in a sentence first (the user is often in a car or at the bar), then give the few numbers that back it, as a short table or a small chart if your interface draws one. No widget comes with this tool: the presentation is yours. Offer ``openwind_url`` as "voir sur la carte". This is a forecast: never present it as a measurement of what is blowing right now. Pass a point at sea. Over land Open-Meteo still returns wind, but every sea value comes back null, so the ``sea`` array is present and empty of information rather than absent. Note: the first request after inactivity may incur ~5s of cold-start.

    Annotations the server declares

    • title: Marine forecast
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_tidal_streamThe tidal stream and the tide at one point, from the tidal atlases alone.1 finding

    Why it is in this group

    • The name "get_tidal_stream" says "get": a word for reading.

    Findings

    • Info

      The description is 2,364 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...and the few times that back it: no widget comes with this tool."

      What this check looks for
    Description, as the server wrote it
    The tidal stream and the tide at one point, from the tidal atlases alone. For the questions about a pass or a harbour entrance: when to be at the Raz de Sein to carry the stream, when the Fromveur turns, how hard it runs at Port-Navalo tomorrow, when high water is at Chausey. Costs no weather request: harmonic predictions from the atlases this server ships (SHOM, MARC and others), the same ones ``plan_passage`` applies leg by leg. Args: lat: latitude in degrees, at sea, in the pass itself. lon: longitude in degrees. start: ISO-8601 datetime with the user's UTC offset; every time in the answer comes back in that offset. end: ISO-8601 datetime, timezone-aware. At most 400 steps. heading_deg: optional course through the point (true degrees, the direction you head to). With it, each step gets ``along_kn`` (positive: the stream carries you, negative: it stems you) and the answer lists the ``favourable`` and ``adverse`` windows. step_minutes: 5 to 180, default 30. Returns ``covered``, ``source``, ``confidence``, ``points`` (a table: ``columns`` time, ``speed_kn``, ``direction_to_deg`` it flows to, ``along_kn``, ``height_m`` around mean sea level; one row per step), ``slack`` (the moments the stream nearly stops), ``high_waters`` / ``low_waters``, ``favourable`` / ``adverse`` when a heading is given, ``tide_coefficient`` (French national coefficient, Brest, on French atlases), a ``warning`` when the atlas does not resolve the pass, and ``openwind_url``. Outside every atlas (most of the Mediterranean, the open sea) ``covered`` is false: say so, and use ``get_marine_forecast``, which returns the global model's current where it matters. Astronomical tide only: no surge, no wind-driven current. The windows are facts about the stream, not a recommendation: weigh them against the wind (``get_marine_forecast``) and the whole passage (``plan_passage``). Present the answer yourself, the time to be at the pass in one sentence and the few times that back it: no widget comes with this tool.

    Annotations the server declares

    • title: Tidal stream at a point
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_boat_archetypesList the boat archetypes with descriptive metadata.No findings

    Why it is in this group

    • The name "list_boat_archetypes" says "list": a word for reading.
    Description, as the server wrote it
    List the boat archetypes with descriptive metadata. The LLM (or user) maps a commercial model (e.g. "Sun Odyssey 32") to one of these archetypes from the metadata — there is no server-side mapping. ``voile_aviron_16ft`` is for open sail-and-oar dinghies only (no cabin, rowed as well as sailed); a small cabin cruiser maps to ``cruiser_20ft``.

    Annotations the server declares

    • title: Boat archetypes
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • read_meReturn OhMyWind's calculation methodology as Markdown.No findings

    Why it is in this group

    • The name "read_me" says "read": a word for reading.
    Description, as the server wrote it
    Return OhMyWind's calculation methodology as Markdown. Call this when the user asks how passage timing, complexity, or boat speed are computed (e.g. "comment c'est calculé ?", "what assumptions does the model use?", "is tacking modelled?"). The returned text covers: polar lookup, default efficiency 0.75, VMG / tacking correction, wave derate, single-pass timing, compare-windows mode semantics, Mediterranean simplifications (tides, currents), and what is intentionally NOT modelled in V1.

    Annotations the server declares

    • title: Calculation method
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.10.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http sailing-planner https://mcp.ohmywind.fr/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__sailing-planner__read_me",
      "mcp__sailing-planner__list_boat_archetypes",
      "mcp__sailing-planner__get_marine_forecast",
      "mcp__sailing-planner__get_tidal_stream"
    ],
    "ask": [
      "mcp__sailing-planner__plan_passage"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as sailing-planner. Review it before you use it.