Charter Boats

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

我该使用它吗

质量与安全性

A
描述质量
96%
模式完整度
90%
命名质量
100%
投毒风险
100%
权限匹配度
100%
协议合规性
100%

基于对工具定义和协议合规性的自动分析。

上下文开销

~5,792token 数(工具定义)
~3.5 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 4.52%)

这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。

安装

一键安装

将以下内容添加到你的 `claude_desktop_config.json` 文件中:

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

远程端点

https://charter.boats/mcpstreamable-http

它能做什么

工具清单

工具(11)

🟢 只读🟡 写入🔴 删除⚪ 未知
🟢search_boats(location, search, boat_type, makemodel, guests, ...)

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 same make), `name` (a boat carrying one word of the name). Say which — they are not what was asked for, and they count toward no total. List them AFTER the matches, in their own list, under a one-line heading naming what was loosened ("Close alternatives — the week either side"): never mixed into the same list. That heading is what splits the two on every card surface, so without it an alternative is rendered exactly like a match. `alternative_inventory` tells you which kind of "no" you are giving: `total_boats` 0 means this coast does not have that boat, while `total_boats` high with `available_nearby_or_within_7_days` 0 means it is the week, not the place. If a plain marina search has neither matches nor alternatives, `listed_unavailable` may carry published boats visibly listed at that exact marina. They are not bookable results: quote no price, explain the supplied reason, and offer an availability alert. A search with NO dates and NO price cap lists every published boat that matches, so `boats` can end with entries we hold no prices for: from `unpriced_start_index` onward every one carries `bookable_as_searched: false` and a `not_offered_because` saying so — they count as matches, but cannot be booked or quoted, so name them, link them and offer an alert without ever stating a price. When you searched a boat by NAME, `named_matches` lists published boats carrying that name that this search could not offer — wrong dates, wrong place, or no prices loaded. Everything bookable AS SEARCHED is in `boats`; nothing in `named_matches` is — though one whose only reason is the place or the dates may still be sellable, which is what its `not_offered_because` tells you. Never say a named boat does not exist while it is in that list: name it, give its reason, and use `get_boat_details` for the dates it IS free. `name_not_found` means the opposite and is certain — that name is in no published boat anywhere. `alert_query` + `alert_horizon` feed availability_alert. Both are absent when this search cannot be expressed on the website (`search_url_unavailable` says so) — then there is no link to give and no alert to set: say so rather than linking charter.boats/search, which would show boats this answer excluded.

