MCP Server

french-rental-compliance

com.adminlanding/french-rental-compliance
Legal & Compliance Real Estate Public & reachable MCP 2025-11-25

What this MCP does

Provides sourced French rental, home-employment, and France-Switzerland cross-border calculators, compliance checks, and rent-receipt generation.

calculate_assistant_maternel_end_of_contract
Assistant maternel (assmat) end of contract — retrait d'enfant, démission, préavis, indemnité (CCN 3239)
End of an assistant maternel (assmat) contract with a parent-employer: retrait d'enfant or resignation, notice, indemnity, Pajemploi documents, for the parent or the assistant maternel. · Fin de contrat d'assistant maternel (assmat) avec un parent employeur : retrait d'enfant ou démission, préavis, indemnité de rupture, documents Pajemploi, pour le parent comme pour l'assistant maternel. — Same engine as calculate_home_employment_end_of_contract with regime pre-set to assistant_maternel (socle spécifique): notice by length of care (art. 120: 8 days / 15 days / 1 month, outside the trial period), withdrawal indemnity (art. 121.1: 1/80 of gross salaries excluding entretien/repas/km, from 9 months of care), rupture conventionnelle NOT available (CASF L.423-2), unfitness (art. 119.5) and the approval suspended or withdrawn (art. 119.3), last Pajemploi declaration, 6-month settlement contest window (from the receipt's signature — earliest end shown), documents with who produces and who receives each. NOT for a garde d'enfant à domicile (nounou at the family's home) — that is regime garde_domicile on the generic tool. Applies the Convention collective IDCC 3239 (verified on Légifrance 2026). Deterministic formulas — no AI, no assessment of any person or motif.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['party', 'end_reason', 'start_date'], 'properties': {'party': {'enum': ['employer', 'employee'], 'type': 'string', 'description': "Who is asking: 'employer' (particulier employeur) or 'employee' (salarié / assistant maternel). Wording only — the figures are identical for both."}, 'sent_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'ISO date the ending letter was SENT (registered post) or handed over. The notice tier is set by the seniority on that day (CCN art. 162.1 / 120); for faute grave/lourde and unfitness the contract ends on it (art. 64.3 / 64.4). When omitted the tier is taken at the first presentation and notice.tierDependsOnSentDate says whether a threshold lies in the 7 days before it.'}, 'as_of_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Seniority reference date when the letter has not been sent yet (planning). Ignored when notification_date is given.'}, 'end_reason': {'enum': ['employer_termination', 'resignation', 'mutual_termination', 'unfitness', 'approval_withdrawn'], 'type': 'string', 'description': "Closed category matching the letter: 'employer_termination' (licenciement / retrait d'enfant), 'resignation' (démission), 'mutual_termination' (rupture conventionnelle — not available for assistants maternels), 'unfitness' (inaptitude, CCN art. 161.1.3 / 119.5: no notice; needs unfitness_origin and unfitness_opinion_date), 'approval_withdrawn' (assistant maternel only, art. 119.3: approval suspended, changed or withdrawn; needs approval_decision and approval_notified_date)."}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Contract start (ISO).'}, 'entretien_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Home employee dismissal / unfitness: the day the preliminary interview was held — the notification window (4th–30th jour ouvrable, art. 161.1.1.1) is computed from it.'}, 'agreed_end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Rupture conventionnelle only: the end date the parties agreed — the minimum indemnity (art. 161.3 → 163.1) is computed with the seniority reached on that day.'}, 'am_monthly_gross': {'type': 'number', 'minimum': 0, 'description': "Assistant maternel: monthly gross (mensualisation), EXCLUDING indemnités d'entretien, repas, kilométriques."}, 'unfitness_origin': {'enum': ['occupational', 'non_occupational'], 'type': 'string', 'description': "Unfitness only: 'occupational' (work accident or occupational disease — the indemnity is doubled, art. 161.1.3 / 2/80 art. 119.5) or 'non_occupational'."}, 'approval_decision': {'enum': ['suspension', 'modification', 'retrait'], 'type': 'string', 'description': "Approval ending only (assistant maternel): the conseil départemental's decision."}, 'notification_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'ISO date of the FIRST PRESENTATION (or handover) of the letter that ends the contract — the notice runs from it. For a rupture conventionnelle: the day both parties sign the OFFICIAL form (the withdrawal period runs from it). Omit for durations only.'}, 'serious_misconduct': {'type': 'boolean', 'description': 'The letter states faute grave or faute lourde (a category chosen by the user — the tool does not assess it). Removes the notice and the indemnity by rule.'}, 'am_total_gross_paid': {'type': 'number', 'minimum': 0, 'description': 'Assistant maternel: optional total gross salaries paid since the start (art. 121.1 base). Defaults to mensualisation × complete months.'}, 'approval_notified_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Approval ending only: the day the conseil départemental notified the decision — the contract ends on it (art. 119.3).'}, 'unfitness_opinion_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "Unfitness only: the date of the occupational physician's final opinion; the rupture takes place within one month of it."}}}
calculate_deposit_restitution
Security-deposit restitution calculator — due date, late penalty, vétusté apportionment
Deposit restitution: due date, 10 %/month late penalty, vétusté-apportioned retentions. · Restitution du dépôt de garantie : date limite, majoration de 10 % par mois de retard, retenues avec vétusté. — For a French residential lease (loi n° 89-462 art. 22 / art. 25-6): the restitution deadline (1 month from the remise des clés when the exit état des lieux matches the entry one, 2 months otherwise), the late penalty (10 % of the monthly rent en principal per monthly period started late; not due when the delay results from the tenant not having given the address of the new home), the provision a landlord may keep in an immeuble collectif (duly justified, at most 20 % of the deposit — art. 22, al. 5: a ceiling, the amount is the landlord's), the legal deposit cap (1 month unfurnished / 2 months furnished, when lease_type is given) and, for each damage line, the share chargeable to the tenant after vétusté (usure normale) — under the grille of the lease when given, otherwise an ILLUSTRATIVE grille (no official grille exists — décret n° 2016-382 art. 4 defers to accords collectifs; the response says so). Nothing is assumed: the age of an element a grille applies to is asked for, the lease type and the provision amount are left out when not given. Same figures whichever party asks: pass perspective 'landlord' (justify a retention) or 'tenant' (contest one) — only next_steps change. Ask the user for amounts and dates in plain words; damage items as 'what, repair cost, age of the element'. Deterministic rules, not AI. General information, not legal advice.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['deposit', 'rent_hors_charges', 'key_return_date', 'edl_outcome'], 'properties': {'damages': {'type': 'array', 'items': {'type': 'object', 'required': ['item', 'cost'], 'properties': {'cost': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': 'Justified repair cost (quote or invoice), €.'}, 'item': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'What is damaged / repaired (plain words).'}, 'age_years': {'type': 'number', 'maximum': 80, 'minimum': 0, 'description': 'Age of the element in years (installed or last renewed) — 0 for a new element. REQUIRED when a grille applies to the line (grille_key, lifespan_years or annual_rate_pct): the chargeable share is computed from it and it is never assumed.'}, 'grille_key': {'enum': ['peinture', 'papier_peint', 'moquette', 'sol_souple', 'parquet_vitrification', 'robinetterie', 'chauffe_eau', 'electromenager', 'volets_stores'], 'type': 'string', 'description': 'Category in the grille (peinture, papier_peint, moquette, sol_souple, parquet_vitrification, robinetterie, chauffe_eau, electromenager, volets_stores). Omit for an element outside the grille — its full cost then stays chargeable.'}, 'residual_pct': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': 'Lease-annexed grille: residual share in % (default 0).'}, 'lifespan_years': {'type': 'number', 'maximum': 60, 'minimum': 1, 'description': 'Lease-annexed grille: theoretical lifespan of the element (overrides the category).'}, 'annual_rate_pct': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': 'Lease-annexed grille: annual abatement in % (omit for a linear abatement over the lifespan).'}, 'franchise_years': {'type': 'number', 'maximum': 20, 'minimum': 0, 'description': 'Lease-annexed grille: franchise in years.'}}}, 'maxItems': 30, 'description': 'Damage lines to apportion. Omit for a full restitution.'}, 'deposit': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': 'Deposit paid at move-in (€).'}, 'lease_type': {'enum': ['vide', 'meuble'], 'type': 'string', 'description': "'vide' unfurnished (deposit cap 1 month) or 'meuble' furnished (cap 2 months). Never presumed: omitted, no cap is computed."}, 'copropriete': {'type': 'boolean', 'description': "true when the dwelling is in an immeuble collectif (a collective building, co-owned or not): the landlord may keep a duly justified provision of at most 20 % of the deposit until the building's yearly accounts (art. 22, al. 5)."}, 'edl_outcome': {'enum': ['identical', 'differences'], 'type': 'string', 'description': "'identical' when the exit état des lieux matches the entry one (1-month deadline); 'differences' otherwise (2 months)."}, 'perspective': {'enum': ['landlord', 'tenant'], 'type': 'string', 'description': 'Who is asking — changes only the next_steps wording, never the figures.'}, 'apply_provision': {'type': 'boolean', 'description': 'true to deduct provision_amount in the figures; false to leave it out. Without provision_amount nothing can be deducted: the tool asks for the amount.'}, 'key_return_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Date the keys were handed back (remise des clés), ISO date — the deadline runs from this day.'}, 'provision_amount': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': "Immeuble collectif only: the provision the landlord keeps, € — the landlord's own justified amount, at most 20 % of the deposit. Never assumed: omitted, no provision is deducted and the result only states the maximum."}, 'restitution_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Date the deposit was / will be returned (ISO) — the penalty is computed against it. Omitted, the figures are computed as of today (date in France) and the result says the date was assumed (as_of.assumed).'}, 'rent_hors_charges': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': 'Monthly rent en principal, excluding charges (€).'}, 'tenant_gave_address': {'type': 'boolean', 'description': 'false when the tenant never gave the address of the new home and the delay results from it — the late penalty is then not due (art. 22, al. 7). Defaults to true.'}, 'provision_justification': {'type': 'string', 'maxLength': 300, 'minLength': 1, 'description': "What justifies the provision (e.g. 'arrêté provisoire des comptes du 15/09/2026')."}}}
calculate_home_employment_end_of_contract
Home employment end of contract — notice, calendar, indemnity (CCN 3239)
End of a home-employment contract in France (particulier employeur ↔ salarié: cleaner, carer, garde d'enfant à domicile, assistant maternel): notice, dates, indemnity, documents, for either party. · Fin de contrat d'emploi à domicile (particulier employeur ↔ salarié, assistant maternel) : préavis, calendrier, indemnité, documents, pour l'employeur comme pour le salarié. — Notice duration by seniority (art. 162.4.1 dismissal / 162.6 resignation / 120 assistant maternel), earliest entretien préalable date (art. 161.1.1.1 — 4th jour ouvrable counted from the day after presentation; the Code du travail dismissal procedure does not apply to the particulier employeur), notice end computed from the FIRST PRESENTATION of the letter, dismissal indemnity (art. 163.1: 1/4 month per year up to 10 years then 1/3, from 8 months, best of the 12- or 3-month average) or assistant-maternel withdrawal indemnity (art. 121.1: 1/80 of gross salaries, from 9 months), rupture conventionnelle windows (blocked for assistants maternels, CASF L.423-2), paid-leave reminder, last CESU/Pajemploi declaration date, the 6-month settlement contest window (it runs from the receipt's signature, CCN art. 69 — only its earliest end is shown), unfitness (no notice, doubled indemnity when occupational, one month from the opinion) and the approval ending, and the end-of-contract documents with who produces and who receives each. Same numbers whichever party calls. Applies the Convention collective IDCC 3239 (verified on Légifrance 2026). Deterministic formulas — no AI, no assessment of any person or motif.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['party', 'end_reason', 'start_date', 'regime'], 'properties': {'party': {'enum': ['employer', 'employee'], 'type': 'string', 'description': "Who is asking: 'employer' (particulier employeur) or 'employee' (salarié / assistant maternel). Wording only — the figures are identical for both."}, 'regime': {'enum': ['home_employee', 'garde_domicile', 'assistant_maternel'], 'type': 'string', 'description': "'home_employee' (salarié du particulier employeur: cleaner, carer, housekeeper…), 'garde_domicile' (child care at the family's home — same rules as home_employee), 'assistant_maternel' (childminder at her own home, agréée — or use calculate_assistant_maternel_end_of_contract)."}, 'sent_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'ISO date the ending letter was SENT (registered post) or handed over. The notice tier is set by the seniority on that day (CCN art. 162.1 / 120); for faute grave/lourde and unfitness the contract ends on it (art. 64.3 / 64.4). When omitted the tier is taken at the first presentation and notice.tierDependsOnSentDate says whether a threshold lies in the 7 days before it.'}, 'as_of_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Seniority reference date when the letter has not been sent yet (planning). Ignored when notification_date is given.'}, 'end_reason': {'enum': ['employer_termination', 'resignation', 'mutual_termination', 'unfitness', 'approval_withdrawn'], 'type': 'string', 'description': "Closed category matching the letter: 'employer_termination' (licenciement / retrait d'enfant), 'resignation' (démission), 'mutual_termination' (rupture conventionnelle — not available for assistants maternels), 'unfitness' (inaptitude, CCN art. 161.1.3 / 119.5: no notice; needs unfitness_origin and unfitness_opinion_date), 'approval_withdrawn' (assistant maternel only, art. 119.3: approval suspended, changed or withdrawn; needs approval_decision and approval_notified_date)."}, 'start_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Contract start (ISO).'}, 'hourly_gross': {'type': 'number', 'maximum': 500, 'minimum': 0, 'description': 'Gross hourly rate in € (home employee / garde à domicile).'}, 'weekly_hours': {'type': 'number', 'maximum': 80, 'minimum': 0, 'description': 'Weekly hours (mensualisation = hourly × hours × 52 / 12).'}, 'entretien_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Home employee dismissal / unfitness: the day the preliminary interview was held — the notification window (4th–30th jour ouvrable, art. 161.1.1.1) is computed from it.'}, 'agreed_end_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Rupture conventionnelle only: the end date the parties agreed — the minimum indemnity (art. 161.3 → 163.1) is computed with the seniority reached on that day.'}, 'am_monthly_gross': {'type': 'number', 'minimum': 0, 'description': "Assistant maternel: monthly gross (mensualisation), EXCLUDING indemnités d'entretien, repas, kilométriques."}, 'convocation_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "Employer termination only: first presentation of the convocation à l'entretien préalable → earliest entretien date (CCN art. 161.1.1.1)."}, 'unfitness_origin': {'enum': ['occupational', 'non_occupational'], 'type': 'string', 'description': "Unfitness only: 'occupational' (work accident or occupational disease — the indemnity is doubled, art. 161.1.3 / 2/80 art. 119.5) or 'non_occupational'."}, 'approval_decision': {'enum': ['suspension', 'modification', 'retrait'], 'type': 'string', 'description': "Approval ending only (assistant maternel): the conseil départemental's decision."}, 'notification_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'ISO date of the FIRST PRESENTATION (or handover) of the letter that ends the contract — the notice runs from it. For a rupture conventionnelle: the day both parties sign the OFFICIAL form (the withdrawal period runs from it). Omit for durations only.'}, 'avg_3_months_gross': {'type': 'number', 'minimum': 0, 'description': 'Optional — average gross monthly pay over the last 3 months (the more favourable average is used).'}, 'serious_misconduct': {'type': 'boolean', 'description': 'The letter states faute grave or faute lourde (a category chosen by the user — the tool does not assess it). Removes the notice and the indemnity by rule.'}, 'am_total_gross_paid': {'type': 'number', 'minimum': 0, 'description': 'Assistant maternel: optional total gross salaries paid since the start (art. 121.1 base). Defaults to mensualisation × complete months.'}, 'avg_12_months_gross': {'type': 'number', 'minimum': 0, 'description': 'Optional — average gross monthly pay over the last 12 months (art. 163.1 reference).'}, 'approval_notified_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Approval ending only: the day the conseil départemental notified the decision — the contract ends on it (art. 119.3).'}, 'unfitness_opinion_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "Unfitness only: the date of the occupational physician's final opinion; the rupture takes place within one month of it."}}}
calculate_net_swiss_salary
Net Swiss salary calculator (frontalier)
Net Swiss salary for a cross-border worker. · Salaire suisse net pour un frontalier. — Converts a gross annual Swiss salary (CHF) to net, deducting the employee shares of AVS/AI/APG, AC (chômage), LPP (2nd pillar) and NBU (non-occupational accident) for the given border canton. Deterministic Swiss payroll rules — no AI. Returns annual + monthly net and the deduction breakdown, with the data year of the rates used.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['gross_chf_annual', 'age', 'canton'], 'properties': {'age': {'type': 'integer', 'maximum': 80, 'minimum': 16, 'description': 'Employee age (affects LPP rate).'}, 'canton': {'enum': ['GE', 'VD', 'JU', 'NE', 'BS', 'VS'], 'type': 'string', 'description': 'Swiss border canton (GE, VD, JU, NE, BS, VS).'}, 'gross_chf_annual': {'type': 'number', 'maximum': 1000000, 'minimum': 1000, 'description': 'Gross annual salary in CHF.'}}}
calculate_rent_revision
French rent revision calculator (IRL indexation)
New rent after the yearly IRL revision; no revision for class F/G homes. · Nouveau loyer après la révision IRL annuelle ; pas de révision pour les logements classés F ou G. — Computes the legally revised rent for a French residential lease using the INSEE IRL (indice de référence des loyers): new rent = current rent × (IRL of the lease's reference quarter ÷ IRL of the SAME quarter one year earlier), loi n° 89-462 art. 17-1. The reference quarter (trimestre de référence IRL) is the one written in the lease — pass it as reference_quarter. Two legal limits: the landlord must ask for the revision within ONE YEAR of the date it takes effect (the date agreed in the lease or, failing that, the end of each year of the lease), otherwise the landlord is deemed to have waived it for the year gone by (art. 17-1, I, al. 3) — when revision_date is more than one year old the result says so; and the revision cannot be applied in a dwelling of DPE class F or G (art. 17-1, III; leases concluded, renewed or tacitly continued since 24 August 2022 — loi n° 2021-1104 du 22 août 2021, art. 159) — pass dpe_class to get that check. The revised rent applies from the landlord's request, never retroactively (art. 17-1, I, al. 4). Deterministic INSEE data + fixed formula — no AI. France métropolitaine.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['current_rent', 'reference_quarter'], 'properties': {'dpe_class': {'enum': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'type': 'string', 'description': "Dwelling's DPE class, if known — in a class F or G dwelling the revision cannot be applied (art. 17-1, III)."}, 'current_rent': {'type': 'number', 'description': 'Current monthly rent excluding charges (hors charges), in euros.', 'exclusiveMinimum': 0}, 'revision_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Date the revision takes effect, as an ISO date (e.g. 2026-09-01) — normally the lease anniversary; accept a natural date from the user and format it yourself. When given, the reference quarter is taken in THIS year; if reference_quarter names a different year, the result carries a warning and this date wins.'}, 'reference_quarter': {'type': 'string', 'maxLength': 20, 'minLength': 2, 'description': "The IRL reference quarter OF THE YEAR OF THE REVISION (e.g. '2026-T2' for a revision in 2026). The lease usually names the quarter only ('T2', '2e trimestre') — infer the year from the revision date, or pass revision_date and give just the quarter here. Accepts '2026-T2', 'T2 2026', 'Q2 2026', or 'T2' when revision_date is provided. Never the quarter of the previous year: the tool itself divides by the same quarter one year earlier."}}}
calculate_teletravail_frontalier
Frontalier telework — 40 % tax and 49.9 % social thresholds
Frontalier telework thresholds (FR–CH): 40 % tax and 49.9 % social security, reported separately. · Télétravail frontalier : seuils fiscal 40 % et sécurité sociale 49,9 %, distingués. — Projects a typical working week over 46 worked weeks and returns the telework share, the position against BOTH limits (different instruments: the FR–CH tax avenant applicable since 01/01/2026 vs the EU/EFTA social-security framework agreement since 01/07/2023), the remaining telework days before each is crossed, and how many temporary mission days count inside the allowance (≤ 10 a year). Optional: the 3-month LAMal/CMU droit d'option window from the Swiss employment start date. Deterministic — verified official facts with sources and dates, nothing stored. Same engine as the free web counter; a signed-in monthly log turns the projection into the real position (list_deadlines then carries the threshold warnings).
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['telework_days_per_week'], 'properties': {'as_of_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'YYYY-MM-DD reference date for the option window (default: today) — makes the answer reproducible.'}, 'days_per_week': {'type': 'number', 'maximum': 7, 'minimum': 1, 'description': 'Contractual working days per week (1–7). Default 5.'}, 'mission_days_per_year': {'type': 'integer', 'maximum': 60, 'minimum': 0, 'description': 'Temporary mission days per year in France or a third country — only the first 10 count inside the telework allowance.'}, 'swiss_employment_start': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': "YYYY-MM-DD the Swiss employment began — adds the 3-month LAMal/CMU droit d'option window."}, 'telework_days_per_week': {'type': 'number', 'maximum': 7, 'minimum': 0, 'description': 'Days per week worked from home in France (fractions allowed, e.g. 1.5).'}}}
calculate_tenant_notice_period
Tenant notice period (préavis) calculator — French residential lease
Tenant's notice period to end a French lease (préavis). · Délai de préavis du locataire pour résilier un bail. — Computes the tenant's notice period for terminating a French residential lease (loi n° 89-462 art. 15): furnished = always 1 month; unfurnished = 3 months, reduced to 1 month in a zone tendue commune (first-list perimeter, resolved automatically from insee_code/commune) or on a statutory ground (art. 15 I, 1° à 5° incl. 3° bis). Returns the end date computed de quantième à quantième from the RECEPTION date, plus which justificatifs must accompany the letter. Deterministic legal formula — no AI involved. France métropolitaine rules.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['lease_type'], 'properties': {'commune': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': "Commune name, e.g. 'Lyon'. Used when insee_code is not provided."}, 'ground_id': {'enum': ['premier_emploi', 'mutation', 'perte_emploi', 'nouvel_emploi', 'sante', 'rsa_aah', 'logement_social', 'violences'], 'type': 'string', 'description': 'Statutory ground for the reduced 1-month notice on an unfurnished lease (art. 15 I).'}, 'insee_code': {'type': 'string', 'pattern': '^[0-9][0-9ABab][0-9]{3}$', 'description': 'INSEE commune code (5 chars, e.g. 75056 for Paris, 2A004 for Ajaccio). Preferred when known — skips name resolution.'}, 'lease_type': {'enum': ['vide', 'meuble'], 'type': 'string', 'description': "'vide' = unfurnished, 'meuble' = furnished"}, 'code_postal': {'type': 'string', 'pattern': '^[0-9]{5}$', 'description': '5-digit postal code — disambiguates homonym communes.'}, 'zone_tendue': {'type': 'boolean', 'description': 'Explicit zone-tendue (first list) flag if already known — otherwise resolved from insee_code/commune.'}, 'reception_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'ISO date the LANDLORD RECEIVES the notice (LRAR reception, remise en main propre, or acte de commissaire) — never the sending date.'}}}
check_dpe_rental_restrictions
DPE rental restrictions — letting ban, rent freeze, DPE validity
French rental limits by DPE class: letting ban, rent freeze, DPE validity. · Restrictions locatives selon la classe DPE : interdiction de louer, gel des loyers, validité du DPE. — Given a dwelling's DPE class (A–G), returns the French rental restrictions in force: letting ban status and date (loi n° 2021-1104 Climat et Résilience — G banned since 2025, F from 2028, E from 2034, France métropolitaine), the F/G rent freeze (no rent revision in a class F or G dwelling — loi n° 89-462 art. 17-1, III, for leases concluded, renewed or tacitly continued since 24 August 2022), and — when dpe_issue_date is provided — whether the DPE itself is still valid (10-year rule + the 2013–2021 transitional expiries). Deterministic rules from official thresholds — no AI involved.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['dpe_class'], 'properties': {'dpe_class': {'enum': ['A', 'B', 'C', 'D', 'E', 'F', 'G'], 'type': 'string', 'description': "Energy class from the dwelling's DPE."}, 'dpe_issue_date': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'ISO issue date of the DPE — enables the validity check.'}}}
check_geneva_quasi_resident
Geneva quasi-resident status check (frontalier)
Geneva quasi-resident status (≥90% income taxed in CH). · Statut de quasi-résident genevois (≥90% des revenus imposés en CH). — Tells a Geneva cross-border worker whether they qualify as a quasi-résident — i.e. at least ~90% of the household's worldwide income is taxable in Switzerland — which unlocks itemised deductions on the Geneva tax return. Deterministic threshold rule — no AI. Returns eligibility, the share, the threshold, and the data year.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['swiss_income', 'total_income'], 'properties': {'swiss_income': {'type': 'number', 'maximum': 100000000, 'minimum': 0, 'description': 'Income taxable in Switzerland (same currency as total_income).'}, 'total_income': {'type': 'number', 'maximum': 100000000, 'description': 'Total worldwide household income (same currency).', 'exclusiveMinimum': 0}}}
check_zone_tendue
Zone tendue status of a French commune
Is a commune in zone tendue, and which list (reduced tenant notice, or tax only)? · Une commune est-elle en zone tendue, et sur quelle liste (préavis réduit, ou fiscal seulement) ? — Checks whether a French commune is in the 'zone tendue' perimeter and — crucially — WHICH one: the first list (décret n° 2013-392 annex, 1,434 communes, agglomérations >50k) where the tenant's reduced 1-month notice applies, or the wider TLV tax perimeter added in 2023 where ONLY fiscal measures apply (widely mislabelled 'zone tendue' — the reduced notice does NOT apply there). Deterministic dataset lookup on DILA reference data (service-public.fr simulator dataset) — no AI involved. Provide insee_code, or commune (+ code_postal to disambiguate).
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'commune': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': "Commune name, e.g. 'Lyon'. Used when insee_code is not provided."}, 'insee_code': {'type': 'string', 'pattern': '^[0-9][0-9ABab][0-9]{3}$', 'description': 'INSEE commune code (5 chars, e.g. 75056 for Paris, 2A004 for Ajaccio). Preferred when known — skips name resolution.'}, 'code_postal': {'type': 'string', 'pattern': '^[0-9]{5}$', 'description': '5-digit postal code — disambiguates homonym communes.'}}}
compare_family_allowances
Family allowances — Swiss vs French (frontalier)
Family allowances: Swiss vs French for a frontalier. · Allocations familiales : Suisse ou France pour un frontalier. — Compares the monthly/annual family allowances a cross-border worker's household is due under the Swiss canton's rules vs French CAF, and the EU 883/2004 differential top-up when the spouse works in France. Deterministic official allowance tables — no AI. Returns Swiss annual + monthly base (CHF), CAF monthly (EUR), the differential, and the data year.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['canton', 'children'], 'properties': {'canton': {'enum': ['GE', 'VD', 'JU', 'NE', 'BS', 'VS'], 'type': 'string', 'description': 'Swiss border canton (GE, VD, JU, NE, BS, VS).'}, 'children': {'type': 'array', 'items': {'type': 'object', 'required': ['age'], 'properties': {'age': {'type': 'integer', 'maximum': 30, 'minimum': 0, 'description': "Child's age."}, 'in_training': {'type': 'boolean', 'description': 'In education/training (extends eligibility).'}}}, 'maxItems': 10, 'minItems': 1, 'description': 'The children (at least one).'}, 'spouse_works_in_france': {'type': 'boolean', 'description': 'Does the spouse work in France? (triggers the EU differential).'}}}
compare_lamal_cmu
Frontalier health cover — LAMal vs CMU
Frontalier health cover: LAMal (CH) vs CMU/PUMa (FR). · Couverture santé frontalier : LAMal (CH) ou CMU (FR). — Estimates the monthly cost of the two health-insurance options a France–Switzerland cross-border worker chooses between (droit d'option): Swiss LAMal (in CHF) vs French CMU/PUMa (in EUR, a % of income). Dependants are priced by age band (0-18 child, 19-25 young adult, 26+ adult). Deterministic official premium/rate tables — no AI. Returns both monthly figures + the data year, plus how to transmit the signed choice form (the CPAM's dedicated online téléservice).
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['salary_chf', 'age', 'canton'], 'properties': {'age': {'type': 'integer', 'maximum': 80, 'minimum': 16, 'description': "Worker's age."}, 'canton': {'enum': ['GE', 'VD', 'JU', 'NE', 'BS', 'VS'], 'type': 'string', 'description': 'Swiss border canton (GE, VD, JU, NE, BS, VS).'}, 'salary_chf': {'type': 'number', 'maximum': 2000000, 'minimum': 0, 'description': 'Annual Swiss salary in CHF.'}, 'children_ages': {'type': 'array', 'items': {'type': 'integer', 'maximum': 30, 'minimum': 0}, 'maxItems': 10, 'description': 'Ages of dependants (optional) — priced by band (≤18 / 19-25 / 26+).'}}}
generate_rent_receipt
Generate a French rent receipt (quittance de loyer) PDF — free, no account
FREE — no account needed. · GRATUIT, sans compte : quittance de loyer en PDF. — Rent receipt (quittance de loyer, loi n° 89-462 art. 21) PDF from the data you give: landlord, tenant, property address, period, rent and charges, payment date. Deterministic template engine — a fixed legal template filled with the given data, not AI-generated content. The document is issued in FRENCH (required for legal validity); includeEnglish appends a non-binding English reference translation. Nothing is stored: the PDF is available for 24 hours through a single-use link, then deleted — no account, no property, no history. Per-network caps apply (a structured rate_limited result says when to retry). Have the landlord verify every field before sending it to the tenant. BLANK MENTIONS: what is not given is printed blank, never invented. Before the document is produced, the tool answers needs_input with blank_mentions — the mentions that would be blank, as printed: show the landlord the list and complete them, or pass acknowledge_incomplete: true once the landlord has chosen to leave them blank. A generated document returns printed_blank, the mentions to complete by hand. With an AdminLanding account the same receipt is pre-filled from your saved properties, the tenant is stamped from the record so their name never passes through the assistant, receipts are kept in your history and shared through the tenant portal, and leases can be sent for e-signature — €4.90 — one document for this property (buy in the web app), or €49 — 50 documents (€39 each additional property); first property free (10 documents). Payment happens in the browser, never through the agent. General information/document tooling, not legal advice.
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['landlordName', 'landlordAddress', 'tenantName', 'propertyAddress', 'periodFrom', 'periodTo', 'paymentDate', 'rentAmount', 'chargesAmount'], 'properties': {'locale': {'enum': ['en', 'fr'], 'type': 'string', 'description': 'Filename/interface language only — the document is always issued in French (required for validity). Default fr.'}, 'issuedAt': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'City where the receipt is issued, printed « Fait à … ». Ask the landlord — it is never taken from an address. Omitted, the mention is blank. The date next to it is the day of issue (today, date in France).'}, 'periodTo': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Rental period end (ISO date). The receipt month is derived from this date.'}, 'periodFrom': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Rental period start (ISO date, e.g. 2026-08-01).'}, 'rentAmount': {'type': 'string', 'pattern': '^[0-9]+([.,][0-9]{1,2})?$', 'description': "Rent RECEIVED, excluding charges, in euros, as a string (e.g. '850' or '850.50'). Above 0: a receipt of nothing is refused."}, 'tenantName': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "Tenant's full name (locataire) as it must appear on the receipt."}, 'paymentDate': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Date the landlord RECEIVED the payment (ISO date).'}, 'landlordName': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "Landlord's full name, or the company's name (bailleur). With an account, a company is designated from the landlord profile — « (société) », SIRET — when this name is the profile's; without one, write the designation here."}, 'chargesAmount': {'type': 'string', 'pattern': '^[0-9]+([.,][0-9]{1,2})?$', 'description': "Charges (provisions/forfait), in euros, as a string ('0' if none)."}, 'paymentMethod': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "Payment method as the landlord states it (e.g. 'Virement bancaire', 'Chèque'), printed after « Mode de paiement ». NO default: omitted, the mention is blank. Never guess it."}, 'includeEnglish': {'type': 'boolean', 'description': 'Append a non-binding English reference translation as the last page. The legal document itself stays French.'}, 'landlordAddress': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': "Landlord's address."}, 'propertyAddress': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Address of the rented dwelling.'}, 'acknowledge_incomplete': {'type': 'boolean', 'description': "Set ONLY after the tool has returned status:'needs_input' — with blank_mentions, the mentions the document would print blank — you have shown the landlord that list, and the landlord has explicitly chosen to generate the document with those mentions left blank, to complete them by hand before signing or sending. Never set this on a first call. It never waives a refusal: a missing mandatory input, an unlawful value or an input that would not be printed stays refused."}}}
Changed
calculate_assistant_maternel_end_of_contract
Oct. 1, 2026, 2:52 a.m.
Changed
calculate_home_employment_end_of_contract
Oct. 1, 2026, 2:52 a.m.
Changed
generate_rent_receipt
Sept. 29, 2026, 3:01 a.m.
Changed
calculate_rent_revision
Sept. 29, 2026, 3:01 a.m.
Changed
calculate_deposit_restitution
Sept. 29, 2026, 3:01 a.m.
Changed
check_dpe_rental_restrictions
Sept. 29, 2026, 3:01 a.m.
Added
generate_rent_receipt
Sept. 17, 2026, 12:33 p.m.
Added
check_geneva_quasi_resident
Sept. 17, 2026, 12:33 p.m.
Added
compare_family_allowances
Sept. 17, 2026, 12:33 p.m.
Added
calculate_teletravail_frontalier
Sept. 17, 2026, 12:33 p.m.
Added
compare_lamal_cmu
Sept. 17, 2026, 12:33 p.m.
Added
calculate_net_swiss_salary
Sept. 17, 2026, 12:33 p.m.
Added
calculate_rent_revision
Sept. 17, 2026, 12:33 p.m.
Added
calculate_deposit_restitution
Sept. 17, 2026, 12:33 p.m.
Added
check_dpe_rental_restrictions
Sept. 17, 2026, 12:33 p.m.
Added
calculate_assistant_maternel_end_of_contract
Sept. 17, 2026, 12:33 p.m.
Added
calculate_home_employment_end_of_contract
Sept. 17, 2026, 12:33 p.m.
Added
calculate_tenant_notice_period
Sept. 17, 2026, 12:33 p.m.
Added
check_zone_tendue
Sept. 17, 2026, 12:33 p.m.