reunion_search_classified_accommodations
Find accommodations in La Réunion with official Atout France star classification. Filter by typology, star rating, or commune to locate hotels, campsites, and holiday villages.
Instructions
Search collective accommodations in La Réunion that hold an official Atout France star classification (1 to 5 étoiles, valid 5 years). Covers hôtels de tourisme, résidences de tourisme, campings, villages de vacances, parcs résidentiels de loisirs. Returns commercial name, typology, classification (stars), category, classification date and extension flag, stay type, commune, postal code, address, website, room count, capacity in persons. Sorted by classification date descending. Source: Atout France via data.regionreunion.com.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| typology | No | Typology prefix match. Examples: "Hôtel de tourisme", "Camping", "Résidence de tourisme", "Village de vacances", "Parc résidentiel de loisirs" | |
| classification | No | Star classification prefix match. Examples: "1 étoile", "2 étoiles", "3 étoiles", "4 étoiles", "5 étoiles" | |
| commune | No | Commune name prefix match | |
| limit | No | Max accommodations to return (1-300, default 50) |
Implementation Reference
- src/modules/hospitality.ts:52-54 (registration)Registration of the 'reunion_search_classified_accommodations' tool via server.tool() call within the registerHospitalityTools function, at line 54.
); server.tool( - src/modules/hospitality.ts:63-96 (handler)Async handler function for the tool. Queries the 'hebergements-classespublic' OpenDataSoft dataset with filters, sorts by classification date descending, and maps results to a structured response.
async ({ typology, classification, commune, limit }) => { try { const data = await client.getRecords<RecordObject>(DATASET_CLASSIFIED, { where: buildWhere([ typology ? `typologie_etablissement LIKE ${quote(`${typology}%`)}` : undefined, classification ? `classement LIKE ${quote(`${classification}%`)}` : undefined, commune ? `commune LIKE ${quote(`${commune}%`)}` : undefined, ]), order_by: 'date_de_classement DESC', limit, }); return jsonResult({ total_accommodations: data.total_count, accommodations: data.results.map((row) => ({ name: pickString(row, ['nom_commercial']), typology: pickString(row, ['typologie_etablissement']), classification: pickString(row, ['classement']), category: pickString(row, ['categorie']), classification_date: pickString(row, ['date_de_classement']), classification_extended: pickString(row, ['classement_proroge']), stay_type: pickString(row, ['type_de_sejour']), commune: pickString(row, ['commune']), postal_code: pickString(row, ['code_postal']), address: pickString(row, ['adresse']), website: pickString(row, ['site_internet']), room_count: pickNumber(row, ['nombre_de_chambres']), capacity_persons: pickString(row, ['capacite_d_accueil_personnes']), })), }); } catch (error) { return errorResult(error instanceof Error ? error.message : 'Failed to search classified accommodations'); } } ); - src/modules/hospitality.ts:57-62 (schema)Input schema for the tool defined with Zod: optional typology, classification, commune (string) and limit (number, 1-300, default 50).
{ typology: z.string().optional().describe('Typology prefix match. Examples: "Hôtel de tourisme", "Camping", "Résidence de tourisme", "Village de vacances", "Parc résidentiel de loisirs"'), classification: z.string().optional().describe('Star classification prefix match. Examples: "1 étoile", "2 étoiles", "3 étoiles", "4 étoiles", "5 étoiles"'), commune: z.string().optional().describe('Commune name prefix match'), limit: z.number().int().min(1).max(300).default(50).describe('Max accommodations to return (1-300, default 50)'), }, - src/modules/hospitality.ts:10-11 (helper)Dataset identifier constant for the classified accommodations data source ('hebergements-classespublic').
const DATASET_CLASSIFIED = 'hebergements-classespublic'; const DATASET_ECOLODGE = 'localisation-potentielle-ecolodge-lareunion'; - src/modules/index.ts:16-56 (registration)Registration entry point: registerHospitalityTools is imported from hospitality.ts and called in registerAllTools() to wire the tool into the MCP server.
import { registerHospitalityTools } from './hospitality.js'; import { registerHousingTools } from './housing.js'; import { registerNationalElectionsTools } from './national-elections.js'; import { registerPossessionTools } from './possession.js'; import { registerSocialTools } from './social.js'; import { registerTelecomTools } from './telecom.js'; import { registerTerritoryTools } from './territory.js'; import { registerTourismTools } from './tourism.js'; import { registerTransportTools } from './transport.js'; import { registerUrbanismTools } from './urbanism.js'; import { registerWeatherTools } from './weather.js'; export const TOOL_COUNT = 99; /** * Register all tool modules with the MCP server. */ export function registerAllTools(server: McpServer): void { registerAdministrationTools(server); registerCatalogTools(server); registerCommuneTools(server); registerCultureTools(server); registerEconomyTools(server); registerEducationTools(server); registerEmploymentTools(server); registerEnvironmentTools(server); registerFacilityTools(server); registerGeographyTools(server); registerHealthTools(server); registerHospitalityTools(server); registerHousingTools(server); registerNationalElectionsTools(server); registerPossessionTools(server); registerSocialTools(server); registerTelecomTools(server); registerTerritoryTools(server); registerTourismTools(server); registerTransportTools(server); registerUrbanismTools(server); registerWeatherTools(server); }