Qdonnars's picture
Upload folder using huggingface_hub
dff63a3 verified
"""
MCP Server CEREMA — Données foncières et friches pour la transition écologique.
Point d'entrée Gradio exposant les tools MCP pour Sofia V2.
Les données (DV3F + Cartofriches) sont chargées en mémoire au démarrage.
Les friches sont pré-agrégées à toutes les mailles (commune, EPCI, département, région, national).
Endpoint MCP : http://localhost:7860/gradio_api/mcp/sse
Schema : http://localhost:7860/gradio_api/mcp/schema
"""
import logging
import gradio as gr
from data_loader import init_all
from server import (
rechercher_friches,
statistiques_prix_foncier,
evolution_prix,
statistiques_friches,
diagnostic_foncier_territoire,
)
# Configuration du logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
)
logger = logging.getLogger(__name__)
# --- Chargement des données au démarrage ---
logger.info("Démarrage du serveur MCP CEREMA...")
init_all()
logger.info("Données chargées. Construction de l'interface Gradio...")
# --- Interfaces Gradio pour chaque tool ---
# Tool 1 : Recherche de friches
iface_friches = gr.Interface(
fn=rechercher_friches,
inputs=[
gr.Textbox(label="Code INSEE commune", placeholder="ex: 13055, 59350, 75056"),
gr.Textbox(label="Code département", placeholder="ex: 13, 59, 75"),
gr.Dropdown(
label="Type de friche",
choices=["", "industrielle", "habitat", "commerciale", "ferroviaire",
"militaire", "hospitalière", "logistique", "agro-industrielle",
"équipement public", "carrière ou mine"],
value="",
),
gr.Number(label="Surface minimale (m²)", value=0),
gr.Dropdown(
label="Statut",
choices=["", "sans projet", "avec projet", "potentielle", "reconvertie"],
value="",
),
],
outputs=gr.Markdown(label="Résultats"),
title="Recherche de friches",
description="Recherche des friches disponibles sur un territoire (base Cartofriches du CEREMA).",
api_name="rechercher_friches",
)
# Tool 2 : Statistiques de prix foncier
iface_prix = gr.Interface(
fn=statistiques_prix_foncier,
inputs=[
gr.Textbox(label="Code INSEE commune", placeholder="ex: 13055, 59350"),
gr.Textbox(label="Code département", placeholder="ex: 13, 59"),
gr.Dropdown(
label="Type de bien",
choices=["tous", "maison", "appartement"],
value="tous",
),
gr.Textbox(label="Année", value="2024", placeholder="2010 à 2024"),
],
outputs=gr.Markdown(label="Résultats"),
title="Prix foncier",
description="Statistiques de prix et volumes de transactions immobilières (DV3F, CEREMA/DGFiP).",
api_name="statistiques_prix_foncier",
)
# Tool 3 : Évolution des prix
iface_evolution = gr.Interface(
fn=evolution_prix,
inputs=[
gr.Textbox(label="Code INSEE commune", placeholder="ex: 13055"),
gr.Textbox(label="Code département", placeholder="ex: 13"),
gr.Dropdown(
label="Type de bien",
choices=["maison", "appartement"],
value="maison",
),
],
outputs=gr.Markdown(label="Résultats"),
title="Évolution des prix",
description="Évolution temporelle des prix fonciers de 2010 à 2024 (DV3F, CEREMA/DGFiP).",
api_name="evolution_prix",
)
# Tool 4 : Statistiques agrégées de friches (multi-échelle)
iface_stats_friches = gr.Interface(
fn=statistiques_friches,
inputs=[
gr.Textbox(label="Code INSEE commune", placeholder="ex: 13055 — retourne aussi EPCI, département, région"),
gr.Textbox(label="Code SIREN EPCI", placeholder="ex: 200054807 (Aix-Marseille-Provence)"),
gr.Textbox(label="Code département", placeholder="ex: 13, 59"),
gr.Textbox(label="Code région", placeholder="ex: 93 (PACA), 32 (Hauts-de-France)"),
gr.Dropdown(
label="Échelle",
choices=["", "commune", "epci", "departement", "region", "national"],
value="",
),
],
outputs=gr.Markdown(label="Résultats"),
title="Statistiques friches (multi-échelle)",
description="Statistiques agrégées des friches : commune, EPCI, département, région ou national. "
"Si une commune est fournie, les stats aux échelles supérieures sont aussi affichées.",
api_name="statistiques_friches",
)
# Tool 5 : Diagnostic foncier territorial (multi-échelle)
iface_diagnostic = gr.Interface(
fn=diagnostic_foncier_territoire,
inputs=[
gr.Textbox(label="Code INSEE commune", placeholder="ex: 13055"),
gr.Textbox(label="Code SIREN EPCI", placeholder="ex: 200054807"),
gr.Textbox(label="Code département", placeholder="ex: 13"),
gr.Textbox(label="Code région", placeholder="ex: 93 (PACA)"),
],
outputs=gr.Markdown(label="Résultats"),
title="Diagnostic foncier",
description="Diagnostic complet croisant friches et marché foncier à toutes les échelles (Cartofriches + DV3F).",
api_name="diagnostic_foncier_territoire",
)
# --- Application Gradio combinée ---
demo = gr.TabbedInterface(
[iface_friches, iface_prix, iface_evolution, iface_stats_friches, iface_diagnostic],
tab_names=["🏗️ Friches", "💰 Prix foncier", "📈 Évolution prix",
"📊 Stats friches", "🔍 Diagnostic territorial"],
title="MCP CEREMA — Données foncières & friches pour la transition écologique",
)
if __name__ == "__main__":
demo.launch(
mcp_server=True,
server_name="0.0.0.0",
server_port=7860,
)