reunion_search_tourism_establishments
Search tourism establishments in La Réunion (hotels, restaurants, gîtes, activity providers, etc.) by type, commune, zone, or keyword. Returns commercial name, classification, address, payment methods, and tourist office.
Instructions
Search the SIT Soubik (Système d'Information Touristique) catalog for La Réunion: hotels, restaurants, gîtes, activity providers, leisure venues, tour operators, transport providers serving tourists. Returns commercial name, type, classification, commune, tourism zone (Nord/Sud/Est/Ouest/Cirques/Volcan), address, accepted payment methods, attached tourist office. For star-classified accommodations specifically, use reunion_search_classified_accommodations.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Establishment type prefix match. Examples: "Hôtel", "Restaurant", "Gîte", "Camping", "Activité de loisirs", "Office de tourisme" | |
| commune | No | Commune name prefix match | |
| zone | No | Tourism zone prefix match. Examples: "Nord", "Sud", "Est", "Ouest", "Cirques", "Volcan" | |
| query | No | Free-text search on commercial name and address | |
| limit | No | Max establishments to return (1-300, default 50) |
Implementation Reference
- src/modules/hospitality.ts:13-52 (registration)The registerHospitalityTools function registers the 'reunion_search_tourism_establishments' tool with the MCP server.
export function registerHospitalityTools(server: McpServer): void { server.tool( 'reunion_search_tourism_establishments', 'Search the SIT Soubik (Système d\'Information Touristique) catalog for La Réunion: hotels, restaurants, gîtes, activity providers, leisure venues, tour operators, transport providers serving tourists. Returns commercial name, type, classification, commune, tourism zone (Nord/Sud/Est/Ouest/Cirques/Volcan), address, accepted payment methods, attached tourist office. For star-classified accommodations specifically, use reunion_search_classified_accommodations.', { type: z.string().optional().describe('Establishment type prefix match. Examples: "Hôtel", "Restaurant", "Gîte", "Camping", "Activité de loisirs", "Office de tourisme"'), commune: z.string().optional().describe('Commune name prefix match'), zone: z.string().optional().describe('Tourism zone prefix match. Examples: "Nord", "Sud", "Est", "Ouest", "Cirques", "Volcan"'), query: z.string().optional().describe('Free-text search on commercial name and address'), limit: z.number().int().min(1).max(300).default(50).describe('Max establishments to return (1-300, default 50)'), }, async ({ type, commune, zone, query, limit }) => { try { const data = await client.getRecords<RecordObject>(DATASET_ESTABLISHMENTS, { where: buildWhere([ type ? `type LIKE ${quote(`${type}%`)}` : undefined, commune ? `commune LIKE ${quote(`${commune}%`)}` : undefined, zone ? `zone_touristique LIKE ${quote(`${zone}%`)}` : undefined, query ? `search(${quote(query)})` : undefined, ]), limit, }); return jsonResult({ total_establishments: data.total_count, establishments: data.results.map((row) => ({ name: pickString(row, ['nom_commercial']), type: pickString(row, ['type']), classification: pickString(row, ['classement']), commune: pickString(row, ['commune']), tourism_zone: pickString(row, ['zone_touristique']), address: pickString(row, ['adresse']), payment_methods: pickString(row, ['modes_de_paiement']), tourist_office: pickString(row, ['offices_de_tourisme']), })), }); } catch (error) { return errorResult(error instanceof Error ? error.message : 'Failed to search tourism establishments'); } } ); - src/modules/hospitality.ts:24-51 (handler)The async handler that queries OpenDataSoft dataset 'etablissements-touristiques-lareunion-wssoubik', applies filters, maps results to clean response fields.
async ({ type, commune, zone, query, limit }) => { try { const data = await client.getRecords<RecordObject>(DATASET_ESTABLISHMENTS, { where: buildWhere([ type ? `type LIKE ${quote(`${type}%`)}` : undefined, commune ? `commune LIKE ${quote(`${commune}%`)}` : undefined, zone ? `zone_touristique LIKE ${quote(`${zone}%`)}` : undefined, query ? `search(${quote(query)})` : undefined, ]), limit, }); return jsonResult({ total_establishments: data.total_count, establishments: data.results.map((row) => ({ name: pickString(row, ['nom_commercial']), type: pickString(row, ['type']), classification: pickString(row, ['classement']), commune: pickString(row, ['commune']), tourism_zone: pickString(row, ['zone_touristique']), address: pickString(row, ['adresse']), payment_methods: pickString(row, ['modes_de_paiement']), tourist_office: pickString(row, ['offices_de_tourisme']), })), }); } catch (error) { return errorResult(error instanceof Error ? error.message : 'Failed to search tourism establishments'); } } - src/modules/hospitality.ts:17-23 (schema)Zod schema for input parameters: type, commune, zone, query (optional strings), limit (1-300, default 50).
{ type: z.string().optional().describe('Establishment type prefix match. Examples: "Hôtel", "Restaurant", "Gîte", "Camping", "Activité de loisirs", "Office de tourisme"'), commune: z.string().optional().describe('Commune name prefix match'), zone: z.string().optional().describe('Tourism zone prefix match. Examples: "Nord", "Sud", "Est", "Ouest", "Cirques", "Volcan"'), query: z.string().optional().describe('Free-text search on commercial name and address'), limit: z.number().int().min(1).max(300).default(50).describe('Max establishments to return (1-300, default 50)'), }, - src/modules/hospitality.ts:9-9 (helper)Dataset constant 'etablissements-touristiques-lareunion-wssoubik' used as the data source.
const DATASET_ESTABLISHMENTS = 'etablissements-touristiques-lareunion-wssoubik'; - src/modules/index.ts:45-45 (registration)Central module registry call: registerHospitalityTools(server) is invoked from registerAllTools().
registerHospitalityTools(server);