MCP Server for IGN API Carto - French geographic data services (cadastre, postal codes, RPG, nature, urban planning)
This MCP server demonstrates solid definition quality with well-structured tool schemas, clear descriptions, and comprehensive parameter documentation. All four tools are explicitly registered with Zod schemas, descriptions range from 150-350 characters (within the 10-1024 baseline), and parameters consistently include types and descriptions. Tool naming follows verb_noun conventions (ign_get_*). Pagination is properly handled with _limit and _start parameters. However, there are notable gaps: error handling is minimal (no recovery guidance, categorization, or actionable error messages visible in the code), and output schemas are documented in descriptions but not formally returned as structured types, responses are converted to text only. The composition is sound (each tool has one clear responsibility), and tool annotations are present and correct. Security is adequate for read-only operations with no credentials exposed. The main limitation is that response data is truncated and formatted as text/markdown or JSON strings rather than structured objects, which forces LLMs to re-parse responses.
Get commune (municipality) boundaries from the cadastral database. Args: - geom (string, optional): GeoJSON geometry to intersect - code_insee (string, optional): INSEE commune code - code_dep (string, optional): Department code - _limit (number): Max results (default 500) - _start (number): Pagination offset Returns: GeoJSON FeatureCollection with commune boundaries.
Search for cadastral parcels (land plots) in France. This tool queries the IGN API Carto cadastre module to find parcels by geometry intersection or administrative codes. Useful for property identification, urban planning, and administrative procedures. Args: - geom (string, optional): GeoJSON geometry to intersect - code_insee (string, optional): INSEE commune code (5 digits) - code_dep (string, optional): Department code (2-3 digits) - code_com (string, optional): Commune code within department (3 digits) - section (string, optional): Cadastral section (2 characters) - numero (string, optional): Parcel number - source (string): Data source - 'pci' (PCI Express, recommended) or 'bdparcellaire' - _limit (number): Max results (1-1000) - _start (number): Pagination offset Returns: GeoJSON FeatureCollection with parcel geometries and properties including: - numero: Parcel number - feuille: Sheet number - section: Cadastral section - code_dep, code_com, com_abs, code_arr - geometry: MultiPolygon Examples: - "Find parcels in commune 75101" -> code_insee="75101" - "Get parcel AB-0001 in section AB" -> section="AB", numero="0001"
Retrieve French communes (municipalities) associated with a postal code. This tool queries the IGN API Carto codes-postaux module to find all communes that share a given postal code. In France, a postal code can cover multiple communes, and this tool returns all of them. Args: - code_postal (string): French postal code (5 digits, e.g. "75001", "69000") - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For JSON format: [ { "codePostal": "75001", "codeCommune": "75101", "nomCommune": "Paris 1er Arrondissement", "libelleAcheminement": "PARIS" } ] Examples: - "What communes are in postal code 75001?" -> code_postal="75001" - "Find cities for zip 69000" -> code_postal="69000"
Error handling lacks recovery guidance and categorization. The code catches errors but provides no actionable guidance to the LLM on whether to retry, ask the user, or fail gracefully. No visible error classification (retryable vs user-fixable vs fatal) in handler logic.
Output schema documentation is embedded in descriptions but responses are returned as plain text strings (JSON.stringify or markdown), not as structured objects. LLMs must re-parse responses instead of consuming typed fields directly. This violates the 'return structured objects with typed fields' baseline.
Result truncation via CHARACTER_LIMIT (source code imports truncateResponse) may silently drop data without notifying the LLM that output was incomplete. No pagination hint or continuation marker in truncated responses. If data is truncated, the LLM has no way to request the remaining portion.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 74 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Query the Registre Parcellaire Graphique (RPG) for agricultural parcel information. The RPG contains agricultural land use data declared by farmers for CAP (Common Agricultural Policy) subsidies. Two versions exist: - V1 (2010-2014): Anonymous farm blocks (îlots) - V2 (2015+): Graphic parcels with crop information Args: - annee (number): Year of data (2010-2024) - geom (string): GeoJSON geometry (required) - code_cultu (string, optional): Crop culture code filter - _limit (number): Max results - _start (number): Pagination offset Returns: GeoJSON FeatureCollection with: - V1: num_ilot, commune, surf_decla, code_cultu, nom_cultu - V2: id_parcel, surf_parc, code_cultu, code_group, culture_d1, culture_d2 Examples: - "Find crops at this location in 2023" -> annee=2023, geom={"type":"Point",...}
Tool descriptions for ign_get_cadastre_communes are minimal (only 169 characters) compared to others (280-350 chars). The description does not explain when to use this tool vs the more detailed parcelle tool, or what a boundary query differs from a parcel query. Lacks WHEN/WHY context per pattern:tool-description.
No explicit dry-run or confirmation pattern for tools that interact with external APIs. While these are read-only (lower risk), the annotation shows idempotentHint=true but there is no visible confirmation mechanism if LLM accidentally calls multiple times.