Koskamo

Seamark MCP

Seamark is a personal voyage log for sailing trips. This MCP server allows AI assistants to read and maintain the user's sailing log, including trips, legs, ships, crew, and GPX tracks, while providing statistics on distance, time, and speed.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Seamark MCP logo, by SeamarkVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Seamark
MCP endpoint (Streamable HTTP)
https://seamark.app/mcp
Vendor documentation

What its tools do

13 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

13 of 13 have a description · 13 of 13 declare behavior hints · 0 of 2 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to seamark.app ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Read sailing voyage logs and statistics
  • Import and clean GPX track data
  • Share trip details with crew via public links
  • Generate sailing résumés from logbook data

Source and maintenance

Vendor evidenceRegistry 1.6.0
Maintenance checked

Protocol and capabilities

Server
seamark 2.6.1
MCP protocol negotiated in check
2025-11-25
Tools
13 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Tools

13 advertised

whoami — Current user
Advertised by the server during the last successful anonymous check.
Advertised read-only

The authenticated caller's own profile (id, email, name, language). Takes no arguments. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

whoami input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
whoami annotations
{
  "title": "Current user",
  "readOnlyHint": true
}
trip_read — Read trips
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read the caller's voyages: list (the caller's OWN log), list the trips others shared with the caller (list_shared), get one trip, get its combined map, and get its public share link (get_share). `get` composes trip metadata with its crew, charter, and legs (there is no separate crew or charter read). `map` returns a GeoJSON FeatureCollection with one feature per mappable leg — track-backed, or manual with both endpoints set; a leg with no geometry is omitted. A trip someone else shared with the caller is readable with `get` and `map` and listed by `list_shared`, never by `list`; its charter is withheld, and so is the `pickupBase` summary field. `get_share` returns the trip's public, read-only, no-login link or null. Charter price/deposit are integer minor units plus an ISO 4217 currency code — never a float. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

trip_read input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 100,
          "minimum": 1
        },
        "action": {
          "type": "string",
          "const": "list"
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 50,
          "maximum": 100,
          "minimum": 1
        },
        "action": {
          "type": "string",
          "const": "list_shared"
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "get"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "tripId"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "map"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "tripId"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "get_share"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        }
      },
      "additionalProperties": false
    }
  ]
}
trip_read annotations
{
  "title": "Read trips",
  "readOnlyHint": true
}
trip_write — Change trips
Advertised by the server during the last successful anonymous check.
Advertised destructive

Change the caller's own voyages: create, update, delete, replace the full crew set (set_crew, PUT semantics), set or clear the charter (set_charter — a null charter clears it), announce the trip to its crew by email (announce), and turn its public link on or off (create_share, revoke_share). Charter price/deposit are integer minor units plus an ISO 4217 currency code — never a float. Inviting a crew member to the app is person_write's `invite`/`accept_invitation`: an invitation is person-scoped, and accepting one shares every trip of that owner whose crew that person is on, past and future. `announce` mails the trip's particulars to crew who have a linked account and have not switched that category off in Settings; it reports how many actually went out, and is rate-limited per trip and per recipient address. `create_share` turns on a public, read-only, no-login link to one of the caller's OWN trips and returns its URL (idempotent — one link per trip, calling it again returns the same URL); `revoke_share` turns it off. The public view is redacted — no charter, crew shown as initials only, no owner details — but anyone with the link can open it, so the URL is semi-public. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

