boondmanager-mcp-server 1.7.1 → 1.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+fzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAY1D;AAED,wFAAwF;AACxF,eAAO,MAAM,kBAAkB;;;;;GAK5B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0pBzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAY1D;AAED,wFAAwF;AACxF,eAAO,MAAM,kBAAkB;;;;;GAK5B,CAAC"}
@@ -17,6 +17,38 @@ import { z } from "zod";
17
17
  const userMessage = (text) => ({
18
18
  messages: [{ role: "user", content: { type: "text", text } }],
19
19
  });
20
+ const SEARCH_TOOL_BY_KIND = {
21
+ resource: "boond_resources_search",
22
+ society: "boond_companies_search",
23
+ opportunity: "boond_opportunities_search",
24
+ agency: "boond_agencies_search",
25
+ };
26
+ const LABEL_BY_KIND = {
27
+ resource: "ressource",
28
+ society: "société",
29
+ opportunity: "opportunité",
30
+ agency: "agence",
31
+ };
32
+ const resolveEntity = (input, kind, placeholder) => {
33
+ const trimmed = input.trim();
34
+ if (/^\d+$/.test(trimmed)) {
35
+ return { idForFilter: trimmed, preamble: "" };
36
+ }
37
+ const tool = SEARCH_TOOL_BY_KIND[kind];
38
+ const label = LABEL_BY_KIND[kind];
39
+ const preamble = [
40
+ `**Préalable — résolution de la ${label} :** « ${trimmed} » n'est pas un ID numérique.`,
41
+ `- Appeler \`${tool}\` avec \`keywords: "${trimmed}"\` et \`pageSize: 5\`.`,
42
+ `- Retenir l'\`id\` du résultat le plus pertinent → ce sera la valeur \`${placeholder}\` à utiliser dans toutes les étapes ci-dessous.`,
43
+ `- Si plusieurs candidats matchent, demander confirmation à l'utilisateur avant de poursuivre.`,
44
+ "",
45
+ ].join("\n");
46
+ return { idForFilter: placeholder, preamble };
47
+ };
48
+ const ID_OR_NAME_HINT_RESOURCE = "Accepte soit l'ID numérique, soit « Prénom Nom » (le serveur résoudra automatiquement via `boond_resources_search`).";
49
+ const ID_OR_NAME_HINT_SOCIETY = "Accepte soit l'ID numérique, soit le nom de la société (résolution auto via `boond_companies_search`).";
50
+ const ID_OR_NAME_HINT_OPPORTUNITY = "Accepte soit l'ID numérique, soit l'intitulé de l'opportunité (résolution auto via `boond_opportunities_search`).";
51
+ const ID_OR_NAME_HINT_AGENCY = "Accepte soit l'ID numérique, soit le nom de l'agence (résolution auto via `boond_agencies_search`).";
20
52
  const PROMPTS = [
21
53
  {
22
54
  name: "synthese_equipe",
@@ -27,7 +59,9 @@ const PROMPTS = [
27
59
  manager_id: z
28
60
  .string()
29
61
  .optional()
30
- .describe("ID du manager (ressource Boond). Si absent, l'outil `boond_application_current_user` doit être appelé pour le récupérer."),
62
+ .describe("Manager ciblé. " +
63
+ ID_OR_NAME_HINT_RESOURCE +
64
+ " Si absent, l'outil `boond_application_current_user` est appelé pour le récupérer."),
31
65
  periode: z
32
66
  .string()
33
67
  .optional()
@@ -35,23 +69,25 @@ const PROMPTS = [
35
69
  },
36
70
  build: ({ manager_id, periode }) => {
37
71
  const periodeText = periode || "le mois en cours";
38
- const managerStep = manager_id
39
- ? `Le manager ciblé est l'ID ${manager_id}.`
40
- : "Commence par appeler `boond_application_current_user` pour obtenir mon ID utilisateur, puis utilise-le comme `manager_id`.";
41
- return [
42
- `Produis une synthèse de l'équipe pour ${periodeText}.`,
43
- "",
44
- managerStep,
45
- "",
46
- "Étapes :",
47
- "1. Lister les membres de l'équipe : `boond_resources_search` avec `perimeterManagers: [<manager_id>]` et `resourceStates` pour ne garder que les actifs (récupère les états valides via `boond_application_dictionary` avec `setting.state.resource` si besoin).",
48
- "2. Pour chaque ressource retournée, récupérer en parallèle :",
49
- " - `boond_resources_positionings` (qui est sur quel projet)",
50
- " - `boond_resources_absences_reports` (absences validées/à venir)",
51
- " - `boond_resources_times_reports` (CRA récent, pour confirmer l'occupation)",
52
- "3. Synthétiser un tableau par personne : nom, projet courant, % occupation, absences sur la période, disponibilité.",
53
- "4. Conclure par les signaux faibles (sur-/sous-charge, absences non couvertes, ressources sans positionnement).",
54
- ].join("\n");
72
+ let preamble = "";
73
+ let managerStep;
74
+ let managerIdLit;
75
+ if (manager_id) {
76
+ const r = resolveEntity(manager_id, "resource", "<MANAGER_ID>");
77
+ preamble = r.preamble;
78
+ managerIdLit = r.idForFilter;
79
+ managerStep = `Le manager ciblé a pour ID \`${managerIdLit}\`.`;
80
+ }
81
+ else {
82
+ managerIdLit = "<MANAGER_ID>";
83
+ managerStep =
84
+ "Commence par appeler `boond_application_current_user` pour obtenir mon ID utilisateur, puis utilise-le comme `<MANAGER_ID>`.";
85
+ }
86
+ const lines = [`Produis une synthèse de l'équipe pour ${periodeText}.`, ""];
87
+ if (preamble)
88
+ lines.push(preamble);
89
+ lines.push(managerStep, "", "Étapes :", `1. Lister les membres de l'équipe : \`boond_resources_search\` avec \`perimeterManagers: [${managerIdLit}]\` et \`resourceStates\` pour ne garder que les actifs (récupère les états valides via \`boond_application_dictionary\` avec \`setting.state.resource\` si besoin).`, "2. Pour chaque ressource retournée, récupérer en parallèle :", " - `boond_resources_positionings` (qui est sur quel projet)", " - `boond_resources_absences_reports` (absences validées/à venir)", " - `boond_resources_times_reports` (CRA récent, pour confirmer l'occupation)", "3. Synthétiser un tableau par personne : nom, projet courant, % occupation, absences sur la période, disponibilité.", "4. Conclure par les signaux faibles (sur-/sous-charge, absences non couvertes, ressources sans positionnement).");
90
+ return lines.join("\n");
55
91
  },
56
92
  },
57
93
  {
@@ -65,31 +101,26 @@ const PROMPTS = [
65
101
  manager_id: z
66
102
  .string()
67
103
  .optional()
68
- .describe("ID du commercial. Si absent, scope = équipe de l'utilisateur courant via `perimeterDynamic: ['data']`."),
104
+ .describe("Commercial ciblé. " +
105
+ ID_OR_NAME_HINT_RESOURCE +
106
+ " Si absent, scope = équipe de l'utilisateur courant via `perimeterDynamic: ['data']`."),
69
107
  },
70
108
  build: ({ date_debut, date_fin, manager_id }) => {
71
- const scopeFilter = manager_id
72
- ? `\`perimeterManagers: [${manager_id}]\``
73
- : "`perimeterDynamic: ['data']` (mes opportunités)";
74
- return [
75
- `Analyse mon pipeline commercial avec closing entre ${date_debut} et ${date_fin}.`,
76
- "",
77
- `Périmètre : ${scopeFilter}.`,
78
- "",
79
- "Étapes :",
80
- "1. Appeler `boond_opportunities_search` avec :",
81
- ` - \`period: "closingDate"\``,
82
- ` - \`startDate: "${date_debut}"\`, \`endDate: "${date_fin}"\``,
83
- ` - ${scopeFilter}`,
84
- " - `pageSize: 100`",
85
- "2. Si plus de 100 résultats, paginer via `page`.",
86
- "3. Récupérer le dictionnaire des états via `boond_application_dictionary` avec `setting.state.opportunity` pour traduire les ID en libellés.",
87
- "4. Restituer :",
88
- " - Nombre total d'opportunités, par état",
89
- " - CA pondéré total (somme de `turnoverWeightedExcludingTax`)",
90
- " - Top 10 par montant pondéré, avec société/contact/closingDate",
91
- " - Risques : opportunités dont la closingDate est passée mais qui ne sont pas encore en état Gagnée/Perdue.",
92
- ].join("\n");
109
+ let preamble = "";
110
+ let scopeFilter;
111
+ if (manager_id) {
112
+ const r = resolveEntity(manager_id, "resource", "<MANAGER_ID>");
113
+ preamble = r.preamble;
114
+ scopeFilter = `\`perimeterManagers: [${r.idForFilter}]\``;
115
+ }
116
+ else {
117
+ scopeFilter = "`perimeterDynamic: ['data']` (mes opportunités)";
118
+ }
119
+ const lines = [`Analyse mon pipeline commercial avec closing entre ${date_debut} et ${date_fin}.`, ""];
120
+ if (preamble)
121
+ lines.push(preamble);
122
+ lines.push(`Périmètre : ${scopeFilter}.`, "", "Étapes :", "1. Appeler `boond_opportunities_search` avec :", ` - \`period: "closingDate"\``, ` - \`startDate: "${date_debut}"\`, \`endDate: "${date_fin}"\``, ` - ${scopeFilter}`, " - `pageSize: 100`", "2. Si plus de 100 résultats, paginer via `page`.", "3. Récupérer le dictionnaire des états via `boond_application_dictionary` avec `setting.state.opportunity` pour traduire les ID en libellés.", "4. Restituer :", " - Nombre total d'opportunités, par état", " - CA pondéré total (somme de `turnoverWeightedExcludingTax`)", " - Top 10 par montant pondéré, avec société/contact/closingDate", " - Risques : opportunités dont la closingDate est passée mais qui ne sont pas encore en état Gagnée/Perdue.");
123
+ return lines.join("\n");
93
124
  },
94
125
  },
95
126
  {
@@ -98,24 +129,27 @@ const PROMPTS = [
98
129
  description: "Liste les factures impayées avec date d'échéance dépassée, regroupées par société. " +
99
130
  "Optionnellement filtrable sur une société spécifique.",
100
131
  argsSchema: {
101
- society_id: z.string().optional().describe("ID d'une société pour cibler la relance."),
132
+ society_id: z
133
+ .string()
134
+ .optional()
135
+ .describe("Société ciblée pour la relance. " + ID_OR_NAME_HINT_SOCIETY),
102
136
  },
103
137
  build: ({ society_id }) => {
104
- return [
105
- "Identifie les factures à relancer (impayées dont l'échéance est dépassée).",
106
- "",
107
- "Étapes :",
108
- "1. Appeler `boond_invoices_search` :",
109
- society_id
110
- ? ` - \`companyId: "${society_id}"\``
111
- : " - sans filtre société (toutes les factures du périmètre courant)",
112
- " - `pageSize: 100`",
113
- "2. Récupérer le dictionnaire `setting.state.invoice` via `boond_application_dictionary` pour identifier les états « payée » / « partiellement payée » / etc.",
114
- "3. Filtrer côté agent : ne conserver que les factures dont l'état n'est PAS « payée » ET dont la `dueDate` est strictement antérieure à aujourd'hui.",
115
- "4. Pour chaque facture retenue, récupérer le détail via `boond_invoices_get` si nécessaire pour obtenir le contact/email de relance.",
116
- "5. Restituer un tableau groupé par société : société | nombre de factures impayées | total HT impayé | facture la plus ancienne (référence + jours de retard) | contact à relancer.",
117
- "6. Ajouter une ligne « Total » en bas.",
118
- ].join("\n");
138
+ let preamble = "";
139
+ let filterLine;
140
+ if (society_id) {
141
+ const r = resolveEntity(society_id, "society", "<SOCIETE_ID>");
142
+ preamble = r.preamble;
143
+ filterLine = ` - \`companyId: "${r.idForFilter}"\``;
144
+ }
145
+ else {
146
+ filterLine = " - sans filtre société (toutes les factures du périmètre courant)";
147
+ }
148
+ const lines = ["Identifie les factures à relancer (impayées dont l'échéance est dépassée).", ""];
149
+ if (preamble)
150
+ lines.push(preamble);
151
+ lines.push("Étapes :", "1. Appeler `boond_invoices_search` :", filterLine, " - `pageSize: 100`", "2. Récupérer le dictionnaire `setting.state.invoice` via `boond_application_dictionary` pour identifier les états « payée » / « partiellement payée » / etc.", "3. Filtrer côté agent : ne conserver que les factures dont l'état n'est PAS « payée » ET dont la `dueDate` est strictement antérieure à aujourd'hui.", "4. Pour chaque facture retenue, récupérer le détail via `boond_invoices_get` si nécessaire pour obtenir le contact/email de relance.", "5. Restituer un tableau groupé par société : société | nombre de factures impayées | total HT impayé | facture la plus ancienne (référence + jours de retard) | contact à relancer.", "6. Ajouter une ligne « Total » en bas.");
152
+ return lines.join("\n");
119
153
  },
120
154
  },
121
155
  {
@@ -123,25 +157,16 @@ const PROMPTS = [
123
157
  title: "Candidats correspondant à une opportunité",
124
158
  description: "À partir d'une opportunité (ses outils, expertise, mobilité), trouve les candidats actifs qui matchent.",
125
159
  argsSchema: {
126
- opportunity_id: z.string().describe("ID de l'opportunité à pourvoir."),
160
+ opportunity_id: z.string().describe("Opportunité à pourvoir. " + ID_OR_NAME_HINT_OPPORTUNITY),
127
161
  },
128
162
  build: ({ opportunity_id }) => {
129
- return [
130
- `Identifie les candidats qui matchent l'opportunité ${opportunity_id}.`,
131
- "",
132
- "Étapes :",
133
- `1. Récupérer le détail de l'opportunité : \`boond_opportunities_get(id="${opportunity_id}")\` puis l'onglet \`information\` pour les attributs détaillés.`,
134
- "2. Extraire les critères : `tools`, `expertiseAreas`, `activityAreas`, `places` (mobilité), `durations`, `startDate`/`endDate`.",
135
- "3. Appeler `boond_candidates_search` avec :",
136
- ' - les `tools` extraits (logique OU par défaut ; si l\'opportunité est très exigeante, repasser avec `["#AND#", ...]` pour exiger toutes les compétences)',
137
- " - `expertiseAreas` correspondants",
138
- " - `mobilityAreas` matchant le lieu",
139
- " - `candidateStates` actifs uniquement (consulter `setting.state.candidate` via `boond_application_dictionary`)",
140
- ' - `period: "available"` + `startDate`/`endDate` calés sur la mission, pour ne garder que les candidats disponibles',
141
- " - `pageSize: 50`",
142
- "4. Pour les top 20 candidats retournés, récupérer `boond_candidates_technical_data` pour vérifier l'adéquation fine.",
143
- "5. Restituer un classement : nom | titre | dispo | note d'adéquation (sur 10) avec justification 1 ligne.",
144
- ].join("\n");
163
+ const r = resolveEntity(opportunity_id ?? "", "opportunity", "<OPPORTUNITY_ID>");
164
+ const oppLit = r.idForFilter;
165
+ const lines = [`Identifie les candidats qui matchent l'opportunité ${oppLit}.`, ""];
166
+ if (r.preamble)
167
+ lines.push(r.preamble);
168
+ lines.push("Étapes :", `1. Récupérer le détail de l'opportunité : \`boond_opportunities_get(id="${oppLit}")\` puis l'onglet \`information\` pour les attributs détaillés.`, "2. Extraire les critères : `tools`, `expertiseAreas`, `activityAreas`, `places` (mobilité), `durations`, `startDate`/`endDate`.", "3. Appeler `boond_candidates_search` avec :", ' - les `tools` extraits (logique OU par défaut ; si l\'opportunité est très exigeante, repasser avec `["#AND#", ...]` pour exiger toutes les compétences)', " - `expertiseAreas` correspondants", " - `mobilityAreas` matchant le lieu", " - `candidateStates` actifs uniquement (consulter `setting.state.candidate` via `boond_application_dictionary`)", ' - `period: "available"` + `startDate`/`endDate` calés sur la mission, pour ne garder que les candidats disponibles', " - `pageSize: 50`", "4. Pour les top 20 candidats retournés, récupérer `boond_candidates_technical_data` pour vérifier l'adéquation fine.", "5. Restituer un classement : nom | titre | dispo | note d'adéquation (sur 10) avec justification 1 ligne.");
169
+ return lines.join("\n");
145
170
  },
146
171
  },
147
172
  {
@@ -149,23 +174,16 @@ const PROMPTS = [
149
174
  title: "Fiche complète d'un collaborateur",
150
175
  description: "Vue 360° d'une ressource : info, profil technique, positionnements, absences, CRA récents.",
151
176
  argsSchema: {
152
- resource_id: z.string().describe("ID de la ressource."),
177
+ resource_id: z.string().describe("Ressource ciblée. " + ID_OR_NAME_HINT_RESOURCE),
153
178
  },
154
179
  build: ({ resource_id }) => {
155
- return [
156
- `Produis la fiche complète de la ressource ${resource_id}.`,
157
- "",
158
- "Étapes (à exécuter en parallèle quand possible) :",
159
- `1. \`boond_resources_information(id="${resource_id}")\` — coordonnées et état civil`,
160
- `2. \`boond_resources_technical_data(id="${resource_id}")\` — compétences, formations, langues, CV`,
161
- `3. \`boond_resources_administrative(id="${resource_id}")\` — données RH (TJM, salaire, contrat) si autorisé`,
162
- `4. \`boond_resources_positionings(id="${resource_id}")\` — positionnements actifs et historiques`,
163
- `5. \`boond_resources_projects(id="${resource_id}")\` — projets passés/en cours`,
164
- `6. \`boond_resources_absences_reports(id="${resource_id}")\` — absences à venir et passées récentes`,
165
- `7. \`boond_resources_times_reports(id="${resource_id}")\` — CRA des 3 derniers mois`,
166
- "",
167
- "Restitution : un document structuré en sections (Identité / Profil technique / Mission actuelle / Historique projets / Disponibilité / RH si pertinent). Mettre en évidence : projet courant, prochaine date de fin de mission, prochaine absence, taux d'occupation moyen sur 3 mois.",
168
- ].join("\n");
180
+ const r = resolveEntity(resource_id ?? "", "resource", "<RESOURCE_ID>");
181
+ const idLit = r.idForFilter;
182
+ const lines = [`Produis la fiche complète de la ressource ${idLit}.`, ""];
183
+ if (r.preamble)
184
+ lines.push(r.preamble);
185
+ lines.push("Étapes (à exécuter en parallèle quand possible) :", `1. \`boond_resources_information(id="${idLit}")\` — coordonnées et état civil`, `2. \`boond_resources_technical_data(id="${idLit}")\` — compétences, formations, langues, CV`, `3. \`boond_resources_administrative(id="${idLit}")\` — données RH (TJM, salaire, contrat) si autorisé`, `4. \`boond_resources_positionings(id="${idLit}")\` — positionnements actifs et historiques`, `5. \`boond_resources_projects(id="${idLit}")\` — projets passés/en cours`, `6. \`boond_resources_absences_reports(id="${idLit}")\` — absences à venir et passées récentes`, `7. \`boond_resources_times_reports(id="${idLit}")\` — CRA des 3 derniers mois`, "", "Restitution : un document structuré en sections (Identité / Profil technique / Mission actuelle / Historique projets / Disponibilité / RH si pertinent). Mettre en évidence : projet courant, prochaine date de fin de mission, prochaine absence, taux d'occupation moyen sur 3 mois.");
186
+ return lines.join("\n");
169
187
  },
170
188
  },
171
189
  {
@@ -184,39 +202,35 @@ const PROMPTS = [
184
202
  manager_id: z
185
203
  .string()
186
204
  .optional()
187
- .describe("ID d'un manager pour restreindre à son équipe. Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
205
+ .describe("Manager pour restreindre à son équipe. " +
206
+ ID_OR_NAME_HINT_RESOURCE +
207
+ " Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
188
208
  },
189
209
  build: ({ start_date, end_date, competences, manager_id }) => {
190
- const scope = manager_id
191
- ? `\`perimeterManagers: [${manager_id}]\``
192
- : "`perimeterDynamic: ['managers']` (mon équipe / mes N-1)";
210
+ let preamble = "";
211
+ let scope;
212
+ if (manager_id) {
213
+ const r = resolveEntity(manager_id, "resource", "<MANAGER_ID>");
214
+ preamble = r.preamble;
215
+ scope = `\`perimeterManagers: [${r.idForFilter}]\``;
216
+ }
217
+ else {
218
+ scope = "`perimeterDynamic: ['managers']` (mon équipe / mes N-1)";
219
+ }
193
220
  const skillsStep = competences
194
221
  ? `1. Mapper les compétences « ${competences} » vers leurs IDs : \`boond_application_dictionary\` avec \`setting.tool\` (et éventuellement \`setting.expertiseArea\`).`
195
222
  : "1. Pas de filtre compétences fourni — passer directement à l'étape 2.";
196
223
  const toolsLine = competences
197
224
  ? " - `tools: [...]` issus de l'étape 1 (logique OU ; pour exiger toutes les compétences, mettre `'#AND#'` en 1er élément)"
198
225
  : "";
199
- return [
226
+ const lines = [
200
227
  `Identifie les ressources internes disponibles pour un staffing entre ${start_date} et ${end_date}.`,
201
228
  "",
202
- `Périmètre : ${scope}.`,
203
- "",
204
- "Étapes :",
205
- skillsStep,
206
- "2. Appeler `boond_resources_search` avec :",
207
- ` - \`period: "available"\`, \`startDate: "${start_date}"\`, \`endDate: "${end_date}"\``,
208
- ` - ${scope}`,
209
- toolsLine,
210
- " - `resourceStates: [...]` filtrés sur les états « actif » uniquement (consulter `setting.state.resource` via `boond_application_dictionary`)",
211
- ' - `pageSize: 50`, `sort: "availability"`, `order: "asc"`',
212
- "3. Pour les 15 premières ressources retournées (en parallèle) :",
213
- " - `boond_resources_positionings` — vérifier qu'aucun positionnement actif ne couvre déjà la fenêtre",
214
- " - `boond_resources_technical_data` — confirmer compétences clés et niveau d'expérience",
215
- "4. Restituer un tableau trié par date de disponibilité : ressource | titre | dispo le | compétences matchées | mobilité | manager | TJM cible.",
216
- "5. Conclure par les 3 profils prioritaires à activer + un signal si la pénurie est forte (< 5 résultats — suggérer d'élargir la fenêtre ou les compétences).",
217
- ]
218
- .filter(Boolean)
219
- .join("\n");
229
+ ];
230
+ if (preamble)
231
+ lines.push(preamble);
232
+ lines.push(`Périmètre : ${scope}.`, "", "Étapes :", skillsStep, "2. Appeler `boond_resources_search` avec :", ` - \`period: "available"\`, \`startDate: "${start_date}"\`, \`endDate: "${end_date}"\``, ` - ${scope}`, toolsLine, " - `resourceStates: [...]` filtrés sur les états « actif » uniquement (consulter `setting.state.resource` via `boond_application_dictionary`)", ' - `pageSize: 50`, `sort: "availability"`, `order: "asc"`', "3. Pour les 15 premières ressources retournées (en parallèle) :", " - `boond_resources_positionings` — vérifier qu'aucun positionnement actif ne couvre déjà la fenêtre", " - `boond_resources_technical_data` — confirmer compétences clés et niveau d'expérience", "4. Restituer un tableau trié par date de disponibilité : ressource | titre | dispo le | compétences matchées | mobilité | manager | TJM cible.", "5. Conclure par les 3 profils prioritaires à activer + un signal si la pénurie est forte (< 5 résultats — suggérer d'élargir la fenêtre ou les compétences).");
233
+ return lines.filter(Boolean).join("\n");
220
234
  },
221
235
  },
222
236
  {
@@ -232,33 +246,30 @@ const PROMPTS = [
232
246
  manager_id: z
233
247
  .string()
234
248
  .optional()
235
- .describe("ID d'un manager pour restreindre à son équipe. Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
249
+ .describe("Manager pour restreindre à son équipe. " +
250
+ ID_OR_NAME_HINT_RESOURCE +
251
+ " Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
236
252
  },
237
253
  build: ({ horizon_jours, manager_id }) => {
238
254
  const horizon = horizon_jours || "60";
239
- const scope = manager_id ? `\`perimeterManagers: [${manager_id}]\`` : "`perimeterDynamic: ['managers']`";
240
- return [
255
+ let preamble = "";
256
+ let scope;
257
+ if (manager_id) {
258
+ const r = resolveEntity(manager_id, "resource", "<MANAGER_ID>");
259
+ preamble = r.preamble;
260
+ scope = `\`perimeterManagers: [${r.idForFilter}]\``;
261
+ }
262
+ else {
263
+ scope = "`perimeterDynamic: ['managers']`";
264
+ }
265
+ const lines = [
241
266
  `Liste les ressources dont la mission se termine dans les ${horizon} prochains jours.`,
242
267
  "",
243
- `Périmètre : ${scope}.`,
244
- "",
245
- "Étapes :",
246
- `1. Calculer la fenêtre : aujourd'hui (D) → D + ${horizon} jours (D+H). Conserver ces deux dates au format YYYY-MM-DD.`,
247
- "2. Appeler `boond_resources_search` avec :",
248
- ' - `period: "available"`, `startDate: D`, `endDate: D+H`',
249
- ` - ${scope}`,
250
- " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource`)",
251
- ' - `pageSize: 100`, `sort: "availability"`, `order: "asc"`',
252
- " → Cela retourne les ressources qui (re)deviennent disponibles dans la fenêtre — proxy direct pour « fin de mission ».",
253
- "3. Pour chaque ressource, en parallèle :",
254
- " - `boond_resources_positionings` — récupérer le positionnement courant (projet + société + date de fin) et détecter d'éventuels positionnements de relais déjà actés",
255
- " - `boond_resources_projects` — historique projet récent pour contexte",
256
- "4. Restituer un tableau trié par date de fin croissante : ressource | projet courant | société cliente | date de fin | jours restants | manager | relais déjà identifié (oui/non).",
257
- "5. Mettre en évidence en haut du tableau :",
258
- " - **Urgent** : fin dans <= 15 jours sans relais identifié",
259
- " - **À surveiller** : fin entre 15 et 30 jours sans relais",
260
- "6. Conclure par 3-5 actions concrètes : relances commerciales, repositionnements internes, etc.",
261
- ].join("\n");
268
+ ];
269
+ if (preamble)
270
+ lines.push(preamble);
271
+ lines.push(`Périmètre : ${scope}.`, "", "Étapes :", `1. Calculer la fenêtre : aujourd'hui (D) → D + ${horizon} jours (D+H). Conserver ces deux dates au format YYYY-MM-DD.`, "2. Appeler `boond_resources_search` avec :", ' - `period: "available"`, `startDate: D`, `endDate: D+H`', ` - ${scope}`, " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource`)", ' - `pageSize: 100`, `sort: "availability"`, `order: "asc"`', " → Cela retourne les ressources qui (re)deviennent disponibles dans la fenêtre — proxy direct pour « fin de mission ».", "3. Pour chaque ressource, en parallèle :", " - `boond_resources_positionings` — récupérer le positionnement courant (projet + société + date de fin) et détecter d'éventuels positionnements de relais déjà actés", " - `boond_resources_projects` — historique projet récent pour contexte", "4. Restituer un tableau trié par date de fin croissante : ressource | projet courant | société cliente | date de fin | jours restants | manager | relais déjà identifié (oui/non).", "5. Mettre en évidence en haut du tableau :", " - **Urgent** : fin dans <= 15 jours sans relais identifié", " - **À surveiller** : fin entre 15 et 30 jours sans relais", "6. Conclure par 3-5 actions concrètes : relances commerciales, repositionnements internes, etc.");
272
+ return lines.join("\n");
262
273
  },
263
274
  },
264
275
  {
@@ -270,44 +281,37 @@ const PROMPTS = [
270
281
  manager_id: z
271
282
  .string()
272
283
  .optional()
273
- .describe("ID d'un manager pour cibler son équipe. Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
284
+ .describe("Manager pour cibler son équipe. " +
285
+ ID_OR_NAME_HINT_RESOURCE +
286
+ " Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
274
287
  agency_id: z
275
288
  .string()
276
289
  .optional()
277
- .describe("ID d'agence pour cartographier toute une agence (alternatif à `manager_id`)."),
290
+ .describe("Agence pour cartographier toute une agence (alternatif à `manager_id`). " + ID_OR_NAME_HINT_AGENCY),
278
291
  top_n: z.string().optional().describe("Nombre de compétences à mettre en avant dans le top (défaut: 20)."),
279
292
  },
280
293
  build: ({ manager_id, agency_id, top_n }) => {
281
294
  const top = top_n || "20";
282
- const scope = agency_id
283
- ? `\`perimeterAgencies: [${agency_id}]\``
284
- : manager_id
285
- ? `\`perimeterManagers: [${manager_id}]\``
286
- : "`perimeterDynamic: ['managers']`";
287
- return [
288
- "Cartographie les compétences techniques du périmètre.",
289
- "",
290
- `Périmètre : ${scope}.`,
291
- "",
292
- "Étapes :",
293
- "1. Lister les ressources actives via `boond_resources_search` :",
294
- ` - ${scope}`,
295
- " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource` via `boond_application_dictionary`)",
296
- " - `pageSize: 100` (paginer si > 100)",
297
- "2. Récupérer le dictionnaire `setting.tool` (et `setting.expertiseArea`, `setting.languageSpoken`) via `boond_application_dictionary` pour traduire les IDs en libellés.",
298
- "3. Pour chaque ressource (par batchs parallèles), appeler `boond_resources_technical_data` et extraire `tools`, `expertiseAreas`, `languages`, `experiences`.",
299
- "4. Agréger côté agent :",
300
- ` - **Top ${top}** : compétences les plus représentées (nb de ressources)`,
301
- " - **Rares** : compétences possédées par 1 ou 2 personnes (risque bus-factor)",
302
- " - **Saturées** : compétences possédées par > 70% de l'équipe (potentielle banalisation)",
303
- "5. Croiser avec les opportunités ouvertes via `boond_opportunities_search` (`opportunityStates` actifs, `perimeterDynamic`/`perimeterAgencies` cohérents) et leurs `tools` :",
304
- " - **Manquantes** : compétences demandées sur les opportunités mais absentes du périmètre — alerte recrutement / formation",
305
- "6. Restituer en 4 sections :",
306
- ` - Top ${top} compétences (tableau : compétence | nb ressources | exemples de noms)`,
307
- " - Compétences rares (avec porteurs nominatifs et nombre d'opportunités demandant cette compétence)",
308
- " - Compétences saturées",
309
- " - Compétences manquantes vs opportunités (recommandations recrutement / formation)",
310
- ].join("\n");
295
+ let preamble = "";
296
+ let scope;
297
+ if (agency_id) {
298
+ const r = resolveEntity(agency_id, "agency", "<AGENCY_ID>");
299
+ preamble = r.preamble;
300
+ scope = `\`perimeterAgencies: [${r.idForFilter}]\``;
301
+ }
302
+ else if (manager_id) {
303
+ const r = resolveEntity(manager_id, "resource", "<MANAGER_ID>");
304
+ preamble = r.preamble;
305
+ scope = `\`perimeterManagers: [${r.idForFilter}]\``;
306
+ }
307
+ else {
308
+ scope = "`perimeterDynamic: ['managers']`";
309
+ }
310
+ const lines = ["Cartographie les compétences techniques du périmètre.", ""];
311
+ if (preamble)
312
+ lines.push(preamble);
313
+ lines.push(`Périmètre : ${scope}.`, "", "Étapes :", "1. Lister les ressources actives via `boond_resources_search` :", ` - ${scope}`, " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource` via `boond_application_dictionary`)", " - `pageSize: 100` (paginer si > 100)", "2. Récupérer le dictionnaire `setting.tool` (et `setting.expertiseArea`, `setting.languageSpoken`) via `boond_application_dictionary` pour traduire les IDs en libellés.", "3. Pour chaque ressource (par batchs parallèles), appeler `boond_resources_technical_data` et extraire `tools`, `expertiseAreas`, `languages`, `experiences`.", "4. Agréger côté agent :", ` - **Top ${top}** : compétences les plus représentées (nb de ressources)`, " - **Rares** : compétences possédées par 1 ou 2 personnes (risque bus-factor)", " - **Saturées** : compétences possédées par > 70% de l'équipe (potentielle banalisation)", "5. Croiser avec les opportunités ouvertes via `boond_opportunities_search` (`opportunityStates` actifs, `perimeterDynamic`/`perimeterAgencies` cohérents) et leurs `tools` :", " - **Manquantes** : compétences demandées sur les opportunités mais absentes du périmètre — alerte recrutement / formation", "6. Restituer en 4 sections :", ` - Top ${top} compétences (tableau : compétence | nb ressources | exemples de noms)`, " - Compétences rares (avec porteurs nominatifs et nombre d'opportunités demandant cette compétence)", " - Compétences saturées", " - Compétences manquantes vs opportunités (recommandations recrutement / formation)");
314
+ return lines.join("\n");
311
315
  },
312
316
  },
313
317
  {
@@ -323,35 +327,30 @@ const PROMPTS = [
323
327
  manager_id: z
324
328
  .string()
325
329
  .optional()
326
- .describe("ID d'un manager pour cibler son équipe. Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
330
+ .describe("Manager pour cibler son équipe. " +
331
+ ID_OR_NAME_HINT_RESOURCE +
332
+ " Si absent, scope = mon équipe via `perimeterDynamic: ['managers']`."),
327
333
  },
328
334
  build: ({ seuil_mois, manager_id }) => {
329
335
  const seuil = seuil_mois || "12";
330
- const scope = manager_id ? `\`perimeterManagers: [${manager_id}]\`` : "`perimeterDynamic: ['managers']`";
331
- return [
336
+ let preamble = "";
337
+ let scope;
338
+ if (manager_id) {
339
+ const r = resolveEntity(manager_id, "resource", "<MANAGER_ID>");
340
+ preamble = r.preamble;
341
+ scope = `\`perimeterManagers: [${r.idForFilter}]\``;
342
+ }
343
+ else {
344
+ scope = "`perimeterDynamic: ['managers']`";
345
+ }
346
+ const lines = [
332
347
  `Identifie les CV / dossiers techniques à rafraîchir (seuil d'obsolescence : ${seuil} mois).`,
333
348
  "",
334
- `Périmètre : ${scope}.`,
335
- "",
336
- "Étapes :",
337
- "1. Lister les ressources actives via `boond_resources_search` :",
338
- ` - ${scope}`,
339
- " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource`)",
340
- " - `pageSize: 100` (paginer si nécessaire)",
341
- "2. Pour chaque ressource (par batchs parallèles), appeler `boond_resources_technical_data` et lire :",
342
- " - `updateDate` du dossier technique",
343
- " - présence et longueur du CV (`resume`)",
344
- " - nombre de compétences déclarées (`tools`)",
345
- " - nombre d'expériences renseignées",
346
- "3. Filtrer côté agent : ne conserver que les ressources dont au moins UN critère est défaillant —",
347
- ` - \`updateDate\` antérieure de plus de ${seuil} mois, OU`,
348
- " - CV manquant / vide, OU",
349
- " - moins de 3 compétences (`tools`) déclarées, OU",
350
- " - aucune expérience renseignée.",
351
- '4. Croiser avec la disponibilité pour prioriser : `boond_resources_search` avec `period: "available"` + fenêtre des 3 prochains mois, et marquer les ressources concernées comme **prioritaires**.',
352
- "5. Restituer un tableau de relance trié par priorité décroissante : ressource | manager | dernière maj DT | jours d'ancienneté | trous (CV manquant / 0 compétences / 0 expérience) | bientôt dispo (oui/non).",
353
- "6. Conclure par les 5 ressources à relancer en premier (avec template de message court à envoyer au manager).",
354
- ].join("\n");
349
+ ];
350
+ if (preamble)
351
+ lines.push(preamble);
352
+ lines.push(`Périmètre : ${scope}.`, "", "Étapes :", "1. Lister les ressources actives via `boond_resources_search` :", ` - ${scope}`, " - `resourceStates` filtrés sur les états « actif » (consulter `setting.state.resource`)", " - `pageSize: 100` (paginer si nécessaire)", "2. Pour chaque ressource (par batchs parallèles), appeler `boond_resources_technical_data` et lire :", " - `updateDate` du dossier technique", " - présence et longueur du CV (`resume`)", " - nombre de compétences déclarées (`tools`)", " - nombre d'expériences renseignées", "3. Filtrer côté agent : ne conserver que les ressources dont au moins UN critère est défaillant —", ` - \`updateDate\` antérieure de plus de ${seuil} mois, OU`, " - CV manquant / vide, OU", " - moins de 3 compétences (`tools`) déclarées, OU", " - aucune expérience renseignée.", '4. Croiser avec la disponibilité pour prioriser : `boond_resources_search` avec `period: "available"` + fenêtre des 3 prochains mois, et marquer les ressources concernées comme **prioritaires**.', "5. Restituer un tableau de relance trié par priorité décroissante : ressource | manager | dernière maj DT | jours d'ancienneté | trous (CV manquant / 0 compétences / 0 expérience) | bientôt dispo (oui/non).", "6. Conclure par les 5 ressources à relancer en premier (avec template de message court à envoyer au manager).");
353
+ return lines.join("\n");
355
354
  },
356
355
  },
357
356
  {
@@ -378,48 +377,38 @@ const PROMPTS = [
378
377
  manager_id: z
379
378
  .string()
380
379
  .optional()
381
- .describe("ID d'un manager pour restreindre le scope ressources internes. Sinon scope ouvert (toute l'organisation accessible)."),
380
+ .describe("Manager pour restreindre le scope ressources internes. " +
381
+ ID_OR_NAME_HINT_RESOURCE +
382
+ " Sinon scope ouvert (toute l'organisation accessible)."),
382
383
  },
383
384
  build: ({ competences, experience_min, dispo_avant, inclure_candidats, manager_id }) => {
384
385
  const includeCandidates = (inclure_candidats || "oui").toLowerCase() !== "non";
385
- const scope = manager_id
386
- ? `\`perimeterManagers: [${manager_id}]\``
387
- : "(pas de filtre périmètre — recherche sur l'ensemble accessible à l'utilisateur)";
386
+ let preamble = "";
387
+ let scope;
388
+ let scopeFilter;
389
+ if (manager_id) {
390
+ const r = resolveEntity(manager_id, "resource", "<MANAGER_ID>");
391
+ preamble = r.preamble;
392
+ scopeFilter = `\`perimeterManagers: [${r.idForFilter}]\``;
393
+ scope = scopeFilter;
394
+ }
395
+ else {
396
+ scope = "(pas de filtre périmètre — recherche sur l'ensemble accessible à l'utilisateur)";
397
+ scopeFilter = "";
398
+ }
388
399
  const dispoLine = dispo_avant
389
400
  ? ` - \`period: "available"\`, \`endDate: "${dispo_avant}"\` (disponible au plus tard à cette date)`
390
401
  : "";
391
402
  const expStep = experience_min
392
403
  ? `2bis. Mapper l'expérience minimum « ${experience_min} » vers les IDs \`experiences\` via \`boond_application_dictionary\` avec \`setting.experience\`.`
393
404
  : "";
394
- return [
395
- `Recherche un profil correspondant aux compétences : « ${competences} ».`,
396
- "",
397
- `Scope ressources internes : ${scope}.`,
398
- `Inclure les candidats actifs : ${includeCandidates ? "oui" : "non"}.`,
399
- "",
400
- "Étapes :",
401
- "1. Mapper les compétences libres vers leurs IDs :",
402
- " - `boond_application_dictionary` avec `setting.tool` pour les outils / technos",
403
- " - `boond_application_dictionary` avec `setting.expertiseArea` pour les domaines d'expertise",
404
- "2. Identifier les compétences indispensables (toutes requises) vs souhaitables, à partir du libellé du besoin.",
405
- expStep,
406
- "3. Recherche dans les ressources internes via `boond_resources_search` :",
407
- ' - `tools: [...]` (si plusieurs compétences indispensables, préfixer par `"#AND#"` pour exiger toutes ; sinon laisser en OU)',
408
- " - `expertiseAreas: [...]` éventuellement",
409
- experience_min ? " - `experiences: [...]` issus de l'étape 2bis" : "",
410
- dispoLine,
411
- manager_id ? ` - ${scope}` : "",
412
- " - `resourceStates` actifs uniquement (consulter `setting.state.resource`)",
413
- " - `pageSize: 30`",
414
- includeCandidates
415
- ? "4. En parallèle, recherche dans les candidats via `boond_candidates_search` avec les mêmes filtres + `candidateStates` actifs (consulter `setting.state.candidate`)."
416
- : "4. (Skip — recherche limitée aux ressources internes.)",
417
- "5. Pour les top 10 résultats combinés, récupérer `technical_data` (`boond_resources_technical_data` ou `boond_candidates_technical_data`) pour vérifier l'adéquation fine.",
418
- "6. Restituer un classement unique : type (Ressource interne / Candidat) | nom | titre | compétences matchées | expérience | dispo | localisation/mobilité | note d'adéquation /10 (1 ligne de justification).",
419
- "7. Si moins de 5 résultats : suggérer un assouplissement (retirer une compétence secondaire, élargir le périmètre géographique, accepter un junior, sous-traitance).",
420
- ]
421
- .filter(Boolean)
422
- .join("\n");
405
+ const lines = [`Recherche un profil correspondant aux compétences : « ${competences} ».`, ""];
406
+ if (preamble)
407
+ lines.push(preamble);
408
+ lines.push(`Scope ressources internes : ${scope}.`, `Inclure les candidats actifs : ${includeCandidates ? "oui" : "non"}.`, "", "Étapes :", "1. Mapper les compétences libres vers leurs IDs :", " - `boond_application_dictionary` avec `setting.tool` pour les outils / technos", " - `boond_application_dictionary` avec `setting.expertiseArea` pour les domaines d'expertise", "2. Identifier les compétences indispensables (toutes requises) vs souhaitables, à partir du libellé du besoin.", expStep, "3. Recherche dans les ressources internes via `boond_resources_search` :", ' - `tools: [...]` (si plusieurs compétences indispensables, préfixer par `"#AND#"` pour exiger toutes ; sinon laisser en OU)', " - `expertiseAreas: [...]` éventuellement", experience_min ? " - `experiences: [...]` issus de l'étape 2bis" : "", dispoLine, scopeFilter ? ` - ${scopeFilter}` : "", " - `resourceStates` actifs uniquement (consulter `setting.state.resource`)", " - `pageSize: 30`", includeCandidates
409
+ ? "4. En parallèle, recherche dans les candidats via `boond_candidates_search` avec les mêmes filtres + `candidateStates` actifs (consulter `setting.state.candidate`)."
410
+ : "4. (Skip — recherche limitée aux ressources internes.)", "5. Pour les top 10 résultats combinés, récupérer `technical_data` (`boond_resources_technical_data` ou `boond_candidates_technical_data`) pour vérifier l'adéquation fine.", "6. Restituer un classement unique : type (Ressource interne / Candidat) | nom | titre | compétences matchées | expérience | dispo | localisation/mobilité | note d'adéquation /10 (1 ligne de justification).", "7. Si moins de 5 résultats : suggérer un assouplissement (retirer une compétence secondaire, élargir le périmètre géographique, accepter un junior, sous-traitance).");
411
+ return lines.filter(Boolean).join("\n");
423
412
  },
424
413
  },
425
414
  {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsEzE,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB;;;;GAOhC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsD5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwKzE,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB;;;;GAOhC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2D5D"}
@@ -1,32 +1,129 @@
1
1
  import { apiRequest } from "../services/boond-client.js";
2
+ import { getDictionary, resolveDictionaryPath } from "../services/dictionary.js";
2
3
  /**
3
- * Well-known Boond dictionaries surfaced as static MCP resources. We keep
4
- * this list deliberately curated — better to expose the dozen the search
5
- * tools actually depend on than the hundreds of obscure config dicts.
4
+ * Curated dictionaries surfaced as static MCP resources. Slugs follow the
5
+ * historical "kind/entity" naming for backward compatibility with client URIs;
6
+ * the API path mapping reflects the actual BoondManager `/application/dictionary`
7
+ * response structure (cf. `data.setting.*`, `data.country`, `data.languages`).
8
+ *
9
+ * Slugs that do not map to a real path in the API (e.g. `states/absences`,
10
+ * `typeOf/candidates`) are intentionally absent.
6
11
  */
7
12
  const DICTIONARIES = [
8
13
  // states/* — used to translate the integer `state` attribute on entities
9
- { slug: "states/resources", title: "États ressources", description: "Libellés des états de ressource (collaborateur)." },
10
- { slug: "states/candidates", title: "États candidats", description: "Libellés des états de candidat." },
11
- { slug: "states/contacts", title: "États contacts", description: "Libellés des états de contact." },
12
- { slug: "states/companies", title: "États sociétés", description: "Libellés des états de société." },
13
- { slug: "states/opportunities", title: "États opportunités", description: "Libellés des états d'opportunité commerciale." },
14
- { slug: "states/projects", title: "États projets", description: "Libellés des états de projet/mission." },
15
- { slug: "states/invoices", title: "États factures", description: "Libellés des états de facture client." },
16
- { slug: "states/orders", title: "États bons de commande", description: "Libellés des états de bon de commande." },
17
- { slug: "states/positionings", title: "États positionnements", description: "Libellés des états de positionnement." },
18
- { slug: "states/absences", title: "États absences", description: "Libellés des états des demandes d'absence." },
14
+ {
15
+ slug: "states/resources",
16
+ path: "setting.state.resource",
17
+ title: "États ressources",
18
+ description: "Libellés des états de ressource (collaborateur).",
19
+ },
20
+ {
21
+ slug: "states/candidates",
22
+ path: "setting.state.candidate",
23
+ title: "États candidats",
24
+ description: "Libellés des états de candidat.",
25
+ },
26
+ {
27
+ slug: "states/contacts",
28
+ path: "setting.state.contact",
29
+ title: "États contacts",
30
+ description: "Libellés des états de contact.",
31
+ },
32
+ {
33
+ slug: "states/companies",
34
+ path: "setting.state.company",
35
+ title: "États sociétés",
36
+ description: "Libellés des états de société.",
37
+ },
38
+ {
39
+ slug: "states/opportunities",
40
+ path: "setting.state.opportunity",
41
+ title: "États opportunités",
42
+ description: "Libellés des états d'opportunité commerciale.",
43
+ },
44
+ {
45
+ slug: "states/projects",
46
+ path: "setting.state.project",
47
+ title: "États projets",
48
+ description: "Libellés des états de projet/mission.",
49
+ },
50
+ {
51
+ slug: "states/invoices",
52
+ path: "setting.state.invoice",
53
+ title: "États factures",
54
+ description: "Libellés des états de facture client.",
55
+ },
56
+ {
57
+ slug: "states/orders",
58
+ path: "setting.state.order",
59
+ title: "États bons de commande",
60
+ description: "Libellés des états de bon de commande.",
61
+ },
62
+ {
63
+ slug: "states/positionings",
64
+ path: "setting.state.positioning",
65
+ title: "États positionnements",
66
+ description: "Libellés des états de positionnement.",
67
+ },
19
68
  // typeOf/* — used to translate the integer `typeOf` attribute on entities
20
- { slug: "typeOf/resources", title: "Types ressources", description: "Types de ressource (interne, sous-traitant, freelance...)." },
21
- { slug: "typeOf/candidates", title: "Types candidats", description: "Types de candidat." },
22
- { slug: "typeOf/contacts", title: "Types contacts", description: "Types de contact." },
23
- { slug: "typeOf/projects", title: "Types projets", description: "Types de projet (régie, forfait, produit...)." },
24
- { slug: "typeOf/actions", title: "Types actions", description: "Types d'action (appel, email, RDV, note...)." },
25
- { slug: "typeOf/absences", title: "Types absences", description: "Types d'absence (CP, RTT, maladie, sans solde...)." },
69
+ {
70
+ slug: "typeOf/resources",
71
+ path: "setting.typeOf.resource",
72
+ title: "Types ressources",
73
+ description: "Types de ressource (interne, sous-traitant, freelance...).",
74
+ },
75
+ {
76
+ slug: "typeOf/contacts",
77
+ path: "setting.typeOf.contact",
78
+ title: "Types contacts",
79
+ description: "Types de contact.",
80
+ },
81
+ {
82
+ slug: "typeOf/projects",
83
+ path: "setting.typeOf.project",
84
+ title: "Types projets",
85
+ description: "Types de projet (régie, forfait, produit...).",
86
+ },
87
+ // Skills / referential
88
+ {
89
+ slug: "tools",
90
+ path: "setting.tool",
91
+ title: "Outils / Technos",
92
+ description: "Catalogue des outils et technologies utilisables sur les ressources et candidats (Java, AWS, ...).",
93
+ },
94
+ {
95
+ slug: "expertiseAreas",
96
+ path: "setting.expertiseArea",
97
+ title: "Domaines d'expertise",
98
+ description: "Domaines d'expertise métier (DevOps, Data, Frontend, ...).",
99
+ },
100
+ {
101
+ slug: "experiences",
102
+ path: "setting.experience",
103
+ title: "Niveaux d'expérience",
104
+ description: "Niveaux d'expérience (junior, confirmé, senior, ...).",
105
+ },
106
+ {
107
+ slug: "activityAreas",
108
+ path: "setting.activityArea",
109
+ title: "Secteurs d'activité",
110
+ description: "Secteurs d'activité des sociétés clientes.",
111
+ },
112
+ {
113
+ slug: "mobilityAreas",
114
+ path: "setting.mobilityArea",
115
+ title: "Mobilités",
116
+ description: "Zones de mobilité géographique.",
117
+ },
26
118
  // Global lookups
27
- { slug: "countries", title: "Pays", description: "Liste des pays (codes ISO + libellés)." },
28
- { slug: "currencies", title: "Devises", description: "Liste des devises supportées." },
29
- { slug: "languages", title: "Langues", description: "Liste des langues parlées." },
119
+ { slug: "countries", path: "country", title: "Pays", description: "Liste des pays (codes ISO + libellés)." },
120
+ { slug: "currencies", path: "setting.currency", title: "Devises", description: "Liste des devises supportées." },
121
+ {
122
+ slug: "languages",
123
+ path: "languages",
124
+ title: "Langues",
125
+ description: "Langues d'interface BoondManager (fr, en, es).",
126
+ },
30
127
  ];
31
128
  /** URI prefix under which all dictionaries are exposed. */
32
129
  const DICTIONARY_URI_PREFIX = "boond://dictionary/";
@@ -52,15 +149,19 @@ export function registerAllResources(server) {
52
149
  description: dict.description,
53
150
  mimeType: "application/json",
54
151
  }, async () => {
55
- // Mirror the path used by the boond_application_dictionary tool so
56
- // both read paths stay in sync if the upstream API moves.
57
- const response = await apiRequest(`/application/dictionaries/${dict.slug}`);
152
+ const { payload } = await getDictionary();
153
+ const node = resolveDictionaryPath(payload, dict.path);
154
+ const body = node === undefined
155
+ ? {
156
+ error: `Path "${dict.path}" not found in BoondManager dictionary. The upstream API may have changed — please open an issue.`,
157
+ }
158
+ : node;
58
159
  return {
59
160
  contents: [
60
161
  {
61
162
  uri,
62
163
  mimeType: "application/json",
63
- text: JSON.stringify(response, null, 2),
164
+ text: JSON.stringify(body, null, 2),
64
165
  },
65
166
  ],
66
167
  };
@@ -71,8 +172,8 @@ export function registerAllResources(server) {
71
172
  // full /application/current-user payload.
72
173
  server.registerResource("application/current-user", CURRENT_USER_URI, {
73
174
  title: "Utilisateur courant",
74
- description: "Profil de l'utilisateur authentifié auprès de l'API BoondManager (id, agence, permissions). "
75
- + "Utile pour résoudre 'mon ID' avant un appel filtré par perimeterManagers.",
175
+ description: "Profil de l'utilisateur authentifié auprès de l'API BoondManager (id, agence, permissions). " +
176
+ "Utile pour résoudre 'mon ID' avant un appel filtré par perimeterManagers.",
76
177
  mimeType: "application/json",
77
178
  }, async () => {
78
179
  const response = await apiRequest("/application/current-user");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { JsonApiResponse } from "../types.js";
2
+ /**
3
+ * Cache du dictionnaire BoondManager.
4
+ *
5
+ * L'API BoondManager expose **un seul endpoint** `GET /application/dictionary`
6
+ * qui retourne l'intégralité des dictionnaires (états, types, pays, devises,
7
+ * langues, outils, expertises, …) en une seule réponse JSON. La structure
8
+ * pertinente pour les outils du serveur est `data.setting.*` et
9
+ * `data.{country,languages}` (cf. RAML `schemas/application/dictionary.json`).
10
+ *
11
+ * Sans cache, chaque lecture de ressource ou appel à `boond_application_dictionary`
12
+ * forcerait un appel HTTP de plusieurs centaines de Ko, alors que le contenu
13
+ * change rarement (libellés d'états, types métier, …). On cache donc en mémoire
14
+ * pour la durée du process, avec un TTL configurable.
15
+ *
16
+ * Concurrent fetches sont dédupliqués via une promesse partagée pour éviter
17
+ * de marteler l'API quand plusieurs ressources sont lues en parallèle au
18
+ * démarrage d'une session MCP.
19
+ */
20
+ export type DictionaryLanguage = "fr" | "en" | "es";
21
+ interface CacheEntry {
22
+ payload: JsonApiResponse;
23
+ fetchedAt: number;
24
+ language: DictionaryLanguage;
25
+ }
26
+ export interface GetDictionaryOptions {
27
+ language?: DictionaryLanguage;
28
+ /** Bypass the cache and re-fetch. */
29
+ force?: boolean;
30
+ }
31
+ /**
32
+ * Returns the full BoondManager dictionary payload, fetching once per TTL.
33
+ * Concurrent calls share the same in-flight request.
34
+ */
35
+ export declare function getDictionary(opts?: GetDictionaryOptions): Promise<CacheEntry>;
36
+ /**
37
+ * Resolves a dotted path inside the dictionary `data` object.
38
+ *
39
+ * Examples:
40
+ * "setting.state.resource" → array of resource states
41
+ * "setting.tool" → array of tools / technos
42
+ * "country" → array of countries
43
+ * "languages" → array of UI languages
44
+ * "setting.state.resource[0]" → not supported (no bracket notation; pass plain dotted path)
45
+ *
46
+ * Returns `undefined` if any segment is missing.
47
+ */
48
+ export declare function resolveDictionaryPath(payload: JsonApiResponse, path: string): unknown;
49
+ /** Reset the cache. Exposed for tests. */
50
+ export declare function resetDictionaryCacheForTests(): void;
51
+ export {};
52
+ //# sourceMappingURL=dictionary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionary.d.ts","sourceRoot":"","sources":["../../src/services/dictionary.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,UAAU,UAAU;IAClB,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAcD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,UAAU,CAAC,CAuBxF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAcrF;AAED,0CAA0C;AAC1C,wBAAgB,4BAA4B,IAAI,IAAI,CAGnD"}
@@ -0,0 +1,73 @@
1
+ import { apiRequest } from "./boond-client.js";
2
+ const DEFAULT_TTL_MS = 60 * 60 * 1000; // 1 hour
3
+ function resolveTtlMs() {
4
+ const raw = process.env["BOOND_DICTIONARY_TTL_MS"];
5
+ if (!raw)
6
+ return DEFAULT_TTL_MS;
7
+ const n = Number(raw);
8
+ return Number.isFinite(n) && n > 0 ? n : DEFAULT_TTL_MS;
9
+ }
10
+ let cache = null;
11
+ let inFlight = null;
12
+ /**
13
+ * Returns the full BoondManager dictionary payload, fetching once per TTL.
14
+ * Concurrent calls share the same in-flight request.
15
+ */
16
+ export async function getDictionary(opts = {}) {
17
+ const language = opts.language ?? "fr";
18
+ const now = Date.now();
19
+ if (!opts.force && cache !== null && cache.language === language && now - cache.fetchedAt < resolveTtlMs()) {
20
+ return cache;
21
+ }
22
+ if (inFlight)
23
+ return inFlight;
24
+ inFlight = (async () => {
25
+ try {
26
+ const payload = await apiRequest("/application/dictionary", "GET", undefined, {
27
+ language,
28
+ });
29
+ cache = { payload, fetchedAt: Date.now(), language };
30
+ return cache;
31
+ }
32
+ finally {
33
+ inFlight = null;
34
+ }
35
+ })();
36
+ return inFlight;
37
+ }
38
+ /**
39
+ * Resolves a dotted path inside the dictionary `data` object.
40
+ *
41
+ * Examples:
42
+ * "setting.state.resource" → array of resource states
43
+ * "setting.tool" → array of tools / technos
44
+ * "country" → array of countries
45
+ * "languages" → array of UI languages
46
+ * "setting.state.resource[0]" → not supported (no bracket notation; pass plain dotted path)
47
+ *
48
+ * Returns `undefined` if any segment is missing.
49
+ */
50
+ export function resolveDictionaryPath(payload, path) {
51
+ const trimmed = path.trim();
52
+ if (!trimmed)
53
+ return undefined;
54
+ const parts = trimmed.split(".");
55
+ // The dictionary payload is `{ meta, data: { setting, country, languages, ... } }`.
56
+ // We always look under `data` so callers don't have to repeat it.
57
+ const root = payload.data;
58
+ let node = root ?? payload;
59
+ for (const part of parts) {
60
+ if (node === null || typeof node !== "object")
61
+ return undefined;
62
+ node = node[part];
63
+ if (node === undefined)
64
+ return undefined;
65
+ }
66
+ return node;
67
+ }
68
+ /** Reset the cache. Exposed for tests. */
69
+ export function resetDictionaryCacheForTests() {
70
+ cache = null;
71
+ inFlight = null;
72
+ }
73
+ //# sourceMappingURL=dictionary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dictionary.js","sourceRoot":"","sources":["../../src/services/dictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA8B/C,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAEhD,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,cAAc,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;AAC1D,CAAC;AAED,IAAI,KAAK,GAAsB,IAAI,CAAC;AACpC,IAAI,QAAQ,GAA+B,IAAI,CAAC;AAQhD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA6B,EAAE;IACjE,MAAM,QAAQ,GAAuB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,YAAY,EAAE,EAAE,CAAC;QAC3G,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,yBAAyB,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC5E,QAAQ;aACT,CAAC,CAAC;YACH,KAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAwB,EAAE,IAAY;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,oFAAoF;IACpF,kEAAkE;IAClE,MAAM,IAAI,GAAI,OAAyC,CAAC,IAAI,CAAC;IAC7D,IAAI,IAAI,GAAY,IAAI,IAAI,OAAO,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChE,IAAI,GAAI,IAAgC,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,4BAA4B;IAC1C,KAAK,GAAG,IAAI,CAAC;IACb,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/tools/application.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiEhE"}
1
+ {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/tools/application.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiFhE"}
@@ -1,27 +1,41 @@
1
1
  import { DictionaryGetSchema } from "../schemas/index.js";
2
+ import { CHARACTER_LIMIT } from "../constants.js";
2
3
  import { apiRequest, formatDetailResponse } from "../services/boond-client.js";
4
+ import { getDictionary, resolveDictionaryPath } from "../services/dictionary.js";
5
+ function formatDictionaryNode(node) {
6
+ const text = JSON.stringify(node, null, 2);
7
+ if (text.length > CHARACTER_LIMIT) {
8
+ return text.substring(0, CHARACTER_LIMIT) + "\n\n[Résultat tronqué...]";
9
+ }
10
+ return text;
11
+ }
3
12
  export function registerApplicationTools(server) {
4
13
  // Get dictionary
5
14
  server.registerTool("boond_application_dictionary", {
6
15
  title: "Récupérer un dictionnaire BoondManager",
7
- description: `Récupère un dictionnaire de référence de l'application BoondManager (types d'actions, types d'absences, états des entités, pays, devises, langues...).
16
+ description: `Récupère un dictionnaire de référence BoondManager (états, types, pays, devises, langues, outils, expertises, ...).
17
+
18
+ L'API expose un seul endpoint \`/application/dictionary\` qui renvoie tout — le serveur le cache (TTL 1h, configurable via \`BOOND_DICTIONARY_TTL_MS\`) et extrait un sous-arbre par chemin dotté.
8
19
 
9
20
  Args:
10
- - dictionaryType (string): Type de dictionnaire. Exemples :
11
- - "typeOf/actions" : types d'actions
12
- - "typeOf/absences" : types d'absences
13
- - "typeOf/expenses" : types de frais
14
- - "states/candidates" : états des candidats
15
- - "states/resources" : états des ressources
16
- - "states/opportunities" : états des opportunités
17
- - "states/projects" : états des projets
18
- - "states/invoices" : états des factures
19
- - "states/orders" : états des bons de commande
20
- - "countries" : liste des pays
21
- - "currencies" : liste des devises
22
- - "languages" : liste des langues
21
+ - dictionaryType (string): Chemin dans la réponse (relatif à \`data\`). Exemples :
22
+ - "setting.state.{resource,candidate,contact,company,opportunity,project,invoice,order,positioning}" → états par entité
23
+ - "setting.typeOf.{resource,contact,project}" → types par entité
24
+ - "setting.action.{candidate,resource,opportunity,project,...}" → actions disponibles
25
+ - "setting.tool" → outils / technos (Java, AWS...)
26
+ - "setting.expertiseArea" → domaines d'expertise
27
+ - "setting.experience" → niveaux d'expérience
28
+ - "setting.languageSpoken" → langues parlées
29
+ - "setting.activityArea" → secteurs d'activité
30
+ - "setting.mobilityArea" → mobilités géographiques
31
+ - "setting.currency" → devises
32
+ - "setting.civility" → civilités
33
+ - "country" → pays
34
+ - "languages" → langues d'interface (fr, en, es)
35
+
36
+ Note : l'ancienne forme "states/resources" (slash) n'est pas valide — utilisez "setting.state.resource".
23
37
 
24
- Returns: Données du dictionnaire (clé/valeur).`,
38
+ Retourne le sous-arbre (souvent un tableau \`{id, value, ...}\`) ou \`isError: true\` si le chemin est introuvable.`,
25
39
  inputSchema: DictionaryGetSchema,
26
40
  annotations: {
27
41
  readOnlyHint: true,
@@ -30,10 +44,21 @@ Returns: Données du dictionnaire (clé/valeur).`,
30
44
  openWorldHint: false,
31
45
  },
32
46
  }, async (params) => {
33
- const response = await apiRequest(`/application/dictionaries/${params.dictionaryType}`);
34
- const text = formatDetailResponse(response);
47
+ const { payload } = await getDictionary();
48
+ const node = resolveDictionaryPath(payload, params.dictionaryType);
49
+ if (node === undefined) {
50
+ return {
51
+ content: [
52
+ {
53
+ type: "text",
54
+ text: `Chemin "${params.dictionaryType}" introuvable dans le dictionnaire BoondManager. Les chemins sont relatifs à \`data\` (ex: "setting.state.resource", "country"). Note: "states/resources" (slash) n'est pas un chemin valide ; utilisez "setting.state.resource".`,
55
+ },
56
+ ],
57
+ isError: true,
58
+ };
59
+ }
35
60
  return {
36
- content: [{ type: "text", text }],
61
+ content: [{ type: "text", text: formatDictionaryNode(node) }],
37
62
  };
38
63
  });
39
64
  // Get current user / application info
@@ -1 +1 @@
1
- {"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/tools/application.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAE/E,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,iBAAiB;IACjB,MAAM,CAAC,YAAY,CACjB,8BAA8B,EAC9B;QACE,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EAAE;;;;;;;;;;;;;;;;;+CAiB4B;QACzC,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAA0B,EAAE,EAAE;QACnC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,6BAA6B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QACxF,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sCAAsC;IACtC,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,kCAAkC;QACzC,WAAW,EAAE;;gDAE6B;QAC1C,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,2BAA2B,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/tools/application.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEjF,SAAS,oBAAoB,CAAC,IAAa;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,eAAe,CAAC,GAAG,2BAA2B,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,iBAAiB;IACjB,MAAM,CAAC,YAAY,CACjB,8BAA8B,EAC9B;QACE,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;oHAsBiG;QAC9G,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAA0B,EAAE,EAAE;QACnC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;QACnE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,WAAW,MAAM,CAAC,cAAc,mOAAmO;qBAC1Q;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;SACvE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sCAAsC;IACtC,MAAM,CAAC,YAAY,CACjB,gCAAgC,EAChC;QACE,KAAK,EAAE,kCAAkC;QACzC,WAAW,EAAE;;gDAE6B;QAC1C,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,2BAA2B,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
package/manifest.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "manifest_version": "0.3",
3
3
  "name": "boondmanager-mcp-server",
4
4
  "display_name": "BoondManager MCP Server",
5
- "version": "1.7.1",
6
- "description": "MCP Server for BoondManager API - 156 tools, 11 prompts, 20 resources (ERP/CRM)",
5
+ "version": "1.7.3",
6
+ "description": "MCP Server for BoondManager API - 156 tools, 11 prompts, 21 resources (ERP/CRM)",
7
7
  "author": {
8
8
  "name": "Frédéric Auguste",
9
9
  "url": "https://github.com/fauguste/boondmanager-mcp-server"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "boondmanager-mcp-server",
3
- "version": "1.7.1",
4
- "description": "MCP Server for BoondManager API - 156 tools, 11 prompts, 20 resources (ERP/CRM)",
3
+ "version": "1.7.3",
4
+ "description": "MCP Server for BoondManager API - 156 tools, 11 prompts, 21 resources (ERP/CRM)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "module",