reunion_search_possession_health_pros
Find health professionals in La Possession with per-act fees, OPTAM rates, and reimbursement base to estimate out-of-pocket costs.
Instructions
Search health professionals practicing specifically in La Possession (commune in west Réunion), with posted fees per technical act. Unlike reunion_search_health_professionals which is directory-only, this returns the typical price per act, the secteur 1 OPTAM/OPTAM-CO rate, the off-OPTAM rate, and the social security reimbursement base. Useful to estimate out-of-pocket costs. Source: open data Mairie de La Possession via data.regionreunion.com.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| profession | No | Profession prefix match. Examples: "Médecin", "Dentiste", "Kinésithérapeute" | |
| act_family | No | Technical-act family prefix match. Examples: "Consultation", "Soins dentaires", "Imagerie" | |
| convention | No | Convention status prefix. Examples: "Secteur 1", "Secteur 2", "Non conventionné" | |
| limit | No | Max rows to return (1-300, default 50) |
Implementation Reference
- src/modules/health.ts:227-269 (handler)The handler function for the 'reunion_search_possession_health_pros' tool. It queries the 'professionnels-de-sante-a-la-possession' dataset on OpenDataSoft (data.regionreunion.com), filters by profession, act_family, and convention, and returns professional details including name, address, phone, convention status, act details, typical fee amounts, and reimbursement base.
server.tool( 'reunion_search_possession_health_pros', 'Search health professionals practicing specifically in La Possession (commune in west Réunion), with posted fees per technical act. Unlike reunion_search_health_professionals which is directory-only, this returns the typical price per act, the secteur 1 OPTAM/OPTAM-CO rate, the off-OPTAM rate, and the social security reimbursement base. Useful to estimate out-of-pocket costs. Source: open data Mairie de La Possession via data.regionreunion.com.', { profession: z.string().optional().describe('Profession prefix match. Examples: "Médecin", "Dentiste", "Kinésithérapeute"'), act_family: z.string().optional().describe('Technical-act family prefix match. Examples: "Consultation", "Soins dentaires", "Imagerie"'), convention: z.string().optional().describe('Convention status prefix. Examples: "Secteur 1", "Secteur 2", "Non conventionné"'), limit: z.number().int().min(1).max(300).default(50).describe('Max rows to return (1-300, default 50)'), }, async ({ profession, act_family, convention, limit }) => { try { const data = await client.getRecords<RecordObject>(DATASET_POSSESSION_PROS, { where: buildWhere([ profession ? `profession LIKE ${quote(`${profession}%`)}` : undefined, act_family ? `famille_de_l_acte_technique_realise LIKE ${quote(`${act_family}%`)}` : undefined, convention ? `convention_et_cas LIKE ${quote(`${convention}%`)}` : undefined, ]), limit, }); return jsonResult({ total_rows: data.total_count, professionals: data.results.map((row) => ({ name: pickString(row, ['nom_du_professionnel']), title: pickString(row, ['civilite']), profession: pickString(row, ['profession']), address: pickString(row, ['adresse']), commune: pickString(row, ['commune']), phone: pickString(row, ['numero_de_telephone']), convention: pickString(row, ['convention_et_cas']), sesam_vitale: pickString(row, ['sesam_vitale']), act_family: pickString(row, ['famille_de_l_acte_technique_realise']), act: pickString(row, ['acte_technique_realise']), typical_amount_eur: pickNumber(row, ['montant_generalement_constate']), sector_1_rate_eur: pickNumber(row, ['tarif_secteur_1_adherent_optam_optam_co']), off_sector_1_rate_eur: pickNumber(row, ['tarif_hors_secteur_1_hors_adherent_optam_optam_co']), reimbursement_base_eur: pickNumber(row, ['base_de_remboursement']), })), }); } catch (error) { return errorResult(error instanceof Error ? error.message : 'Failed to search Possession health pros'); } } ); - src/modules/health.ts:230-235 (schema)Input schema (validation) for the tool using Zod: profession (string, optional prefix match), act_family (string, optional prefix match), convention (string, optional prefix match), limit (integer 1-300, default 50).
{ profession: z.string().optional().describe('Profession prefix match. Examples: "Médecin", "Dentiste", "Kinésithérapeute"'), act_family: z.string().optional().describe('Technical-act family prefix match. Examples: "Consultation", "Soins dentaires", "Imagerie"'), convention: z.string().optional().describe('Convention status prefix. Examples: "Secteur 1", "Secteur 2", "Non conventionné"'), limit: z.number().int().min(1).max(300).default(50).describe('Max rows to return (1-300, default 50)'), }, - src/modules/health.ts:227-269 (registration)The tool is registered via the McpServer.tool() call inside registerHealthTools(), which is called from src/modules/index.ts line 44. The tool name is 'reunion_search_possession_health_pros' with description about searching La Possession health professionals with posted fees.
server.tool( 'reunion_search_possession_health_pros', 'Search health professionals practicing specifically in La Possession (commune in west Réunion), with posted fees per technical act. Unlike reunion_search_health_professionals which is directory-only, this returns the typical price per act, the secteur 1 OPTAM/OPTAM-CO rate, the off-OPTAM rate, and the social security reimbursement base. Useful to estimate out-of-pocket costs. Source: open data Mairie de La Possession via data.regionreunion.com.', { profession: z.string().optional().describe('Profession prefix match. Examples: "Médecin", "Dentiste", "Kinésithérapeute"'), act_family: z.string().optional().describe('Technical-act family prefix match. Examples: "Consultation", "Soins dentaires", "Imagerie"'), convention: z.string().optional().describe('Convention status prefix. Examples: "Secteur 1", "Secteur 2", "Non conventionné"'), limit: z.number().int().min(1).max(300).default(50).describe('Max rows to return (1-300, default 50)'), }, async ({ profession, act_family, convention, limit }) => { try { const data = await client.getRecords<RecordObject>(DATASET_POSSESSION_PROS, { where: buildWhere([ profession ? `profession LIKE ${quote(`${profession}%`)}` : undefined, act_family ? `famille_de_l_acte_technique_realise LIKE ${quote(`${act_family}%`)}` : undefined, convention ? `convention_et_cas LIKE ${quote(`${convention}%`)}` : undefined, ]), limit, }); return jsonResult({ total_rows: data.total_count, professionals: data.results.map((row) => ({ name: pickString(row, ['nom_du_professionnel']), title: pickString(row, ['civilite']), profession: pickString(row, ['profession']), address: pickString(row, ['adresse']), commune: pickString(row, ['commune']), phone: pickString(row, ['numero_de_telephone']), convention: pickString(row, ['convention_et_cas']), sesam_vitale: pickString(row, ['sesam_vitale']), act_family: pickString(row, ['famille_de_l_acte_technique_realise']), act: pickString(row, ['acte_technique_realise']), typical_amount_eur: pickNumber(row, ['montant_generalement_constate']), sector_1_rate_eur: pickNumber(row, ['tarif_secteur_1_adherent_optam_optam_co']), off_sector_1_rate_eur: pickNumber(row, ['tarif_hors_secteur_1_hors_adherent_optam_optam_co']), reimbursement_base_eur: pickNumber(row, ['base_de_remboursement']), })), }); } catch (error) { return errorResult(error instanceof Error ? error.message : 'Failed to search Possession health pros'); } } ); - src/utils/helpers.ts:36-41 (helper)buildWhere helper used to construct the ODSQL WHERE clause from filter conditions.
export function buildWhere( conditions: Array<string | undefined | null | false> ): string | undefined { const valid = conditions.filter((condition): condition is string => Boolean(condition)); return valid.length > 0 ? valid.join(' AND ') : undefined; } - src/utils/helpers.ts:53-55 (helper)quote helper used to safely quote string literals for ODSQL queries.
export function quote(value: string): string { return `'${escapeOdSqlString(value)}'`; }