Amélioration de l'API

This commit is contained in:
ocroguennec committed 2026-08-22 12:28:48 +02:00
1 parent 5dc6f21e61
commit 4ad6ea79e8
8 files changed
+387 -47

No files matched your search

+2
View File
@@ -213,6 +213,8 @@ Tous en lecture seule (`readOnlyHint: true`) :
| `crowdlending_get_investissement` | Détail d'un investissement + ses remboursements |
| `crowdlending_list_remboursements` | Historique des remboursements, filtrable par période |
| `crowdlending_list_depots_retraits` | Historique des mouvements de cash |
| `crowdlending_list_objectifs` | Objectifs de versement et de capital investi, à comparer au réalisé |
| `crowdlending_get_taxreport` | Synthèse fiscale annuelle (CERFA 2042/2561/2047/2778-SD) — aide à la déclaration, pas une source officielle |
| `crowdlending_fetch_url` | *(actif seulement si `MCP_ENABLE_FETCH_URL=true`)* Lit une page web (annonce de projet) et en extrait le texte propre — voir ci-dessous |
## Lire une annonce de projet (`crowdlending_fetch_url`)
+75 -4
View File
@@ -30,7 +30,7 @@ const READ_ONLY_ANNOTATIONS = {
};
/**
* Enregistre les 6 outils de lecture de données sur `server`.
* Enregistre les 9 outils de lecture de données sur `server`.
*
* @param {import('@modelcontextprotocol/sdk/server/mcp.js').McpServer} server
* @param {object} ctx
@@ -74,9 +74,14 @@ export function registerDataTools(server, { apiGet, withLabel = (t) => t, withSo
"cours et en défaut, net des remboursements déjà perçus — équivalent au " +
"KPI \"Capital investi\" de l'app), capital en risque (sous-ensemble en " +
"retard/procédure), montant remboursé, intérêts bruts/nets perçus, " +
"capital reçu, total dépôts/retraits. Les montants d'investissements sont " +
"des soldes actuels (photo à aujourd'hui), pas des cumuls par période. " +
"Point d'entrée idéal pour une vue d'ensemble avant d'aller chercher le détail."),
"capital reçu, total dépôts/retraits, et gain_net_depuis_debut (intérêts " +
"nets + cashback/bonus de parrainage ou de plateforme + corrections de " +
"solde, cumulés sur tout l'historique — équivalent au KPI \"Gain net " +
"depuis le début\" de l'app, toujours un total, jamais filtré par année, " +
"reste valable même après un retrait complet des plateformes). Les " +
"montants d'investissements sont des soldes actuels (photo à " +
"aujourd'hui), pas des cumuls par période. Point d'entrée idéal pour " +
"une vue d'ensemble avant d'aller chercher le détail."),
inputSchema: {
annee: z.number().int().optional()
.describe("Filtre les intérêts/capital reçu sur une année (ex. 2026). Omettre pour le cumul total. N'affecte pas le capital investi/en risque, qui sont toujours des soldes actuels."),
@@ -166,6 +171,72 @@ export function registerDataTools(server, { apiGet, withLabel = (t) => t, withSo
catch (e) { return toolError(e); }
},
);
server.registerTool(
'crowdlending_list_objectifs',
{
title: withLabel('Objectifs de versement et de capital investi'),
description: withSource(
"Liste les objectifs fixés dans Paramétrage → Fixation des objectifs, à " +
"comparer au réalisé (voir crowdlending_get_dashboard ou " +
"crowdlending_list_depots_retraits). Trois types : versement_global " +
"(objectif global sur l'investisseur principal), versement_annuel " +
"(enveloppe par détenteur), capital_investi (objectif de capital investi " +
"par plateforme, avec plateforme_id renseigné). Liste vide si la " +
"fonctionnalité est désactivée par l'utilisateur, ou si aucun objectif " +
"n'a encore été saisi."),
inputSchema: {
type: z.enum(['versement_global', 'versement_annuel', 'capital_investi'])
.optional()
.describe("Filtrer par type d'objectif. Omettre pour lister tous les objectifs."),
annee: z.number().int().optional()
.describe("Filtrer par année. Omettre pour lister toutes les années."),
},
annotations: READ_ONLY_ANNOTATIONS,
},
async ({ type, annee }) => {
try { return toolResult(await apiGet('/objectifs', { type, annee })); }
catch (e) { return toolError(e); }
},
);
server.registerTool(
'crowdlending_get_taxreport',
{
title: withLabel('Synthèse fiscale annuelle (CERFA)'),
description: withSource(
"Retourne une synthèse fiscale annuelle pour aider à préparer la " +
"déclaration de revenus — CE N'EST PAS UNE SOURCE OFFICIELLE : les " +
"montants doivent être vérifiés avant d'être reportés, l'utilisateur " +
"reste seul responsable de l'exactitude de sa déclaration. Reprend les " +
"mêmes calculs que la page Fiscalité de l'application. `synthese_2042` " +
"donne les cases 2TT/2TR/2BH/2CK/2TY à reporter sur la déclaration " +
"principale (CERFA 2042). `cerfa2561` détaille le récapitulatif IFU des " +
"plateformes françaises soumises au prélèvement forfaitaire unique " +
"(PFU). `cerfa2047` (présent seulement si has_etranger est vrai) détaille " +
"par plateforme étrangère l'éligibilité au crédit d'impôt conventionnel " +
"(cases 231 à 238, ou 250 si non éligible). `cerfa2778_mensuel` (présent " +
"seulement si has_etranger) donne le détail mensuel des intérêts bruts " +
"par plateforme étrangère, base du calcul du prélèvement forfaitaire " +
"obligatoire (PFO) — un acompte mensuel légalement dû seulement si " +
"pfo_assujetti est vrai (seuil de revenu fiscal de référence : 25 000 € " +
"pour une personne seule, 50 000 € pour un couple marié ou pacsé), mais " +
"la déclaration annuelle CERFA 2047 reste obligatoire dans tous les cas " +
"dès qu'il y a des revenus de plateformes étrangères. Limite connue : " +
"case_2BH/case_2CK de synthese_2042 supposent qu'aucune plateforme " +
"étrangère n'a été exclue manuellement du calcul PFO dans l'application " +
"(réglage propre au navigateur, non accessible depuis l'API)."),
inputSchema: {
annee: z.number().int().optional()
.describe("Année fiscale (ex. 2026). Omettre pour l'année précédente par défaut."),
},
annotations: READ_ONLY_ANNOTATIONS,
},
async ({ annee }) => {
try { return toolResult(await apiGet('/taxreport', { annee })); }
catch (e) { return toolError(e); }
},
);
}
/** Formate le résultat d'un outil : texte JSON lisible + structuredContent.