Charter Boats
Search 14,000+ charter boats with live prices, plus marinas, anchorages, routes and itineraries.
我該用這個嗎
品質與安全性
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 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
}社群
證據