Miramo MCP
A public, read-only MCP server operated by Miramo that provides French rental law data, including reference rent calculations, lease draft preparation, and checks for tense zones, rent control perimeters, and airport noise zones. It requires no authentication and cites official sources for every response.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://mcp.miramo.fr/mcpWhat you can do with it
- Calculate reference rent limits for a specific address and property type
- Generate a draft lease agreement link for a rental property
- Check if a commune is in a tense zone and its legal implications
- Verify if rent is controlled in a specific area
Source and maintenance
Protocol and capabilities
- Server
- miramolabs-mcp-public 0.1.0
- MCP protocol
- 2025-06-18
- Tools
- 6 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- 2 advertised
{
"tools": {
"listChanged": true
},
"prompts": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
6 advertised
lookup_reference_rent — Loyer de référence à l'adresse d'un logement
Donne le loyer de référence d'un logement à une adresse où les loyers sont encadrés (Paris, Lille, Lyon et Villeurbanne, Bordeaux, Montpellier, Seine-Saint-Denis avec Est Ensemble et Plaine Commune), selon l'arrêté préfectoral en vigueur aujourd'hui : le loyer de référence, le majoré (le plafond) et le minoré, en euros par m² et par mois. Avec la surface habitable, la réponse donne aussi le loyer maximum hors charges du logement. La réponse nomme l'arrêté, ses dates et le jour où Miramo l'a vérifié. Quand isStale est vrai, les montants sont un ordre de grandeur, pas le plafond légal. Hors encadrement, la réponse le dit et renvoie vers l'outil zone tendue de miramo.fr.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"address",
"rooms",
"furnished",
"constructionPeriod"
],
"properties": {
"rooms": {
"enum": [
"1",
"2",
"3",
"4+"
],
"type": "string",
"description": "Nombre de pièces principales : séjour et chambres, sans la cuisine ni la salle de bains. 4+ à partir de quatre."
},
"address": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "Adresse complète du logement : numéro, rue, code postal et ville, par exemple « 14 rue Oberkampf 75011 Paris ». Miramo la place avec la Base Adresse Nationale ; une adresse qu'elle ne place pas sur un bâtiment est renvoyée avec le statut address_not_found."
},
"surface": {
"type": "number",
"maximum": 1000,
"description": "Surface habitable du logement, en m². Facultative : avec elle, la réponse donne le loyer maximum hors charges du logement.",
"exclusiveMinimum": 0
},
"furnished": {
"type": "boolean",
"description": "true si le logement est loué meublé, false s'il est loué vide."
},
"constructionPeriod": {
"enum": [
"before_1946",
"1946_1970",
"1971_1990",
"after_1990",
"1991_2005",
"after_2005"
],
"type": "string",
"description": "Période de construction de l'immeuble, dans les tranches des arrêtés : after_1990 (après 1990), after_2005 (après 2005), before_1946 (avant 1946), 1946_1970 (entre 1946 et 1970), 1971_1990 (entre 1971 et 1990), 1991_2005 (entre 1991 et 2005). Paris, Lille, Bordeaux, Est Ensemble et Plaine Commune s'arrêtent à after_1990 ; Lyon et Montpellier coupent l'après 1990 en 1991_2005 et after_2005."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"status",
"territory",
"sector",
"referenceRent",
"referenceRentMax",
"referenceRentMin",
"unit",
"monthlyCap",
"arrete",
"dataCheckedOn",
"isStale",
"miramoUrl"
],
"properties": {
"unit": {
"type": "string",
"const": "EUR/m²/month",
"description": "Unité des trois loyers : euros par m² et par mois."
},
"arrete": {
"anyOf": [
{
"type": "object",
"required": [
"reference",
"inForceSince",
"endsOn"
],
"properties": {
"endsOn": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
],
"description": "Dernier jour où il s'applique ; null quand la source n'en donne pas."
},
"reference": {
"type": "string",
"description": "Référence de l'arrêté préfectoral."
},
"inForceSince": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Premier jour où il s'applique."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "L'arrêté en vigueur aujourd'hui ; null quand Miramo n'en a pas."
},
"sector": {
"type": [
"string",
"null"
],
"description": "Le secteur de l'arrêté où tombe l'adresse : le quartier à Paris, la zone ou la commune ailleurs."
},
"status": {
"enum": [
"found",
"arrete_only",
"not_covered",
"address_not_found"
],
"type": "string",
"description": "found : loyers de référence trouvés. arrete_only : l'arrêté s'applique mais Miramo n'a pas de loyer pour ce logement. not_covered : les loyers ne sont pas encadrés à cette adresse. address_not_found : adresse non placée ; une adresse plus complète permet de répondre."
},
"isStale": {
"type": "boolean",
"description": "true quand le barème que tient Miramo est plus ancien que l'arrêté en vigueur : les loyers sont alors un ordre de grandeur."
},
"miramoUrl": {
"type": "string",
"format": "uri",
"description": "L'outil de miramo.fr qui répond à la même question."
},
"territory": {
"anyOf": [
{
"enum": [
"lyon",
"paris",
"lille",
"bordeaux",
"grenoble",
"montpellier",
"pays-basque",
"est-ensemble",
"plaine-commune"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Le territoire d'encadrement de l'adresse."
},
"monthlyCap": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Loyer maximum hors charges du logement, en euros par mois : le majoré multiplié par la surface, arrondi à l'euro inférieur. Null sans surface."
},
"dataCheckedOn": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
],
"description": "Jour où Miramo a vérifié l'arrêté sur sa source officielle."
},
"referenceRent": {
"type": [
"number",
"null"
],
"description": "Loyer de référence."
},
"referenceRentMax": {
"type": [
"number",
"null"
],
"description": "Loyer de référence majoré : le plafond, hors complément de loyer."
},
"referenceRentMin": {
"type": [
"number",
"null"
],
"description": "Loyer de référence minoré."
}
},
"additionalProperties": false
}{
"title": "Loyer de référence à l'adresse d'un logement",
"readOnlyHint": true,
"destructiveHint": false
}prepare_lease_draft — Préparer un bail de location vide
Prépare un brouillon de bail de location vide (non meublé) et renvoie un lien vers le générateur de bail de miramo.fr, où la personne le termine : noms des parties, email, PDF et signature. Prend ce que la personne a dit du logement (adresse complète, surface, pièces, période de construction et le reste), du loyer et des charges, des dates et des documents qu'elle joindra. Tout est facultatif ; le site demande ce qui manque. Le schéma refuse l'identité, l'email et le téléphone du locataire et du bailleur : la personne les saisit sur le site. Rien n'est enregistré : le brouillon est contenu dans le lien.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"rent": {
"type": "object",
"properties": {
"chargesMode": {
"enum": [
"provisions",
"on_receipts",
"none"
],
"type": "string",
"description": "Mode des charges : provisions (Provisions sur charges avec régularisation annuelle), on_receipts (Paiement périodique des charges récupérables sans provision, sur présentation des justificatifs (décret n° 87-713 du 26 août 1987)), none (Sans objet : aucune charge récupérable pour ce logement, selon déclaration du bailleur (ni taxe d'enlèvement des ordures ménagères ni équipement collectif))."
},
"chargesAmount": {
"type": "number",
"minimum": 0,
"description": "Montant mensuel des charges, en euros."
},
"monthlyRentExcludingCharges": {
"type": "number",
"description": "Loyer mensuel hors charges, en euros.",
"exclusiveMinimum": 0
}
},
"description": "Le loyer et les charges.",
"additionalProperties": false
},
"dates": {
"type": "object",
"properties": {
"startsOn": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Date de début du bail, au format AAAA-MM-JJ."
},
"plannedSignatureOn": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Date de signature prévue, au format AAAA-MM-JJ."
}
},
"description": "Les dates du bail.",
"additionalProperties": false
},
"annexes": {
"type": "array",
"items": {
"enum": [
"dpe",
"crep",
"gas_diagnostic",
"electrical_diagnostic",
"co_ownership_rules",
"risk_statement",
"noise"
],
"type": "string"
},
"maxItems": 7,
"description": "Les documents que la personne joindra au bail : dpe (DPE), noise (Diagnostic bruit), crep (Diagnostic plomb (CREP)), gas_diagnostic (Diagnostic gaz), risk_statement (État des risques), co_ownership_rules (Règlement de copropriété), electrical_diagnostic (Diagnostic électricité). Elle les dépose en PDF sur le site."
},
"property": {
"type": "object",
"properties": {
"address": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "Adresse complète du logement : numéro, rue, code postal et ville, par exemple « 14 rue Oberkampf 75011 Paris ». Miramo la place avec la Base Adresse Nationale ; une adresse qu'elle ne place pas sur un bâtiment est renvoyée avec le statut address_not_found."
},
"heating": {
"enum": [
"collective",
"individual"
],
"type": "string",
"description": "Chauffage : collective (Collectif), individual (Individuel)."
},
"dpeClass": {
"enum": [
"A",
"B",
"C",
"D",
"E",
"F",
"G"
],
"type": "string",
"description": "Classe énergie du DPE, de A à G."
},
"hotWater": {
"enum": [
"collective",
"individual"
],
"type": "string",
"description": "Eau chaude : collective (Collective), individual (Individuelle)."
},
"habitatType": {
"enum": [
"collective",
"individual"
],
"type": "string",
"description": "Type d'habitat : collective (Immeuble collectif), individual (Immeuble individuel)."
},
"itEquipment": {
"type": "array",
"items": {
"enum": [
"collective_antenna",
"fibre",
"box",
"phone_socket"
],
"type": "string"
},
"maxItems": 5,
"description": "Équipements d'accès à internet : box (Box internet), fibre (Fibre optique), phone_socket (Prise téléphonique), collective_antenna (Antenne collective)."
},
"livingAreaSqm": {
"type": "number",
"maximum": 1000,
"description": "Surface habitable du logement, en m².",
"exclusiveMinimum": 0
},
"mainRoomCount": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Nombre de pièces principales : séjour et chambres, sans la cuisine ni la salle de bains."
},
"ownershipRegime": {
"enum": [
"co_ownership",
"sole_ownership"
],
"type": "string",
"description": "Régime de l'immeuble : co_ownership (Copropriété), sole_ownership (Monopropriété)."
},
"sharedAmenities": {
"type": "array",
"items": {
"enum": [
"lift",
"courtyard",
"bike_room",
"green_space",
"laundry_room"
],
"type": "string"
},
"maxItems": 5,
"description": "Équipements communs de l'immeuble : lift (Ascenseur), courtyard (Cour), laundry_room (Laverie), bike_room (Local à vélos), green_space (Espaces verts)."
},
"constructionPeriod": {
"enum": [
"before_1949",
"from_1949_to_1974",
"from_1975_to_1989",
"from_1989_to_2005",
"after_2005"
],
"type": "string",
"description": "Période de construction de l'immeuble, selon le modèle officiel de bail : before_1949 (Avant 1949), after_2005 (Depuis 2005), from_1949_to_1974 (1949-1974), from_1975_to_1989 (1975-1989), from_1989_to_2005 (1989-2005)."
},
"privateAccessories": {
"type": "array",
"items": {
"enum": [
"cellar",
"garden",
"balcony",
"parking",
"terrace"
],
"type": "string"
},
"maxItems": 5,
"description": "Ce qui est loué avec le logement : cellar (Cave), garden (Jardin), balcony (Balcon), parking (Parking), terrace (Terrasse)."
},
"gasInstallationOver15Years": {
"type": "boolean",
"description": "Installation intérieure de gaz de plus de 15 ans : elle rend le diagnostic gaz obligatoire. Le champ reste vide quand il n'y a pas de gaz ou que la personne ne sait pas."
},
"electricalInstallationOver15Years": {
"type": "boolean",
"description": "Installation intérieure d'électricité de plus de 15 ans : elle rend le diagnostic électricité obligatoire."
}
},
"description": "Le logement loué, en location vide (non meublé). Jamais rien sur les personnes.",
"additionalProperties": false
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"summary",
"address",
"url",
"droppedFields",
"status"
],
"properties": {
"url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Lien vers le générateur de bail de miramo.fr ; le brouillon est contenu dans le lien, après le signe #."
},
"status": {
"enum": [
"prepared",
"address_not_found"
],
"type": "string",
"description": "prepared : le lien est prêt. address_not_found : l'adresse n'a pas été placée, aucun lien ; une adresse plus complète permet de répondre."
},
"address": {
"type": [
"string",
"null"
],
"description": "L'adresse que la Base Adresse Nationale a retenue ; elle peut différer de l'adresse donnée."
},
"summary": {
"type": [
"string",
"null"
],
"description": "Ce que contient le brouillon préparé, en une phrase."
},
"droppedFields": {
"type": "array",
"items": {
"enum": [
"annexes",
"dates"
],
"type": "string"
},
"description": "Ce que le lien a laissé de côté pour rester court : annexes, puis dates. La personne les indiquera sur le site."
}
},
"additionalProperties": false
}{
"title": "Préparer un bail de location vide",
"readOnlyHint": true,
"destructiveHint": false
}check_tense_zone — Zone tendue d'une commune
Dit si une commune française est en zone tendue et dans quelle catégorie : 1 (zone tendue), 2 (zone touristique et tendue) ou hors zone, avec ce que ça change : le préavis du locataire d'un logement loué vide, la hausse du loyer entre deux locataires, la taxe sur les logements vacants. Prend l'adresse du logement, le nom de sa commune ou son code INSEE. Quand plusieurs communes portent le nom donné, la réponse les liste avec leur catégorie. La réponse cite la liste officielle des communes et sa dernière mise à jour.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"address": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "Adresse du logement : numéro, rue, code postal et ville, par exemple « 30 rue de Paris 93100 Montreuil ». Miramo la place avec la Base Adresse Nationale. Avec commune, la commune donnée l'emporte si l'adresse est placée dans une autre commune. Une commune seule suffit, sans adresse."
},
"commune": {
"type": "string",
"maxLength": 100,
"minLength": 2,
"description": "Nom de la commune. Le code postal ou le département entre parenthèses (« Montreuil 93100 », « Montreuil (93) ») départage des communes du même nom. Avec une adresse, la commune sert à la vérifier, et de repli si elle n'est pas trouvée."
},
"inseeCode": {
"type": "string",
"pattern": "^(\\d{5}|2[AB]\\d{3})$",
"description": "Code INSEE de la commune, cinq caractères (93048 pour Montreuil), à ne pas confondre avec le code postal. Vérifié avec commune et address quand elles sont données : un code qui ne correspond pas à la commune nommée ou à l'adresse placée est écarté."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"status",
"commune",
"category",
"unfurnishedLeaseNoticeMonths",
"isRelettingRentCapped",
"isVacancyTaxed",
"candidates",
"source",
"miramoUrl"
],
"properties": {
"source": {
"type": "object",
"required": [
"decree",
"lastUpdatedBy",
"lastUpdatedOn"
],
"properties": {
"decree": {
"type": "string",
"description": "Le décret qui liste les communes."
},
"lastUpdatedBy": {
"type": "string",
"description": "Le décret qui a mis la liste à jour en dernier."
},
"lastUpdatedOn": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Jour de cette mise à jour."
}
},
"description": "La liste officielle des communes que lit Miramo, et sa dernière mise à jour.",
"additionalProperties": false
},
"status": {
"enum": [
"found",
"several_communes",
"commune_not_found",
"address_not_found"
],
"type": "string",
"description": "found : commune trouvée. several_communes : plusieurs communes portent ce nom, listées dans candidates. commune_not_found : aucune commune de ce nom ou de ce code INSEE. address_not_found : adresse non placée ; une adresse plus complète ou le nom de la commune permet de répondre."
},
"commune": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"inseeCode",
"departmentCode"
],
"properties": {
"name": {
"type": "string",
"description": "Nom officiel de la commune."
},
"inseeCode": {
"type": "string",
"description": "Code INSEE de la commune, à ne pas confondre avec le code postal."
},
"departmentCode": {
"type": "string",
"description": "Département de la commune : 93, 2A, 974."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "La commune retenue ; null sans commune unique."
},
"category": {
"anyOf": [
{
"enum": [
"1",
"2",
"none"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "1 : zone tendue. 2 : zone touristique et tendue. none : hors zone tendue. Null sans commune unique."
},
"miramoUrl": {
"type": "string",
"format": "uri",
"description": "L'outil de miramo.fr qui répond à la même question."
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"inseeCode",
"departmentCode",
"category"
],
"properties": {
"name": {
"type": "string",
"description": "Nom officiel de la commune."
},
"category": {
"enum": [
"1",
"2",
"none"
],
"type": "string"
},
"inseeCode": {
"type": "string",
"description": "Code INSEE de la commune, à ne pas confondre avec le code postal."
},
"departmentCode": {
"type": "string",
"description": "Département de la commune : 93, 2A, 974."
}
},
"additionalProperties": false
},
"description": "Avec several_communes, les communes de ce nom et leur catégorie ; vide sinon."
},
"isVacancyTaxed": {
"type": [
"boolean",
"null"
],
"description": "true en catégorie 1 et 2 : un logement vide depuis plus d'un an paie la taxe sur les logements vacants."
},
"isRelettingRentCapped": {
"type": [
"boolean",
"null"
],
"description": "true en catégorie 1 : entre deux locataires, le loyer du nouveau bail ne peut pas dépasser celui du précédent, sauf exceptions."
},
"unfurnishedLeaseNoticeMonths": {
"anyOf": [
{
"anyOf": [
{
"type": "number",
"const": 1
},
{
"type": "number",
"const": 3
}
]
},
{
"type": "null"
}
],
"description": "Préavis du locataire qui quitte un logement loué vide, en mois : 1 en catégorie 1, 3 sinon (sauf motif personnel). En meublé, c'est 1 partout."
}
},
"additionalProperties": false
}{
"title": "Zone tendue d'une commune",
"readOnlyHint": true,
"destructiveHint": false
}check_rent_control_perimeter — Encadrement des loyers à une adresse
Dit si les loyers sont encadrés (encadrement du niveau des loyers, avec un loyer de référence) à une adresse ou dans une commune française : dans toute la commune, dans une partie seulement ou pas du tout, avec le territoire et l'arrêté préfectoral en vigueur aujourd'hui, ses dates et le jour où Miramo l'a vérifié. Prend l'adresse du logement, le nom de sa commune ou son code INSEE. La réponse dit aussi si Miramo tient le barème du territoire : quand il le tient, lookup_reference_rent donne le loyer de référence d'un logement.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"address": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "Adresse du logement : numéro, rue, code postal et ville, par exemple « 30 rue de Paris 93100 Montreuil ». Miramo la place avec la Base Adresse Nationale. Avec commune, la commune donnée l'emporte si l'adresse est placée dans une autre commune. Une commune seule suffit, sans adresse."
},
"commune": {
"type": "string",
"maxLength": 100,
"minLength": 2,
"description": "Nom de la commune. Le code postal ou le département entre parenthèses (« Montreuil 93100 », « Montreuil (93) ») départage des communes du même nom. Avec une adresse, la commune sert à la vérifier, et de repli si elle n'est pas trouvée."
},
"inseeCode": {
"type": "string",
"pattern": "^(\\d{5}|2[AB]\\d{3})$",
"description": "Code INSEE de la commune, cinq caractères (93048 pour Montreuil), à ne pas confondre avec le code postal. Vérifié avec commune et address quand elles sont données : un code qui ne correspond pas à la commune nommée ou à l'adresse placée est écarté."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"status",
"commune",
"coverage",
"territory",
"territoryName",
"hasBareme",
"isStale",
"arrete",
"dataCheckedOn",
"candidates",
"miramoUrl"
],
"properties": {
"arrete": {
"anyOf": [
{
"type": "object",
"required": [
"reference",
"inForceSince",
"endsOn"
],
"properties": {
"endsOn": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
],
"description": "Dernier jour où il s'applique ; null quand la source n'en donne pas."
},
"reference": {
"type": "string",
"description": "Référence de l'arrêté préfectoral."
},
"inForceSince": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Premier jour où il s'applique."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "L'arrêté en vigueur aujourd'hui sur le territoire ; null quand Miramo n'en a pas ou hors encadrement."
},
"status": {
"enum": [
"found",
"several_communes",
"commune_not_found",
"address_not_found"
],
"type": "string",
"description": "found : commune trouvée. several_communes : plusieurs communes portent ce nom, listées dans candidates. commune_not_found : aucune commune de ce nom ou de ce code INSEE. address_not_found : adresse non placée ; une adresse plus complète ou le nom de la commune permet de répondre."
},
"commune": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"inseeCode",
"departmentCode"
],
"properties": {
"name": {
"type": "string",
"description": "Nom officiel de la commune."
},
"inseeCode": {
"type": "string",
"description": "Code INSEE de la commune, à ne pas confondre avec le code postal."
},
"departmentCode": {
"type": "string",
"description": "Département de la commune : 93, 2A, 974."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "La commune retenue ; null sans commune unique."
},
"isStale": {
"type": "boolean",
"description": "true quand le barème que tient Miramo est plus ancien que l'arrêté en vigueur : ses loyers sont un ordre de grandeur."
},
"coverage": {
"anyOf": [
{
"enum": [
"full",
"none",
"partial"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "full : loyers encadrés dans toute la commune. partial : dans une partie seulement, la carte de l'arrêté dit si l'adresse en fait partie. none : loyers non encadrés. Null sans commune unique."
},
"hasBareme": {
"type": [
"boolean",
"null"
],
"description": "true quand Miramo tient le barème du territoire : lookup_reference_rent donne alors le loyer de référence. Null hors encadrement."
},
"miramoUrl": {
"type": "string",
"format": "uri",
"description": "L'outil de miramo.fr qui répond à la même question."
},
"territory": {
"anyOf": [
{
"enum": [
"lyon",
"paris",
"lille",
"bordeaux",
"grenoble",
"montpellier",
"pays-basque",
"est-ensemble",
"plaine-commune"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Le territoire d'encadrement de la commune ; null hors encadrement."
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"inseeCode",
"departmentCode",
"coverage",
"territory"
],
"properties": {
"name": {
"type": "string",
"description": "Nom officiel de la commune."
},
"coverage": {
"enum": [
"full",
"none",
"partial"
],
"type": "string"
},
"inseeCode": {
"type": "string",
"description": "Code INSEE de la commune, à ne pas confondre avec le code postal."
},
"territory": {
"anyOf": [
{
"enum": [
"lyon",
"paris",
"lille",
"bordeaux",
"grenoble",
"montpellier",
"pays-basque",
"est-ensemble",
"plaine-commune"
],
"type": "string"
},
{
"type": "null"
}
]
},
"departmentCode": {
"type": "string",
"description": "Département de la commune : 93, 2A, 974."
}
},
"additionalProperties": false
},
"description": "Avec several_communes, les communes de ce nom et leur encadrement ; vide sinon."
},
"dataCheckedOn": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
],
"description": "Jour où Miramo a vérifié l'arrêté du territoire, ou, hors encadrement, la liste des territoires encadrés."
},
"territoryName": {
"type": [
"string",
"null"
],
"description": "Le nom du territoire, tel que la réponse le cite."
}
},
"additionalProperties": false
}{
"title": "Encadrement des loyers à une adresse",
"readOnlyHint": true,
"destructiveHint": false
}check_airport_noise_zone — Zone de bruit d'un aéroport
Dit si un logement est dans une zone d'un plan d'exposition au bruit d'un aéroport, et laquelle (de A, la plus exposée, à D), avec ce que ça change pour le bail : dans une zone, il faut joindre un diagnostic bruit. Prend l'adresse complète du logement. Miramo lit les plans publiés par l'aviation civile à ce point. Quand Miramo ne peut pas trancher (trop près de la limite d'une zone, plans qui ne répondent pas, territoire sans plan), la réponse le dit et dit où vérifier. La réponse cite les plans et le jour où Miramo les a lus.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "Adresse complète du logement : numéro, rue, code postal et ville, par exemple « 12 rue Brulée 95190 Goussainville ». Miramo la place avec la Base Adresse Nationale, puis lit les plans d'exposition au bruit à ce point ; une adresse qu'elle ne place pas sur un bâtiment est renvoyée avec le statut address_not_found."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"status",
"address",
"zone",
"plan",
"isNoiseDiagnosticRequired",
"reason",
"source",
"miramoUrl"
],
"properties": {
"plan": {
"anyOf": [
{
"type": "object",
"required": [
"airportName",
"icaoCode",
"arreteOn",
"arreteUrl"
],
"properties": {
"arreteOn": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
],
"description": "Jour de l'arrêté qui a approuvé le plan, quand il est publié."
},
"icaoCode": {
"type": "string",
"description": "Code OACI de l'aéroport : LFPG."
},
"arreteUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Le plan publié, quand il est en ligne."
},
"airportName": {
"type": "string",
"description": "Nom de l'aéroport, tel que l'aviation civile l'écrit."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Le plan qui dessine la zone ; null hors zone ou sans réponse."
},
"zone": {
"anyOf": [
{
"enum": [
"A",
"B",
"C",
"D"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Zone du plan, de A (la plus exposée au bruit des avions) à D (la moins exposée) ; null hors zone ou sans réponse."
},
"reason": {
"anyOf": [
{
"enum": [
"near_boundary",
"service_unavailable"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Avec could_not_check : near_boundary, le logement est trop près de la limite d'une zone ; service_unavailable, les plans n'ont pas répondu à temps ; un nouvel appel peut aboutir. Null sinon."
},
"source": {
"type": "object",
"required": [
"name",
"checkedOn"
],
"properties": {
"name": {
"type": "string",
"description": "Les plans que lit Miramo."
},
"checkedOn": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
],
"description": "Jour où Miramo a lu les plans ; null quand ils ne l'ont pas été."
}
},
"description": "Les plans officiels que lit Miramo, et le jour de la lecture.",
"additionalProperties": false
},
"status": {
"enum": [
"inside",
"outside",
"out_of_coverage",
"could_not_check",
"address_not_found"
],
"type": "string",
"description": "inside : le logement est dans une zone d'un plan d'exposition au bruit. outside : hors de toute zone. out_of_coverage : l'aviation civile ne publie pas de plan pour ce territoire, Miramo ne peut pas répondre. could_not_check : Miramo n'a pas pu trancher, voir reason. address_not_found : adresse non placée ; une adresse plus complète permet de répondre."
},
"address": {
"type": [
"string",
"null"
],
"description": "L'adresse retenue par la Base Adresse Nationale ; null quand elle n'est pas placée."
},
"miramoUrl": {
"type": "string",
"format": "uri",
"description": "Le générateur de bail de miramo.fr, qui lit ces plans à l'adresse."
},
"isNoiseDiagnosticRequired": {
"type": [
"boolean",
"null"
],
"description": "true dans une zone, quelle qu'elle soit : il faut joindre un diagnostic bruit au bail. false hors zone. Null quand Miramo ne peut pas répondre."
}
},
"additionalProperties": false
}{
"title": "Zone de bruit d'un aéroport",
"readOnlyHint": true,
"destructiveHint": false
}check_abc_zone — Zone ABC d'une commune
Donne la zone ABC d'une commune française (A bis, A, B1, B2 ou C) et ce qu'elle change pour un investissement : Loc'Avantages et les plafonds de loyer de la commune, le logement locatif intermédiaire (LLI), le PTZ, la fin du Pinel. Prend le nom de la commune, son code INSEE ou l'adresse du logement. Quand plusieurs communes portent le nom donné, la réponse les liste avec leur zone. La réponse cite la liste officielle des communes et le jour où Miramo l'a relevée.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"address": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "Adresse du logement : numéro, rue, code postal et ville, par exemple « 30 rue de Paris 93100 Montreuil ». Miramo la place avec la Base Adresse Nationale. Avec commune, la commune donnée l'emporte si l'adresse est placée dans une autre commune. Une commune seule suffit, sans adresse."
},
"commune": {
"type": "string",
"maxLength": 100,
"minLength": 2,
"description": "Nom de la commune. Le code postal ou le département entre parenthèses (« Montreuil 93100 », « Montreuil (93) ») départage des communes du même nom. Avec une adresse, la commune sert à la vérifier, et de repli si elle n'est pas trouvée."
},
"inseeCode": {
"type": "string",
"pattern": "^(\\d{5}|2[AB]\\d{3})$",
"description": "Code INSEE de la commune, cinq caractères (93048 pour Montreuil), à ne pas confondre avec le code postal. Vérifié avec commune et address quand elles sont données : un code qui ne correspond pas à la commune nommée ou à l'adresse placée est écarté."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"status",
"commune",
"zone",
"isLliEligible",
"isPtzExistingWithWorksEligible",
"locAvantagesCeilings",
"candidates",
"source",
"miramoUrl"
],
"properties": {
"zone": {
"anyOf": [
{
"enum": [
"A",
"C",
"B1",
"B2",
"Abis"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Zone ABC de la commune, de la plus tendue à la moins tendue : Abis (A bis), A, B1, B2, C. Null sans commune unique."
},
"source": {
"type": "object",
"required": [
"list",
"url",
"capturedOn"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Le fichier officiel publié sur data.gouv.fr."
},
"list": {
"type": "string",
"description": "La colonne de zonage de la liste officielle, telle quelle : elle dit depuis quand le zonage est en vigueur."
},
"capturedOn": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Jour où Miramo a relevé la liste."
}
},
"description": "La liste officielle des communes selon le zonage ABC que lit Miramo, et le jour où Miramo l'a relevée.",
"additionalProperties": false
},
"status": {
"enum": [
"found",
"several_communes",
"commune_not_found",
"address_not_found"
],
"type": "string",
"description": "found : commune trouvée. several_communes : plusieurs communes portent ce nom, listées dans candidates. commune_not_found : aucune commune de ce nom ou de ce code INSEE dans le zonage. address_not_found : adresse non placée ; une adresse plus complète ou le nom de la commune permet de répondre."
},
"commune": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"inseeCode",
"departmentCode"
],
"properties": {
"name": {
"type": "string",
"description": "Nom officiel de la commune."
},
"inseeCode": {
"type": "string",
"description": "Code INSEE de la commune, à ne pas confondre avec le code postal."
},
"departmentCode": {
"type": "string",
"description": "Département de la commune : 93, 2A, 974."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "La commune retenue ; null sans commune unique."
},
"miramoUrl": {
"type": "string",
"format": "uri",
"description": "L'outil de miramo.fr qui répond à la même question."
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"inseeCode",
"departmentCode",
"zone"
],
"properties": {
"name": {
"type": "string",
"description": "Nom officiel de la commune."
},
"zone": {
"anyOf": [
{
"enum": [
"A",
"C",
"B1",
"B2",
"Abis"
],
"type": "string"
},
{
"type": "null"
}
]
},
"inseeCode": {
"type": "string",
"description": "Code INSEE de la commune, à ne pas confondre avec le code postal."
},
"departmentCode": {
"type": "string",
"description": "Département de la commune : 93, 2A, 974."
}
},
"additionalProperties": false
},
"description": "Avec several_communes, les communes de ce nom et leur zone ; vide sinon."
},
"isLliEligible": {
"type": [
"boolean",
"null"
],
"description": "true en zone A bis, A et B1 : le logement locatif intermédiaire (LLI) y est ouvert aux investisseurs personnes morales."
},
"locAvantagesCeilings": {
"anyOf": [
{
"type": "object",
"required": [
"loc1",
"loc2",
"loc3",
"unit"
],
"properties": {
"loc1": {
"type": "number",
"description": "Plafond Loc1 (loyer intermédiaire).",
"exclusiveMinimum": 0
},
"loc2": {
"type": "number",
"description": "Plafond Loc2 (loyer social).",
"exclusiveMinimum": 0
},
"loc3": {
"type": "number",
"description": "Plafond Loc3 (loyer très social).",
"exclusiveMinimum": 0
},
"unit": {
"type": "string",
"const": "EUR/m²/month"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Plafonds de loyer Loc'Avantages de la commune, en euros par m² et par mois hors charges ; null sans commune unique, et à Paris, Lyon et Marseille, où ils sont fixés par arrondissement."
},
"isPtzExistingWithWorksEligible": {
"type": [
"boolean",
"null"
],
"description": "true en zone B2 et C : le PTZ y finance aussi l'ancien avec travaux. Le neuf est finançable dans toutes les zones."
}
},
"additionalProperties": false
}{
"title": "Zone ABC d'une commune",
"readOnlyHint": true,
"destructiveHint": false
}Prompts
2 advertised
prepare_lease — Préparer un bail
Un brouillon de bail de location vide, à partir de ce que la personne sait du logement, du loyer et des dates. Il se termine sur miramo.fr : les noms, le PDF et la signature. Le brouillon est contenu dans le lien.
- property
- Le logement : adresse complète, surface, nombre de pièces, année de construction, chauffage.
- rent
- Le loyer hors charges et les charges par mois, par exemple 1 200 € et 80 € de charges.
- dates
- Le début du bail et le jour de signature prévu.
- annexes
- Les documents joints au bail, par exemple le DPE.
check_rent — Vérifier un loyer
Le loyer maximum autorisé à l'adresse d'un logement, selon l'arrêté d'encadrement en vigueur aujourd'hui.
- address
- Adresse complète du logement : numéro, rue, code postal et ville.
- rooms
- Nombre de pièces principales, séjour et chambres : 1, 2, 3, 4 ou plus.
- furnished
- Vide ou meublé.
- constructionPeriod
- Année ou période de construction de l'immeuble, par exemple 1975.
- surface
- Surface habitable en m², par exemple 45.
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1073 ms
- 95th percentile latency
- 1073 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1073 ms · metadata changed · 6 tool(s), 2 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http miramo-mcp https://mcp.miramo.fr/mcpCodex
codex mcp add miramo-mcp --url https://mcp.miramo.fr/mcpCursor
{
"mcpServers": {
"miramo-mcp": {
"url": "https://mcp.miramo.fr/mcp"
}
}
}Cline
{
"mcpServers": {
"miramo-mcp": {
"type": "streamableHttp",
"url": "https://mcp.miramo.fr/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"miramo-mcp": {
"type": "http",
"url": "https://mcp.miramo.fr/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http miramo-mcp https://mcp.miramo.fr/mcpClaude Desktop
{
"mcpServers": {
"miramo-mcp": {
"url": "https://mcp.miramo.fr/mcp"
}
}
}Windsurf
{
"mcpServers": {
"miramo-mcp": {
"serverUrl": "https://mcp.miramo.fr/mcp"
}
}
}Let your agent find its tools
Find servers like Miramo MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Miramo MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.