Spaces:
Running
Running
File size: 8,430 Bytes
b90d5d5 24e859f b90d5d5 bad6218 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | ---
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
|