trip_write input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action",
        "name",
        "startDate",
        "endDate",
        "timezone"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "action": {
          "type": "string",
          "const": "create"
        },
        "shipId": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^[0-9A-Za-z]{6}$"
            },
            {
              "type": "null"
            }
          ]
        },
        "endDate": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "timezone": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "startDate": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "description": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 4000,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id",
        "patch"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "patch": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "maxLength": 200,
              "minLength": 1
            },
            "shipId": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^[0-9A-Za-z]{6}$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "endDate": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            },
            "timezone": {
              "type": "string",
              "maxLength": 64,
              "minLength": 1
            },
            "startDate": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            },
            "description": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 4000,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "minProperties": 1,
          "additionalProperties": false
        },
        "action": {
          "type": "string",
          "const": "update"
        },
        "expectedUpdatedAt": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "delete"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "tripId",
        "crew"
      ],
      "properties": {
        "crew": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "personId",
              "role"
            ],
            "properties": {
              "note": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 500,
                    "minLength": 1
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "role": {
                "anyOf": [
                  {
                    "type": "string",
                    "const": "skipper"
                  },
                  {
                    "type": "string",
                    "const": "crew"
                  }
                ]
              },
              "personId": {
                "type": "string",
                "pattern": "^[0-9A-Za-z]{6}$"
              }
            },
            "additionalProperties": false
          },
          "maxItems": 50
        },
        "action": {
          "type": "string",
          "const": "set_crew"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "expectedUpdatedAt": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "tripId",
        "charter"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "set_charter"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "charter": {
          "anyOf": [
            {
              "type": "object",
              "required": [
                "company"
              ],
              "properties": {
                "notes": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 4000,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "price": {
                  "anyOf": [
                    {
                      "type": "object",
                      "required": [
                        "amount",
                        "currency"
                      ],
                      "properties": {
                        "amount": {
                          "type": "integer",
                          "maximum": 9007199254740991,
                          "minimum": 0
                        },
                        "currency": {
                          "type": "string",
                          "pattern": "^[A-Z]{3}$"
                        }
                      },
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "company": {
                  "type": "string",
                  "maxLength": 200,
                  "minLength": 1
                },
                "contact": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 500,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "deposit": {
                  "anyOf": [
                    {
                      "type": "object",
                      "required": [
                        "amount",
                        "currency"
                      ],
                      "properties": {
                        "amount": {
                          "type": "integer",
                          "maximum": 9007199254740991,
                          "minimum": 0
                        },
                        "currency": {
                          "type": "string",
                          "pattern": "^[A-Z]{3}$"
                        }
                      },
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "pickupBase": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 200,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "returnBase": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 200,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "contractNumber": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 100,
                      "minLength": 1
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "expectedUpdatedAt": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "tripId"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "announce"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "tripId"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "create_share"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "tripId"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "revoke_share"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        }
      },
      "additionalProperties": false
    }
  ]
}
trip_write annotations
{
  "title": "Change trips",
  "destructiveHint": true
}
ship_read — Read boats
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read the caller's boats — a reusable, per-owner registry: list them all, or get one by id. The optional `flag` field is a ship's flag state as an uppercase ISO 3166-1 alpha-2 country code (e.g. "HR", "CZ"), or null. The optional `hullType` is 'monohull', 'catamaran' or 'trimaran', or null when unknown. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

ship_read input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "list"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "get"
        }
      },
      "additionalProperties": false
    }
  ]
}
ship_read annotations
{
  "title": "Read boats",
  "readOnlyHint": true
}
ship_write — Change boats
Advertised by the server during the last successful anonymous check.
Advertised destructive

Create, update or delete one of the caller's boats. The optional `flag` field is a ship's flag state as an uppercase ISO 3166-1 alpha-2 country code (e.g. "HR", "CZ"), or null. The optional `hullType` is 'monohull', 'catamaran' or 'trimaran', or null when unknown. Sending null for `flag` or `hullType` clears it. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

ship_write input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action",
        "name"
      ],
      "properties": {
        "flag": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^[A-Z]{2}$"
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string",
          "maxLength": 120,
          "minLength": 1
        },
        "loaCm": {
          "anyOf": [
            {
              "type": "integer",
              "maximum": 10000,
              "minimum": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "model": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 120,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 2000,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "action": {
          "type": "string",
          "const": "create"
        },
        "homePort": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 120,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "hullType": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "string",
                  "const": "monohull"
                },
                {
                  "type": "string",
                  "const": "catamaran"
                },
                {
                  "type": "string",
                  "const": "trimaran"
                }
              ]
            },
            {
              "type": "null"
            }
          ]
        },
        "registration": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 60,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id",
        "patch"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "patch": {
          "type": "object",
          "properties": {
            "flag": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^[A-Z]{2}$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "name": {
              "type": "string",
              "maxLength": 120,
              "minLength": 1
            },
            "loaCm": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 10000,
                  "minimum": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "model": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 120,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "notes": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 2000,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "homePort": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 120,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "hullType": {
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "type": "string",
                      "const": "monohull"
                    },
                    {
                      "type": "string",
                      "const": "catamaran"
                    },
                    {
                      "type": "string",
                      "const": "trimaran"
                    }
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "registration": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 60,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false
        },
        "action": {
          "type": "string",
          "const": "update"
        },
        "expectedUpdatedAt": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "delete"
        }
      },
      "additionalProperties": false
    }
  ]
}
ship_write annotations
{
  "title": "Change boats",
  "destructiveHint": true
}
person_read — Read people
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read the caller's private address book of people — crew and contacts: list them all, or get one by id. Personal data (birth date, passport) is never shared across users. `linkedAccount` reports whether this person has accepted an invitation and is linked to a Seamark account. `isSelf` marks the ONE person in the caller's book that is the caller, so voyages with them on the crew list count as the caller's own. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

