MCP_indicators / README.md
Qdonnars's picture
revert: Rollback to Gradio 5.29 - Gradio 6.x breaks Claude Desktop MCP
24e859f
---
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