french-rental-compliance
Server Details
FR/EN tools for French rental, frontalier & home-employment (CCN 3239) — sourced, dated answers.
- Status
- Healthy
- Uptime
- 99.9% over 55 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 13 tools
Most tools target clearly distinct operations (deposit, rent revision, notice, DPE, zone tendue, receipt, plus cross-border topics). The main overlap is calculate_assistant_maternel_end_of_contract vs calculate_home_employment_end_of_contract, which the description admits share the same engine with a pre-set regime, and there is minor conceptual overlap on the F/G rent freeze between calculate_rent_revision and check_dpe_rental_restrictions.
Every tool follows a consistent verb_noun snake_case pattern: calculate_*, check_*, compare_*, generate_*. The prefixes map cleanly to operation type (compute vs lookup vs comparison vs document generation), making the surface predictable.
13 tools is well within the sweet spot and each appears to earn its place covering distinct compliance scenarios. No redundant or filler tools are evident.
The set covers a solid range of rental lifecycle operations (deposit restitution, rent revision, notice, DPE restrictions, zone tendue, receipt) plus home-employment and cross-border domains. Minor gaps exist — no lease drafting, état des lieux, or dispute/escalation tooling — but core compliance workflows are covered.
Available Tools
13 toolscalculate_assistant_maternel_end_of_contractAssistant maternel (assmat) end of contract — retrait d'enfant, démission, préavis, indemnité (CCN 3239)ARead-onlyInspect
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; départ volontaire à la retraite (art. 63.2.2, notice art. 120; the annex-4 indemnity of art. 121.2 computed on the periods given, PAID BY THE INSURER, not the employer). With no date given the seniority is taken today (Europe/Paris) and the result says so. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| party | Yes | Who is asking: 'employer' (particulier employeur) or 'employee' (salarié / assistant maternel). Wording only — the figures are identical for both. | |
| sent_date | No | 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 | No | Seniority reference date when the letter has not been sent yet (planning). Ignored when notification_date is given. Defaults to today (Europe/Paris) when no date at all is given, as on the web calculator and the documents. | |
| cdd_reason | No | contract_type 'cdd' only: the motif (C. trav. art. L.1242-2) — 'seasonal' has no end-of-contract indemnity (L.1243-10, 1°). | |
| end_reason | Yes | Closed category matching the letter: 'cdd_term_end' (a fixed-term contract ending at its term — C. trav. art. L.1243-5 « cesse de plein droit à l'échéance du terme »: no letter, no notice, no rupture indemnity; the end-of-contract indemnity of L.1243-8 except in the cases of L.1243-10; every figure taken at the term; needs contract_type 'cdd' and cdd_end_date; not when the work went on after the term — then a permanent contract, L.1243-11), '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), 'retirement_by_employer' (mise à la retraite, home employee only, art. 161.1.2: the dismissal's notice, art. 162.5; an indemnity whatever the seniority, computed like art. 163.1, art. 163.2 — for an assistant maternel the employer's ending is the withdrawal of the child, blocked with code retirement_by_employer_is_withdrawal_am), 'retirement_departure' (départ volontaire à la retraite, art. 63.2.2: home employee notice art. 162.5, assistant maternel art. 120; the voluntary-retirement indemnity of annex 4 — art. 163.3 / 121.2 — is computed from annex 4 on sector_months / sector_months_last_84 / avg_60_months_gross when given, else on this contract alone, with payer 'insurer' (annex 4, art. 4.2); reason annex4_conditions_not_met when the periods known do not reach 120 months, 60 of them in the last 84). | |
| start_date | Yes | Contract start (ISO). | |
| cdd_end_date | No | contract_type 'cdd' only: the term of the contract with its renewals (the L.1243-2 notice counts on the total length). | |
| contract_type | No | 'cdi' (permanent) or 'cdd' (fixed-term). Omitted = the rules of a permanent contract. A CDD ends before its term only in the cases of C. trav. art. L.1243-1 / L.1243-2 (CCN 3239 art. 62): agreement of the parties (no official form, no homologation), faute grave, unfitness (L.1226-4-3 / L.1226-20), the employee's resignation on a CDI hire (notice one day per week of the total length, two weeks at most) — any other ending is answered status 'blocked', code cdd_early_end_not_provided. Judged after its term (cdd_end_date), the relationship still running, the CDD is a CDI (L.1243-11). | |
| sector_months | No | retirement_departure only: the months of employment in the branch over the whole career, ALL household employers together (CCN 3239 annex 4, art. 2.2: 120 months needed; 1 month of salary from 10 years, 1.5 from 15, 2 from 20, 2.5 from 30). Defaults to this contract's months — a floor. | |
| entretien_date | No | 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. | |
| leave_pay_mode | No | Home employee: how paid leave is paid — 'on_leave' (when taken) or 'cesu_10pct' (the CESU hourly wage raised by 10 %: « les congés payés sont rémunérés au moment du versement du salaire mensuel », CCN 3239 art. 140.1.2 — then no compensatory paid-leave indemnity at the end). Omitted = unknown: the answer states the rule with its exception. | |
| agreed_end_date | No | 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 | No | Assistant maternel: monthly gross (mensualisation), EXCLUDING indemnités d'entretien, repas, kilométriques. | |
| unfitness_origin | No | 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 | No | Approval ending only (assistant maternel): the conseil départemental's decision. | |
| notification_date | No | 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). When omitted (with sent_date and as_of_date), the seniority is taken TODAY (Europe/Paris) and the result says so (seniority.as_of_default: 'today') — never zero seniority. | |
| serious_misconduct | No | 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 | No | Assistant maternel: optional total gross salaries paid since the start (art. 121.1 base). Defaults to mensualisation × complete months. | |
| avg_60_months_gross | No | retirement_departure only: the monthly average of the gross salaries of the last 60 calendar months in the branch (annex 4, art. 4.1 takes the most favourable of the 60-, 12- and 3-month averages). The indemnity is PAID BY THE INSURER, not by the employer (art. 4.2). | |
| sector_months_last_84 | No | retirement_departure only: of those, the months within the 84 months before the end of the contract (annex 4, art. 2.2: 60 needed). Defaults to this contract's. | |
| approval_notified_date | No | Approval ending only: the day the conseil départemental notified the decision — the contract ends on it (art. 119.3). | |
| unfitness_opinion_date | No | Unfitness only: the date of the occupational physician's final opinion; the rupture takes place within one month of it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint/openWorldHint; the description adds substantial behavioral context: rupture conventionnelle is unavailable (CASF L.423-2), the annex-4 retirement indemnity is PAID BY THE INSURER not the employer, formulas are deterministic with no AI assessment, and with no date seniority defaults to today (Europe/Paris) with the result stating so.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose well, but the opening sentence is duplicated in French and English, adding redundant length, and the run-on clauses about legal articles are dense. It earns most of its space but wastes some on bilingual repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter, rule-heavy tool with no output schema and thin annotations, the description covers the regime, the reason categories, the key thresholds and the date-defaulting behavior. Return shape is not explained, but with deterministic output that is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the 22 parameters is already documented in the schema. The description supplies legal rules (art. 120 notice tiers, 1/80 art. 121.1, 9-month threshold) but little parameter syntax beyond what the schema already states, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (end of an assistant maternel contract) with the exact reasons handled (retrait d'enfant, démission, préavis, indemnité, Pajemploi). It explicitly distinguishes itself from calculate_home_employment_end_of_contract (same engine, regime pre-set) and from the garde d'enfant à domicile case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (parent-employer or assistant maternel), when-not ('NOT for a garde d'enfant à domicile — that is regime garde_domicile on the generic tool'), and names the sibling alternative. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_deposit_restitutionSecurity-deposit restitution calculator — due date, late penalty, vétusté apportionmentARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| damages | No | Damage lines to apportion. Omit for a full restitution. | |
| deposit | Yes | Deposit paid at move-in (€). | |
| lease_type | No | 'vide' unfurnished (deposit cap 1 month) or 'meuble' furnished (cap 2 months). Never presumed: omitted, no cap is computed. | |
| copropriete | No | 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 | Yes | 'identical' when the exit état des lieux matches the entry one (1-month deadline); 'differences' otherwise (2 months). | |
| perspective | No | Who is asking — changes only the next_steps wording, never the figures. | |
| apply_provision | No | 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 | Yes | Date the keys were handed back (remise des clés), ISO date — the deadline runs from this day. | |
| provision_amount | No | 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 | No | 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 | Yes | Monthly rent en principal, excluding charges (€). | |
| tenant_gave_address | No | 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 | No | What justifies the provision (e.g. 'arrêté provisoire des comptes du 15/09/2026'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds substantial non-obvious behavior on top: deterministic rules not AI, 'nothing is assumed' with explicit defaults, disclosure that the fallback grille is ILLUSTRATIVE and that no official grille exists, and that the response flags an assumed date (as_of.assumed). This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical facts are front-loaded in the first sentence, followed by a denser explanatory paragraph. It is long, and the French-language restatement duplicates the English summary rather than adding information for an agent, which costs a point against strict conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must hint at returns, and it does: it names what changes by perspective (next_steps), that the result states the legal maximum, and that an assumed date is surfaced in as_of. For a 13-parameter legal calculator this leaves nothing material an agent needs unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage the baseline is 3, and the description earns above it by adding input-shaping guidance the schema lacks: how to phrase damage items ('what, repair cost, age of the element') and what is deliberately omitted when not supplied (lease type, provision amount). It does not, however, add per-parameter meaning beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names a specific verb-resource pair (deposit restitution) and enumerates the three outputs it produces: due date, late penalty, vétusté-apportioned retentions. It is trivially distinguishable from siblings like calculate_rent_revision or calculate_tenant_notice_period without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operating context: it is for a French residential lease, tells the agent which perspective to pass for landlord vs tenant, and instructs how to elicit inputs ('ask the user for amounts and dates in plain words'). It stops short of naming alternative tools or explicit when-not-to-use conditions, so it is strong but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_home_employment_end_of_contractHome employment end of contract — notice, calendar, indemnity (CCN 3239)ARead-onlyInspect
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; retirement (mise à la retraite art. 161.1.2 / 162.5 / 163.2 — indemnity whatever the seniority; départ volontaire art. 63.2.2, its annex-4 indemnity computed on the periods given and PAID BY THE INSURER, not the employer), the paid job-search hours from 40 hours a week only (art. 162.4.2), no paid-leave indemnity for a CESU wage raised by 10 % (art. 140.1.2). With no date given the seniority is taken today (Europe/Paris) and the result says so. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| party | Yes | Who is asking: 'employer' (particulier employeur) or 'employee' (salarié / assistant maternel). Wording only — the figures are identical for both. | |
| regime | Yes | '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 | No | 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 | No | Seniority reference date when the letter has not been sent yet (planning). Ignored when notification_date is given. Defaults to today (Europe/Paris) when no date at all is given, as on the web calculator and the documents. | |
| cdd_reason | No | contract_type 'cdd' only: the motif (C. trav. art. L.1242-2) — 'seasonal' has no end-of-contract indemnity (L.1243-10, 1°). | |
| end_reason | Yes | Closed category matching the letter: 'cdd_term_end' (a fixed-term contract ending at its term — C. trav. art. L.1243-5 « cesse de plein droit à l'échéance du terme »: no letter, no notice, no rupture indemnity; the end-of-contract indemnity of L.1243-8 except in the cases of L.1243-10; every figure taken at the term; needs contract_type 'cdd' and cdd_end_date; not when the work went on after the term — then a permanent contract, L.1243-11), '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), 'retirement_by_employer' (mise à la retraite, home employee only, art. 161.1.2: the dismissal's notice, art. 162.5; an indemnity whatever the seniority, computed like art. 163.1, art. 163.2 — for an assistant maternel the employer's ending is the withdrawal of the child, blocked with code retirement_by_employer_is_withdrawal_am), 'retirement_departure' (départ volontaire à la retraite, art. 63.2.2: home employee notice art. 162.5, assistant maternel art. 120; the voluntary-retirement indemnity of annex 4 — art. 163.3 / 121.2 — is computed from annex 4 on sector_months / sector_months_last_84 / avg_60_months_gross when given, else on this contract alone, with payer 'insurer' (annex 4, art. 4.2); reason annex4_conditions_not_met when the periods known do not reach 120 months, 60 of them in the last 84). | |
| start_date | Yes | Contract start (ISO). | |
| cdd_end_date | No | contract_type 'cdd' only: the term of the contract with its renewals (the L.1243-2 notice counts on the total length). | |
| hourly_gross | No | Gross hourly rate in € (home employee / garde à domicile). | |
| weekly_hours | No | Weekly hours (mensualisation = hourly × hours × 52 / 12). | |
| contract_type | No | 'cdi' (permanent) or 'cdd' (fixed-term). Omitted = the rules of a permanent contract. A CDD ends before its term only in the cases of C. trav. art. L.1243-1 / L.1243-2 (CCN 3239 art. 62): agreement of the parties (no official form, no homologation), faute grave, unfitness (L.1226-4-3 / L.1226-20), the employee's resignation on a CDI hire (notice one day per week of the total length, two weeks at most) — any other ending is answered status 'blocked', code cdd_early_end_not_provided. Judged after its term (cdd_end_date), the relationship still running, the CDD is a CDI (L.1243-11). | |
| sector_months | No | retirement_departure only: the months of employment in the branch over the whole career, ALL household employers together (CCN 3239 annex 4, art. 2.2: 120 months needed; 1 month of salary from 10 years, 1.5 from 15, 2 from 20, 2.5 from 30). Defaults to this contract's months — a floor. | |
| entretien_date | No | 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. | |
| leave_pay_mode | No | Home employee: how paid leave is paid — 'on_leave' (when taken) or 'cesu_10pct' (the CESU hourly wage raised by 10 %: « les congés payés sont rémunérés au moment du versement du salaire mensuel », CCN 3239 art. 140.1.2 — then no compensatory paid-leave indemnity at the end). Omitted = unknown: the answer states the rule with its exception. | |
| agreed_end_date | No | 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 | No | Assistant maternel: monthly gross (mensualisation), EXCLUDING indemnités d'entretien, repas, kilométriques. | |
| convocation_date | No | Employer termination only: first presentation of the convocation à l'entretien préalable → earliest entretien date (CCN art. 161.1.1.1). | |
| unfitness_origin | No | 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 | No | Approval ending only (assistant maternel): the conseil départemental's decision. | |
| notification_date | No | 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). When omitted (with sent_date and as_of_date), the seniority is taken TODAY (Europe/Paris) and the result says so (seniority.as_of_default: 'today') — never zero seniority. | |
| avg_3_months_gross | No | Optional — average gross monthly pay over the last 3 months (the more favourable average is used). | |
| serious_misconduct | No | 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 | No | Assistant maternel: optional total gross salaries paid since the start (art. 121.1 base). Defaults to mensualisation × complete months. | |
| avg_12_months_gross | No | Optional — average gross monthly pay over the last 12 months (art. 163.1 reference). | |
| avg_60_months_gross | No | retirement_departure only: the monthly average of the gross salaries of the last 60 calendar months in the branch (annex 4, art. 4.1 takes the most favourable of the 60-, 12- and 3-month averages). The indemnity is PAID BY THE INSURER, not by the employer (art. 4.2). | |
| sector_months_last_84 | No | retirement_departure only: of those, the months within the 84 months before the end of the contract (annex 4, art. 2.2: 60 needed). Defaults to this contract's. | |
| approval_notified_date | No | Approval ending only: the day the conseil départemental notified the decision — the contract ends on it (art. 119.3). | |
| unfitness_opinion_date | No | Unfitness only: the date of the occupational physician's final opinion; the rupture takes place within one month of it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description goes further by promising deterministic formulas ('no AI, no assessment of any person'), stating that seniority defaults to today (Europe/Paris) when no date is given, that figures are identical for both parties, and that certain contest windows show only their earliest end. These are meaningful behavioral disclosures beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
After a serviceable bilingual opening sentence, the body becomes a dense wall of semicolon-chained clauses enumerating rules, article numbers and edge cases. It is thorough but not front-loaded or scannable, and much of the legal detail duplicates the 100%-covered schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 28-parameter, high-complexity legal calculator with no output schema, the description covers rules, defaults, blocked cases, payer distinctions and input prerequisites. An agent has enough context to invoke correctly and to anticipate the result shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across 28 params, so the schema already carries the semantic load and baseline is 3. The description mirrors much of that content (notice/indemnity rules, defaults) rather than adding new per-parameter meaning, so no credit above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: computes the end-of-contract figures (notice, dates, indemnity, documents) for a French home-employment contract under CCN 3239, for either party. It explicitly flags the sibling boundary by naming calculate_assistant_maternel_end_of_contract within the regime parameter, so an agent can route between the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives rich conditional guidance on which end_reason/regime combos apply and routes assistant-maternel cases to the sibling tool ('or use calculate_assistant_maternel_end_of_contract'). It lacks an explicit 'do not use this when…' framing, but the routing and prerequisite conditions (e.g. cdd_term_end needs contract_type 'cdd') are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_net_swiss_salaryNet Swiss salary calculator (frontalier)ARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| age | Yes | Employee age (affects LPP rate). | |
| canton | Yes | Swiss canton of work supported by the net-salary engine (GE, VD, JU, NE, BS, VS). | |
| gross_chf_annual | Yes | Gross annual salary in CHF. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds valuable behavioral context: it is deterministic Swiss payroll, no AI, and returns annual + monthly net plus deduction breakdown and data year. It doesn't mention rate limits, but for an offline calculation those are less relevant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose in French and English, then details deductions. It is concise and every sentence adds information. The bilingual opening is slightly redundant but appropriate for a Swiss tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers what it computes, the deduction categories, the return format (annual + monthly net, breakdown, data year), and the deterministic nature. With no output schema, this level of return-value detail is exactly what is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds that age affects the LPP rate and that canton is the border canton of work, which reinforces the schema's own descriptions. No new syntax or format details are provided beyond the schema, but the added context on age/LPP linkage is marginally useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: converts gross annual Swiss salary (CHF) to net for a cross-border worker, and names the exact deductions (AVS/AI/APG, AC, LPP, NBU). This is clearly distinguished from siblings like calculate_teletravail_frontalier and compare_lamal_cmu, which handle different payroll/insurance concerns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (convert gross annual Swiss salary to net for a frontalier in a supported border canton), but it does not explicitly state when not to use this tool, such as for non-border workers or cantons outside the enum. The scope is clear enough for most routing decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_rent_revisionFrench rent revision calculator (IRL indexation)ARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dpe_class | No | Dwelling's DPE class, if known — in a class F or G dwelling the revision cannot be applied (art. 17-1, III). | |
| current_rent | Yes | Current monthly rent excluding charges (hors charges), in euros. | |
| revision_date | No | 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 | Yes | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only/local execution, yet the description goes well beyond them: it discloses the one-year waiver rule that produces a warning when revision_date is over a year old, the non-retroactive application of the new rent, the F/G exclusion, and that the output is deterministic INSEE data with no AI. This is exactly the kind of behavioral context an agent needs for a legal calculation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key result and the F/G exclusion are front-loaded, which is good, but the opening line is duplicated in French and English, and the body is dense with repeated legal citations (loi n° 89-462, loi n° 2021-1104). It is informative but verbose for a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no output schema, the description is nearly complete: it enumerates the returned value (new rent) and the warning conditions, and covers the two legal limits. It is slightly thin on the exact shape of the result, but an agent has enough to call and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it explains that reference_quarter names the quarter of the revision year and that revision_date wins if they disagree, plus the relationship between the two (a mismatch triggers a warning). Useful interpretation guidance on top of an already-documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (computes the legally revised French residential rent) and gives the exact formula (IRL of reference quarter ÷ same quarter one year earlier), naming the governing statute. It implicitly distinguishes itself from siblings like check_dpe_rental_restrictions and generate_rent_receipt by being a calculation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for when to use it: the yearly IRL revision, with the note that class F/G dwellings are excluded and that dpe_class enables that check. However, it never explicitly routes the agent to sibling tools (e.g. check_dpe_rental_restrictions) for the DPE question, leaving the boundary between overlapping tools to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_teletravail_frontalierFrontalier telework — 40 % tax; 25 % / 50 % social securityARead-onlyInspect
Frontalier telework thresholds (FR–CH): 40 % tax; social security Swiss below 25 %, French from 25 % unless the employer's A1 (framework agreement, below 50 %), reported separately. · Télétravail frontalier : seuil fiscal 40 % ; sécurité sociale suisse sous 25 %, française dès 25 % sauf A1 de l'employeur (accord-cadre, moins de 50 %). — 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 in force 24/07/2025, applying to pay from 01/01/2023, vs the EU/EFTA social-security framework agreement since 01/07/2023), the telework days that can still be added over the projected year (its worked days stay fixed) before each is crossed, and how many temporary mission days count inside the allowance (≤ 10 a year). What the 40 % line means depends on the canton of work — give work_canton: Geneva and the other source-taxing cantons stay taxed in Switzerland up to 40 %; the eight cantons of the 1983 agreement are taxed in France and keep the frontalier status up to 40 %. Without it, both regimes are stated. Optional: the 3-month LAMal/CMU droit d'option window (Swiss and EU nationals) from the Swiss employment start date or the later move to France. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| as_of_date | No | YYYY-MM-DD reference date for the option window (default: today) — makes the answer reproducible. | |
| work_canton | No | Swiss canton of work (code like GE, VD, or name). Picks the tax rule: the 8 cantons of the 1983 agreement (BE, SO, BS, BL, VD, VS, NE, JU) tax in France; the others tax at source. Omitted: both regimes are stated. | |
| days_per_week | No | Contractual working days per week (1–7). Default 5. | |
| france_move_date | No | YYYY-MM-DD the worker took up residence in France, if already working in Switzerland — the window then counts from the LATER of the two dates (official form p.3). | |
| mission_days_per_year | No | Temporary mission days per year in France or a third country — only the first 10 count inside the telework allowance. | |
| swiss_employment_start | No | YYYY-MM-DD the Swiss employment began (or the Swiss pension was granted) — adds the 3-month LAMal/CMU droit d'option window. Only if this job opened the option: a first Swiss job since living in France, or a return after unemployment — a change of employer does not reopen it. | |
| telework_days_per_week | Yes | Days per week worked from home in France (fractions allowed, e.g. 1.5). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds meaningful behavioral context: deterministic output, official sourced facts with dates, nothing stored, and the distinction between projection and a signed-in real-position log. It does not describe authentication or rate limits, but those are not central for this read-only calculation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very long, dense, and bilingual, with the French translation doubling content without adding new information. It also delays the core action — projecting the telework position — until after a compact block of legal thresholds, so it is not well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-jurisdiction calculation with no output schema, the description does the heavy lifting: it explains what is returned, the canton-dependent meaning of the 40% line, the separate tax and social-security instruments, the mission-day allowance, and the optional option-window logic. An agent has enough context to invoke it correctly despite the lack of a formal output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are already documented in the schema. The description reinforces how work_canton changes the tax rule and how mission_days_per_year is capped at 10 inside the allowance, but it adds little syntax or interpretation beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (frontalier telework thresholds under FR–CH rules) and states the operation (projects a typical working week and returns telework share, limit positions, addable days, and mission-day treatment). It is clear enough to distinguish from generic calculators, but it does not explicitly contrast itself with the most plausible sibling, compare_lamal_cmu, even though the LAMal/CMU option window is part of its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context: when work_canton should be supplied, what happens if it is omitted, and when the optional LAMal/CMU window applies. It also references the signed-in monthly log path and says list_deadlines then carries threshold warnings, which is useful alternative routing, but it stops short of explicit when-not-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_tenant_notice_periodTenant notice period (préavis) calculator — French residential leaseARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune name, e.g. 'Lyon'. Used when insee_code is not provided. | |
| ground_id | No | Statutory ground for the reduced 1-month notice on an unfurnished lease (art. 15 I). | |
| insee_code | No | INSEE commune code (5 chars, e.g. 75056 for Paris, 2A004 for Ajaccio). Preferred when known — skips name resolution. | |
| lease_type | Yes | 'vide' = unfurnished, 'meuble' = furnished | |
| code_postal | No | 5-digit postal code — disambiguates homonym communes. | |
| zone_tendue | No | Explicit zone-tendue (first list) flag if already known — otherwise resolved from insee_code/commune. | |
| reception_date | No | ISO date the LANDLORD RECEIVES the notice (LRAR reception, remise en main propre, or acte de commissaire) — never the sending date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this by labeling the computation 'Deterministic legal formula — no AI involved.' It adds valuable behavioral context beyond annotations: the reception-date emphasis (never the sending date), the automatic zone-tendue resolution, and the return of justificatifs. This exceeds the baseline for tools with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized, using a semicolon-separated enumeration and clear cause-effect statements. It front-loads the purpose and then provides necessary legal details. The bilingual intro is slightly redundant, but every sentence conveys essential information, keeping it appropriately concise for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey what the function returns, and it does: 'the end date computed ... plus which justificatifs must accompany the letter.' It also covers the legal grounding, the zone-tendue resolution, and the scope (France métropolitaine). It lacks explicit error-handling notes (e.g., what happens with invalid dates), but for a deterministic calculator the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters, so the baseline is 3. The description adds significant semantic value: it explains how lease_type dictates the base period, how ground_id and zone_tendue interact to reduce it, and clarifies the crucial nuance of reception_date (landlord receives, not sent). This goes well beyond the schema's raw field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes the tenant's notice period for terminating a French residential lease, with specific rules (furnished = 1 month, unfurnished = 3 months with reductions). It names the legal reference (loi n° 89-462 art. 15) and distinguishes itself from sibling tools (e.g., calculate_rent_revision, check_zone_tendue) by its explicit scope and outputs (end date and justificatifs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use the tool: for calculating tenant notice periods in France métropolitaine, and even notes it automatically resolves zone tendue, avoiding the need for separate calls. However, it does not explicitly name alternative tools or state when NOT to use it (e.g., for other legal jurisdictions or other lease types), which would push it to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_dpe_rental_restrictionsDPE rental restrictions — letting ban, rent freeze, DPE validityARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dpe_class | Yes | Energy class from the dwelling's DPE. | |
| dpe_issue_date | No | ISO issue date of the DPE — enables the validity check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=true and openWorldHint=false, covering safety. The description adds substantial behavioral context: deterministic rules, legal references (loi n° 2021-1104, loi n° 89-462 art. 17-1), exact threshold dates for bans and rent freezes, and that no AI is involved. It does not mention rate limits or side effects, but for a pure lookup this is strong added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The English purpose statement is front-loaded and followed by legal detail that earns its place for a compliance-oriented tool. The bilingual header partially duplicates the title, adding some redundancy, but the overall structure is efficient and not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter deterministic lookup with no output schema, the description explains exactly what is returned (letting ban status and date, rent freeze, DPE validity) and the condition under which validity is checked. With annotations covering read-only and closed-world behavior, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema itself. The description reinforces meaning (DPE class A–G, dpe_issue_date enabling validity) but adds no syntax, format, or constraint beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource ('French rental restrictions') and action ('returns') tied to a DPE class. The domain is clearly distinct from sibling calculators like calculate_rent_revision or calculate_tenant_notice_period, though it does not explicitly name or differentiate against those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Given a dwelling's DPE class (A–G), returns...' and the conditional mention that dpe_issue_date enables the validity check. However, there is no explicit when-to-use, when-not-to-use, or alternative-tool guidance, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_geneva_quasi_residentQuasi-resident status check — ordinary taxation on request (TOU) for frontaliers taxed at sourceARead-onlyInspect
Quasi-resident status (≥ 90 % of the household's income taxable in CH). · Statut de quasi-résident (≥ 90 % des revenus du foyer imposables en CH). — For a person taxed at source in Switzerland who lives in France (Geneva and every canton outside the 1983 agreement): at least 90 % of the household's worldwide gross income (you + spouse) taxable in Switzerland opens a request for ordinary taxation (TOU), in writing, by 31 March of the following year, every year, not withdrawable once filed (LIFD art. 99a; OIS art. 14). The eight cantons of the agreement of 11 April 1983 (BE, SO, BS, BL, VD, VS, NE, JU) tax in France: not applicable there. Deterministic threshold rule — no AI. Returns eligibility, the share, the threshold, the deadline and the data year.
| Name | Required | Description | Default |
|---|---|---|---|
| work_canton | No | Swiss canton of work (code like GE, ZH, or name). A canton of the 1983 agreement is answered « not applicable » unless source_taxed is true. Omitted: the rule is answered with that condition stated. | |
| source_taxed | No | For a canton of the 1983 agreement (BE, SO, BS, BL, VD, VS, NE, JU): true when the employer withholds Swiss source tax in 2026 (the tax year of the open request, due 31/03/2027) — a condition of the frontalier status is not met (daily return — at most 45 nights a year full time and at most one a week —, 2041-AS, telework ≤ 40 %) or a Swiss national paid by a public-law employer. The request is then open. | |
| swiss_income | Yes | Household (you + spouse) gross income taxable in Switzerland (same currency as total_income). | |
| total_income | Yes | Household (you + spouse) worldwide gross income (same currency). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read-only, closed-world look-up, so the bar is lower; the description nonetheless adds real behavior — the annual 31 March deadline, non-withdrawability once filed, the legal basis (LIFD art. 99a, OIS art. 14) and the fact that it returns eligibility/share/threshold/deadline/data year. It does not discuss error or edge-case handling, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core rule is front-loaded and precise, but the bilingual duplication (English plus French) and the long parenthetical on the cantons of the 1983 agreement make it heavier than necessary for a four-parameter look-up.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fills the gap by enumerating what is returned (eligibility, share, threshold, deadline, data year) and covers the deadline, irreversibility and territorial scope an agent needs to advise correctly. Nothing material to calling or interpreting this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented in the schema, including the canton/1983-agreement interplay for work_canton and source_taxed. The description restates the 90% rule and the same-currency household framing but adds no syntax or format detail beyond the schema — the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific rule-check verb and subject (quasi-resident status, ≥90% of household income taxable in CH) and clearly marks itself as a deterministic threshold rule rather than a calculator, which separates it from the sibling calculate_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States exactly when it applies (person taxed at source in Switzerland living in France, Geneva and cantons outside the 1983 agreement) and when it does not (the eight cantons of the 11 April 1983 agreement, which tax in France). The when-not condition is explicit, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_zone_tendueZone tendue status of a French communeARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| commune | No | Commune name, e.g. 'Lyon'. Used when insee_code is not provided. | |
| insee_code | No | INSEE commune code (5 chars, e.g. 75056 for Paris, 2A004 for Ajaccio). Preferred when known — skips name resolution. | |
| code_postal | No | 5-digit postal code — disambiguates homonym communes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=true and openWorldHint=false annotations, the description adds valuable behavioral context: it is a 'deterministic dataset lookup on DILA reference data (service-public.fr simulator dataset) — no AI involved.' It also discloses the real-world consequences of each list, making the tool's behavior and semantic boundary much clearer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense and front-loaded with the core question, then the critical caveat about the two lists. There is minor redundancy from the bilingual repetition of the opening question, but overall every substantive piece of the explanation earns its place given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description adequately conveys what the caller should expect conceptually: membership in the zone tendue perimeter and which list applies. It also covers the data source, determinism, and input disambiguation needs. It does not specify the exact output shape, but for a boolean/list lookup the semantic outcome is clear enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains the commune name, INSEE code preference, and postal-code disambiguation. The description essentially restates this guidance ('Provide insee_code, or commune (+ code_postal to disambiguate)') without adding new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Checks whether a French commune is in the zone tendue perimeter' and immediately distinguishes the two lists (reduced notice vs. tax-only). This clearly separates the tool from sibling tools and makes its exact scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context by explaining the critical distinction between the two 'zone tendue' lists and warns that the wider TLV perimeter is often mislabelled. It also tells the caller how to provide input ('Provide insee_code, or commune (+ code_postal to disambiguate)'), though it does not explicitly compare against sibling tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_family_allowancesFamily allowances — Swiss vs French (frontalier)ARead-onlyInspect
Family allowances: Swiss vs French for a frontalier. · Allocations familiales : Suisse ou France pour un frontalier. — Compares the family allowances a cross-border worker's household is due under the Swiss canton's rules (BSV 2026 table, LAFam art. 3 age limits; paid monthly with the salary) vs the French CAF (F13213 amounts, modulated by the household's N-2 resources band), and the EU 883/2004 art. 68 differential when the other parent has an activity or an assimilated situation in France. Deterministic official tables — no AI. Returns Swiss monthly + annual (CHF), CAF monthly (EUR), the differential, per-child detail, the notes and the data year.
| Name | Required | Description | Default |
|---|---|---|---|
| canton | Yes | Swiss canton of work — two-letter code, any of the 26 cantons. | |
| children | Yes | The children (at least one). | |
| caf_income_band | No | The household's CAF resources band (revenu net catégoriel of year N-2; service-public F13213): full rate, half or quarter. Omitted → full rate, and the result says so. | |
| spouse_works_in_france | No | Does the OTHER parent have an activity in France (employed or self-employed) or an assimilated situation there (French unemployment, sickness or maternity benefits, paid leave, parental leave treated as activity — Decision F1)? Yes → the CAF pays first and Switzerland pays the difference (Reg. 883/2004 art. 68). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: deterministic official tables with no AI, named sources (BSV 2026, LAFam art. 3, service-public F13213, Reg. 883/2004 art. 68), and the data year. It does not cover edge cases like unsupported canton/child combinations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core comparison sentence is front-loaded and dense with useful specifics, but the leading bilingual title/duplicate ('Family allowances: Swiss vs French... · Allocations familiales : Suisse ou France...') repeats the same information in two languages without adding meaning, and the single long sentence packs legal citations that a selecting agent does not need.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on the return shape: Swiss monthly + annual in CHF, CAF monthly in EUR, the differential, per-child detail, notes and data year. Combined with the source citations and determinism claim, this is nearly sufficient for a moderately complex calculator; only unsupported-case behavior is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with enums and per-field descriptions for canton, children, caf_income_band and spouse_works_in_france, so the baseline is 3. The description adds the legal rationale behind the differential (CAF pays first, Switzerland pays the difference) but largely restates semantics already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('compares') and a scoped resource: family allowances for a cross-border worker under Swiss canton rules vs French CAF, plus the EU 883/2004 art. 68 differential. This is clearly distinguishable from siblings such as compare_lamal_cmu or calculate_teletravail_frontalier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case (a frontalier household with children and possibly a spouse active in France) but never states when to use this tool versus alternatives, nor does it name any sibling. The conditions for the differential are described, but only as domain logic, not as guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_lamal_cmuFrontalier health cover — LAMal vs CMUARead-onlyInspect
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 the French contribution (in EUR, 8 % of the worker's OWN income of year N-2 above 25 % of the PASS — CSS art. L. 380-3-1 IV and D. 380-2). Give income_n2_eur (own net income as declared); without it the French figure is an UPPER estimate from the gross salary, flagged as such. 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 rules of the option (window, reception by the Swiss authority, default, who has it) and how to transmit the form. Recommends neither system.
| Name | Required | Description | Default |
|---|---|---|---|
| age | Yes | Worker's age. | |
| canton | Yes | Swiss canton of work — two-letter code, any of the 26 cantons. | |
| salary_chf | No | Annual gross Swiss salary in CHF — used only when income_n2_eur is missing, and then the French figure is an upper estimate. | |
| children_ages | No | Ages of dependants (optional) — priced by band (≤18 / 19-25 / 26+). | |
| income_n2_eur | No | The worker's OWN income of year N-2 in EUR, net, as declared (salaries + other own income; half of income held in common) — the base of the French contribution (CSS D. 380-2). Not the household revenu fiscal de référence. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint, but the description adds rich behavior: values come from deterministic official premium/rate tables (no AI), it recommends neither system, and it returns option rules (window, reception by Swiss authority, default, who holds it) plus form-transmission guidance. This goes far beyond the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded and every sentence carries meaning; the method, fallback, and legal basis are stated efficiently. The duplicated bilingual header line ('Couverture santé frontalier...') is mildly redundant for an agent but does not dilute the core content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by describing the returns (both monthly figures, option rules, transmission steps). All five parameters are documented at full coverage, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real meaning beyond the schema: income_n2_eur is the worker's OWN net N-2 income, explicitly 'not the household revenu fiscal de référence', and dependants are priced by age band. salary_chf's fallback role is also clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (estimates monthly cost) and a precise resource (the two frontalier health-insurance options, LAMal vs CMU/PUMa), and frames it as the droit d'option choice. An agent can distinguish this from sibling calculators like compare_family_allowances purely from the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the conditional use of parameters: give income_n2_eur for the exact French figure, otherwise salary_chf yields an upper estimate explicitly flagged as such. This covers when and how to invoke it well, but names no alternative sibling tools or exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_rent_receiptGenerate a French rent receipt (quittance de loyer) PDF — free, no accountAInspect
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 Membership — €6 a month or €59 a year, renewed automatically, cancel any time from the account: every rental document on up to 10 properties (€1 a month or €10 a year per extra property), plus home employment, cross-border, letters and patrimoine; first property free (10 documents). Payment happens in the browser, never through the agent. General information/document tooling, not legal advice.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Filename/interface language only — the document is always issued in French (required for validity). Default fr. | |
| issuedAt | No | 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 | Yes | Rental period end (ISO date). The receipt month is derived from this date. | |
| periodFrom | Yes | Rental period start (ISO date, e.g. 2026-08-01). | |
| rentAmount | Yes | Rent RECEIVED, excluding charges, in euros, as a string (e.g. '850' or '850.50'). Above 0: a receipt of nothing is refused. | |
| tenantName | Yes | Tenant's full name (locataire) as it must appear on the receipt. | |
| paymentDate | Yes | Date the landlord RECEIVED the payment (ISO date). | |
| landlordName | Yes | 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 | Yes | Charges (provisions/forfait), in euros, as a string ('0' if none). | |
| paymentMethod | No | 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 | No | Append a non-binding English reference translation as the last page. The legal document itself stays French. | |
| landlordAddress | Yes | Landlord's address. | |
| propertyAddress | Yes | Address of the rented dwelling. | |
| acknowledge_incomplete | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and idempotentHint=false, and the description supplies the missing behavioral detail: the PDF lives 24 hours behind a single-use link then is deleted, per-network rate caps return a structured rate_limited result with retry guidance, missing mentions print blank and are never invented, and refusals persist even with acknowledge_incomplete. That is far beyond what the annotations state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical information (free, French-only output, blank mentions, needs_input flow) is front-loaded, but the description is very long and its account/membership paragraph is dense commercial detail (€4.90, €6/month, €59/year, 10 properties, extra-property rates, e-signature) that contributes little to selecting or correctly invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with no output schema, the description closes the important gaps: it names the interactive return states the agent must handle (needs_input/blank_mentions, printed_blank, rate_limited), the 24-hour link lifetime, and the mandatory-French constraint. No output schema exists, so the return-value explanation it does provide is warranted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so baseline would be 3; the description nonetheless adds cross-parameter semantics the schema cannot express — omitted mentions become printed blanks, includeEnglish only appends a non-binding translation while the document stays French, and acknowledge_incomplete is meaningful only after a needs_input response. It does not add format examples beyond the schema's own patterns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact: produce a French rent receipt (quittance de loyer) PDF from supplied landlord/tenant/period/rent data. The legal frame (loi n° 89-462 art. 21) and 'deterministic template engine, not AI-generated' pin down exactly what is produced, which is distinguishable from the calculation-only siblings that merely compute amounts or eligibility.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operating conditions: have the landlord verify every field, payment happens in the browser never through the agent, and the acknowledge_incomplete flag must never be set on a first call — only after a needs_input response has been shown to the landlord. It also describes the account-based variant and pricing path, so an agent knows both the free flow and when the paid one applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
- Changed
calculate_assistant_maternel_end_of_contract11 fields changed- changed
Input schema / properties / as_of_date / descriptionPrevious value: -"Seniority reference date when the letter has not been sent yet (planning). Ignored when notification_date is given."New value: +"Seniority reference date when the letter has not been sent yet (planning). Ignored when notification_date is given. Defaults to today (Europe/Paris) when no date at all is given, as on the web calculator and the documents." - added
Input schema / properties / avg_60_months_grossAdded value: +{ + "description": "retirement_departure only: the monthly average of the gross salaries of the last 60 calendar months in the branch (annex 4, art. 4.1 takes the most favourable of the 60-, 12- and 3-month averages). The indemnity is PAID BY THE INSURER, not by the employer (art. 4.2).", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / cdd_end_dateAdded value: +{ + "description": "contract_type 'cdd' only: the term of the contract with its renewals (the L.1243-2 notice counts on the total length).", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / cdd_reasonAdded value: +{ + "description": "contract_type 'cdd' only: the motif (C. trav. art. L.1242-2) — 'seasonal' has no end-of-contract indemnity (L.1243-10, 1°).", + "enum": [ + "replacement_absence", + "replacement_part_time", + "replacement_suspension", + "replacement_before_removal", + "awaiting_cdi", + "temporary_increase", + "seasonal" + ], + "type": "string" +} - added
Input schema / properties / contract_typeAdded value: +{ + "description": "'cdi' (permanent) or 'cdd' (fixed-term). Omitted = the rules of a permanent contract. A CDD ends before its term only in the cases of C. trav. art. L.1243-1 / L.1243-2 (CCN 3239 art. 62): agreement of the parties (no official form, no homologation), faute grave, unfitness (L.1226-4-3 / L.1226-20), the employee's resignation on a CDI hire (notice one day per week of the total length, two weeks at most) — any other ending is answered status 'blocked', code cdd_early_end_not_provided. Judged after its term (cdd_end_date), the relationship still running, the CDD is a CDI (L.1243-11).", + "enum": [ + "cdi", + "cdd" + ], + "type": "string" +} - changed
Input schema / properties / end_reason / descriptionPrevious value: -"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)."New value: +"Closed category matching the letter: 'cdd_term_end' (a fixed-term contract ending at its term — C. trav. art. L.1243-5 « cesse de plein droit à l'échéance du terme »: no letter, no notice, no rupture indemnity; the end-of-contract indemnity of L.1243-8 except in the cases of L.1243-10; every figure taken at the term; needs contract_type 'cdd' and cdd_end_date; not when the work went on after the term — then a permanent contract, L.1243-11), '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), 'retirement_by_employer' (mise à la retraite, home employee only, art. 161.1.2: the dismissal's notice, art. 162.5; an indemnity whatever the seniority, computed like art. 163.1, art. 163.2 — for an assistant maternel the employer's ending is the withdrawal of the child, blocked with code retirement_by_employer_is_withdrawal_am), 'retirement_departure' (départ volontaire à la retraite, art. 63.2.2: home employee notice art. 162.5, assistant maternel art. 120; the voluntary-retirement indemnity of annex 4 — art. 163.3 / 121.2 — is computed from annex 4 on sector_months / sector_months_last_84 / avg_60_months_gross when given, else on this contract alone, with payer 'insurer' (annex 4, art. 4.2); reason annex4_conditions_not_met when the periods known do not reach 120 months, 60 of them in the last 84)." - changed
Input schema / properties / end_reason / enumPrevious value: -[ - "employer_termination", - "resignation", - "mutual_termination", - "unfitness", - "approval_withdrawn" -]New value: +[ + "employer_termination", + "resignation", + "mutual_termination", + "unfitness", + "approval_withdrawn", + "retirement_by_employer", + "retirement_departure", + "cdd_term_end" +] - added
Input schema / properties / leave_pay_modeAdded value: +{ + "description": "Home employee: how paid leave is paid — 'on_leave' (when taken) or 'cesu_10pct' (the CESU hourly wage raised by 10 %: « les congés payés sont rémunérés au moment du versement du salaire mensuel », CCN 3239 art. 140.1.2 — then no compensatory paid-leave indemnity at the end). Omitted = unknown: the answer states the rule with its exception.", + "enum": [ + "on_leave", + "cesu_10pct" + ], + "type": "string" +} - changed
Input schema / properties / notification_date / descriptionPrevious value: -"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."New value: +"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). When omitted (with sent_date and as_of_date), the seniority is taken TODAY (Europe/Paris) and the result says so (seniority.as_of_default: 'today') — never zero seniority." - added
Input schema / properties / sector_monthsAdded value: +{ + "description": "retirement_departure only: the months of employment in the branch over the whole career, ALL household employers together (CCN 3239 annex 4, art. 2.2: 120 months needed; 1 month of salary from 10 years, 1.5 from 15, 2 from 20, 2.5 from 30). Defaults to this contract's months — a floor.", + "maximum": 720, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / sector_months_last_84Added value: +{ + "description": "retirement_departure only: of those, the months within the 84 months before the end of the contract (annex 4, art. 2.2: 60 needed). Defaults to this contract's.", + "maximum": 84, + "minimum": 0, + "type": "number" +}
- Changed
calculate_home_employment_end_of_contract11 fields changed- changed
Input schema / properties / as_of_date / descriptionPrevious value: -"Seniority reference date when the letter has not been sent yet (planning). Ignored when notification_date is given."New value: +"Seniority reference date when the letter has not been sent yet (planning). Ignored when notification_date is given. Defaults to today (Europe/Paris) when no date at all is given, as on the web calculator and the documents." - added
Input schema / properties / avg_60_months_grossAdded value: +{ + "description": "retirement_departure only: the monthly average of the gross salaries of the last 60 calendar months in the branch (annex 4, art. 4.1 takes the most favourable of the 60-, 12- and 3-month averages). The indemnity is PAID BY THE INSURER, not by the employer (art. 4.2).", + "minimum": 0, + "type": "number" +} - added
Input schema / properties / cdd_end_dateAdded value: +{ + "description": "contract_type 'cdd' only: the term of the contract with its renewals (the L.1243-2 notice counts on the total length).", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / cdd_reasonAdded value: +{ + "description": "contract_type 'cdd' only: the motif (C. trav. art. L.1242-2) — 'seasonal' has no end-of-contract indemnity (L.1243-10, 1°).", + "enum": [ + "replacement_absence", + "replacement_part_time", + "replacement_suspension", + "replacement_before_removal", + "awaiting_cdi", + "temporary_increase", + "seasonal" + ], + "type": "string" +} - added
Input schema / properties / contract_typeAdded value: +{ + "description": "'cdi' (permanent) or 'cdd' (fixed-term). Omitted = the rules of a permanent contract. A CDD ends before its term only in the cases of C. trav. art. L.1243-1 / L.1243-2 (CCN 3239 art. 62): agreement of the parties (no official form, no homologation), faute grave, unfitness (L.1226-4-3 / L.1226-20), the employee's resignation on a CDI hire (notice one day per week of the total length, two weeks at most) — any other ending is answered status 'blocked', code cdd_early_end_not_provided. Judged after its term (cdd_end_date), the relationship still running, the CDD is a CDI (L.1243-11).", + "enum": [ + "cdi", + "cdd" + ], + "type": "string" +} - changed
Input schema / properties / end_reason / descriptionPrevious value: -"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)."New value: +"Closed category matching the letter: 'cdd_term_end' (a fixed-term contract ending at its term — C. trav. art. L.1243-5 « cesse de plein droit à l'échéance du terme »: no letter, no notice, no rupture indemnity; the end-of-contract indemnity of L.1243-8 except in the cases of L.1243-10; every figure taken at the term; needs contract_type 'cdd' and cdd_end_date; not when the work went on after the term — then a permanent contract, L.1243-11), '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), 'retirement_by_employer' (mise à la retraite, home employee only, art. 161.1.2: the dismissal's notice, art. 162.5; an indemnity whatever the seniority, computed like art. 163.1, art. 163.2 — for an assistant maternel the employer's ending is the withdrawal of the child, blocked with code retirement_by_employer_is_withdrawal_am), 'retirement_departure' (départ volontaire à la retraite, art. 63.2.2: home employee notice art. 162.5, assistant maternel art. 120; the voluntary-retirement indemnity of annex 4 — art. 163.3 / 121.2 — is computed from annex 4 on sector_months / sector_months_last_84 / avg_60_months_gross when given, else on this contract alone, with payer 'insurer' (annex 4, art. 4.2); reason annex4_conditions_not_met when the periods known do not reach 120 months, 60 of them in the last 84)." - changed
Input schema / properties / end_reason / enumPrevious value: -[ - "employer_termination", - "resignation", - "mutual_termination", - "unfitness", - "approval_withdrawn" -]New value: +[ + "employer_termination", + "resignation", + "mutual_termination", + "unfitness", + "approval_withdrawn", + "retirement_by_employer", + "retirement_departure", + "cdd_term_end" +] - added
Input schema / properties / leave_pay_modeAdded value: +{ + "description": "Home employee: how paid leave is paid — 'on_leave' (when taken) or 'cesu_10pct' (the CESU hourly wage raised by 10 %: « les congés payés sont rémunérés au moment du versement du salaire mensuel », CCN 3239 art. 140.1.2 — then no compensatory paid-leave indemnity at the end). Omitted = unknown: the answer states the rule with its exception.", + "enum": [ + "on_leave", + "cesu_10pct" + ], + "type": "string" +} - changed
Input schema / properties / notification_date / descriptionPrevious value: -"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."New value: +"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). When omitted (with sent_date and as_of_date), the seniority is taken TODAY (Europe/Paris) and the result says so (seniority.as_of_default: 'today') — never zero seniority." - added
Input schema / properties / sector_monthsAdded value: +{ + "description": "retirement_departure only: the months of employment in the branch over the whole career, ALL household employers together (CCN 3239 annex 4, art. 2.2: 120 months needed; 1 month of salary from 10 years, 1.5 from 15, 2 from 20, 2.5 from 30). Defaults to this contract's months — a floor.", + "maximum": 720, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / sector_months_last_84Added value: +{ + "description": "retirement_departure only: of those, the months within the 84 months before the end of the contract (annex 4, art. 2.2: 60 needed). Defaults to this contract's.", + "maximum": 84, + "minimum": 0, + "type": "number" +}
- Changed
calculate_net_swiss_salary1 field changed- changed
Input schema / properties / canton / descriptionPrevious value: -"Swiss border canton (GE, VD, JU, NE, BS, VS)."New value: +"Swiss canton of work supported by the net-salary engine (GE, VD, JU, NE, BS, VS)."
- Changed
calculate_teletravail_frontalier3 fields changed- added
Input schema / properties / france_move_dateAdded value: +{ + "description": "YYYY-MM-DD the worker took up residence in France, if already working in Switzerland — the window then counts from the LATER of the two dates (official form p.3).", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Input schema / properties / swiss_employment_start / descriptionPrevious value: -"YYYY-MM-DD the Swiss employment began — adds the 3-month LAMal/CMU droit d'option window."New value: +"YYYY-MM-DD the Swiss employment began (or the Swiss pension was granted) — adds the 3-month LAMal/CMU droit d'option window. Only if this job opened the option: a first Swiss job since living in France, or a return after unemployment — a change of employer does not reopen it." - added
Input schema / properties / work_cantonAdded value: +{ + "description": "Swiss canton of work (code like GE, VD, or name). Picks the tax rule: the 8 cantons of the 1983 agreement (BE, SO, BS, BL, VD, VS, NE, JU) tax in France; the others tax at source. Omitted: both regimes are stated.", + "maxLength": 40, + "type": "string" +}
- Changed
check_geneva_quasi_resident4 fields changed- added
Input schema / properties / source_taxedAdded value: +{ + "description": "For a canton of the 1983 agreement (BE, SO, BS, BL, VD, VS, NE, JU): true when the employer withholds Swiss source tax in 2026 (the tax year of the open request, due 31/03/2027) — a condition of the frontalier status is not met (daily return — at most 45 nights a year full time and at most one a week —, 2041-AS, telework ≤ 40 %) or a Swiss national paid by a public-law employer. The request is then open.", + "type": "boolean" +} - changed
Input schema / properties / swiss_income / descriptionPrevious value: -"Income taxable in Switzerland (same currency as total_income)."New value: +"Household (you + spouse) gross income taxable in Switzerland (same currency as total_income)." - changed
Input schema / properties / total_income / descriptionPrevious value: -"Total worldwide household income (same currency)."New value: +"Household (you + spouse) worldwide gross income (same currency)." - added
Input schema / properties / work_cantonAdded value: +{ + "description": "Swiss canton of work (code like GE, ZH, or name). A canton of the 1983 agreement is answered « not applicable » unless source_taxed is true. Omitted: the rule is answered with that condition stated.", + "maxLength": 40, + "type": "string" +}
- Changed
compare_family_allowances7 fields changed- added
Input schema / properties / caf_income_bandAdded value: +{ + "description": "The household's CAF resources band (revenu net catégoriel of year N-2; service-public F13213): full rate, half or quarter. Omitted → full rate, and the result says so.", + "enum": [ + "full", + "half", + "quarter" + ], + "type": "string" +} - changed
Input schema / properties / canton / descriptionPrevious value: -"Swiss border canton (GE, VD, JU, NE, BS, VS)."New value: +"Swiss canton of work — two-letter code, any of the 26 cantons." - changed
Input schema / properties / canton / enumPrevious value: -[ - "GE", - "VD", - "JU", - "NE", - "BS", - "VS" -]New value: +[ + "AG", + "AI", + "AR", + "BE", + "BL", + "BS", + "FR", + "GE", + "GL", + "GR", + "JU", + "LU", + "NE", + "NW", + "OW", + "SG", + "SH", + "SO", + "SZ", + "TG", + "TI", + "UR", + "VD", + "VS", + "ZG", + "ZH" +] - changed
Input schema / properties / children / items / properties / age / descriptionPrevious value: -"Child's age."New value: +"Child's completed age." - changed
Input schema / properties / children / items / properties / in_training / descriptionPrevious value: -"In education/training (extends eligibility)."New value: +"In post-compulsory training (training allowance from 15 at the earliest, until 25 at the latest — LAFam art. 3), or still at school after 16." - added
Input schema / properties / children / items / properties / incapableAdded value: +{ + "description": "Unable to exercise a gainful activity (art. 7 LPGA): child allowance until 20.", + "type": "boolean" +} - changed
Input schema / properties / spouse_works_in_france / descriptionPrevious value: -"Does the spouse work in France? (triggers the EU differential)."New value: +"Does the OTHER parent have an activity in France (employed or self-employed) or an assimilated situation there (French unemployment, sickness or maternity benefits, paid leave, parental leave treated as activity — Decision F1)? Yes → the CAF pays first and Switzerland pays the difference (Reg. 883/2004 art. 68)."
- Changed
compare_lamal_cmu5 fields changed- changed
Input schema / properties / canton / descriptionPrevious value: -"Swiss border canton (GE, VD, JU, NE, BS, VS)."New value: +"Swiss canton of work — two-letter code, any of the 26 cantons." - changed
Input schema / properties / canton / enumPrevious value: -[ - "GE", - "VD", - "JU", - "NE", - "BS", - "VS" -]New value: +[ + "AG", + "AI", + "AR", + "BE", + "BL", + "BS", + "FR", + "GE", + "GL", + "GR", + "JU", + "LU", + "NE", + "NW", + "OW", + "SG", + "SH", + "SO", + "SZ", + "TG", + "TI", + "UR", + "VD", + "VS", + "ZG", + "ZH" +] - added
Input schema / properties / income_n2_eurAdded value: +{ + "description": "The worker's OWN income of year N-2 in EUR, net, as declared (salaries + other own income; half of income held in common) — the base of the French contribution (CSS D. 380-2). Not the household revenu fiscal de référence.", + "maximum": 5000000, + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / salary_chf / descriptionPrevious value: -"Annual Swiss salary in CHF."New value: +"Annual gross Swiss salary in CHF — used only when income_n2_eur is missing, and then the French figure is an upper estimate." - changed
Input schema / requiredPrevious value: -[ - "salary_chf", - "age", - "canton" -]New value: +[ + "age", + "canton" +]
2 tool updates
- Changed
calculate_assistant_maternel_end_of_contract10 fields changed- added
Input schema / properties / agreed_end_dateAdded value: +{ + "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / approval_decisionAdded value: +{ + "description": "Approval ending only (assistant maternel): the conseil départemental's decision.", + "enum": [ + "suspension", + "modification", + "retrait" + ], + "type": "string" +} - added
Input schema / properties / approval_notified_dateAdded value: +{ + "description": "Approval ending only: the day the conseil départemental notified the decision — the contract ends on it (art. 119.3).", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Input schema / properties / end_reason / descriptionPrevious value: -"Closed category matching the letter: 'employer_termination' (licenciement / retrait d'enfant), 'resignation' (démission), 'mutual_termination' (rupture conventionnelle — not available for assistants maternels)."New value: +"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)." - changed
Input schema / properties / end_reason / enumPrevious value: -[ - "employer_termination", - "resignation", - "mutual_termination" -]New value: +[ + "employer_termination", + "resignation", + "mutual_termination", + "unfitness", + "approval_withdrawn" +] - added
Input schema / properties / entretien_dateAdded value: +{ + "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Input schema / properties / notification_date / descriptionPrevious value: -"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 signature date. Omit for durations only."New value: +"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." - added
Input schema / properties / sent_dateAdded value: +{ + "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / unfitness_opinion_dateAdded value: +{ + "description": "Unfitness only: the date of the occupational physician's final opinion; the rupture takes place within one month of it.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / unfitness_originAdded value: +{ + "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'.", + "enum": [ + "occupational", + "non_occupational" + ], + "type": "string" +}
- Changed
calculate_home_employment_end_of_contract10 fields changed- added
Input schema / properties / agreed_end_dateAdded value: +{ + "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / approval_decisionAdded value: +{ + "description": "Approval ending only (assistant maternel): the conseil départemental's decision.", + "enum": [ + "suspension", + "modification", + "retrait" + ], + "type": "string" +} - added
Input schema / properties / approval_notified_dateAdded value: +{ + "description": "Approval ending only: the day the conseil départemental notified the decision — the contract ends on it (art. 119.3).", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Input schema / properties / end_reason / descriptionPrevious value: -"Closed category matching the letter: 'employer_termination' (licenciement / retrait d'enfant), 'resignation' (démission), 'mutual_termination' (rupture conventionnelle — not available for assistants maternels)."New value: +"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)." - changed
Input schema / properties / end_reason / enumPrevious value: -[ - "employer_termination", - "resignation", - "mutual_termination" -]New value: +[ + "employer_termination", + "resignation", + "mutual_termination", + "unfitness", + "approval_withdrawn" +] - added
Input schema / properties / entretien_dateAdded value: +{ + "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Input schema / properties / notification_date / descriptionPrevious value: -"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 signature date. Omit for durations only."New value: +"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." - added
Input schema / properties / sent_dateAdded value: +{ + "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / unfitness_opinion_dateAdded value: +{ + "description": "Unfitness only: the date of the occupational physician's final opinion; the rupture takes place within one month of it.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / unfitness_originAdded value: +{ + "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'.", + "enum": [ + "occupational", + "non_occupational" + ], + "type": "string" +}
3 tool updates
- Changed
calculate_deposit_restitution8 fields changed- changed
Input schema / properties / apply_provision / descriptionPrevious value: -"true to actually keep the copropriété provision in the figures (default false)."New value: +"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." - changed
Input schema / properties / copropriete / descriptionPrevious value: -"true when the building is a copropriété: the landlord may keep a provision ≤ 20 % of the deposit until the annual charge settlement."New value: +"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)." - changed
Input schema / properties / damages / items / properties / age_years / descriptionPrevious value: -"Age of the element in years (installed or last renewed). Defaults to 0."New value: +"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." - changed
Input schema / properties / lease_type / descriptionPrevious value: -"'vide' unfurnished (deposit cap 1 month) or 'meuble' furnished (cap 2 months). Defaults to vide."New value: +"'vide' unfurnished (deposit cap 1 month) or 'meuble' furnished (cap 2 months). Never presumed: omitted, no cap is computed." - added
Input schema / properties / provision_amountAdded value: +{ + "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.", + "maximum": 1000000, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / provision_justificationAdded value: +{ + "description": "What justifies the provision (e.g. 'arrêté provisoire des comptes du 15/09/2026').", + "maxLength": 300, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / restitution_date / descriptionPrevious value: -"Date the deposit was / will be returned (ISO). Defaults to today — the penalty is computed against it."New value: +"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)." - changed
Input schema / properties / tenant_gave_address / descriptionPrevious value: -"false when the tenant never gave a new address — the late penalty is then not due (art. 22). Defaults to true."New value: +"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."
- Changed
calculate_rent_revision1 field changed- changed
Input schema / properties / dpe_class / descriptionPrevious value: -"Dwelling's DPE class, if known — F or G blocks the revision (rent freeze)."New value: +"Dwelling's DPE class, if known — in a class F or G dwelling the revision cannot be applied (art. 17-1, III)."
- Changed
generate_rent_receipt5 fields changed- added
Input schema / properties / acknowledge_incompleteAdded value: +{ + "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.", + "type": "boolean" +} - added
Input schema / properties / issuedAtAdded value: +{ + "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).", + "maxLength": 120, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / landlordName / descriptionPrevious value: -"Landlord's full name (bailleur)."New value: +"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." - changed
Input schema / properties / paymentMethod / descriptionPrevious value: -"Payment method (e.g. 'Virement bancaire', 'Chèque'). Defaults to bank transfer."New value: +"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." - changed
Input schema / properties / rentAmount / descriptionPrevious value: -"Rent excluding charges, in euros, as a string (e.g. '850' or '850.50')."New value: +"Rent RECEIVED, excluding charges, in euros, as a string (e.g. '850' or '850.50'). Above 0: a receipt of nothing is refused."
1 tool update
- Added
calculate_teletravail_frontalier
1 tool update
- Added
calculate_deposit_restitution
1 tool update
- Added
generate_rent_receipt
1 tool update
- Changed
calculate_rent_revision2 fields changed- changed
Input schema / properties / reference_quarter / descriptionPrevious value: -"The IRL reference quarter named in the lease (trimestre de référence). Accepts forms like '2026-T2', 'T2 2026', 'Q2 2026'."New value: +"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." - added
Input schema / properties / revision_dateAdded value: +{ + "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.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +}
Related MCP Connectors
French rental tools: create & e-sign a lease, rent control, IRL, deposit, receipts (France).
French law articles, codes, collective agreements, case law (Judilibre) and IDCC lookup.
Calcul fiscal (IR, IFI, PER, plus-value) et retraite français — 32 régimes, sourcé et daté.
Sourced answers on FR/EU rules + French company search (SIREN, NAF) for agents, quoted and budgeted
Related MCP Servers
- AlicenseAqualityBmaintenanceExact French real-estate legal calculations for AI agents: IRL rent revision, service-charge reconciliation, compliant rent receipts — legal basis included in every answer.41MIT
- AlicenseNot gradedqualityBmaintenanceSourced, dated calculations for French income tax and pensions across 32 retirement schemes — every result carries its confidence level, its legal sources and the fiscal year, and returns non_calculable rather than a guess. Hosted remote MCP + REST, paid per call via x402 (USDC on Base); two discovery tools are free.1MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to plan and price household employment in Switzerland (cleaner, nanny, carer), returning hiring checklists with real deadlines, employer costs and net wages, minimum-wage checks, and rules for all 26 cantons through read-only tools. Every figure is tied to its official source document and verification date.CC BY-4.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to access French residential rental tools including lease creation and e-signing, rent control checks, rent revision, and document generation.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.