person_read input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "list"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "get"
        }
      },
      "additionalProperties": false
    }
  ]
}
person_read annotations
{
  "title": "Read people",
  "readOnlyHint": true
}
person_write — Change people
Advertised by the server during the last successful anonymous check.
Advertised destructive

Change the caller's private address book of people — crew and contacts (create, update, delete, unlink_account, mark_self, unmark_self, invite, accept_invitation). Personal data (birth date, passport) is never shared across users. `linkedAccount` reports whether this person has accepted an invitation and is linked to a Seamark account. `isSelf` marks the ONE person in the caller's book that is the caller, so voyages with them on the crew list count as the caller's own. `invite` mails a Seamark invitation to a person who crews at least one of the caller's trips (409 `invitation_no_trips` otherwise — the person must be on a trip's crew first); accepting it links their account to this person, which opens EVERY trip of the caller's they crew, past and future, so the mail lists all of them. It is rate-limited to one send per person per minute and 3 sends per recipient address per hour (a budget shared with trip_write's `announce`, keyed on the address rather than the feature), remembers the address on the person's `email` (advancing the person's `updatedAt` version token — the response carries the new value), and re-inviting replaces the previous invitation, so a mistyped address's link stops working. `accept_invitation` is the other side: it binds the CALLER's own account to the person named by the token, requires the caller's address to match the one invited, and returns every trip it opened. `unlink_account` revokes a person's account link everywhere at once AND cancels any invitation to that person that has not been accepted yet — a pending invite mail stops working, which is what makes the revocation final rather than something the other party can undo by re-clicking their link. It is idempotent, and on someone who was never linked its only effect is to cancel a pending invitation. `mark_self` sets `isSelf` (marking someone new moves the marker off whoever held it — at most one person is the caller), `unmark_self` clears it. Both are idempotent and unrelated to `linkedAccount`/invitations — "this is me" is the caller's own identity, not an access grant. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

person_write input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action",
        "fullName"
      ],
      "properties": {
        "email": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
              "maxLength": 254
            },
            {
              "type": "null"
            }
          ]
        },
        "notes": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 2000,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "action": {
          "type": "string",
          "const": "create"
        },
        "contact": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 500,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "fullName": {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        "birthDate": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            },
            {
              "type": "null"
            }
          ]
        },
        "birthPlace": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 200,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "citizenship": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 100,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        },
        "passportExpiry": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            },
            {
              "type": "null"
            }
          ]
        },
        "passportNumber": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 60,
              "minLength": 1
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id",
        "patch"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "patch": {
          "type": "object",
          "properties": {
            "email": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
                  "maxLength": 254
                },
                {
                  "type": "null"
                }
              ]
            },
            "notes": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 2000,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "contact": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 500,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "fullName": {
              "type": "string",
              "maxLength": 200,
              "minLength": 1
            },
            "birthDate": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "birthPlace": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 200,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "citizenship": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 100,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "passportExpiry": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "passportNumber": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 60,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false
        },
        "action": {
          "type": "string",
          "const": "update"
        },
        "expectedUpdatedAt": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "delete"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "unlink_account"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "mark_self"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "unmark_self"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id",
        "email"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "email": {
          "type": "string",
          "pattern": "^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$",
          "maxLength": 254
        },
        "action": {
          "type": "string",
          "const": "invite"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "token"
      ],
      "properties": {
        "token": {
          "type": "string",
          "maxLength": 128,
          "minLength": 20
        },
        "action": {
          "type": "string",
          "const": "accept_invitation"
        }
      },
      "additionalProperties": false
    }
  ]
}
person_write annotations
{
  "title": "Change people",
  "destructiveHint": true
}
leg_read — Read legs
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read a trip's ordered legs: list them, or get one by id. A leg's `statsSource` is 'track' when its stats, coordinates and times are computed from a GPX track, 'manual' otherwise. On a trip someone else shared with the caller, `get` reads a leg but `list` does not — its legs are in `trip_read`'s `get`. The weather fields are hand-entered observations, except the wind pair when `weatherSource` is 'open_meteo': windSpeedKn is true wind speed in knots, windDirDeg an integer 0-359 in meteorological convention (the direction the wind blows FROM), seaState the Douglas degree of sea 0-9. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

