Skip to main content
Glama

georef-mcp

An MCP server that gives AI agents access to Argentina's official geographic data through the public Georef API.

Normalizá direcciones y buscá provincias, departamentos, municipios y localidades de Argentina desde tu agente.

Georef (Servicio de Normalización de Datos Geográficos de Argentina) is a free public API from the Argentine government's open data team (datos.gob.ar). It normalizes free-text place names and street addresses into official names, INDEC ids and coordinates. No API key is needed.

Tools

All tools are read-only (readOnlyHint: true) and call an external service (openWorldHint: true).

Tool

Georef endpoint

Inputs

Returns

search_provinces

/provincias

nombre?, max

name, id, centroid

search_departments

/departamentos

nombre?, provincia?, max

name, id, province, centroid

search_municipalities

/municipios

nombre?, provincia?, max

name, id, province, centroid

search_localities

/localidades

nombre, provincia?, departamento?, max

name, id, department, province, centroid

normalize_address

/direcciones

direccion, provincia?, departamento?, localidad?, max

official address, street id, coordinates

reverse_geocode

/ubicacion

lat, lon

province, department, municipality

max is bounded to 1–50. Filters accept a name (accents optional) or an INDEC id. Text output is one compact line per result; the full Georef objects are in structuredContent. Empty results come back as a normal result with a hint on what to try; upstream errors (4xx/5xx, timeouts) come back as isError: true with Georef's own message and a suggestion.

Related MCP server: Magic Lane MCP Server

Install

Requires Node.js 20 or newer.

git clone https://github.com/diego-prieri/georef-mcp && cd georef-mcp
npm install
npm run build
claude mcp add georef -- node /absolute/path/to/georef-mcp/dist/index.js

Any MCP client that launches stdio servers works the same way: run node dist/index.js.

