{
  "openrpc": "1.3.2",
  "info": {
    "title": "The Charter Desk MCP server",
    "version": "1",
    "description": "Live inventory, prices and discounts of The Charter Desk. Every answer links to its page on this site; send the person there. BROWSE: call the search_yachts, get_yacht, price_range and best_deals tools with no contact and you get 10 rows a call and the first pages, within a limit per address. MORE: pass the person's own email or phone (international form, +country code) and you get up to 20 rows a call; the first such answer returns a session to pass from then on. QUOTE: when the person wants a price they can book on, call request_quote with their email or phone: the desk sends them a formal written quote. Prices in other answers are as the source last stated them (checkedAt) and are not an offer."
  },
  "servers": [
    {
      "name": "The Charter Desk",
      "url": "https://thecharterdesk.com/mcp",
      "summary": "Streamable HTTP: POST one JSON-RPC 2.0 message per request, answered in JSON. GET answers 405."
    }
  ],
  "methods": [
    {
      "name": "initialize",
      "summary": "Open the conversation: agree a protocol version and read the server instructions.",
      "x-mcp-method": "initialize",
      "paramStructure": "by-name",
      "params": [
        {
          "name": "protocolVersion",
          "required": true,
          "schema": {
            "type": "string",
            "enum": [
              "2025-06-18",
              "2025-03-26",
              "2024-11-05"
            ]
          }
        },
        {
          "name": "capabilities",
          "required": true,
          "schema": {
            "type": "object"
          }
        },
        {
          "name": "clientInfo",
          "required": true,
          "schema": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          }
        }
      ],
      "result": {
        "name": "result",
        "schema": {
          "type": "object"
        }
      },
      "errors": [
        {
          "name": "parse_error",
          "code": -32700,
          "kind": "rpc",
          "message": "Parse error.",
          "next": "Send one valid JSON-RPC 2.0 message as the request body."
        },
        {
          "name": "invalid_request",
          "code": -32600,
          "kind": "rpc",
          "message": "Not a JSON-RPC 2.0 request.",
          "next": "Send one JSON-RPC 2.0 message per request, with jsonrpc \"2.0\", an id and a method."
        },
        {
          "name": "invalid_locale",
          "code": -32600,
          "kind": "rpc",
          "message": "invalid_locale",
          "next": "Pass locale as two lower-case letters, or leave it out."
        },
        {
          "name": "method_not_found",
          "code": -32601,
          "kind": "rpc",
          "message": "Method not found.",
          "next": "Call initialize, tools/list, tools/call, resources/list or resources/read."
        },
        {
          "name": "invalid_params",
          "code": -32602,
          "kind": "rpc",
          "message": "Invalid params.",
          "next": "Read the message: it names the argument. Call tools/list for each tool's schema."
        },
        {
          "name": "resource_not_found",
          "code": -32002,
          "kind": "rpc",
          "message": "Resource not found.",
          "next": "Call resources/list for the resources this server has."
        },
        {
          "name": "site_unavailable",
          "code": -32000,
          "kind": "rpc",
          "message": "site_unavailable",
          "next": "Try again later."
        },
        {
          "name": "mcp_disabled",
          "code": -32000,
          "kind": "rpc",
          "message": "mcp_disabled",
          "next": "This site has its MCP server switched off. Send the person to the website."
        },
        {
          "name": "rate_limited_address",
          "code": -32000,
          "kind": "rpc",
          "message": "rate_limited",
          "next": "Wait for the Retry-After seconds, then call again."
        },
        {
          "name": "internal_error",
          "code": -32603,
          "kind": "rpc",
          "message": "site_unavailable",
          "next": "Try again later."
        }
      ],
      "examples": [
        {
          "name": "initialize example",
          "params": [
            {
              "name": "protocolVersion",
              "value": "2025-06-18"
            },
            {
              "name": "capabilities",
              "value": {}
            },
            {
              "name": "clientInfo",
              "value": {
                "name": "my-agent",
                "version": "1.0"
              }
            }
          ],
          "result": {
            "name": "result",
            "value": {
              "protocolVersion": "2025-06-18",
              "capabilities": {
                "tools": {
                  "listChanged": false
                },
                "resources": {
                  "listChanged": false,
                  "subscribe": false
                }
              },
              "serverInfo": {
                "name": "The Charter Desk",
                "version": "1"
              },
              "instructions": "Live inventory, prices and discounts of The Charter Desk. Every answer links to its page on this site; send the person there. BROWSE: call the search_yachts, get_yacht, price_range and best_deals tools with no contact and you get 10 rows a call and the first pages, within a limit per address. MORE: pass the person's own email or phone (international form, +country code) and you get up to 20 rows a call; the first such answer returns a session to pass from then on. QUOTE: when the person wants a price they can book on, call request_quote with their email or phone: the desk sends them a formal written quote. Prices in other answers are as the source last stated them (checkedAt) and are not an offer."
            }
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "initialize",
        "params": {
          "protocolVersion": "2025-06-18",
          "capabilities": {},
          "clientInfo": {
            "name": "my-agent",
            "version": "1.0"
          }
        }
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 1,
        "result": {
          "protocolVersion": "2025-06-18",
          "capabilities": {
            "tools": {
              "listChanged": false
            },
            "resources": {
              "listChanged": false,
              "subscribe": false
            }
          },
          "serverInfo": {
            "name": "The Charter Desk",
            "version": "1"
          },
          "instructions": "Live inventory, prices and discounts of The Charter Desk. Every answer links to its page on this site; send the person there. BROWSE: call the search_yachts, get_yacht, price_range and best_deals tools with no contact and you get 10 rows a call and the first pages, within a limit per address. MORE: pass the person's own email or phone (international form, +country code) and you get up to 20 rows a call; the first such answer returns a session to pass from then on. QUOTE: when the person wants a price they can book on, call request_quote with their email or phone: the desk sends them a formal written quote. Prices in other answers are as the source last stated them (checkedAt) and are not an offer."
        }
      }
    },
    {
      "name": "tools/list",
      "summary": "List the tools, each with its input and output schema.",
      "x-mcp-method": "tools/list",
      "paramStructure": "by-name",
      "params": [],
      "result": {
        "name": "result",
        "schema": {
          "type": "object"
        }
      },
      "errors": [
        {
          "name": "parse_error",
          "code": -32700,
          "kind": "rpc",
          "message": "Parse error.",
          "next": "Send one valid JSON-RPC 2.0 message as the request body."
        },
        {
          "name": "invalid_request",
          "code": -32600,
          "kind": "rpc",
          "message": "Not a JSON-RPC 2.0 request.",
          "next": "Send one JSON-RPC 2.0 message per request, with jsonrpc \"2.0\", an id and a method."
        },
        {
          "name": "invalid_locale",
          "code": -32600,
          "kind": "rpc",
          "message": "invalid_locale",
          "next": "Pass locale as two lower-case letters, or leave it out."
        },
        {
          "name": "method_not_found",
          "code": -32601,
          "kind": "rpc",
          "message": "Method not found.",
          "next": "Call initialize, tools/list, tools/call, resources/list or resources/read."
        },
        {
          "name": "invalid_params",
          "code": -32602,
          "kind": "rpc",
          "message": "Invalid params.",
          "next": "Read the message: it names the argument. Call tools/list for each tool's schema."
        },
        {
          "name": "resource_not_found",
          "code": -32002,
          "kind": "rpc",
          "message": "Resource not found.",
          "next": "Call resources/list for the resources this server has."
        },
        {
          "name": "site_unavailable",
          "code": -32000,
          "kind": "rpc",
          "message": "site_unavailable",
          "next": "Try again later."
        },
        {
          "name": "mcp_disabled",
          "code": -32000,
          "kind": "rpc",
          "message": "mcp_disabled",
          "next": "This site has its MCP server switched off. Send the person to the website."
        },
        {
          "name": "rate_limited_address",
          "code": -32000,
          "kind": "rpc",
          "message": "rate_limited",
          "next": "Wait for the Retry-After seconds, then call again."
        },
        {
          "name": "internal_error",
          "code": -32603,
          "kind": "rpc",
          "message": "site_unavailable",
          "next": "Try again later."
        }
      ],
      "examples": [
        {
          "name": "tools/list example",
          "params": [],
          "result": {
            "name": "result",
            "value": {
              "tools": [
                {
                  "name": "search_yachts",
                  "title": "Search yachts",
                  "description": "Find this site's yachts, read from the live inventory. Pass what the person wants as the typed filters, and from / to whenever they gave exact days. With dates it returns ONLY the yachts free for that stay, each with its stay: status, price, list price, discount and when the source was checked (checkedAt). Without dates each has its from-price. Every row carries its page link and one photo, absolute URLs on this site; send the person there. Narrow with the typed filters (each list is any of its values; every filter must hold); priceMin / priceMax count the mandatory extras a quote states. notApplied lists what could not narrow the search. When nothing matches exactly the answer is the nearest match, and nearest says what was widened (another week, the place around, a bound let go): tell the person. Paged: total and cursor. Works without a contact (browsing: fewer rows).",
                  "inputSchema": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string",
                        "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry."
                      },
                      "phone": {
                        "type": "string",
                        "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse."
                      },
                      "session": {
                        "type": "string",
                        "description": "The session an earlier answer returned. Pass it instead of email or phone from then on."
                      },
                      "name": {
                        "type": "string",
                        "description": "Optional: the person's name, as they gave it."
                      },
                      "from": {
                        "type": "string",
                        "description": "Check-in day, YYYY-MM-DD."
                      },
                      "to": {
                        "type": "string",
                        "description": "Check-out day, YYYY-MM-DD."
                      },
                      "party": {
                        "type": "number",
                        "description": "How many people."
                      },
                      "yacht_types": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "catamarans",
                            "gulets",
                            "houseboats",
                            "motorboats",
                            "sailboats"
                          ]
                        },
                        "minItems": 1,
                        "description": "Yacht Types: any of these value ids (one or more): catamarans (Catamarans, 3192); gulets (Gulets, 201); houseboats (Houseboats, 1428); motorboats (Motorboats, 1080); sailboats (Sailboats, 4577)."
                      },
                      "charter_types": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "all-inclusive",
                            "bareboat",
                            "cabin-charter",
                            "crewed",
                            "day-charter",
                            "flotilla",
                            "regatta",
                            "skippered"
                          ]
                        },
                        "minItems": 1,
                        "description": "Charter Types: any of these value ids (one or more): all-inclusive (All-inclusive, 68); bareboat (Bareboat, 8796); cabin-charter (Cabin charter, 152); crewed (Crewed, 1702); day-charter (Day charter, 374); flotilla (Flotilla, 257); regatta (Regatta, 34); skippered (Skippered, 245)."
                      },
                      "place": {
                        "type": "string",
                        "description": "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, Spain, British Virgin Islands, Netherlands, Germany, Seychelles, Poland, Ireland, Martinique, United Kingdom, Belgium, Portugal, Ecuador, French Polynesia, Sweden, St. Martin, Bahamas, Malta, Montenegro, Thailand, Canada, St. Lucia, Slovenia, Norway, Guadeloupe, Brazil, Hungary, Grenada, St. Vincent, Belize, Cuba, Maldives, Mexico, Panama, Cape Verde, United Arab Emirates, Antigua and Barbuda, India, Tanzania, Egypt, Monaco, Estonia, Mauritius, New Zealand, USA, Switzerland, Fiji. An unknown place is refused; nothing there answers the nearest place around it."
                      },
                      "base": {
                        "type": "string",
                        "description": "The exact base it leaves from, in words."
                      },
                      "text": {
                        "type": "string",
                        "description": "Words in its name or model, e.g. a builder or a model name."
                      },
                      "lengthMin": {
                        "type": "number",
                        "description": "Length at least ft (on this site 13.35 to 180.45)."
                      },
                      "lengthMax": {
                        "type": "number",
                        "description": "Length at most ft (on this site 13.35 to 180.45)."
                      },
                      "cabinsMin": {
                        "type": "number",
                        "description": "Cabins at least (on this site 0 to 20)."
                      },
                      "cabinsMax": {
                        "type": "number",
                        "description": "Cabins at most (on this site 0 to 20)."
                      },
                      "berthsMin": {
                        "type": "number",
                        "description": "Berths at least (on this site 0 to 80)."
                      },
                      "berthsMax": {
                        "type": "number",
                        "description": "Berths at most (on this site 0 to 80)."
                      },
                      "headsMin": {
                        "type": "number",
                        "description": "Heads at least (on this site 0 to 23)."
                      },
                      "headsMax": {
                        "type": "number",
                        "description": "Heads at most (on this site 0 to 23)."
                      },
                      "beamMin": {
                        "type": "number",
                        "description": "Beam at least m (on this site 0.9 to 44)."
                      },
                      "beamMax": {
                        "type": "number",
                        "description": "Beam at most m (on this site 0.9 to 44)."
                      },
                      "draftMin": {
                        "type": "number",
                        "description": "Draft at least m (on this site 0.3 to 7985)."
                      },
                      "draftMax": {
                        "type": "number",
                        "description": "Draft at most m (on this site 0.3 to 7985)."
                      },
                      "yearMin": {
                        "type": "number",
                        "description": "Year at least (on this site 0 to 2028)."
                      },
                      "yearMax": {
                        "type": "number",
                        "description": "Year at most (on this site 0 to 2028)."
                      },
                      "fuelMin": {
                        "type": "number",
                        "description": "Fuel tank at least l (on this site 1 to 65000)."
                      },
                      "fuelMax": {
                        "type": "number",
                        "description": "Fuel tank at most l (on this site 1 to 65000)."
                      },
                      "waterMin": {
                        "type": "number",
                        "description": "Water tank at least l (on this site 1 to 60000)."
                      },
                      "waterMax": {
                        "type": "number",
                        "description": "Water tank at most l (on this site 1 to 60000)."
                      },
                      "priceMin": {
                        "type": "number",
                        "description": "The least to pay, in the site currency: the price plus the mandatory extras."
                      },
                      "priceMax": {
                        "type": "number",
                        "description": "The most to pay, in the site currency: the price plus the mandatory extras."
                      },
                      "discountOnly": {
                        "type": "boolean",
                        "description": "true: only those with a discount the source states."
                      },
                      "sort": {
                        "type": "string",
                        "enum": [
                          "price",
                          "discount",
                          "length",
                          "cabins",
                          "berths",
                          "heads",
                          "beam",
                          "draft",
                          "year",
                          "fuel",
                          "water"
                        ],
                        "description": "price (default, cheapest first), discount (biggest first), or length (length, biggest first), cabins (cabins, biggest first), berths (berths, biggest first), heads (heads, biggest first), beam (beam, biggest first), draft (draft, biggest first), year (year, biggest first), fuel (fuel tank, biggest first), water (water tank, biggest first)."
                      },
                      "cursor": {
                        "type": "string",
                        "description": "The cursor a previous answer returned, for its next page."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone."
                      }
                    },
                    "required": [],
                    "additionalProperties": false
                  },
                  "outputSchema": {
                    "type": "object",
                    "properties": {
                      "items": {
                        "type": "array",
                        "description": "One page of matches.",
                        "items": {
                          "type": "object",
                          "description": "One item.",
                          "properties": {
                            "name": {
                              "type": "string",
                              "description": "Its name."
                            },
                            "href": {
                              "type": "string",
                              "description": "Its page on this site, absolute URL."
                            },
                            "image": {
                              "type": "object",
                              "description": "One photo, an absolute URL.",
                              "properties": {
                                "src": {
                                  "type": "string",
                                  "description": "https URL."
                                },
                                "alt": {
                                  "type": "string",
                                  "description": "What it shows."
                                }
                              }
                            },
                            "kind": {
                              "type": "string",
                              "description": "Its type, in the site's words."
                            },
                            "priceFrom": {
                              "type": "number",
                              "description": "The stay's price with dates, else its cheapest quoted stay, in major units."
                            },
                            "currency": {
                              "type": "string",
                              "description": "ISO 4217."
                            },
                            "mandatoryExtras": {
                              "type": "object",
                              "description": "Without dates: what its cheapest quote says is payable on top.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "stay": {
                              "type": "object",
                              "description": "With dates: that stay, read live.",
                              "properties": {
                                "checkIn": {
                                  "type": "string",
                                  "description": "YYYY-MM-DD."
                                },
                                "checkOut": {
                                  "type": "string",
                                  "description": "YYYY-MM-DD."
                                },
                                "nights": {
                                  "type": "number",
                                  "description": "Nights."
                                },
                                "status": {
                                  "type": "string",
                                  "enum": [
                                    "free",
                                    "booked",
                                    "not-a-check-in-day",
                                    "not-whole-blocks",
                                    "outside-calendar",
                                    "not-known"
                                  ],
                                  "description": "Whether it can be booked."
                                },
                                "price": {
                                  "type": "object",
                                  "description": "The stay's price.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "listPrice": {
                                  "type": "object",
                                  "description": "The source's list price above price, when discounted.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "discountPct": {
                                  "type": "number",
                                  "description": "The discount the source states."
                                },
                                "mandatoryExtras": {
                                  "type": "object",
                                  "description": "What the source says is payable on top, whatever the person picks.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "deposit": {
                                  "type": "object",
                                  "description": "The deposit held.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "checkedAt": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "When the source was read, ISO time."
                                }
                              }
                            }
                          }
                        }
                      },
                      "total": {
                        "type": "number",
                        "description": "How many rows match in all."
                      },
                      "cursor": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Pass as cursor for the next page; null on the last."
                      },
                      "checked": {
                        "type": "boolean",
                        "description": "true: dates were given, so every row is free for them."
                      },
                      "checkedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "When the source was read, ISO time."
                      },
                      "notApplied": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "description": "A wish."
                        },
                        "description": "What the person asked for that could not narrow the search."
                      },
                      "unchecked": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "description": "dates or party."
                        },
                        "description": "What was said but could not be checked."
                      },
                      "leftOutUnpriced": {
                        "type": "number",
                        "description": "Matches left out under priceMin / priceMax because no price is known."
                      },
                      "nearest": {
                        "type": "object",
                        "description": "Only when nothing matched exactly: these rows are the nearest match.",
                        "properties": {
                          "widened": {
                            "type": "string",
                            "enum": [
                              "dates",
                              "base",
                              "place",
                              "ranges",
                              "price",
                              "discount"
                            ],
                            "description": "The one thing let go."
                          },
                          "note": {
                            "type": "string",
                            "description": "What moved, in words to tell the person."
                          }
                        }
                      },
                      "browsing": {
                        "type": "boolean",
                        "description": "true: answered without a contact, so fewer rows and the first pages only."
                      },
                      "next": {
                        "type": "string",
                        "description": "When browsing: how to get a quote or more rows."
                      },
                      "session": {
                        "type": "string",
                        "description": "Only on the call that created the contact: pass it from then on."
                      },
                      "sessionExpiresAt": {
                        "type": "string",
                        "description": "When that session stops working, ISO time."
                      }
                    },
                    "required": [
                      "items",
                      "total"
                    ]
                  },
                  "annotations": {
                    "readOnlyHint": true,
                    "destructiveHint": false,
                    "openWorldHint": false
                  }
                },
                {
                  "name": "get_yacht",
                  "title": "Get one yacht",
                  "description": "One yacht: its 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 that is absent is one the source does not state. Works without a contact.",
                  "inputSchema": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string",
                        "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry."
                      },
                      "phone": {
                        "type": "string",
                        "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse."
                      },
                      "session": {
                        "type": "string",
                        "description": "The session an earlier answer returned. Pass it instead of email or phone from then on."
                      },
                      "name": {
                        "type": "string",
                        "description": "Optional: the person's name, as they gave it."
                      },
                      "id": {
                        "type": "string",
                        "description": "The yacht's page link (an absolute URL on this site), exactly as a search or best_deals returned it."
                      },
                      "from": {
                        "type": "string",
                        "description": "Check-in day, YYYY-MM-DD."
                      },
                      "to": {
                        "type": "string",
                        "description": "Check-out day, YYYY-MM-DD."
                      },
                      "party": {
                        "type": "number",
                        "description": "How many people."
                      },
                      "cursor": {
                        "type": "string",
                        "description": "The cursor a previous answer returned, for its next page."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone."
                      }
                    },
                    "required": [
                      "id"
                    ],
                    "additionalProperties": false
                  },
                  "outputSchema": {
                    "type": "object",
                    "properties": {
                      "item": {
                        "type": "string",
                        "description": "Its name."
                      },
                      "href": {
                        "type": "string",
                        "description": "Its page on this site, absolute URL."
                      },
                      "facts": {
                        "type": "array",
                        "description": "The facts its page shows, labelled.",
                        "items": {
                          "type": "object",
                          "description": "One fact.",
                          "properties": {}
                        }
                      },
                      "kind": {
                        "type": "string",
                        "description": "Its type."
                      },
                      "place": {
                        "type": "string",
                        "description": "Where it is."
                      },
                      "description": {
                        "type": "string",
                        "description": "Its description."
                      },
                      "packages": {
                        "type": "array",
                        "description": "The ways it is sold, the default first, each with its included, required and optional extras.",
                        "items": {
                          "type": "object",
                          "description": "One package.",
                          "properties": {
                            "name": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Its name."
                            },
                            "default": {
                              "type": "boolean",
                              "description": "Sold this way unless asked."
                            },
                            "staffed": {
                              "type": "boolean",
                              "description": "Sold with staff as standard."
                            },
                            "included": {
                              "type": "array",
                              "description": "Included, nothing to pay.",
                              "items": {
                                "type": "object",
                                "description": "An extra.",
                                "properties": {}
                              }
                            },
                            "required": {
                              "type": "array",
                              "description": "Must be paid.",
                              "items": {
                                "type": "object",
                                "description": "An extra.",
                                "properties": {}
                              }
                            },
                            "optional": {
                              "type": "array",
                              "description": "The person's choice.",
                              "items": {
                                "type": "object",
                                "description": "An extra.",
                                "properties": {}
                              }
                            }
                          }
                        }
                      },
                      "terms": {
                        "type": "object",
                        "description": "Deposit, licence, stay limits, check-in days and times, as stated.",
                        "properties": {}
                      },
                      "equipment": {
                        "type": "array",
                        "description": "Named equipment in groups.",
                        "items": {
                          "type": "object",
                          "description": "A group.",
                          "properties": {}
                        }
                      },
                      "operatorDescriptions": {
                        "type": "array",
                        "description": "The operator's own texts and documents.",
                        "items": {
                          "type": "object",
                          "description": "One.",
                          "properties": {}
                        }
                      },
                      "availability": {
                        "type": "object",
                        "description": "With dates: that stay and, when not free, the nearest free stays; without: its free stays, soonest first.",
                        "properties": {
                          "card": {
                            "type": "object",
                            "description": "Its card: name, link, photos (get keeps the gallery).",
                            "properties": {}
                          },
                          "stay": {
                            "type": "object",
                            "description": "One stay of this item, read live.",
                            "properties": {
                              "checkIn": {
                                "type": "string",
                                "description": "YYYY-MM-DD."
                              },
                              "checkOut": {
                                "type": "string",
                                "description": "YYYY-MM-DD."
                              },
                              "nights": {
                                "type": "number",
                                "description": "Nights."
                              },
                              "status": {
                                "type": "string",
                                "enum": [
                                  "free",
                                  "booked",
                                  "not-a-check-in-day",
                                  "not-whole-blocks",
                                  "outside-calendar",
                                  "not-known"
                                ],
                                "description": "Whether it can be booked."
                              },
                              "price": {
                                "type": "object",
                                "description": "The stay's price.",
                                "properties": {
                                  "amount": {
                                    "type": "number",
                                    "description": "In major units (euros, not cents)."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "description": "ISO 4217."
                                  },
                                  "text": {
                                    "type": "string",
                                    "description": "The amount written out, to quote to the person."
                                  }
                                }
                              },
                              "listPrice": {
                                "type": "object",
                                "description": "The source's list price above price, when discounted.",
                                "properties": {
                                  "amount": {
                                    "type": "number",
                                    "description": "In major units (euros, not cents)."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "description": "ISO 4217."
                                  },
                                  "text": {
                                    "type": "string",
                                    "description": "The amount written out, to quote to the person."
                                  }
                                }
                              },
                              "discountPct": {
                                "type": "number",
                                "description": "The discount the source states."
                              },
                              "mandatoryExtras": {
                                "type": "object",
                                "description": "What the source says is payable on top, whatever the person picks.",
                                "properties": {
                                  "amount": {
                                    "type": "number",
                                    "description": "In major units (euros, not cents)."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "description": "ISO 4217."
                                  },
                                  "text": {
                                    "type": "string",
                                    "description": "The amount written out, to quote to the person."
                                  }
                                }
                              },
                              "deposit": {
                                "type": "object",
                                "description": "The deposit held.",
                                "properties": {
                                  "amount": {
                                    "type": "number",
                                    "description": "In major units (euros, not cents)."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "description": "ISO 4217."
                                  },
                                  "text": {
                                    "type": "string",
                                    "description": "The amount written out, to quote to the person."
                                  }
                                }
                              },
                              "checkedAt": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "When the source was read, ISO time."
                              }
                            }
                          },
                          "freeStays": {
                            "type": "array",
                            "description": "Free stays, a page.",
                            "items": {
                              "type": "object",
                              "description": "One stay of this item, read live.",
                              "properties": {
                                "checkIn": {
                                  "type": "string",
                                  "description": "YYYY-MM-DD."
                                },
                                "checkOut": {
                                  "type": "string",
                                  "description": "YYYY-MM-DD."
                                },
                                "nights": {
                                  "type": "number",
                                  "description": "Nights."
                                },
                                "status": {
                                  "type": "string",
                                  "enum": [
                                    "free",
                                    "booked",
                                    "not-a-check-in-day",
                                    "not-whole-blocks",
                                    "outside-calendar",
                                    "not-known"
                                  ],
                                  "description": "Whether it can be booked."
                                },
                                "price": {
                                  "type": "object",
                                  "description": "The stay's price.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "listPrice": {
                                  "type": "object",
                                  "description": "The source's list price above price, when discounted.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "discountPct": {
                                  "type": "number",
                                  "description": "The discount the source states."
                                },
                                "mandatoryExtras": {
                                  "type": "object",
                                  "description": "What the source says is payable on top, whatever the person picks.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "deposit": {
                                  "type": "object",
                                  "description": "The deposit held.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "checkedAt": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "When the source was read, ISO time."
                                }
                              }
                            }
                          },
                          "nearestFree": {
                            "type": "array",
                            "description": "The nearest free stays, a page.",
                            "items": {
                              "type": "object",
                              "description": "One stay of this item, read live.",
                              "properties": {
                                "checkIn": {
                                  "type": "string",
                                  "description": "YYYY-MM-DD."
                                },
                                "checkOut": {
                                  "type": "string",
                                  "description": "YYYY-MM-DD."
                                },
                                "nights": {
                                  "type": "number",
                                  "description": "Nights."
                                },
                                "status": {
                                  "type": "string",
                                  "enum": [
                                    "free",
                                    "booked",
                                    "not-a-check-in-day",
                                    "not-whole-blocks",
                                    "outside-calendar",
                                    "not-known"
                                  ],
                                  "description": "Whether it can be booked."
                                },
                                "price": {
                                  "type": "object",
                                  "description": "The stay's price.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "listPrice": {
                                  "type": "object",
                                  "description": "The source's list price above price, when discounted.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "discountPct": {
                                  "type": "number",
                                  "description": "The discount the source states."
                                },
                                "mandatoryExtras": {
                                  "type": "object",
                                  "description": "What the source says is payable on top, whatever the person picks.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "deposit": {
                                  "type": "object",
                                  "description": "The deposit held.",
                                  "properties": {
                                    "amount": {
                                      "type": "number",
                                      "description": "In major units (euros, not cents)."
                                    },
                                    "currency": {
                                      "type": "string",
                                      "description": "ISO 4217."
                                    },
                                    "text": {
                                      "type": "string",
                                      "description": "The amount written out, to quote to the person."
                                    }
                                  }
                                },
                                "checkedAt": {
                                  "type": [
                                    "string",
                                    "null"
                                  ],
                                  "description": "When the source was read, ISO time."
                                }
                              }
                            }
                          },
                          "party": {
                            "type": "string",
                            "enum": [
                              "fits",
                              "too-many",
                              "not-checked"
                            ],
                            "description": "Whether the party fits."
                          },
                          "total": {
                            "type": "number",
                            "description": "How many rows match in all."
                          },
                          "cursor": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Pass as cursor for the next page; null on the last."
                          }
                        }
                      },
                      "checkedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "When the source was read, ISO time."
                      },
                      "browsing": {
                        "type": "boolean",
                        "description": "true: answered without a contact, so fewer rows and the first pages only."
                      },
                      "next": {
                        "type": "string",
                        "description": "When browsing: how to get a quote or more rows."
                      },
                      "session": {
                        "type": "string",
                        "description": "Only on the call that created the contact: pass it from then on."
                      },
                      "sessionExpiresAt": {
                        "type": "string",
                        "description": "When that session stops working, ISO time."
                      }
                    },
                    "required": [
                      "item",
                      "href"
                    ]
                  },
                  "annotations": {
                    "readOnlyHint": true,
                    "destructiveHint": false,
                    "openWorldHint": false
                  }
                },
                {
                  "name": "price_range",
                  "title": "Price range",
                  "description": "What a stay typically costs: the range (p25, median, p75 in minor units of the currency) of open departures for a place, month and party, optionally one type, with 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. Works without a contact.",
                  "inputSchema": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string",
                        "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry."
                      },
                      "phone": {
                        "type": "string",
                        "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse."
                      },
                      "session": {
                        "type": "string",
                        "description": "The session an earlier answer returned. Pass it instead of email or phone from then on."
                      },
                      "name": {
                        "type": "string",
                        "description": "Optional: the person's name, as they gave it."
                      },
                      "place": {
                        "type": "string",
                        "description": "A country or region in words (e.g. Croatia), or a place value as the places list names it."
                      },
                      "month": {
                        "type": "string",
                        "description": "YYYY-MM."
                      },
                      "party": {
                        "type": "number",
                        "description": "How many people."
                      },
                      "type": {
                        "type": "string",
                        "description": "Optional: one type, as the types list names it."
                      }
                    },
                    "required": [
                      "place",
                      "month",
                      "party"
                    ],
                    "additionalProperties": false
                  },
                  "outputSchema": {
                    "type": "object",
                    "properties": {
                      "place": {
                        "type": "string",
                        "description": "The place value answered (a place given in words, resolved)."
                      },
                      "currency": {
                        "type": "string",
                        "description": "ISO 4217."
                      },
                      "items": {
                        "type": "number",
                        "description": "How many items the figures are from."
                      },
                      "range": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "p25, p50 (median), p75 in MINOR units; null when too few items.",
                        "properties": {
                          "p25": {
                            "type": "number",
                            "description": "Minor units."
                          },
                          "p50": {
                            "type": "number",
                            "description": "Minor units."
                          },
                          "p75": {
                            "type": "number",
                            "description": "Minor units."
                          }
                        }
                      },
                      "thin": {
                        "type": "boolean",
                        "description": "true: few items, a rough figure."
                      },
                      "cheapest": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "The cheapest published item that fits.",
                        "properties": {
                          "href": {
                            "type": "string",
                            "description": "Its page, absolute URL."
                          },
                          "name": {
                            "type": "string",
                            "description": "Its name."
                          },
                          "place": {
                            "type": "string",
                            "description": "Where it leaves from."
                          },
                          "priceMinor": {
                            "type": "number",
                            "description": "Minor units."
                          }
                        }
                      },
                      "extrasMedianMinor": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "The usual mandatory extras, minor units."
                      },
                      "seasonHint": {
                        "type": [
                          "object",
                          "null"
                        ],
                        "description": "Another month against this one: pct cheaper there (negative: dearer).",
                        "properties": {
                          "month": {
                            "type": "string",
                            "description": "YYYY-MM."
                          },
                          "pct": {
                            "type": "number",
                            "description": "Percent."
                          }
                        }
                      },
                      "seasonNote": {
                        "type": "string",
                        "description": "The season hint in words, to tell the person."
                      },
                      "lastMinuteSharePct": {
                        "type": [
                          "number",
                          "null"
                        ],
                        "description": "Share of soon departures discounted."
                      },
                      "noneFitParty": {
                        "type": "boolean",
                        "description": "true: no item there takes the party."
                      },
                      "browsing": {
                        "type": "boolean",
                        "description": "true: answered without a contact, so fewer rows and the first pages only."
                      },
                      "next": {
                        "type": "string",
                        "description": "When browsing: how to get a quote or more rows."
                      },
                      "session": {
                        "type": "string",
                        "description": "Only on the call that created the contact: pass it from then on."
                      },
                      "sessionExpiresAt": {
                        "type": "string",
                        "description": "When that session stops working, ISO time."
                      }
                    },
                    "required": [
                      "currency",
                      "items"
                    ]
                  },
                  "annotations": {
                    "readOnlyHint": true,
                    "destructiveHint": false,
                    "openWorldHint": false
                  }
                },
                {
                  "name": "best_deals",
                  "title": "Best deals",
                  "description": "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; a departure the yacht's calendar shows taken is left out. One row per yacht: its page link (the id get and request_quote take) and photo (absolute URLs) 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. When none match, the answer is the nearest deals (the window after, the place around, a bound let go) and nearest says what was widened. Paged: total and cursor. Works without a contact (browsing: fewer rows).",
                  "inputSchema": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string",
                        "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry."
                      },
                      "phone": {
                        "type": "string",
                        "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse."
                      },
                      "session": {
                        "type": "string",
                        "description": "The session an earlier answer returned. Pass it instead of email or phone from then on."
                      },
                      "name": {
                        "type": "string",
                        "description": "Optional: the person's name, as they gave it."
                      },
                      "from": {
                        "type": "string",
                        "description": "Earliest departure, YYYY-MM-DD."
                      },
                      "to": {
                        "type": "string",
                        "description": "Latest departure, YYYY-MM-DD."
                      },
                      "party": {
                        "type": "number",
                        "description": "How many people."
                      },
                      "yacht_types": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "catamarans",
                            "gulets",
                            "houseboats",
                            "motorboats",
                            "sailboats"
                          ]
                        },
                        "minItems": 1,
                        "description": "Yacht Types: any of these value ids (one or more): catamarans (Catamarans, 3192); gulets (Gulets, 201); houseboats (Houseboats, 1428); motorboats (Motorboats, 1080); sailboats (Sailboats, 4577)."
                      },
                      "charter_types": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "all-inclusive",
                            "bareboat",
                            "cabin-charter",
                            "crewed",
                            "day-charter",
                            "flotilla",
                            "regatta",
                            "skippered"
                          ]
                        },
                        "minItems": 1,
                        "description": "Charter Types: any of these value ids (one or more): all-inclusive (All-inclusive, 68); bareboat (Bareboat, 8796); cabin-charter (Cabin charter, 152); crewed (Crewed, 1702); day-charter (Day charter, 374); flotilla (Flotilla, 257); regatta (Regatta, 34); skippered (Skippered, 245)."
                      },
                      "place": {
                        "type": "string",
                        "description": "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, Spain, British Virgin Islands, Netherlands, Germany, Seychelles, Poland, Ireland, Martinique, United Kingdom, Belgium, Portugal, Ecuador, French Polynesia, Sweden, St. Martin, Bahamas, Malta, Montenegro, Thailand, Canada, St. Lucia, Slovenia, Norway, Guadeloupe, Brazil, Hungary, Grenada, St. Vincent, Belize, Cuba, Maldives, Mexico, Panama, Cape Verde, United Arab Emirates, Antigua and Barbuda, India, Tanzania, Egypt, Monaco, Estonia, Mauritius, New Zealand, USA, Switzerland, Fiji. An unknown place is refused; nothing there answers the nearest place around it."
                      },
                      "base": {
                        "type": "string",
                        "description": "The exact base it leaves from, in words."
                      },
                      "text": {
                        "type": "string",
                        "description": "Words in its name or model, e.g. a builder or a model name."
                      },
                      "lengthMin": {
                        "type": "number",
                        "description": "Length at least ft (on this site 13.35 to 180.45)."
                      },
                      "lengthMax": {
                        "type": "number",
                        "description": "Length at most ft (on this site 13.35 to 180.45)."
                      },
                      "cabinsMin": {
                        "type": "number",
                        "description": "Cabins at least (on this site 0 to 20)."
                      },
                      "cabinsMax": {
                        "type": "number",
                        "description": "Cabins at most (on this site 0 to 20)."
                      },
                      "berthsMin": {
                        "type": "number",
                        "description": "Berths at least (on this site 0 to 80)."
                      },
                      "berthsMax": {
                        "type": "number",
                        "description": "Berths at most (on this site 0 to 80)."
                      },
                      "headsMin": {
                        "type": "number",
                        "description": "Heads at least (on this site 0 to 23)."
                      },
                      "headsMax": {
                        "type": "number",
                        "description": "Heads at most (on this site 0 to 23)."
                      },
                      "beamMin": {
                        "type": "number",
                        "description": "Beam at least m (on this site 0.9 to 44)."
                      },
                      "beamMax": {
                        "type": "number",
                        "description": "Beam at most m (on this site 0.9 to 44)."
                      },
                      "draftMin": {
                        "type": "number",
                        "description": "Draft at least m (on this site 0.3 to 7985)."
                      },
                      "draftMax": {
                        "type": "number",
                        "description": "Draft at most m (on this site 0.3 to 7985)."
                      },
                      "yearMin": {
                        "type": "number",
                        "description": "Year at least (on this site 0 to 2028)."
                      },
                      "yearMax": {
                        "type": "number",
                        "description": "Year at most (on this site 0 to 2028)."
                      },
                      "fuelMin": {
                        "type": "number",
                        "description": "Fuel tank at least l (on this site 1 to 65000)."
                      },
                      "fuelMax": {
                        "type": "number",
                        "description": "Fuel tank at most l (on this site 1 to 65000)."
                      },
                      "waterMin": {
                        "type": "number",
                        "description": "Water tank at least l (on this site 1 to 60000)."
                      },
                      "waterMax": {
                        "type": "number",
                        "description": "Water tank at most l (on this site 1 to 60000)."
                      },
                      "priceMin": {
                        "type": "number",
                        "description": "The least to pay, in the site currency: the price plus the mandatory extras."
                      },
                      "priceMax": {
                        "type": "number",
                        "description": "The most to pay, in the site currency: the price plus the mandatory extras."
                      },
                      "sort": {
                        "type": "string",
                        "enum": [
                          "saving",
                          "departure",
                          "price",
                          "length",
                          "cabins",
                          "berths",
                          "heads",
                          "beam",
                          "draft",
                          "year",
                          "fuel",
                          "water"
                        ],
                        "description": "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, biggest first), beam (beam, biggest first), draft (draft, biggest first), year (year, biggest first), fuel (fuel tank, biggest first), water (water tank, biggest first)."
                      },
                      "cursor": {
                        "type": "string",
                        "description": "The cursor a previous answer returned, for its next page."
                      },
                      "limit": {
                        "type": "number",
                        "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone."
                      }
                    },
                    "required": [],
                    "additionalProperties": false
                  },
                  "outputSchema": {
                    "type": "object",
                    "properties": {
                      "rows": {
                        "type": "array",
                        "description": "One page of deals, one row per item with its departures.",
                        "items": {
                          "type": "object",
                          "description": "One item.",
                          "properties": {
                            "item": {
                              "type": "string",
                              "description": "Its name."
                            },
                            "type": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Its type."
                            },
                            "base": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Its home base."
                            },
                            "guests": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "How many it takes."
                            },
                            "link": {
                              "type": "string",
                              "description": "Its page, absolute URL: the id get and request_quote take."
                            },
                            "photo": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "One photo, absolute URL."
                            },
                            "departures": {
                              "type": "array",
                              "description": "Its discounted departures in the window, in the order asked.",
                              "items": {
                                "type": "object",
                                "description": "One departure at one price.",
                                "properties": {
                                  "routes": {
                                    "type": "array",
                                    "description": "Every route it leaves on at this price.",
                                    "items": {
                                      "type": "object",
                                      "description": "A route.",
                                      "properties": {
                                        "from": {
                                          "type": "string",
                                          "description": "Leaves from."
                                        },
                                        "to": {
                                          "type": "string",
                                          "description": "Ends at."
                                        }
                                      }
                                    }
                                  },
                                  "departFrom": {
                                    "type": "string",
                                    "description": "YYYY-MM-DD."
                                  },
                                  "departTo": {
                                    "type": "string",
                                    "description": "YYYY-MM-DD."
                                  },
                                  "nights": {
                                    "type": "number",
                                    "description": "Nights."
                                  },
                                  "price": {
                                    "type": "object",
                                    "description": "An amount in the site currency.",
                                    "properties": {
                                      "amount": {
                                        "type": "number",
                                        "description": "In major units (euros, not cents)."
                                      },
                                      "currency": {
                                        "type": "string",
                                        "description": "ISO 4217."
                                      },
                                      "text": {
                                        "type": "string",
                                        "description": "The amount written out, to quote to the person."
                                      }
                                    }
                                  },
                                  "listPrice": {
                                    "type": "object",
                                    "description": "An amount in the site currency.",
                                    "properties": {
                                      "amount": {
                                        "type": "number",
                                        "description": "In major units (euros, not cents)."
                                      },
                                      "currency": {
                                        "type": "string",
                                        "description": "ISO 4217."
                                      },
                                      "text": {
                                        "type": "string",
                                        "description": "The amount written out, to quote to the person."
                                      }
                                    }
                                  },
                                  "mandatoryExtras": {
                                    "type": "object",
                                    "description": "What the departure states is payable on top.",
                                    "properties": {
                                      "amount": {
                                        "type": "number",
                                        "description": "In major units (euros, not cents)."
                                      },
                                      "currency": {
                                        "type": "string",
                                        "description": "ISO 4217."
                                      },
                                      "text": {
                                        "type": "string",
                                        "description": "The amount written out, to quote to the person."
                                      }
                                    }
                                  },
                                  "savingPct": {
                                    "type": "number",
                                    "description": "The discount the source states."
                                  },
                                  "kind": {
                                    "type": "string",
                                    "description": "special or offer."
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "total": {
                        "type": "number",
                        "description": "How many rows match in all."
                      },
                      "cursor": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Pass as cursor for the next page; null on the last."
                      },
                      "from": {
                        "type": "string",
                        "description": "The window's first day."
                      },
                      "through": {
                        "type": "string",
                        "description": "Its last day."
                      },
                      "checkedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "When the offers were read, ISO time."
                      },
                      "notApplied": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "description": "A wish."
                        },
                        "description": "What could not narrow the deals."
                      },
                      "nearest": {
                        "type": "object",
                        "description": "Only when nothing matched exactly: these rows are the nearest match.",
                        "properties": {
                          "widened": {
                            "type": "string",
                            "enum": [
                              "dates",
                              "base",
                              "place",
                              "ranges",
                              "price",
                              "discount"
                            ],
                            "description": "The one thing let go."
                          },
                          "note": {
                            "type": "string",
                            "description": "What moved, in words to tell the person."
                          }
                        }
                      },
                      "browsing": {
                        "type": "boolean",
                        "description": "true: answered without a contact, so fewer rows and the first pages only."
                      },
                      "next": {
                        "type": "string",
                        "description": "When browsing: how to get a quote or more rows."
                      },
                      "session": {
                        "type": "string",
                        "description": "Only on the call that created the contact: pass it from then on."
                      },
                      "sessionExpiresAt": {
                        "type": "string",
                        "description": "When that session stops working, ISO time."
                      }
                    },
                    "required": [
                      "rows",
                      "total"
                    ]
                  },
                  "annotations": {
                    "readOnlyHint": true,
                    "destructiveHint": false,
                    "openWorldHint": false
                  }
                },
                {
                  "name": "request_quote",
                  "title": "Request a formal quote",
                  "description": "Ask this site's desk for a formal quote on one or more yachts, for the person. Pass the page links a search, best_deals or get returned, the days and the party, and anything the person wants the desk to know. The desk answers with a written quote to the person's own email or phone, with every cost on it; 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. Ask the person before calling it.",
                  "inputSchema": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string",
                        "description": "The person's own email, as they gave it: the quote is sent there. This, phone or session is needed."
                      },
                      "phone": {
                        "type": "string",
                        "description": "The person's own phone, international form (+ and country code), as they gave it. This, email or session is needed."
                      },
                      "session": {
                        "type": "string",
                        "description": "The session an earlier answer returned. Pass it instead of email or phone."
                      },
                      "name": {
                        "type": "string",
                        "description": "Optional: the person's name, as they gave it."
                      },
                      "items": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "minItems": 1,
                        "maxItems": 20,
                        "description": "The yacht page links to quote (absolute URLs on this site), exactly as a search, best_deals or get returned them. At most 20."
                      },
                      "from": {
                        "type": "string",
                        "description": "Check-in day, YYYY-MM-DD."
                      },
                      "to": {
                        "type": "string",
                        "description": "Check-out day, YYYY-MM-DD."
                      },
                      "party": {
                        "type": "number",
                        "description": "How many people."
                      },
                      "notes": {
                        "type": "string",
                        "description": "What the person wants the desk to know, in their words (at most 2000 characters)."
                      }
                    },
                    "required": [
                      "items"
                    ],
                    "additionalProperties": false
                  },
                  "outputSchema": {
                    "type": "object",
                    "properties": {
                      "status": {
                        "type": "string",
                        "enum": [
                          "received",
                          "already_received"
                        ],
                        "description": "received: the desk has the request; already_received: this session asked the same in the last day."
                      },
                      "enquiryRef": {
                        "type": "string",
                        "description": "The request's reference, returned once."
                      },
                      "nextStep": {
                        "type": "string",
                        "description": "Where the written quote goes, in words to tell the person."
                      },
                      "session": {
                        "type": "string",
                        "description": "Only on the call that created the contact: pass it from then on."
                      },
                      "sessionExpiresAt": {
                        "type": "string",
                        "description": "When that session stops working, ISO time."
                      }
                    },
                    "required": [
                      "status",
                      "nextStep"
                    ]
                  },
                  "annotations": {
                    "readOnlyHint": false,
                    "destructiveHint": false,
                    "idempotentHint": true,
                    "openWorldHint": true
                  }
                }
              ]
            }
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/list"
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 1,
        "result": {
          "tools": [
            {
              "name": "search_yachts",
              "title": "Search yachts",
              "description": "Find this site's yachts, read from the live inventory. Pass what the person wants as the typed filters, and from / to whenever they gave exact days. With dates it returns ONLY the yachts free for that stay, each with its stay: status, price, list price, discount and when the source was checked (checkedAt). Without dates each has its from-price. Every row carries its page link and one photo, absolute URLs on this site; send the person there. Narrow with the typed filters (each list is any of its values; every filter must hold); priceMin / priceMax count the mandatory extras a quote states. notApplied lists what could not narrow the search. When nothing matches exactly the answer is the nearest match, and nearest says what was widened (another week, the place around, a bound let go): tell the person. Paged: total and cursor. Works without a contact (browsing: fewer rows).",
              "inputSchema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry."
                  },
                  "phone": {
                    "type": "string",
                    "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse."
                  },
                  "session": {
                    "type": "string",
                    "description": "The session an earlier answer returned. Pass it instead of email or phone from then on."
                  },
                  "name": {
                    "type": "string",
                    "description": "Optional: the person's name, as they gave it."
                  },
                  "from": {
                    "type": "string",
                    "description": "Check-in day, YYYY-MM-DD."
                  },
                  "to": {
                    "type": "string",
                    "description": "Check-out day, YYYY-MM-DD."
                  },
                  "party": {
                    "type": "number",
                    "description": "How many people."
                  },
                  "yacht_types": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "catamarans",
                        "gulets",
                        "houseboats",
                        "motorboats",
                        "sailboats"
                      ]
                    },
                    "minItems": 1,
                    "description": "Yacht Types: any of these value ids (one or more): catamarans (Catamarans, 3192); gulets (Gulets, 201); houseboats (Houseboats, 1428); motorboats (Motorboats, 1080); sailboats (Sailboats, 4577)."
                  },
                  "charter_types": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "all-inclusive",
                        "bareboat",
                        "cabin-charter",
                        "crewed",
                        "day-charter",
                        "flotilla",
                        "regatta",
                        "skippered"
                      ]
                    },
                    "minItems": 1,
                    "description": "Charter Types: any of these value ids (one or more): all-inclusive (All-inclusive, 68); bareboat (Bareboat, 8796); cabin-charter (Cabin charter, 152); crewed (Crewed, 1702); day-charter (Day charter, 374); flotilla (Flotilla, 257); regatta (Regatta, 34); skippered (Skippered, 245)."
                  },
                  "place": {
                    "type": "string",
                    "description": "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, Spain, British Virgin Islands, Netherlands, Germany, Seychelles, Poland, Ireland, Martinique, United Kingdom, Belgium, Portugal, Ecuador, French Polynesia, Sweden, St. Martin, Bahamas, Malta, Montenegro, Thailand, Canada, St. Lucia, Slovenia, Norway, Guadeloupe, Brazil, Hungary, Grenada, St. Vincent, Belize, Cuba, Maldives, Mexico, Panama, Cape Verde, United Arab Emirates, Antigua and Barbuda, India, Tanzania, Egypt, Monaco, Estonia, Mauritius, New Zealand, USA, Switzerland, Fiji. An unknown place is refused; nothing there answers the nearest place around it."
                  },
                  "base": {
                    "type": "string",
                    "description": "The exact base it leaves from, in words."
                  },
                  "text": {
                    "type": "string",
                    "description": "Words in its name or model, e.g. a builder or a model name."
                  },
                  "lengthMin": {
                    "type": "number",
                    "description": "Length at least ft (on this site 13.35 to 180.45)."
                  },
                  "lengthMax": {
                    "type": "number",
                    "description": "Length at most ft (on this site 13.35 to 180.45)."
                  },
                  "cabinsMin": {
                    "type": "number",
                    "description": "Cabins at least (on this site 0 to 20)."
                  },
                  "cabinsMax": {
                    "type": "number",
                    "description": "Cabins at most (on this site 0 to 20)."
                  },
                  "berthsMin": {
                    "type": "number",
                    "description": "Berths at least (on this site 0 to 80)."
                  },
                  "berthsMax": {
                    "type": "number",
                    "description": "Berths at most (on this site 0 to 80)."
                  },
                  "headsMin": {
                    "type": "number",
                    "description": "Heads at least (on this site 0 to 23)."
                  },
                  "headsMax": {
                    "type": "number",
                    "description": "Heads at most (on this site 0 to 23)."
                  },
                  "beamMin": {
                    "type": "number",
                    "description": "Beam at least m (on this site 0.9 to 44)."
                  },
                  "beamMax": {
                    "type": "number",
                    "description": "Beam at most m (on this site 0.9 to 44)."
                  },
                  "draftMin": {
                    "type": "number",
                    "description": "Draft at least m (on this site 0.3 to 7985)."
                  },
                  "draftMax": {
                    "type": "number",
                    "description": "Draft at most m (on this site 0.3 to 7985)."
                  },
                  "yearMin": {
                    "type": "number",
                    "description": "Year at least (on this site 0 to 2028)."
                  },
                  "yearMax": {
                    "type": "number",
                    "description": "Year at most (on this site 0 to 2028)."
                  },
                  "fuelMin": {
                    "type": "number",
                    "description": "Fuel tank at least l (on this site 1 to 65000)."
                  },
                  "fuelMax": {
                    "type": "number",
                    "description": "Fuel tank at most l (on this site 1 to 65000)."
                  },
                  "waterMin": {
                    "type": "number",
                    "description": "Water tank at least l (on this site 1 to 60000)."
                  },
                  "waterMax": {
                    "type": "number",
                    "description": "Water tank at most l (on this site 1 to 60000)."
                  },
                  "priceMin": {
                    "type": "number",
                    "description": "The least to pay, in the site currency: the price plus the mandatory extras."
                  },
                  "priceMax": {
                    "type": "number",
                    "description": "The most to pay, in the site currency: the price plus the mandatory extras."
                  },
                  "discountOnly": {
                    "type": "boolean",
                    "description": "true: only those with a discount the source states."
                  },
                  "sort": {
                    "type": "string",
                    "enum": [
                      "price",
                      "discount",
                      "length",
                      "cabins",
                      "berths",
                      "heads",
                      "beam",
                      "draft",
                      "year",
                      "fuel",
                      "water"
                    ],
                    "description": "price (default, cheapest first), discount (biggest first), or length (length, biggest first), cabins (cabins, biggest first), berths (berths, biggest first), heads (heads, biggest first), beam (beam, biggest first), draft (draft, biggest first), year (year, biggest first), fuel (fuel tank, biggest first), water (water tank, biggest first)."
                  },
                  "cursor": {
                    "type": "string",
                    "description": "The cursor a previous answer returned, for its next page."
                  },
                  "limit": {
                    "type": "number",
                    "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone."
                  }
                },
                "required": [],
                "additionalProperties": false
              },
              "outputSchema": {
                "type": "object",
                "properties": {
                  "items": {
                    "type": "array",
                    "description": "One page of matches.",
                    "items": {
                      "type": "object",
                      "description": "One item.",
                      "properties": {
                        "name": {
                          "type": "string",
                          "description": "Its name."
                        },
                        "href": {
                          "type": "string",
                          "description": "Its page on this site, absolute URL."
                        },
                        "image": {
                          "type": "object",
                          "description": "One photo, an absolute URL.",
                          "properties": {
                            "src": {
                              "type": "string",
                              "description": "https URL."
                            },
                            "alt": {
                              "type": "string",
                              "description": "What it shows."
                            }
                          }
                        },
                        "kind": {
                          "type": "string",
                          "description": "Its type, in the site's words."
                        },
                        "priceFrom": {
                          "type": "number",
                          "description": "The stay's price with dates, else its cheapest quoted stay, in major units."
                        },
                        "currency": {
                          "type": "string",
                          "description": "ISO 4217."
                        },
                        "mandatoryExtras": {
                          "type": "object",
                          "description": "Without dates: what its cheapest quote says is payable on top.",
                          "properties": {
                            "amount": {
                              "type": "number",
                              "description": "In major units (euros, not cents)."
                            },
                            "currency": {
                              "type": "string",
                              "description": "ISO 4217."
                            },
                            "text": {
                              "type": "string",
                              "description": "The amount written out, to quote to the person."
                            }
                          }
                        },
                        "stay": {
                          "type": "object",
                          "description": "With dates: that stay, read live.",
                          "properties": {
                            "checkIn": {
                              "type": "string",
                              "description": "YYYY-MM-DD."
                            },
                            "checkOut": {
                              "type": "string",
                              "description": "YYYY-MM-DD."
                            },
                            "nights": {
                              "type": "number",
                              "description": "Nights."
                            },
                            "status": {
                              "type": "string",
                              "enum": [
                                "free",
                                "booked",
                                "not-a-check-in-day",
                                "not-whole-blocks",
                                "outside-calendar",
                                "not-known"
                              ],
                              "description": "Whether it can be booked."
                            },
                            "price": {
                              "type": "object",
                              "description": "The stay's price.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "listPrice": {
                              "type": "object",
                              "description": "The source's list price above price, when discounted.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "discountPct": {
                              "type": "number",
                              "description": "The discount the source states."
                            },
                            "mandatoryExtras": {
                              "type": "object",
                              "description": "What the source says is payable on top, whatever the person picks.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "deposit": {
                              "type": "object",
                              "description": "The deposit held.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "checkedAt": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "When the source was read, ISO time."
                            }
                          }
                        }
                      }
                    }
                  },
                  "total": {
                    "type": "number",
                    "description": "How many rows match in all."
                  },
                  "cursor": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Pass as cursor for the next page; null on the last."
                  },
                  "checked": {
                    "type": "boolean",
                    "description": "true: dates were given, so every row is free for them."
                  },
                  "checkedAt": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "When the source was read, ISO time."
                  },
                  "notApplied": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "description": "A wish."
                    },
                    "description": "What the person asked for that could not narrow the search."
                  },
                  "unchecked": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "description": "dates or party."
                    },
                    "description": "What was said but could not be checked."
                  },
                  "leftOutUnpriced": {
                    "type": "number",
                    "description": "Matches left out under priceMin / priceMax because no price is known."
                  },
                  "nearest": {
                    "type": "object",
                    "description": "Only when nothing matched exactly: these rows are the nearest match.",
                    "properties": {
                      "widened": {
                        "type": "string",
                        "enum": [
                          "dates",
                          "base",
                          "place",
                          "ranges",
                          "price",
                          "discount"
                        ],
                        "description": "The one thing let go."
                      },
                      "note": {
                        "type": "string",
                        "description": "What moved, in words to tell the person."
                      }
                    }
                  },
                  "browsing": {
                    "type": "boolean",
                    "description": "true: answered without a contact, so fewer rows and the first pages only."
                  },
                  "next": {
                    "type": "string",
                    "description": "When browsing: how to get a quote or more rows."
                  },
                  "session": {
                    "type": "string",
                    "description": "Only on the call that created the contact: pass it from then on."
                  },
                  "sessionExpiresAt": {
                    "type": "string",
                    "description": "When that session stops working, ISO time."
                  }
                },
                "required": [
                  "items",
                  "total"
                ]
              },
              "annotations": {
                "readOnlyHint": true,
                "destructiveHint": false,
                "openWorldHint": false
              }
            },
            {
              "name": "get_yacht",
              "title": "Get one yacht",
              "description": "One yacht: its 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 that is absent is one the source does not state. Works without a contact.",
              "inputSchema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry."
                  },
                  "phone": {
                    "type": "string",
                    "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse."
                  },
                  "session": {
                    "type": "string",
                    "description": "The session an earlier answer returned. Pass it instead of email or phone from then on."
                  },
                  "name": {
                    "type": "string",
                    "description": "Optional: the person's name, as they gave it."
                  },
                  "id": {
                    "type": "string",
                    "description": "The yacht's page link (an absolute URL on this site), exactly as a search or best_deals returned it."
                  },
                  "from": {
                    "type": "string",
                    "description": "Check-in day, YYYY-MM-DD."
                  },
                  "to": {
                    "type": "string",
                    "description": "Check-out day, YYYY-MM-DD."
                  },
                  "party": {
                    "type": "number",
                    "description": "How many people."
                  },
                  "cursor": {
                    "type": "string",
                    "description": "The cursor a previous answer returned, for its next page."
                  },
                  "limit": {
                    "type": "number",
                    "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone."
                  }
                },
                "required": [
                  "id"
                ],
                "additionalProperties": false
              },
              "outputSchema": {
                "type": "object",
                "properties": {
                  "item": {
                    "type": "string",
                    "description": "Its name."
                  },
                  "href": {
                    "type": "string",
                    "description": "Its page on this site, absolute URL."
                  },
                  "facts": {
                    "type": "array",
                    "description": "The facts its page shows, labelled.",
                    "items": {
                      "type": "object",
                      "description": "One fact.",
                      "properties": {}
                    }
                  },
                  "kind": {
                    "type": "string",
                    "description": "Its type."
                  },
                  "place": {
                    "type": "string",
                    "description": "Where it is."
                  },
                  "description": {
                    "type": "string",
                    "description": "Its description."
                  },
                  "packages": {
                    "type": "array",
                    "description": "The ways it is sold, the default first, each with its included, required and optional extras.",
                    "items": {
                      "type": "object",
                      "description": "One package.",
                      "properties": {
                        "name": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Its name."
                        },
                        "default": {
                          "type": "boolean",
                          "description": "Sold this way unless asked."
                        },
                        "staffed": {
                          "type": "boolean",
                          "description": "Sold with staff as standard."
                        },
                        "included": {
                          "type": "array",
                          "description": "Included, nothing to pay.",
                          "items": {
                            "type": "object",
                            "description": "An extra.",
                            "properties": {}
                          }
                        },
                        "required": {
                          "type": "array",
                          "description": "Must be paid.",
                          "items": {
                            "type": "object",
                            "description": "An extra.",
                            "properties": {}
                          }
                        },
                        "optional": {
                          "type": "array",
                          "description": "The person's choice.",
                          "items": {
                            "type": "object",
                            "description": "An extra.",
                            "properties": {}
                          }
                        }
                      }
                    }
                  },
                  "terms": {
                    "type": "object",
                    "description": "Deposit, licence, stay limits, check-in days and times, as stated.",
                    "properties": {}
                  },
                  "equipment": {
                    "type": "array",
                    "description": "Named equipment in groups.",
                    "items": {
                      "type": "object",
                      "description": "A group.",
                      "properties": {}
                    }
                  },
                  "operatorDescriptions": {
                    "type": "array",
                    "description": "The operator's own texts and documents.",
                    "items": {
                      "type": "object",
                      "description": "One.",
                      "properties": {}
                    }
                  },
                  "availability": {
                    "type": "object",
                    "description": "With dates: that stay and, when not free, the nearest free stays; without: its free stays, soonest first.",
                    "properties": {
                      "card": {
                        "type": "object",
                        "description": "Its card: name, link, photos (get keeps the gallery).",
                        "properties": {}
                      },
                      "stay": {
                        "type": "object",
                        "description": "One stay of this item, read live.",
                        "properties": {
                          "checkIn": {
                            "type": "string",
                            "description": "YYYY-MM-DD."
                          },
                          "checkOut": {
                            "type": "string",
                            "description": "YYYY-MM-DD."
                          },
                          "nights": {
                            "type": "number",
                            "description": "Nights."
                          },
                          "status": {
                            "type": "string",
                            "enum": [
                              "free",
                              "booked",
                              "not-a-check-in-day",
                              "not-whole-blocks",
                              "outside-calendar",
                              "not-known"
                            ],
                            "description": "Whether it can be booked."
                          },
                          "price": {
                            "type": "object",
                            "description": "The stay's price.",
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "In major units (euros, not cents)."
                              },
                              "currency": {
                                "type": "string",
                                "description": "ISO 4217."
                              },
                              "text": {
                                "type": "string",
                                "description": "The amount written out, to quote to the person."
                              }
                            }
                          },
                          "listPrice": {
                            "type": "object",
                            "description": "The source's list price above price, when discounted.",
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "In major units (euros, not cents)."
                              },
                              "currency": {
                                "type": "string",
                                "description": "ISO 4217."
                              },
                              "text": {
                                "type": "string",
                                "description": "The amount written out, to quote to the person."
                              }
                            }
                          },
                          "discountPct": {
                            "type": "number",
                            "description": "The discount the source states."
                          },
                          "mandatoryExtras": {
                            "type": "object",
                            "description": "What the source says is payable on top, whatever the person picks.",
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "In major units (euros, not cents)."
                              },
                              "currency": {
                                "type": "string",
                                "description": "ISO 4217."
                              },
                              "text": {
                                "type": "string",
                                "description": "The amount written out, to quote to the person."
                              }
                            }
                          },
                          "deposit": {
                            "type": "object",
                            "description": "The deposit held.",
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "In major units (euros, not cents)."
                              },
                              "currency": {
                                "type": "string",
                                "description": "ISO 4217."
                              },
                              "text": {
                                "type": "string",
                                "description": "The amount written out, to quote to the person."
                              }
                            }
                          },
                          "checkedAt": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "When the source was read, ISO time."
                          }
                        }
                      },
                      "freeStays": {
                        "type": "array",
                        "description": "Free stays, a page.",
                        "items": {
                          "type": "object",
                          "description": "One stay of this item, read live.",
                          "properties": {
                            "checkIn": {
                              "type": "string",
                              "description": "YYYY-MM-DD."
                            },
                            "checkOut": {
                              "type": "string",
                              "description": "YYYY-MM-DD."
                            },
                            "nights": {
                              "type": "number",
                              "description": "Nights."
                            },
                            "status": {
                              "type": "string",
                              "enum": [
                                "free",
                                "booked",
                                "not-a-check-in-day",
                                "not-whole-blocks",
                                "outside-calendar",
                                "not-known"
                              ],
                              "description": "Whether it can be booked."
                            },
                            "price": {
                              "type": "object",
                              "description": "The stay's price.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "listPrice": {
                              "type": "object",
                              "description": "The source's list price above price, when discounted.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "discountPct": {
                              "type": "number",
                              "description": "The discount the source states."
                            },
                            "mandatoryExtras": {
                              "type": "object",
                              "description": "What the source says is payable on top, whatever the person picks.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "deposit": {
                              "type": "object",
                              "description": "The deposit held.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "checkedAt": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "When the source was read, ISO time."
                            }
                          }
                        }
                      },
                      "nearestFree": {
                        "type": "array",
                        "description": "The nearest free stays, a page.",
                        "items": {
                          "type": "object",
                          "description": "One stay of this item, read live.",
                          "properties": {
                            "checkIn": {
                              "type": "string",
                              "description": "YYYY-MM-DD."
                            },
                            "checkOut": {
                              "type": "string",
                              "description": "YYYY-MM-DD."
                            },
                            "nights": {
                              "type": "number",
                              "description": "Nights."
                            },
                            "status": {
                              "type": "string",
                              "enum": [
                                "free",
                                "booked",
                                "not-a-check-in-day",
                                "not-whole-blocks",
                                "outside-calendar",
                                "not-known"
                              ],
                              "description": "Whether it can be booked."
                            },
                            "price": {
                              "type": "object",
                              "description": "The stay's price.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "listPrice": {
                              "type": "object",
                              "description": "The source's list price above price, when discounted.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "discountPct": {
                              "type": "number",
                              "description": "The discount the source states."
                            },
                            "mandatoryExtras": {
                              "type": "object",
                              "description": "What the source says is payable on top, whatever the person picks.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "deposit": {
                              "type": "object",
                              "description": "The deposit held.",
                              "properties": {
                                "amount": {
                                  "type": "number",
                                  "description": "In major units (euros, not cents)."
                                },
                                "currency": {
                                  "type": "string",
                                  "description": "ISO 4217."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The amount written out, to quote to the person."
                                }
                              }
                            },
                            "checkedAt": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "When the source was read, ISO time."
                            }
                          }
                        }
                      },
                      "party": {
                        "type": "string",
                        "enum": [
                          "fits",
                          "too-many",
                          "not-checked"
                        ],
                        "description": "Whether the party fits."
                      },
                      "total": {
                        "type": "number",
                        "description": "How many rows match in all."
                      },
                      "cursor": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Pass as cursor for the next page; null on the last."
                      }
                    }
                  },
                  "checkedAt": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "When the source was read, ISO time."
                  },
                  "browsing": {
                    "type": "boolean",
                    "description": "true: answered without a contact, so fewer rows and the first pages only."
                  },
                  "next": {
                    "type": "string",
                    "description": "When browsing: how to get a quote or more rows."
                  },
                  "session": {
                    "type": "string",
                    "description": "Only on the call that created the contact: pass it from then on."
                  },
                  "sessionExpiresAt": {
                    "type": "string",
                    "description": "When that session stops working, ISO time."
                  }
                },
                "required": [
                  "item",
                  "href"
                ]
              },
              "annotations": {
                "readOnlyHint": true,
                "destructiveHint": false,
                "openWorldHint": false
              }
            },
            {
              "name": "price_range",
              "title": "Price range",
              "description": "What a stay typically costs: the range (p25, median, p75 in minor units of the currency) of open departures for a place, month and party, optionally one type, with 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. Works without a contact.",
              "inputSchema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry."
                  },
                  "phone": {
                    "type": "string",
                    "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse."
                  },
                  "session": {
                    "type": "string",
                    "description": "The session an earlier answer returned. Pass it instead of email or phone from then on."
                  },
                  "name": {
                    "type": "string",
                    "description": "Optional: the person's name, as they gave it."
                  },
                  "place": {
                    "type": "string",
                    "description": "A country or region in words (e.g. Croatia), or a place value as the places list names it."
                  },
                  "month": {
                    "type": "string",
                    "description": "YYYY-MM."
                  },
                  "party": {
                    "type": "number",
                    "description": "How many people."
                  },
                  "type": {
                    "type": "string",
                    "description": "Optional: one type, as the types list names it."
                  }
                },
                "required": [
                  "place",
                  "month",
                  "party"
                ],
                "additionalProperties": false
              },
              "outputSchema": {
                "type": "object",
                "properties": {
                  "place": {
                    "type": "string",
                    "description": "The place value answered (a place given in words, resolved)."
                  },
                  "currency": {
                    "type": "string",
                    "description": "ISO 4217."
                  },
                  "items": {
                    "type": "number",
                    "description": "How many items the figures are from."
                  },
                  "range": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "p25, p50 (median), p75 in MINOR units; null when too few items.",
                    "properties": {
                      "p25": {
                        "type": "number",
                        "description": "Minor units."
                      },
                      "p50": {
                        "type": "number",
                        "description": "Minor units."
                      },
                      "p75": {
                        "type": "number",
                        "description": "Minor units."
                      }
                    }
                  },
                  "thin": {
                    "type": "boolean",
                    "description": "true: few items, a rough figure."
                  },
                  "cheapest": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "The cheapest published item that fits.",
                    "properties": {
                      "href": {
                        "type": "string",
                        "description": "Its page, absolute URL."
                      },
                      "name": {
                        "type": "string",
                        "description": "Its name."
                      },
                      "place": {
                        "type": "string",
                        "description": "Where it leaves from."
                      },
                      "priceMinor": {
                        "type": "number",
                        "description": "Minor units."
                      }
                    }
                  },
                  "extrasMedianMinor": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "The usual mandatory extras, minor units."
                  },
                  "seasonHint": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Another month against this one: pct cheaper there (negative: dearer).",
                    "properties": {
                      "month": {
                        "type": "string",
                        "description": "YYYY-MM."
                      },
                      "pct": {
                        "type": "number",
                        "description": "Percent."
                      }
                    }
                  },
                  "seasonNote": {
                    "type": "string",
                    "description": "The season hint in words, to tell the person."
                  },
                  "lastMinuteSharePct": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Share of soon departures discounted."
                  },
                  "noneFitParty": {
                    "type": "boolean",
                    "description": "true: no item there takes the party."
                  },
                  "browsing": {
                    "type": "boolean",
                    "description": "true: answered without a contact, so fewer rows and the first pages only."
                  },
                  "next": {
                    "type": "string",
                    "description": "When browsing: how to get a quote or more rows."
                  },
                  "session": {
                    "type": "string",
                    "description": "Only on the call that created the contact: pass it from then on."
                  },
                  "sessionExpiresAt": {
                    "type": "string",
                    "description": "When that session stops working, ISO time."
                  }
                },
                "required": [
                  "currency",
                  "items"
                ]
              },
              "annotations": {
                "readOnlyHint": true,
                "destructiveHint": false,
                "openWorldHint": false
              }
            },
            {
              "name": "best_deals",
              "title": "Best deals",
              "description": "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; a departure the yacht's calendar shows taken is left out. One row per yacht: its page link (the id get and request_quote take) and photo (absolute URLs) 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. When none match, the answer is the nearest deals (the window after, the place around, a bound let go) and nearest says what was widened. Paged: total and cursor. Works without a contact (browsing: fewer rows).",
              "inputSchema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry."
                  },
                  "phone": {
                    "type": "string",
                    "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse."
                  },
                  "session": {
                    "type": "string",
                    "description": "The session an earlier answer returned. Pass it instead of email or phone from then on."
                  },
                  "name": {
                    "type": "string",
                    "description": "Optional: the person's name, as they gave it."
                  },
                  "from": {
                    "type": "string",
                    "description": "Earliest departure, YYYY-MM-DD."
                  },
                  "to": {
                    "type": "string",
                    "description": "Latest departure, YYYY-MM-DD."
                  },
                  "party": {
                    "type": "number",
                    "description": "How many people."
                  },
                  "yacht_types": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "catamarans",
                        "gulets",
                        "houseboats",
                        "motorboats",
                        "sailboats"
                      ]
                    },
                    "minItems": 1,
                    "description": "Yacht Types: any of these value ids (one or more): catamarans (Catamarans, 3192); gulets (Gulets, 201); houseboats (Houseboats, 1428); motorboats (Motorboats, 1080); sailboats (Sailboats, 4577)."
                  },
                  "charter_types": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "all-inclusive",
                        "bareboat",
                        "cabin-charter",
                        "crewed",
                        "day-charter",
                        "flotilla",
                        "regatta",
                        "skippered"
                      ]
                    },
                    "minItems": 1,
                    "description": "Charter Types: any of these value ids (one or more): all-inclusive (All-inclusive, 68); bareboat (Bareboat, 8796); cabin-charter (Cabin charter, 152); crewed (Crewed, 1702); day-charter (Day charter, 374); flotilla (Flotilla, 257); regatta (Regatta, 34); skippered (Skippered, 245)."
                  },
                  "place": {
                    "type": "string",
                    "description": "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, Spain, British Virgin Islands, Netherlands, Germany, Seychelles, Poland, Ireland, Martinique, United Kingdom, Belgium, Portugal, Ecuador, French Polynesia, Sweden, St. Martin, Bahamas, Malta, Montenegro, Thailand, Canada, St. Lucia, Slovenia, Norway, Guadeloupe, Brazil, Hungary, Grenada, St. Vincent, Belize, Cuba, Maldives, Mexico, Panama, Cape Verde, United Arab Emirates, Antigua and Barbuda, India, Tanzania, Egypt, Monaco, Estonia, Mauritius, New Zealand, USA, Switzerland, Fiji. An unknown place is refused; nothing there answers the nearest place around it."
                  },
                  "base": {
                    "type": "string",
                    "description": "The exact base it leaves from, in words."
                  },
                  "text": {
                    "type": "string",
                    "description": "Words in its name or model, e.g. a builder or a model name."
                  },
                  "lengthMin": {
                    "type": "number",
                    "description": "Length at least ft (on this site 13.35 to 180.45)."
                  },
                  "lengthMax": {
                    "type": "number",
                    "description": "Length at most ft (on this site 13.35 to 180.45)."
                  },
                  "cabinsMin": {
                    "type": "number",
                    "description": "Cabins at least (on this site 0 to 20)."
                  },
                  "cabinsMax": {
                    "type": "number",
                    "description": "Cabins at most (on this site 0 to 20)."
                  },
                  "berthsMin": {
                    "type": "number",
                    "description": "Berths at least (on this site 0 to 80)."
                  },
                  "berthsMax": {
                    "type": "number",
                    "description": "Berths at most (on this site 0 to 80)."
                  },
                  "headsMin": {
                    "type": "number",
                    "description": "Heads at least (on this site 0 to 23)."
                  },
                  "headsMax": {
                    "type": "number",
                    "description": "Heads at most (on this site 0 to 23)."
                  },
                  "beamMin": {
                    "type": "number",
                    "description": "Beam at least m (on this site 0.9 to 44)."
                  },
                  "beamMax": {
                    "type": "number",
                    "description": "Beam at most m (on this site 0.9 to 44)."
                  },
                  "draftMin": {
                    "type": "number",
                    "description": "Draft at least m (on this site 0.3 to 7985)."
                  },
                  "draftMax": {
                    "type": "number",
                    "description": "Draft at most m (on this site 0.3 to 7985)."
                  },
                  "yearMin": {
                    "type": "number",
                    "description": "Year at least (on this site 0 to 2028)."
                  },
                  "yearMax": {
                    "type": "number",
                    "description": "Year at most (on this site 0 to 2028)."
                  },
                  "fuelMin": {
                    "type": "number",
                    "description": "Fuel tank at least l (on this site 1 to 65000)."
                  },
                  "fuelMax": {
                    "type": "number",
                    "description": "Fuel tank at most l (on this site 1 to 65000)."
                  },
                  "waterMin": {
                    "type": "number",
                    "description": "Water tank at least l (on this site 1 to 60000)."
                  },
                  "waterMax": {
                    "type": "number",
                    "description": "Water tank at most l (on this site 1 to 60000)."
                  },
                  "priceMin": {
                    "type": "number",
                    "description": "The least to pay, in the site currency: the price plus the mandatory extras."
                  },
                  "priceMax": {
                    "type": "number",
                    "description": "The most to pay, in the site currency: the price plus the mandatory extras."
                  },
                  "sort": {
                    "type": "string",
                    "enum": [
                      "saving",
                      "departure",
                      "price",
                      "length",
                      "cabins",
                      "berths",
                      "heads",
                      "beam",
                      "draft",
                      "year",
                      "fuel",
                      "water"
                    ],
                    "description": "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, biggest first), beam (beam, biggest first), draft (draft, biggest first), year (year, biggest first), fuel (fuel tank, biggest first), water (water tank, biggest first)."
                  },
                  "cursor": {
                    "type": "string",
                    "description": "The cursor a previous answer returned, for its next page."
                  },
                  "limit": {
                    "type": "number",
                    "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone."
                  }
                },
                "required": [],
                "additionalProperties": false
              },
              "outputSchema": {
                "type": "object",
                "properties": {
                  "rows": {
                    "type": "array",
                    "description": "One page of deals, one row per item with its departures.",
                    "items": {
                      "type": "object",
                      "description": "One item.",
                      "properties": {
                        "item": {
                          "type": "string",
                          "description": "Its name."
                        },
                        "type": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Its type."
                        },
                        "base": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Its home base."
                        },
                        "guests": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "How many it takes."
                        },
                        "link": {
                          "type": "string",
                          "description": "Its page, absolute URL: the id get and request_quote take."
                        },
                        "photo": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "One photo, absolute URL."
                        },
                        "departures": {
                          "type": "array",
                          "description": "Its discounted departures in the window, in the order asked.",
                          "items": {
                            "type": "object",
                            "description": "One departure at one price.",
                            "properties": {
                              "routes": {
                                "type": "array",
                                "description": "Every route it leaves on at this price.",
                                "items": {
                                  "type": "object",
                                  "description": "A route.",
                                  "properties": {
                                    "from": {
                                      "type": "string",
                                      "description": "Leaves from."
                                    },
                                    "to": {
                                      "type": "string",
                                      "description": "Ends at."
                                    }
                                  }
                                }
                              },
                              "departFrom": {
                                "type": "string",
                                "description": "YYYY-MM-DD."
                              },
                              "departTo": {
                                "type": "string",
                                "description": "YYYY-MM-DD."
                              },
                              "nights": {
                                "type": "number",
                                "description": "Nights."
                              },
                              "price": {
                                "type": "object",
                                "description": "An amount in the site currency.",
                                "properties": {
                                  "amount": {
                                    "type": "number",
                                    "description": "In major units (euros, not cents)."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "description": "ISO 4217."
                                  },
                                  "text": {
                                    "type": "string",
                                    "description": "The amount written out, to quote to the person."
                                  }
                                }
                              },
                              "listPrice": {
                                "type": "object",
                                "description": "An amount in the site currency.",
                                "properties": {
                                  "amount": {
                                    "type": "number",
                                    "description": "In major units (euros, not cents)."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "description": "ISO 4217."
                                  },
                                  "text": {
                                    "type": "string",
                                    "description": "The amount written out, to quote to the person."
                                  }
                                }
                              },
                              "mandatoryExtras": {
                                "type": "object",
                                "description": "What the departure states is payable on top.",
                                "properties": {
                                  "amount": {
                                    "type": "number",
                                    "description": "In major units (euros, not cents)."
                                  },
                                  "currency": {
                                    "type": "string",
                                    "description": "ISO 4217."
                                  },
                                  "text": {
                                    "type": "string",
                                    "description": "The amount written out, to quote to the person."
                                  }
                                }
                              },
                              "savingPct": {
                                "type": "number",
                                "description": "The discount the source states."
                              },
                              "kind": {
                                "type": "string",
                                "description": "special or offer."
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "total": {
                    "type": "number",
                    "description": "How many rows match in all."
                  },
                  "cursor": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Pass as cursor for the next page; null on the last."
                  },
                  "from": {
                    "type": "string",
                    "description": "The window's first day."
                  },
                  "through": {
                    "type": "string",
                    "description": "Its last day."
                  },
                  "checkedAt": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "When the offers were read, ISO time."
                  },
                  "notApplied": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "description": "A wish."
                    },
                    "description": "What could not narrow the deals."
                  },
                  "nearest": {
                    "type": "object",
                    "description": "Only when nothing matched exactly: these rows are the nearest match.",
                    "properties": {
                      "widened": {
                        "type": "string",
                        "enum": [
                          "dates",
                          "base",
                          "place",
                          "ranges",
                          "price",
                          "discount"
                        ],
                        "description": "The one thing let go."
                      },
                      "note": {
                        "type": "string",
                        "description": "What moved, in words to tell the person."
                      }
                    }
                  },
                  "browsing": {
                    "type": "boolean",
                    "description": "true: answered without a contact, so fewer rows and the first pages only."
                  },
                  "next": {
                    "type": "string",
                    "description": "When browsing: how to get a quote or more rows."
                  },
                  "session": {
                    "type": "string",
                    "description": "Only on the call that created the contact: pass it from then on."
                  },
                  "sessionExpiresAt": {
                    "type": "string",
                    "description": "When that session stops working, ISO time."
                  }
                },
                "required": [
                  "rows",
                  "total"
                ]
              },
              "annotations": {
                "readOnlyHint": true,
                "destructiveHint": false,
                "openWorldHint": false
              }
            },
            {
              "name": "request_quote",
              "title": "Request a formal quote",
              "description": "Ask this site's desk for a formal quote on one or more yachts, for the person. Pass the page links a search, best_deals or get returned, the days and the party, and anything the person wants the desk to know. The desk answers with a written quote to the person's own email or phone, with every cost on it; 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. Ask the person before calling it.",
              "inputSchema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "The person's own email, as they gave it: the quote is sent there. This, phone or session is needed."
                  },
                  "phone": {
                    "type": "string",
                    "description": "The person's own phone, international form (+ and country code), as they gave it. This, email or session is needed."
                  },
                  "session": {
                    "type": "string",
                    "description": "The session an earlier answer returned. Pass it instead of email or phone."
                  },
                  "name": {
                    "type": "string",
                    "description": "Optional: the person's name, as they gave it."
                  },
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 1,
                    "maxItems": 20,
                    "description": "The yacht page links to quote (absolute URLs on this site), exactly as a search, best_deals or get returned them. At most 20."
                  },
                  "from": {
                    "type": "string",
                    "description": "Check-in day, YYYY-MM-DD."
                  },
                  "to": {
                    "type": "string",
                    "description": "Check-out day, YYYY-MM-DD."
                  },
                  "party": {
                    "type": "number",
                    "description": "How many people."
                  },
                  "notes": {
                    "type": "string",
                    "description": "What the person wants the desk to know, in their words (at most 2000 characters)."
                  }
                },
                "required": [
                  "items"
                ],
                "additionalProperties": false
              },
              "outputSchema": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "enum": [
                      "received",
                      "already_received"
                    ],
                    "description": "received: the desk has the request; already_received: this session asked the same in the last day."
                  },
                  "enquiryRef": {
                    "type": "string",
                    "description": "The request's reference, returned once."
                  },
                  "nextStep": {
                    "type": "string",
                    "description": "Where the written quote goes, in words to tell the person."
                  },
                  "session": {
                    "type": "string",
                    "description": "Only on the call that created the contact: pass it from then on."
                  },
                  "sessionExpiresAt": {
                    "type": "string",
                    "description": "When that session stops working, ISO time."
                  }
                },
                "required": [
                  "status",
                  "nextStep"
                ]
              },
              "annotations": {
                "readOnlyHint": false,
                "destructiveHint": false,
                "idempotentHint": true,
                "openWorldHint": true
              }
            }
          ]
        }
      }
    },
    {
      "name": "resources/read",
      "summary": "Read the company's published facts and its house and legal pages.",
      "x-mcp-method": "resources/read",
      "paramStructure": "by-name",
      "params": [
        {
          "name": "uri",
          "required": true,
          "schema": {
            "type": "string",
            "enum": [
              "site://about"
            ]
          }
        }
      ],
      "result": {
        "name": "result",
        "schema": {
          "type": "object"
        }
      },
      "errors": [
        {
          "name": "parse_error",
          "code": -32700,
          "kind": "rpc",
          "message": "Parse error.",
          "next": "Send one valid JSON-RPC 2.0 message as the request body."
        },
        {
          "name": "invalid_request",
          "code": -32600,
          "kind": "rpc",
          "message": "Not a JSON-RPC 2.0 request.",
          "next": "Send one JSON-RPC 2.0 message per request, with jsonrpc \"2.0\", an id and a method."
        },
        {
          "name": "invalid_locale",
          "code": -32600,
          "kind": "rpc",
          "message": "invalid_locale",
          "next": "Pass locale as two lower-case letters, or leave it out."
        },
        {
          "name": "method_not_found",
          "code": -32601,
          "kind": "rpc",
          "message": "Method not found.",
          "next": "Call initialize, tools/list, tools/call, resources/list or resources/read."
        },
        {
          "name": "invalid_params",
          "code": -32602,
          "kind": "rpc",
          "message": "Invalid params.",
          "next": "Read the message: it names the argument. Call tools/list for each tool's schema."
        },
        {
          "name": "resource_not_found",
          "code": -32002,
          "kind": "rpc",
          "message": "Resource not found.",
          "next": "Call resources/list for the resources this server has."
        },
        {
          "name": "site_unavailable",
          "code": -32000,
          "kind": "rpc",
          "message": "site_unavailable",
          "next": "Try again later."
        },
        {
          "name": "mcp_disabled",
          "code": -32000,
          "kind": "rpc",
          "message": "mcp_disabled",
          "next": "This site has its MCP server switched off. Send the person to the website."
        },
        {
          "name": "rate_limited_address",
          "code": -32000,
          "kind": "rpc",
          "message": "rate_limited",
          "next": "Wait for the Retry-After seconds, then call again."
        },
        {
          "name": "internal_error",
          "code": -32603,
          "kind": "rpc",
          "message": "site_unavailable",
          "next": "Try again later."
        }
      ],
      "examples": [
        {
          "name": "resources/read example",
          "params": [
            {
              "name": "uri",
              "value": "site://about"
            }
          ],
          "result": {
            "name": "result",
            "value": {
              "contents": [
                {
                  "uri": "site://about",
                  "mimeType": "application/json",
                  "text": "{…}"
                }
              ]
            }
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "resources/read",
        "params": {
          "uri": "site://about"
        }
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 1,
        "result": {
          "contents": [
            {
              "uri": "site://about",
              "mimeType": "application/json",
              "text": "{…}"
            }
          ]
        }
      }
    },
    {
      "name": "ping",
      "summary": "Check the server answers.",
      "x-mcp-method": "ping",
      "paramStructure": "by-name",
      "params": [],
      "result": {
        "name": "result",
        "schema": {
          "type": "object"
        }
      },
      "errors": [
        {
          "name": "parse_error",
          "code": -32700,
          "kind": "rpc",
          "message": "Parse error.",
          "next": "Send one valid JSON-RPC 2.0 message as the request body."
        },
        {
          "name": "invalid_request",
          "code": -32600,
          "kind": "rpc",
          "message": "Not a JSON-RPC 2.0 request.",
          "next": "Send one JSON-RPC 2.0 message per request, with jsonrpc \"2.0\", an id and a method."
        },
        {
          "name": "invalid_locale",
          "code": -32600,
          "kind": "rpc",
          "message": "invalid_locale",
          "next": "Pass locale as two lower-case letters, or leave it out."
        },
        {
          "name": "method_not_found",
          "code": -32601,
          "kind": "rpc",
          "message": "Method not found.",
          "next": "Call initialize, tools/list, tools/call, resources/list or resources/read."
        },
        {
          "name": "invalid_params",
          "code": -32602,
          "kind": "rpc",
          "message": "Invalid params.",
          "next": "Read the message: it names the argument. Call tools/list for each tool's schema."
        },
        {
          "name": "resource_not_found",
          "code": -32002,
          "kind": "rpc",
          "message": "Resource not found.",
          "next": "Call resources/list for the resources this server has."
        },
        {
          "name": "site_unavailable",
          "code": -32000,
          "kind": "rpc",
          "message": "site_unavailable",
          "next": "Try again later."
        },
        {
          "name": "mcp_disabled",
          "code": -32000,
          "kind": "rpc",
          "message": "mcp_disabled",
          "next": "This site has its MCP server switched off. Send the person to the website."
        },
        {
          "name": "rate_limited_address",
          "code": -32000,
          "kind": "rpc",
          "message": "rate_limited",
          "next": "Wait for the Retry-After seconds, then call again."
        },
        {
          "name": "internal_error",
          "code": -32603,
          "kind": "rpc",
          "message": "site_unavailable",
          "next": "Try again later."
        }
      ],
      "examples": [
        {
          "name": "ping example",
          "params": [],
          "result": {
            "name": "result",
            "value": {}
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "ping"
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 1,
        "result": {}
      }
    },
    {
      "name": "search_yachts",
      "summary": "Search yachts",
      "description": "Find this site's yachts, read from the live inventory. Pass what the person wants as the typed filters, and from / to whenever they gave exact days. With dates it returns ONLY the yachts free for that stay, each with its stay: status, price, list price, discount and when the source was checked (checkedAt). Without dates each has its from-price. Every row carries its page link and one photo, absolute URLs on this site; send the person there. Narrow with the typed filters (each list is any of its values; every filter must hold); priceMin / priceMax count the mandatory extras a quote states. notApplied lists what could not narrow the search. When nothing matches exactly the answer is the nearest match, and nearest says what was widened (another week, the place around, a bound let go): tell the person. Paged: total and cursor. Works without a contact (browsing: fewer rows).",
      "x-mcp-method": "tools/call",
      "x-kind": "search",
      "paramStructure": "by-name",
      "params": [
        {
          "name": "from",
          "required": false,
          "description": "Check-in day, YYYY-MM-DD.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "to",
          "required": false,
          "description": "Check-out day, YYYY-MM-DD.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "party",
          "required": false,
          "description": "How many people.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "yacht_types",
          "required": false,
          "description": "Yacht Types: any of these value ids (one or more): catamarans (Catamarans, 3192); gulets (Gulets, 201); houseboats (Houseboats, 1428); motorboats (Motorboats, 1080); sailboats (Sailboats, 4577).",
          "schema": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "catamarans",
                "gulets",
                "houseboats",
                "motorboats",
                "sailboats"
              ]
            },
            "minItems": 1
          }
        },
        {
          "name": "charter_types",
          "required": false,
          "description": "Charter Types: any of these value ids (one or more): all-inclusive (All-inclusive, 68); bareboat (Bareboat, 8796); cabin-charter (Cabin charter, 152); crewed (Crewed, 1702); day-charter (Day charter, 374); flotilla (Flotilla, 257); regatta (Regatta, 34); skippered (Skippered, 245).",
          "schema": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "all-inclusive",
                "bareboat",
                "cabin-charter",
                "crewed",
                "day-charter",
                "flotilla",
                "regatta",
                "skippered"
              ]
            },
            "minItems": 1
          }
        },
        {
          "name": "place",
          "required": false,
          "description": "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, Spain, British Virgin Islands, Netherlands, Germany, Seychelles, Poland, Ireland, Martinique, United Kingdom, Belgium, Portugal, Ecuador, French Polynesia, Sweden, St. Martin, Bahamas, Malta, Montenegro, Thailand, Canada, St. Lucia, Slovenia, Norway, Guadeloupe, Brazil, Hungary, Grenada, St. Vincent, Belize, Cuba, Maldives, Mexico, Panama, Cape Verde, United Arab Emirates, Antigua and Barbuda, India, Tanzania, Egypt, Monaco, Estonia, Mauritius, New Zealand, USA, Switzerland, Fiji. An unknown place is refused; nothing there answers the nearest place around it.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "base",
          "required": false,
          "description": "The exact base it leaves from, in words.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "text",
          "required": false,
          "description": "Words in its name or model, e.g. a builder or a model name.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "lengthMin",
          "required": false,
          "description": "Length at least ft (on this site 13.35 to 180.45).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "lengthMax",
          "required": false,
          "description": "Length at most ft (on this site 13.35 to 180.45).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "cabinsMin",
          "required": false,
          "description": "Cabins at least (on this site 0 to 20).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "cabinsMax",
          "required": false,
          "description": "Cabins at most (on this site 0 to 20).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "berthsMin",
          "required": false,
          "description": "Berths at least (on this site 0 to 80).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "berthsMax",
          "required": false,
          "description": "Berths at most (on this site 0 to 80).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "headsMin",
          "required": false,
          "description": "Heads at least (on this site 0 to 23).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "headsMax",
          "required": false,
          "description": "Heads at most (on this site 0 to 23).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "beamMin",
          "required": false,
          "description": "Beam at least m (on this site 0.9 to 44).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "beamMax",
          "required": false,
          "description": "Beam at most m (on this site 0.9 to 44).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "draftMin",
          "required": false,
          "description": "Draft at least m (on this site 0.3 to 7985).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "draftMax",
          "required": false,
          "description": "Draft at most m (on this site 0.3 to 7985).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "yearMin",
          "required": false,
          "description": "Year at least (on this site 0 to 2028).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "yearMax",
          "required": false,
          "description": "Year at most (on this site 0 to 2028).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "fuelMin",
          "required": false,
          "description": "Fuel tank at least l (on this site 1 to 65000).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "fuelMax",
          "required": false,
          "description": "Fuel tank at most l (on this site 1 to 65000).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "waterMin",
          "required": false,
          "description": "Water tank at least l (on this site 1 to 60000).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "waterMax",
          "required": false,
          "description": "Water tank at most l (on this site 1 to 60000).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "priceMin",
          "required": false,
          "description": "The least to pay, in the site currency: the price plus the mandatory extras.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "priceMax",
          "required": false,
          "description": "The most to pay, in the site currency: the price plus the mandatory extras.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "discountOnly",
          "required": false,
          "description": "true: only those with a discount the source states.",
          "schema": {
            "type": "boolean"
          }
        },
        {
          "name": "sort",
          "required": false,
          "description": "price (default, cheapest first), discount (biggest first), or length (length, biggest first), cabins (cabins, biggest first), berths (berths, biggest first), heads (heads, biggest first), beam (beam, biggest first), draft (draft, biggest first), year (year, biggest first), fuel (fuel tank, biggest first), water (water tank, biggest first).",
          "schema": {
            "type": "string",
            "enum": [
              "price",
              "discount",
              "length",
              "cabins",
              "berths",
              "heads",
              "beam",
              "draft",
              "year",
              "fuel",
              "water"
            ]
          }
        },
        {
          "name": "cursor",
          "required": false,
          "description": "The cursor a previous answer returned, for its next page.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "limit",
          "required": false,
          "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "email",
          "required": false,
          "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "phone",
          "required": false,
          "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "session",
          "required": false,
          "description": "The session an earlier answer returned. Pass it instead of email or phone from then on.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "name",
          "required": false,
          "description": "Optional: the person's name, as they gave it.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        }
      ],
      "result": {
        "name": "structuredContent",
        "schema": {
          "type": "object",
          "properties": {
            "items": {
              "type": "array",
              "description": "One page of matches.",
              "items": {
                "type": "object",
                "description": "One item.",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Its name."
                  },
                  "href": {
                    "type": "string",
                    "description": "Its page on this site, absolute URL."
                  },
                  "image": {
                    "type": "object",
                    "description": "One photo, an absolute URL.",
                    "properties": {
                      "src": {
                        "type": "string",
                        "description": "https URL."
                      },
                      "alt": {
                        "type": "string",
                        "description": "What it shows."
                      }
                    }
                  },
                  "kind": {
                    "type": "string",
                    "description": "Its type, in the site's words."
                  },
                  "priceFrom": {
                    "type": "number",
                    "description": "The stay's price with dates, else its cheapest quoted stay, in major units."
                  },
                  "currency": {
                    "type": "string",
                    "description": "ISO 4217."
                  },
                  "mandatoryExtras": {
                    "type": "object",
                    "description": "Without dates: what its cheapest quote says is payable on top.",
                    "properties": {
                      "amount": {
                        "type": "number",
                        "description": "In major units (euros, not cents)."
                      },
                      "currency": {
                        "type": "string",
                        "description": "ISO 4217."
                      },
                      "text": {
                        "type": "string",
                        "description": "The amount written out, to quote to the person."
                      }
                    }
                  },
                  "stay": {
                    "type": "object",
                    "description": "With dates: that stay, read live.",
                    "properties": {
                      "checkIn": {
                        "type": "string",
                        "description": "YYYY-MM-DD."
                      },
                      "checkOut": {
                        "type": "string",
                        "description": "YYYY-MM-DD."
                      },
                      "nights": {
                        "type": "number",
                        "description": "Nights."
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "free",
                          "booked",
                          "not-a-check-in-day",
                          "not-whole-blocks",
                          "outside-calendar",
                          "not-known"
                        ],
                        "description": "Whether it can be booked."
                      },
                      "price": {
                        "type": "object",
                        "description": "The stay's price.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "listPrice": {
                        "type": "object",
                        "description": "The source's list price above price, when discounted.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "discountPct": {
                        "type": "number",
                        "description": "The discount the source states."
                      },
                      "mandatoryExtras": {
                        "type": "object",
                        "description": "What the source says is payable on top, whatever the person picks.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "deposit": {
                        "type": "object",
                        "description": "The deposit held.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "checkedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "When the source was read, ISO time."
                      }
                    }
                  }
                }
              }
            },
            "total": {
              "type": "number",
              "description": "How many rows match in all."
            },
            "cursor": {
              "type": [
                "string",
                "null"
              ],
              "description": "Pass as cursor for the next page; null on the last."
            },
            "checked": {
              "type": "boolean",
              "description": "true: dates were given, so every row is free for them."
            },
            "checkedAt": {
              "type": [
                "string",
                "null"
              ],
              "description": "When the source was read, ISO time."
            },
            "notApplied": {
              "type": "array",
              "items": {
                "type": "string",
                "description": "A wish."
              },
              "description": "What the person asked for that could not narrow the search."
            },
            "unchecked": {
              "type": "array",
              "items": {
                "type": "string",
                "description": "dates or party."
              },
              "description": "What was said but could not be checked."
            },
            "leftOutUnpriced": {
              "type": "number",
              "description": "Matches left out under priceMin / priceMax because no price is known."
            },
            "nearest": {
              "type": "object",
              "description": "Only when nothing matched exactly: these rows are the nearest match.",
              "properties": {
                "widened": {
                  "type": "string",
                  "enum": [
                    "dates",
                    "base",
                    "place",
                    "ranges",
                    "price",
                    "discount"
                  ],
                  "description": "The one thing let go."
                },
                "note": {
                  "type": "string",
                  "description": "What moved, in words to tell the person."
                }
              }
            },
            "browsing": {
              "type": "boolean",
              "description": "true: answered without a contact, so fewer rows and the first pages only."
            },
            "next": {
              "type": "string",
              "description": "When browsing: how to get a quote or more rows."
            },
            "session": {
              "type": "string",
              "description": "Only on the call that created the contact: pass it from then on."
            },
            "sessionExpiresAt": {
              "type": "string",
              "description": "When that session stops working, ISO time."
            }
          },
          "required": [
            "items",
            "total"
          ]
        }
      },
      "errors": [
        {
          "name": "invalid_email",
          "code": "invalid_email",
          "kind": "tool",
          "message": "That email address does not look right; ask the person for it again.",
          "next": "Ask the person to give their email again."
        },
        {
          "name": "invalid_phone",
          "code": "invalid_phone",
          "kind": "tool",
          "message": "Give the phone number in international form, a plus and the country code first, e.g. +31612345678.",
          "next": "Ask the person for the number with its country code."
        },
        {
          "name": "contact_revoked",
          "code": "contact_revoked",
          "kind": "tool",
          "message": "The owner of this contact said they did not ask for this. Use a different contact.",
          "next": "Ask the person for a different email or phone."
        },
        {
          "name": "rate_limited",
          "code": "rate_limited",
          "kind": "tool",
          "message": "Too many calls for this person or address this hour.",
          "next": "Wait retryAfterSeconds, then call again."
        },
        {
          "name": "browse_limited",
          "code": "browse_limited",
          "kind": "tool",
          "message": "This address has browsed as much as this site answers without a contact for now.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "browse_busy",
          "code": "browse_busy",
          "kind": "tool",
          "message": "This site has answered as many browse calls today as it answers without a contact.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "browse_page_limit",
          "code": "browse_page_limit",
          "kind": "tool",
          "message": "Browsing without a contact shows the first pages only.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "read_refused",
          "code": "read_refused",
          "kind": "tool",
          "message": "The read could not answer these arguments.",
          "next": "Read the message: it says what to change (a date format, a place name, which of several items)."
        }
      ],
      "examples": [
        {
          "name": "search_yachts example",
          "params": [
            {
              "name": "from",
              "value": "2026-12-01"
            },
            {
              "name": "to",
              "value": "2026-12-08"
            },
            {
              "name": "party",
              "value": 4
            },
            {
              "name": "limit",
              "value": 2
            }
          ],
          "result": {
            "name": "structuredContent",
            "value": {
              "items": [
                {
                  "name": "string",
                  "href": "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731",
                  "image": {
                    "src": "string",
                    "alt": "string"
                  },
                  "kind": "string",
                  "priceFrom": 0,
                  "currency": "string",
                  "mandatoryExtras": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "stay": {
                    "checkIn": "2026-12-01",
                    "checkOut": "2026-12-08",
                    "nights": 0,
                    "status": "free",
                    "price": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "listPrice": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "discountPct": 0,
                    "mandatoryExtras": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "deposit": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "checkedAt": "2026-11-01T06:00:00Z"
                  }
                }
              ],
              "total": 0,
              "cursor": "string",
              "checked": true,
              "checkedAt": "2026-11-01T06:00:00Z",
              "notApplied": [
                "string"
              ],
              "unchecked": [
                "string"
              ],
              "leftOutUnpriced": 0,
              "nearest": {
                "widened": "dates",
                "note": "string"
              },
              "browsing": true,
              "next": "string",
              "session": "string",
              "sessionExpiresAt": "2026-12-01T06:00:00Z"
            }
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
          "name": "search_yachts",
          "arguments": {
            "from": "2026-12-01",
            "to": "2026-12-08",
            "party": 4,
            "limit": 2
          }
        }
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 1,
        "result": {
          "content": [
            {
              "type": "text",
              "text": "{\"items\":[{\"name\":\"string\",\"href\":\"https://thecharterdesk.com/yachts/2-drunk-6358727140000106731\",\"image\":{\"src\":\"string\",\"alt\":\"string\"},\"kind\":\"string\",\"priceFrom\":0,\"currency\":\"string\",\"mandatoryExtras\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"stay\":{\"checkIn\":\"2026-12-01\",\"checkOut\":\"2026-12-08\",\"nights\":0,\"status\":\"free\",\"price\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"listPrice\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"discountPct\":0,\"mandatoryExtras\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"deposit\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"checkedAt\":\"2026-11-01T06:00:00Z\"}}],\"total\":0,\"cursor\":\"string\",\"checked\":true,\"checkedAt\":\"2026-11-01T06:00:00Z\",\"notApplied\":[\"string\"],\"unchecked\":[\"string\"],\"leftOutUnpriced\":0,\"nearest\":{\"widened\":\"dates\",\"note\":\"string\"},\"browsing\":true,\"next\":\"string\",\"session\":\"string\",\"sessionExpiresAt\":\"2026-12-01T06:00:00Z\"}"
            }
          ],
          "structuredContent": {
            "items": [
              {
                "name": "string",
                "href": "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731",
                "image": {
                  "src": "string",
                  "alt": "string"
                },
                "kind": "string",
                "priceFrom": 0,
                "currency": "string",
                "mandatoryExtras": {
                  "amount": 0,
                  "currency": "string",
                  "text": "string"
                },
                "stay": {
                  "checkIn": "2026-12-01",
                  "checkOut": "2026-12-08",
                  "nights": 0,
                  "status": "free",
                  "price": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "listPrice": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "discountPct": 0,
                  "mandatoryExtras": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "deposit": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "checkedAt": "2026-11-01T06:00:00Z"
                }
              }
            ],
            "total": 0,
            "cursor": "string",
            "checked": true,
            "checkedAt": "2026-11-01T06:00:00Z",
            "notApplied": [
              "string"
            ],
            "unchecked": [
              "string"
            ],
            "leftOutUnpriced": 0,
            "nearest": {
              "widened": "dates",
              "note": "string"
            },
            "browsing": true,
            "next": "string",
            "session": "string",
            "sessionExpiresAt": "2026-12-01T06:00:00Z"
          },
          "isError": false
        }
      }
    },
    {
      "name": "get_yacht",
      "summary": "Get one yacht",
      "description": "One yacht: its 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 that is absent is one the source does not state. Works without a contact.",
      "x-mcp-method": "tools/call",
      "x-kind": "get",
      "paramStructure": "by-name",
      "params": [
        {
          "name": "id",
          "required": true,
          "description": "The yacht's page link (an absolute URL on this site), exactly as a search or best_deals returned it.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "from",
          "required": false,
          "description": "Check-in day, YYYY-MM-DD.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "to",
          "required": false,
          "description": "Check-out day, YYYY-MM-DD.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "party",
          "required": false,
          "description": "How many people.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "cursor",
          "required": false,
          "description": "The cursor a previous answer returned, for its next page.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "limit",
          "required": false,
          "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "email",
          "required": false,
          "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "phone",
          "required": false,
          "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "session",
          "required": false,
          "description": "The session an earlier answer returned. Pass it instead of email or phone from then on.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "name",
          "required": false,
          "description": "Optional: the person's name, as they gave it.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        }
      ],
      "result": {
        "name": "structuredContent",
        "schema": {
          "type": "object",
          "properties": {
            "item": {
              "type": "string",
              "description": "Its name."
            },
            "href": {
              "type": "string",
              "description": "Its page on this site, absolute URL."
            },
            "facts": {
              "type": "array",
              "description": "The facts its page shows, labelled.",
              "items": {
                "type": "object",
                "description": "One fact.",
                "properties": {}
              }
            },
            "kind": {
              "type": "string",
              "description": "Its type."
            },
            "place": {
              "type": "string",
              "description": "Where it is."
            },
            "description": {
              "type": "string",
              "description": "Its description."
            },
            "packages": {
              "type": "array",
              "description": "The ways it is sold, the default first, each with its included, required and optional extras.",
              "items": {
                "type": "object",
                "description": "One package.",
                "properties": {
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Its name."
                  },
                  "default": {
                    "type": "boolean",
                    "description": "Sold this way unless asked."
                  },
                  "staffed": {
                    "type": "boolean",
                    "description": "Sold with staff as standard."
                  },
                  "included": {
                    "type": "array",
                    "description": "Included, nothing to pay.",
                    "items": {
                      "type": "object",
                      "description": "An extra.",
                      "properties": {}
                    }
                  },
                  "required": {
                    "type": "array",
                    "description": "Must be paid.",
                    "items": {
                      "type": "object",
                      "description": "An extra.",
                      "properties": {}
                    }
                  },
                  "optional": {
                    "type": "array",
                    "description": "The person's choice.",
                    "items": {
                      "type": "object",
                      "description": "An extra.",
                      "properties": {}
                    }
                  }
                }
              }
            },
            "terms": {
              "type": "object",
              "description": "Deposit, licence, stay limits, check-in days and times, as stated.",
              "properties": {}
            },
            "equipment": {
              "type": "array",
              "description": "Named equipment in groups.",
              "items": {
                "type": "object",
                "description": "A group.",
                "properties": {}
              }
            },
            "operatorDescriptions": {
              "type": "array",
              "description": "The operator's own texts and documents.",
              "items": {
                "type": "object",
                "description": "One.",
                "properties": {}
              }
            },
            "availability": {
              "type": "object",
              "description": "With dates: that stay and, when not free, the nearest free stays; without: its free stays, soonest first.",
              "properties": {
                "card": {
                  "type": "object",
                  "description": "Its card: name, link, photos (get keeps the gallery).",
                  "properties": {}
                },
                "stay": {
                  "type": "object",
                  "description": "One stay of this item, read live.",
                  "properties": {
                    "checkIn": {
                      "type": "string",
                      "description": "YYYY-MM-DD."
                    },
                    "checkOut": {
                      "type": "string",
                      "description": "YYYY-MM-DD."
                    },
                    "nights": {
                      "type": "number",
                      "description": "Nights."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "free",
                        "booked",
                        "not-a-check-in-day",
                        "not-whole-blocks",
                        "outside-calendar",
                        "not-known"
                      ],
                      "description": "Whether it can be booked."
                    },
                    "price": {
                      "type": "object",
                      "description": "The stay's price.",
                      "properties": {
                        "amount": {
                          "type": "number",
                          "description": "In major units (euros, not cents)."
                        },
                        "currency": {
                          "type": "string",
                          "description": "ISO 4217."
                        },
                        "text": {
                          "type": "string",
                          "description": "The amount written out, to quote to the person."
                        }
                      }
                    },
                    "listPrice": {
                      "type": "object",
                      "description": "The source's list price above price, when discounted.",
                      "properties": {
                        "amount": {
                          "type": "number",
                          "description": "In major units (euros, not cents)."
                        },
                        "currency": {
                          "type": "string",
                          "description": "ISO 4217."
                        },
                        "text": {
                          "type": "string",
                          "description": "The amount written out, to quote to the person."
                        }
                      }
                    },
                    "discountPct": {
                      "type": "number",
                      "description": "The discount the source states."
                    },
                    "mandatoryExtras": {
                      "type": "object",
                      "description": "What the source says is payable on top, whatever the person picks.",
                      "properties": {
                        "amount": {
                          "type": "number",
                          "description": "In major units (euros, not cents)."
                        },
                        "currency": {
                          "type": "string",
                          "description": "ISO 4217."
                        },
                        "text": {
                          "type": "string",
                          "description": "The amount written out, to quote to the person."
                        }
                      }
                    },
                    "deposit": {
                      "type": "object",
                      "description": "The deposit held.",
                      "properties": {
                        "amount": {
                          "type": "number",
                          "description": "In major units (euros, not cents)."
                        },
                        "currency": {
                          "type": "string",
                          "description": "ISO 4217."
                        },
                        "text": {
                          "type": "string",
                          "description": "The amount written out, to quote to the person."
                        }
                      }
                    },
                    "checkedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "When the source was read, ISO time."
                    }
                  }
                },
                "freeStays": {
                  "type": "array",
                  "description": "Free stays, a page.",
                  "items": {
                    "type": "object",
                    "description": "One stay of this item, read live.",
                    "properties": {
                      "checkIn": {
                        "type": "string",
                        "description": "YYYY-MM-DD."
                      },
                      "checkOut": {
                        "type": "string",
                        "description": "YYYY-MM-DD."
                      },
                      "nights": {
                        "type": "number",
                        "description": "Nights."
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "free",
                          "booked",
                          "not-a-check-in-day",
                          "not-whole-blocks",
                          "outside-calendar",
                          "not-known"
                        ],
                        "description": "Whether it can be booked."
                      },
                      "price": {
                        "type": "object",
                        "description": "The stay's price.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "listPrice": {
                        "type": "object",
                        "description": "The source's list price above price, when discounted.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "discountPct": {
                        "type": "number",
                        "description": "The discount the source states."
                      },
                      "mandatoryExtras": {
                        "type": "object",
                        "description": "What the source says is payable on top, whatever the person picks.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "deposit": {
                        "type": "object",
                        "description": "The deposit held.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "checkedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "When the source was read, ISO time."
                      }
                    }
                  }
                },
                "nearestFree": {
                  "type": "array",
                  "description": "The nearest free stays, a page.",
                  "items": {
                    "type": "object",
                    "description": "One stay of this item, read live.",
                    "properties": {
                      "checkIn": {
                        "type": "string",
                        "description": "YYYY-MM-DD."
                      },
                      "checkOut": {
                        "type": "string",
                        "description": "YYYY-MM-DD."
                      },
                      "nights": {
                        "type": "number",
                        "description": "Nights."
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "free",
                          "booked",
                          "not-a-check-in-day",
                          "not-whole-blocks",
                          "outside-calendar",
                          "not-known"
                        ],
                        "description": "Whether it can be booked."
                      },
                      "price": {
                        "type": "object",
                        "description": "The stay's price.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "listPrice": {
                        "type": "object",
                        "description": "The source's list price above price, when discounted.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "discountPct": {
                        "type": "number",
                        "description": "The discount the source states."
                      },
                      "mandatoryExtras": {
                        "type": "object",
                        "description": "What the source says is payable on top, whatever the person picks.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "deposit": {
                        "type": "object",
                        "description": "The deposit held.",
                        "properties": {
                          "amount": {
                            "type": "number",
                            "description": "In major units (euros, not cents)."
                          },
                          "currency": {
                            "type": "string",
                            "description": "ISO 4217."
                          },
                          "text": {
                            "type": "string",
                            "description": "The amount written out, to quote to the person."
                          }
                        }
                      },
                      "checkedAt": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "When the source was read, ISO time."
                      }
                    }
                  }
                },
                "party": {
                  "type": "string",
                  "enum": [
                    "fits",
                    "too-many",
                    "not-checked"
                  ],
                  "description": "Whether the party fits."
                },
                "total": {
                  "type": "number",
                  "description": "How many rows match in all."
                },
                "cursor": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Pass as cursor for the next page; null on the last."
                }
              }
            },
            "checkedAt": {
              "type": [
                "string",
                "null"
              ],
              "description": "When the source was read, ISO time."
            },
            "browsing": {
              "type": "boolean",
              "description": "true: answered without a contact, so fewer rows and the first pages only."
            },
            "next": {
              "type": "string",
              "description": "When browsing: how to get a quote or more rows."
            },
            "session": {
              "type": "string",
              "description": "Only on the call that created the contact: pass it from then on."
            },
            "sessionExpiresAt": {
              "type": "string",
              "description": "When that session stops working, ISO time."
            }
          },
          "required": [
            "item",
            "href"
          ]
        }
      },
      "errors": [
        {
          "name": "invalid_email",
          "code": "invalid_email",
          "kind": "tool",
          "message": "That email address does not look right; ask the person for it again.",
          "next": "Ask the person to give their email again."
        },
        {
          "name": "invalid_phone",
          "code": "invalid_phone",
          "kind": "tool",
          "message": "Give the phone number in international form, a plus and the country code first, e.g. +31612345678.",
          "next": "Ask the person for the number with its country code."
        },
        {
          "name": "contact_revoked",
          "code": "contact_revoked",
          "kind": "tool",
          "message": "The owner of this contact said they did not ask for this. Use a different contact.",
          "next": "Ask the person for a different email or phone."
        },
        {
          "name": "rate_limited",
          "code": "rate_limited",
          "kind": "tool",
          "message": "Too many calls for this person or address this hour.",
          "next": "Wait retryAfterSeconds, then call again."
        },
        {
          "name": "browse_limited",
          "code": "browse_limited",
          "kind": "tool",
          "message": "This address has browsed as much as this site answers without a contact for now.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "browse_busy",
          "code": "browse_busy",
          "kind": "tool",
          "message": "This site has answered as many browse calls today as it answers without a contact.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "browse_page_limit",
          "code": "browse_page_limit",
          "kind": "tool",
          "message": "Browsing without a contact shows the first pages only.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "unknown_item",
          "code": "unknown_item",
          "kind": "tool",
          "message": "That is not an item on this site.",
          "next": "Pass the item's page link (an absolute URL on this site) exactly as a search, best_deals or get returned it."
        },
        {
          "name": "read_refused",
          "code": "read_refused",
          "kind": "tool",
          "message": "The read could not answer these arguments.",
          "next": "Read the message: it says what to change (a date format, a place name, which of several items)."
        }
      ],
      "examples": [
        {
          "name": "get_yacht example",
          "params": [
            {
              "name": "id",
              "value": "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731"
            },
            {
              "name": "from",
              "value": "2026-12-01"
            },
            {
              "name": "to",
              "value": "2026-12-08"
            }
          ],
          "result": {
            "name": "structuredContent",
            "value": {
              "item": "string",
              "href": "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731",
              "facts": [
                {}
              ],
              "kind": "string",
              "place": "string",
              "description": "string",
              "packages": [
                {
                  "name": "string",
                  "default": true,
                  "staffed": true,
                  "included": [
                    {}
                  ],
                  "required": [
                    {}
                  ],
                  "optional": [
                    {}
                  ]
                }
              ],
              "terms": {},
              "equipment": [
                {}
              ],
              "operatorDescriptions": [
                {}
              ],
              "availability": {
                "card": {},
                "stay": {
                  "checkIn": "2026-12-01",
                  "checkOut": "2026-12-08",
                  "nights": 0,
                  "status": "free",
                  "price": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "listPrice": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "discountPct": 0,
                  "mandatoryExtras": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "deposit": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "checkedAt": "2026-11-01T06:00:00Z"
                },
                "freeStays": [
                  {
                    "checkIn": "2026-12-01",
                    "checkOut": "2026-12-08",
                    "nights": 0,
                    "status": "free",
                    "price": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "listPrice": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "discountPct": 0,
                    "mandatoryExtras": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "deposit": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "checkedAt": "2026-11-01T06:00:00Z"
                  }
                ],
                "nearestFree": [
                  {
                    "checkIn": "2026-12-01",
                    "checkOut": "2026-12-08",
                    "nights": 0,
                    "status": "free",
                    "price": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "listPrice": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "discountPct": 0,
                    "mandatoryExtras": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "deposit": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "checkedAt": "2026-11-01T06:00:00Z"
                  }
                ],
                "party": "fits",
                "total": 0,
                "cursor": "string"
              },
              "checkedAt": "2026-11-01T06:00:00Z",
              "browsing": true,
              "next": "string",
              "session": "string",
              "sessionExpiresAt": "2026-12-01T06:00:00Z"
            }
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 2,
        "method": "tools/call",
        "params": {
          "name": "get_yacht",
          "arguments": {
            "id": "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731",
            "from": "2026-12-01",
            "to": "2026-12-08"
          }
        }
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 2,
        "result": {
          "content": [
            {
              "type": "text",
              "text": "{\"item\":\"string\",\"href\":\"https://thecharterdesk.com/yachts/2-drunk-6358727140000106731\",\"facts\":[{}],\"kind\":\"string\",\"place\":\"string\",\"description\":\"string\",\"packages\":[{\"name\":\"string\",\"default\":true,\"staffed\":true,\"included\":[{}],\"required\":[{}],\"optional\":[{}]}],\"terms\":{},\"equipment\":[{}],\"operatorDescriptions\":[{}],\"availability\":{\"card\":{},\"stay\":{\"checkIn\":\"2026-12-01\",\"checkOut\":\"2026-12-08\",\"nights\":0,\"status\":\"free\",\"price\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"listPrice\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"discountPct\":0,\"mandatoryExtras\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"deposit\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"checkedAt\":\"2026-11-01T06:00:00Z\"},\"freeStays\":[{\"checkIn\":\"2026-12-01\",\"checkOut\":\"2026-12-08\",\"nights\":0,\"status\":\"free\",\"price\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"listPrice\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"discountPct\":0,\"mandatoryExtras\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"deposit\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"checkedAt\":\"2026-11-01T06:00:00Z\"}],\"nearestFree\":[{\"checkIn\":\"2026-12-01\",\"checkOut\":\"2026-12-08\",\"nights\":0,\"status\":\"free\",\"price\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"listPrice\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"discountPct\":0,\"mandatoryExtras\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"deposit\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"checkedAt\":\"2026-11-01T06:00:00Z\"}],\"party\":\"fits\",\"total\":0,\"cursor\":\"string\"},\"checkedAt\":\"2026-11-01T06:00:00Z\",\"browsing\":true,\"next\":\"string\",\"session\":\"string\",\"sessionExpiresAt\":\"2026-12-01T06:00:00Z\"}"
            }
          ],
          "structuredContent": {
            "item": "string",
            "href": "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731",
            "facts": [
              {}
            ],
            "kind": "string",
            "place": "string",
            "description": "string",
            "packages": [
              {
                "name": "string",
                "default": true,
                "staffed": true,
                "included": [
                  {}
                ],
                "required": [
                  {}
                ],
                "optional": [
                  {}
                ]
              }
            ],
            "terms": {},
            "equipment": [
              {}
            ],
            "operatorDescriptions": [
              {}
            ],
            "availability": {
              "card": {},
              "stay": {
                "checkIn": "2026-12-01",
                "checkOut": "2026-12-08",
                "nights": 0,
                "status": "free",
                "price": {
                  "amount": 0,
                  "currency": "string",
                  "text": "string"
                },
                "listPrice": {
                  "amount": 0,
                  "currency": "string",
                  "text": "string"
                },
                "discountPct": 0,
                "mandatoryExtras": {
                  "amount": 0,
                  "currency": "string",
                  "text": "string"
                },
                "deposit": {
                  "amount": 0,
                  "currency": "string",
                  "text": "string"
                },
                "checkedAt": "2026-11-01T06:00:00Z"
              },
              "freeStays": [
                {
                  "checkIn": "2026-12-01",
                  "checkOut": "2026-12-08",
                  "nights": 0,
                  "status": "free",
                  "price": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "listPrice": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "discountPct": 0,
                  "mandatoryExtras": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "deposit": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "checkedAt": "2026-11-01T06:00:00Z"
                }
              ],
              "nearestFree": [
                {
                  "checkIn": "2026-12-01",
                  "checkOut": "2026-12-08",
                  "nights": 0,
                  "status": "free",
                  "price": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "listPrice": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "discountPct": 0,
                  "mandatoryExtras": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "deposit": {
                    "amount": 0,
                    "currency": "string",
                    "text": "string"
                  },
                  "checkedAt": "2026-11-01T06:00:00Z"
                }
              ],
              "party": "fits",
              "total": 0,
              "cursor": "string"
            },
            "checkedAt": "2026-11-01T06:00:00Z",
            "browsing": true,
            "next": "string",
            "session": "string",
            "sessionExpiresAt": "2026-12-01T06:00:00Z"
          },
          "isError": false
        }
      }
    },
    {
      "name": "price_range",
      "summary": "Price range",
      "description": "What a stay typically costs: the range (p25, median, p75 in minor units of the currency) of open departures for a place, month and party, optionally one type, with 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. Works without a contact.",
      "x-mcp-method": "tools/call",
      "x-kind": "price_range",
      "paramStructure": "by-name",
      "params": [
        {
          "name": "place",
          "required": true,
          "description": "A country or region in words (e.g. Croatia), or a place value as the places list names it.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "month",
          "required": true,
          "description": "YYYY-MM.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "party",
          "required": true,
          "description": "How many people.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "type",
          "required": false,
          "description": "Optional: one type, as the types list names it.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "email",
          "required": false,
          "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "phone",
          "required": false,
          "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "session",
          "required": false,
          "description": "The session an earlier answer returned. Pass it instead of email or phone from then on.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "name",
          "required": false,
          "description": "Optional: the person's name, as they gave it.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        }
      ],
      "result": {
        "name": "structuredContent",
        "schema": {
          "type": "object",
          "properties": {
            "place": {
              "type": "string",
              "description": "The place value answered (a place given in words, resolved)."
            },
            "currency": {
              "type": "string",
              "description": "ISO 4217."
            },
            "items": {
              "type": "number",
              "description": "How many items the figures are from."
            },
            "range": {
              "type": [
                "object",
                "null"
              ],
              "description": "p25, p50 (median), p75 in MINOR units; null when too few items.",
              "properties": {
                "p25": {
                  "type": "number",
                  "description": "Minor units."
                },
                "p50": {
                  "type": "number",
                  "description": "Minor units."
                },
                "p75": {
                  "type": "number",
                  "description": "Minor units."
                }
              }
            },
            "thin": {
              "type": "boolean",
              "description": "true: few items, a rough figure."
            },
            "cheapest": {
              "type": [
                "object",
                "null"
              ],
              "description": "The cheapest published item that fits.",
              "properties": {
                "href": {
                  "type": "string",
                  "description": "Its page, absolute URL."
                },
                "name": {
                  "type": "string",
                  "description": "Its name."
                },
                "place": {
                  "type": "string",
                  "description": "Where it leaves from."
                },
                "priceMinor": {
                  "type": "number",
                  "description": "Minor units."
                }
              }
            },
            "extrasMedianMinor": {
              "type": [
                "number",
                "null"
              ],
              "description": "The usual mandatory extras, minor units."
            },
            "seasonHint": {
              "type": [
                "object",
                "null"
              ],
              "description": "Another month against this one: pct cheaper there (negative: dearer).",
              "properties": {
                "month": {
                  "type": "string",
                  "description": "YYYY-MM."
                },
                "pct": {
                  "type": "number",
                  "description": "Percent."
                }
              }
            },
            "seasonNote": {
              "type": "string",
              "description": "The season hint in words, to tell the person."
            },
            "lastMinuteSharePct": {
              "type": [
                "number",
                "null"
              ],
              "description": "Share of soon departures discounted."
            },
            "noneFitParty": {
              "type": "boolean",
              "description": "true: no item there takes the party."
            },
            "browsing": {
              "type": "boolean",
              "description": "true: answered without a contact, so fewer rows and the first pages only."
            },
            "next": {
              "type": "string",
              "description": "When browsing: how to get a quote or more rows."
            },
            "session": {
              "type": "string",
              "description": "Only on the call that created the contact: pass it from then on."
            },
            "sessionExpiresAt": {
              "type": "string",
              "description": "When that session stops working, ISO time."
            }
          },
          "required": [
            "currency",
            "items"
          ]
        }
      },
      "errors": [
        {
          "name": "invalid_email",
          "code": "invalid_email",
          "kind": "tool",
          "message": "That email address does not look right; ask the person for it again.",
          "next": "Ask the person to give their email again."
        },
        {
          "name": "invalid_phone",
          "code": "invalid_phone",
          "kind": "tool",
          "message": "Give the phone number in international form, a plus and the country code first, e.g. +31612345678.",
          "next": "Ask the person for the number with its country code."
        },
        {
          "name": "contact_revoked",
          "code": "contact_revoked",
          "kind": "tool",
          "message": "The owner of this contact said they did not ask for this. Use a different contact.",
          "next": "Ask the person for a different email or phone."
        },
        {
          "name": "rate_limited",
          "code": "rate_limited",
          "kind": "tool",
          "message": "Too many calls for this person or address this hour.",
          "next": "Wait retryAfterSeconds, then call again."
        },
        {
          "name": "browse_limited",
          "code": "browse_limited",
          "kind": "tool",
          "message": "This address has browsed as much as this site answers without a contact for now.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "browse_busy",
          "code": "browse_busy",
          "kind": "tool",
          "message": "This site has answered as many browse calls today as it answers without a contact.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "invalid_party",
          "code": "invalid_party",
          "kind": "tool",
          "message": "party is how many people, at least 1.",
          "next": "Pass party as a whole number of people."
        },
        {
          "name": "price_index_not_configured",
          "code": "price_index_not_configured",
          "kind": "tool",
          "message": "This site has no price figures.",
          "next": "Use search or best_deals for prices instead."
        },
        {
          "name": "invalid_place",
          "code": "invalid_place",
          "kind": "tool",
          "message": "Choose a place from the list.",
          "next": "Pass one of the names under places, or a country or region in words."
        },
        {
          "name": "unknown_place",
          "code": "unknown_place",
          "kind": "tool",
          "message": "There are no prices for that place.",
          "next": "Pass one of the names under places."
        },
        {
          "name": "invalid_month",
          "code": "invalid_month",
          "kind": "tool",
          "message": "Choose a month as YYYY-MM.",
          "next": "Pass month as YYYY-MM."
        },
        {
          "name": "invalid_type",
          "code": "invalid_type",
          "kind": "tool",
          "message": "Choose a type from the list, or leave it out for any.",
          "next": "Leave type out, or pass a type the site names."
        },
        {
          "name": "duplicate_parameter",
          "code": "duplicate_parameter",
          "kind": "tool",
          "message": "Only one value per parameter is supported.",
          "next": "Pass each argument once."
        },
        {
          "name": "no_prices_for_month",
          "code": "no_prices_for_month",
          "kind": "tool",
          "message": "There are no prices for that month yet.",
          "next": "Pass a month from the first one the message names."
        },
        {
          "name": "no_prices_for_type",
          "code": "no_prices_for_type",
          "kind": "tool",
          "message": "There are no prices for that type there that month.",
          "next": "Leave type out, or try another month."
        }
      ],
      "examples": [
        {
          "name": "price_range example",
          "params": [
            {
              "name": "place",
              "value": "country:antigua-and-barbuda"
            },
            {
              "name": "month",
              "value": "2026-12"
            },
            {
              "name": "party",
              "value": 4
            }
          ],
          "result": {
            "name": "structuredContent",
            "value": {
              "place": "string",
              "currency": "string",
              "items": 0,
              "range": {
                "p25": 0,
                "p50": 0,
                "p75": 0
              },
              "thin": true,
              "cheapest": {
                "href": "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731",
                "name": "string",
                "place": "string",
                "priceMinor": 0
              },
              "extrasMedianMinor": 0,
              "seasonHint": {
                "month": "string",
                "pct": 0
              },
              "seasonNote": "string",
              "lastMinuteSharePct": 0,
              "noneFitParty": true,
              "browsing": true,
              "next": "string",
              "session": "string",
              "sessionExpiresAt": "2026-12-01T06:00:00Z"
            }
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 3,
        "method": "tools/call",
        "params": {
          "name": "price_range",
          "arguments": {
            "place": "country:antigua-and-barbuda",
            "month": "2026-12",
            "party": 4
          }
        }
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 3,
        "result": {
          "content": [
            {
              "type": "text",
              "text": "{\"place\":\"string\",\"currency\":\"string\",\"items\":0,\"range\":{\"p25\":0,\"p50\":0,\"p75\":0},\"thin\":true,\"cheapest\":{\"href\":\"https://thecharterdesk.com/yachts/2-drunk-6358727140000106731\",\"name\":\"string\",\"place\":\"string\",\"priceMinor\":0},\"extrasMedianMinor\":0,\"seasonHint\":{\"month\":\"string\",\"pct\":0},\"seasonNote\":\"string\",\"lastMinuteSharePct\":0,\"noneFitParty\":true,\"browsing\":true,\"next\":\"string\",\"session\":\"string\",\"sessionExpiresAt\":\"2026-12-01T06:00:00Z\"}"
            }
          ],
          "structuredContent": {
            "place": "string",
            "currency": "string",
            "items": 0,
            "range": {
              "p25": 0,
              "p50": 0,
              "p75": 0
            },
            "thin": true,
            "cheapest": {
              "href": "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731",
              "name": "string",
              "place": "string",
              "priceMinor": 0
            },
            "extrasMedianMinor": 0,
            "seasonHint": {
              "month": "string",
              "pct": 0
            },
            "seasonNote": "string",
            "lastMinuteSharePct": 0,
            "noneFitParty": true,
            "browsing": true,
            "next": "string",
            "session": "string",
            "sessionExpiresAt": "2026-12-01T06:00:00Z"
          },
          "isError": false
        }
      }
    },
    {
      "name": "best_deals",
      "summary": "Best deals",
      "description": "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; a departure the yacht's calendar shows taken is left out. One row per yacht: its page link (the id get and request_quote take) and photo (absolute URLs) 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. When none match, the answer is the nearest deals (the window after, the place around, a bound let go) and nearest says what was widened. Paged: total and cursor. Works without a contact (browsing: fewer rows).",
      "x-mcp-method": "tools/call",
      "x-kind": "best_deals",
      "paramStructure": "by-name",
      "params": [
        {
          "name": "from",
          "required": false,
          "description": "Earliest departure, YYYY-MM-DD.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "to",
          "required": false,
          "description": "Latest departure, YYYY-MM-DD.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "party",
          "required": false,
          "description": "How many people.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "yacht_types",
          "required": false,
          "description": "Yacht Types: any of these value ids (one or more): catamarans (Catamarans, 3192); gulets (Gulets, 201); houseboats (Houseboats, 1428); motorboats (Motorboats, 1080); sailboats (Sailboats, 4577).",
          "schema": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "catamarans",
                "gulets",
                "houseboats",
                "motorboats",
                "sailboats"
              ]
            },
            "minItems": 1
          }
        },
        {
          "name": "charter_types",
          "required": false,
          "description": "Charter Types: any of these value ids (one or more): all-inclusive (All-inclusive, 68); bareboat (Bareboat, 8796); cabin-charter (Cabin charter, 152); crewed (Crewed, 1702); day-charter (Day charter, 374); flotilla (Flotilla, 257); regatta (Regatta, 34); skippered (Skippered, 245).",
          "schema": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "all-inclusive",
                "bareboat",
                "cabin-charter",
                "crewed",
                "day-charter",
                "flotilla",
                "regatta",
                "skippered"
              ]
            },
            "minItems": 1
          }
        },
        {
          "name": "place",
          "required": false,
          "description": "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, Spain, British Virgin Islands, Netherlands, Germany, Seychelles, Poland, Ireland, Martinique, United Kingdom, Belgium, Portugal, Ecuador, French Polynesia, Sweden, St. Martin, Bahamas, Malta, Montenegro, Thailand, Canada, St. Lucia, Slovenia, Norway, Guadeloupe, Brazil, Hungary, Grenada, St. Vincent, Belize, Cuba, Maldives, Mexico, Panama, Cape Verde, United Arab Emirates, Antigua and Barbuda, India, Tanzania, Egypt, Monaco, Estonia, Mauritius, New Zealand, USA, Switzerland, Fiji. An unknown place is refused; nothing there answers the nearest place around it.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "base",
          "required": false,
          "description": "The exact base it leaves from, in words.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "text",
          "required": false,
          "description": "Words in its name or model, e.g. a builder or a model name.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "lengthMin",
          "required": false,
          "description": "Length at least ft (on this site 13.35 to 180.45).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "lengthMax",
          "required": false,
          "description": "Length at most ft (on this site 13.35 to 180.45).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "cabinsMin",
          "required": false,
          "description": "Cabins at least (on this site 0 to 20).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "cabinsMax",
          "required": false,
          "description": "Cabins at most (on this site 0 to 20).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "berthsMin",
          "required": false,
          "description": "Berths at least (on this site 0 to 80).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "berthsMax",
          "required": false,
          "description": "Berths at most (on this site 0 to 80).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "headsMin",
          "required": false,
          "description": "Heads at least (on this site 0 to 23).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "headsMax",
          "required": false,
          "description": "Heads at most (on this site 0 to 23).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "beamMin",
          "required": false,
          "description": "Beam at least m (on this site 0.9 to 44).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "beamMax",
          "required": false,
          "description": "Beam at most m (on this site 0.9 to 44).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "draftMin",
          "required": false,
          "description": "Draft at least m (on this site 0.3 to 7985).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "draftMax",
          "required": false,
          "description": "Draft at most m (on this site 0.3 to 7985).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "yearMin",
          "required": false,
          "description": "Year at least (on this site 0 to 2028).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "yearMax",
          "required": false,
          "description": "Year at most (on this site 0 to 2028).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "fuelMin",
          "required": false,
          "description": "Fuel tank at least l (on this site 1 to 65000).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "fuelMax",
          "required": false,
          "description": "Fuel tank at most l (on this site 1 to 65000).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "waterMin",
          "required": false,
          "description": "Water tank at least l (on this site 1 to 60000).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "waterMax",
          "required": false,
          "description": "Water tank at most l (on this site 1 to 60000).",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "priceMin",
          "required": false,
          "description": "The least to pay, in the site currency: the price plus the mandatory extras.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "priceMax",
          "required": false,
          "description": "The most to pay, in the site currency: the price plus the mandatory extras.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "sort",
          "required": false,
          "description": "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, biggest first), beam (beam, biggest first), draft (draft, biggest first), year (year, biggest first), fuel (fuel tank, biggest first), water (water tank, biggest first).",
          "schema": {
            "type": "string",
            "enum": [
              "saving",
              "departure",
              "price",
              "length",
              "cabins",
              "berths",
              "heads",
              "beam",
              "draft",
              "year",
              "fuel",
              "water"
            ]
          }
        },
        {
          "name": "cursor",
          "required": false,
          "description": "The cursor a previous answer returned, for its next page.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "limit",
          "required": false,
          "description": "Rows per page: at most 10 when browsing, 20 with the person's email or phone.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "email",
          "required": false,
          "description": "Optional: the person's own email, as they gave it, for more rows a call. Leave out to browse; the site keeps it to answer their enquiry.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "phone",
          "required": false,
          "description": "Optional: the person's own phone, international form (+ and country code), as they gave it, for more rows a call. Leave out to browse.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "session",
          "required": false,
          "description": "The session an earlier answer returned. Pass it instead of email or phone from then on.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "name",
          "required": false,
          "description": "Optional: the person's name, as they gave it.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        }
      ],
      "result": {
        "name": "structuredContent",
        "schema": {
          "type": "object",
          "properties": {
            "rows": {
              "type": "array",
              "description": "One page of deals, one row per item with its departures.",
              "items": {
                "type": "object",
                "description": "One item.",
                "properties": {
                  "item": {
                    "type": "string",
                    "description": "Its name."
                  },
                  "type": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Its type."
                  },
                  "base": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Its home base."
                  },
                  "guests": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "How many it takes."
                  },
                  "link": {
                    "type": "string",
                    "description": "Its page, absolute URL: the id get and request_quote take."
                  },
                  "photo": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "One photo, absolute URL."
                  },
                  "departures": {
                    "type": "array",
                    "description": "Its discounted departures in the window, in the order asked.",
                    "items": {
                      "type": "object",
                      "description": "One departure at one price.",
                      "properties": {
                        "routes": {
                          "type": "array",
                          "description": "Every route it leaves on at this price.",
                          "items": {
                            "type": "object",
                            "description": "A route.",
                            "properties": {
                              "from": {
                                "type": "string",
                                "description": "Leaves from."
                              },
                              "to": {
                                "type": "string",
                                "description": "Ends at."
                              }
                            }
                          }
                        },
                        "departFrom": {
                          "type": "string",
                          "description": "YYYY-MM-DD."
                        },
                        "departTo": {
                          "type": "string",
                          "description": "YYYY-MM-DD."
                        },
                        "nights": {
                          "type": "number",
                          "description": "Nights."
                        },
                        "price": {
                          "type": "object",
                          "description": "An amount in the site currency.",
                          "properties": {
                            "amount": {
                              "type": "number",
                              "description": "In major units (euros, not cents)."
                            },
                            "currency": {
                              "type": "string",
                              "description": "ISO 4217."
                            },
                            "text": {
                              "type": "string",
                              "description": "The amount written out, to quote to the person."
                            }
                          }
                        },
                        "listPrice": {
                          "type": "object",
                          "description": "An amount in the site currency.",
                          "properties": {
                            "amount": {
                              "type": "number",
                              "description": "In major units (euros, not cents)."
                            },
                            "currency": {
                              "type": "string",
                              "description": "ISO 4217."
                            },
                            "text": {
                              "type": "string",
                              "description": "The amount written out, to quote to the person."
                            }
                          }
                        },
                        "mandatoryExtras": {
                          "type": "object",
                          "description": "What the departure states is payable on top.",
                          "properties": {
                            "amount": {
                              "type": "number",
                              "description": "In major units (euros, not cents)."
                            },
                            "currency": {
                              "type": "string",
                              "description": "ISO 4217."
                            },
                            "text": {
                              "type": "string",
                              "description": "The amount written out, to quote to the person."
                            }
                          }
                        },
                        "savingPct": {
                          "type": "number",
                          "description": "The discount the source states."
                        },
                        "kind": {
                          "type": "string",
                          "description": "special or offer."
                        }
                      }
                    }
                  }
                }
              }
            },
            "total": {
              "type": "number",
              "description": "How many rows match in all."
            },
            "cursor": {
              "type": [
                "string",
                "null"
              ],
              "description": "Pass as cursor for the next page; null on the last."
            },
            "from": {
              "type": "string",
              "description": "The window's first day."
            },
            "through": {
              "type": "string",
              "description": "Its last day."
            },
            "checkedAt": {
              "type": [
                "string",
                "null"
              ],
              "description": "When the offers were read, ISO time."
            },
            "notApplied": {
              "type": "array",
              "items": {
                "type": "string",
                "description": "A wish."
              },
              "description": "What could not narrow the deals."
            },
            "nearest": {
              "type": "object",
              "description": "Only when nothing matched exactly: these rows are the nearest match.",
              "properties": {
                "widened": {
                  "type": "string",
                  "enum": [
                    "dates",
                    "base",
                    "place",
                    "ranges",
                    "price",
                    "discount"
                  ],
                  "description": "The one thing let go."
                },
                "note": {
                  "type": "string",
                  "description": "What moved, in words to tell the person."
                }
              }
            },
            "browsing": {
              "type": "boolean",
              "description": "true: answered without a contact, so fewer rows and the first pages only."
            },
            "next": {
              "type": "string",
              "description": "When browsing: how to get a quote or more rows."
            },
            "session": {
              "type": "string",
              "description": "Only on the call that created the contact: pass it from then on."
            },
            "sessionExpiresAt": {
              "type": "string",
              "description": "When that session stops working, ISO time."
            }
          },
          "required": [
            "rows",
            "total"
          ]
        }
      },
      "errors": [
        {
          "name": "invalid_email",
          "code": "invalid_email",
          "kind": "tool",
          "message": "That email address does not look right; ask the person for it again.",
          "next": "Ask the person to give their email again."
        },
        {
          "name": "invalid_phone",
          "code": "invalid_phone",
          "kind": "tool",
          "message": "Give the phone number in international form, a plus and the country code first, e.g. +31612345678.",
          "next": "Ask the person for the number with its country code."
        },
        {
          "name": "contact_revoked",
          "code": "contact_revoked",
          "kind": "tool",
          "message": "The owner of this contact said they did not ask for this. Use a different contact.",
          "next": "Ask the person for a different email or phone."
        },
        {
          "name": "rate_limited",
          "code": "rate_limited",
          "kind": "tool",
          "message": "Too many calls for this person or address this hour.",
          "next": "Wait retryAfterSeconds, then call again."
        },
        {
          "name": "browse_limited",
          "code": "browse_limited",
          "kind": "tool",
          "message": "This address has browsed as much as this site answers without a contact for now.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "browse_busy",
          "code": "browse_busy",
          "kind": "tool",
          "message": "This site has answered as many browse calls today as it answers without a contact.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "browse_page_limit",
          "code": "browse_page_limit",
          "kind": "tool",
          "message": "Browsing without a contact shows the first pages only.",
          "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
        },
        {
          "name": "read_refused",
          "code": "read_refused",
          "kind": "tool",
          "message": "The read could not answer these arguments.",
          "next": "Read the message: it says what to change (a date format, a place name, which of several items)."
        }
      ],
      "examples": [
        {
          "name": "best_deals example",
          "params": [
            {
              "name": "party",
              "value": 4
            },
            {
              "name": "limit",
              "value": 2
            }
          ],
          "result": {
            "name": "structuredContent",
            "value": {
              "rows": [
                {
                  "item": "string",
                  "type": "string",
                  "base": "string",
                  "guests": 0,
                  "link": "string",
                  "photo": "string",
                  "departures": [
                    {
                      "routes": [
                        {
                          "from": null,
                          "to": null
                        }
                      ],
                      "departFrom": "string",
                      "departTo": "string",
                      "nights": 0,
                      "price": {
                        "amount": 0,
                        "currency": "string",
                        "text": "string"
                      },
                      "listPrice": {
                        "amount": 0,
                        "currency": "string",
                        "text": "string"
                      },
                      "mandatoryExtras": {
                        "amount": 0,
                        "currency": "string",
                        "text": "string"
                      },
                      "savingPct": 0,
                      "kind": "string"
                    }
                  ]
                }
              ],
              "total": 0,
              "cursor": "string",
              "from": "2026-12-01",
              "through": "string",
              "checkedAt": "2026-11-01T06:00:00Z",
              "notApplied": [
                "string"
              ],
              "nearest": {
                "widened": "dates",
                "note": "string"
              },
              "browsing": true,
              "next": "string",
              "session": "string",
              "sessionExpiresAt": "2026-12-01T06:00:00Z"
            }
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 4,
        "method": "tools/call",
        "params": {
          "name": "best_deals",
          "arguments": {
            "party": 4,
            "limit": 2
          }
        }
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 4,
        "result": {
          "content": [
            {
              "type": "text",
              "text": "{\"rows\":[{\"item\":\"string\",\"type\":\"string\",\"base\":\"string\",\"guests\":0,\"link\":\"string\",\"photo\":\"string\",\"departures\":[{\"routes\":[{\"from\":null,\"to\":null}],\"departFrom\":\"string\",\"departTo\":\"string\",\"nights\":0,\"price\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"listPrice\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"mandatoryExtras\":{\"amount\":0,\"currency\":\"string\",\"text\":\"string\"},\"savingPct\":0,\"kind\":\"string\"}]}],\"total\":0,\"cursor\":\"string\",\"from\":\"2026-12-01\",\"through\":\"string\",\"checkedAt\":\"2026-11-01T06:00:00Z\",\"notApplied\":[\"string\"],\"nearest\":{\"widened\":\"dates\",\"note\":\"string\"},\"browsing\":true,\"next\":\"string\",\"session\":\"string\",\"sessionExpiresAt\":\"2026-12-01T06:00:00Z\"}"
            }
          ],
          "structuredContent": {
            "rows": [
              {
                "item": "string",
                "type": "string",
                "base": "string",
                "guests": 0,
                "link": "string",
                "photo": "string",
                "departures": [
                  {
                    "routes": [
                      {
                        "from": null,
                        "to": null
                      }
                    ],
                    "departFrom": "string",
                    "departTo": "string",
                    "nights": 0,
                    "price": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "listPrice": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "mandatoryExtras": {
                      "amount": 0,
                      "currency": "string",
                      "text": "string"
                    },
                    "savingPct": 0,
                    "kind": "string"
                  }
                ]
              }
            ],
            "total": 0,
            "cursor": "string",
            "from": "2026-12-01",
            "through": "string",
            "checkedAt": "2026-11-01T06:00:00Z",
            "notApplied": [
              "string"
            ],
            "nearest": {
              "widened": "dates",
              "note": "string"
            },
            "browsing": true,
            "next": "string",
            "session": "string",
            "sessionExpiresAt": "2026-12-01T06:00:00Z"
          },
          "isError": false
        }
      }
    },
    {
      "name": "request_quote",
      "summary": "Request a formal quote",
      "description": "Ask this site's desk for a formal quote on one or more yachts, for the person. Pass the page links a search, best_deals or get returned, the days and the party, and anything the person wants the desk to know. The desk answers with a written quote to the person's own email or phone, with every cost on it; 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. Ask the person before calling it.",
      "x-mcp-method": "tools/call",
      "x-kind": "request_quote",
      "x-writes": true,
      "paramStructure": "by-name",
      "params": [
        {
          "name": "items",
          "required": true,
          "description": "The yacht page links to quote (absolute URLs on this site), exactly as a search, best_deals or get returned them. At most 20.",
          "schema": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "maxItems": 20
          }
        },
        {
          "name": "from",
          "required": false,
          "description": "Check-in day, YYYY-MM-DD.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "to",
          "required": false,
          "description": "Check-out day, YYYY-MM-DD.",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "party",
          "required": false,
          "description": "How many people.",
          "schema": {
            "type": "number"
          }
        },
        {
          "name": "notes",
          "required": false,
          "description": "What the person wants the desk to know, in their words (at most 2000 characters).",
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "email",
          "required": false,
          "description": "The person's own email, as they gave it: the quote is sent there. This, phone or session is needed.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "phone",
          "required": false,
          "description": "The person's own phone, international form (+ and country code), as they gave it. This, email or session is needed.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "session",
          "required": false,
          "description": "The session an earlier answer returned. Pass it instead of email or phone.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        },
        {
          "name": "name",
          "required": false,
          "description": "Optional: the person's name, as they gave it.",
          "schema": {
            "type": "string"
          },
          "x-contact": true
        }
      ],
      "result": {
        "name": "structuredContent",
        "schema": {
          "type": "object",
          "properties": {
            "status": {
              "type": "string",
              "enum": [
                "received",
                "already_received"
              ],
              "description": "received: the desk has the request; already_received: this session asked the same in the last day."
            },
            "enquiryRef": {
              "type": "string",
              "description": "The request's reference, returned once."
            },
            "nextStep": {
              "type": "string",
              "description": "Where the written quote goes, in words to tell the person."
            },
            "session": {
              "type": "string",
              "description": "Only on the call that created the contact: pass it from then on."
            },
            "sessionExpiresAt": {
              "type": "string",
              "description": "When that session stops working, ISO time."
            }
          },
          "required": [
            "status",
            "nextStep"
          ]
        }
      },
      "errors": [
        {
          "name": "contact_required",
          "code": "contact_required",
          "kind": "tool",
          "message": "request_quote needs the person's email or phone, or the session an earlier answer returned.",
          "next": "Ask the person for their email or phone and pass it as email or phone."
        },
        {
          "name": "session_expired",
          "code": "contact_required",
          "kind": "tool",
          "message": "That session is not valid any more; pass the person's email or phone instead.",
          "next": "Ask the person for their email or phone again and pass it."
        },
        {
          "name": "invalid_email",
          "code": "invalid_email",
          "kind": "tool",
          "message": "That email address does not look right; ask the person for it again.",
          "next": "Ask the person to give their email again."
        },
        {
          "name": "invalid_phone",
          "code": "invalid_phone",
          "kind": "tool",
          "message": "Give the phone number in international form, a plus and the country code first, e.g. +31612345678.",
          "next": "Ask the person for the number with its country code."
        },
        {
          "name": "contact_revoked",
          "code": "contact_revoked",
          "kind": "tool",
          "message": "The owner of this contact said they did not ask for this. Use a different contact.",
          "next": "Ask the person for a different email or phone."
        },
        {
          "name": "scope_missing",
          "code": "scope_missing",
          "kind": "tool",
          "message": "The person signed in without allowing enquiries, so request_quote cannot file one as them.",
          "next": "Ask the person to sign in again and allow the enquire scope."
        },
        {
          "name": "rate_limited",
          "code": "rate_limited",
          "kind": "tool",
          "message": "Too many calls for this person or address this hour.",
          "next": "Wait retryAfterSeconds, then call again."
        },
        {
          "name": "quote_limit",
          "code": "quote_limit",
          "kind": "tool",
          "message": "No more quote requests can be filed for this contact today.",
          "next": "Tell the person the desk already has their requests; try again tomorrow."
        },
        {
          "name": "quote_not_filed",
          "code": "quote_not_filed",
          "kind": "tool",
          "message": "The request did not reach the desk. Nothing was filed and it does not count toward any limit; try again in a minute.",
          "next": "Call request_quote again in a minute with the same arguments."
        },
        {
          "name": "invalid_party",
          "code": "invalid_party",
          "kind": "tool",
          "message": "party is how many people, at least 1.",
          "next": "Pass party as a whole number of people."
        },
        {
          "name": "unknown_item",
          "code": "unknown_item",
          "kind": "tool",
          "message": "That is not an item on this site.",
          "next": "Pass the item's page link (an absolute URL on this site) exactly as a search, best_deals or get returned it."
        }
      ],
      "examples": [
        {
          "name": "request_quote example",
          "params": [
            {
              "name": "items",
              "value": [
                "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731"
              ]
            },
            {
              "name": "from",
              "value": "2026-12-01"
            },
            {
              "name": "to",
              "value": "2026-12-08"
            },
            {
              "name": "party",
              "value": 4
            },
            {
              "name": "email",
              "value": "person@example.com"
            }
          ],
          "result": {
            "name": "structuredContent",
            "value": {
              "status": "received",
              "enquiryRef": "string",
              "nextStep": "string",
              "session": "string",
              "sessionExpiresAt": "2026-12-01T06:00:00Z"
            }
          }
        }
      ],
      "x-request": {
        "jsonrpc": "2.0",
        "id": 5,
        "method": "tools/call",
        "params": {
          "name": "request_quote",
          "arguments": {
            "items": [
              "https://thecharterdesk.com/yachts/2-drunk-6358727140000106731"
            ],
            "from": "2026-12-01",
            "to": "2026-12-08",
            "party": 4,
            "email": "person@example.com"
          }
        }
      },
      "x-response": {
        "jsonrpc": "2.0",
        "id": 5,
        "result": {
          "content": [
            {
              "type": "text",
              "text": "{\"status\":\"received\",\"enquiryRef\":\"string\",\"nextStep\":\"string\",\"session\":\"string\",\"sessionExpiresAt\":\"2026-12-01T06:00:00Z\"}"
            }
          ],
          "structuredContent": {
            "status": "received",
            "enquiryRef": "string",
            "nextStep": "string",
            "session": "string",
            "sessionExpiresAt": "2026-12-01T06:00:00Z"
          },
          "isError": false
        }
      }
    }
  ],
  "x-mcp": {
    "transport": "streamable-http",
    "endpoint": "https://thecharterdesk.com/mcp",
    "protocolVersions": [
      "2025-06-18",
      "2025-03-26",
      "2024-11-05"
    ],
    "auth": "none",
    "resources": [
      "site://about"
    ],
    "limits": {
      "browse": {
        "rowsMax": 10,
        "pagesMax": 2,
        "perIpCalls": 30,
        "perIpWindowSeconds": 600,
        "sitePerDay": 5000,
        "cacheSeconds": 180
      },
      "contact": {
        "callsPerHour": 30,
        "perIpHour": 30,
        "quotesPerDay": 5,
        "quoteMailsPerDay": 2,
        "sessionDays": 30
      },
      "address": {
        "perMinute": 60,
        "perDay": 1000,
        "pageMax": 20
      }
    },
    "errors": [
      {
        "name": "parse_error",
        "code": -32700,
        "kind": "rpc",
        "message": "Parse error.",
        "next": "Send one valid JSON-RPC 2.0 message as the request body."
      },
      {
        "name": "invalid_request",
        "code": -32600,
        "kind": "rpc",
        "message": "Not a JSON-RPC 2.0 request.",
        "next": "Send one JSON-RPC 2.0 message per request, with jsonrpc \"2.0\", an id and a method."
      },
      {
        "name": "invalid_locale",
        "code": -32600,
        "kind": "rpc",
        "message": "invalid_locale",
        "next": "Pass locale as two lower-case letters, or leave it out."
      },
      {
        "name": "method_not_found",
        "code": -32601,
        "kind": "rpc",
        "message": "Method not found.",
        "next": "Call initialize, tools/list, tools/call, resources/list or resources/read."
      },
      {
        "name": "invalid_params",
        "code": -32602,
        "kind": "rpc",
        "message": "Invalid params.",
        "next": "Read the message: it names the argument. Call tools/list for each tool's schema."
      },
      {
        "name": "resource_not_found",
        "code": -32002,
        "kind": "rpc",
        "message": "Resource not found.",
        "next": "Call resources/list for the resources this server has."
      },
      {
        "name": "site_unavailable",
        "code": -32000,
        "kind": "rpc",
        "message": "site_unavailable",
        "next": "Try again later."
      },
      {
        "name": "mcp_disabled",
        "code": -32000,
        "kind": "rpc",
        "message": "mcp_disabled",
        "next": "This site has its MCP server switched off. Send the person to the website."
      },
      {
        "name": "rate_limited_address",
        "code": -32000,
        "kind": "rpc",
        "message": "rate_limited",
        "next": "Wait for the Retry-After seconds, then call again."
      },
      {
        "name": "internal_error",
        "code": -32603,
        "kind": "rpc",
        "message": "site_unavailable",
        "next": "Try again later."
      },
      {
        "name": "contact_required",
        "code": "contact_required",
        "kind": "tool",
        "message": "request_quote needs the person's email or phone, or the session an earlier answer returned.",
        "next": "Ask the person for their email or phone and pass it as email or phone."
      },
      {
        "name": "session_expired",
        "code": "contact_required",
        "kind": "tool",
        "message": "That session is not valid any more; pass the person's email or phone instead.",
        "next": "Ask the person for their email or phone again and pass it."
      },
      {
        "name": "invalid_email",
        "code": "invalid_email",
        "kind": "tool",
        "message": "That email address does not look right; ask the person for it again.",
        "next": "Ask the person to give their email again."
      },
      {
        "name": "invalid_phone",
        "code": "invalid_phone",
        "kind": "tool",
        "message": "Give the phone number in international form, a plus and the country code first, e.g. +31612345678.",
        "next": "Ask the person for the number with its country code."
      },
      {
        "name": "contact_revoked",
        "code": "contact_revoked",
        "kind": "tool",
        "message": "The owner of this contact said they did not ask for this. Use a different contact.",
        "next": "Ask the person for a different email or phone."
      },
      {
        "name": "scope_missing",
        "code": "scope_missing",
        "kind": "tool",
        "message": "The person signed in without allowing enquiries, so request_quote cannot file one as them.",
        "next": "Ask the person to sign in again and allow the enquire scope."
      },
      {
        "name": "rate_limited",
        "code": "rate_limited",
        "kind": "tool",
        "message": "Too many calls for this person or address this hour.",
        "next": "Wait retryAfterSeconds, then call again."
      },
      {
        "name": "browse_limited",
        "code": "browse_limited",
        "kind": "tool",
        "message": "This address has browsed as much as this site answers without a contact for now.",
        "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
      },
      {
        "name": "browse_busy",
        "code": "browse_busy",
        "kind": "tool",
        "message": "This site has answered as many browse calls today as it answers without a contact.",
        "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
      },
      {
        "name": "browse_page_limit",
        "code": "browse_page_limit",
        "kind": "tool",
        "message": "Browsing without a contact shows the first pages only.",
        "next": "Ask the person for their email or phone and pass it as email or phone, or call request_quote."
      },
      {
        "name": "quote_limit",
        "code": "quote_limit",
        "kind": "tool",
        "message": "No more quote requests can be filed for this contact today.",
        "next": "Tell the person the desk already has their requests; try again tomorrow."
      },
      {
        "name": "quote_not_filed",
        "code": "quote_not_filed",
        "kind": "tool",
        "message": "The request did not reach the desk. Nothing was filed and it does not count toward any limit; try again in a minute.",
        "next": "Call request_quote again in a minute with the same arguments."
      },
      {
        "name": "invalid_party",
        "code": "invalid_party",
        "kind": "tool",
        "message": "party is how many people, at least 1.",
        "next": "Pass party as a whole number of people."
      },
      {
        "name": "unknown_item",
        "code": "unknown_item",
        "kind": "tool",
        "message": "That is not an item on this site.",
        "next": "Pass the item's page link (an absolute URL on this site) exactly as a search, best_deals or get returned it."
      },
      {
        "name": "price_index_not_configured",
        "code": "price_index_not_configured",
        "kind": "tool",
        "message": "This site has no price figures.",
        "next": "Use search or best_deals for prices instead."
      },
      {
        "name": "invalid_place",
        "code": "invalid_place",
        "kind": "tool",
        "message": "Choose a place from the list.",
        "next": "Pass one of the names under places, or a country or region in words."
      },
      {
        "name": "unknown_place",
        "code": "unknown_place",
        "kind": "tool",
        "message": "There are no prices for that place.",
        "next": "Pass one of the names under places."
      },
      {
        "name": "invalid_month",
        "code": "invalid_month",
        "kind": "tool",
        "message": "Choose a month as YYYY-MM.",
        "next": "Pass month as YYYY-MM."
      },
      {
        "name": "invalid_type",
        "code": "invalid_type",
        "kind": "tool",
        "message": "Choose a type from the list, or leave it out for any.",
        "next": "Leave type out, or pass a type the site names."
      },
      {
        "name": "duplicate_parameter",
        "code": "duplicate_parameter",
        "kind": "tool",
        "message": "Only one value per parameter is supported.",
        "next": "Pass each argument once."
      },
      {
        "name": "no_prices_for_month",
        "code": "no_prices_for_month",
        "kind": "tool",
        "message": "There are no prices for that month yet.",
        "next": "Pass a month from the first one the message names."
      },
      {
        "name": "no_prices_for_type",
        "code": "no_prices_for_type",
        "kind": "tool",
        "message": "There are no prices for that type there that month.",
        "next": "Leave type out, or try another month."
      },
      {
        "name": "read_refused",
        "code": "read_refused",
        "kind": "tool",
        "message": "The read could not answer these arguments.",
        "next": "Read the message: it says what to change (a date format, a place name, which of several items)."
      }
    ]
  }
}