Skip to main content
Glama
Hug0x0

mcp-reunion

reunion_search_bal_possession

Find detailed addresses in La Possession's official address registry, including local place names, cadastral parcels, and last update timestamps. Returns precise coordinates and identifiers.

Instructions

Search the Base Adresse Locale (BAL) published directly by the Commune of La Possession (west Réunion). BALs are commune-level address registries that feed BAN. This dataset is more granular than BAN for Possession addresses, including local lieux-dits, cadastral parcels, and last-update timestamps. Returns UID, interop key, street name, lieu-dit complement, suffix, longitude, latitude, cadastral parcels, last update.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryNoFree-text search on the address fields
streetNoStreet name prefix match (e.g. "Rue de", "Chemin")
limitNoMax addresses to return (1-100, default 20)

Implementation Reference

  • The tool handler for 'reunion_search_bal_possession' — defines the async callback that queries the 'bal-la-possession' dataset via the ReunionClient, with optional 'query' and 'street' filters, and returns mapped address fields (uid, interop_key, street, lieu_dit, suffix, longitude, latitude, parcels, last_update).
    server.tool(
      'reunion_search_bal_possession',
      'Search the Base Adresse Locale (BAL) published directly by the Commune of La Possession (west Réunion). BALs are commune-level address registries that feed BAN. This dataset is more granular than BAN for Possession addresses, including local lieux-dits, cadastral parcels, and last-update timestamps. Returns UID, interop key, street name, lieu-dit complement, suffix, longitude, latitude, cadastral parcels, last update.',
      {
        query: z.string().optional().describe('Free-text search on the address fields'),
        street: z.string().optional().describe('Street name prefix match (e.g. "Rue de", "Chemin")'),
        limit: z.number().int().min(1).max(100).default(20).describe('Max addresses to return (1-100, default 20)'),
      },
      async ({ query, street, limit }) => {
        try {
          const data = await client.getRecords<RecordObject>(DATASET_BAL_POSSESSION, {
            where: buildWhere([
              query ? `search(${quote(query)})` : undefined,
              street ? `voie_nom LIKE ${quote(`${street}%`)}` : undefined,
            ]),
            limit,
          });
          return jsonResult({
            total_addresses: data.total_count,
            addresses: data.results.map((row) => ({
              uid: pickString(row, ['uid_adresse']),
              interop_key: pickString(row, ['cle_interop']),
              street: pickString(row, ['voie_nom']),
              lieu_dit: pickString(row, ['lieudit_complement_nom']),
              suffix: pickString(row, ['suffixe']),
              longitude: pickNumber(row, ['longitude']),
              latitude: pickNumber(row, ['latitude']),
              parcels: pickString(row, ['cad_parcelles']),
              last_update: pickString(row, ['date_der_maj']),
            })),
          });
        } catch (error) {
          return errorResult(error instanceof Error ? error.message : 'Failed to search BAL Possession');
        }
      }
    );
  • Input schema definition for the tool using Zod — accepts optional 'query' (string), 'street' (string), and 'limit' (integer, 1-100, default 20).
    {
      query: z.string().optional().describe('Free-text search on the address fields'),
      street: z.string().optional().describe('Street name prefix match (e.g. "Rue de", "Chemin")'),
      limit: z.number().int().min(1).max(100).default(20).describe('Max addresses to return (1-100, default 20)'),
    },
  • Registration call — registerGeographyTools is called from registerAllTools, which is invoked in src/index.ts on server startup.
    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);
    }
  • Dataset constant DATASET_BAL_POSSESSION = 'bal-la-possession' used by the tool to query the correct OpenDataSoft dataset.
    const DATASET_BAL_POSSESSION = 'bal-la-possession';
    const DATASET_COMMUNES = 'communes-millesime-france';
    const DATASET_CANTONS = 'cantons-millesime-france';
    const DATASET_EPCI = 'intercommunalites-millesime-france';
    const DATASET_IRIS = 'iris-millesime-france';
    const DATASET_SAINT_DENIS_QUARTERS = 'les-20-quartiers-villesaintdenis';
    
    export function registerGeographyTools(server: McpServer): void {
      server.tool(
        'reunion_search_ban_addresses',
        'Search the Base Adresse Nationale (BAN) — France\'s authoritative geocoded address database — restricted to La Réunion (~353k addresses). Each address has lat/lon, street name, number, postal code, INSEE code, and a position type (entrance, parcel, segment). Use this for geocoding, address validation, last-mile delivery, mapping. Source: IGN / La Poste / DINUM via data.regionreunion.com.',
        {
          query: z.string().optional().describe('Free-text search across street name and city'),
          commune: z.string().optional().describe('Commune name prefix match (e.g. "Saint-Denis")'),
          insee: z.number().int().optional().describe('INSEE commune code (5 digits as integer, e.g. 97411 for Saint-Denis)'),
          postal_code: z.number().int().optional().describe('Postal code as integer (5 digits, Réunion uses 974xx)'),
          limit: z.number().int().min(1).max(100).default(20).describe('Max addresses to return (1-100, default 20)'),
        },
        async ({ query, commune, insee, postal_code, limit }) => {
          try {
            const data = await client.getRecords<RecordObject>(DATASET_BAN, {
              where: buildWhere([
                query ? `search(${quote(query)})` : undefined,
                commune ? `nom_commune LIKE ${quote(`${commune}%`)}` : undefined,
                insee !== undefined ? `code_insee = ${insee}` : undefined,
                postal_code !== undefined ? `code_postal = ${postal_code}` : undefined,
              ]),
              limit,
            });
            return jsonResult({
              total_addresses: data.total_count,
              addresses: data.results.map((row) => ({
                number: pickNumber(row, ['numero']),
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes return fields and includes specifics like local lieux-dits, cadastral parcels, and timestamps. Does not mention pagination or rate limits, but overall behavior is well explained. No annotations to contradict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Packed with useful information in a few sentences. Could be slightly trimmed but remains clear and front-loaded with purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Good coverage for a 3-param tool with no output schema: explains return fields, data source, and differentiation. Adequate for an agent to decide and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds slight context (e.g., 'free-text search', 'prefix match') but does not significantly enrich beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it searches the BAL for La Possession, explains what BAL is and its granularity compared to BAN, and lists returned fields. Distinct from sibling tools like reunion_search_ban_addresses.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context for when to use (for more granular addresses in La Possession) but does not explicitly mention alternatives or exclusions. Sibling tool list includes BAN search, so implication is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Hug0x0/mcp-reunion'

If you have feedback or need assistance with the MCP directory API, please join our Discord server