输入模式

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "Destination name (fuzzy matched)"
    },
    "search": {
      "type": "string",
      "description": "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 `makemodel`, a model on its own included (\"Oceanis 46\")."
    },
    "boat_type": {
      "type": "string",
      "enum": [
        "sailboat",
        "catamaran",
        "motorboat",
        "gulet",
        "yacht",
        "rib",
        "other"
      ]
    },
    "makemodel": {
      "type": "string",
      "description": "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 punctuation, do not expand acronyms."
    },
    "guests": {
      "type": "integer",
      "description": "Number of guests"
    },
    "date_from": {
      "type": "string",
      "description": "Start date YYYY-MM-DD"
    },
    "date_to": {
      "type": "string",
      "description": "End date YYYY-MM-DD"
    },
    "price_min": {
      "type": "number",
      "description": "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 never) at max guests ÷ its days. A dated row's `list_price.per_day` is its own stay's and may differ"
    },
    "price_max": {
      "type": "number",
      "description": "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 never) at max guests ÷ its days; a dated row's `list_price.per_day` is its own stay's and may differ. Use ONLY for an explicit per-day cap; for a whole-trip/weekly budget use total_max instead."
    },
    "total_max": {
      "type": "number",
      "description": "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_price.total`: the boat page's Total for the stay it names, for the `guests` given, else max guests); a month-wide range on `per_day` × days at max guests. Use this whenever the guest gives a total or per-week budget, e.g. \"under €5000 for the week\". Needs dates to apply."
    },
    "cabins": {
      "type": "integer",
      "description": "Minimum number of guest cabins (crew cabins are not counted)"
    },
    "length_min": {
      "type": "integer",
      "description": "Minimum boat length in feet"
    },
    "year_min": {
      "type": "integer",
      "description": "Minimum build year"
    },
    "features": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "air_conditioning",
          "heating",
          "hot_water",
          "generator",
          "inverter",
          "solar_panels",
          "watermaker",
          "wifi",
          "deck_shower",
          "fridge",
          "cooler",
          "freezer",
          "ice_maker",
          "oven",
          "microwave",
          "dishwasher",
          "washing_machine",
          "coffee_machine",
          "electric_toilet",
          "toilet",
          "tv",
          "sound_system",
          "autopilot",
          "chartplotter",
          "radar",
          "ais",
          "bow_thruster",
          "stern_thruster",
          "electric_windlass",
          "dinghy",
          "davits",
          "outboard",
          "bimini",
          "sprayhood",
          "teak_deck",
          "gangway",
          "flybridge",
          "bathing_platform",
          "jacuzzi",
          "underwater_lights",
          "stabilizers",
          "railing_net",
          "lazy_bag",
          "spinnaker",
          "gennaker",
          "electric_winch",
          "snorkeling_gear",
          "diving_equipment",
          "sup",
          "kayak",
          "fishing_gear",
          "water_toys",
          "seabob",
          "e_foil",
          "windsurf",
          "bikes",
          "jet_ski",
          "bbq",
          "dinghy:hard_bottom",
          "dinghy:hypalon",
          "dinghy:console",
          "dinghy:large",
          "outboard:electric",
          "outboard:hp_15_plus",
          "tv:smart",
          "tv:satellite",
          "sound_system:bluetooth",
          "fridge:flybridge"
        ]
      },
      "description": "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\"/\"a/c\"/\"air con\"/\"aircon\"/\"klima\" → air_conditioning, \"heater\"/\"cabin heating\"/\"webasto\" → heating, \"warm water\"/\"boiler\"/\"water heater\" → hot_water, \"genset\"/\"power generator\" → generator, \"power inverter\"/\"12v to 220v\" → inverter, \"solar power\"/\"solar\" → solar_panels, \"water maker\"/\"desalinator\" → watermaker, \"wi-fi\"/\"internet\"/\"wireless internet\"/\"4g\" → wifi, \"cockpit shower\"/\"outdoor shower\"/\"transom shower\" → deck_shower, \"refrigerator\"/\"icebox\" → fridge, \"ice chest\"/\"cool box\" → cooler, \"deep freeze\" → freezer, \"icemaker\" → ice_maker, \"stove\"/\"cooker\"/\"hob\"/\"kitchen\" → oven, \"micro wave\" → microwave, \"dish washer\" → dishwasher, \"washer\"/\"dryer\"/\"laundry\" → washing_machine, \"coffee maker\"/\"espresso machine\"/\"nespresso\" → coffee_machine, \"electric wc\"/\"electric heads\" → electric_toilet, \"wc\"/\"restroom\"/\"bathroom\" → toilet, \"television\"/\"screen\" → tv, \"speakers\"/\"stereo\"/\"music\" → sound_system, \"auto pilot\" → autopilot, \"gps\"/\"chart plotter\"/\"plotter\"/\"navigation\" → chartplotter, \"ais transponder\" → ais, \"bowthruster\" → bow_thruster, \"electric anchor winch\" → electric_windlass, \"tender\"/\"zodiac\" → dinghy, \"dinghy davits\" → davits, \"outboard motor\" → outboard, \"shade\"/\"canopy\"/\"sun awning\" → bimini, \"spray hood\" → sprayhood, \"teak cockpit\" → teak_deck, \"passerelle\" → gangway, \"fly bridge\" → flybridge, \"swim platform\"/\"diving platform\" → bathing_platform, \"hot tub\"/\"whirlpool\"/\"swimming pool\" → jacuzzi, \"gyro stabilizer\"/\"seakeeper\" → stabilizers, \"child safety net\"/\"lifeline net\" → railing_net, \"lazyjack\"/\"lazybag\"/\"stack pack\" → lazy_bag, \"code zero\" → gennaker, \"e-winch\" → electric_winch, \"snorkel\"/\"masks and fins\" → snorkeling_gear, \"scuba gear\"/\"dive gear\" → diving_equipment, \"paddleboard\"/\"paddle board\" → sup, \"canoe\" → kayak, \"fishing equipment\"/\"rods\" → fishing_gear, \"towables\"/\"wakeboard\"/\"water skis\"/\"tubes\" → water_toys, \"underwater scooter\" → seabob, \"efoil\"/\"electric foil\"/\"fliteboard\"/\"wing foil\" → e_foil, \"windsurfing\"/\"windsurf board\" → windsurf, \"bicycle\"/\"e-bike\"/\"electric bike\" → bikes, \"waverunner\"/\"pwc\" → jet_ski, \"barbecue\"/\"grill\" → bbq, \"hard bottom dinghy\"/\"rigid dinghy\"/\"rib tender\"/\"hard bottom\" → dinghy:hard_bottom, \"hypalon dinghy\"/\"hypalon tender\" → dinghy:hypalon, \"console dinghy\"/\"console tender\" → dinghy:console, \"large dinghy\"/\"big tender\" → dinghy:large, \"electric outboard\"/\"torqeedo\" → outboard:electric, \"15hp outboard\"/\"powerful outboard\"/\"planing outboard\" → outboard:hp_15_plus, \"smart tv\" → tv:smart, \"satellite tv\"/\"sat tv\" → tv:satellite, \"bluetooth\"/\"bluetooth speakers\"/\"bluetooth sound system\" → sound_system:bluetooth, \"fridge on flybridge\"/\"flybridge fridge\" → fridge:flybridge."
    },
    "sort": {
      "type": "string",
      "enum": [
        "best_value",
        "deals",
        "price_low",
        "price_high",
        "newest"
      ],
      "description": "Sort order. Default: best_value (best value, available boats first). Use deals for biggest discounts first."
    },
    "limit": {
      "type": "integer",
      "default": 5,
      "maximum": 25
    }
  },
  "additionalProperties": false
}
🟢search_locations(q, from, within_nm, region, country, ...)

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.

