boondmanager-mcp-server 2.16.0 → 2.18.0

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.
Files changed (285) hide show
  1. package/README.md +57 -4
  2. package/dist/config/access-policy.d.ts.map +1 -1
  3. package/dist/config/access-policy.js +6 -18
  4. package/dist/config/access-policy.js.map +1 -1
  5. package/dist/config/dictionary-overrides.d.ts.map +1 -1
  6. package/dist/config/dictionary-overrides.js +2 -12
  7. package/dist/config/dictionary-overrides.js.map +1 -1
  8. package/dist/config/env.d.ts +63 -0
  9. package/dist/config/env.d.ts.map +1 -0
  10. package/dist/config/env.js +116 -0
  11. package/dist/config/env.js.map +1 -0
  12. package/dist/config/profiles.d.ts +22 -8
  13. package/dist/config/profiles.d.ts.map +1 -1
  14. package/dist/config/profiles.js +48 -4
  15. package/dist/config/profiles.js.map +1 -1
  16. package/dist/config/transport-kind.d.ts +8 -0
  17. package/dist/config/transport-kind.d.ts.map +1 -0
  18. package/dist/config/transport-kind.js +13 -0
  19. package/dist/config/transport-kind.js.map +1 -0
  20. package/dist/constants.d.ts +20 -2
  21. package/dist/constants.d.ts.map +1 -1
  22. package/dist/constants.js +32 -1
  23. package/dist/constants.js.map +1 -1
  24. package/dist/icons.d.ts.map +1 -1
  25. package/dist/icons.js +6 -1
  26. package/dist/icons.js.map +1 -1
  27. package/dist/index.js +32 -20
  28. package/dist/index.js.map +1 -1
  29. package/dist/instructions.d.ts +1 -1
  30. package/dist/instructions.d.ts.map +1 -1
  31. package/dist/instructions.js +6 -6
  32. package/dist/instructions.js.map +1 -1
  33. package/dist/prompts/index.d.ts +19 -1
  34. package/dist/prompts/index.d.ts.map +1 -1
  35. package/dist/prompts/index.js +495 -25
  36. package/dist/prompts/index.js.map +1 -1
  37. package/dist/prompts/periods.d.ts +45 -0
  38. package/dist/prompts/periods.d.ts.map +1 -0
  39. package/dist/prompts/periods.js +154 -0
  40. package/dist/prompts/periods.js.map +1 -0
  41. package/dist/resources/index.d.ts +14 -0
  42. package/dist/resources/index.d.ts.map +1 -1
  43. package/dist/resources/index.js +285 -0
  44. package/dist/resources/index.js.map +1 -1
  45. package/dist/resources/templates.d.ts +1 -1
  46. package/dist/resources/templates.d.ts.map +1 -1
  47. package/dist/resources/templates.js +2 -0
  48. package/dist/resources/templates.js.map +1 -1
  49. package/dist/schema-dialect.js.map +1 -1
  50. package/dist/schemas/filter-aliases.d.ts +1 -1
  51. package/dist/schemas/filter-aliases.d.ts.map +1 -1
  52. package/dist/schemas/filter-aliases.js +101 -2
  53. package/dist/schemas/filter-aliases.js.map +1 -1
  54. package/dist/schemas/index.d.ts +1045 -163
  55. package/dist/schemas/index.d.ts.map +1 -1
  56. package/dist/schemas/index.js +979 -330
  57. package/dist/schemas/index.js.map +1 -1
  58. package/dist/server.d.ts.map +1 -1
  59. package/dist/server.js +10 -3
  60. package/dist/server.js.map +1 -1
  61. package/dist/services/boond-client.d.ts +29 -213
  62. package/dist/services/boond-client.d.ts.map +1 -1
  63. package/dist/services/boond-client.js +29 -1168
  64. package/dist/services/boond-client.js.map +1 -1
  65. package/dist/services/dictionary.d.ts +27 -3
  66. package/dist/services/dictionary.d.ts.map +1 -1
  67. package/dist/services/dictionary.js +60 -23
  68. package/dist/services/dictionary.js.map +1 -1
  69. package/dist/services/document-text.d.ts +32 -0
  70. package/dist/services/document-text.d.ts.map +1 -0
  71. package/dist/services/document-text.js +120 -0
  72. package/dist/services/document-text.js.map +1 -0
  73. package/dist/services/format/detail.d.ts +16 -0
  74. package/dist/services/format/detail.d.ts.map +1 -0
  75. package/dist/services/format/detail.js +36 -0
  76. package/dist/services/format/detail.js.map +1 -0
  77. package/dist/services/format/html.d.ts +19 -0
  78. package/dist/services/format/html.d.ts.map +1 -0
  79. package/dist/services/format/html.js +87 -0
  80. package/dist/services/format/html.js.map +1 -0
  81. package/dist/services/format/list.d.ts +3 -0
  82. package/dist/services/format/list.d.ts.map +1 -0
  83. package/dist/services/format/list.js +44 -0
  84. package/dist/services/format/list.js.map +1 -0
  85. package/dist/services/format/summary.d.ts +23 -0
  86. package/dist/services/format/summary.d.ts.map +1 -0
  87. package/dist/services/format/summary.js +194 -0
  88. package/dist/services/format/summary.js.map +1 -0
  89. package/dist/services/format/tab.d.ts +9 -0
  90. package/dist/services/format/tab.d.ts.map +1 -0
  91. package/dist/services/format/tab.js +32 -0
  92. package/dist/services/format/tab.js.map +1 -0
  93. package/dist/services/http/auth.d.ts +44 -0
  94. package/dist/services/http/auth.d.ts.map +1 -0
  95. package/dist/services/http/auth.js +146 -0
  96. package/dist/services/http/auth.js.map +1 -0
  97. package/dist/services/http/download.d.ts +60 -0
  98. package/dist/services/http/download.d.ts.map +1 -0
  99. package/dist/services/http/download.js +160 -0
  100. package/dist/services/http/download.js.map +1 -0
  101. package/dist/services/http/errors.d.ts +45 -0
  102. package/dist/services/http/errors.d.ts.map +1 -0
  103. package/dist/services/http/errors.js +188 -0
  104. package/dist/services/http/errors.js.map +1 -0
  105. package/dist/services/http/rate-limit.d.ts +40 -0
  106. package/dist/services/http/rate-limit.d.ts.map +1 -0
  107. package/dist/services/http/rate-limit.js +92 -0
  108. package/dist/services/http/rate-limit.js.map +1 -0
  109. package/dist/services/http/retry.d.ts +46 -0
  110. package/dist/services/http/retry.d.ts.map +1 -0
  111. package/dist/services/http/retry.js +101 -0
  112. package/dist/services/http/retry.js.map +1 -0
  113. package/dist/services/http/transport.d.ts +85 -0
  114. package/dist/services/http/transport.d.ts.map +1 -0
  115. package/dist/services/http/transport.js +283 -0
  116. package/dist/services/http/transport.js.map +1 -0
  117. package/dist/services/logger.d.ts +53 -2
  118. package/dist/services/logger.d.ts.map +1 -1
  119. package/dist/services/logger.js +82 -21
  120. package/dist/services/logger.js.map +1 -1
  121. package/dist/services/oauth.d.ts +12 -0
  122. package/dist/services/oauth.d.ts.map +1 -1
  123. package/dist/services/oauth.js +21 -8
  124. package/dist/services/oauth.js.map +1 -1
  125. package/dist/services/rate-limiter.d.ts +9 -2
  126. package/dist/services/rate-limiter.d.ts.map +1 -1
  127. package/dist/services/rate-limiter.js +18 -6
  128. package/dist/services/rate-limiter.js.map +1 -1
  129. package/dist/services/request-context.d.ts +47 -0
  130. package/dist/services/request-context.d.ts.map +1 -0
  131. package/dist/services/request-context.js +112 -0
  132. package/dist/services/request-context.js.map +1 -0
  133. package/dist/services/search.d.ts +26 -0
  134. package/dist/services/search.d.ts.map +1 -0
  135. package/dist/services/search.js +98 -0
  136. package/dist/services/search.js.map +1 -0
  137. package/dist/services/update-checker.d.ts.map +1 -1
  138. package/dist/services/update-checker.js +15 -8
  139. package/dist/services/update-checker.js.map +1 -1
  140. package/dist/services/upload-source.d.ts +31 -0
  141. package/dist/services/upload-source.d.ts.map +1 -0
  142. package/dist/services/upload-source.js +180 -0
  143. package/dist/services/upload-source.js.map +1 -0
  144. package/dist/tools/absences.d.ts +9 -0
  145. package/dist/tools/absences.d.ts.map +1 -1
  146. package/dist/tools/absences.js +65 -20
  147. package/dist/tools/absences.js.map +1 -1
  148. package/dist/tools/actions.d.ts.map +1 -1
  149. package/dist/tools/actions.js +11 -27
  150. package/dist/tools/actions.js.map +1 -1
  151. package/dist/tools/advantages.d.ts +2 -0
  152. package/dist/tools/advantages.d.ts.map +1 -1
  153. package/dist/tools/advantages.js +66 -13
  154. package/dist/tools/advantages.js.map +1 -1
  155. package/dist/tools/alerts.d.ts +18 -0
  156. package/dist/tools/alerts.d.ts.map +1 -0
  157. package/dist/tools/alerts.js +82 -0
  158. package/dist/tools/alerts.js.map +1 -0
  159. package/dist/tools/application.d.ts +2 -1
  160. package/dist/tools/application.d.ts.map +1 -1
  161. package/dist/tools/application.js +9 -3
  162. package/dist/tools/application.js.map +1 -1
  163. package/dist/tools/candidates.d.ts +7 -0
  164. package/dist/tools/candidates.d.ts.map +1 -1
  165. package/dist/tools/candidates.js +96 -1
  166. package/dist/tools/candidates.js.map +1 -1
  167. package/dist/tools/contacts.d.ts.map +1 -1
  168. package/dist/tools/contacts.js +3 -7
  169. package/dist/tools/contacts.js.map +1 -1
  170. package/dist/tools/contracts.d.ts +22 -0
  171. package/dist/tools/contracts.d.ts.map +1 -1
  172. package/dist/tools/contracts.js +185 -52
  173. package/dist/tools/contracts.js.map +1 -1
  174. package/dist/tools/crud-factory.d.ts +33 -2
  175. package/dist/tools/crud-factory.d.ts.map +1 -1
  176. package/dist/tools/crud-factory.js +45 -17
  177. package/dist/tools/crud-factory.js.map +1 -1
  178. package/dist/tools/deliveries.d.ts +3 -0
  179. package/dist/tools/deliveries.d.ts.map +1 -1
  180. package/dist/tools/deliveries.js +50 -94
  181. package/dist/tools/deliveries.js.map +1 -1
  182. package/dist/tools/description-builders.d.ts +0 -1
  183. package/dist/tools/description-builders.d.ts.map +1 -1
  184. package/dist/tools/description-builders.js +47 -4
  185. package/dist/tools/description-builders.js.map +1 -1
  186. package/dist/tools/documents.d.ts.map +1 -1
  187. package/dist/tools/documents.js +113 -27
  188. package/dist/tools/documents.js.map +1 -1
  189. package/dist/tools/expenses.d.ts.map +1 -1
  190. package/dist/tools/expenses.js +2 -11
  191. package/dist/tools/expenses.js.map +1 -1
  192. package/dist/tools/find.d.ts +61 -0
  193. package/dist/tools/find.d.ts.map +1 -0
  194. package/dist/tools/find.js +221 -0
  195. package/dist/tools/find.js.map +1 -0
  196. package/dist/tools/flags.d.ts +5 -0
  197. package/dist/tools/flags.d.ts.map +1 -1
  198. package/dist/tools/flags.js +116 -1
  199. package/dist/tools/flags.js.map +1 -1
  200. package/dist/tools/forms.d.ts +5 -0
  201. package/dist/tools/forms.d.ts.map +1 -0
  202. package/dist/tools/forms.js +64 -0
  203. package/dist/tools/forms.js.map +1 -0
  204. package/dist/tools/groupments.d.ts +5 -0
  205. package/dist/tools/groupments.d.ts.map +1 -0
  206. package/dist/tools/groupments.js +68 -0
  207. package/dist/tools/groupments.js.map +1 -0
  208. package/dist/tools/inactivities.d.ts +5 -0
  209. package/dist/tools/inactivities.d.ts.map +1 -0
  210. package/dist/tools/inactivities.js +59 -0
  211. package/dist/tools/inactivities.js.map +1 -0
  212. package/dist/tools/index.d.ts +4 -0
  213. package/dist/tools/index.d.ts.map +1 -1
  214. package/dist/tools/index.js +4 -0
  215. package/dist/tools/index.js.map +1 -1
  216. package/dist/tools/invoices.d.ts.map +1 -1
  217. package/dist/tools/invoices.js +27 -2
  218. package/dist/tools/invoices.js.map +1 -1
  219. package/dist/tools/linked-entity-filters.d.ts +48 -0
  220. package/dist/tools/linked-entity-filters.d.ts.map +1 -0
  221. package/dist/tools/linked-entity-filters.js +64 -0
  222. package/dist/tools/linked-entity-filters.js.map +1 -0
  223. package/dist/tools/notifications.d.ts.map +1 -1
  224. package/dist/tools/notifications.js +0 -5
  225. package/dist/tools/notifications.js.map +1 -1
  226. package/dist/tools/orders.d.ts.map +1 -1
  227. package/dist/tools/orders.js +33 -4
  228. package/dist/tools/orders.js.map +1 -1
  229. package/dist/tools/parameter-disclosure.js.map +1 -1
  230. package/dist/tools/payments.d.ts +3 -0
  231. package/dist/tools/payments.d.ts.map +1 -1
  232. package/dist/tools/payments.js +43 -109
  233. package/dist/tools/payments.js.map +1 -1
  234. package/dist/tools/positionings.d.ts.map +1 -1
  235. package/dist/tools/positionings.js +9 -39
  236. package/dist/tools/positionings.js.map +1 -1
  237. package/dist/tools/projects.d.ts.map +1 -1
  238. package/dist/tools/projects.js +5 -12
  239. package/dist/tools/projects.js.map +1 -1
  240. package/dist/tools/provider-invoices.d.ts +2 -0
  241. package/dist/tools/provider-invoices.d.ts.map +1 -1
  242. package/dist/tools/provider-invoices.js +30 -111
  243. package/dist/tools/provider-invoices.js.map +1 -1
  244. package/dist/tools/purchases.d.ts +2 -0
  245. package/dist/tools/purchases.d.ts.map +1 -1
  246. package/dist/tools/purchases.js +50 -104
  247. package/dist/tools/purchases.js.map +1 -1
  248. package/dist/tools/registration-decorators.d.ts +28 -0
  249. package/dist/tools/registration-decorators.d.ts.map +1 -1
  250. package/dist/tools/registration-decorators.js +107 -0
  251. package/dist/tools/registration-decorators.js.map +1 -1
  252. package/dist/tools/resources.d.ts.map +1 -1
  253. package/dist/tools/resources.js +27 -5
  254. package/dist/tools/resources.js.map +1 -1
  255. package/dist/tools/rights.d.ts +101 -0
  256. package/dist/tools/rights.d.ts.map +1 -0
  257. package/dist/tools/rights.js +75 -0
  258. package/dist/tools/rights.js.map +1 -0
  259. package/dist/tools/tab-tools.js +3 -3
  260. package/dist/tools/tab-tools.js.map +1 -1
  261. package/dist/tools/timesheets.d.ts +29 -0
  262. package/dist/tools/timesheets.d.ts.map +1 -1
  263. package/dist/tools/timesheets.js +196 -126
  264. package/dist/tools/timesheets.js.map +1 -1
  265. package/dist/tools/todolists.d.ts +2 -0
  266. package/dist/tools/todolists.d.ts.map +1 -1
  267. package/dist/tools/todolists.js +64 -1
  268. package/dist/tools/todolists.js.map +1 -1
  269. package/dist/tools/usage-guidance.d.ts.map +1 -1
  270. package/dist/tools/usage-guidance.js +12 -3
  271. package/dist/tools/usage-guidance.js.map +1 -1
  272. package/dist/tools/validations.d.ts +9 -0
  273. package/dist/tools/validations.d.ts.map +1 -1
  274. package/dist/tools/validations.js +86 -9
  275. package/dist/tools/validations.js.map +1 -1
  276. package/dist/tools/workflows.js +1 -1
  277. package/dist/tools/workflows.js.map +1 -1
  278. package/dist/transports/http.d.ts +116 -0
  279. package/dist/transports/http.d.ts.map +1 -1
  280. package/dist/transports/http.js +422 -92
  281. package/dist/transports/http.js.map +1 -1
  282. package/dist/types.d.ts +3 -3
  283. package/dist/types.d.ts.map +1 -1
  284. package/manifest.json +2 -2
  285. package/package.json +6 -5
