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 +1 @@
1
- {"version":3,"file":"expenses.js","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"expenses.js","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { type AccessPolicy } from "../config/access-policy.js";
4
+ import type { JsonApiResource } from "../types.js";
5
+ /**
6
+ * `boond_find` — name (or e-mail) → id, in one call (issue #262).
7
+ *
8
+ * Every other tool takes numeric ids, and until now only the prompts resolved
9
+ * a label: "mets à jour la fiche de Jean Dupont" cost the model a search with
10
+ * the right `keywordsType`, a choice among homonyms, then the `_get`. This
11
+ * tool owns that sequence: it picks the field to search per entity (`fullName`
12
+ * with the `NOM#PRENOM` form the API expects — tried in both orders, since a
13
+ * user types "Jean Dupont" as often as "Dupont Jean" —, `emails`, `name`), and
14
+ * it **refuses to choose** among several exact matches: an ambiguous name
15
+ * comes back as `isError` with the list, never as a silent first-row pick.
16
+ */
17
+ declare const ENTITY_DOMAIN: {
18
+ readonly candidate: "candidates";
19
+ readonly resource: "resources";
20
+ readonly contact: "contacts";
21
+ readonly company: "companies";
22
+ readonly opportunity: "opportunities";
23
+ readonly project: "projects";
24
+ };
25
+ export type FindEntity = keyof typeof ENTITY_DOMAIN;
26
+ export declare const FindOutputSchema: z.ZodObject<{
27
+ entity: z.ZodString;
28
+ query: z.ZodString;
29
+ count: z.ZodNumber;
30
+ match: z.ZodOptional<z.ZodObject<{
31
+ id: z.ZodString;
32
+ label: z.ZodString;
33
+ }, z.core.$strip>>;
34
+ ambiguous: z.ZodOptional<z.ZodBoolean>;
35
+ items: z.ZodArray<z.ZodObject<{
36
+ id: z.ZodString;
37
+ label: z.ZodString;
38
+ detail: z.ZodOptional<z.ZodString>;
39
+ exact: z.ZodBoolean;
40
+ }, z.core.$strip>>;
41
+ }, z.core.$strip>;
42
+ /** The search calls to try, in order; the first one that returns a row wins. */
43
+ export declare function searchAttempts(entity: FindEntity, query: string, email?: string): Array<Record<string, unknown>>;
44
+ export interface FoundItem {
45
+ id: string;
46
+ label: string;
47
+ detail?: string;
48
+ exact: boolean;
49
+ }
50
+ /** Human label + disambiguation detail for one search row. */
51
+ export declare function describeRow(entity: FindEntity, row: JsonApiResource): {
52
+ label: string;
53
+ detail?: string;
54
+ };
55
+ /** Exact = same label ignoring case / accents / spacing; for people, both word orders count; for e-mail lookups, the e-mail itself. */
56
+ export declare function isExactMatch(entity: FindEntity, row: JsonApiResource, item: {
57
+ label: string;
58
+ }, query: string, email?: string): boolean;
59
+ export declare function registerFindTool(server: McpServer, policy?: AccessPolicy): void;
60
+ export {};
61
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;;;;;;;;;;GAWG;AAEH,QAAA,MAAM,aAAa;;;;;;;CAO4B,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,aAAa,CAAC;AAiBpD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;iBAiB3B,CAAC;AAUH,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAuBhH;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CA2BxG;AAED,uIAAuI;AACvI,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAaT;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAqG/E"}
@@ -0,0 +1,221 @@
1
+ import { z } from "zod";
2
+ import { apiSearch, buildSearchQuery } from "../services/boond-client.js";
3
+ import { formatEntitySummary } from "../services/format/summary.js";
4
+ import { progressReporterFrom } from "../services/progress.js";
5
+ import { isDomainAllowed } from "../config/access-policy.js";
6
+ import { composeDescription } from "./description-builders.js";
7
+ /**
8
+ * `boond_find` — name (or e-mail) → id, in one call (issue #262).
9
+ *
10
+ * Every other tool takes numeric ids, and until now only the prompts resolved
11
+ * a label: "mets à jour la fiche de Jean Dupont" cost the model a search with
12
+ * the right `keywordsType`, a choice among homonyms, then the `_get`. This
13
+ * tool owns that sequence: it picks the field to search per entity (`fullName`
14
+ * with the `NOM#PRENOM` form the API expects — tried in both orders, since a
15
+ * user types "Jean Dupont" as often as "Dupont Jean" —, `emails`, `name`), and
16
+ * it **refuses to choose** among several exact matches: an ambiguous name
17
+ * comes back as `isError` with the list, never as a silent first-row pick.
18
+ */
19
+ const ENTITY_DOMAIN = {
20
+ candidate: "candidates",
21
+ resource: "resources",
22
+ contact: "contacts",
23
+ company: "companies",
24
+ opportunity: "opportunities",
25
+ project: "projects",
26
+ };
27
+ const ALL_ENTITIES = Object.keys(ENTITY_DOMAIN);
28
+ const API_PATH = {
29
+ candidate: "/candidates",
30
+ resource: "/resources",
31
+ contact: "/contacts",
32
+ company: "/companies",
33
+ opportunity: "/opportunities",
34
+ project: "/projects",
35
+ };
36
+ const PEOPLE = new Set(["candidate", "resource", "contact"]);
37
+ /** Bounded: a resolver is a keystroke-cheap lookup, not a listing. */
38
+ const FIND_PAGE_SIZE = 10;
39
+ export const FindOutputSchema = z.object({
40
+ entity: z.string(),
41
+ query: z.string(),
42
+ count: z.number().describe("Nombre de candidats renvoyés par la recherche (≤ 10)"),
43
+ match: z
44
+ .object({ id: z.string(), label: z.string() })
45
+ .optional()
46
+ .describe("Présent quand exactement un résultat porte le libellé demandé : l'ID à utiliser."),
47
+ ambiguous: z.boolean().optional().describe("true quand plusieurs résultats portent exactement le libellé demandé"),
48
+ items: z.array(z.object({
49
+ id: z.string(),
50
+ label: z.string(),
51
+ detail: z.string().optional().describe("Élément de désambiguïsation (titre, e-mail, ville, référence, état)"),
52
+ exact: z.boolean().describe("Le libellé correspond exactement à la requête"),
53
+ })),
54
+ });
55
+ function normalize(text) {
56
+ return text.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase().replace(/\s+/g, " ").trim();
57
+ }
58
+ function str(value) {
59
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
60
+ }
61
+ /** The search calls to try, in order; the first one that returns a row wins. */
62
+ export function searchAttempts(entity, query, email) {
63
+ const q = query.trim();
64
+ if (email) {
65
+ return PEOPLE.has(entity) || entity === "company"
66
+ ? [{ keywords: email, keywordsType: "emails" }]
67
+ : [{ keywords: email }];
68
+ }
69
+ if (PEOPLE.has(entity)) {
70
+ const words = q.split(/\s+/);
71
+ if (words.length >= 2) {
72
+ const [first, ...rest] = words;
73
+ const last = rest.join(" ");
74
+ // The API's `fullName` form is `NOM#PRENOM`; "Jean Dupont" and "Dupont Jean" are both common.
75
+ return [
76
+ { keywords: `${last}#${first ?? ""}`, keywordsType: "fullName" },
77
+ { keywords: `${first ?? ""}#${last}`, keywordsType: "fullName" },
78
+ { keywords: q },
79
+ ];
80
+ }
81
+ return [{ keywords: q, keywordsType: "lastName" }, { keywords: q }];
82
+ }
83
+ if (entity === "company")
84
+ return [{ keywords: q, keywordsType: "name" }, { keywords: q }];
85
+ return [{ keywords: q }];
86
+ }
87
+ /** Human label + disambiguation detail for one search row. */
88
+ export function describeRow(entity, row) {
89
+ const a = row.attributes ?? {};
90
+ if (PEOPLE.has(entity)) {
91
+ const label = [str(a.firstName), str(a.lastName)].filter(Boolean).join(" ") || formatEntitySummary(row);
92
+ const detail = [str(a.title), str(a.email1), str(a.town) ?? str(a.city)].filter(Boolean).join(" · ");
93
+ return detail ? { label, detail } : { label };
94
+ }
95
+ if (entity === "company") {
96
+ const label = str(a.name) ?? formatEntitySummary(row);
97
+ const detail = [
98
+ str(a.town) ?? str(a.city),
99
+ str(a.email1),
100
+ a.state !== undefined ? `état ${String(a.state)}` : undefined,
101
+ ]
102
+ .filter(Boolean)
103
+ .join(" · ");
104
+ return detail ? { label, detail } : { label };
105
+ }
106
+ // opportunity / project: title first, reference as the disambiguator.
107
+ const label = str(a.title) ?? str(a.reference) ?? formatEntitySummary(row);
108
+ const detail = [
109
+ str(a.reference) !== label ? str(a.reference) : undefined,
110
+ a.state !== undefined ? `état ${String(a.state)}` : undefined,
111
+ ]
112
+ .filter(Boolean)
113
+ .join(" · ");
114
+ return detail ? { label, detail } : { label };
115
+ }
116
+ /** Exact = same label ignoring case / accents / spacing; for people, both word orders count; for e-mail lookups, the e-mail itself. */
117
+ export function isExactMatch(entity, row, item, query, email) {
118
+ const a = row.attributes ?? {};
119
+ if (email) {
120
+ const emails = [a.email1, a.email2, a.email3].map((v) => (typeof v === "string" ? v.toLowerCase().trim() : ""));
121
+ return emails.includes(email.toLowerCase().trim());
122
+ }
123
+ const want = normalize(query);
124
+ if (normalize(item.label) === want)
125
+ return true;
126
+ if (PEOPLE.has(entity)) {
127
+ const reversed = [str(a.lastName), str(a.firstName)].filter(Boolean).join(" ");
128
+ return normalize(reversed) === want;
129
+ }
130
+ return false;
131
+ }
132
+ export function registerFindTool(server, policy) {
133
+ const entities = ALL_ENTITIES.filter((e) => !policy || isDomainAllowed(policy, ENTITY_DOMAIN[e]));
134
+ if (entities.length === 0)
135
+ return;
136
+ const [firstEntity, ...otherEntities] = entities;
137
+ if (firstEntity === undefined)
138
+ return;
139
+ const FindSchema = z
140
+ .object({
141
+ entity: z.enum([firstEntity, ...otherEntities]).describe("Type d'entité à résoudre."),
142
+ query: z
143
+ .string()
144
+ .min(1)
145
+ .describe("Libellé : « Prénom Nom » ou « Nom Prénom » (personnes), raison sociale (société), intitulé (opportunité, projet)."),
146
+ email: z
147
+ .string()
148
+ .email()
149
+ .optional()
150
+ .describe("Recherche par e-mail à la place du libellé (personnes et sociétés) — plus sûr qu'un nom."),
151
+ })
152
+ .strict();
153
+ server.registerTool("boond_find", {
154
+ title: "Résoudre un nom ou un e-mail en ID",
155
+ description: composeDescription({
156
+ purpose: "Résout un libellé (« Jean Dupont », « ACME », un intitulé de projet) ou un e-mail en ID BoondManager, pour un candidat, une ressource, un contact, une société, une opportunité ou un projet.",
157
+ when: "dès qu'une demande nomme une entité sans donner son ID — avant un `_get`, un `_update`, un onglet ou un filtre `perimeterManagers` / `companyId`.",
158
+ instead: "le `*_search` du domaine quand il faut une liste filtrée (états, périmètre, pagination) plutôt qu'une résolution.",
159
+ behaviour: [
160
+ "Choisit le champ à interroger : `fullName` (essayé dans les deux ordres, l'API attend `NOM#PRENOM`) puis texte libre pour les personnes, `name` pour les sociétés, `emails` quand `email` est fourni ; au plus 10 résultats.",
161
+ "Ne tranche jamais entre homonymes : plusieurs correspondances exactes → `isError` avec la liste (ID + détail) à soumettre à l'utilisateur ; une seule → `structuredContent.match.id`.",
162
+ "Aucune correspondance exacte mais des résultats proches → la liste est renvoyée sans `match` : confirmer avec l'utilisateur avant d'utiliser un ID.",
163
+ ],
164
+ returns: "`{ entity, query, count, match?, ambiguous?, items[{ id, label, detail?, exact }] }` et le même contenu en texte. Lecture seule.",
165
+ }),
166
+ inputSchema: FindSchema,
167
+ outputSchema: FindOutputSchema,
168
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
169
+ }, async (params, extra) => {
170
+ const { entity, query, email } = params;
171
+ const report = progressReporterFrom(extra);
172
+ let rows = [];
173
+ for (const attempt of searchAttempts(entity, query, email)) {
174
+ const response = await apiSearch(API_PATH[entity], buildSearchQuery({ ...attempt, pageSize: FIND_PAGE_SIZE }), report);
175
+ rows = Array.isArray(response.data) ? response.data : response.data ? [response.data] : [];
176
+ if (rows.length > 0)
177
+ break;
178
+ }
179
+ const items = rows.map((row) => {
180
+ const described = describeRow(entity, row);
181
+ return { id: row.id, ...described, exact: isExactMatch(entity, row, described, query, email) };
182
+ });
183
+ const exact = items.filter((i) => i.exact);
184
+ const structured = {
185
+ entity,
186
+ query: email ?? query,
187
+ count: items.length,
188
+ items,
189
+ ...(exact.length === 1 && exact[0] ? { match: { id: exact[0].id, label: exact[0].label } } : {}),
190
+ ...(exact.length > 1 ? { ambiguous: true } : {}),
191
+ };
192
+ const lines = items.map((i) => `- #${i.id} ${i.label}${i.detail ? ` (${i.detail})` : ""}${i.exact ? " ✓" : ""}`);
193
+ const what = email ?? query;
194
+ if (items.length === 0) {
195
+ return {
196
+ content: [{ type: "text", text: `Aucun(e) ${entity} trouvé(e) pour « ${what} ».` }],
197
+ structuredContent: structured,
198
+ };
199
+ }
200
+ if (exact.length > 1) {
201
+ return {
202
+ isError: true,
203
+ content: [
204
+ {
205
+ type: "text",
206
+ text: `Ambigu : ${exact.length} ${entity}(s) portent exactement « ${what} ». Demander à l'utilisateur lequel :\n${lines.join("\n")}`,
207
+ },
208
+ ],
209
+ structuredContent: structured,
210
+ };
211
+ }
212
+ const head = exact.length === 1 && exact[0]
213
+ ? `${entity} « ${what} » → ID ${exact[0].id} (${exact[0].label}).`
214
+ : `Aucune correspondance exacte pour « ${what} » — ${items.length} résultat(s) proche(s), à confirmer :`;
215
+ return {
216
+ content: [{ type: "text", text: `${head}\n${lines.join("\n")}` }],
217
+ structuredContent: structured,
218
+ };
219
+ });
220
+ }
221
+ //# sourceMappingURL=find.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/tools/find.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { AttachedFlagInput } from "../schemas/index.js";
3
+ /** `/flags` payload (issue #254): `name` + optional `mainManager` relationship (`models.flag`). */
4
+ export declare function buildFlagBody(params: Record<string, unknown>): unknown;
5
+ /** `POST /attached-flags` payload: the flag and the flagged record, both as relationships (`dependsOn` is the polymorphic pattern of `models.task`). */
6
+ export declare function buildAttachedFlagBody(params: AttachedFlagInput): unknown;
2
7
  export declare function registerFlagTools(server: McpServer): void;
3
8
  //# sourceMappingURL=flags.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAGzD"}
1
+ {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAmCjF,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAKtE;AAED,wJAAwJ;AACxJ,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAKxE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiGzD"}
@@ -1,12 +1,127 @@
1
- import { registerSearchTool, registerGetTool } from "./crud-factory.js";
1
+ import { z } from "zod";
2
+ import { AttachedFlagSchema, AttachedFlagsListSchema, FlagCreateSchema } from "../schemas/index.js";
3
+ import { apiRequest, formatListResponse } from "../services/boond-client.js";
4
+ import { buildJsonApiBody, registerCreateTool, registerGetTool, registerSearchTool } from "./crud-factory.js";
5
+ import { composeDescription } from "./description-builders.js";
2
6
  const OPTS = {
3
7
  entityName: "drapeau",
4
8
  entityNamePlural: "drapeaux",
5
9
  apiPath: "/flags",
6
10
  prefix: "boond_flags",
7
11
  };
12
+ /** API collection of each entity `attachedFlags.raml` covers. */
13
+ const ENTITY_PATH = {
14
+ candidate: "/candidates",
15
+ resource: "/resources",
16
+ contact: "/contacts",
17
+ company: "/companies",
18
+ opportunity: "/opportunities",
19
+ project: "/projects",
20
+ order: "/orders",
21
+ product: "/products",
22
+ purchase: "/purchases",
23
+ action: "/actions",
24
+ positioning: "/positionings",
25
+ invoice: "/invoices",
26
+ };
27
+ const AttachOutputSchema = z.object({
28
+ entity: z.string(),
29
+ id: z.string(),
30
+ flagId: z.string(),
31
+ attached: z.boolean(),
32
+ });
33
+ /** `/flags` payload (issue #254): `name` + optional `mainManager` relationship (`models.flag`). */
34
+ export function buildFlagBody(params) {
35
+ const { mainManagerId, ...attrs } = params;
36
+ return buildJsonApiBody("flag", attrs, undefined, {
37
+ mainManager: mainManagerId ? { id: String(mainManagerId), type: "resource" } : undefined,
38
+ });
39
+ }
40
+ /** `POST /attached-flags` payload: the flag and the flagged record, both as relationships (`dependsOn` is the polymorphic pattern of `models.task`). */
41
+ export function buildAttachedFlagBody(params) {
42
+ return buildJsonApiBody("attachedflag", {}, undefined, {
43
+ flag: { id: params.flagId, type: "flag" },
44
+ dependsOn: { id: params.id, type: params.entity },
45
+ });
46
+ }
8
47
  export function registerFlagTools(server) {
9
48
  registerSearchTool(server, OPTS);
10
49
  registerGetTool(server, OPTS, { withTab: false });
50
+ // Issue #254: writes. `POST /flags` and `POST|DELETE /attached-flags` are
51
+ // documented in the RAML (flags/search.raml, attachedFlags/search.raml);
52
+ // the POST bodies are not, and neither was exercised (production tenant).
53
+ registerCreateTool(server, OPTS, FlagCreateSchema, buildFlagBody, {
54
+ title: "Créer un drapeau",
55
+ description: composeDescription({
56
+ purpose: "Crée un drapeau (tag) réutilisable — « vivier Java Q4 », « à rappeler », « VIP ».",
57
+ when: "avant `boond_flags_attach` quand aucun drapeau existant ne convient (`boond_flags_search` d'abord).",
58
+ instead: "`boond_flags_attach` pour poser un drapeau existant sur un enregistrement.",
59
+ behaviour: [
60
+ "Écriture non idempotente : deux appels créent deux drapeaux homonymes.",
61
+ "Corps déduit de `models.flag` (`name`, `mainManager`) — non éprouvé sur un tenant de test.",
62
+ ],
63
+ returns: "confirmation et ID du drapeau (`structuredContent.id`).",
64
+ }),
65
+ });
66
+ server.registerTool("boond_flags_attached", {
67
+ title: "Drapeaux posés sur un enregistrement",
68
+ description: composeDescription({
69
+ purpose: "Liste les drapeaux (tags) posés sur un candidat, une ressource, un contact, une société, une opportunité, un projet, une commande, un produit, un achat, une action, un positionnement ou une facture.",
70
+ when: "pour savoir comment un enregistrement est tagué avant d'ajouter ou retirer un drapeau.",
71
+ instead: "`boond_flags_search` pour le catalogue des drapeaux existants (pas leurs rattachements).",
72
+ returns: "une ligne par drapeau posé (`GET /{entité}/{id}/attached-flags`). Lecture seule.",
73
+ }),
74
+ inputSchema: AttachedFlagsListSchema,
75
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
76
+ }, async (params) => {
77
+ const { entity, id } = params;
78
+ const response = await apiRequest(`${ENTITY_PATH[entity]}/${id}/attached-flags`);
79
+ return { content: [{ type: "text", text: formatListResponse(response, "drapeau posé") }] };
80
+ });
81
+ server.registerTool("boond_flags_attach", {
82
+ title: "Poser un drapeau sur un enregistrement",
83
+ description: composeDescription({
84
+ purpose: "Pose un drapeau existant sur un enregistrement (tagging) — `POST /attached-flags`.",
85
+ when: "pour marquer un lot de fiches après un tri (« ces 12 candidats → vivier Java Q4 ») : un appel par fiche.",
86
+ instead: "`boond_flags_create` si le drapeau n'existe pas encore ; `boond_flags_detach` pour le retirer.",
87
+ behaviour: [
88
+ "Corps JSON:API `{ relationships: { flag, dependsOn } }` déduit du modèle — la RAML ne documente que la route ; non éprouvé sur un tenant de test.",
89
+ "Idempotent côté intention : reposer un drapeau déjà présent ne doit rien changer.",
90
+ ],
91
+ returns: "`{ entity, id, flagId, attached: true }`.",
92
+ }),
93
+ inputSchema: AttachedFlagSchema,
94
+ outputSchema: AttachOutputSchema,
95
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
96
+ }, async (params) => {
97
+ const p = params;
98
+ await apiRequest("/attached-flags", "POST", buildAttachedFlagBody(p));
99
+ return {
100
+ content: [{ type: "text", text: `✅ Drapeau #${p.flagId} posé sur ${p.entity} #${p.id}.` }],
101
+ structuredContent: { entity: p.entity, id: p.id, flagId: p.flagId, attached: true },
102
+ };
103
+ });
104
+ server.registerTool("boond_flags_detach", {
105
+ title: "Retirer un drapeau d'un enregistrement",
106
+ description: composeDescription({
107
+ purpose: "Retire un drapeau d'un enregistrement — `DELETE /attached-flags?flag=&<entité>=` (route et paramètres documentés dans la RAML).",
108
+ when: "pour dé-taguer une fiche ; réversible par `boond_flags_attach`, le drapeau lui-même n'est pas supprimé.",
109
+ instead: "aucun outil ne supprime un drapeau du catalogue : un drapeau se retire fiche par fiche.",
110
+ behaviour: [
111
+ "Idempotent : retirer un drapeau absent n'échoue pas côté intention (l'erreur API éventuelle est remontée telle quelle).",
112
+ ],
113
+ returns: "`{ entity, id, flagId, attached: false }`.",
114
+ }),
115
+ inputSchema: AttachedFlagSchema,
116
+ outputSchema: AttachOutputSchema,
117
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
118
+ }, async (params) => {
119
+ const p = params;
120
+ await apiRequest("/attached-flags", "DELETE", undefined, { flag: p.flagId, [p.entity]: p.id });
121
+ return {
122
+ content: [{ type: "text", text: `✅ Drapeau #${p.flagId} retiré de ${p.entity} #${p.id}.` }],
123
+ structuredContent: { entity: p.entity, id: p.id, flagId: p.flagId, attached: false },
124
+ };
125
+ });
11
126
  }
12
127
  //# sourceMappingURL=flags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,IAAI,GAAG;IACX,UAAU,EAAE,SAAS;IACrB,gBAAgB,EAAE,UAAU;IAC5B,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,aAAa;CACtB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEpG,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,IAAI,GAAG;IACX,UAAU,EAAE,SAAS;IACrB,gBAAgB,EAAE,UAAU;IAC5B,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,aAAa;CACtB,CAAC;AAEF,iEAAiE;AACjE,MAAM,WAAW,GAAuC;IACtD,SAAS,EAAE,aAAa;IACxB,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,YAAY;IACrB,WAAW,EAAE,gBAAgB;IAC7B,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,UAAU;IAClB,WAAW,EAAE,eAAe;IAC5B,OAAO,EAAE,WAAW;CACrB,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;CACtB,CAAC,CAAC;AAEH,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAAC,MAA+B;IAC3D,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IAC3C,OAAO,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;QAChD,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;KACzF,CAAC,CAAC;AACL,CAAC;AAED,wJAAwJ;AACxJ,MAAM,UAAU,qBAAqB,CAAC,MAAyB;IAC7D,OAAO,gBAAgB,CAAC,cAAc,EAAE,EAAE,EAAE,SAAS,EAAE;QACrD,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;QACzC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;KAClD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAElD,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE;QAChE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,kBAAkB,CAAC;YAC9B,OAAO,EAAE,mFAAmF;YAC5F,IAAI,EAAE,qGAAqG;YAC3G,OAAO,EAAE,4EAA4E;YACrF,SAAS,EAAE;gBACT,wEAAwE;gBACxE,4FAA4F;aAC7F;YACD,OAAO,EAAE,yDAAyD;SACnE,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,sCAAsC;QAC7C,WAAW,EAAE,kBAAkB,CAAC;YAC9B,OAAO,EACL,wMAAwM;YAC1M,IAAI,EAAE,wFAAwF;YAC9F,OAAO,EAAE,0FAA0F;YACnG,OAAO,EAAE,kFAAkF;SAC5F,CAAC;QACF,WAAW,EAAE,uBAAuB;QACpC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACxG,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;QAC9B,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACjF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;IACtG,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EAAE,kBAAkB,CAAC;YAC9B,OAAO,EAAE,oFAAoF;YAC7F,IAAI,EAAE,0GAA0G;YAChH,OAAO,EAAE,gGAAgG;YACzG,SAAS,EAAE;gBACT,mJAAmJ;gBACnJ,mFAAmF;aACpF;YACD,OAAO,EAAE,2CAA2C;SACrD,CAAC;QACF,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE,kBAAkB;QAChC,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACzG,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,CAAC,GAAG,MAAM,CAAC;QACjB,MAAM,UAAU,CAAC,iBAAiB,EAAE,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;YACnG,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;SACpF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,wCAAwC;QAC/C,WAAW,EAAE,kBAAkB,CAAC;YAC9B,OAAO,EACL,iIAAiI;YACnI,IAAI,EAAE,yGAAyG;YAC/G,OAAO,EAAE,yFAAyF;YAClG,SAAS,EAAE;gBACT,yHAAyH;aAC1H;YACD,OAAO,EAAE,4CAA4C;SACtD,CAAC;QACF,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE,kBAAkB;QAChC,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACzG,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,CAAC,GAAG,MAAM,CAAC;QACjB,MAAM,UAAU,CAAC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/F,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,MAAM,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;YACpG,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;SACrF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /** `/forms` payload (issue #256): `template` (required), polymorphic `dependsOn`, `validator` / `recipient` (`models.form`). */
3
+ export declare function buildFormBody(params: Record<string, unknown>): unknown;
4
+ export declare function registerFormTools(server: McpServer): void;
5
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/tools/forms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,gIAAgI;AAChI,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAatE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoDzD"}
@@ -0,0 +1,64 @@
1
+ import { FormCreateSchema, FormDefaultSchema } from "../schemas/index.js";
2
+ import { apiRequest, formatDetailResponse } from "../services/boond-client.js";
3
+ import { buildJsonApiBody, registerCreateTool, registerGetTool } from "./crud-factory.js";
4
+ import { composeDescription } from "./description-builders.js";
5
+ const OPTS = { entityName: "formulaire", entityNamePlural: "formulaires", apiPath: "/forms", prefix: "boond_forms" };
6
+ /** `/forms` payload (issue #256): `template` (required), polymorphic `dependsOn`, `validator` / `recipient` (`models.form`). */
7
+ export function buildFormBody(params) {
8
+ const { templateId, resourceId, candidateId, validatorId, recipientId, ...attrs } = params;
9
+ const dependsOn = resourceId
10
+ ? { id: String(resourceId), type: "resource" }
11
+ : candidateId
12
+ ? { id: String(candidateId), type: "candidate" }
13
+ : undefined;
14
+ return buildJsonApiBody("form", attrs, undefined, {
15
+ template: { id: String(templateId), type: "formtemplate" },
16
+ dependsOn,
17
+ validator: validatorId ? { id: String(validatorId), type: "resource" } : undefined,
18
+ recipient: recipientId ? { id: String(recipientId), type: "resource" } : undefined,
19
+ });
20
+ }
21
+ export function registerFormTools(server) {
22
+ server.registerTool("boond_forms_default", {
23
+ title: "Référentiels d'un formulaire",
24
+ description: composeDescription({
25
+ purpose: "Renvoie un formulaire vide pré-rempli pour un modèle et une entité (questions du modèle, validateur et destinataire par défaut).",
26
+ when: "AVANT `boond_forms_create`, pour connaître les questions et les dates que le modèle attend.",
27
+ instead: "`boond_forms_get` pour un formulaire déjà créé.",
28
+ behaviour: ["Lecture seule (`GET /forms/default?template=&resource=`) ; la réponse est rendue telle quelle."],
29
+ returns: "JSON du formulaire vide (questions incluses).",
30
+ }),
31
+ inputSchema: FormDefaultSchema,
32
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
33
+ }, async (params) => {
34
+ const response = await apiRequest("/forms/default", "GET", undefined, {
35
+ template: params.templateId,
36
+ resource: params.resourceId,
37
+ });
38
+ return { content: [{ type: "text", text: formatDetailResponse(response) }] };
39
+ });
40
+ registerGetTool(server, OPTS, {
41
+ withTab: false,
42
+ title: "Détails d'un formulaire",
43
+ description: composeDescription({
44
+ purpose: "Récupère un formulaire (entretien annuel, bilan de fin de mission, évaluation) par son ID : questions, réponses, état, validateur.",
45
+ when: "après `boond_forms_create`, ou depuis l'ID lu dans les relations d'une ressource / d'un candidat.",
46
+ instead: "il n'existe pas de liste des formulaires côté API (`GET /forms` n'est pas documenté) ; `boond_tasks_get` avec `entity: \"form\"` pour ses tâches.",
47
+ returns: "JSON du formulaire (attributs + relations). Lecture seule.",
48
+ }),
49
+ });
50
+ registerCreateTool(server, OPTS, FormCreateSchema, buildFormBody, {
51
+ title: "Créer un formulaire",
52
+ description: composeDescription({
53
+ purpose: "Instancie un formulaire à partir d'un modèle (entretien annuel, bilan de fin de mission, évaluation) pour une ressource ou un candidat.",
54
+ when: "pour lancer une campagne d'évaluation ou un bilan, formulaire par formulaire.",
55
+ instead: "`boond_forms_default` d'abord, pour les questions et les dates attendues par le modèle.",
56
+ behaviour: [
57
+ "Corps déduit de `models.form` (`template`, `dependsOn`, `validator`, `recipient`, `validateDate`, `remindDate`) — non éprouvé sur un tenant de test ; exactement une entité visée parmi `resourceId` / `candidateId`.",
58
+ "Écriture non idempotente.",
59
+ ],
60
+ returns: "confirmation et ID du formulaire (`structuredContent.id`).",
61
+ }),
62
+ });
63
+ }
64
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/tools/forms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ /** `/groupments` payload (issue #256): `project` relationship (create), `deliveryIds` → `deliveries`, `note` → `informationComments` (`models.groupment`). */
3
+ export declare function buildGroupmentBody(params: Record<string, unknown>): unknown;
4
+ export declare function registerGroupmentTools(server: McpServer): void;
5
+ //# sourceMappingURL=groupments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupments.d.ts","sourceRoot":"","sources":["../../src/tools/groupments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,8JAA8J;AAC9J,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAe3E;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuD9D"}