--- title: MCP Indicators emoji: 📉 colorFrom: blue colorTo: pink sdk: gradio sdk_version: 5.29.0 app_file: app.py pinned: false --- # MCP Server - Indicateurs Territoriaux de Transition Écologique Serveur MCP (Model Context Protocol) exposant l'API du **Hub d'Indicateurs Territoriaux de Transition Écologique** (CGDD/Ministère de la Transition Écologique). Ce serveur permet à des LLMs (Claude, GPT, etc.) d'interroger les données environnementales territoriales françaises. ## Outils MCP disponibles ### 1. `list_indicators` Liste tous les indicateurs avec filtres optionnels. **Paramètres :** - `thematique` (optionnel) : Filtre par thématique FNV ("mieux se déplacer", "mieux se loger"...) - `maille` (optionnel) : Filtre par niveau géographique ("region", "departement", "epci", "commune") ### 2. `get_indicator_details` Retourne les détails complets d'un indicateur (description, méthode de calcul, sources). **Paramètres :** - `indicator_id` : ID numérique de l'indicateur ### 3. `query_indicator_data` Interroge les données d'un indicateur pour un territoire. **Paramètres :** - `indicator_id` : ID de l'indicateur - `geographic_level` : "region" | "departement" | "epci" | "commune" - `geographic_code` (optionnel) : Code INSEE du territoire - `year` (optionnel) : Année des données ### 4. `search_indicators` Recherche d'indicateurs par mots-clés. **Paramètres :** - `query` : Termes de recherche (recherche dans libellé et description) ## Installation ### Prérequis - Python >= 3.10 - Un token d'authentification pour l'API Indicateurs ### Installation locale ```bash # Cloner le dépôt git clone https://github.com/your-repo/mcp-indicateurs-te.git cd mcp-indicateurs-te # Créer un environnement virtuel python -m venv venv source venv/bin/activate # Linux/Mac # ou: venv\Scripts\activate # Windows # Installer les dépendances pip install -r requirements.txt # Configurer le token cp .env.example .env # Éditer .env et ajouter votre token INDICATEURS_TE_TOKEN # Lancer le serveur python app.py ``` Le serveur sera accessible sur `http://localhost:7860`. ### Déploiement HuggingFace Spaces 1. Créer un nouveau Space avec le SDK Gradio 2. Pousser le code vers le Space 3. Configurer le secret `INDICATEURS_TE_TOKEN` dans les paramètres du Space ## Configuration MCP Client ### Claude Desktop Ajouter dans `claude_desktop_config.json` : ```json { "mcpServers": { "indicateurs-te": { "url": "https://YOUR-SPACE.hf.space/gradio_api/mcp/" } } } ``` ### Cursor Ajouter dans les paramètres MCP de Cursor : ```json { "mcpServers": { "indicateurs-te": { "url": "http://localhost:7860/gradio_api/mcp/" } } } ``` ### Avec mcp-remote (pour clients ne supportant pas HTTP) ```json { "mcpServers": { "indicateurs-te": { "command": "npx", "args": [ "mcp-remote", "http://localhost:7860/gradio_api/mcp/" ] } } } ``` ## Architecture de l'API (validée par tests) ### Convention de nommage des cubes Les cubes de **données** suivent le format : `{thematique}_{maille}` | Suffixe | Maille | |---------|--------| | `_com` | Commune | | `_epci` | EPCI | | `_dpt` | Département | | `_reg` | Région | Exemples : - `conso_enaf_com` → Consommation ENAF, maille commune - `surface_bio_dpt` → Surface bio, maille département ### Les measures contiennent l'ID de l'indicateur Format : `{cube_name}.id_{indicator_id}` Exemples : - `conso_enaf_com.id_611` → Indicateur 611 dans le cube conso_enaf_com - `surface_bio_dpt.id_606` → Indicateur 606 dans le cube surface_bio_dpt ### Dimensions géographiques (standardisées) | Dimension | Description | |-----------|-------------| | `geocode_commune` | Code INSEE commune (5 chiffres) | | `libelle_commune` | Nom de la commune | | `geocode_epci` | Code SIREN EPCI (9 chiffres) | | `libelle_epci` | Nom de l'EPCI | | `geocode_departement` | Code département (2-3 car.) | | `libelle_departement` | Nom du département | | `geocode_region` | Code région (2 chiffres) | | `libelle_region` | Nom de la région | ### Dimensions temporelles | Dimension | Description | |-----------|-------------| | `annee` | Année (string : "2020") | ## Exemples d'utilisation ### Via un LLM ``` Utilisateur: Quels indicateurs sur la consommation d'espace ? LLM: [appelle search_indicators("consommation espace")] Voici les indicateurs disponibles : - ID 611: Consommation d'espaces naturels, agricoles et forestiers Utilisateur: Détails sur l'indicateur 611 LLM: [appelle get_indicator_details("611")] L'indicateur 611 mesure la consommation d'ENAF... Mailles disponibles: commune, epci, departement, region Utilisateur: Valeurs pour la région PACA en 2020 LLM: [appelle query_indicator_data("611", "region", "93", "2020")] Pour PACA (code 93) en 2020 : 1737.29 ha ``` ### Exemple de requête Cube.js validée ```json { "query": { "measures": ["conso_enaf_com.id_611"], "dimensions": [ "conso_enaf_com.libelle_region", "conso_enaf_com.annee" ], "filters": [ { "member": "conso_enaf_com.geocode_region", "operator": "equals", "values": ["93"] } ], "limit": 100 } } ``` ## Codes géographiques INSEE | Niveau | Format | Exemples | |--------|--------|----------| | Région | 2 chiffres | 93 (PACA), 11 (Île-de-France), 75 (Nouvelle-Aquitaine), 84 (Auvergne-Rhône-Alpes) | | Département | 2-3 caractères | 13, 2A, 974 | | EPCI | 9 chiffres (SIREN) | 200054807 | | Commune | 5 chiffres | 75056 (Paris), 13055 (Marseille) | ## Variables d'environnement | Variable | Description | Défaut | |----------|-------------|--------| | `INDICATEURS_TE_TOKEN` | Token JWT pour l'API | (requis) | | `INDICATEURS_TE_BASE_URL` | URL de base de l'API | `https://api.indicateurs.ecologie.gouv.fr` | | `CACHE_REFRESH_SECONDS` | Intervalle de rafraîchissement du cache | 3600 | ## Architecture technique ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ MCP Client │────▶│ Gradio App │────▶│ Cube.js API │ │ (Claude, etc.) │ │ (MCP Server) │ │ (Indicateurs) │ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ ┌──────┴──────┐ │ CubeResolver │ │ + Cache │ └─────────────┘ ``` - **Gradio** : Interface web + endpoint SSE MCP - **CubeResolver** : Mapping indicator_id → cube_name via parsing /meta - **Cache** : Métadonnées des indicateurs chargées au démarrage ## Structure du projet ``` ├── src/ │ ├── __init__.py # Package init │ ├── api_client.py # Client HTTP Cube.js async │ ├── cube_resolver.py # Logique find_cube_for_indicator │ ├── cache.py # Cache des métadonnées │ ├── models.py # Modèles Pydantic │ └── tools.py # Implémentation des 4 outils MCP ├── app.py # Point d'entrée Gradio ├── requirements.txt # Dépendances └── .env.example # Template de configuration ``` ## Développement ### Test avec MCP Inspector ```bash # Lancer le serveur python app.py # Dans un autre terminal npx @modelcontextprotocol/inspector # Connecter à http://localhost:7860/gradio_api/mcp/ ``` ### Points d'attention 1. **Cache du /meta** : ~100+ cubes, chargé une fois au startup 2. **Mapping indicator_id → cube** : Parcours des measures de chaque cube 3. **Mailles non uniformes** : Vérifier `mailles_disponibles` avant de requêter 4. **Valeurs string** : Les filtres Cube.js attendent des strings (`"93"` pas `93`) ## Ressources - [Documentation MCP](https://modelcontextprotocol.io/) - [Gradio MCP Guide](https://gradio.app/guides/building-mcp-server-with-gradio) - [API Cube.js](https://cube.dev/docs/rest-api) - [Portail Indicateurs](https://ecologie.data.gouv.fr/indicators) ## Licence MIT