输入模式

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "description": "Name search (min 2 chars). Optional when an area filter is given."
    },
    "from": {
      "type": "string",
      "description": "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."
    },
    "within_nm": {
      "type": "integer",
      "enum": [
        10,
        20,
        35,
        55,
        100
      ],
      "description": "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, 55nm ≈ 9.7h, 100nm ≈ 17.2h. A full charter day of sailing is roughly 6-8h, which makes 35nm a comfortable day sail and 55nm a long one."
    },
    "region": {
      "type": "string",
      "description": "Sailing region as the guest says it: Dalmatia, Istria, Kvarner, the Ionian, the Saronic, the Cyclades, the Dodecanese, the Sporades"
    },
    "country": {
      "type": "string",
      "description": "Country name or 2-letter code"
    },
    "city": {
      "type": "string"
    },
    "type": {
      "type": "string",
      "enum": [
        "marina",
        "harbour",
        "anchorage",
        "bay",
        "mooring",
        "spot"
      ],
      "description": "Kind of place — e.g. anchorage for \"quiet bays\"; spot = an unclassified stop (beach, spit, headland)"
    },
    "month": {
      "type": "integer",
      "minimum": 1,
      "maximum": 12,
      "description": "Month to rank popularity for (default: current month)"
    },
    "sort": {
      "type": "string",
      "enum": [
        "popularity",
        "boats",
        "rating"
      ],
      "description": "Default popularity = real vessel traffic for the month; boats = charter fleet size; rating = Google rating"
    },
    "limit": {
      "type": "integer",
      "default": 5,
      "maximum": 20
    }
  },
  "additionalProperties": false
}
🟢search_pois(location, q, location_id, category, limit)

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.