@@ -1,28 +1,42 @@
1
- import { DeliverySearchSchema, IdSchema } from "../schemas/index.js";
2
- import { apiRequest, apiSearch, buildSearchQuery, formatListResponse, formatDetailResponse, } from "../services/boond-client.js";
3
- import { progressReporterFrom } from "../services/progress.js";
4
- import { buildJsonApiBody } from "./crud-factory.js";
5
- import { z } from "zod";
6
- import { composeDescription, defaultGetDescription } from "./description-builders.js";
7
- const DeliveryCreateSchema = z
8
- .object({
9
- projectId: z.string().min(1).describe("ID du projet"),
10
- resourceId: z.string().min(1).describe("ID de la ressource portee par la prestation"),
11
- title: z.string().optional().describe("Titre de la prestation/livraison"),
12
- typeOf: z.number().int().optional().describe("Type de prestation"),
13
- state: z.number().int().optional().describe("Etat"),
14
- startDate: z.string().optional().describe("Date de debut (YYYY-MM-DD)"),
15
- endDate: z.string().optional().describe("Date de fin (YYYY-MM-DD)"),
16
- quantity: z.number().optional().describe("Nombre de jours / quantite"),
17
- unitPrice: z.number().optional().describe("Prix journalier HT"),
18
- averageDailyCost: z.number().optional().describe("Cout journalier moyen"),
19
- forceAverageDailyPriceExcludingTax: z.boolean().optional().describe("Forcer le prix journalier HT"),
20
- note: z.string().optional().describe("Notes, mappees vers informationComments"),
21
- })
22
- .strict();
1
+ import { DeliveryCreateSchema, DeliverySearchSchema, DeliveryUpdateSchema } from "../schemas/index.js";
2
+ import { buildJsonApiBody, registerCreateTool, registerDeleteTool, registerGetTool, registerSearchTool, registerUpdateTool, } from "./crud-factory.js";
3
+ import { composeDescription } from "./description-builders.js";
4
+ const OPTS = {
5
+ entityName: "livraison (CRA)",
6
+ entityNamePlural: "livraisons",
7
+ apiPath: "/deliveries",
8
+ prefix: "boond_deliveries",
9
+ };
10
+ /**
11
+ * `/deliveries` payload: the tool's convenience names (`quantity`, `unitPrice`,
12
+ * `note`) map onto the API attributes, and the two mandatory ids become the
13
+ * `project` / `dependsOn` relationships.
14
+ */
15
+ function deliveryAttributes(params) {
16
+ const { quantity, unitPrice, note, ...attrs } = params;
17
+ return {
18
+ ...attrs,
19
+ ...(quantity !== undefined ? { numberOfDaysInvoicedOrQuantity: quantity } : {}),
20
+ ...(unitPrice !== undefined ? { averageDailyPriceExcludingTax: unitPrice } : {}),
21
+ ...(unitPrice !== undefined ? { forceAverageDailyPriceExcludingTax: true } : {}),
22
+ ...(note ? { informationComments: note } : {}),
23
+ };
24
+ }
25
+ export function buildDeliveryBody(params) {
26
+ const { projectId, resourceId, ...rest } = params;
27
+ return buildJsonApiBody("delivery", deliveryAttributes(rest), undefined, {
28
+ project: { id: String(projectId), type: "project" },
29
+ dependsOn: { id: String(resourceId), type: "resource" },
30
+ });
31
+ }
32
+ /** PUT /deliveries/{id}: attributes only — the project / resource attachment is never moved by an update (issue #252). */
33
+ export function buildDeliveryUpdateBody(params) {
34
+ const { id, ...rest } = params;
35
+ return buildJsonApiBody("delivery", deliveryAttributes(rest), String(id));
36
+ }
23
37
  export function registerDeliveryTools(server) {
24
- server.registerTool("boond_deliveries_create", {
25
- title: "Creer une prestation/livraison",
38
+ registerCreateTool(server, OPTS, DeliveryCreateSchema, buildDeliveryBody, {
39
+ title: "Créer une prestation/livraison",
26
40
  description: composeDescription({
27
41
  purpose: "Crée une prestation (livraison) rattachée à un projet et à une ressource.",
28
42
  when: "pour ouvrir la ligne de mission qui rendra la ressource facturable sur ce projet.",
@@ -32,83 +46,25 @@ export function registerDeliveryTools(server) {
32
46
  "L'ID de prestation retourné est celui qu'exigent les lignes de note de frais (`boond_expenses_create`).",
33
47
  "Écriture non idempotente.",
34
48
  ],
35
- returns: "confirmation et fiche de la prestation créée.",
49
+ returns: "confirmation et fiche de la prestation créée, avec son ID dans `structuredContent.id`.",
36
50
  }),
37
- inputSchema: DeliveryCreateSchema,
38
- annotations: {
39
- readOnlyHint: false,
40
- destructiveHint: false,
41
- idempotentHint: false,
42
- openWorldHint: false,
43
- },
44
- }, async (params) => {
45
- const { projectId, resourceId, quantity, unitPrice, note, ...attrs } = params;
46
- const apiAttrs = {
47
- ...attrs,
48
- ...(quantity !== undefined ? { numberOfDaysInvoicedOrQuantity: quantity } : {}),
49
- ...(unitPrice !== undefined ? { averageDailyPriceExcludingTax: unitPrice } : {}),
50
- ...(unitPrice !== undefined ? { forceAverageDailyPriceExcludingTax: true } : {}),
51
- ...(note ? { informationComments: note } : {}),
52
- };
53
- const body = buildJsonApiBody("delivery", apiAttrs);
54
- body.data.relationships = {
55
- project: { data: { id: projectId, type: "project" } },
56
- dependsOn: { data: { id: resourceId, type: "resource" } },
57
- };
58
- const response = await apiRequest("/deliveries", "POST", body);
59
- const entity = Array.isArray(response.data) ? response.data[0] : response.data;
60
- return {
61
- content: [
62
- {
63
- type: "text",
64
- text: `Prestation/livraison creee avec succes.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
65
- },
66
- ],
67
- };
68
51
  });
69
- server.registerTool("boond_deliveries_search", {
52
+ // The list lives on `/deliveries-groupments`, the detail on `/deliveries/{id}`.
53
+ registerSearchTool(server, { ...OPTS, apiPath: "/deliveries-groupments" }, {
54
+ schema: DeliverySearchSchema,
70
55
  title: "Rechercher des livraisons / CRA",
71
- description: `Recherche des livraisons (comptes rendus d'activite) dans BoondManager avec filtres par projet, societe et periode.
56
+ description: `Recherche des prestations / livraisons dans BoondManager par projet, société, ressource, état (\`deliveryStates\`, \`projectStates\`), période (\`period: "running"\` + dates pour les prestations en cours) et périmètre (\`perimeter*\`).
72
57
 
73
- Args:
74
- - keywords (string, optional): Termes de recherche
75
- - projectId, companyId (string, optional): Filtrer par entite liee
76
- - startDate, endDate (string, optional): Periode (YYYY-MM-DD)
77
- - page, pageSize: Pagination
58
+ \`projectId\` / \`companyId\` sont convertis en références \`keywords\` (PRJ<id> / CSOC<id>) : l'API n'a pas de paramètre dédié.
78
59
 
79
60
  Returns: Liste des livraisons correspondantes.`,
80
- inputSchema: DeliverySearchSchema,
81
- annotations: {
82
- readOnlyHint: true,
83
- destructiveHint: false,
84
- idempotentHint: true,
85
- openWorldHint: true,
86
- },
87
- }, async (params, extra) => {
88
- const query = buildSearchQuery(params);
89
- const response = await apiSearch("/deliveries-groupments", query, progressReporterFrom(extra));
90
- return {
91
- content: [{ type: "text", text: formatListResponse(response, "livraison", params.fields) }],
92
- };
93
61
  });
94
- server.registerTool("boond_deliveries_get", {
95
- title: "Details d'une livraison / CRA",
96
- description: defaultGetDescription({
97
- ...{ entityName: "livraison (CRA)", entityNamePlural: "livraisons", prefix: "boond_deliveries" },
98
- withTab: false,
99
- }),
100
- inputSchema: IdSchema,
101
- annotations: {
102
- readOnlyHint: true,
103
- destructiveHint: false,
104
- idempotentHint: true,
105
- openWorldHint: false,
106
- },
107
- }, async (params) => {
108
- const response = await apiRequest(`/deliveries/${params.id}`);
109
- return {
110
- content: [{ type: "text", text: formatDetailResponse(response) }],
111
- };
62
+ registerGetTool(server, OPTS, { withTab: false, title: "Détails d'une livraison / CRA" });
63
+ // Issue #252: extend a delivery (endDate), change a daily rate, close it.
64
+ registerUpdateTool(server, OPTS, DeliveryUpdateSchema, buildDeliveryUpdateBody, {
65
+ method: "PUT",
66
+ title: "Modifier une prestation/livraison",
112
67
  });
68
+ registerDeleteTool(server, OPTS, { title: "Supprimer une prestation/livraison" });
113
69
  }
114
70
  //# sourceMappingURL=deliveries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deliveries.js","sourceRoot":"","sources":["../../src/tools/deliveries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deliveries.js","sourceRoot":"","sources":["../../src/tools/deliveries.ts"],"names":[],"mappings":"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"}
@@ -107,7 +107,6 @@ export interface EntityWording {
107
107
  * wording by having already mentioned `pageSize`.
108
108
  */
109
109
  export declare function defaultSearchDescription(opts: EntityWording): string;
110
- /** Default detail description; `withTab` mirrors `registerGetTool`. */
111
110
  export declare function defaultGetDescription(opts: EntityWording & {
112
111
  withTab: boolean;
113
112
  }): string;
@@ -1 +1 @@
1
- {"version":3,"file":"description-builders.d.ts","sourceRoot":"","sources":["../../src/tools/description-builders.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAgBpE;AAID;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAEuC,CAAC;AAE1E;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,QAE+C,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,QAEiD,CAAC;AAIhF,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAOpE;AAED,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAiBxF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAWpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAWpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAWpE;AAID,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAS/D"}
1
+ {"version":3,"file":"description-builders.d.ts","sourceRoot":"","sources":["../../src/tools/description-builders.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAgBpE;AAID;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAEuC,CAAC;AAE1E;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,QAE+C,CAAC;AAExF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,QAE2D,CAAC;AAI1F,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAOpE;AA8CD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAiBxF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAWpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAYpE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAYpE;AAID,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAS/D"}
@@ -57,7 +57,7 @@ export const PAGINATION_INERT_DISCLOSURE = "Pagination sans effet : cette route
57
57
  * *never sent*, and *silently ignored*.
58
58
  */
59
59
  export const FIELDS_DISCLOSURE = "`fields` : projection côté MCP, jamais transmise à l'API — remplace le résumé par les seuls " +
60
- "attributs listés (noms inconnus ignorés). À utiliser sur les grosses pages.";
60
+ "attributs/relations listés (noms inconnus ignorés). À utiliser sur les grosses pages.";
61
61
  /**
62
62
  * Default search description for a reference/admin domain: no endpoint-specific
63
63
  * filter vocabulary, so the value it adds over the schema is the pointer to the
@@ -80,6 +80,47 @@ export function defaultSearchDescription(opts) {
80
80
  });
81
81
  }
82
82
  /** Default detail description; `withTab` mirrors `registerGetTool`. */
83
+ /** The six entities `boond_find` resolves (issue #262); the hint is only true for them. */
84
+ const FIND_PREFIXES = new Set([
85
+ "boond_candidates",
86
+ "boond_resources",
87
+ "boond_contacts",
88
+ "boond_companies",
89
+ "boond_opportunities",
90
+ "boond_projects",
91
+ ]);
92
+ function findHint(prefix) {
93
+ return FIND_PREFIXES.has(prefix) ? ", ou `boond_find` pour résoudre un nom / un e-mail en ID" : "";
94
+ }
95
+ /** Entities `boond_rights_get` covers (issue #257) — `GET /{entity}/{id}/rights` exists for them. */
96
+ const RIGHTS_PREFIXES = new Set([
97
+ "boond_candidates",
98
+ "boond_resources",
99
+ "boond_contacts",
100
+ "boond_companies",
101
+ "boond_opportunities",
102
+ "boond_projects",
103
+ "boond_actions",
104
+ "boond_positionings",
105
+ "boond_invoices",
106
+ "boond_orders",
107
+ "boond_deliveries",
108
+ "boond_purchases",
109
+ "boond_payments",
110
+ "boond_provider_invoices",
111
+ "boond_products",
112
+ "boond_contracts",
113
+ "boond_advantages",
114
+ "boond_timesheets",
115
+ "boond_expenses",
116
+ "boond_absences",
117
+ "boond_agencies",
118
+ ]);
119
+ function rightsHint(prefix) {
120
+ return RIGHTS_PREFIXES.has(prefix)
121
+ ? ["`boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité)."]
122
+ : [];
123
+ }
83
124
  export function defaultGetDescription(opts) {
84
125
  const behaviour = [
85
126
  `Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de \`${opts.prefix}_search\`, jamais d'une supposition.`,
@@ -91,7 +132,7 @@ export function defaultGetDescription(opts) {
91
132
  return composeDescription({
92
133
  purpose: `Récupère la fiche complète d'un(e) ${opts.entityName} par son ID numérique.`,
93
134
  when: `après un \`${opts.prefix}_search\`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste.`,
94
- instead: `\`${opts.prefix}_search\` si l'ID n'est pas connu (cet outil n'accepte pas de nom).`,
135
+ instead: `\`${opts.prefix}_search\` si l'ID n'est pas connu (cet outil n'accepte pas de nom)${findHint(opts.prefix)}.`,
95
136
  behaviour,
96
137
  returns: `JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.`,
97
138
  });
@@ -112,10 +153,11 @@ export function defaultUpdateDescription(opts) {
112
153
  return composeDescription({
113
154
  purpose: `Met à jour un(e) ${opts.entityName} existant(e), identifié(e) par son ID.`,
114
155
  when: `pour modifier quelques champs d'un enregistrement déjà en base.`,
115
- instead: `\`${opts.prefix}_create\` si l'enregistrement n'existe pas encore.`,
156
+ instead: `\`${opts.prefix}_create\` si l'enregistrement n'existe pas encore${findHint(opts.prefix)}.`,
116
157
  behaviour: [
117
158
  "Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place.",
118
159
  "Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés.",
160
+ ...rightsHint(opts.prefix),
119
161
  ],
120
162
  returns: `confirmation et fiche mise à jour.`,
121
163
  });
@@ -126,6 +168,7 @@ export function defaultDeleteDescription(opts) {
126
168
  when: `uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec \`${opts.prefix}_get\`.`,
127
169
  instead: `\`${opts.prefix}_update\` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle.`,
128
170
  behaviour: [
171
+ ...rightsHint(opts.prefix),
129
172
  "⚠️ Irréversible, sans corbeille côté API.",
130
173
  "Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement.",
131
174
  ],
@@ -145,7 +188,7 @@ export function tabDescription(spec) {
145
188
  purpose: `Récupère ${scope} d'un(e) ${spec.entityName}, par son ID.`,
146
189
  when: `pour ne charger que cette section, sans le reste de la fiche.`,
147
190
  instead: `\`${spec.prefix}_get\` pour la fiche de base, ou \`${spec.prefix}_search\` si l'ID est inconnu.`,
148
- behaviour: spec.behaviour,
191
+ ...(spec.behaviour !== undefined ? { behaviour: spec.behaviour } : {}),
149
192
  returns: `${spec.returns} Lecture seule.`,
150
193
  });
151
194
  }
@@ -1 +1 @@
1
- {"version":3,"file":"description-builders.js","sourceRoot":"","sources":["../../src/tools/description-builders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"description-builders.js","sourceRoot":"","sources":["../../src/tools/description-builders.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgI7D"}
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwN7D"}
@@ -1,8 +1,10 @@
1
- import { apiDownload, apiUploadForm, formatDetailResponse } from "../services/boond-client.js";
1
+ import { apiDownload, apiUploadForm, formatDetailResponse, DownloadTooLargeError } from "../services/boond-client.js";
2
2
  import { progressReporterFrom } from "../services/progress.js";
3
- import { DocumentIdSchema, DocumentCreateSchema } from "../schemas/index.js";
4
- import { MAX_DOCUMENT_BYTES, CHARACTER_LIMIT } from "../constants.js";
3
+ import { DocumentGetSchema, DocumentCreateSchema } from "../schemas/index.js";
4
+ import { MAX_DOCUMENT_BYTES, MAX_IMAGE_BYTES, CHARACTER_LIMIT, INLINE_UPLOAD_MAX_BYTES } from "../constants.js";
5
+ import { decodeInlineUpload, readLocalUpload, UploadRejectedError } from "../services/upload-source.js";
5
6
  import { registerDeleteTool, MutationOutputSchema } from "./crud-factory.js";
7
+ import { extractDocxText, extractPdfText, isDocxMime, isImageMime, isPdfMime } from "../services/document-text.js";
6
8
  /** Mime types rendered as plain text instead of a base64 blob. */
7
9
  function isTextMime(mime) {
8
10
  return mime.startsWith("text/") || /[+/](json|xml)$|^application\/(json|xml|csv)$/.test(mime);
@@ -11,15 +13,15 @@ export function registerDocumentTools(server) {
11
13
  // Download a document (CV, justificatif, contrat...)
12
14
  server.registerTool("boond_documents_get", {
13
15
  title: "Télécharger un document",
14
- description: `Télécharge le contenu d'un document BoondManager (CV de candidat/ressource, justificatif, contrat, facture...) par son ID.
16
+ description: `Télécharge un document BoondManager (CV de candidat/ressource, justificatif, contrat, facture...) par son ID, et le rend lisible : texte extrait pour un PDF ou un DOCX, contenu \`image\` (visible par le modèle) pour une image, texte brut pour un fichier texte.
15
17
 
16
18
  Où trouver les IDs de documents : dans les onglets des entités — ex. boond_candidates_information expose les relations 'resumes' (CV) et 'files' (dossier administratif). ⚠️ Reprendre l'ID **tel quel**, suffixe compris (ex. '123_resume') : un ID tronqué à sa partie numérique ne désigne aucun document.
17
19
 
18
- Le contenu est retourné en ressource MCP embarquée (base64 pour les binaires type PDF/DOCX, texte brut pour les fichiers texte). Taille max: ${Math.round(MAX_DOCUMENT_BYTES / 1024 / 1024)} Mo — à n'utiliser que lorsque le contenu du fichier est réellement nécessaire (un CV en base64 occupe beaucoup de contexte).
20
+ \`mode: "text"\` (défaut) : PDF / DOCX → texte extrait côté serveur (borné à ${CHARACTER_LIMIT} caractères, taille et nombre de pages d'origine indiqués) ; image PNG / JPEG / GIF / WebP → contenu \`image\` jusqu'à ${Math.round(MAX_IMAGE_BYTES / 1024 / 1024)} Mo. Un PDF scanné ou chiffré, dont rien ne s'extrait, est renvoyé tel quel avec un avertissement. \`mode: "raw"\` : le fichier tel quel en ressource embarquée (base64) — coûteux en contexte, à réserver aux cas où les octets sont nécessaires (transfert, format non géré). Taille max téléchargée : ${Math.round(MAX_DOCUMENT_BYTES / 1024 / 1024)} Mo.
19
21
 
20
- Returns : le fichier en ressource MCP embarquée — \`blob\` base64 pour un binaire, \`text\` pour un mime texte.
22
+ Returns : texte extrait, contenu \`image\`, ou ressource embarquée (\`blob\` base64) selon le format et le mode.
21
23
  Un ID inconnu est rejeté explicitement plutôt que de renvoyer la page d'accueil BoondManager, que l'API sert en HTTP 200 à la place d'un 404.`,
22
- inputSchema: DocumentIdSchema,
24
+ inputSchema: DocumentGetSchema,
23
25
  annotations: {
24
26
  readOnlyHint: true,
25
27
  destructiveHint: false,
@@ -28,21 +30,35 @@ Un ID inconnu est rejeté explicitement plutôt que de renvoyer la page d'accuei
28
30
  },
29
31
  }, async (params, extra) => {
30
32
  // Byte-level progress, but only when the client asked for it and the
31
- // response announces a Content-Length (see readDownloadBody).
32
- const doc = await apiDownload(`/documents/${params.id}`, progressReporterFrom(extra));
33
- const uri = `boond://documents/${params.id}`;
34
- const name = doc.filename ?? `document-${params.id}`;
35
- if (doc.data.length > MAX_DOCUMENT_BYTES) {
33
+ // response announces a Content-Length (see readDownloadBody). The size
34
+ // cap is enforced *during* the download (#235): an announced size over
35
+ // the cap is refused before the body is read, an unannounced one is cut
36
+ // the moment it crosses it — never buffered whole and then refused.
37
+ let doc;
38
+ try {
39
+ doc = await apiDownload(`/documents/${params.id}`, progressReporterFrom(extra), {
40
+ maxBytes: MAX_DOCUMENT_BYTES,
41
+ });
42
+ }
43
+ catch (err) {
44
+ if (!(err instanceof DownloadTooLargeError))
45
+ throw err;
46
+ const mb = (n) => (n / 1024 / 1024).toFixed(1);
47
+ const size = err.announced ? `${mb(err.bytes)} Mo` : `plus de ${mb(err.bytes)} Mo`;
36
48
  return {
37
49
  isError: true,
38
50
  content: [
39
51
  {
40
52
  type: "text",
41
- text: `❌ Document #${params.id} (${name}) trop volumineux pour être retourné inline: ${(doc.data.length / 1024 / 1024).toFixed(1)} Mo (max ${Math.round(MAX_DOCUMENT_BYTES / 1024 / 1024)} Mo).`,
53
+ text: `❌ Document #${params.id} trop volumineux pour être retourné inline: ${size} (max ${Math.round(MAX_DOCUMENT_BYTES / 1024 / 1024)} Mo). Le téléchargement a été interrompu sans charger le fichier en mémoire.`,
42
54
  },
43
55
  ],
44
56
  };
45
57
  }
58
+ const uri = `boond://documents/${params.id}`;
59
+ const name = doc.filename ?? `document-${params.id}`;
60
+ const sizeKb = (doc.data.length / 1024).toFixed(0);
61
+ const header = `Document #${params.id} — ${name} (${doc.contentType}, ${sizeKb} Ko)`;
46
62
  if (isTextMime(doc.contentType)) {
47
63
  let text = doc.data.toString("utf8");
48
64
  if (text.length > CHARACTER_LIMIT) {
@@ -54,29 +70,69 @@ Un ID inconnu est rejeté explicitement plutôt que de renvoyer la page d'accuei
54
70
  ],
55
71
  };
56
72
  }
57
- return {
73
+ const raw = (note) => ({
58
74
  content: [
59
75
  {
60
76
  type: "text",
61
- text: `Document #${params.id} — ${name} (${doc.contentType}, ${(doc.data.length / 1024).toFixed(0)} Ko), contenu joint en ressource embarquée.`,
77
+ text: `${header}, contenu joint en ressource embarquée.${note ? `\n${note}` : ""}`,
62
78
  },
63
79
  {
64
80
  type: "resource",
65
- resource: {
66
- uri,
67
- mimeType: doc.contentType,
68
- blob: doc.data.toString("base64"),
69
- },
81
+ resource: { uri, mimeType: doc.contentType, blob: doc.data.toString("base64") },
70
82
  },
71
83
  ],
72
- };
84
+ });
85
+ if (params.mode === "raw")
86
+ return raw();
87
+ // Issue #263 — an image is handed to the model as `image` content, the
88
+ // only shape hosts reliably pass to its vision input; a blob is opaque.
89
+ if (isImageMime(doc.contentType)) {
90
+ if (doc.data.length > MAX_IMAGE_BYTES) {
91
+ return raw(`⚠️ Image de ${sizeKb} Ko, au-delà des ${Math.round(MAX_IMAGE_BYTES / 1024 / 1024)} Mo affichables en contenu \`image\` : renvoyée en ressource embarquée.`);
92
+ }
93
+ return {
94
+ content: [
95
+ { type: "text", text: `${header} — image jointe.` },
96
+ { type: "image", data: doc.data.toString("base64"), mimeType: doc.contentType },
97
+ ],
98
+ };
99
+ }
100
+ // Issue #263 — a 5 MiB PDF is ~6.6 MB of base64 for a few KB of text.
101
+ if (isPdfMime(doc.contentType) || isDocxMime(doc.contentType, doc.filename, doc.data)) {
102
+ let extracted;
103
+ try {
104
+ extracted = isPdfMime(doc.contentType) ? await extractPdfText(doc.data) : extractDocxText(doc.data);
105
+ }
106
+ catch (error) {
107
+ const why = error instanceof Error ? error.message : String(error);
108
+ return raw(`⚠️ Extraction du texte impossible (${why}) : fichier renvoyé tel quel.`);
109
+ }
110
+ const truncated = extracted.text.length > CHARACTER_LIMIT;
111
+ const text = truncated ? extracted.text.substring(0, CHARACTER_LIMIT) : extracted.text;
112
+ const pages = extracted.pages !== undefined ? `, ${extracted.pages} page(s)` : "";
113
+ const cut = truncated
114
+ ? `\n\n[Texte tronqué à ${CHARACTER_LIMIT} caractères sur ${extracted.text.length} — \`mode: "raw"\` pour le fichier complet.]`
115
+ : "";
116
+ return {
117
+ content: [
118
+ {
119
+ type: "text",
120
+ text: `Document #${params.id} — ${name} (${doc.contentType}, ${sizeKb} Ko${pages}) — texte extrait :\n\n${text}${cut}`,
121
+ },
122
+ ],
123
+ };
124
+ }
125
+ return raw();
73
126
  });
74
- // Upload a document by URL
127
+ // Upload a document: by URL, by local path (opt-in, stdio) or inline base64
75
128
  server.registerTool("boond_documents_create", {
76
129
  title: "Téléverser un document",
77
- description: `Attache un document à une entité BoondManager à partir d'une URL (l'API BoondManager télécharge elle-même le fichier — aucun fichier local n'est lu).
130
+ description: `Attache un document à une entité BoondManager. Exactement une source par appel :
131
+ - \`fileUrl\` : URL https que BoondManager télécharge lui-même (aucun octet ne transite par le serveur MCP) ;
132
+ - \`filePath\` : chemin absolu d'un fichier local, lu par le serveur MCP — transport stdio uniquement, et seulement sous un répertoire listé dans \`BOOND_MCP_UPLOAD_DIRS\` (désactivé par défaut) ;
133
+ - \`fileContent\` (base64) + \`fileName\` : petit fichier passé inline, ${Math.round(INLINE_UPLOAD_MAX_BYTES / 1024 / 1024)} Mo max.
78
134
 
79
- Cas d'usage typiques : attacher un CV à un candidat (parentType=candidateResume, parsing=true pour lancer l'analyse IA Boond), joindre un justificatif à une note de frais (expensesReport), un document à un projet/une société...
135
+ Le format est vérifié sur les premiers octets du fichier (PDF, Office, ODF, RTF, images), pas sur l'extension. \`fileContent\` suppose que l'appelant détient déjà les octets exacts : un modèle ne peut pas retranscrire de façon fiable une pièce jointe de conversation en base64 — préférer \`filePath\`. Cas d'usage typiques : CV d'un candidat (parentType=candidateResume, parsing=true pour l'analyse IA Boond), justificatif de note de frais (expensesReport), bon de commande, contrat...
80
136
 
81
137
  Returns: Métadonnées du document créé (ID).`,
82
138
  inputSchema: DocumentCreateSchema,
@@ -88,25 +144,55 @@ Returns: Métadonnées du document créé (ID).`,
88
144
  openWorldHint: false,
89
145
  },
90
146
  }, async (params) => {
147
+ const reject = (text) => ({ isError: true, content: [{ type: "text", text: `❌ ${text}` }] });
148
+ const sources = [params.fileUrl, params.filePath, params.fileContent].filter((v) => v !== undefined).length;
149
+ if (sources !== 1) {
150
+ return reject(`Exactement une source de fichier est attendue (reçu : ${sources}). Fournir \`fileUrl\`, ou \`filePath\`, ` +
151
+ "ou `fileContent` + `fileName`.");
152
+ }
153
+ if (params.fileContent !== undefined && params.fileName === undefined) {
154
+ return reject("`fileName` (avec extension, ex. « cv.pdf ») est requis avec `fileContent`.");
155
+ }
156
+ if (params.fileContent === undefined && params.fileName !== undefined) {
157
+ return reject("`fileName` ne s'utilise qu'avec `fileContent`.");
158
+ }
159
+ let file;
160
+ try {
161
+ if (params.filePath !== undefined)
162
+ file = await readLocalUpload(params.filePath);
163
+ else if (params.fileContent !== undefined && params.fileName !== undefined)
164
+ file = decodeInlineUpload(params.fileContent, params.fileName);
165
+ }
166
+ catch (error) {
167
+ if (error instanceof UploadRejectedError)
168
+ return reject(error.message);
169
+ throw error;
170
+ }
91
171
  const fields = {
92
172
  parentType: params.parentType,
93
173
  parentId: String(params.parentId),
94
- fileUrl: params.fileUrl,
95
174
  };
175
+ if (params.fileUrl !== undefined)
176
+ fields.fileUrl = params.fileUrl;
96
177
  if (params.parsing !== undefined)
97
178
  fields.parsing = String(params.parsing);
98
- const response = await apiUploadForm("/documents", fields);
179
+ const response = file === undefined
180
+ ? await apiUploadForm("/documents", fields)
181
+ : await apiUploadForm("/documents", fields, file);
99
182
  const entity = Array.isArray(response.data) ? response.data[0] : response.data;
100
183
  const structured = {};
101
184
  if (entity?.id !== undefined)
102
185
  structured.id = String(entity.id);
103
186
  if (entity?.type !== undefined)
104
187
  structured.type = String(entity.type);
188
+ const sent = file === undefined
189
+ ? ""
190
+ : `\nFichier: ${file.filename} (${file.contentType}, ${(file.data.length / 1024).toFixed(0)} Ko)`;
105
191
  return {
106
192
  content: [
107
193
  {
108
194
  type: "text",
109
- text: `✅ Document créé avec succès.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
195
+ text: `✅ Document créé avec succès.\nID: ${entity?.id}${sent}\n\n${formatDetailResponse(response)}`,
110
196
  },
111
197
  ],
112
198
  structuredContent: structured,
@@ -1 +1 @@
1
- {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"expenses.d.ts","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuE5D"}
1
+ {"version":3,"file":"expenses.d.ts","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8D5D"}
@@ -63,7 +63,7 @@ function buildExpenseBody(params) {
63
63
  * two ids a line cannot omit.
64
64
  */
65
65
  function formatExpenseDefaults(response) {
66
- const entity = (Array.isArray(response.data) ? response.data[0] : response.data);
66
+ const entity = Array.isArray(response.data) ? response.data[0] : response.data;
67
67
  if (!entity)
68
68
  return "Aucune donnée par défaut retournée pour cette ressource / ce mois.";
69
69
  const attrs = entity.attributes ?? {};
@@ -128,11 +128,7 @@ export function registerExpenseTools(server) {
128
128
  schema: ExpenseSearchSchema,
129
129
  description: `Recherche des notes de frais dans BoondManager avec filtres par ressource, projet et période.
130
130
 
131
- Args:
132
- - keywords (string, optional): Termes de recherche
133
- - resourceId, projectId (string, optional): Filtrer par entité liée
134
- - startDate, endDate (string, optional): Période (YYYY-MM-DD)
135
- - page, pageSize: Pagination
131
+ \`resourceId\` / \`projectId\` sont convertis en références \`keywords\` (COMP<id> / PRJ<id>) : l'API n'a pas de paramètre dédié.
136
132
 
137
133
  Returns: Liste des notes de frais correspondantes.`,
138
134
  });
@@ -143,11 +139,6 @@ Returns: Liste des notes de frais correspondantes.`,
143
139
 
144
140
  À appeler AVANT \`boond_expenses_create\` : les types de frais sont définis **par agence** et ne figurent pas dans \`boond_application_dictionary\`. Les ids \`projectId\` et \`deliveryId\` sont obligatoires sur chaque ligne et l'API refuse un couple qu'elle ne juge pas imputable sur ce mois.
145
141
 
146
- Args:
147
- - resourceId (string): ID de la ressource
148
- - term (string): Mois ciblé (YYYY-MM)
149
- - agencyId (string, optional): Forcer l'agence
150
-
151
142
  Returns: Les références à recopier dans \`boond_expenses_create\`.`,
152
143
  inputSchema: ExpenseDefaultSchema,
153
144
  annotations: {