leg_read input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action",
        "tripId"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "list"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "get"
        }
      },
      "additionalProperties": false
    }
  ]
}
leg_read annotations
{
  "title": "Read legs",
  "readOnlyHint": true
}
leg_write — Change legs
Advertised by the server during the last successful anonymous check.
Advertised destructive

Change a trip's ordered legs: create, update, delete, reorder (a full leg-id permutation, reassigning seq 1..N), and fill a leg's wind from a weather service (fetch_weather). A leg backed by a track (statsSource: 'track') rejects an update that touches any computed stats/coordinate/time field with a stats_readonly error — its startName/endName/notes stay editable regardless. The weather fields are hand-entered observations, except the wind pair when `weatherSource` is 'open_meteo': windSpeedKn is true wind speed in knots, windDirDeg an integer 0-359 in meteorological convention (the direction the wind blows FROM), seaState the Douglas degree of sea 0-9. They stay editable on EVERY leg, track-backed or not, because no GPX file records them. `fetch_weather` fills the leg's WIND (speed and direction, never sea state) from the free Open-Meteo service: it resolves the position and time window from the leg's own data (its track's middle point, else its endpoint midpoint, else its start) and stores the arithmetic mean of the hourly speeds over that window plus their SPEED-WEIGHTED circular mean direction, stamping weatherSource 'open_meteo' and weatherFetchedAt — except when the window was a dead calm, which yields no direction: a hand-entered windDirDeg then survives and the response says weatherSource 'manual' instead, because the stamp must never attribute a hand-typed value to the provider. This is the ONLY action that makes an outbound network call on the caller's behalf, it is rate-limited to 30 per hour per user, and it overwrites whatever wind the leg already had, hand-entered included. A later hand-edit of either WIND field flips weatherSource back to 'manual' and clears weatherFetchedAt; writing seaState does NOT, because the pair records where the wind came from and sea state is never fetched. A leg with no usable coordinates or no usable time window is weather_no_position (422); an upstream failure or a date the provider does not cover is weather_unavailable (503). IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

leg_write input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action",
        "tripId",
        "data"
      ],
      "properties": {
        "data": {
          "type": "object",
          "required": [
            "startName",
            "endName"
          ],
          "properties": {
            "notes": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 4000,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "endLat": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90
                },
                {
                  "type": "null"
                }
              ]
            },
            "endLon": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180
                },
                {
                  "type": "null"
                }
              ]
            },
            "endName": {
              "type": "string",
              "maxLength": 200,
              "minLength": 1
            },
            "endTime": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "seaState": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 9,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "startLat": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90
                },
                {
                  "type": "null"
                }
              ]
            },
            "startLon": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180
                },
                {
                  "type": "null"
                }
              ]
            },
            "distanceM": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "startName": {
              "type": "string",
              "maxLength": 200,
              "minLength": 1
            },
            "startTime": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "avgSpeedKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 100,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "windDirDeg": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 359,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "windSpeedKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 200,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "maxSpeed1mKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 100,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "maxSpeed5mKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 100,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "maxSpeed10mKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 100,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "durationTotalS": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "durationMovingS": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false
        },
        "action": {
          "type": "string",
          "const": "create"
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id",
        "patch"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "patch": {
          "type": "object",
          "properties": {
            "notes": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 4000,
                  "minLength": 1
                },
                {
                  "type": "null"
                }
              ]
            },
            "endLat": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90
                },
                {
                  "type": "null"
                }
              ]
            },
            "endLon": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180
                },
                {
                  "type": "null"
                }
              ]
            },
            "endName": {
              "type": "string",
              "maxLength": 200,
              "minLength": 1
            },
            "endTime": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "seaState": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 9,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "startLat": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 90,
                  "minimum": -90
                },
                {
                  "type": "null"
                }
              ]
            },
            "startLon": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 180,
                  "minimum": -180
                },
                {
                  "type": "null"
                }
              ]
            },
            "distanceM": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "startName": {
              "type": "string",
              "maxLength": 200,
              "minLength": 1
            },
            "startTime": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
                },
                {
                  "type": "null"
                }
              ]
            },
            "avgSpeedKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 100,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "windDirDeg": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 359,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "windSpeedKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 200,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "maxSpeed1mKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 100,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "maxSpeed5mKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 100,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "maxSpeed10mKn": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 100,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "durationTotalS": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            },
            "durationMovingS": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "minProperties": 1,
          "additionalProperties": false
        },
        "action": {
          "type": "string",
          "const": "update"
        },
        "expectedUpdatedAt": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "delete"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "tripId",
        "legIds"
      ],
      "properties": {
        "action": {
          "type": "string",
          "const": "reorder"
        },
        "legIds": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[0-9A-Za-z]{6}$"
          },
          "maxItems": 200,
          "minItems": 1
        },
        "tripId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "id"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "fetch_weather"
        }
      },
      "additionalProperties": false
    }
  ]
}
leg_write annotations
{
  "title": "Change legs",
  "destructiveHint": true
}
track_read — Read tracks
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read a leg's GPX track: get the current track, and audit every kept/dropped point with its drop reason. Audit results are paged with offset/limit; a long track has many points. On a trip someone else shared with the caller, `get` reads the track; the audit stays the owner's. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

