{"version":"1.0.0","tools":[{"name":"get_workspace_info","title":"Informazioni sull'ente","description":"CHIAMALO PER PRIMO. Descrive l'ente a cui questo accesso è legato: nome, tipo di ente, periodo contabile, gli esercizi (anni) con il regime contabile di ciascuno (cassa o competenza), se sono chiusi e se hanno movimenti, il piano di abbonamento, i permessi (scope) di questo accesso e il ruolo con cui agisce, i limiti di uso equo. I valori in denaro di tutti gli strumenti sono stringhe con 2 decimali (es. \"1234.56\"); gli importi dei movimenti sono negativi per le uscite. Nessun argomento: l'ente è sempre quello dell'accesso.","domain":"context","scope":["read"],"permission":null,"write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_years","title":"Esercizi","description":"Gli esercizi (anni) dell'ente con il regime contabile di ciascuno (cassa o competenza) e quali sono chiusi. Sola lettura: gli agenti non creano, chiudono né riaprono esercizi e non cambiano il regime. Per il quadro completo con piano e permessi usa get_workspace_info.","domain":"context","scope":["read"],"permission":"settings.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_bank_accounts","title":"Conti e casse","description":"Conti bancari, conti online e casse contanti dell'ente, con IBAN, saldo iniziale e fido. Servono gli id (bankAccountId) per filtrare i movimenti e per importare un estratto conto.","domain":"context","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_accounts","title":"Piano dei conti (elenco)","description":"Elenco piatto del piano dei conti per l'esercizio (codice, nome, natura, lato normale, saldo aggregato in cent). Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_piano_conti","title":"Piano dei conti (albero)","description":"Piano dei conti gerarchico (albero) con saldi aggregati per nodo e quadratura. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_trial_balance","title":"Bilancio di verifica","description":"Bilancio di verifica: per conto totale dare/avere e saldo, più ΣDare/ΣAvere e flag quadra. Opzionale asOfDate. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"asOfDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_modello_a","title":"Stato Patrimoniale (Modello A)","description":"Stato Patrimoniale per competenza (Attivo/Passivo, stock alla data di chiusura). Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_modello_b","title":"Rendiconto Gestionale (Modello B)","description":"Rendiconto Gestionale per competenza (oneri/proventi aree A–E, flusso, incluse righe non monetarie). Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_open_items","title":"Partite aperte (crediti/debiti)","description":"Partite aperte (crediti = receivable, debiti = payable) con residuo. Filtri: kind, status, asOf. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza-workspace","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"kind":{"type":"string","enum":["crediti","debiti"]},"status":{"type":"string","enum":["aperta","parziale","chiusa","stornata"]},"asOf":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["kind"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_journal_entries","title":"Scritture del giornale","description":"Testate del libro giornale per l'esercizio (data, descrizione, ΣDare/ΣAvere, balanced, stato). Paginabile via limit. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"prima_nota.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"limit":{"type":"integer","minimum":1,"maximum":1000}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_journal_entry","title":"Dettaglio scrittura","description":"Una singola scrittura (testata + righe dare/avere) per id, all'interno dell'esercizio. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"prima_nota.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["year","entryId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"reconcile_status","title":"Stato riconciliazione","description":"Sintesi riconciliazione movimenti banca ↔ partite: quante riconciliazioni suggeribili e quante 'sicure'. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza-workspace","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"check_quadratura","title":"Verifica quadratura","description":"Verifica le due invarianti della partita doppia: giornale (ΣDare===ΣAvere, dal bilancio di verifica) e patrimoniale (Attivo===Passivo, dallo Stato Patrimoniale). isBalanced = entrambe vere. Recupera i numeri dagli engine, non li ricalcola. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"validate_period_close","title":"Verifica chiudibilità esercizio","description":"Dry-run di chiusura: { canClose, blockers[], warnings[] } — scritture sbilanciate, bozze, partite senza contropartita, anno precedente non chiuso, ecc. Ogni voce ha label e stateLabel in italiano, delta in euro e la guida (cosa controlla, cosa fare). NON chiude nulla. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_salute","title":"Salute contabile","description":"Cruscotto Salute contabile: tutti i controlli (saldo banca, partite, continuità, numerazione, ritenute, quadratura) con stato e dettaglio + isDepositabile. Ogni controllo ha label e stateLabel in italiano, delta in euro e la guida; saldo_banca ha anche bank e ledger (euro) e una spiegazione dello scarto. Fonte: ledger.","domain":"contabilita","scope":["read:contabilita"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_movements","title":"Elenco movimenti","description":"Elenco paginato dei movimenti (entrate positive, uscite negative) con categoria, centri di costo, contributi imputati, numero di documenti e ritenuta. Filtri: year (esercizio) oppure from/to, accountId o bankAccountId (list_bank_accounts), categoryId (id da list_categories), costCenterId o \"unassigned\", projectId (contributo/fondo) o \"unassigned\", status, search (descrizione/controparte), amountSign, counterpartyKeys (chiavi da list_counterparties). Restituisce anche statusCounts (conteggi per stato sulla stessa vista) e nextCursor.","domain":"movements","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"categoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"costCenterId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string","const":"unassigned"}]},"projectId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string","const":"unassigned"}]},"status":{"type":"string","enum":["complete","missing_document","needs_review","ambiguous","to_review"]},"search":{"type":"string","minLength":1,"maxLength":200},"amountSign":{"type":"string","enum":["positive","negative"]},"counterpartyKeys":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}},"sortField":{"type":"string","enum":["date","amount","description","counterparty"]},"sortDir":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_movement","title":"Dettaglio movimento","description":"Vista completa di UN movimento: dati, categoria, imputazioni ai contributi, ripartizione sui centri di costo, documenti collegati (solo metadati) e avvisi aperti.","domain":"movements","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["movementId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_unclassified_movements","title":"Movimenti da classificare","description":"Movimenti senza alcuna categoria, paginati: il punto di partenza per classificare. Stessi filtri e stessa risposta di list_movements (year o from/to, accountId, search, amountSign...).","domain":"movements","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"categoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"costCenterId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string","const":"unassigned"}]},"projectId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string","const":"unassigned"}]},"status":{"type":"string","enum":["complete","missing_document","needs_review","ambiguous","to_review"]},"search":{"type":"string","minLength":1,"maxLength":200},"amountSign":{"type":"string","enum":["positive","negative"]},"counterpartyKeys":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}},"sortField":{"type":"string","enum":["date","amount","description","counterparty"]},"sortDir":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_counterparties","title":"Controparti","description":"Controparti dei movimenti (nome normalizzato `key`, etichetta più frequente `label`, numero di movimenti) nel periodo, dalla più frequente. Le `key` si passano a list_movements come counterpartyKeys. `empty` conta i movimenti senza controparte.","domain":"movements","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_movement_warnings","title":"Avvisi sui movimenti","description":"Avvisi non risolti sui movimenti (possibile duplicato, confidenza bassa, importo o data anomali) con il movimento interessato e, per i duplicati, quello collegato. Contatori per tipo in `counts`; `total` conta tutti gli avvisi aperti. `truncated: true` vuol dire che l'elenco è parziale (l'endpoint ne restituisce al massimo 500): risolvi i primi per vedere gli altri.","domain":"movements","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_comments","title":"Commenti","description":"Commenti su un movimento o su un documento (targetType + targetId), dal più recente, con paginazione. I commenti interni sono visibili solo ai ruoli che possono vederli.","domain":"movements","scope":["read"],"permission":"comments.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"targetType":{"type":"string","enum":["movement","document"]},"targetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"required":["targetType","targetId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_categories","title":"Categorie","description":"Categorie analitiche dell'ente (id, nome, tipo entrata/uscita, voce del Modello D/RUNTS `runtsSectionCode`/`runtsRowCode`). Sono le categorie con cui si classificano i movimenti: usa questi id come categoryId.","domain":"categories","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_category_usage","title":"Utilizzo delle categorie","description":"Per ogni categoria, quanti movimenti e quale totale nell'esercizio (year; se manca, l'esercizio principale dell'ente). Serve a trovare categorie inutilizzate o dominanti.","domain":"categories","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_modello_d_mapping","title":"Mappatura Modello D","description":"La struttura del Modello D (rendiconto per cassa): sezioni A-E, investimenti (INV) e fuori rendiconto (X) con le righe di entrata e di uscita, e la mappatura delle categorie dell'ente su quelle righe. Serve per capire dove finisce una categoria nel rendiconto e per proporre la voce RUNTS di una categoria nuova.","domain":"categories","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_classification_rules","title":"Regole di classificazione","description":"Regole di classificazione automatica (di sistema, dello studio e dell'ente) con condizione, categoria di destinazione e confidenza. Prima di proporre una regola nuova controlla che non esista già. Filtro ruleType; includeArchived per le archiviate.","domain":"classification","scope":["read"],"permission":"classification_rules.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"ruleType":{"type":"string","minLength":1,"maxLength":40},"includeArchived":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_low_confidence","title":"Classificazioni incerte","description":"Movimenti classificati con confidenza sotto la soglia (threshold 0-1, default 0.6), dai meno sicuri, da ricontrollare. Filtro source (ai, rule, manual, analogy). Restituisce al massimo `limit` righe e il totale; se total > count restringi la soglia.","domain":"classification","scope":["read"],"permission":"classification_rules.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"threshold":{"type":"number","minimum":0,"maximum":1},"source":{"type":"string","enum":["ai","rule","manual","analogy"]},"limit":{"type":"integer","minimum":1,"maximum":500}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"suggest_document_matches","title":"Abbinamenti documento-movimento","description":"Per un movimento, i documenti già caricati che probabilmente lo giustificano, con punteggio di confidenza (importo, data, fornitore). Non collega nulla: per collegare usa link_document. limit 1-10 (default 5).","domain":"classification","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":10}},"required":["movementId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_cost_centers","title":"Centri di costo","description":"Centri di costo dell'ente (id, codice, nome, tipo, predefinito). Gli id servono per filtrare i movimenti e per i report. includeArchived per comprendere anche quelli archiviati.","domain":"cost_centers","scope":["read"],"permission":"cost_centers.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"includeArchived":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_cost_center_report","title":"Report centri di costo","description":"Report delle spese di UN centro di costo nel periodo (year oppure from+to; default l'esercizio corrente): quota imputata per categoria, elenco dei movimenti imputati con la quota del centro, documenti e completezza. Gli importi sono le quote imputate al centro, non gli importi lordi dei movimenti.","domain":"cost_centers","scope":["read"],"permission":"cost_centers.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["costCenterId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_cost_center_completeness","title":"Completezza centri di costo","description":"Quante uscite dell'esercizio (year; default tutto lo storico) sono ripartite sui centri di costo e quante no: totale speso, uscite assegnate e non assegnate, copertura in percentuale e spesa per centro. Il campo excluded elenca a parte le uscite fuori perimetro (senza categoria, investimenti, fuori rendiconto) senza centri: il 100% non le include. Le uscite non assegnate si sistemano con bulk_assign_cost_center o allocate_cost_centers.","domain":"cost_centers","scope":["read"],"permission":"cost_centers.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_contributi","title":"Contributi","description":"Tutti i contributi (fondi dei finanziatori) dell'ente con stato della pratica, importo concesso e ammesso, speso, residuo, finestra di ammissibilità, scadenze collegate e «prossimo passo», più i fondi propri. È la mappa di partenza per la rendicontazione. Regola di dominio: si spende l'ammessa, non il concesso. spesoAmmissibile e residuoDaSpendere si misurano sull'ammessa (spese dentro la finestra di ammissibilità); residuoDaSpendere non scende sotto zero, e oltreAmmessa dice quanto la spesa la supera (warnings elenca questi contributi). daRicevere è invece concesso meno incassato: quanto l'erogatore deve ancora versare.","domain":"contributi","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_contributo","title":"Dettaglio contributo","description":"Scheda di UN contributo: anagrafica (nome, finanziatore, CUP, periodo, concesso, ammesso, stato), totali, ripartizione per categoria, ultimi movimenti imputati e numero di movimenti non ancora assegnati ad alcun fondo.","domain":"contributi","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_contributo_rendicontazione","title":"Rendicontazione del contributo","description":"La rendicontazione di UN contributo nel periodo (from+to; se mancano, quello del finanziatore): spese imputate per voce, documenti, completezza. Se il contributo ha uno schema di rendicontazione del finanziatore, include anche il report per voce dello schema con budget, speso e minimi (schemeReport: è lì il budget di set_contributo_budget; il prospetto di rendicontazione è il preventivo per categoria analitica). ammessa riporta concesso, somma ammessa, speso nella finestra di ammissibilità, residuo e oltreAmmessa, come nella pagina Contributi; warnings segnala la spesa oltre l'ammessa (si spende l'ammessa, non il concesso). Serve a trovare le spese non ancora imputate.","domain":"contributi","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["projectId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_contributo_trend","title":"Andamento del contributo","description":"Andamento mensile della spesa imputata a UN contributo dentro la sua finestra di ammissibilità, con il confronto con la somma ammessa. Serve a capire se si sta spendendo troppo piano o troppo in fretta.","domain":"contributi","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_funder_schemes","title":"Schemi dei finanziatori","description":"Schemi di rendicontazione dei finanziatori (nome, documenti richiesti) con i contributi che li usano. Uno schema dice quali voci di spesa il finanziatore riconosce. Con schemeId restituisce QUELLO schema con le sue voci (items: id, codice, etichetta, macrovoce, entrata/uscita) e le corrispondenze con le categorie (mappings): gli id delle voci servono a set_contributo_budget e allocate_to_contributo.","domain":"contributi","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200},"schemeId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_documents","title":"Documenti","description":"Documenti caricati (fatture, ricevute, contratti...), dal più recente, con tipo, dimensione, stato dell'estrazione e dati estratti (data, importo, fornitore, numero fattura, IVA). Filtro documentType. Solo metadati: il file si scarica con get_document_download_link. Massimo 100 per pagina.","domain":"documents","scope":["read"],"permission":"documents.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"documentType":{"type":"string","minLength":1,"maxLength":40},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_document","title":"Dettaglio documento","description":"Metadati di UN documento: nome, tipo, dimensione, dati estratti con affidabilità, numerazione progressiva, conservazione, movimenti collegati e un'anteprima del testo estratto. NON include il file né link di download.","domain":"documents","scope":["read"],"permission":"documents.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["documentId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_import_batches","title":"Importazioni eseguite","description":"Importazioni di estratti conto già eseguite, dalla più recente: file, conto, righe dichiarate, movimenti ancora collegati, quanti sono ancora senza categoria, e se l'importazione l'ha fatta un agente (importedByAgent) o questo accesso (importedByThisToken). Filtro accountId. Si può annullare solo una importazione propria e recente (undo_import).","domain":"import","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_analisi","title":"Analisi","description":"La pagina Analisi dell'esercizio (year): per centro di costo entrate, uscite, saldo, quota sulle uscite, andamento mensile e uscite non assegnate; per contributo ammessa, speso, incassato, residuo e % speso; torta della composizione delle uscite. residuo = ammessa − speso nella finestra di ammissibilità (mai sotto zero): un contributo chiuso con speso 0 non ha spese imputate. Nei totali sommaAmmessa somma solo i contributi con ammessa, speso tutti, spesoSuAmmessa solo quelli con ammessa. compare=true aggiunge il confronto con l'esercizio precedente.","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"compare":{"type":"boolean"}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_analitico","title":"Bilancio analitico","description":"Rendiconto analitico per categoria dell'esercizio (year): per ogni categoria entrate/uscite, budget e scostamenti, con colonne di confronto sugli anni precedenti (additionalYears 0-5 oltre al precedente). Filtro projectIds per limitarlo a uno o più contributi; from+to per un periodo diverso dall'esercizio.","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"additionalYears":{"type":"integer","minimum":0,"maximum":5},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_cdc_pivot","title":"Pivot centri di costo","description":"Tabella centri di costo × categorie: la quota imputata a ogni centro per ogni categoria, per le uscite (sign=uscita, default) o per le entrate (sign=entrata), nel periodo (year oppure from/to; senza, tutto lo storico).","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"sign":{"type":"string","enum":["uscita","entrata"]}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_modello_d","title":"Modello D","description":"Modello D, il rendiconto per cassa dell'esercizio (year): sezioni A-E con ogni riga di entrata e di uscita (anno corrente e precedente), blocco investimenti, totali, avanzo, saldo iniziale e finale e la QUADRATURA (isBalanced). Solo per esercizi per cassa (per competenza: errore 409, usa get_modello_a/b/c). projectIds limita ai contributi indicati.","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_modello_e","title":"Modello E","description":"Modello E, il rendiconto per cassa aggregato (enti minori) dell'esercizio (year). Solo per esercizi per cassa (per competenza: errore 409). projectIds limita ai contributi indicati.","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_modello_c","title":"Relazione di missione (Modello C)","description":"Modello C per competenza dell'esercizio (year): le cifre di bilancio (da Modello A e B), il controllo di quadratura tra avanzo e variazione del patrimonio netto, e i 22 punti della relazione di missione con il testo scritto. Solo per esercizi per competenza. locale=it|de sceglie la lingua del testo.","domain":"reports","scope":["read"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"locale":{"type":"string","enum":["it","de"]}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_preventivo","title":"Preventivo","description":"Bilancio preventivo dell'esercizio (year) nella forma del Modello D, costruito sulle previsioni inserite. Richiede il piano con le previsioni. projectIds limita ai contributi indicati.","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":["forecast"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_forecast","title":"Previsioni","description":"Previsioni di entrata e uscita per categoria dell'esercizio (year). resolve=true restituisce la previsione già risolta (valori inseriti o stimati dallo storico) con il consuntivo per categoria e il periodo; senza resolve, i valori inseriti (projectId per un solo contributo). Richiede il piano con le previsioni.","domain":"reports","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":["forecast"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"resolve":{"type":"boolean"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_relazione_sections","title":"Sezioni della relazione di missione","description":"I punti della relazione di missione dell'esercizio (year) con titolo, se obbligatori e il testo scritto in italiano e tedesco; `basis` dice il regime dell'esercizio, `stato` lo stato della relazione (bozza, approvato, depositato) con `statoNota` che spiega se si può ancora scrivere, e `access` se questo accesso può modificarla (si congela con bilancio approvato o depositato; un esercizio solo chiuso resta in bozza). Funziona per esercizi per cassa e per competenza. Per scrivere un punto: update_relazione_section.","domain":"reports","scope":["read"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_snapshots","title":"Istantanee","description":"Istantanee dei report (copie congelate di un report in un dato momento): nome, tipo di report, anno, stato, data. Filtri reportType e year. Massimo 100 per pagina.","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"reportType":{"type":"string","minLength":1,"maxLength":60},"year":{"type":"integer","minimum":2000,"maximum":2100},"limit":{"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_scadenze","title":"Scadenze","description":"Scadenze dell'ente (fiscali, RUNTS, assicurative, dei contributi) con data, stato (pending, snoozed, completed, skipped), voce di catalogo e contributo collegato, in ordine di data. Filtri status e from/to sulla data di scadenza.","domain":"scadenze","scope":["read"],"permission":"scadenze.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","snoozed","completed","skipped"]},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_rimborsi","title":"Rimborsi","description":"Richieste di rimborso spese (volontari e collaboratori) dalla più recente, con importo, stato e dati della richiesta. Massimo 100 per pagina.","domain":"rimborsi","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_rimborso","title":"Dettaglio rimborso","description":"Una richiesta di rimborso spese con tutti i suoi dati (importo, stato, motivo, beneficiario, movimento collegato).","domain":"rimborsi","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"reimbursementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["reimbursementId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_ritenute","title":"Ritenute","description":"Ritenute d'acconto registrate sui compensi: lordo, netto, aliquota, ritenuta, causale, codice tributo, percipiente (nome e tipo di rapporto; senza codice fiscale). Filtri movementId e percipientId.","domain":"rimborsi","scope":["read"],"permission":"ritenute.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"percipientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_anomalies","title":"Anomalie","description":"Anomalie dell'esercizio (year; default quello corrente) per gravità (blocking, critical, warning) e tipo (unclassified, missing_document, amount_mismatch, duplicate_suspect), con riepilogo dei conteggi. summaryOnly=true restituisce solo il riepilogo. Massimo 200 per pagina.","domain":"anomalies","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"severity":{"type":"string","enum":["blocking","critical","warning"]},"type":{"type":"string","enum":["unclassified","missing_document","amount_mismatch","duplicate_suspect"]},"summaryOnly":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":200},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_review_queue","title":"Coda di revisione","description":"Tutto ciò che aspetta una persona, in un colpo solo: movimenti da rivedere per stato (needs_review, to_review, ambiguous, missing_document), avvisi aperti e classificazioni incerte. `perSection` (default 25, max 100) limita le righe di ogni sezione; ogni sezione ha il suo total (negli avvisi `truncated: true` se `items` non li contiene tutti). Per scorrere una sezione usa list_movements con status, list_movement_warnings o list_low_confidence.","domain":"anomalies","scope":["read"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"perSection":{"type":"integer","minimum":1,"maximum":100}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_year_end_checklist","title":"Checklist di fine anno","description":"Lo stato di preparazione del rendiconto dell'esercizio (year): movimenti ancora senza categoria, uscite non ripartite sui centri di costo, quadratura del Modello D (per cassa), punti della relazione di missione scritti e obbligatori mancanti, scadenze aperte, anomalie. Ogni voce ha status ok / todo / info / not_applicable e il numero che lo spiega; `ready` è vero quando nessuna voce è todo. Ogni voce ha anche label e guidance in italiano; `esercizioHint` dice che creare o chiudere un esercizio si fa dall'app, non da qui. Non modifica nulla.","domain":"anomalies","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_members","title":"Collaboratori dell'ente","description":"Le persone che lavorano nell'ente su Rendiconto (collaboratori diretti e studio commercialista), con nome e ruolo. Serve per menzionare qualcuno in un commento: scrivi nel testo di add_comment il valore «mention» (es. «@Mario Rossi») seguito da una virgola o da un punto. mention è null quando il nome ha accenti o più di due parole: quella persona non si può menzionare. isYou indica chi ha creato questo accesso. Le email non sono incluse.","domain":"context","scope":["read"],"permission":"members.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_soci","title":"Soci","description":"Il libro soci: nome, categoria e quota annuale della categoria, stato (active, inactive, resigned, expelled), date di iscrizione e di uscita, codice di pagamento (la causale che il socio usa nel bonifico) e ultimo sollecito. Filtri: search (nome o cognome), status, categoryId, isActive. Senza codice fiscale, indirizzo, dati di nascita e contatti: per quelli di UN socio usa get_socio. includeCategories=true aggiunge le categorie soci con la quota annuale.","domain":"soci","scope":["read"],"permission":"members.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"search":{"description":"Parte del nome o del cognome.","type":"string","minLength":1,"maxLength":100},"status":{"description":"Stato del socio.","type":"string","enum":["active","inactive","resigned","expelled"]},"categoryId":{"description":"Categoria soci.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"isActive":{"description":"Solo attivi (true) o solo non attivi (false).","type":"boolean"},"includeCategories":{"description":"Aggiunge l'elenco delle categorie soci.","type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_socio","title":"Scheda del socio","description":"La scheda completa di un socio (anche codice fiscale, contatti, indirizzo, dati di nascita, note, uscita) e le sue quote dell'anno indicato (year, facoltativo). Gli id vengono da list_soci.","domain":"soci","scope":["read"],"permission":"members.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"memberId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del socio (da list_soci)."},"year":{"description":"Anno delle quote da includere.","type":"integer","minimum":2000,"maximum":2100}},"required":["memberId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_quote","title":"Quote associative","description":"Le quote associative di un anno, socio per socio (importo, stato pending/paid/overdue/waived, scadenza, pagamento, movimento collegato), con il riepilogo dell'anno (quante pagate, quanto atteso e quanto incassato). Filtri: status, memberId. Gli importi sono stringhe in euro con 2 decimali.","domain":"soci","scope":["read"],"permission":"members.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno delle quote."},"status":{"description":"Stato della quota.","type":"string","enum":["pending","paid","overdue","waived"]},"memberId":{"description":"Solo le quote di questo socio.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_quote_non_pagate","title":"Quote non pagate","description":"Le quote di un anno ancora da incassare (pending e overdue), dalla scadenza più vecchia, con «scaduta» = la data di scadenza è passata (oggi, ora italiana) e il totale da incassare. Per sollecitare usa send_quota_reminder (un socio) o send_quota_reminders (tutti), che chiedono la conferma della persona.","domain":"soci","scope":["read"],"permission":"members.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno delle quote."},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"annotate_movement","title":"Annotare un movimento","description":"Aggiorna i dati descrittivi di un movimento: descrizione, controparte, stato di revisione e nota di revisione. Non cambia mai importo, data o categoria (per la categoria usa classify_movement). Stati: complete, missing_document, needs_review, ambiguous, to_review. Un esercizio chiuso non si modifica. Restituisce il movimento aggiornato.","domain":"movements","scope":["write:movements"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento."},"description":{"description":"Nuova descrizione.","type":"string","minLength":1,"maxLength":500},"counterparty":{"description":"Controparte; null per toglierla.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"status":{"description":"Stato di revisione del movimento.","type":"string","enum":["complete","missing_document","needs_review","ambiguous","to_review"]},"reviewNote":{"description":"Nota di revisione; null per toglierla.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"resolve_movement_warning","title":"Risolvere un avviso","description":"Chiude un avviso su un movimento (ad esempio un possibile doppione o un importo anomalo). action: «resolve» = sistemato, «dismiss» = da ignorare. Non unisce né cancella movimenti: l'unione dei doppioni resta un'operazione della persona nell'app. Gli id degli avvisi vengono da list_movement_warnings.","domain":"movements","scope":["write:movements"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"warningId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id dell'avviso (da list_movement_warnings)."},"action":{"type":"string","enum":["resolve","dismiss"],"description":"resolve = sistemato; dismiss = ignorato."},"note":{"description":"Nota facoltativa sul perché.","type":"string","maxLength":1000},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["warningId","action"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_cash_movement","title":"Registrare un movimento di cassa","description":"Registra a mano un movimento su un conto cassa o bancario dell'ente (non sui conti online, che si sincronizzano da soli). amount è una stringa in euro con segno: negativo = uscita, positivo = entrata (es. \"-12.50\"). La categoria analitica, se indicata, deve avere lo stesso segno (uscita/entrata). Un esercizio chiuso non accetta movimenti. Usa i conti di list_bank_accounts. Restituisce il movimento creato.","domain":"movements","scope":["write:movements"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto cassa o bancario (da list_bank_accounts)."},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data del movimento, AAAA-MM-GG."},"amount":{"type":"string","pattern":"^-?\\d{1,9}(\\.\\d{1,2})?$","description":"Importo in euro con segno, es. \"-12.50\" per un'uscita."},"description":{"type":"string","minLength":1,"maxLength":500,"description":"Descrizione."},"counterparty":{"description":"Controparte.","type":"string","maxLength":200},"analyticalCategoryId":{"description":"Categoria (da list_categories).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["bankAccountId","date","amount","description"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"classify_movement","title":"Classificare un movimento","description":"Assegna la categoria a un movimento. analyticalCategoryId è la categoria del piano dei conti dell'ente (da list_categories), quella da usare; categoryId è la macrovoce RUNTS legacy e serve solo in casi particolari. null toglie la categoria. La categoria deve avere lo stesso segno del movimento (uscita/entrata). Un esercizio chiuso non si modifica. Non tocca importo, data o descrizione.","domain":"classification","scope":["write:classify"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento."},"analyticalCategoryId":{"description":"Categoria analitica; null = nessuna.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"categoryId":{"description":"Macrovoce RUNTS legacy (raramente necessaria).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"bulk_classify_movements","title":"Classificare più movimenti","description":"Assegna la stessa categoria analitica a più movimenti (fino a 500) in un'unica operazione: o tutti o nessuno. Tutti i movimenti devono avere il segno della categoria. Sopra 50 movimenti serve la conferma della persona (la prima risposta contiene requiresConfirmation). Restituisce accepted e failed.","domain":"classification","scope":["write:classify"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"bulk","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Movimenti da classificare."},"analyticalCategoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Categoria analitica (da list_categories)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["movementIds","analyticalCategoryId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"suggest_classification","title":"Suggerire la classificazione","description":"Chiede al motore di classificazione (regole dell'ente, storico e AI) una categoria per fino a 50 movimenti. Non modifica nulla: per applicare usa accept_classification o bulk_accept_classifications. Consuma la quota AI del piano. Restituisce per ogni movimento il suggerimento con confidenza e motivazione.","domain":"classification","scope":["write:classify"],"permission":"movements.classify","write":true,"ai":true,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":["ai_classification"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Movimenti da classificare."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementIds"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"accept_classification","title":"Accettare un suggerimento","description":"Applica a un movimento la categoria suggerita da suggest_classification e la registra come esempio, così il motore impara. Il movimento passa a «complete» se ha un documento, altrimenti «missing_document». La categoria deve avere il segno del movimento. Un esercizio chiuso non si modifica.","domain":"classification","scope":["write:classify"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":["ai_classification"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento."},"analyticalCategoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Categoria suggerita (analitica)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId","analyticalCategoryId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"bulk_accept_classifications","title":"Accettare più suggerimenti","description":"Accetta in blocco fino a 100 suggerimenti (action «accept», predefinita) oppure segna i movimenti come da rivedere (action «mark_to_review»). Con accept ogni voce porta analyticalCategoryId e la confidence del suggerimento ricevuto da suggest_classification. Le voci con segno incompatibile vengono saltate e riportate in errors. Sopra 50 voci serve la conferma della persona.","domain":"classification","scope":["write:classify"],"permission":"batch.execute","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"bulk","regime":"any","features":["batch_operations"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"items":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"analyticalCategoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"analyticalCategoryName":{"type":"string","maxLength":200},"confidence":{"type":"number","minimum":0,"maximum":1},"reasoning":{"type":"string","maxLength":1000}},"required":["movementId"],"additionalProperties":false},"description":"Voci: movimento + suggerimento."},"action":{"description":"accept (predefinita) o mark_to_review.","type":"string","enum":["accept","mark_to_review"]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["items"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"allocate_cost_centers","title":"Ripartire sui centri di costo","description":"Imposta la ripartizione di UN movimento sui centri di costo, in percentuale: sostituisce quella esistente. La somma non può superare 100; un centro di costo compare una sola volta e non può essere archiviato. Un esercizio chiuso non si modifica. Centri di costo da list_cost_centers.","domain":"cost_centers","scope":["write:classify"],"permission":"cost_centers.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento."},"allocations":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"percentage":{"type":"number","minimum":0,"maximum":100}},"required":["costCenterId","percentage"],"additionalProperties":false},"description":"Ripartizione completa: [{ costCenterId, percentage }]."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId","allocations"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"bulk_assign_cost_center","title":"Assegnare un centro di costo a più movimenti","description":"Assegna fino a 500 movimenti a un solo centro di costo al 100%, sostituendo la loro ripartizione. Sopra 50 movimenti serve la conferma della persona. Un esercizio chiuso non si modifica.","domain":"cost_centers","scope":["write:classify"],"permission":"cost_centers.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"bulk","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Movimenti da assegnare."},"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Centro di costo (da list_cost_centers)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["movementIds","costCenterId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"create_category","title":"Creare una categoria","description":"Crea una categoria del piano dei conti dell'ente, con tipo (entrata/uscita) e voce RUNTS del Modello D (sezione A–E, INV o X e riga, es. B.2). La riga deve esistere per quel tipo e appartenere alla sezione. suggest_runts_mapping propone la voce a partire dal nome. Il nome è unico nell'ente.","domain":"categories","scope":["write:setup"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Nome della categoria."},"type":{"type":"string","enum":["entrata","uscita"],"description":"entrata o uscita."},"runtsSectionCode":{"type":"string","enum":["A","B","C","D","E","INV","X"],"description":"Sezione RUNTS: A, B, C, D, E, INV (investimenti) o X (fuori rendiconto)."},"runtsRowCode":{"type":"string","pattern":"^(?:[A-E]\\.\\d{1,2}|INV\\.[1-4]|X)$","description":"Riga RUNTS, es. A.1, B.2, INV.1, X."},"description":{"description":"Descrizione.","type":"string","maxLength":500},"exemptFromMissingDoc":{"description":"true = i movimenti non richiedono documento (es. oneri bancari).","type":"boolean"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","type","runtsSectionCode","runtsRowCode"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"update_category","title":"Modificare una categoria","description":"Modifica nome, descrizione, esenzione dal documento o voce RUNTS / Modello D di una categoria. Il tipo (entrata/uscita) non cambia. Se cambia la voce del Modello D serve la conferma della persona (la prima risposta contiene requiresConfirmation). Non disattiva né cancella categorie.","domain":"categories","scope":["write:setup"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"conditional","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"categoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della categoria (da list_categories)."},"name":{"description":"Nuovo nome.","type":"string","minLength":1,"maxLength":100},"description":{"description":"Descrizione; null per toglierla.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"runtsSectionCode":{"description":"Nuova sezione RUNTS.","type":"string","enum":["A","B","C","D","E","INV","X"]},"runtsRowCode":{"description":"Nuova riga RUNTS.","type":"string","pattern":"^(?:[A-E]\\.\\d{1,2}|INV\\.[1-4]|X)$"},"exemptFromMissingDoc":{"description":"Esenzione dal documento mancante.","type":"boolean"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["categoryId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"suggest_runts_mapping","title":"Suggerire la voce RUNTS","description":"Propone la voce RUNTS / Modello D per fino a 100 categorie, dal nome e dal tipo, con le regole del prodotto. Non modifica nulla e non usa l'AI. Restituisce suggestions: [{ name, type, suggestion }].","domain":"categories","scope":["write:setup"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"categories":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"type":{"type":"string","enum":["entrata","uscita"]}},"required":["name","type"],"additionalProperties":false},"description":"Categorie da mappare: [{ name, type }]."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["categories"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_classification_rule","title":"Creare una regola","description":"Crea una regola di classificazione dell'ente: quando un movimento soddisfa la condizione, il motore propone la categoria (e facoltativamente contributo e centro di costo) indicati. Tipi: controparte, importo, keyword, combo. Vale solo per questo ente. confidence 0–1 (predefinita 0.95): da 0.85 la regola si applica senza AI.","domain":"classification","scope":["write:setup"],"permission":"classification_rules.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"ruleType":{"type":"string","enum":["controparte","importo","keyword","combo"],"description":"Tipo di condizione."},"pattern":{"anyOf":[{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false},{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false},{"type":"object","properties":{"and":{"minItems":1,"maxItems":10,"type":"array","items":{"anyOf":[{"type":"object","properties":{"ruleType":{"type":"string","const":"controparte"},"pattern":{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"importo"},"pattern":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"keyword"},"pattern":{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false}]}},"or":{"minItems":1,"maxItems":10,"type":"array","items":{"anyOf":[{"type":"object","properties":{"ruleType":{"type":"string","const":"controparte"},"pattern":{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"importo"},"pattern":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"keyword"},"pattern":{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false}]}}},"additionalProperties":false},{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}],"description":"Condizione della regola, secondo ruleType: controparte {match, mode?: exact|contains}; importo {min?, max?} oppure {value, tolerance?}; keyword {keywords[], anyOrAll?: any|all, case_sensitive?}; combo {and: [...]} oppure {or: [...]} con figli {ruleType, pattern}."},"targetCategoryId":{"description":"Categoria analitica proposta.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"targetProjectId":{"description":"Contributo proposto.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"targetCostCenterId":{"description":"Centro di costo proposto.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"confidence":{"description":"Fiducia della regola, 0–1.","type":"number","minimum":0,"maximum":1},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["ruleType","pattern"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"update_classification_rule","title":"Modificare una regola","description":"Modifica una regola di classificazione di questo ente (da list_classification_rules): condizione, destinazioni, confidence, oppure archived: true per spegnerla (false per riaccenderla). Se cambi pattern indica anche ruleType. Le regole dello studio o di sistema non si modificano da qui.","domain":"classification","scope":["write:setup"],"permission":"classification_rules.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"ruleId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della regola."},"ruleType":{"description":"Tipo di condizione (obbligatorio se cambi pattern).","type":"string","enum":["controparte","importo","keyword","combo"]},"pattern":{"anyOf":[{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false},{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false},{"type":"object","properties":{"and":{"minItems":1,"maxItems":10,"type":"array","items":{"anyOf":[{"type":"object","properties":{"ruleType":{"type":"string","const":"controparte"},"pattern":{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"importo"},"pattern":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"keyword"},"pattern":{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false}]}},"or":{"minItems":1,"maxItems":10,"type":"array","items":{"anyOf":[{"type":"object","properties":{"ruleType":{"type":"string","const":"controparte"},"pattern":{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"importo"},"pattern":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"keyword"},"pattern":{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false}]}}},"additionalProperties":false},{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}],"description":"Condizione della regola, secondo ruleType: controparte {match, mode?: exact|contains}; importo {min?, max?} oppure {value, tolerance?}; keyword {keywords[], anyOrAll?: any|all, case_sensitive?}; combo {and: [...]} oppure {or: [...]} con figli {ruleType, pattern}."},"targetCategoryId":{"description":"Categoria analitica proposta.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"targetProjectId":{"description":"Contributo proposto.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"targetCostCenterId":{"description":"Centro di costo proposto.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"confidence":{"description":"Fiducia della regola, 0–1.","type":"number","minimum":0,"maximum":1},"archived":{"description":"true = regola spenta; false = riattivata.","type":"boolean"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["ruleId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_cost_center","title":"Creare un centro di costo","description":"Crea un centro di costo dell'ente con nome, codice univoco (lettere, numeri, _ - .), tipo e, facoltativamente, descrizione e centro padre.","domain":"cost_centers","scope":["write:setup"],"permission":"cost_centers.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Nome."},"code":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_\\-.]+$","description":"Codice univoco nell'ente."},"kind":{"type":"string","enum":["geografica","area_intervento","progetto","evento","generale"],"description":"Tipo di centro di costo."},"description":{"description":"Descrizione.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"parentId":{"description":"Centro di costo padre.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","code","kind"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"update_cost_center","title":"Modificare un centro di costo","description":"Modifica nome, codice, tipo, descrizione o padre di un centro di costo (da list_cost_centers). Non archivia né cancella centri di costo.","domain":"cost_centers","scope":["write:setup"],"permission":"cost_centers.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del centro di costo."},"name":{"description":"Nuovo nome.","type":"string","minLength":1,"maxLength":100},"code":{"description":"Nuovo codice.","type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_\\-.]+$"},"kind":{"description":"Nuovo tipo.","type":"string","enum":["geografica","area_intervento","progetto","evento","generale"]},"description":{"description":"Descrizione; null per toglierla.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"parentId":{"description":"Centro padre; null per toglierlo.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["costCenterId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_contributo","title":"Creare un contributo","description":"Crea un contributo (finanziamento di un ente erogatore) con stato della pratica, importi concesso e ammesso (stringhe in euro), periodo del progetto e finestra di ammissibilità delle spese. funderContactId è l'ente erogatore in anagrafica; schemeId lo schema di rendicontazione (da list_funder_schemes). Restituisce il contributo creato (project).","domain":"contributi","scope":["write:contributi"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Nome del contributo."},"applicationStatus":{"type":"string","enum":["bozza","inviata","deliberata","anticipo_ricevuto","saldata","respinta","rinunciata","revocata"],"description":"Stato della pratica, es. bozza, inviata, deliberata."},"description":{"description":"Descrizione iniziale (poi si usa add_contributo_note).","type":"string","maxLength":500},"status":{"description":"Stato del fondo: active (predefinito) o draft.","type":"string","enum":["draft","active"]},"startDate":{"description":"Inizio progetto.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"description":"Fine progetto.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"budget":{"description":"Budget complessivo del progetto.","type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},"importoConcesso":{"description":"Importo concesso dall'erogatore.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"sommaAmmessa":{"description":"Somma ammessa (quella da spendere e rendicontare).","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"eligibilityFrom":{"description":"Inizio ammissibilità delle spese.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"eligibilityTo":{"description":"Fine ammissibilità delle spese.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"funderContactId":{"description":"Ente erogatore in anagrafica.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"office":{"description":"Ufficio dell'erogatore che segue la pratica.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"schemeId":{"description":"Schema di rendicontazione del finanziatore.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","applicationStatus"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"update_contributo","title":"Modificare un contributo","description":"Modifica i dati di un contributo: nome, periodo, importi concesso/ammesso, finestra di ammissibilità, stato della pratica, ente erogatore, ufficio, scadenza del rendiconto, stato del fondo, schema di rendicontazione (schemeId da list_funder_schemes; null lo scollega; non si cambia finché ci sono righe di budget della delibera). Le note si aggiungono con add_contributo_note; l'invio del rendiconto si segna con mark_contributo_report_sent. Chiudere il fondo (status «closed») richiede la conferma della persona.","domain":"contributi","scope":["write:contributi"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"conditional","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo (da list_contributi)."},"name":{"description":"Nuovo nome.","type":"string","minLength":1,"maxLength":100},"status":{"description":"Stato del fondo; closed chiede conferma.","type":"string","enum":["draft","active","closed"]},"startDate":{"description":"Inizio progetto.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"endDate":{"description":"Fine progetto.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"budget":{"description":"Budget complessivo.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"importoConcesso":{"description":"Importo concesso.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"sommaAmmessa":{"description":"Somma ammessa.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"eligibilityFrom":{"description":"Inizio ammissibilità.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"eligibilityTo":{"description":"Fine ammissibilità.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"applicationStatus":{"description":"Stato della pratica.","type":"string","enum":["bozza","inviata","deliberata","anticipo_ricevuto","saldata","respinta","rinunciata","revocata"]},"funderContactId":{"description":"Ente erogatore.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"office":{"description":"Ufficio dell'erogatore.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"reportDueDate":{"description":"Scadenza del rendiconto.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"schemeId":{"description":"Schema di rendicontazione del finanziatore (da list_funder_schemes); null lo scollega.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["projectId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"set_contributo_budget","title":"Impostare il budget del contributo","description":"Imposta il budget di delibera del contributo per voce del suo schema di rendicontazione: sostituisce tutte le righe con quelle indicate (le voci non elencate vengono tolte). Ogni voce una sola volta; importi come stringhe in euro. Il contributo deve avere uno schema (update_contributo schemeId); le voci e i loro id sono in list_funder_schemes con schemeId.","domain":"contributi","scope":["write:contributi"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo."},"lines":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"object","properties":{"schemeItemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},"minAmount":{"anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]}},"required":["schemeItemId","amount"],"additionalProperties":false},"description":"Righe di budget: [{ schemeItemId, amount, minAmount? }]."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["projectId","lines"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"record_disbursement","title":"Registrare un'erogazione","description":"Registra una tranche del contributo (anticipo, saldo, unica, altro, oppure restituzione all'erogatore): importo atteso e/o ricevuto come stringhe in euro, data di incasso e movimento bancario collegato.","domain":"contributi","scope":["write:contributi"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo."},"kind":{"type":"string","enum":["anticipo","saldo","unica","altro","restituzione"],"description":"Tipo di tranche."},"expectedAmount":{"description":"Importo atteso.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"receivedAmount":{"description":"Importo ricevuto.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"receivedDate":{"description":"Data di incasso.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"movementId":{"description":"Movimento dell'incasso (da list_movements).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"note":{"description":"Nota.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["projectId","kind"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"allocate_to_contributo","title":"Imputare spese a un contributo","description":"Due usi. (1) Un movimento: movementId + allocations = la ripartizione COMPLETA del movimento sui fondi (1–5 righe { projectId, amount | percentage, schemeItemId? }; amount è una stringa positiva in euro), che sostituisce quella esistente; la somma non supera l'importo del movimento, il resto resta ai mezzi propri. (2) Più movimenti: movementIds + schemeItemId assegna la voce dello schema del contributo projectId alle sue imputazioni già esistenti (null la toglie); sopra 50 movimenti serve la conferma della persona. Un esercizio chiuso non si modifica. Dopo l'uso (1) warnings segnala i contributi la cui spesa supera la somma ammessa (oltreAmmessa): non è un blocco, come nell'app, ma l'eccedenza non aumenta il contributo (si spende l'ammessa, non il concesso).","domain":"contributi","scope":["write:classify"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"bulk","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il contributo."},"movementId":{"description":"Uso (1): il movimento da ripartire.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"allocations":{"description":"Uso (1): la ripartizione completa del movimento.","minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},"percentage":{"type":"number","minimum":0.01,"maximum":100},"schemeItemId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["projectId"],"additionalProperties":false}},"movementIds":{"description":"Uso (2): i movimenti già imputati al contributo.","minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"schemeItemId":{"description":"Uso (2): la voce dello schema; null = nessuna.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["projectId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"remove_contributo_allocation","title":"Rimuovere un'imputazione","description":"Toglie un movimento da un contributo. Le imputazioni del movimento ad altri fondi restano com'erano; la quota tolta torna ai mezzi propri. Si può rifare con allocate_to_contributo. Un esercizio chiuso non si modifica.","domain":"contributi","scope":["write:classify"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il contributo."},"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il movimento da togliere."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["projectId","movementId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"add_contributo_note","title":"Aggiungere una nota al contributo","description":"Aggiunge una nota datata al diario del contributo (in coda, senza toccare le note precedenti). date facoltativa, predefinita oggi.","domain":"contributi","scope":["write:contributi"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo."},"text":{"type":"string","minLength":1,"maxLength":4000,"description":"Testo della nota."},"date":{"description":"Data della nota, AAAA-MM-GG (predefinita oggi).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["projectId","text"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"mark_contributo_report_sent","title":"Segnare la rendicontazione come inviata","description":"Segna che il rendiconto del contributo è stato inviato all'erogatore in una data (non futura): la pratica passa a «rendicontata». Solo da «deliberata» o «anticipo_ricevuto». Richiede sempre la conferma della persona.","domain":"contributi","scope":["write:contributi"],"permission":"movements.classify","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo."},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di invio del rendiconto, AAAA-MM-GG."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["projectId","date"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"update_relazione_section","title":"Scrivere una sezione della relazione","description":"Scrive il testo di uno o più punti della relazione di missione (Modello C) di un esercizio: code è il numero del punto come in get_relazione_sections (es. \"3\"), locale it o de, body il testo (al massimo 20000 caratteri; le tabelle si scrivono come righe con | fra le colonne). Sostituisce il testo esistente di quel punto. Un esercizio con bilancio approvato o depositato non si modifica. Leggi prima get_relazione_sections. Restituisce quante sezioni sono cambiate.","domain":"reports","scope":["write:reports"],"permission":"relazione.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."},"sections":{"minItems":1,"maxItems":48,"type":"array","items":{"type":"object","properties":{"code":{"type":"string","pattern":"^\\d{1,2}$"},"locale":{"type":"string","enum":["it","de"]},"body":{"type":"string","minLength":1,"maxLength":20000}},"required":["code","locale","body"],"additionalProperties":false},"description":"Sezioni da scrivere: [{ code, locale, body }]."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","sections"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_snapshot","title":"Creare un'istantanea","description":"Archivia una copia del report di un esercizio così com'è oggi. Per cassa: Modello D o bilancio analitico, facoltativamente limitati a uno o più contributi. Per competenza: Modello A (Stato patrimoniale), Modello B (Rendiconto gestionale) o Modello C (Relazione di missione con le cifre), sempre dell'intero ente. Le cifre vengono calcolate dal server, non dall'agente. La copia compare in Archivio report come bozza. Restituisce l'istantanea creata (senza i dati).","domain":"reports","scope":["write:reports"],"permission":"reports.export","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"Nome dell'istantanea."},"reportType":{"type":"string","enum":["modello-d","analitico","modello-a","modello-b","modello-c"],"description":"Report da archiviare: modello-d o analitico (per cassa), modello-a, modello-b o modello-c (per competenza)."},"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."},"projectIds":{"description":"Solo questi contributi.","minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","reportType","year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"add_comment","title":"Aggiungere un commento","description":"Aggiunge un commento a un movimento o a un documento, visibile ai membri dell'ente. Il testo compare preceduto da «[via agente]». Le menzioni @Nome funzionano come nell'app. visibility «internal» (solo studio) richiede che l'autore del token sia dello studio.","domain":"movements","scope":["write:comments","write:movements"],"permission":"comments.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"targetType":{"type":"string","enum":["movement","document"],"description":"A cosa si riferisce il commento."},"targetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento o del documento."},"content":{"type":"string","minLength":1,"maxLength":4987,"description":"Testo del commento."},"visibility":{"description":"shared (predefinito) o internal (solo studio).","type":"string","enum":["shared","internal"]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["targetType","targetId","content"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_scadenza","title":"Creare una scadenza","description":"Crea una scadenza personalizzata (stato «da fare») con nome e data, facoltativamente collegata a un contributo. Le scadenze di legge del catalogo si generano dall'app, non da qui.","domain":"scadenze","scope":["write:scadenze"],"permission":"scadenze.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":300,"description":"Nome della scadenza."},"dueDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di scadenza, AAAA-MM-GG."},"notes":{"description":"Note.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"projectId":{"description":"Contributo collegato (da list_contributi).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","dueDate"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"complete_scadenza","title":"Completare una scadenza","description":"Segna come completata una scadenza (da list_scadenze), con una nota facoltativa.","domain":"scadenze","scope":["write:scadenze"],"permission":"scadenze.complete","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"scadenzaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scadenza."},"notes":{"description":"Nota sul completamento.","type":"string","maxLength":2000},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["scadenzaId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"snooze_scadenza","title":"Rimandare una scadenza","description":"Rimanda (silenzia) una scadenza fino a una data futura. La data deve essere nel futuro.","domain":"scadenze","scope":["write:scadenze"],"permission":"scadenze.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"scadenzaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scadenza."},"until":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Fino a quando rimandarla, AAAA-MM-GG."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["scadenzaId","until"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"unsnooze_scadenza","title":"Riattivare una scadenza","description":"Annulla il rinvio di una scadenza: torna attiva e visibile negli avvisi.","domain":"scadenze","scope":["write:scadenze"],"permission":"scadenze.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"scadenzaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scadenza."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["scadenzaId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_rimborso","title":"Creare una richiesta di rimborso","description":"Crea una richiesta di rimborso spese (stato «inviata») da approvare nell'app: l'agente non approva mai. amount è una stringa in euro positiva. method «autocertificato» (art. 17 c.4 CTS) applica i limiti dell'autocertificazione e può essere rifiutato con il motivo. Gli approvatori ricevono la notifica come dall'app.","domain":"rimborsi","scope":["write:rimborsi"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"beneficiaryName":{"type":"string","minLength":1,"maxLength":200,"description":"Chi riceve il rimborso."},"beneficiaryEmail":{"description":"Email del beneficiario.","type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"amount":{"type":"string","pattern":"^\\d{1,9}(\\.\\d{1,2})?$","description":"Importo in euro, es. \"45.00\"."},"description":{"type":"string","minLength":1,"maxLength":1000,"description":"Che spesa è."},"expenseDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data della spesa, AAAA-MM-GG."},"documentId":{"description":"Giustificativo già caricato (da list_documents).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contactId":{"description":"Volontario o socio in anagrafica.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"method":{"description":"Predefinito: documentato.","type":"string","enum":["documentato","autocertificato"]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["beneficiaryName","amount","description","expenseDate"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"dismiss_anomaly","title":"Archiviare un'anomalia","description":"Chiude le anomalie di fino a 50 movimenti per chiamata (da list_anomalies). action «dismiss» = falso allarme, il movimento torna «complete»; action «resolve» = il movimento torna «needs_review» per essere sistemato. Un esercizio chiuso non si modifica. Restituisce accepted e failed.","domain":"anomalies","scope":["write:movements"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Movimenti con l'anomalia (al massimo 50)."},"action":{"type":"string","enum":["dismiss","resolve"],"description":"dismiss = falso allarme; resolve = da rivedere."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementIds","action"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"update_manual_movement","title":"Correggere un movimento manuale","description":"Corregge un movimento registrato a mano (cassa o inserimento manuale): importo, data, descrizione, controparte. Importo e data si cambiano SOLO sui movimenti manuali: quelli importati dalla banca tengono le cifre dell'estratto (per loro descrizione e controparte si cambiano con annotate_movement). Cambiare importo o data chiede la conferma della persona; le imputazioni ai contributi vengono riproporzionate al nuovo importo. Non si può invertire il segno di un movimento già classificato (togli prima la categoria con classify_movement) né cambiare il conto (elimina e registra di nuovo). Un esercizio chiuso non si modifica. amount è una stringa in euro con segno, es. \"-12.50\".","domain":"movements","scope":["write:movements"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"conditional","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento manuale."},"amount":{"description":"Nuovo importo con segno, es. \"-12.50\".","type":"string","pattern":"^-?\\d{1,9}(\\.\\d{1,2})?$"},"date":{"description":"Nuova data, AAAA-MM-GG.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":{"description":"Nuova descrizione.","type":"string","minLength":1,"maxLength":500},"counterparty":{"description":"Controparte; null per toglierla.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["movementId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"delete_manual_movement","title":"Eliminare un movimento manuale","description":"Elimina un movimento registrato a mano (ad esempio una spesa di cassa inserita due volte o per errore). Chiede sempre la conferma della persona. Solo movimenti manuali: quelli importati dalla banca si tolgono con undo_import (importazione recente e non ancora lavorata) o nell'app. Non elimina un movimento di un esercizio chiuso né uno con documenti, imputazioni o una ritenuta collegati: prima vanno scollegati.","domain":"movements","scope":["write:movements"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento manuale da eliminare."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["movementId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"delete_comment","title":"Eliminare un proprio commento","description":"Elimina un commento scritto dalla persona che ha creato questo accesso (mai quelli degli altri). Indica il commento e il movimento o documento su cui si trova (targetType + targetId, come in list_comments). Chiede sempre la conferma della persona. Un commento non si modifica: eliminalo e scrivine uno nuovo con add_comment.","domain":"movements","scope":["write:comments","write:movements"],"permission":"comments.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"commentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del commento (da list_comments)."},"targetType":{"type":"string","enum":["movement","document"],"description":"Dove si trova il commento."},"targetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento o del documento."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["commentId","targetType","targetId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"apply_classification_rules","title":"Applicare le regole di classificazione","description":"Classifica i movimenti NON ancora classificati con le regole dell'ente (list_classification_rules), senza AI e senza consumare la quota AI. Solo esercizi aperti; i movimenti già classificati non vengono mai toccati. Passo 1, dryRun (predefinito): indica year e/o movementIds e ricevi le proposte (movimento, categoria, regola, confidenza) senza modifiche. Passo 2: richiama con dryRun=false e movementIds = gli id delle proposte che la persona approva (fino a 500); le regole vengono rivalutate e applicate. Sopra 50 movimenti serve la conferma della persona. I movimenti senza regola applicabile restano da classificare (classify_movement o suggest_classification).","domain":"classification","scope":["write:classify"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"bulk","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"dryRun":{"description":"true (predefinito) = solo proposte; false = applica le regole ai movementIds.","type":"boolean"},"year":{"description":"Esercizio dei movimenti da esaminare.","type":"integer","minimum":2000,"maximum":2100},"movementIds":{"description":"Movimenti precisi; obbligatorio per applicare (dryRun=false).","minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"limit":{"description":"Con year: quanti movimenti non classificati esaminare (massimo 500).","type":"integer","minimum":1,"maximum":500},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"create_socio","title":"Aggiungere un socio","description":"Iscrive un nuovo socio nel libro soci: nome, cognome e data di iscrizione obbligatori; categoria, contatti, codice fiscale e dati di nascita facoltativi. Un codice fiscale già presente viene rifiutato (il socio esiste già: usa list_soci e update_socio). Restituisce il socio creato con il suo codice di pagamento.","domain":"soci","scope":["write:soci"],"permission":"members.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"firstName":{"type":"string","minLength":1,"maxLength":100,"description":"Nome."},"lastName":{"type":"string","minLength":1,"maxLength":100,"description":"Cognome."},"joinDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di iscrizione, AAAA-MM-GG."},"categoryId":{"description":"Categoria soci (da list_soci con includeCategories).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"email":{"description":"Email del socio.","anyOf":[{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"phone":{"description":"Telefono.","anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"pec":{"description":"PEC.","anyOf":[{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"address":{"description":"Indirizzo.","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"codiceFiscale":{"description":"Codice fiscale (16 caratteri) o partita IVA (11 cifre).","anyOf":[{"type":"string","maxLength":16},{"type":"null"}]},"birthDate":{"description":"Data di nascita, AAAA-MM-GG.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"birthPlace":{"description":"Luogo di nascita.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"notes":{"description":"Note.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["firstName","lastName","joinDate"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"update_socio","title":"Modificare un socio","description":"Aggiorna i dati di un socio (contatti, categoria, codice fiscale, dati di nascita, note, data di iscrizione) o il suo stato: active, inactive, resigned (recesso), expelled (esclusione). Recesso ed esclusione tolgono il socio dai soci attivi e chiedono la conferma della persona; exitDate (predefinita oggi) ed exitReason ne registrano data e motivo. null svuota un campo facoltativo.","domain":"soci","scope":["write:soci"],"permission":"members.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"conditional","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"memberId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del socio (da list_soci)."},"firstName":{"description":"Nome.","type":"string","minLength":1,"maxLength":100},"lastName":{"description":"Cognome.","type":"string","minLength":1,"maxLength":100},"joinDate":{"description":"Data di iscrizione, AAAA-MM-GG.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"categoryId":{"description":"Categoria soci (da list_soci con includeCategories).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"email":{"description":"Email del socio.","anyOf":[{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"phone":{"description":"Telefono.","anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"pec":{"description":"PEC.","anyOf":[{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"address":{"description":"Indirizzo.","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"codiceFiscale":{"description":"Codice fiscale (16 caratteri) o partita IVA (11 cifre).","anyOf":[{"type":"string","maxLength":16},{"type":"null"}]},"birthDate":{"description":"Data di nascita, AAAA-MM-GG.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"birthPlace":{"description":"Luogo di nascita.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"notes":{"description":"Note.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"status":{"description":"Stato del socio.","type":"string","enum":["active","inactive","resigned","expelled"]},"exitDate":{"description":"Data di uscita (recesso o esclusione).","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"exitReason":{"description":"Motivo dell'uscita.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["memberId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"record_quota_payment","title":"Registrare il pagamento di una quota","description":"Segna come pagata una quota associativa in attesa o scaduta (gli id vengono da list_quote o list_quote_non_pagate), con metodo (bank_transfer, cash, manual) e importo incassato. movementId collega la quota al movimento bancario o di cassa che l'ha incassata (il codice di pagamento del socio di solito è nella causale). Una quota già pagata o esonerata non cambia. Chiede sempre la conferma della persona: se il socio ha un'email, Rendiconto gli invia la conferma di pagamento.","domain":"soci","scope":["write:soci"],"permission":"members.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"duesId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della quota."},"paymentMethod":{"type":"string","enum":["bank_transfer","cash","manual"],"description":"Come è stata pagata."},"amount":{"type":"string","pattern":"^\\d{1,9}(\\.\\d{1,2})?$","description":"Importo incassato in euro, es. \"25.00\"."},"movementId":{"description":"Movimento che ha incassato la quota (da list_movements).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"proofDocumentId":{"description":"Documento che prova il pagamento (da list_documents).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["duesId","paymentMethod","amount"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"send_quota_reminder","title":"Sollecitare un socio","description":"Invia al socio un'email di sollecito per le sue quote non pagate. Chiede sempre la conferma della persona. Il socio deve avere un'email e non essere stato sollecitato nelle ultime 24 ore. Richiede la funzione solleciti dell'abbonamento.","domain":"soci","scope":["write:soci"],"permission":"members.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"any","features":["advanced_reminders"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"memberId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del socio (da list_soci o list_quote_non_pagate)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["memberId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"send_quota_reminders","title":"Sollecitare i soci con quote non pagate","description":"Invia un'email di sollecito a TUTTI i soci con quote in attesa o scadute (di un anno, se indicato) che hanno un'email e non sono stati sollecitati nelle ultime 24 ore. Chiede sempre la conferma della persona e dice quante email partiranno. Richiede la funzione solleciti dell'abbonamento.","domain":"soci","scope":["write:soci"],"permission":"members.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"any","features":["advanced_reminders"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"description":"Solo le quote di questo anno.","type":"integer","minimum":2000,"maximum":2100},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"create_upload_link","title":"Creare un link di caricamento","description":"Crea un link firmato per caricare UN file (valido 10 minuti, usabile una volta): estratto conto (purpose «import») o documento (purpose «document»). Caricalo con `curl -T file \"<uploadUrl>\"`, poi usa il fileId restituito con import_statement_preview, upload_document o scan_receipt. Massimo 20 MB; tipi ammessi: estratti CSV/TSV/CBI/XLS/XLSX/PDF, documenti PDF/immagini/Excel/Word/XML/P7M. Il file resta disponibile 24 ore.","domain":"import","scope":["write:import","write:documents"],"permission":"documents.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"purpose":{"type":"string","enum":["import","document"],"description":"«import» per un estratto conto, «document» per un giustificativo."},"filename":{"type":"string","minLength":1,"maxLength":255,"description":"Nome del file con estensione, es. «estratto-marzo.csv»."},"contentType":{"type":"string","minLength":3,"maxLength":120,"description":"Tipo MIME, es. «text/csv», «application/pdf»."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["purpose","filename","contentType"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"import_statement_preview","title":"Anteprima importazione estratto conto","description":"Legge un estratto conto (CSV, TSV, CBI, Excel o PDF) con la stessa procedura dell'app e restituisce l'anteprima: righe (le prime 500), avvisi, colonne riconosciute, quadratura dei saldi e, se passi bankAccountId, i movimenti già presenti (duplicates, saltati) e le righe che entreranno segnalate come possibile duplicato (possibleDuplicates: rowIndex e relatedMovementId, o relatedRowIndex se il gemello è un'altra riga del file). Non crea movimenti. Passa fileId (da create_upload_link o PUT /api/agent/v1/files) oppure contentBase64 + filename per file ≤ 256 KB. Il PDF usa l'AI (serve il permesso use:ai); se le colonne non vengono riconosciute passa roleOverride. Restituisce previewId da usare con import_statement_confirm. Per PDF lunghi, se va in timeout ripeti con la stessa idempotencyKey.","domain":"import","scope":["write:import"],"permission":"documents.write","write":true,"ai":false,"aiConditional":true,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"fileId":{"description":"Il file caricato (purpose «import»).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contentBase64":{"description":"Il file in base64, al massimo 256 KB.","type":"string","maxLength":400000},"filename":{"description":"Obbligatorio con contentBase64.","type":"string","minLength":1,"maxLength":255},"contentType":{"description":"Con contentBase64; se manca si ricava dall'estensione.","type":"string","maxLength":120},"bankAccountId":{"description":"Conto di destinazione: se c'è, l'anteprima segnala i movimenti già importati.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bankHint":{"description":"Nome della banca (aiuta la lettura dei PDF).","type":"string","maxLength":100},"roleOverride":{"type":"object","properties":{"columns":{"type":"object","properties":{"date":{"type":"integer","minimum":0,"maximum":10000},"valueDate":{"type":"integer","minimum":0,"maximum":10000},"description":{"type":"integer","minimum":0,"maximum":10000},"extraDescription":{"maxItems":50,"type":"array","items":{"type":"integer","minimum":0,"maximum":10000}},"amount":{"type":"integer","minimum":0,"maximum":10000},"debit":{"type":"integer","minimum":0,"maximum":10000},"credit":{"type":"integer","minimum":0,"maximum":10000},"direction":{"type":"integer","minimum":0,"maximum":10000},"balance":{"type":"integer","minimum":0,"maximum":10000},"currency":{"type":"integer","minimum":0,"maximum":10000},"counterparty":{"type":"integer","minimum":0,"maximum":10000},"reference":{"type":"integer","minimum":0,"maximum":10000}},"additionalProperties":false,"description":"Indice (da 0) della colonna di ogni ruolo; un ruolo omesso = nessuna colonna."},"headerRow":{"type":"integer","minimum":-1,"maximum":1000000},"dateOrder":{"type":"string","enum":["DMY","MDY","YMD"]},"decimal":{"type":"string","enum":[",","."]},"signConvention":{"type":"string","enum":["standard","inverted"]},"sheet":{"type":"string","maxLength":255}},"required":["columns"],"additionalProperties":false,"description":"Mappatura manuale delle colonne (come «Scegli le colonne» nell'app). Usala se l'anteprima non ha riconosciuto le colonne."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"import_statement_confirm","title":"Confermare l'importazione","description":"Importa i movimenti di un'anteprima sul conto indicato. Le righe e gli importi vengono SOLO dall'anteprima salvata: puoi scegliere il conto e le righe da escludere (excludeRowIndexes, gli index dell'anteprima), niente altro. Richiede la conferma della persona: la prima chiamata restituisce requiresConfirmation con il riepilogo. I movimenti già presenti sul conto vengono saltati. Restituisce importBatchId e i conteggi.","domain":"import","scope":["write:import"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"previewId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il previewId di import_statement_preview."},"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il conto (list_bank_accounts) su cui importare."},"excludeRowIndexes":{"description":"Index delle righe dell'anteprima da NON importare.","maxItems":20000,"type":"array","items":{"type":"integer","minimum":0,"maximum":20000}},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["previewId","bankAccountId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"undo_import","title":"Annullare un'importazione","description":"Annulla un'importazione fatta da QUESTO accesso nelle ultime 24 ore, eliminando i movimenti creati. Rifiutato (undo_not_allowed) se l'import è di altri, è più vecchio di 24 ore, o se un suo movimento è già stato classificato, ripartito o collegato a un documento. Richiede la conferma della persona.","domain":"import","scope":["write:import"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"L'importBatchId restituito da import_statement_confirm."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["batchId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"get_document_download_link","title":"Link di download del documento","description":"Restituisce un link firmato per scaricare un documento dell'archivio (valido 15 minuti, sempre come allegato). Non restituisce il contenuto: scarica il file dal link solo se serve.","domain":"documents","scope":["export"],"permission":"documents.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del documento (list_documents)."}},"required":["documentId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"upload_document","title":"Caricare un documento","description":"Archivia come documento un file già caricato (create_upload_link con purpose «document», o PUT /api/agent/v1/files). Stessi controlli dell'app (tipo, contenuto reale). Restituisce documentId; poi link_document lo collega a un movimento. Il file caricato si usa una volta sola.","domain":"documents","scope":["write:documents"],"permission":"documents.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"fileId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il fileId del caricamento."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["fileId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"link_document","title":"Collegare un documento","description":"Collega un documento dell'archivio a un movimento (giustificativo). Se il movimento era classificato e aspettava il documento diventa «completo», come nell'app. Se importo o data letti dal documento sono molto diversi da quelli del movimento, la risposta contiene `warnings` (il collegamento avviene comunque: si toglie con unlink_document).","domain":"documents","scope":["write:documents"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il movimento."},"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il documento da collegare."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId","documentId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"unlink_document","title":"Scollegare un documento","description":"Toglie il collegamento tra un documento e un movimento. Il documento resta in archivio (gli agenti non cancellano documenti).","domain":"documents","scope":["write:documents"],"permission":"movements.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il movimento."},"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il documento da scollegare."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId","documentId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"extract_document_data","title":"Leggere i dati di un documento","description":"Legge data, importo, fornitore e numero da un documento dell'archivio (PDF o immagine con l'AI; fattura elettronica XML/P7M senza AI) e li salva sul documento. Consuma il limite AI mensile per PDF e immagini. Importi in euro come stringhe.","domain":"documents","scope":["write:documents"],"permission":"documents.write","write":true,"ai":true,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":["ocr_extraction"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il documento."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["documentId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"scan_receipt","title":"Leggere uno scontrino","description":"Legge importo, data ed esercente dalla foto di uno scontrino già caricata (purpose «document», JPEG/PNG/WebP ≤ 10 MB). Usa l'AI dell'abbonamento. Non crea movimenti né documenti.","domain":"documents","scope":["write:documents"],"permission":"movements.write","write":true,"ai":true,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"fileId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il fileId della foto caricata."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["fileId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_analisi","title":"Esportare l'analisi","description":"Analisi dell'esercizio (centri di costo, andamento mensile, contributi) in PDF (solo tabelle) o Excel, con gli stessi numeri della pagina Analisi. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"reports.export","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"format":{"description":"Default pdf.","type":"string","enum":["pdf","xlsx"]},"compare":{"description":"Confronto con l'esercizio precedente (default sì).","type":"boolean"},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_modello_d","title":"Esportare il Modello D","description":"Rendiconto per cassa (Modello D) in PDF, come lo scarica l'app. Solo per esercizi per cassa. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"description":"Esercizio (default quello in corso).","type":"integer","minimum":2000,"maximum":2100},"projectId":{"description":"Solo i movimenti di un contributo.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_modello_a_b_c","title":"Esportare i Modelli A, B e C","description":"Bilancio per competenza in PDF: Stato Patrimoniale (a), Rendiconto Gestionale (b) o Relazione di missione (c). Solo per esercizi per competenza. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"model":{"type":"string","enum":["a","b","c"],"description":"a = Stato Patrimoniale, b = Rendiconto Gestionale, c = Relazione di missione."},"year":{"type":"integer","minimum":2000,"maximum":2100},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"required":["model","year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_report_workbook","title":"Esportare la cartella dei report","description":"Cartella Excel dei report dell'esercizio (movimenti, categorie, conti, contributi), come «Esporta» nella pagina Report. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"reports.export","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":["advanced_export"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_movements","title":"Esportare i movimenti","description":"Movimenti filtrati in CSV o Excel (stessi filtri dell'elenco movimenti). Il CSV usa il punto e virgola come separatore e il punto come decimale (-49.99), UTF-8 con BOM. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"movements.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"format":{"description":"Default csv.","type":"string","enum":["csv","xlsx"]},"status":{"type":"string","enum":["complete","missing_document","needs_review","ambiguous","to_review"]},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"search":{"type":"string","maxLength":200},"categoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"unclassified":{"type":"boolean"},"amountSign":{"type":"string","enum":["positive","negative"]}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_contributo_bundle","title":"Esportare il pacchetto di rendicontazione","description":"ZIP dei documenti di spesa di un contributo: i giustificativi collegati alle spese imputate nel periodo, una cartella per movimento, con _INDICE.csv (elenco delle spese e dei file) e _PROVE_MANCANTI.txt (spese senza giustificativo). È il download «Solo documenti (ZIP)» della sezione Consegna dell'app. NON contiene frontespizio, elenco analitico (PDF/Excel) né prospetto: il pacchetto completo («Esporta» nella Consegna del contributo) si scarica dall'app. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"documents.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il contributo (list_contributi)."},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"required":["projectId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_cost_center_report","title":"Esportare il report dei centri di costo","description":"Report spese di un centro di costo (movimenti imputati e quote) in Excel o PDF. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il centro di costo (list_cost_centers)."},"format":{"description":"Default xlsx.","type":"string","enum":["xlsx","pdf"]},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["costCenterId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_scadenzario","title":"Esportare lo scadenzario","description":"Scadenzario fiscale dell'ente in PDF o Excel. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"scadenze.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"format":{"description":"Default pdf.","type":"string","enum":["pdf","xlsx"]},"status":{"type":"string","enum":["pending","snoozed","completed","skipped"]},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_libro_giornale","title":"Esportare il libro giornale","description":"Libro giornale dell'esercizio per competenza in CSV nel formato italiano da libro contabile: punto e virgola come separatore, virgola come decimale (1123,57), UTF-8 con BOM. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_rimborso_declaration","title":"Esportare l'autodichiarazione di rimborso","description":"Autodichiarazione di un rimborso spese autocertificato, in PDF da far firmare al volontario. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"rimborsi","scope":["export"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"reimbursementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il rimborso (list_rimborsi)."},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"required":["reimbursementId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_cinque_per_mille","title":"Rendiconti 5×1000","description":"I rendiconti del 5×1000 dell'ente, uno per anno finanziario: importo e data dell'accredito, stato mostrato dalla pagina (bozza finché i passi di legge richiesti non sono tutti fatti) e i passi con la loro scadenza (redatto entro 12 mesi dall'accredito; da 20.000 euro anche invio al Ministero, pubblicazione e link), il prossimo passo da fare e la sanzione a rischio. Importi in euro come stringhe.","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_cinque_per_mille","title":"Dettaglio rendiconto 5×1000","description":"Il rendiconto 5×1000 come lo stampa il PDF: spese imputate per sezione ministeriale nella finestra di 12 mesi dall'accredito, totale speso, differenza con l'importo ricevuto (negativa se speso più del ricevuto), stato e passi di legge. filingId da list_cinque_per_mille.","domain":"reports","scope":["read"],"permission":"reports.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"filingId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del rendiconto (da list_cinque_per_mille)."}},"required":["filingId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"export_cinque_per_mille","title":"Esportare il rendiconto 5×1000","description":"Il PDF del rendiconto 5×1000 da firmare, lo stesso del pulsante «PDF» della pagina, con il logo dell'ente. Restituisce un link firmato valido 15 minuti (url), non il contenuto.","domain":"exports","scope":["export"],"permission":"reports.export","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"filingId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del rendiconto (da list_cinque_per_mille)."}},"required":["filingId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_cinque_per_mille","title":"Creare un rendiconto 5×1000","description":"Crea il rendiconto 5×1000 di un anno finanziario (uno per anno), come «Nuovo rendiconto» nella pagina: anno finanziario, anno e data dell'accredito, importo ricevuto. Nasce in bozza e fa comparire la sua scadenza nello scadenzario. importoErogato è una stringa in euro.","domain":"reports","scope":["write:reports"],"permission":"reports.export","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"annoFinanziario":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno finanziario a cui si riferisce il contributo."},"annoErogazione":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno in cui è arrivato l'accredito."},"importoErogato":{"type":"string","pattern":"^\\d{1,9}(\\.\\d{1,2})?$","description":"Importo ricevuto in euro, es. \"12345.67\"."},"dataErogazione":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data dell'accredito, AAAA-MM-GG."},"notes":{"description":"Note.","type":"string","maxLength":2000},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["annoFinanziario","annoErogazione","importoErogato","dataErogazione"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"update_cinque_per_mille","title":"Aggiornare un rendiconto 5×1000","description":"Registra i passi di legge del rendiconto 5×1000, come la lista «Adempimenti» della pagina: data di redazione (rendicontoRedattoIl), di invio al Ministero (inviatoMinisteroIl), di pubblicazione con l'indirizzo della pagina (pubblicatoIl + urlPubblicazione) e di comunicazione del link (linkComunicatoIl). null annulla un passo (solo l'ultimo fatto). I passi vanno in ordine, non nel futuro né prima dell'accredito; lo stato segue i passi. notes solo in bozza. Un rendiconto archiviato non si modifica.","domain":"reports","scope":["write:reports"],"permission":"reports.export","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"filingId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del rendiconto (da list_cinque_per_mille)."},"rendicontoRedattoIl":{"description":"Rendiconto redatto il, AAAA-MM-GG; null annulla.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"inviatoMinisteroIl":{"description":"Inviato al Ministero il; null annulla.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"pubblicatoIl":{"description":"Pubblicato sul sito il; null annulla.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"urlPubblicazione":{"description":"Indirizzo della pagina pubblicata.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"linkComunicatoIl":{"description":"Link comunicato al Ministero il; null annulla.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"notes":{"description":"Note (solo in bozza).","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["filingId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_ritenute_report","title":"Riepilogo ritenute e F24","description":"Le ritenute d'acconto di un anno raggruppate per mese di pagamento e codice tributo, con la data del versamento F24 (16 del mese dopo, spostata al primo giorno lavorativo; ritenute di luglio entro il 20 agosto), l'importo da versare e lo stato (scaduto, in_scadenza entro 15 giorni, futuro); prossimo = il primo F24 non ancora scaduto. Il versamento fatto si segna sulla scadenza (list_scadenze, complete_scadenza). Il modello F24 e la CU si preparano nell'app. includeRitenute aggiunge le singole ritenute (nome del percipiente, senza codice fiscale).","domain":"rimborsi","scope":["read"],"permission":"ritenute.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno solare dei pagamenti."},"month":{"description":"Solo questo mese (1-12).","type":"integer","minimum":1,"maximum":12},"percipientId":{"description":"Solo un percipiente (da list_percipienti).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"includeRitenute":{"description":"Aggiungi l'elenco delle ritenute (predefinito no).","type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_percipienti","title":"Percipienti","description":"I percipienti attivi (chi riceve compensi con ritenuta): nome, tipo di rapporto, causale, aliquota predefinita, partita IVA. Con year anche numero di pagamenti, lordo e ritenute dell'anno (i dati della CU). Il codice fiscale, la nascita e l'indirizzo non sono restituiti: hasCodiceFiscale, anagraficaCuCompleta e campiCuMancanti dicono se ci sono.","domain":"rimborsi","scope":["read"],"permission":"percipients.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"description":"Anno dei totali (lordo, ritenute, pagamenti).","type":"integer","minimum":2000,"maximum":2100},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_percipiente","title":"Dettaglio percipiente","description":"Un percipiente (da list_percipienti) con, se indichi year, numero di pagamenti, lordo e ritenute dell'anno. Codice fiscale, nascita e indirizzo non sono restituiti: campiCuMancanti dice cosa manca per la CU.","domain":"rimborsi","scope":["read"],"permission":"percipients.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"any","features":[],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"percipientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del percipiente."},"year":{"description":"Anno dei totali.","type":"integer","minimum":2000,"maximum":2100}},"required":["percipientId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_assestamenti","title":"Ratei, risconti e fondi","description":"Gli assestamenti di fine anno di un esercizio per competenza, come la pagina Assestamenti: ratei e risconti (accruals: tipo, conto patrimoniale e conto economico, periodo di competenza, importo totale, se già registrati) e fondi (provisions: rischi, oneri, TFR, svalutazione, con saldo iniziale). Importi in euro come stringhe.","domain":"contabilita","scope":["read"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"list_cespiti","title":"Cespiti","description":"Il registro dei cespiti, come la pagina Cespiti: per ogni bene costo, data di acquisto, vita utile o aliquota, conti collegati, stato (attivo, dismesso, completamente ammortizzato), fondo ammortamento registrato, valore netto e piano di ammortamento (quote registrate e da registrare). Importi in euro come stringhe.","domain":"contabilita","scope":["read"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"get_saldi_apertura","title":"Saldi di apertura","description":"La griglia dei saldi di apertura di un esercizio per competenza: i conti patrimoniali movimentabili con il saldo già salvato (dare o avere), i totali, se quadrano, se l'apertura è già registrata (alreadySeeded) e se si può ancora scrivere (canEdit: esercizio aperto e apertura non registrata). Da leggere prima di set_saldi_apertura.","domain":"contabilita","scope":["read"],"permission":"bilancio.read","write":false,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest","stdio"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."}},"required":["year"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"create_journal_entry","title":"Creare una scrittura in prima nota","description":"Crea una scrittura in bozza nella prima nota per competenza, come «Nuova scrittura»: data, causale e righe dare/avere su conti movimentabili (da list_accounts; non i mastri di controllo crediti/debiti). L'agente scrive solo scritture QUADRATE (Σdare = Σavere, almeno 2 righe). La bozza non è registrata: la approva una persona nell'app (submit:true la mette subito in coda di approvazione). La data deve stare nell'esercizio year; un esercizio chiuso non si tocca.","domain":"contabilita","scope":["write:competenza"],"permission":"prima_nota.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura."},"entryDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di competenza, AAAA-MM-GG, dentro l'esercizio."},"description":{"type":"string","minLength":1,"maxLength":500,"description":"Causale."},"lines":{"minItems":2,"maxItems":200,"type":"array","items":{"type":"object","properties":{"ledgerAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto (da list_accounts)."},"side":{"type":"string","enum":["dare","avere"]},"amount":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$","description":"Importo positivo in euro."},"lineDescription":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"contactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"analyticalCategoryId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"projectId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"costCenterId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["ledgerAccountId","side","amount"],"additionalProperties":false},"description":"Righe dare/avere, quadrate."},"documentId":{"description":"Documento collegato (da list_documents).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"submit":{"description":"true = invia subito in approvazione.","type":"boolean"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","entryDate","description","lines"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"update_journal_entry","title":"Modificare una scrittura in bozza","description":"Modifica una scrittura ancora in BOZZA (una registrata si corregge con uno storno, nell'app): data, causale e/o righe. lines sostituisce tutte le righe e deve essere quadrata. La data resta nell'esercizio year.","domain":"contabilita","scope":["write:competenza"],"permission":"prima_nota.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura (da list_journal_entries)."},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scrittura in bozza."},"entryDate":{"description":"Nuova data, dentro lo stesso esercizio.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":{"description":"Nuova causale.","type":"string","minLength":1,"maxLength":500},"lines":{"description":"Tutte le righe, quadrate.","minItems":2,"maxItems":200,"type":"array","items":{"type":"object","properties":{"ledgerAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto (da list_accounts)."},"side":{"type":"string","enum":["dare","avere"]},"amount":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$","description":"Importo positivo in euro."},"lineDescription":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"contactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"analyticalCategoryId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"projectId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"costCenterId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["ledgerAccountId","side","amount"],"additionalProperties":false}},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","entryId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"submit_journal_entry","title":"Inviare una scrittura in approvazione","description":"Mette una bozza quadrata in coda di approvazione, come «Invia per approvazione». La registra una persona con il permesso di approvare: l'agente non registra mai.","domain":"contabilita","scope":["write:competenza"],"permission":"prima_nota.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura (da list_journal_entries)."},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scrittura in bozza."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","entryId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"withdraw_journal_entry","title":"Ritirare una scrittura dall'approvazione","description":"Riporta in bozza modificabile una scrittura in coda di approvazione, come «Ritira».","domain":"contabilita","scope":["write:competenza"],"permission":"prima_nota.write","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura (da list_journal_entries)."},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scrittura in bozza."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","entryId"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"delete_journal_entry","title":"Eliminare una scrittura in bozza","description":"Elimina una scrittura ancora in BOZZA (mai una registrata: quella si storna nell'app). Chiede sempre conferma.","domain":"contabilita","scope":["write:competenza"],"permission":"prima_nota.write","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura (da list_journal_entries)."},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scrittura in bozza."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["year","entryId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"create_assestamento","title":"Registrare un rateo, risconto o fondo","description":"Aggiunge un assestamento di fine anno, come la pagina Assestamenti. type «accrual» = rateo o risconto: kind (rateo_attivo, rateo_passivo, risconto_attivo, risconto_passivo), balanceSheetAccountId e counterAccountId diversi, competenceStart/competenceEnd che toccano l'esercizio, totalAmount (l'intero importo). type «provision» = fondo: name, kind (fondo_rischi, fondo_oneri, tfr, fondo_svalutazione), provisionAccountId, expenseAccountId e openingBalance facoltativi. Le scritture le genera la chiusura dell'esercizio, non questo strumento. Un esercizio chiuso non si tocca.","domain":"contabilita","scope":["write:competenza"],"permission":"bilancio.setup","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."},"type":{"type":"string","enum":["accrual","provision"]},"kind":{"type":"string","enum":["rateo_attivo","rateo_passivo","risconto_attivo","risconto_passivo","fondo_rischi","fondo_oneri","tfr","fondo_svalutazione"]},"balanceSheetAccountId":{"description":"accrual: conto patrimoniale.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"counterAccountId":{"description":"accrual: conto economico.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"competenceStart":{"description":"accrual: inizio competenza.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"competenceEnd":{"description":"accrual: fine competenza.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"totalAmount":{"description":"accrual: importo totale in euro.","type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$"},"name":{"description":"provision: nome del fondo.","type":"string","minLength":1,"maxLength":200},"provisionAccountId":{"description":"provision: conto del fondo.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"expenseAccountId":{"description":"provision: conto di accantonamento.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"openingBalance":{"description":"provision: saldo iniziale in euro.","anyOf":[{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","type","kind"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"delete_assestamento","title":"Eliminare un rateo, risconto o fondo","description":"Elimina un rateo/risconto (type accrual) o un fondo (type provision) NON ancora registrato in contabilità (uno registrato si storna nell'app). itemId e year da list_assestamenti. Chiede sempre conferma.","domain":"contabilita","scope":["write:competenza"],"permission":"bilancio.setup","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio dell'assestamento."},"type":{"type":"string","enum":["accrual","provision"]},"itemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del rateo/risconto o del fondo."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["year","type","itemId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"create_cespite","title":"Registrare un cespite","description":"Registra un'immobilizzazione e il suo piano di ammortamento, come «Nuovo cespite»: nome, conto del cespite, data e costo di acquisto, vita utile in mesi OPPURE aliquota annua, valore residuo; per ammortizzarlo servono il conto della quota (depreciationExpenseAccountId) e il fondo ammortamento (accumulatedDepreciationAccountId). Le quote si registrano alla chiusura dell'esercizio. L'esercizio dell'acquisto deve essere aperto; fa eccezione un anno chiuso solo per cassa (prima del passaggio alla competenza): il bene si registra, l'ammortamento parte dal primo esercizio aperto e il fondo maturato prima va nei saldi di apertura (preCompetenzaYears nella risposta).","domain":"contabilita","scope":["write:competenza"],"permission":"bilancio.setup","write":true,"ai":false,"aiConditional":false,"risk":"normal","confirmWhen":null,"regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"assetAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto dell'immobilizzazione."},"depreciationExpenseAccountId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"accumulatedDepreciationAccountId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"acquisitionDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di acquisto, AAAA-MM-GG."},"acquisitionCost":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$","description":"Costo in euro."},"usefulLifeMonths":{"description":"Vita utile in mesi.","anyOf":[{"type":"integer","minimum":1,"maximum":1200},{"type":"null"}]},"depreciationRate":{"description":"Aliquota annua %, es. \"20\".","anyOf":[{"type":"string","pattern":"^\\d+(\\.\\d{1,2})?$"},{"type":"null"}]},"residualValue":{"description":"Valore residuo in euro.","anyOf":[{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","assetAccountId","acquisitionDate","acquisitionCost"],"additionalProperties":false},"outputSchema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}},{"name":"dispose_cespite","title":"Dismettere un cespite","description":"Dismette un cespite alla data indicata, come «Dismetti»: il piano di ammortamento viene tagliato ai mesi di possesso, le quote già registrate restano. Lo storno contabile del costo e del fondo resta da fare in prima nota. Chiede sempre conferma.","domain":"contabilita","scope":["write:competenza"],"permission":"bilancio.setup","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del cespite (da list_cespiti)."},"disposedAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di dismissione, AAAA-MM-GG."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["assetId","disposedAt"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"delete_cespite","title":"Eliminare un cespite","description":"Elimina un cespite registrato per errore che non ha quote di ammortamento registrate (uno con quote registrate si dismette). Chiede sempre conferma.","domain":"contabilita","scope":["write:competenza"],"permission":"bilancio.setup","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del cespite (da list_cespiti)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["assetId"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}},{"name":"set_saldi_apertura","title":"Registrare i saldi di apertura","description":"Registra i saldi di apertura di un esercizio per competenza e la scrittura di apertura, come «Conferma» nella pagina Saldi di apertura: un saldo per conto patrimoniale (attività in dare, passività e patrimonio netto in avere), Attivo = Passivo al centesimo. Si fa una volta sola, su un esercizio aperto senza apertura (get_saldi_apertura: canEdit). La scrittura è registrata subito: chiede sempre conferma.","domain":"contabilita","scope":["write:competenza"],"permission":"bilancio.setup","write":true,"ai":false,"aiConditional":false,"risk":"confirm","confirmWhen":"always","regime":"competenza","features":["competenza_accounting"],"transports":["http","rest"],"inputSchema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio da aprire."},"lines":{"minItems":2,"maxItems":500,"type":"array","items":{"type":"object","properties":{"ledgerAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto patrimoniale (da get_saldi_apertura)."},"side":{"type":"string","enum":["dare","avere"]},"amount":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$","description":"Saldo positivo in euro."}},"required":["ledgerAccountId","side","amount"],"additionalProperties":false},"description":"Un saldo per conto, quadrati."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["year","lines"],"additionalProperties":false},"outputSchema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}]}