Serveur MCP — Vue d'ensemble
Le serveur MCP Normi expose 33 outils DVF, DPE, BDNB, ANIL et SIRENE via le protocole Model Context Protocol (HTTP Streamable). Branchez-le à claude.ai, ChatGPT, Claude Desktop, Claude Code, Cline ou tout client MCP compatible.
Connexion
https://mcp.normi.fr/mcpAuthorization: Bearer VOTRE_TOKENAvec un client compatible OAuth, collez simplement l'URL : le serveur répond 401 avec un en-tête WWW-Authenticate, le client vous envoie vous connecter à Normi et autoriser l'accès, puis appelle les outils avec le jeton obtenu. Les crédits sont débités sur la clé API active de votre compte. Détails
Le serveur ne maintient aucun état entre les requêtes : chaque appel est indépendant. Votre client peut appeler initialize comme d'habitude, mais rien n'est requis avant un tools/call — et il n'y a pas de mcp-session-id à conserver entre deux appels.
Exemple d'initialisation
Requête
curl -X POST https://mcp.normi.fr/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer normi_votre_token" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "mon-agent", "version": "1.0.0" }
}
}'Réponse
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-06-18",
"capabilities": {
"tools": {},
"prompts": {}
},
"serverInfo": {
"name": "Normi-MCP",
"version": "1.0.0"
}
}
}Appel d'outil
curl -X POST https://mcp.normi.fr/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer normi_votre_token" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "analyze_market_statistics",
"arguments": {
"code_postal": "75011",
"type_local": "Appartement"
}
}
}'Les 33 outils MCP
| Outil | Crédits | Description |
|---|---|---|
| resolve_location | 1 crédits | Résoudre une localisation libre en filtres canoniques |
| search_property_transactions | 5 crédits | Recherche transactions DVF avec filtres |
| analyze_market_statistics | 5 crédits | Stats agrégées : médiane, prix/m², volume |
| analyze_purchasing_power | 5 crédits | Ratio prix/revenu par commune (pouvoir d'achat), croisant DVF et INSEE Filosofi |
| analyze_rental_yield | 10 crédits | Rendement locatif brut estimé par commune, croisant loyers ANIL et prix DVF |
| detect_flips | 10 crédits | Reventes rapides : taux de flip, marge brute et durée de détention par commune |
| find_property_comparables | 10 crédits | Biens similaires autour d'un point GPS |
| analyze_price_trends | 10 crédits | Séries temporelles par mois/trimestre/an |
| compare_locations | 10 crédits | Comparer 2 à 5 zones côte à côte |
| analyze_market_activity | 10 crédits | Volume d'activité et saisonnalité |
| get_zonal_price_distribution | 15 crédits | Prix par zone (code postal / commune) — données JSON pour cartographie |
| lookup_property_history | 20 crédits | Historique complet pour une adresse précise |
| estimate_property_value | 10 crédits | AVM : fourchette basse/médiane/haute à partir de comparables DVF |
| score_market_health | 10 crédits | Score de santé du marché (0–100) pour une zone |
| add_property_to_portfolio / list_portfolio_properties / get_portfolio_property / update_portfolio_property / delete_portfolio_property | 0–10 crédits | Gérer un portefeuille de biens avec estimations automatiques |
| create_market_alert / list_market_alerts / update_market_alert / delete_market_alert | 0 crédits | Alertes webhook sur nouvelles transactions (Scale/Enterprise) |
| analyze_dpe_distribution | 10 crédits | Distribution DPE (A–G) et médianes énergétiques pour une zone |
| analyze_dpe_price_premium | 10 crédits | Prime de prix par classe DPE — diagnostic le plus proche dans le même département (≤200 m) |
| analyze_dpe_price_and_thermal_risk | 10 crédits | Analyse combinée : prix par classe, passoires thermiques, prime verte |
| get_building_characteristics | 2 crédits | Caractéristiques BDNB du bâtiment le plus proche d'une transaction DVF : année, matériaux, usage, étages |
| analyze_building_age_price_impact | 10 crédits | Prix médian/m² par tranche de construction (avant 1919, 1919–1945 … 2006+) |
| score_renovation_potential | 10 crédits | Score de potentiel de rénovation (0–100) : bâtiments anciens sous-valorisés dans la zone |
| analyze_building_stock | 5 crédits | Stock de bâtiments par commune/département : répartition par tranche, usage, logements |
Crédits
Chaque appel d'outil déduit un nombre fixe de crédits de votre solde. La déduction se fait en arrière-plan après l'exécution réussie (fire-and-forget). Si vos crédits sont insuffisants, l'outil retourne un message d'erreur dans content[0].text — pas d'erreur HTTP 402.
Chaque réponse inclut un champ _credits : { "used": 5, "remaining": 95 }. Un champ note apparaît quand le solde restant est inférieur à 20.
Codes d'erreur HTTP
| Code | Cause | Action recommandée |
|---|---|---|
| 401 | Aucun identifiant | La réponse porte WWW-Authenticate : un client compatible lance la connexion OAuth. Sinon, envoyez votre clé API. |
| 401 | Clé API ou jeton OAuth invalide, expiré ou révoqué | Clé : vérifiez qu'elle est active. OAuth : le client rafraîchit le jeton, ou l'utilisateur se reconnecte si l'autorisation a été révoquée. |
| 403 | no_active_key : jeton OAuth valide mais aucune clé API active sur le compte | Créez une clé dans le dashboard ; l'application reprend à l'appel suivant. |
| 429 | Trafic protocole anormal | Les appels d'outils au-delà de 60/min (Free, Indie, Agent, Pro) ou 120/min (Enterprise) renvoient un résultat isError, pas un 429. |
content[0].text. Surveillez ce champ dans vos intégrations.