# The Charter Desk (remote · thecharterdesk.com)

Live prices, free weeks and deals on 9,000+ charter yachts from 800+ operators in 50 countries.

- Trust score: 67/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

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

## Components

- remote · `thecharterdesk.com`: 67/100 (this document), [markdown](https://verifymcp.io/servers/com-thecharterdesk-yacht-charter/thecharterdesk.md), [page](https://verifymcp.io/servers/com-thecharterdesk-yacht-charter/thecharterdesk)

## Channel facts

- Endpoint: `https://thecharterdesk.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.2`

## 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-11-05.

- **Endpoint Security**: 63/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 (request_quote).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - 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**: 71/100
  - 100% 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 3068 tokens (~438/item across 7 items; 5 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 17/100
  - Stability observed for 5 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 5 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 7 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 73/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### How do I install the The Charter Desk MCP server?

The Charter Desk is a hosted endpoint at https://thecharterdesk.com/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 com-thecharterdesk-yacht-charter 'https://thecharterdesk.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-thecharterdesk-yacht-charter": {
      "url": "https://thecharterdesk.com/mcp"
    }
  }
}
```

### VS Code

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

### Codex

```toml
[mcp_servers.com-thecharterdesk-yacht-charter]
url = "https://thecharterdesk.com/mcp"
```

### opencode

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

### OpenClaw

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

### Hermes

```yaml
mcp_servers:
  com-thecharterdesk-yacht-charter:
    url: "https://thecharterdesk.com/mcp"
