# Charter Boats (remote · charter.boats)

Search 14,000+ charter boats with live prices, plus marinas, anchorages, routes and itineraries.

- Trust score: 59/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-18

> **Recent critical change**: Authorization (2026-10-16). See the changelog below before you install this server.

## Components

- remote · `charter.boats`: 59/100 (this document), [markdown](https://verifymcp.io/servers/boats-charter-charter-boats/charter.md), [page](https://verifymcp.io/servers/boats-charter-charter-boats/charter)

## Channel facts

- Endpoint: `https://charter.boats/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-18.

- **Endpoint Security**: 46/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (delete_boat_image).
  - HTTPS check failed: the endpoint is reachable over plaintext HTTP.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 59/100
  - 60% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 9500 tokens (~202/item across 47 items; 45 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 20/100
  - Stability observed for 6 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 91/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 72% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 46 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### How do I install the Charter Boats MCP server?

Charter Boats is a hosted endpoint at https://charter.boats/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http boats-charter-charter-boats 'https://charter.boats/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "boats-charter-charter-boats": {
      "url": "https://charter.boats/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "boats-charter-charter-boats": {
      "type": "http",
      "url": "https://charter.boats/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.boats-charter-charter-boats]
url = "https://charter.boats/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "boats-charter-charter-boats": {
      "type": "remote",
      "url": "https://charter.boats/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add boats-charter-charter-boats --url 'https://charter.boats/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  boats-charter-charter-boats:
    url: "https://charter.boats/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "boats-charter-charter-boats": {
      "Transport": "http",
      "Url": "https://charter.boats/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add boats-charter-charter-boats -t streamable-http -u 'https://charter.boats/mcp'
```

### Other

```json
{
  "mcpServers": {
    "boats-charter-charter-boats": {
      "type": "http",
      "url": "https://charter.boats/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-17 (score 59, +1)

- [functional] New tool “compare_boat”

### 2026-10-16 (score 58, −6)

- [critical regression] Authorization: partial → fail
- [security] New tool “delete_boat_image”, which the server declares destructive
- [security] New tool “delete_discount”, which the server declares destructive
- [security] New tool “delete_fee”, which the server declares destructive
- [security] New tool “delete_price”, which the server declares destructive
- [security] New tool “remove_block”, which the server declares destructive
- [security] New tool “remove_calendar”, which the server declares destructive
- [functional improvement] Schema quality: 359 → 192
- [functional] Destructive annotations: pass → 100
- [functional] New tool “add_block”
- [functional] New tool “add_calendar”
- [functional] New tool “add_fee”
- [functional] New tool “add_price”
- [functional] New tool “create_discount”
- [functional] New tool “get_availability”
- [functional] New tool “get_boat”
- [functional] New tool “get_booking”
- [functional] New tool “get_cancellation_limits”
- [functional] New tool “get_company”
- [functional] New tool “get_earnings”
- [functional] New tool “get_pricing”
- [functional] New tool “list_boat_fees”
- [functional] New tool “list_boats”
- [functional] New tool “list_bookings”
- [functional] New tool “list_calendars”
- [functional] New tool “list_discounts”
- [functional] New tool “set_cancellation_policy”
- [functional] New tool “set_cross_lock”
- [functional] New tool “set_equipment_visibility”
- [functional] New tool “sync_calendar”
- [functional] New tool “update_boat”
- [functional] New tool “update_boat_images”
- [functional] New tool “update_company”
- [functional] New tool “update_discount”
- [functional] New tool “update_fee”
- [functional] New tool “update_price”

### 2026-10-15 (score 64, +1)

- [security] Tool “get_boat_standouts” rewrote its description, which is the text the model reads

### 2026-10-13 (score 63, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-12 (score 62)

First indexed and scored.

## MCP tools (45)

### `search_boats` (~2548 tokens)

Search Charter Boats

Search charter boats by location, name, type, dates, capacity, budget. The response `total_matching` is the FULL count of matching boats — results are the top `limit` of those, so phrase counts from it ("8 of 48 available") and re-call with a higher limit when the guest wants more.

Pass the guest's dates as they gave them. Each boat sets its own changeover day (`checkinout_days`) and its own minimum stay (`min_charter_days`), so the week a boat can actually be sold may not start on the day asked for — `price_summary` always names the real week, and it is the one sentence to quote, as it stands: the boat page's own Total for the stay it names, for the `guests` given (else the boat's max guests), all in (charter, every required fee charged now or at pickup, the 45 EUR platform fee; refundable deposits never), and the discount applied (the percent the site's card shows); a stay other than a week names its dates and length ("for Jun 19–22 (3 nights), 4 guests"); with no dates it is the boat's lowest week ("From", at max guests, precomputed). `list_price` holds the same figures — `total` (the stay's), `per_day` (that total per day for the boat; `from` when no dates were given), `party` (the guests it is priced for), `original_per_day` and `discount_pct` when a discount applies. For Due now, Paid at pickup and each deposit by name call get_boat_details with the dates. No total here includes an optional extra — `price_summary`, `list_price` and the `total_max` screen all leave out a skipper where `skippered` is 'optional', a hostess, a cook — so for a total with one, call get_boat_details with the dates before you answer and add the fee it lists under `fees.optional`, or say the boat lists none — never a typical or estimated rate, and call no budget met or exceeded on one. When `boats` is short, `alternatives` holds the closest boats, and each one's `relaxed` names what it loosened: `dates` (the week either side), `place` (a nearby base), `model` (another model of the sa…

Input parameters:

- `boat_type` (string)
- `cabins` (integer): Minimum number of guest cabins (crew cabins are not counted)
- `date_from` (string): Start date YYYY-MM-DD
- `date_to` (string): End date YYYY-MM-DD
- `features` (array): Equipment/amenity filters — boats must have ALL listed. Namespaced slugs ("dinghy:hypalon") are subtypes that already imply the parent — do not also list the parent. Map user phrasing to slugs: "ac"/…
- `guests` (integer): Number of guests
- `length_min` (integer): Minimum boat length in feet
- `limit` (integer)
- `location` (string): Destination name (fuzzy matched)
- `makemodel` (string): Make and/or model, plain text, exactly as the guest said it: "Bali 4.2", "Fountaine Pajot", "FP 41", "Lagoon", "Oceanis 46". Make alone is fine and so is a MODEL alone. Do not split it, do not add pu…
- `price_max` (number): Max price per day for the boat in EUR, all fees in — a boat's WEEKLY list figure: a week's grand total (charter, every required fee now or at pickup, the 45 EUR platform fee, our discounts; deposits…
- `price_min` (number): Min price per day for the boat in EUR, all fees in — a boat's WEEKLY list figure: a week's grand total (charter, every required fee now or at pickup, the 45 EUR platform fee, our discounts; deposits…
- `search` (string): Boat NAME only ("Papillon", "Ziphius") — the name an operator gave one hull, matched as a WHOLE WORD, so send the name the guest said and not a shortening of it. NEVER a make or a model: both go in `…
- `sort` (string): Sort order. Default: best_value (best value, available boats first). Use deals for biggest discounts first.
- `total_max` (number): Max grand total for the stay in EUR (the charter, every required fee now or at pickup and the flat 45 EUR platform fee; deposits never included): screened on the total `price_summary` states (`list_p…
- `year_min` (integer): Minimum build year

### `search_locations` (~476 tokens)

Search Sailing Destinations

Find marinas, harbours and anchorages three ways: by NAME (q), by POPULARITY within an area (region/country/city — ranked on observed AIS vessel traffic for a month), or by REACH from a place you already have (`from` + `within_nm`) — where boats are actually recorded sailing to from there, with measured passage times. Use `from` for "where can I sail from X", "what is a day sail from X", "somewhere quieter nearby". Provide q, or an area, or from.

Input parameters:

- `city` (string)
- `country` (string): Country name or 2-letter code
- `from` (string): Origin location id (or slug) to sail FROM — take it from an earlier search_locations or get_location_details result. Returns places boats were tracked sailing to from there.
- `limit` (integer)
- `month` (integer): Month to rank popularity for (default: current month)
- `q` (string): Name search (min 2 chars). Optional when an area filter is given.
- `region` (string): Sailing region as the guest says it: Dalmatia, Istria, Kvarner, the Ionian, the Saronic, the Cyclades, the Dodecanese, the Sporades
- `sort` (string): Default popularity = real vessel traffic for the month; boats = charter fleet size; rating = Google rating
- `type` (string): Kind of place — e.g. anchorage for "quiet bays"; spot = an unclassified stop (beach, spit, headland)
- `within_nm` (integer): How far, in nautical miles, for a "from" search. Default 35. Pick the ring by time — a charter boat makes about 6 knots, plus 30 minutes to leave and arrive, so: 10nm ≈ 2.2h, 20nm ≈ 3.8h, 35nm ≈ 6.3h…

### `search_pois` (~100 tokens)

Find Nearby Points of Interest

Find restaurants, fuel, groceries, attractions near a location, or search by POI name. POIs carry no ratings — rank and describe them by what they are and how close they are.

Input parameters:

- `category` (string)
- `limit` (integer)
- `location` (string): Location name (fuzzy). Required unless q is provided.
- `location_id` (string)
- `q` (string): Search POI by name

### `search_routes` (~115 tokens)

Find Sailing Routes

Find sailing passages between destinations with distance and difficulty.

Input parameters:

- `difficulty` (string)
- `from` (string): Place the passage starts or ends at, as the guest says it ("Sivota", "Nydri, Greece", "Dalmatia"). Resolved to a real place; if it resolves to nothing you get `from_unresolved` and no passages, never…
- `limit` (integer)
- `location_id` (string)
- `q` (string): Search route by title

### `search_trips` (~151 tokens)

Find Sailing Itineraries

Find existing curated sailing itineraries by location, name, duration, activities.

Input parameters:

- `activities` (string): Comma-separated activities
- `boat_type` (string)
- `limit` (integer)
- `location` (string): Place the itinerary passes through, as the guest says it ("Split", "Nydri, Greece", "Dalmatia", "Croatia"). Resolved to a real place; if it resolves to nothing you get `location_unresolved` and no it…
- `location_id` (string)
- `max_days` (integer)
- `min_days` (integer)
- `q` (string): Search itinerary by title

### `search_content` (~99 tokens)

Search Sailing Knowledge Base

Search articles and Q&A on charter.boats. Use for questions about booking process, costs, licenses, cancellation, deposits, check-in, packing, etc. For developer questions about our API (endpoints, keys, params), use type=api to search the API docs at docs.charter.boats.

Input parameters:

- `limit` (integer)
- `q` (string, required): Short keyword query (2-4 words)
- `type` (string)

### `get_boat_details` (~253 tokens)

Get Boat Details

Get full details of a specific boat: security deposit, cancellation policy, amenities, fees, seasonal prices, check-in/out times, location details — and the dates it is actually free (priced date ranges plus bookable slots for the year ahead). Use when the user asks about a specific boat, and whenever a boat came back in `named_matches` and they want to know when it IS available. With dates, `stay_price` states Due now, Paid at pickup and Total first, then the charter, its discounts and the deposits.

Input parameters:

- `date_from` (string): Optional check-in date YYYY-MM-DD of the stay you are quoting. With date_to, `fees` are the ones that apply to that stay, and `url` opens the boat on those dates when they are one of `bookable_slots`…
- `date_to` (string): Optional check-out date YYYY-MM-DD — see date_from.
- `guests` (number): Optional: the party the stay is priced for; without it, the boat's capacity.
- `id` (string, required): Boat id from search_boats results (including named_matches) — copy it verbatim.

### `get_boat_standouts` (~567 tokens)

What Stands Out About a Boat

What stands out about ONE boat for one week, measured against similar boats: its pros and its cons, each with how it compares ("47.9 ft (better than 99%)", "€2000 security deposit (typical €1700)", "Rare kit: [0.8%] Cool Box" — n% of those boats have it). Use when the guest asks what is special about a boat, what the catch is, why it is cheap or dear, or how it compares with others. It measures build year, length, cabins, bathrooms, guests, the security deposit and kit — and, with date_from, check-in and check-out times, the changeover day and the open weeks left; any of those it does not list is ordinary among the boats in `compared_with`, so do not sell it as an edge or a catch. Other fees are not compared. Kit is measured two ways and both hold: get_boat_details gives each item its [n%] across the whole fleet, this tool what is rare among boats like it. `rare_kit` lists that rare kit as data, most useful first, each with `useful_score` (1-5: how much it changes a charter week for the people aboard). `note` says whether an absence means "ordinary" or that nothing could be compared.

Input parameters:

- `compare_by` (string): Which boats count as similar. price (default): the same type priced within ±5% — what else the same money buys. guests: the same type taking the same number of guests — use when the question is value…
- `cutoff_pct` (number): Optional, default 10, at most 50: a pro beats all but this share of the similar boats, a con trails all but it, rare kit is on fewer than it. Raise it for more, weaker lines.
- `date_from` (string): Optional check-in date YYYY-MM-DD of the week the guest is looking at: the boats are then compared on that week's prices, and its schedule and open weeks are judged. Pass it whenever the guest has da…
- `fallback` (boolean): Optional, default true: with nothing past the cut-off on a side, name the one thing that beats (or trails) most of them. false returns only what clears the cut-off.
- `id` (string, required): Boat id from search_boats or get_boat_details — copy it verbatim.

### `compare_boat` (~643 tokens)

Compare a Boat With Similar Boats

One boat against the 10 closest published boats of the same type in the same country: specs and the all-in weekly price (EUR, at max guests, the figure search compares) for each of the next 52 weeks. Pass `id` (a boat), or `boat_type` and `country` (optionally `region`, `city`) to describe one. The specs take search_boats' names: without `id` they describe the boat to compare; with `id` they filter its peers as search_boats would. Only boats open at least one week are compared. `similar_pct` is how alike a peer is: the specs it shares, averaged with `overlap_pct` (the share of the boat's open weeks the peer is open too) when there is a boat. With `id`, `anchor.price` is the boat's weekly figures, a peer's `price` is its figure minus the boat's (its own in the weeks listed in `absolute_weeks`), and a peer carries its `region`, `city`, `same` (the fields it shares with the boat) and only the specs that differ, as signed deltas; without `id` every peer carries its own specs and figures. null = not sellable that week; `weeks` gives each check-in date. Use when someone asks how a boat compares with others nearby on price, size or age — an operator benchmarking their own boat included. For what is better or worse about one boat, use get_boat_standouts.

Input parameters:

- `berths` (number): Berths: without id the number to match, with id the minimum.
- `boat_type` (string): Without id: the boat type (required with country).
- `cabins` (number): Cabins: without id the number to match; with id the minimum guest cabins, crew cabins not counted (as search_boats).
- `city` (string): Without id, optional: city or town, e.g. Split.
- `country` (string): Without id: ISO country code, e.g. HR (required with boat_type).
- `guests` (number): Guests: without id the number to match, with id the minimum.
- `id` (string): Boat id from search_boats or get_boat_details — copy it verbatim. Omit to describe a boat by its specs.
- `length_max` (integer): Maximum length in feet.
- `length_min` (integer): Minimum length in feet.
- `lock` (array): With id: keep only peers the same as the boat in these fields — the fields a peer's `same` lists.
- `makemodel` (string): Make and/or model as the guest said it, e.g. "Lagoon 42", "Bali".
- `region` (string): Without id, optional: sailing region, e.g. Dalmatia.
- `toilets` (number): Toilets: without id the number to match, with id the minimum.
- `year_max` (integer): Maximum build year.
- `year_min` (integer): Minimum build year.

### `get_poi_details` (~91 tokens)

Get Point of Interest Details

Get full details of a point of interest by ID: description, opening hours, address, contact, nearby marinas, special offers. Use when user is viewing or asks about a specific POI. POIs carry NO rating or review count — do not claim one or ask the guest to check it.

Input parameters:

- `id` (string, required): POI id from search_pois results — copy it verbatim.

### `get_location_details` (~193 tokens)

Get Marina/Location Details

Get full details of a marina, anchorage or bay by ID: description, amenities, contact, boat count and cheapest day rate, PLUS what only we know from tracked AIS traffic — how busy it is in each month of the year, how boats use it (share of overnight visits, typical day-stop length, what time it fills up), whether it is a hidden gem, the places boats actually sail to from there, most-travelled first with the share of the tracked trips each one takes and an estimated passage time, and the nearest bookable base for a spot with no fleet of its own. Use when the user is viewing or asks about a specific place, asks when it is quiet, or asks where to go next from one. Busyness compares a place to its own peak month, never to another place.

Input parameters:

- `id` (string, required): Location id from search_locations results — copy it verbatim.

### `get_trip_details` (~65 tokens)

Get Trip/Itinerary Details

Get full details of a sailing itinerary/trip by ID: day-by-day stops, distances, activities, highlights, notes. Use when user is viewing or asks about a specific trip.

Input parameters:

- `id` (string, required): Trip id from search_trips results — copy it verbatim.

### `list_boats` (~97 tokens)

The operator's own fleet: every boat of each company the key holder belongs to, published or not, with its company's name, specs, pricing source, changeover settings and photos. Start here: it gives the boat ids and company ids every other operator tool takes. An empty list means the account belongs to no company.

Input parameters:

- `company_id` (string): Optional: one company only. Without it, every company the account belongs to.

### `get_boat` (~74 tokens)

One of the operator's boats in full, as its edit page shows it: every editable field, photos with their ids, videos, equipment (hidden items included) and `locked_fields`, the fields MMK or Nausys rewrite on every sync.

Input parameters:

- `id` (string, required): Boat id, from list_boats.

### `update_boat` (~387 tokens)

Change details of one of the operator's boats; only the fields sent change, and a field listed in `locked_fields` is ignored because the partner sync owns it. The answer carries `is_published` and `missing`, what the boat still lacks to be listed. Read the current value with its read tool first; this call returns the value as it now stands.

Input parameters:

- `berths` (integer)
- `boat_type` (string)
- `cabins` (integer)
- `capacity` (integer): Maximum guests.
- `charter_day` (integer): Changeover weekday, 0 Sunday to 6 Saturday.
- `check_in_periods` (array): Check-in rules by date range, in the shape get_boat returns them.
- `checkin_time` (string): HH:MM
- `checkout_time` (string): HH:MM
- `deposit_with_waiver` (number): EUR: the deposit when the guest takes the damage waiver.
- `description` (string)
- `features` (array): The owner-entered equipment slugs, the whole list: it replaces the previous one.
- `id` (string, required): Boat id, from list_boats.
- `instant_book` (boolean)
- `length_ft` (number): On a partner-synced boat this pins the length against the sync.
- `length_unpin` (boolean): true restores the governed length of a pinned boat.
- `location_id` (integer): Home marina id.
- `manufacturer_id` (string)
- `min_charter_days` (integer)
- `model` (string)
- `rental_type` (string)
- `security_deposit` (number): EUR.
- `skipper` (integer): 1 when a skipper is required.
- `title` (string)
- `toilets` (integer)
- `year` (integer)

### `set_equipment_visibility` (~93 tokens)

Hide an equipment item from the boat's public listing and search, or show it again; the same item under another wording follows it. Use the item's name as get_boat lists it in `equipment_items`. Returns the new state.

Input parameters:

- `hidden` (boolean, required)
- `id` (string, required): Boat id, from list_boats.
- `name` (string, required): The item as get_boat lists it.

### `update_boat_images` (~122 tokens)

Hide one photo, show a hidden one again, or set the photo order (the first is the cover); send one of the three. Photo ids come from get_boat. Returns the boat with its photos as they now stand. New photos are uploaded on the boat's edit page.

Input parameters:

- `disable_id` (string): Photo id to hide.
- `enable_id` (string): Photo id to show again.
- `id` (string, required): Boat id, from list_boats.
- `image_ids` (array): Every photo id in the new order.

### `delete_boat_image` (~61 tokens)

Delete one photo of the boat for good. To take a photo off the listing and keep it, use update_boat_images with disable_id.

Input parameters:

- `id` (string, required): Boat id, from list_boats.
- `image_id` (string, required)

### `get_company` (~97 tokens)

The company profile as its settings page holds it: public profile, contact, bank, tax and invoicing details, the cancellation policy (`cancel_refund_percent` refunded when the guest cancels at least `cancel_refund_days` before the charter), the X-Lock switch (in `settings`) and the member and boat counts.

Input parameters:

- `company_id` (string, required): Company id, from list_boats (`company_id`) or get_company.

### `update_company` (~360 tokens)

Change company details; only the fields sent change. Any member may change the public profile; contact email, bank, tax and invoicing details are the owner's, and a request naming one from anyone else is refused whole. Read the current value with its read tool first; this call returns the value as it now stands.

Input parameters:

- `about` (string)
- `address_line1` (string)
- `address_line2` (string)
- `bank_name` (string): Owner only.
- `bic_swift` (string): Owner only.
- `city` (string)
- `company_id` (string, required): Company id, from list_boats (`company_id`) or get_company.
- `country_code` (string)
- `cover_image_url` (string)
- `description` (string)
- `email` (string): Owner only: where bookings and guest messages are sent.
- `iban` (string): Owner only: the EUR payout account.
- `invoice_email` (string): Owner only.
- `legal_name` (string): Owner only.
- `logo_url` (string)
- `name` (string)
- `phone` (string)
- `postal_code` (string)
- `registration_number` (string): Owner only.
- `slug` (string): The address of the company page.
- `state` (string)
- `tax_id` (string): Owner only.
- `usd_account_number` (string): Owner only: the USD payout account.
- `usd_bank_name` (string): Owner only.
- `usd_bic_swift` (string): Owner only.
- `vat_number` (string): Owner only.
- `vat_registered` (boolean): Owner only.
- `website_url` (string)

### `get_cancellation_limits` (~111 tokens)

What the company's payment schedule means for its cancellation policy: per boat source, the share paid in advance and how many days before the charter the rest is due, with the largest refund each notice period covers from money already collected. Read beside get_company's `cancel_refund_percent` and `cancel_refund_days`. `policy_applies` false: the company has no MMK or Nausys boat, so its policy governs nothing and cannot be changed.

Input parameters:

- `id` (string, required): Company id.

### `set_cancellation_policy` (~168 tokens)

Set the company's cancellation policy, company owners only: a guest who cancels at least `cancel_refund_days` before the charter gets `cancel_refund_percent` of the charter price back. The policy applies to the company's MMK and Nausys bookings only; its direct boats follow charter.boats terms, so a company whose boats are all direct is refused. Read get_cancellation_limits first. Returns the company as it now stands.

Input parameters:

- `cancel_refund_days` (integer, required): Days before the charter the guest must cancel by, 1 to 90.
- `cancel_refund_percent` (integer, required): Share of the charter price refunded, 0 to 100.
- `company_id` (string, required): Company id, from list_boats (`company_id`) or get_company.

### `set_cross_lock` (~144 tokens)

Switch X-Lock for a company, company admins and owners only. With X-Lock on, every block, option or booking placed on one partner calendar (MMK or Nausys) also places a hold on the boat's other partner calendar. `sync_existing` true also places or releases those holds for the bookings and blocks already there. Returns the company as it now stands. Read the current value with its read tool first; this call returns the value as it now stands.

Input parameters:

- `company_id` (string, required): Company id, from list_boats (`company_id`) or get_company.
- `enabled` (boolean, required)
- `sync_existing` (boolean)

### `list_discounts` (~105 tokens)

The company's active discounts: codes guests type at checkout, automatic ones, and the pay-in-full discount, each with its value, booking window (`start_date`..`end_date`), stay window (`stay_from`..`stay_to`) and the boats it covers (`all_boats`, else `boat_ids`). An empty list means the company runs no discount.

Input parameters:

- `company_id` (string, required): Company id, from list_boats (`company_id`) or get_company.

### `create_discount` (~289 tokens)

Create a discount; it comes out of the operator's payout, never out of the platform commission. Returns the stored discount.

Input parameters:

- `all_boats` (boolean): false limits it to `boat_ids`.
- `auto_apply` (boolean): true applies it without a code.
- `boat_ids` (array)
- `code` (string): The code guests type; required unless trigger is pay_in_full.
- `company_id` (string, required): Company id, from list_boats (`company_id`) or get_company.
- `currency` (string): EUR or USD: the currency a fixed amount is in.
- `description` (string): Shown to the guest.
- `discount_type` (string, required): `percentage` or `fixed`.
- `discount_value` (number, required): The percent, or for fixed the amount in `currency` (EUR when omitted).
- `end_date` (string): Last day it can be booked, YYYY-MM-DD.
- `max_uses` (integer)
- `start_date` (string): First day it can be booked, YYYY-MM-DD.
- `stay_from` (string): Earliest check-in it covers, YYYY-MM-DD.
- `stay_to` (string): Latest check-in it covers, YYYY-MM-DD.
- `trigger` (string): `code` (default) or `pay_in_full`, a percentage taken when the guest pays everything at once.

### `update_discount` (~253 tokens)

Change a discount; only the fields sent change. Read the current value with its read tool first; this call returns the value as it now stands.

Input parameters:

- `all_boats` (boolean): false limits it to `boat_ids`.
- `auto_apply` (boolean): true applies it without a code.
- `boat_ids` (array)
- `code` (string)
- `currency` (string): EUR or USD: the currency a fixed amount is in.
- `description` (string): Shown to the guest.
- `discount_type` (string): `percentage` or `fixed`.
- `discount_value` (number): The percent, or for fixed the amount in `currency` (EUR when omitted).
- `end_date` (string): Last day it can be booked, YYYY-MM-DD.
- `id` (string, required): Discount id, from list_discounts.
- `is_active` (boolean)
- `max_uses` (integer)
- `start_date` (string): First day it can be booked, YYYY-MM-DD.
- `stay_from` (string): Earliest check-in it covers, YYYY-MM-DD.
- `stay_to` (string): Latest check-in it covers, YYYY-MM-DD.

### `delete_discount` (~39 tokens)

End a discount: guests can no longer use it; bookings already made keep it.

Input parameters:

- `id` (string, required): Discount id, from list_discounts.

### `get_pricing` (~100 tokens)

The season prices of the fleet: per boat, every week-price row with its id, date span (month/day, repeating every year), `price_per_day` and `source`. Rows with `source` mmk or nausys come from the partner and change there; rows with `source` direct are the operator's to edit with add_price, update_price and delete_price.

Input parameters:

- `company_id` (string): Optional: one company only.

### `add_price` (~114 tokens)

Add a season price to a boat the operator prices directly (pricing source direct). Returns the stored row.

Input parameters:

- `end_day` (integer, required)
- `end_month` (integer, required)
- `id` (string, required): Boat id, from list_boats.
- `name` (string, required): Season name.
- `price_per_day` (number, required): EUR per day for the boat.
- `priority` (integer): The higher one wins where two seasons overlap.
- `start_day` (integer, required)
- `start_month` (integer, required)

### `update_price` (~140 tokens)

Change a direct season price; only the fields sent change. Read the current value with its read tool first; this call returns the value as it now stands.

Input parameters:

- `end_day` (integer)
- `end_month` (integer)
- `id` (string, required): Boat id, from list_boats.
- `name` (string): Season name.
- `price_id` (string, required): Row id, from get_pricing.
- `price_per_day` (number): EUR per day for the boat.
- `priority` (integer): The higher one wins where two seasons overlap.
- `start_day` (integer)
- `start_month` (integer)

### `delete_price` (~56 tokens)

Delete a direct season price; the dates it covered have no price until another row covers them.

Input parameters:

- `id` (string, required): Boat id, from list_boats.
- `price_id` (string, required): Row id, from get_pricing.

### `list_boat_fees` (~73 tokens)

Every extra and fee row of a boat, as its edit page lists them: amount, period, whether it is required, how it is collected, and its `source`. Rows with `source` direct are the operator's to edit.

Input parameters:

- `id` (string, required): Boat id, from list_boats.

### `add_fee` (~226 tokens)

Add an extra or fee to a boat the operator prices directly. Returns the stored row and `warnings`, other rows it overlaps.

Input parameters:

- `amount` (number, required): EUR, or a percent when amount_is_percentage.
- `amount_is_percentage` (boolean)
- `calculation_type` (string): How it is collected: `separate_payment` paid at the base (default), `advance_payment` charged at booking, `included_in_price`.
- `category` (string)
- `description` (string, required): The fee as guests read it.
- `id` (string, required): Boat id, from list_boats.
- `on_request` (boolean)
- `percentage_base` (string): What the percentage is taken on; empty is the charter price.
- `period` (string, required): How it is counted, per booking, day, night, person or week; the answer to a wrong value lists the allowed ones.
- `required` (boolean): true when every guest pays it.
- `valid_from` (string): YYYY-MM-DD
- `valid_to` (string): YYYY-MM-DD

### `update_fee` (~249 tokens)

Change a direct fee row; only the fields sent change. Read the current value with its read tool first; this call returns the value as it now stands.

Input parameters:

- `amount` (number): EUR, or a percent when amount_is_percentage.
- `amount_is_percentage` (boolean)
- `calculation_type` (string): How it is collected: `separate_payment` paid at the base (default), `advance_payment` charged at booking, `included_in_price`.
- `category` (string)
- `description` (string): The fee as guests read it.
- `fee_id` (string, required): Row id, from list_boat_fees.
- `id` (string, required): Boat id, from list_boats.
- `on_request` (boolean)
- `percentage_base` (string): What the percentage is taken on; empty is the charter price.
- `period` (string): How it is counted, per booking, day, night, person or week; the answer to a wrong value lists the allowed ones.
- `required` (boolean): true when every guest pays it.
- `valid_from` (string): YYYY-MM-DD
- `valid_to` (string): YYYY-MM-DD

### `delete_fee` (~45 tokens)

Delete a direct fee row.

Input parameters:

- `fee_id` (string, required): Row id, from list_boat_fees.
- `id` (string, required): Boat id, from list_boats.

### `list_calendars` (~79 tokens)

The external calendars (iCal feeds, a Google Calendar by its secret iCal address) connected to one boat, with their sync state. MMK and Nausys are linked automatically and are not listed here. An empty list means none is connected to that boat.

Input parameters:

- `boat_id` (string, required): Boat id, from list_boats.

### `add_calendar` (~89 tokens)

Connect an external calendar to a boat: its events block those dates on charter.boats. Returns the stored source; sync_calendar pulls it at once.

Input parameters:

- `boat_id` (string, required): Boat id, from list_boats.
- `source_name` (string, required): A name for it.
- `source_type` (string): Default `ical`.
- `source_url` (string, required): The https iCal address.

### `remove_calendar` (~50 tokens)

Disconnect an external calendar: its blocked dates are freed, and the holds X-Lock placed for them on the partner calendars are released.

Input parameters:

- `id` (string, required): Source id, from list_calendars.

### `sync_calendar` (~44 tokens)

Pull one external calendar now. Returns how many events it brought in, or the error the feed gave.

Input parameters:

- `id` (string, required): Source id, from list_calendars.

### `get_availability` (~81 tokens)

The company's fleet calendar: every boat with its partner links, and every event that takes dates — bookings, options, blocks and synced partner or iCal events — each with its source. Read it before add_block to see what a range already holds.

Input parameters:

- `company_id` (string, required): Company id, from list_boats (`company_id`) or get_company.

### `add_block` (~118 tokens)

Block dates on one of the operator's boats so they cannot be booked. On a partner-synced boat the hold is placed on that partner too, and with X-Lock on also on the other partner. Returns the stored block and how each hold went.

Input parameters:

- `boat_id` (string, required): Boat id, from list_boats.
- `end_at` (string, required): Last day, YYYY-MM-DD.
- `notes` (string)
- `reason` (string)
- `start_at` (string, required): First day, YYYY-MM-DD.

### `remove_block` (~55 tokens)

Remove a block the operator placed, freeing its dates and releasing the partner holds it placed.

Input parameters:

- `id` (string, required): Block id: `block_id` on the event in get_availability, or `id` from add_block.

### `list_bookings` (~135 tokens)

Every booking on the operator's boats, newest charter first. `status` and `payment_status` give the stage: `waitlist` is On waitlist (queued behind another hold), unpaid `pending` or `accepted` is an Option that lapses at `hold_expires_at`, and a booking with money in is booked. Each row states the price the guest pays, the discounts and the operator's own payout, in the currency of `payout_money`. Read-only: bookings are handled on the dashboard. An empty list means no bookings yet.

Input parameters:

- `boat_id` (string): Optional: one boat only.

### `get_booking` (~73 tokens)

One booking in full: stage (as in list_bookings), dates, guest, price lines, the operator's payout and `payout_schedule`, the payments coming to the operator with their due dates (empty until the booking is paid). Read-only.

Input parameters:

- `id` (string, required): Booking id, from list_bookings.

### `get_earnings` (~62 tokens)

The company's earnings: total and monthly payouts, payouts still pending on accepted bookings, and the latest bookings, in the currency the operator is paid in.

Input parameters:

- `company_id` (string, required): Company id, from list_boats (`company_id`) or get_company.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/boats-charter-charter-boats/charter#diagnostics

## Score history

- 2026-10-18: 59
- 2026-10-17: 59
- 2026-10-16: 58
- 2026-10-15: 64
- 2026-10-14: 63
- 2026-10-13: 63
- 2026-10-12: 62

## Common questions

### What is the Charter Boats MCP server?

Charter Boats is an MCP server listed in the public MCP registry as boats.charter/charter-boats. Search 14,000+ charter boats with live prices, plus marinas, anchorages, routes and itineraries. This page covers its hosted endpoint (https://charter.boats/mcp).

### Is the Charter Boats MCP server safe to use?

Charter Boats scores 59 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Charter Boats MCP server expose?

Charter Boats exposes 45 tools: search_boats, search_locations, search_pois, search_routes, search_trips, and 40 more. Their descriptions and schemas cost roughly 9,490 tokens of context every time the server is loaded.

### Does the Charter Boats MCP server require authentication?

No. We connected to Charter Boats without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Charter Boats MCP server still maintained?

Charter Boats is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://charter.boats/mcp
- Repository: https://github.com/dkremsa/charter-boats-mcp
- Website: https://charter.boats/mcp
- Changelog RSS feed: https://verifymcp.io/servers/boats-charter-charter-boats/charter.xml
- Changelog JSON feed: https://verifymcp.io/servers/boats-charter-charter-boats/charter.json
- HTML version of this page: https://verifymcp.io/servers/boats-charter-charter-boats/charter