输入模式

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "Location name (fuzzy). Required unless q is provided."
    },
    "q": {
      "type": "string",
      "description": "Search POI by name"
    },
    "location_id": {
      "type": "string"
    },
    "category": {
      "type": "string",
      "enum": [
        "restaurant",
        "grocery",
        "fuel",
        "chandlery",
        "pharmacy",
        "bank",
        "laundry",
        "entertainment",
        "water",
        "ice",
        "fishing",
        "provisioning",
        "parking",
        "medical",
        "worship",
        "other"
      ]
    },
    "limit": {
      "type": "integer",
      "default": 10
    }
  },
  "additionalProperties": false
}
🟢search_routes(from, q, location_id, difficulty, limit)

Find sailing passages between destinations with distance and difficulty.

输入模式

{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "description": "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 passages somewhere else."
    },
    "q": {
      "type": "string",
      "description": "Search route by title"
    },
    "location_id": {
      "type": "string"
    },
    "difficulty": {
      "type": "string",
      "enum": [
        "easy",
        "moderate",
        "challenging"
      ]
    },
    "limit": {
      "type": "integer",
      "default": 5
    }
  },
  "additionalProperties": false
}
🟢search_trips(location, q, location_id, boat_type, min_days, ...)

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

输入模式

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "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 itineraries, never itineraries somewhere else."
    },
    "q": {
      "type": "string",
      "description": "Search itinerary by title"
    },
    "location_id": {
      "type": "string"
    },
    "boat_type": {
      "type": "string"
    },
    "min_days": {
      "type": "integer"
    },
    "max_days": {
      "type": "integer"
    },
    "activities": {
      "type": "string",
      "description": "Comma-separated activities"
    },
    "limit": {
      "type": "integer",
      "default": 5
    }
  },
  "additionalProperties": false
}
🟢search_content(q, type, limit)

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.

输入模式

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "description": "Short keyword query (2-4 words)"
    },
    "type": {
      "type": "string",
      "enum": [
        "article",
        "question",
        "both",
        "api"
      ],
      "default": "both"
    },
    "limit": {
      "type": "integer",
      "default": 5
    }
  },
  "required": [
    "q"
  ],
  "additionalProperties": false
}
🟢get_boat_details(id, date_from, date_to, guests)

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.

输入模式

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Boat id from search_boats results (including named_matches) — copy it verbatim."
    },
    "date_from": {
      "type": "string",
      "description": "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`. Pass both whenever you quote a price for specific dates."
    },
    "date_to": {
      "type": "string",
      "description": "Optional check-out date YYYY-MM-DD — see date_from."
    },
    "guests": {
      "type": "number",
      "description": "Optional: the party the stay is priced for; without it, the boat's capacity."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
🟢get_boat_standouts(id, date_from, compare_by, cutoff_pct, fallback)

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. `note` says whether an absence means "ordinary" or that nothing could be compared.

输入模式

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Boat id from search_boats or get_boat_details — copy it verbatim."
    },
    "date_from": {
      "type": "string",
      "description": "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 dates."
    },
    "compare_by": {
      "type": "string",
      "enum": [
        "price",
        "guests",
        "length"
      ],
      "description": "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 for a party size (\"is it cheap for 10 people?\"). length: the same type within ±2.5% of its length — use when comparing boats of one size. On guests and length the all-in day rate (the figure the search card prints) is compared too."
    },
    "cutoff_pct": {
      "type": "number",
      "description": "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."
    },
    "fallback": {
      "type": "boolean",
      "description": "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."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
🟢get_poi_details(id)

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.

输入模式

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "POI id from search_pois results — copy it verbatim."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
🟢get_location_details(id)

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.

输入模式

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Location id from search_locations results — copy it verbatim."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
🟢get_trip_details(id)

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.

输入模式

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Trip id from search_trips results — copy it verbatim."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}

社区

评价此服务器

证据

最近观测

已验证未记录版本11 个工具