{"name":"boats.charter/charter-boats","slug":"charter-boats","title":"Charter Boats","description":"Search 14,000+ charter boats with live prices, plus marinas, anchorages, routes and itineraries.","url":"https://mcp.market/server/charter-boats","rating":null,"grade":"A","score":88,"certified":false,"status":"active","category":"search","tags":["search"],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-10-10T16:52:51.000Z","license":null},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T08:20:46.072Z","last_ok_at":"2026-11-04T08:20:46.072Z","latency_ms":61},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/dkremsa/charter-boats-mcp","website":"https://charter.boats/mcp","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://charter.boats/mcp"}],"packages":[],"tools":[{"name":"get_boat_details","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_boat_standouts","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"get_location_details","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Location id from search_locations results — copy it verbatim."}},"required":["id"],"additionalProperties":false}},{"name":"get_poi_details","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"POI id from search_pois results — copy it verbatim."}},"required":["id"],"additionalProperties":false}},{"name":"get_trip_details","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Trip id from search_trips results — copy it verbatim."}},"required":["id"],"additionalProperties":false}},{"name":"search_boats","description":"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.\n\nPass 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.\n\nWhen 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.\n\n`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.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"search_content","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"search_locations","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"search_pois","description":"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.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"search_routes","description":"Find sailing passages between destinations with distance and difficulty.","write_action":false,"price_micros":0,"input_schema":{"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}},{"name":"search_trips","description":"Find existing curated sailing itineraries by location, name, duration, activities.","write_action":false,"price_micros":0,"input_schema":{"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}}],"scan":{"score":88,"grade":"A","scanned_at":"2026-10-13T01:12:35.876Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-13T01:12:35.819Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 667ms"]},"poisoning":{"score":13,"max":15,"notes":["11 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":8,"max":10,"notes":["endpoint served from the registry-verified namespace domain"]}},"findings":[{"id":"poison.long-description","severity":"low","component":"poisoning","title":"Unusually long tool description (over 2,000 characters)","evidence":"tool search_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 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.…"}],"inputs":{"probes":[{"url":"https://charter.boats/mcp","reachable":true,"authRequired":false,"latencyMs":667,"serverInfo":{"name":"Charter Boats","version":"1.0.0"}}],"packages":[],"repo":{"found":true,"owner":"dkremsa","repo":"charter-boats-mcp","archived":false,"pushedAt":"2026-10-10T16:52:51Z","stars":0,"forks":0,"openIssues":1,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/1715169?v=4","ownerCreatedAt":"2012-05-08T00:15:04Z"},"icon":{"url":"https://avatars.githubusercontent.com/u/1715169?v=4&s=128","source":"github"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":null,"lastPushAt":"2026-10-10T16:52:51.000Z","score":23}}}},"grade_history":[],"reviews":[]}