```

### Netclaw

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

### Vellum

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

### Other

```json
{
  "mcpServers": {
    "com-thecharterdesk-yacht-charter": {
      "type": "http",
      "url": "https://thecharterdesk.com/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-11-05 (score 67, 0)

- [cosmetic] “best_deals” reworded the description of “charter_types”
- [cosmetic] “best_deals” reworded the description of “place”
- [cosmetic] “best_deals” reworded the description of “yacht_types”
- [cosmetic] “search_yachts” reworded the description of “charter_types”
- [cosmetic] “search_yachts” reworded the description of “place”
- [cosmetic] “search_yachts” reworded the description of “yacht_types”

### 2026-11-04 (score 67, +1)

- [cosmetic] “best_deals” reworded the description of “charter_types”
- [cosmetic] “best_deals” reworded the description of “yacht_types”
- [cosmetic] “price_range” reworded the description of “place”
- [cosmetic] “search_yachts” reworded the description of “charter_types”
- [cosmetic] “search_yachts” reworded the description of “yacht_types”

### 2026-11-03 (score 66, +1)

- [functional improvement] Schema quality: 504 → 438
- [functional] First check of Capabilities: pass
- [functional] New resource “answer-card”
- [cosmetic] “best_deals” reworded the description of “charter_types”
- [cosmetic] “best_deals” reworded the description of “place”
- [cosmetic] “best_deals” reworded the description of “yacht_types”
- [cosmetic] “search_yachts” reworded the description of “charter_types”
- [cosmetic] “search_yachts” reworded the description of “place”
- [cosmetic] “search_yachts” reworded the description of “yacht_types”

### 2026-11-02 (score 65, −6)

- [critical regression] Authorization: partial → fail
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “request_quote” rewrote its description, which is the text the model reads
- [security] Tool “best_deals” rewrote its description, which is the text the model reads
- [security] Tool “get_yacht” rewrote its description, which is the text the model reads
- [security] Tool “price_range” rewrote its description, which is the text the model reads
- [security] Tool “search_yachts” rewrote its description, which is the text the model reads
- [security] Tool “request_quote” is now declared destructive
- [functional improvement] Schema quality: 627 → 504
- [cosmetic] “best_deals” reworded the description of “limit”
- [cosmetic] “best_deals” reworded the description of “place”
- [cosmetic] “best_deals” reworded the description of “sort”
- [cosmetic] “get_yacht” reworded the description of “limit”
- [cosmetic] “request_quote” reworded the description of “session”
- [cosmetic] “search_yachts” reworded the description of “limit”
- [cosmetic] “search_yachts” reworded the description of “place”
- [cosmetic] “search_yachts” reworded the description of “sort”
- [cosmetic] “best_deals” reworded the description of “charter_types”
- [cosmetic] “best_deals” reworded the description of “yacht_types”
- [cosmetic] “price_range” reworded the description of “place”
- [cosmetic] “price_range” reworded the description of “type”
- [cosmetic] “search_yachts” reworded the description of “charter_types”
- [cosmetic] “search_yachts” reworded the description of “yacht_types”
- [cosmetic] “best_deals” dropped the optional parameter “beamMax”
- [cosmetic] “best_deals” dropped the optional parameter “beamMin”
- [cosmetic] “best_deals” dropped the optional parameter “draftMax”
- [cosmetic] “best_deals” dropped the optional parameter “draftMin”
- [cosmetic] “best_deals” dropped the optional parameter “email”
- [cosmetic] “best_deals” dropped the optional parameter “fuelMax”
- [cosmetic] “best_deals” dropped the optional parameter “fuelMin”
- [cosmetic] “best_deals” dropped the optional parameter “name”
- [cosmetic] “best_deals” dropped the optional parameter “phone”
- [cosmetic] “best_deals” dropped the optional parameter “session”
- [cosmetic] “best_deals” dropped the optional parameter “waterMax”
- [cosmetic] “best_deals” dropped the optional parameter “waterMin”
- [cosmetic] “best_deals” dropped the optional parameter “yearMax”
- [cosmetic] “best_deals” dropped the optional parameter “yearMin”
- [cosmetic] “get_yacht” dropped the optional parameter “email”
- [cosmetic] “get_yacht” dropped the optional parameter “name”
- [cosmetic] “get_yacht” dropped the optional parameter “phone”
- [cosmetic] “get_yacht” dropped the optional parameter “session”
- [cosmetic] “price_range” dropped the optional parameter “email”
- [cosmetic] “price_range” dropped the optional parameter “name”
- [cosmetic] “price_range” dropped the optional parameter “phone”
- [cosmetic] “price_range” dropped the optional parameter “session”
- [cosmetic] “search_yachts” dropped the optional parameter “beamMax”
- [cosmetic] “search_yachts” dropped the optional parameter “beamMin”
- [cosmetic] “search_yachts” dropped the optional parameter “draftMax”
- [cosmetic] “search_yachts” dropped the optional parameter “draftMin”
- [cosmetic] “search_yachts” dropped the optional parameter “email”
- [cosmetic] “search_yachts” dropped the optional parameter “fuelMax”
- [cosmetic] “search_yachts” dropped the optional parameter “fuelMin”
- [cosmetic] “search_yachts” dropped the optional parameter “name”
- [cosmetic] “search_yachts” dropped the optional parameter “phone”
- [cosmetic] “search_yachts” dropped the optional parameter “session”
- [cosmetic] “search_yachts” dropped the optional parameter “waterMax”
- [cosmetic] “search_yachts” dropped the optional parameter “waterMin”
- [cosmetic] “search_yachts” dropped the optional parameter “yearMax”
- [cosmetic] “search_yachts” dropped the optional parameter “yearMin”

### 2026-11-01 (score 71, 0)

- [functional improvement] Stability: unverified → 0.03
- [cosmetic] “best_deals” reworded the description of “charter_types”
- [cosmetic] “best_deals” reworded the description of “yacht_types”
- [cosmetic] “search_yachts” reworded the description of “charter_types”
- [cosmetic] “search_yachts” reworded the description of “yacht_types”

### 2026-10-31 (score 71)

First indexed and scored.

## MCP tools (5)

### `search_yachts` (~966 tokens)

Search yachts

Use it when the person describes the yachts they want: where, when, how many people, a size, a type or a budget. Pass each wish as its typed filter (a list is any of its values; every filter must hold), and from / to whenever they gave exact days. With dates every row is free for that stay and carries its price, list price, discount and when the source was checked (checkedAt); without dates each row has its from-price. priceMin / priceMax count the mandatory extras. Every row links to its page on this site, with a photo: send the person there. notApplied lists the wishes that could not narrow the search. When nothing matches exactly, the rows are the nearest match and nearest says what was widened: tell the person. Paged: total and cursor. For deals or last-minute offers call best_deals; for what a stay costs before any dates, price_range; once they name or pick one, get_yacht.

Input parameters:

- `base` (string): The exact base it leaves from, in words.
- `berthsMax` (number): Berths at most (on this site 0 to 80).
- `berthsMin` (number): Berths at least (on this site 0 to 80).
- `cabinsMax` (number): Cabins at most (on this site 0 to 20).
- `cabinsMin` (number): Cabins at least (on this site 0 to 20).
- `charter_types` (array): Charter Types: any of these value ids (one or more): all-inclusive (All-inclusive, 47); bareboat (Bareboat, 7891); cabin-charter (Cabin charter, 98); crewed (Crewed, 1333); day-charter (Day charter,…
- `cursor` (string): The cursor a previous answer returned, for its next page.
- `discountOnly` (boolean): true: only those with a discount the source states.
- `from` (string): Check-in day, YYYY-MM-DD.
- `headsMax` (number): Heads at most (on this site 0 to 23).
- `headsMin` (number): Heads at least (on this site 0 to 23).
- `lengthMax` (number): Length at most ft (on this site 13.35 to 180.45).
- `lengthMin` (number): Length at least ft (on this site 13.35 to 180.45).
- `limit` (number): Rows per page: at most 10 when browsing, 20 once the person is signed in.
- `party` (number): How many people.
- `place` (string): Where, in words or as a place id: a region, country or area, and everything in it, e.g. Mediterranean, Worldwide, Caribbean, North America, Greece, Croatia, Italy, France, Turkey, British Virgin Isla…
- `priceMax` (number): The most to pay, in the site currency: the price plus the mandatory extras.
- `priceMin` (number): The least to pay, in the site currency: the price plus the mandatory extras.
- `sort` (string): price (default, cheapest first), discount (biggest first), or length (length, biggest first), cabins (cabins, biggest first), berths (berths, biggest first), heads (heads, biggest first).
- `text` (string): Words in its name or model, e.g. a builder or a model name.
- `to` (string): Check-out day, YYYY-MM-DD.
- `yacht_types` (array): Yacht Types: any of these value ids (one or more): catamarans (Catamarans, 2886); gulets (Gulets, 143); houseboats (Houseboats, 1362); motorboats (Motorboats, 699); sailboats (Sailboats, 4161).

Output parameters:

- `browsing` (boolean): true: answered without sign-in, so fewer rows and the first pages only.
- `checked` (boolean): true: dates were given, so every row is free for them.
- `checkedAt` (string|null): When the source was read, ISO time.
- `cursor` (string|null): Pass as cursor for the next page; null on the last.
- `items` (array): One page of matches.
- `leftOutUnpriced` (number): Matches left out under priceMin / priceMax because no price is known.
- `nearest` (object): Only when nothing matched exactly: these rows are the nearest match.
- `next` (string): When browsing: how to get a quote or more rows.
- `notApplied` (array): What the person asked for that could not narrow the search.
- `total` (number): How many rows match in all.
- `unchecked` (array): What was said but could not be checked.

### `get_yacht` (~258 tokens)

Get one yacht

Use it once the person names or picks one yacht from a search_yachts or best_deals answer: pass its page link, exactly as that answer returned it, as id. It answers the yacht's facts and terms as the source states them (packages, included, required and optional extras, deposit, check-in days and times, stay limits, equipment, the operator's descriptions) and its availability: with from / to, that stay's status and price and, when it is not free, the nearest free stays; without dates, its free stays, soonest first. A field left out is one the source does not state. To compare several, call search_yachts.

Input parameters:

- `cursor` (string): The cursor a previous answer returned, for its next page.
- `from` (string): Check-in day, YYYY-MM-DD.
- `id` (string, required): The yacht's page link (an absolute URL on this site), exactly as a search or best_deals returned it.
- `limit` (number): Rows per page: at most 10 when browsing, 20 once the person is signed in.
- `party` (number): How many people.
- `to` (string): Check-out day, YYYY-MM-DD.

Output parameters:

- `availability` (object): With dates: that stay and, when not free, the nearest free stays; without: its free stays, soonest first.
- `browsing` (boolean): true: answered without sign-in, so fewer rows and the first pages only.
- `checkedAt` (string|null): When the source was read, ISO time.
- `description` (string): Its description.
- `equipment` (array): Named equipment in groups.
- `facts` (array): The facts its page shows, labelled.
- `href` (string): Its page on this site, absolute URL.
- `item` (string): Its name.
- `kind` (string): Its type.
- `next` (string): When browsing: how to get a quote or more rows.
- `operatorDescriptions` (array): The operator's own texts and documents.
- `packages` (array): The ways it is sold, the default first, each with its included, required and optional extras.
- `place` (string): Where it is.
- `terms` (object): Deposit, licence, stay limits, check-in days and times, as stated.

### `price_range` (~216 tokens)

Price range

Use it when the person asks what a stay costs and has no exact days or yacht yet. Pass the place they named (in words, or a place value an invalid_place answer listed), the month and the party, and one type if they gave it. It answers the range of open departures there (p25, median and p75, in minor units of the currency), how many items it is from, the cheapest published one that fits and when the figures were built; seasonNote says in words how another month compares. An unknown place answers with the places that have figures. For yachts free on their days, call search_yachts.

Input parameters:

- `month` (string, required): YYYY-MM.
- `party` (number, required): How many people.
- `place` (string, required): Where, in words (a region, a country or an area inside one), or a place value as an unknown_place answer lists them.
- `type` (string): Optional: one Yacht Types value id, the same ids yacht_types takes. Leave out for any.

Output parameters:

- `browsing` (boolean): true: answered without sign-in, so fewer rows and the first pages only.
- `cheapest` (object|null): The cheapest published item that fits.
- `currency` (string): ISO 4217.
- `extrasMedianMinor` (number|null): The usual mandatory extras, minor units.
- `items` (number): How many items the figures are from.
- `lastMinuteSharePct` (number|null): Share of soon departures discounted.
- `month` (string): The month the figures are for, YYYY-MM.
- `next` (string): When browsing: how to get a quote or more rows.
- `noneFitParty` (boolean): true: no item there takes the party.
- `place` (string): The place answered, in the site's words (e.g. Italy).
- `placeId` (string): That place's value (e.g. country:italy), to pass back as place.
- `range` (object|null): p25, p50 (median), p75 in minor units of the currency (e.g. cents); null when too few items.
- `seasonHint` (object|null): Another month against this one: pct cheaper there (negative: dearer).
- `seasonNote` (string): The season hint in words, to tell the person.
- `thin` (boolean): true: few items, a rough figure.

### `best_deals` (~930 tokens)

Best deals

Use it when the person asks for deals, specials, discounts or last-minute offers. It answers discounted departures of this site's yachts, read from the live inventory: only a discount the source itself states (a special, or a price under its list price), never a computed gap; by default from tomorrow to 30 days ahead, leaving out a departure the yacht's calendar shows taken. One row per yacht: its page link (the id get_yacht and request_quote take), a photo and its departures, each with its dates, every route it leaves on, nights, price, list price, mandatory extras and saving, in the order asked. Narrow with the same typed filters as search_yachts. When none match, the rows are the nearest deals and nearest says what was widened. Paged: total and cursor. For given days whatever the price, call search_yachts.

Input parameters:

- `base` (string): The exact base it leaves from, in words.
- `berthsMax` (number): Berths at most (on this site 0 to 80).
- `berthsMin` (number): Berths at least (on this site 0 to 80).
- `cabinsMax` (number): Cabins at most (on this site 0 to 20).
- `cabinsMin` (number): Cabins at least (on this site 0 to 20).
- `charter_types` (array): Charter Types: any of these value ids (one or more): all-inclusive (All-inclusive, 47); bareboat (Bareboat, 7891); cabin-charter (Cabin charter, 98); crewed (Crewed, 1333); day-charter (Day charter,…
- `cursor` (string): The cursor a previous answer returned, for its next page.
- `from` (string): Earliest departure, YYYY-MM-DD.
- `headsMax` (number): Heads at most (on this site 0 to 23).
- `headsMin` (number): Heads at least (on this site 0 to 23).
- `lengthMax` (number): Length at most ft (on this site 13.35 to 180.45).
- `lengthMin` (number): Length at least ft (on this site 13.35 to 180.45).
- `limit` (number): Rows per page: at most 10 when browsing, 20 once the person is signed in.
- `party` (number): How many people.
- `place` (string): Where, in words or as a place id: a region, country or area, and everything in it, e.g. Mediterranean, Worldwide, Caribbean, North America, Greece, Croatia, Italy, France, Turkey, British Virgin Isla…
- `priceMax` (number): The most to pay, in the site currency: the price plus the mandatory extras.
- `priceMin` (number): The least to pay, in the site currency: the price plus the mandatory extras.
- `sort` (string): saving (default, biggest first), departure (soonest first), price (cheapest first), or length (length, biggest first), cabins (cabins, biggest first), berths (berths, biggest first), heads (heads, bi…
- `text` (string): Words in its name or model, e.g. a builder or a model name.
- `to` (string): Latest departure, YYYY-MM-DD.
- `yacht_types` (array): Yacht Types: any of these value ids (one or more): catamarans (Catamarans, 2886); gulets (Gulets, 143); houseboats (Houseboats, 1362); motorboats (Motorboats, 699); sailboats (Sailboats, 4161).

Output parameters:

- `browsing` (boolean): true: answered without sign-in, so fewer rows and the first pages only.
- `checkedAt` (string|null): When the offers were read, ISO time.
- `cursor` (string|null): Pass as cursor for the next page; null on the last.
- `from` (string): The window's first day.
- `nearest` (object): Only when nothing matched exactly: these rows are the nearest match.
- `next` (string): When browsing: how to get a quote or more rows.
- `notApplied` (array): What could not narrow the deals.
- `rows` (array): One page of deals, one row per item with its departures.
- `through` (string): Its last day.
- `total` (number): How many rows match in all.

### `request_quote` (~337 tokens)

Request a formal quote

Use it only after the person chose one or more yachts from a search_yachts, best_deals or get_yacht answer, gave their days and party, and said yes to a written quote: ask them before you call it. Pass the page links exactly as those answers returned them, the days, the party and anything they want the desk to know, in their words. The desk sends a formal quote in writing, with every cost on it, to the person's own email or phone; this answer only says it was received and where the quote goes. Nothing is booked or paid: the person confirms the booking with the desk.

Input parameters:

- `email` (string): The person's own email, as they gave it: the quote is sent there. This, phone or session is needed.
- `from` (string): Check-in day, YYYY-MM-DD.
- `items` (array, required): The yacht page links to quote (absolute URLs on this site), exactly as a search, best_deals or get returned them. At most 20.
- `name` (string): Optional: the person's name, as they gave it.
- `notes` (string): What the person wants the desk to know, in their words (at most 2000 characters).
- `party` (number): How many people.
- `phone` (string): The person's own phone, international form (+ and country code), as they gave it. This, email or session is needed.
- `session` (string): The session an earlier request_quote answer returned. Pass it instead of email or phone.
- `to` (string): Check-out day, YYYY-MM-DD.

Output parameters:

- `enquiryRef` (string): The request's reference, returned once.
- `nextStep` (string): Where the written quote goes, in words to tell the person.
- `session` (string): Only on the call that created the contact: pass it from then on.
- `sessionExpiresAt` (string): When that session stops working, ISO time.
- `status` (string): received: the desk has the request; already_received: this session asked the same in the last day.

## Diagnostics

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

## Score history

- 2026-11-05: 67
- 2026-11-04: 67
- 2026-11-03: 66
- 2026-11-02: 65
- 2026-11-01: 71
- 2026-10-31: 71

## Common questions

### What is the The Charter Desk MCP server?

The Charter Desk is an MCP server listed in the public MCP registry as com.thecharterdesk/yacht-charter. Live prices, free weeks and deals on 9,000+ charter yachts from 800+ operators in 50 countries. This page covers its hosted endpoint (https://thecharterdesk.com/mcp).

### Is the The Charter Desk MCP server safe to use?

The Charter Desk scores 67 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 The Charter Desk MCP server expose?

The Charter Desk exposes 5 tools: search_yachts, get_yacht, price_range, best_deals, request_quote. Their descriptions and schemas cost roughly 2,707 tokens of context every time the server is loaded.

### Does the The Charter Desk MCP server require authentication?

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

### Is the The Charter Desk MCP server still maintained?

The Charter Desk is still listed as active in the MCP registry. We last reached this channel on 5 November 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://thecharterdesk.com/mcp
- Website: https://thecharterdesk.com/mcp
- Changelog RSS feed: https://verifymcp.io/servers/com-thecharterdesk-yacht-charter/thecharterdesk.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-thecharterdesk-yacht-charter/thecharterdesk.json
- HTML version of this page: https://verifymcp.io/servers/com-thecharterdesk-yacht-charter/thecharterdesk
