Tool tree
gradeNot graded
page: Every page
send_scoutsSensitive Action
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}filter_placesAction
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}explain_vocabularyAnswer
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}get_placeAnswer
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}compare_placesAction
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}find_nearAnswer
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}find_eventsAnswer
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}get_catalog_statsAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"page": "/fr"
}set_viewAction
Steer the map the visitor is looking at: recentre and zoom. Mutates only the view state of this browser tab; changes nothing anywhere else.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}highlight_placesAction
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}ask_visitorAction
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}get_input_resultAnswer
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).
View tool JSON
{
"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).",
"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
},
"page": "/fr"
}get_visitor_signalsAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"page": "/fr"
}get_demand_pulseAction
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".
View tool JSON
{
"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\".",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"page": "/fr"
}get_scout_reportsAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"page": "/fr"
}find_tonightAnswer
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}get_visitor_viewAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"page": "/fr"
}write_postcardAction
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}compose_carnetAction
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.
View tool JSON
{
"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.",
"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
},
"page": "/fr"
}get_agent_demandAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {
"zeroResultsOnly": {
"default": false,
"description": "Return only the requests that found nothing.",
"type": "boolean"
}
},
"additionalProperties": false
},
"page": "/fr"
}