{"ok":true,"site":{"host":"webmcp.myprovence.fr","url":"https://webmcp.myprovence.fr/fr","type":"live","desc":"","tools":[{"name":"send_scouts","kind":"transact","impl":"imperative","description":"Plans a stay or outing in Provence (Bouches-du-Rhône) from one fuzzy wish in any language: 'romantic weekend, good food, not too touristy', 'j'hésite entre les Alpilles et la côte'. Use when the visitor expresses a desire rather than a precise query, even with no place named. Runs 2-4 scout searches over the official Provence Tourisme catalogue (2798 places, 3600+ dated events) and plants keep/dismiss flags on the shared map. Search terms in French; mission and labels in the visitor's language.","title":"Envoyer les éclaireurs","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"mission":{"type":"string","minLength":5,"maxLength":120,"description":"The visitor's desire in one short sentence, IN THE VISITOR'S LANGUAGE (shown on screen)."},"scouts":{"minItems":2,"maxItems":4,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":2,"maxLength":40,"description":"Short label for this scout IN THE VISITOR'S LANGUAGE, e.g. \"villages du Luberon\" / \"Luberon villages\"."},"query":{"description":"Free-text search, FRENCH terms.","type":"string","minLength":2,"maxLength":80},"tags":{"description":"Tag slugs (ALL required). Call explain_vocabulary for slugs.","maxItems":4,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"town":{"type":"string","minLength":1,"maxLength":80},"cluster":{"type":"string","enum":["hotels","campings","chambres-d-hotes","loisirs","itineraires","agenda"],"description":"One of the five myProvence guide clusters."},"month":{"type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$","description":"Month, YYYY-MM."}},"required":["label"],"additionalProperties":false},"description":"2 to 4 DIFFERENT search angles on the same desire."}},"required":["mission","scouts"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"filter_places","kind":"act","impl":"imperative","description":"Searches the official Provence Tourisme catalogue: 2798 hotels, campings, chambres d'hôtes, leisure and 232 walking/cycling routes in the Bouches-du-Rhône. Use for precise lodging or activity questions about Provence, any language: \"hôtel avec piscine\", \"que faire à Marseille\". Translate query terms and tags to French. Filters: tag slugs (see explain_vocabulary), town, cluster, stars, free-text. Results carry canonical myprovence.fr URLs and light the shared map. A fuzzy wish fits send_scouts.","title":"Guides Provence (catalogue officiel)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"cluster":{"description":"Restrict to one cluster. Omit to search all 2798 places.","type":"string","enum":["hotels","campings","chambres-d-hotes","loisirs","itineraires","agenda"]},"tags":{"description":"Tag slugs, ALL of which must be present. Example: [\"parking\",\"animaux-acceptes\"]. Call explain_vocabulary for the full list.","maxItems":12,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"anyTags":{"description":"Tag slugs, ANY of which is enough.","maxItems":12,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"town":{"description":"Town name, e.g. \"Marseille\". Matched case- and accent-insensitively.","type":"string","minLength":1,"maxLength":80},"minGrade":{"description":"Minimum star rating (hotels).","type":"integer","minimum":1,"maximum":5},"query":{"description":"Free-text keyword search over names, towns, summaries and criteria labels, accent-insensitive. The catalogue is FRENCH: translate terms to French first (\"Schwimmbad\" -> \"piscine\", \"dog friendly\" -> \"animaux acceptes\"). Example: \"street food\".","type":"string","minLength":2,"maxLength":80},"limit":{"default":20,"description":"Maximum results. Hard cap 100; page with offset for the rest.","type":"integer","minimum":1,"maximum":100},"offset":{"default":0,"type":"integer","minimum":0,"maximum":5000}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"explain_vocabulary","kind":"answer","impl":"imperative","description":"The catalogue filters by opaque numeric tags (parking is term 469). This tool publishes the human vocabulary: every tag slug, its French label, which Drupal vocabulary it belongs to, and how many places carry it. Pass query to search, omit it for the most common tags. Use the returned slugs with filter_places.","title":"Critères disponibles","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"query":{"description":"Optional label/slug fragment to search for, e.g. \"piscine\".","type":"string","minLength":1,"maxLength":80},"limit":{"default":40,"type":"integer","minimum":1,"maximum":100}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"get_place","kind":"answer","impl":"imperative","description":"Returns the full official record of one Provence place instantly: name, town, cluster, star rating, all tags as readable slugs, coordinates, summary and the canonical myprovence.fr URL. Use when the visitor asks about one specific place — \"tell me more about that hotel\", \"does it have parking?\", \"c'est comment, ce camping ?\". Look it up by id (from any earlier result) or by its myprovence.fr URL.","title":"Fiche officielle d'un lieu","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"description":"The place id, from filter_places results.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"url":{"description":"A myprovence.fr page URL or path, e.g. \"/les-guides/hebergements/hotels/...\".","type":"string","minLength":1,"maxLength":300}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"compare_places","kind":"act","impl":"imperative","description":"Compares 2 to 5 catalogue places side by side on a shared attribute matrix (town, rating, which tags each has or lacks) straight from the official record. Use when the visitor hesitates between places already found here — \"which of the two has parking AND a pool?\", \"lequel est le mieux placé ?\". Highlights the compared places on the shared map so the visitor sees the same comparison.","title":"Comparer des adresses","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"ids":{"minItems":2,"maxItems":5,"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"description":"2 to 5 place ids to compare side by side."}},"required":["ids"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"find_near","kind":"answer","impl":"imperative","description":"Radius search over the official catalogue around a named town or a lat/lng point, optionally within one cluster. Use for any distance-shaped question about Provence places: \"near Cassis\", \"within 10 km of Aix\", \"autour des calanques\", \"close to the station\". Returns places sorted by distance in km and recentres the map the visitor is watching. Only places with known coordinates are searched.","title":"Autour d'un point (rayon en km)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"town":{"description":"Centre on a known town, e.g. \"Cassis\".","type":"string","minLength":1,"maxLength":80},"lat":{"type":"number","minimum":42.5,"maximum":44.5},"lng":{"type":"number","minimum":3.5,"maximum":7.5},"radiusKm":{"default":15,"type":"number","minimum":0.5,"maximum":80},"cluster":{"type":"string","enum":["hotels","campings","chambres-d-hotes","loisirs","itineraires","agenda"],"description":"One of the five myProvence guide clusters."},"limit":{"default":20,"type":"integer","minimum":1,"maximum":40}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"find_events","kind":"answer","impl":"imperative","description":"Searches the official Provence Tourisme agenda: 3600+ dated events in the Bouches-du-Rhône (festivals, concerts, marchés, expos). Use for what-is-happening questions in Provence — \"que faire ce week-end\", a month, a town — any language; translate query terms to French. Filters: free-text query, month (\"2026-10\"), from/to, category, town, tags. Chronological results with dates and canonical myprovence.fr URLs, lit on the shared map. find_tonight covers \"tonight\"; send_scouts covers fuzzy wishes.","title":"Agenda Provence (catalogue officiel)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"month":{"description":"Whole-month shorthand, e.g. \"2026-10\" for October 2026. Overrides from/to.","type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])$"},"from":{"description":"Window start (inclusive).","type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"},"to":{"description":"Window end (inclusive).","type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"},"category":{"description":"Agenda category slug from the event URLs, e.g. \"concert\", \"marche\", \"visites-guidees\", \"exposition\". Unknown values return the valid list.","type":"string","minLength":1,"maxLength":40},"town":{"type":"string","minLength":1,"maxLength":80},"tags":{"maxItems":12,"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"query":{"description":"Free-text keyword search over event names, towns and summaries, accent-insensitive. The catalogue is FRENCH: translate terms to French first (\"Weihnachtsmarkt\" -> \"marche de noel\"). Example: \"street food festival\".","type":"string","minLength":2,"maxLength":80},"limit":{"default":20,"type":"integer","minimum":1,"maximum":100},"offset":{"default":0,"type":"integer","minimum":0,"maximum":5000}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"get_catalog_stats","kind":"answer","impl":"imperative","description":"Coverage of the catalogue: total places, count per cluster, number of towns, how many places carry coordinates and tags, and the 25 most common tags with their populations. Call this first to understand what can be asked.","title":"Catalogue statistics","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"set_view","kind":"act","impl":"imperative","description":"Steer the map the visitor is looking at: recentre and zoom. Mutates only the view state of this browser tab; changes nothing anywhere else.","title":"Set the map view","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"lat":{"type":"number","minimum":42.5,"maximum":44.5},"lng":{"type":"number","minimum":3.5,"maximum":7.5},"zoom":{"default":11,"type":"integer","minimum":7,"maximum":17}},"required":["lat","lng"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"highlight_places","kind":"act","impl":"imperative","description":"Marks a set of places on the shared map and result list so the visitor sees the places being discussed. Each search call replaces the map selection, so a final answer stays fully visible when this receives the complete set of cited ids (hotels and events together; events without exact coordinates get town-level pins). Mutates only the view state of this browser tab.","title":"Highlight places","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"ids":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"description":"Place ids to highlight on the shared map and list."}},"required":["ids"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"ask_visitor","kind":"act","impl":"imperative","description":"Ask the visitor ONE short question by placing tappable choice cards on the page they are looking at — never ask preferences in chat when this tool is available. Resolves with their tap. If they take longer than ~45s you receive {status:\"pending\", input_id}: keep helping and collect the answer later with get_input_result. Their choices are decisions, not suggestions.","title":"Question au visiteur","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"question":{"type":"string","minLength":5,"maxLength":160,"description":"One short question, in the visitor language (French here)."},"options":{"minItems":2,"maxItems":4,"type":"array","items":{"type":"string","minLength":1,"maxLength":40},"description":"2-4 short tappable choices."}},"required":["question","options"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"get_input_result","kind":"answer","impl":"imperative","description":"Collect the answer to a pending ask_visitor ticket. Statuses: answered (their choice), pending (still deciding — continue helping, retry later), dismissed (they closed the question: respect it, do not re-ask).","title":"Réponse du visiteur","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"input_id":{"type":"string","pattern":"^q-[a-z0-9-]{1,40}$","description":"The pending ticket returned by ask_visitor."}},"required":["input_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"get_visitor_signals","kind":"answer","impl":"imperative","description":"The visitor talks with their hands: pings dropped on the map (plus-comme-ca = more like this here, eviter = avoid this area, question = curious about this spot), locks on results (their firm choices — never argue), card answers, typed WISHES (they wrote a desire into the page box: the page only records it — it is waiting for YOU to interpret it and call send_scouts), and yields. Returns gestures since your last call plus current locks and pings. Worth reading before any search or proposal.","title":"Gestes du visiteur","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"get_demand_pulse","kind":"act","impl":"imperative","description":"The destination's live agent demand, aggregated by town over the last 7 days (counters only, k-anonymized). Calling it lights the demand layer on the shared map: coral for served demand, bright yellow for requests that found NOTHING — the invisible demand. Narrate one factual line from it, e.g. \"84 asks around Marseille this week; the zero-result ones are the offer gaps\".","title":"Le pouls de la demande","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"get_scout_reports","kind":"answer","impl":"imperative","description":"The last scout mission with the visitor's verdicts: kept (their decision, treat as fixed), dismissed (do not re-propose), pending (still deciding). Any plan or postcard grounds itself in these verdicts.","title":"Rapports des éclaireurs","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"find_tonight","kind":"answer","impl":"imperative","description":"What is ACTUALLY happening tonight (or a given day) near the visitor: real dated events from the official agenda, sorted by distance when a town or coordinates are given, else within the area the visitor is currently looking at. Use for \"ce soir\", \"tonight\", \"que faire maintenant\", \"this weekend\" (call once per day). Results carry distance_km and light up on the shared map.","title":"Ce soir en Provence","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"date":{"description":"Day to look at, YYYY-MM-DD. Omit for today (the visitor's day).","type":"string","pattern":"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$"},"town":{"description":"Center the search on this town.","type":"string","minLength":1,"maxLength":80},"lat":{"type":"number","minimum":-90,"maximum":90},"lng":{"type":"number","minimum":-180,"maximum":180},"radius_km":{"description":"Walking/driving range in km. Default 15.","type":"number","minimum":1,"maximum":50},"limit":{"type":"integer","minimum":1,"maximum":20}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"get_visitor_view","kind":"answer","impl":"imperative","description":"The visitor's CURRENT context, live: map viewport with the TOWNS it frames (townsInView, ranked; dominantTown when one leads), zoom, hand-set filters, kept selection, and visible place names. Use when they say \"here\", \"around this\", \"what am I looking at\", and before proposing anything. The viewport is the visitor's true focus: a zoom on one town with the town filter still on \"all towns\" means THAT town, dominantTown says which.","title":"Ce que le visiteur regarde","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"write_postcard","kind":"act","impl":"imperative","description":"Composes the closing keepsake: a short letter from day 2-3 of the trip, first person, in the visitor's language, grounded ONLY in their choices — kept flags, locked cards and the accepted pin all count. The factual footer (places, towns, dates, links) prints automatically from that selection; the body text is the prose on top. Displays full-screen on the page; refuses while no choice exists.","title":"La carte postale du futur","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"title":{"type":"string","minLength":3,"maxLength":60,"description":"Postcard title, French, e.g. \"Trois jours entre Luberon et mer\"."},"body":{"type":"string","minLength":40,"maxLength":700,"description":"The letter, written from day 2 or 3 of the trip, first person, French. Mention ONLY places and events from the visitor's kept selection (the factual footer is printed automatically from that selection)."},"day":{"description":"Which trip day the letter is written from.","type":"integer","minimum":1,"maximum":7}},"required":["title","body"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"compose_carnet","kind":"act","impl":"imperative","description":"Composes the briefing pack from the visitor's choices (kept flags, locked cards, accepted pin): a print-ready carnet de voyage with the real photographs, one section per day. Reference ONLY ids from that selection — unknown ids are refused with the valid list. Assign dated events to their day, places to arrival/anytime sections; day labels and notes in the visitor's language. The visitor gets a Download-PDF button.","title":"Le carnet de voyage","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"title":{"type":"string","minLength":3,"maxLength":60,"description":"Carnet title in the visitor's language, e.g. \"Week-end à Cassis\"."},"days":{"minItems":1,"maxItems":7,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":2,"maxLength":30,"description":"Day heading, e.g. \"Samedi matin\" / \"Saturday evening\"."},"itemIds":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"description":"Ids from the KEPT selection only (get_scout_reports / read_visitor_wish)."},"note":{"description":"One short editorial line for the day.","type":"string","maxLength":240}},"required":["label","itemIds"],"additionalProperties":false}},"signoff":{"description":"Closing line, first person.","type":"string","maxLength":120}},"required":["title","days"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]},{"name":"get_agent_demand","kind":"answer","impl":"imperative","description":"The Demand Mirror: every tool call made in this session with its arguments and result count. Zero-result calls are demand the catalogue could not answer. Session-scoped; nothing here identifies the visitor.","title":"Agent demand this session","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"zeroResultsOnly":{"default":false,"description":"Return only the requests that found nothing.","type":"boolean"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/fr","pages":["/fr","/en"]}],"category":"Travel & Events","favicon":"/favicons/webmcp.myprovence.fr.png","apiSurface":"spec","toolCount":20}}