Optional environment variable:

  • GEOREF_BASE_URL: point at a self-hosted Georef instance (default https://apis.datos.gob.ar/georef/api/).

Example prompts

  • "normalizá 'av corrientes 1234 caba'"

  • "What province and municipality is -31.4201, -64.1888 in?"

  • "List the departments of Mendoza with their ids."

  • "Is there a locality called San Martín in Buenos Aires province? Give me the coordinates."

  • "Find the municipality of Rosario and its INDEC code."

Development

npm test            # in-memory client ↔ server tests, no network
npm run test:live   # smoke test against the real API (GEOREF_LIVE=1)
npm run typecheck
npm run inspect     # MCP Inspector
src/
  backend.ts        GeorefBackend interface + HttpGeorefBackend (fetch) + FakeGeorefBackend
  tools/georef.ts   Tool definitions: zod inputs, annotations, ok()/fail() results
  server.ts         createServer(backend), no transport
  index.ts          stdio entry point
test/
  server.test.ts    Every tool, validation, empty results, upstream failures
  live.test.ts      Optional live smoke test

Data attribution and licence

The data is served by the Georef API, published by the Argentine government's open data team (Dirección Nacional de Datos e Información Pública). According to the Georef data documentation, the sources are:

  • Provinces, departments, municipalities and /ubicacion: Instituto Geográfico Nacional (IGN)

  • Localities: Base de Asentamientos Humanos de la República Argentina (BAHRA)

  • Streets and addresses: Instituto Nacional de Estadística y Censos (INDEC)

The dataset Servicio de normalización de direcciones y unidades territoriales de Argentina on datos.gob.ar is licensed under Creative Commons Attribution 4.0 (CC BY 4.0). If you publish results obtained through this server, credit the sources above. The Georef API code itself is MIT-licensed.

This project is not affiliated with or endorsed by the Argentine government. The public API has usage quotas; please be considerate with request volume.

License

MIT (this server's code). See LICENSE.

Available Tools

6 tools
normalize_addressNormalize addressA
Read-onlyIdempotent

Normalize a free-text street address ("street number", e.g. "av corrientes 1234") into its official form with street id, department, province and coordinates. Pass provincia (and optionally departamento or localidad) to disambiguate: the same street name exists in many cities.

NameRequiredDescriptionDefault
maxNoMaximum results to return (1–50)
direccionYesStreet and number, e.g. "Av. Corrientes 1234". Do not include the city; use the filters.
localidadNoLocality name or id, e.g. "Tandil"
provinciaNoProvince name or id to filter by, e.g. "Córdoba", "caba" or "14"
departamentoNoDepartment name or id, e.g. "Comuna 1"

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond them: matches can be ambiguous and the tool may return several candidates, which is why the disambiguation filters matter. It doesn't say what happens on zero matches, keeping it below a 5.

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

Conciseness5/5

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

Two sentences: the first front-loads what the tool does and returns, the second delivers the disambiguation rule. No filler, nothing buried.

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

Completeness5/5

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

For a 5-parameter, single-required-arg read tool with full schema coverage, the description covers input intent, ambiguity handling, and return content (ids, administrative hierarchy, coordinates). No output schema is needed because the description already states what comes back.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns extra credit by explaining the rationale behind the provincia/departamento/localidad filters rather than just restating them. It adds no new detail on 'max', which the schema already documents.

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?

States a specific verb+resource (normalize a free-text street address) and spells out the output shape: street id, department, province and coordinates. That forward-geocoding framing inherently distinguishes it from reverse_geocode and from the search_* administrative lookups.

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?

Gives an explicit conditional: pass provincia, and optionally departamento or localidad, to disambiguate because the same street name recurs across cities. It stops short of naming alternatives (e.g. when to call search_localities first to resolve an id), so it lacks full when-not guidance.

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

reverse_geocodeReverse geocodeA
Read-onlyIdempotent

Find the province, department and municipality that contain a WGS84 point (lat, lon). Only points inside Argentina resolve.

NameRequiredDescriptionDefault
latYesLatitude in decimal degrees, e.g. -34.6037
lonYesLongitude in decimal degrees, e.g. -58.3816

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description's genuinely additive piece is the Argentina coverage limit, but it does not disclose whether an out-of-coverage point yields an error, null, or empty result — the main behavioral unknown for this tool.

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

Conciseness5/5

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

Two sentences, no filler, with the core operation front-loaded and the coverage caveat immediately after. Every sentence earns its place.

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?

With no output schema, the description correctly assumes responsibility for naming the returned fields (province, department, municipality). What remains uncovered is failure behavior outside Argentina, which an agent would need to handle the common error path.

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

Parameters4/5

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

Schema coverage is 100%, with ranges and example values already documented, so baseline would be 3. The description adds the coordinate datum (WGS84), which is real information the schema does not state and matters for correct input formatting.

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?

The description uses a specific verb+resource pairing ("find the province, department and municipality that contain a WGS84 point") and names the three administrative levels returned. This is immediately distinguishable from the sibling search_* tools, which are forward lookups rather than point-in-polygon resolution.

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?

"Only points inside Argentina resolve" gives a clear scope boundary that tells the agent when this tool will not work, which is strong usage context. It stops short of naming alternatives (e.g., use normalize_address for street addresses) or stating what to do for out-of-scope coordinates.

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

search_departmentsSearch departmentsA
Read-onlyIdempotent

Search departments (partidos in Buenos Aires, comunas in CABA) by name and/or province.

NameRequiredDescriptionDefault
maxNoMaximum results to return (1–50)
nombreNoDepartment name, e.g. "Capital"
provinciaNoProvince name or id to filter by, e.g. "Córdoba", "caba" or "14"

TDQS

A4.2/5.0
Behavior4/5

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

The annotations (readOnlyHint: true, destructiveHint: false) already provide robust safety information. The description adds the specific scope of the data (local administrative divisions), which is contextually helpful.

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

Conciseness5/5

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

The description is extremely concise, managing to convey the 'what' (search departments), the 'how' (by name/province), and the 'where' (Buenos Aires/CABA context) in a single, efficient sentence.

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?

Given that the annotations cover safety and the schema covers data constraints (max results), the description is complete. It adds critical regional nuance that the structured fields cannot convey.

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 description coverage is 100%, so the description provides no novel semantic information. It successfully lists the main search targets ('name and/or province'), but this is largely covered by the 'nombre' and 'provincia' fields in the 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?

The description explicitly states the tool's purpose: 'Search departments'. It also provides extremely valuable context regarding specific regional names (partidos in Buenos Aires, comunas in CABA), which distinguishes it from generic geographical searches.

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?

It clearly lists the criteria for searching ('by name and/or province'), which guides the user on how the search function works. It is implicitly distinct from sibling tools because of its focus on 'departments' rather than 'provinces' or 'localities'.

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

search_localitiesSearch localitiesA
Read-onlyIdempotent

Search localities (cities, towns, settlements from the BAHRA dataset) by name, optionally within a province and department.

NameRequiredDescriptionDefault
maxNoMaximum results to return (1–50)
nombreYesLocality name, e.g. "Tandil"
provinciaNoProvince name or id to filter by, e.g. "Córdoba", "caba" or "14"
departamentoNoDepartment name or id to filter by

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds the dataset provenance, which is mild context, but says nothing about result truncation, ranking, or matching behavior (exact vs partial name match).

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

Conciseness5/5

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

A single front-loaded sentence with the resource, source dataset, primary key, and optional filters; no wasted words.

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?

For a simple 4-parameter read-only search with full schema coverage and no output schema, the description covers what the tool does and its filter scope. The only real gap is sibling disambiguation against search_municipalities.

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% with examples for nombre and provincia, so the schema does the heavy lifting. The description only restates the name/province/department filters and omits the 'max' result-count parameter entirely, adding little beyond structured fields.

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

Purpose4/5

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

States a specific verb (search) and resource (localities), and disambiguates the resource as cities/towns/settlements from the BAHRA dataset. It does not differentiate from the very similar sibling search_municipalities, which an agent would need to choose between.

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

Usage Guidelines3/5

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

"Optionally within a province and department" implies when the filter parameters are useful, but there is no explicit guidance on when to use this rather than search_municipalities or search_departments, nor any prerequisites.

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

search_municipalitiesSearch municipalitiesB
Read-onlyIdempotent

Search municipalities (local governments) by name and/or province.

NameRequiredDescriptionDefault
maxNoMaximum results to return (1–50)
nombreNoMunicipality name, e.g. "Rosario"
provinciaNoProvince name or id to filter by, e.g. "Córdoba", "caba" or "14"

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds nothing beyond the search fields themselves — no mention of result limits, pagination, or what happens when filters are omitted.

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

Conciseness5/5

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

A single front-loaded sentence with zero waste; the core action and its filter dimensions come first.

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?

For a simple, fully annotated, zero-required-parameter search with no output schema, the definition is largely sufficient. The one meaningful gap is routing guidance against its three sibling search tools, which the description doesn't address.

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 description coverage is 100%, so each parameter (max, nombre, provincia) is already documented with examples and bounds. The description only echoes the name and province filters and omits the max limit, so it adds no meaning beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Search municipalities') and clarifies scope with '(local governments)'. However, it offers no differentiation from the closely related search_provinces, search_departments, and search_localities siblings.

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

Usage Guidelines2/5

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

The description implies a name/province lookup but never states when to use this tool versus the sibling search tools, nor any prerequisites or exclusions. An agent must infer the routing decision from names alone.

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

search_provincesSearch provincesA
Read-onlyIdempotent

Search Argentina's 24 provinces (including CABA) by name. Omit nombre to list them all. Returns official name, INDEC id and centroid.

NameRequiredDescriptionDefault
maxNoMaximum results to return (1–50)
nombreNoProvince name, accents optional, e.g. "cordoba"

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuine value by disclosing the return fields (official name, INDEC id, centroid) and the list-vs-filter behavior. Pagination/ordering remains undisclosed, which keeps it below a 5.

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

Conciseness5/5

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

Three short sentences, front-loaded with scope, then the filter behavior, then the return payload. No filler whatsoever.

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?

With only two optional parameters, full annotation coverage, and the return fields spelled out in the description (no output schema exists), an agent has everything needed to call it correctly. Minor omission: no statement of ordering or how max interacts with the 24-item result set.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. The description adds meaning beyond the schema by explaining the consequence of omitting nombre (returns the full list) and indicating that name matching is accent-tolerant is reinforced in the schema example.

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

Purpose4/5

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

States a specific verb and resource with precise scope: "Search Argentina's 24 provinces (including CABA) by name." The resource granularity (provinces vs. departments/municipalities/localities in the sibling set) makes it distinguishable without opening the schema, though no sibling is named explicitly.

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?

"Omit nombre to list them all" gives clear operational guidance for the two modes of use. There is no explicit statement of when to prefer this over search_departments or search_localities, so it falls short of full alternatives coverage.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observednormalize_address
    • First observedreverse_geocode
    • First observedsearch_departments
    • First observedsearch_localities
    • First observedsearch_municipalities
    • First observedsearch_provinces

TDQS

A4.1/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct geographic operation or administrative level: province, department, municipality, locality, address normalization, and reverse geocoding. Although departments, municipalities, and localities are hierarchically related, their descriptions clearly distinguish them and prevent likely misselection.

Naming Consistency5/5

All tool names consistently use snake_case with a clear verb_noun or operation pattern: search_provinces, search_departments, search_municipalities, search_localities, normalize_address, reverse_geocode. The naming is predictable and readable.

Tool Count5/5

Six tools is well-scoped for a focused Argentine georeferencing server. Each tool covers a distinct lookup or geocoding operation without unnecessary redundancy.

Completeness4/5

The surface covers the core workflows: searching administrative units, normalizing addresses, and reverse geocoding coordinates. Minor gaps exist, such as no dedicated street-name search or batch geocoding, but agents can work around these through normalize_address.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables LLM clients to convert addresses to coordinates (forward geocoding), coordinates to addresses (reverse geocoding), and lookup Google Place IDs using the Google Maps Geocoding API with support for multiple languages and advanced filtering.
    3
    5 npm
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI agents to become geospatially intelligent assistants with tools for location search, smart routing, round trip planning, reverse geocoding, isochrone analysis, route visualization, geofence management, and interactive map display.
    8
    13 npm
    7
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides AI assistants with live, authenticated access to official Mexican data sources including CURP, RFC, postal codes, phone numbers, SPEI payments, CFDI status, DOF semantic search, and geocoding via INEGI/INE.
    MIT