track_read input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action",
        "legId"
      ],
      "properties": {
        "legId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "get"
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "legId"
      ],
      "properties": {
        "legId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "limit": {
          "type": "integer",
          "default": 1000,
          "maximum": 5000,
          "minimum": 1
        },
        "action": {
          "type": "string",
          "const": "audit"
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "minimum": 0
        }
      },
      "additionalProperties": false
    }
  ]
}
track_read annotations
{
  "title": "Read tracks",
  "readOnlyHint": true
}
track_write — Change tracks
Advertised by the server during the last successful anonymous check.
Advertised destructive

Change a leg's GPX track: import raw GPX text (inline, capped at 5 Mi UTF-16 code units — that is what the schema counts, so it is roughly 5 MB for plain-ASCII GPX and no less for a file full of non-ASCII names; the server-side pipeline caps are separate: 32 MB of bytes AND at most 75,000 trackpoints per file (#191) — a file over the inline cap goes through the REST upload route instead, and one over the point cap has to be split or simplified first), reprocess the leg's stored raw file at the current pipeline version, and delete the track (the leg reverts to statsSource 'manual', retaining its last computed stats). IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

track_write input schema
{
  "type": "object",
  "anyOf": [
    {
      "type": "object",
      "required": [
        "action",
        "legId",
        "gpx"
      ],
      "properties": {
        "gpx": {
          "type": "string",
          "maxLength": 5242880
        },
        "legId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "import"
        },
        "maxSpeedKn": {
          "type": "number",
          "default": 30,
          "maximum": 100,
          "minimum": 1
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "legId"
      ],
      "properties": {
        "legId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "reprocess"
        },
        "maxSpeedKn": {
          "type": "number",
          "default": 30,
          "maximum": 100,
          "minimum": 1
        }
      },
      "additionalProperties": false
    },
    {
      "type": "object",
      "required": [
        "action",
        "legId"
      ],
      "properties": {
        "legId": {
          "type": "string",
          "pattern": "^[0-9A-Za-z]{6}$"
        },
        "action": {
          "type": "string",
          "const": "delete"
        }
      },
      "additionalProperties": false
    }
  ]
}
track_write annotations
{
  "title": "Change tracks",
  "destructiveHint": true
}
stats — Logbook statistics
Advertised by the server during the last successful anonymous check.
Advertised read-only

