{
  "name": "L'Isle-sur-la-Sorgue Destination Agent",
  "description": "Curated MCP server for L'Isle-sur-la-Sorgue -- places, events, and booking.",
  "protocolVersion": "2026-07-28",
  "supportedVersions": [
    "2026-07-28",
    "2025-11-25",
    "2025-06-18",
    "2025-03-26"
  ],
  "transport": "streamable-http",
  "endpoint": "https://ai.islesurlasorguetourisme.com/mcp",
  "auth": {
    "type": "bearer"
  },
  "serverInfo": {
    "name": "Globetrotters L'Isle-sur-la-Sorgue MCP Server",
    "provider": "Globetrotters"
  },
  "capabilities": {
    "tools": {
      "listChanged": false
    },
    "resources": {
      "listChanged": false,
      "subscribe": false
    }
  },
  "tools": [
    {
      "name": "search_places",
      "description": "Search the destination's curated catalog of verified points of interest (attractions, restaurants, hotels, activities). Results are policy-filtered and sorted by priority. Each result may carry an `officialUrl` (the destination's own page for the place — prefer it for referrals/citations), a `websiteUrl` (the place's own site), and a `booking.url` (transactional). These are distinct handoffs. When nothing matches exactly, filters are loosened automatically and the loosened filters are listed in `relaxationApplied` — those results are close alternatives, not exact matches, and should be presented as such. `totalAvailable` then counts that loosened set, so do not report it as a count of matches for the original request.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Natural-language search term over name, aliases, description, tags, and editorial notes. Ask in the traveller's own language: common French and English travel vocabulary is matched interchangeably, so \"castle\" finds \"Château\"."
          },
          "type": {
            "type": "string",
            "enum": [
              "attraction",
              "restaurant",
              "hotel",
              "activity",
              "shop",
              "other"
            ],
            "description": "Filter by place type."
          },
          "season": {
            "type": "string",
            "enum": [
              "spring",
              "summer",
              "autumn",
              "winter"
            ],
            "description": "Filter to places tagged for this season."
          },
          "audience": {
            "type": "string",
            "enum": [
              "family",
              "couples",
              "solo",
              "groups"
            ],
            "description": "Filter to places tagged for this audience."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5
          }
        }
      }
    },
    {
      "name": "search_events",
      "description": "Search upcoming events (festivals, markets, concerts) in the destination. Defaults to the next 30 days if no date range is provided. When nothing matches exactly, filters other than the date range are loosened automatically and listed in `relaxationApplied` — those results are close alternatives, not exact matches. `totalAvailable` then counts that loosened set, so do not report it as a count of matches for the original request.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Natural-language search term. Ask in the traveller's own language: common French and English travel vocabulary is matched interchangeably, so \"market\" finds \"Marché\"."
          },
          "type": {
            "type": "string",
            "enum": [
              "festival",
              "market",
              "concert",
              "sport",
              "exhibition",
              "other"
            ]
          },
          "dateFrom": {
            "type": "string",
            "format": "date",
            "description": "ISO 8601 date. Defaults to today."
          },
          "dateTo": {
            "type": "string",
            "format": "date",
            "description": "ISO 8601 date. Defaults to today + 30 days."
          },
          "audience": {
            "type": "string",
            "enum": [
              "family",
              "adults",
              "all"
            ]
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5
          }
        }
      }
    },
    {
      "name": "handoff_booking",
      "description": "Return a structured booking handoff for a specific place or event. Provide either a placeId or an eventId (placeId wins if both are set). Always returns a fallback_url so the caller is never left stranded.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "placeId": {
            "type": "string",
            "description": "UUID of a place. Wins if both are set."
          },
          "eventId": {
            "type": "string",
            "description": "UUID of an event."
          }
        }
      }
    }
  ],
  "resources": [
    {
      "uri": "destination://overview"
    },
    {
      "uri": "destination://practical-info"
    },
    {
      "uri": "destination://editorial-highlights"
    }
  ]
}