The caller's lifetime logbook statistics across their whole log — the trips they own AND the trips shared with them as linked crew. Returns totals (distance in meters, moving/total time in seconds, days at sea, distinct shipmates, best sustained 1/5/10-minute speeds in knots, average speed, earliest trip date), a per-year breakdown (by trip start-date year, newest first), and a per-boat breakdown (own and shared boats, each flagged `owned`; by distance, largest first). The optional `role` filters every figure by the role the caller held on each trip: 'all' (default) counts every voyage, 'skipper' or 'crew' count only voyages where the caller held that role. Voyages where the caller is not on the crew have no role: they count only under 'all' and are reported as `unattributedTripsCount`. `ownedTripsCount` and `sharedTripsCount` split the whole log into voyages the caller owns and voyages shared with them, whatever the `role`. All distances are meters and all durations seconds — never nmi/hours; speeds are knots or null. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

stats input schema
{
  "type": "object",
  "properties": {
    "role": {
      "anyOf": [
        {
          "type": "string",
          "const": "all"
        },
        {
          "type": "string",
          "const": "skipper"
        },
        {
          "type": "string",
          "const": "crew"
        }
      ]
    }
  },
  "additionalProperties": false
}
stats annotations
{
  "title": "Logbook statistics",
  "readOnlyHint": true
}
resume — Sailing résumé
Advertised by the server during the last successful anonymous check.
Advertised read-only

The caller's sailing résumé — the record a charter company asks for before handing over a boat: one row per voyage the caller sailed with a known role, newest first, each with start and end date, the boat (name, model, length overall in centimeters as `loaCm`, hull type, or null when the voyage has no boat), the caller's role ('skipper' or 'crew'), ports-of-call countries (ISO 3166-1 alpha-2) and sea areas in voyage order, distance in meters, days at sea and night time in seconds. Totals cover the returned rows, overall and per role. Optional `role` ('all', 'skipper', 'crew') filters the rows; optional `from`/`to` (YYYY-MM-DD, inclusive) bound them by start date. Voyages where the caller is not on the crew have no role, are left out, and are counted as `unattributedTripsCount`. The figures come from the caller's own log and are not verified by anyone else. IDs are 6-character case-sensitive alphanumeric strings. Timestamps are UTC ISO 8601. Distances are integer meters. Durations are integer seconds.

resume input schema
{
  "type": "object",
  "properties": {
    "to": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "from": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "role": {
      "anyOf": [
        {
          "type": "string",
          "const": "all"
        },
        {
          "type": "string",
          "const": "skipper"
        },
        {
          "type": "string",
          "const": "crew"
        }
      ]
    }
  },
  "additionalProperties": false
}
resume annotations
{
  "title": "Sailing résumé",
  "readOnlyHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1662 ms
95th percentile latency
1662 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1662 ms · metadata changed · 13 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http seamark-mcp https://seamark.app/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add seamark-mcp --url https://seamark.app/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable seamark-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "seamark-mcp": {
      "url": "https://seamark.app/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "seamark-mcp": {
      "type": "streamableHttp",
      "url": "https://seamark.app/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start seamark-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "seamark-mcp": {
      "type": "http",
      "url": "https://seamark.app/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http seamark-mcp https://seamark.app/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://seamark.app/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "seamark-mcp": {
      "serverUrl": "https://seamark.app/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Seamark MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Seamark MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing