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,12 +1,75 @@
1
- import { registerSearchTool, registerGetTool } from "./crud-factory.js";
1
+ import { TasksGetSchema, TodolistCreateSchema } from "../schemas/index.js";
2
+ import { apiRequest, formatTabResponse } from "../services/boond-client.js";
3
+ import { buildJsonApiBody, registerCreateTool, registerGetTool, registerSearchTool } from "./crud-factory.js";
4
+ import { composeDescription } from "./description-builders.js";
2
5
  const OPTS = {
3
6
  entityName: "todolist",
4
7
  entityNamePlural: "todolists",
5
8
  apiPath: "/todolists",
6
9
  prefix: "boond_todolists",
7
10
  };
11
+ /** API collection of each entity `tasks.raml` covers (14). */
12
+ const TASK_ENTITY_PATH = {
13
+ candidate: "/candidates",
14
+ resource: "/resources",
15
+ contact: "/contacts",
16
+ company: "/companies",
17
+ opportunity: "/opportunities",
18
+ project: "/projects",
19
+ order: "/orders",
20
+ product: "/products",
21
+ purchase: "/purchases",
22
+ positioning: "/positionings",
23
+ invoice: "/invoices",
24
+ contract: "/contracts",
25
+ delivery: "/deliveries",
26
+ payment: "/payments",
27
+ form: "/forms",
28
+ };
29
+ /** `/todolists` payload (issue #254): `agencyIds` → `agencies` relationship, the rest as attributes (`models.todolist`). */
30
+ export function buildTodolistBody(params) {
31
+ const { agencyIds, ...attrs } = params;
32
+ const body = buildJsonApiBody("todolist", attrs);
33
+ if (Array.isArray(agencyIds) && agencyIds.length > 0) {
34
+ body.data.relationships = { agencies: { data: agencyIds.map((id) => ({ id: String(id), type: "agency" })) } };
35
+ }
36
+ return body;
37
+ }
8
38
  export function registerTodolistTools(server) {
9
39
  registerSearchTool(server, OPTS);
10
40
  registerGetTool(server, OPTS, { withTab: false });
41
+ // Issue #254: `POST /todolists` is documented (todolists/search.raml), its
42
+ // body is not — built from `models.todolist`, not exercised.
43
+ registerCreateTool(server, OPTS, TodolistCreateSchema, buildTodolistBody, {
44
+ title: "Créer une todolist",
45
+ description: composeDescription({
46
+ purpose: "Crée une todolist (modèle de tâches) avec ses tâches ordonnées, applicable à un type de fiche.",
47
+ when: "pour définir une checklist réutilisable (onboarding consultant, préparation de facturation…).",
48
+ instead: "`boond_todolists_search` d'abord : l'API ne déduplique pas les titres.",
49
+ behaviour: [
50
+ "Corps déduit de `models.todolist` (`title`, `profile`, `profileTypesOf`, `profileStates`, `tasks[]`, relation `agencies`) — non éprouvé sur un tenant de test.",
51
+ "Les tâches d'une fiche (`boond_tasks_get`) ne se créent pas ici : aucune route de création de tâche n'est documentée.",
52
+ ],
53
+ returns: "confirmation et ID de la todolist (`structuredContent.id`).",
54
+ }),
55
+ });
56
+ // Issue #254: `GET /{entity}/{id}/tasks` exists on 14 entities (tasks.raml);
57
+ // one parameterised tool rather than 14 tabs. No write: the RAML documents
58
+ // only `get`, and no `/tasks` collection exists (404 on the doc site).
59
+ server.registerTool("boond_tasks_get", {
60
+ title: "Tâches d'un enregistrement",
61
+ description: composeDescription({
62
+ purpose: "Liste les tâches (todolist instanciée) d'un candidat, d'une ressource, d'un contact, d'une société, d'une opportunité, d'un projet, d'une commande, d'un produit, d'un achat, d'un positionnement, d'une facture, d'un contrat, d'une prestation ou d'un paiement.",
63
+ when: "pour voir où en est la checklist d'une fiche (tâches faites / à faire, validées par qui).",
64
+ instead: "`boond_actions_search` pour les rappels datés — une tâche est un item de checklist, une action un événement daté. Aucune route de création de tâche n'est documentée par l'API.",
65
+ returns: "les tâches (`description`, `state`, `row`, `validatedAt`, `validatedBy`, sous-tâches). Lecture seule.",
66
+ }),
67
+ inputSchema: TasksGetSchema,
68
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
69
+ }, async (params) => {
70
+ const { entity, id } = params;
71
+ const response = await apiRequest(`${TASK_ENTITY_PATH[entity]}/${id}/tasks`);
72
+ return { content: [{ type: "text", text: formatTabResponse(response) }] };
73
+ });
11
74
  }
12
75
  //# sourceMappingURL=todolists.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"todolists.js","sourceRoot":"","sources":["../../src/tools/todolists.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,IAAI,GAAG;IACX,UAAU,EAAE,UAAU;IACtB,gBAAgB,EAAE,WAAW;IAC7B,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,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":"todolists.js","sourceRoot":"","sources":["../../src/tools/todolists.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"usage-guidance.d.ts","sourceRoot":"","sources":["../../src/tools/usage-guidance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAiNxD,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAWxF;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAShG"}
1
+ {"version":3,"file":"usage-guidance.d.ts","sourceRoot":"","sources":["../../src/tools/usage-guidance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA2NxD,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAWxF;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAShG"}
@@ -41,9 +41,9 @@ export const USAGE_GUIDANCE = {
41
41
  "*trouver* l'ID : celui-ci exige un ID exact, suffixe compris (`123_resume`), et un ID tronqué désigne un autre document.",
42
42
  },
43
43
  boond_documents_create: {
44
- when: "pour attacher à une entité un fichier accessible par URL publique.",
45
- instead: "aucune alternative pour un fichier local : le serveur MCP ne lit jamais le disque, c'est BoondManager qui " +
46
- "télécharge l'URL. Il faut donc d'abord héberger le fichier quelque part d'atteignable.",
44
+ when: "pour attacher un fichier à une entité : URL publique, fichier local (si l'opérateur l'a autorisé) ou petit fichier en base64.",
45
+ instead: "aucune alternative : c'est le seul outil d'écriture de documents. Si `filePath` est refusé (transport HTTP ou " +
46
+ "BOOND_MCP_UPLOAD_DIRS non défini), passer par `fileUrl` ou, sous 2 Mo, par `fileContent`.",
47
47
  },
48
48
  boond_documents_delete: {
49
49
  when: "pour retirer une pièce jointe erronée, sur demande explicite de l'utilisateur.",
@@ -154,6 +154,15 @@ export const USAGE_GUIDANCE = {
154
154
  instead: "`boond_resources_reference_create` / `_update` / `_delete` pour les seules expériences professionnelles : " +
155
155
  "elles vivent dans le même bloc, mais ces outils évitent d'avoir à republier le tableau entier.",
156
156
  },
157
+ boond_candidates_technical_data_update: {
158
+ when: "pour coder le dossier technique d'un candidat (profils, secteurs, outils, langues, expérience, formation).",
159
+ instead: "`boond_candidates_update` pour l'onglet Information (coordonnées, disponibilité, mobilité, évaluation) ; " +
160
+ "`boond_resources_technical_data_update` pour un collaborateur interne.",
161
+ },
162
+ boond_candidates_administrative_update: {
163
+ when: "pour renseigner nationalité, salaire souhaité ou contrat souhaité d'un candidat.",
164
+ instead: "`boond_candidates_technical_data_update` pour les compétences et le parcours.",
165
+ },
157
166
  boond_resources_reference_create: {
158
167
  instead: "`boond_resources_technical_data_update` pour les autres blocs du dossier technique (compétences, " +
159
168
  "formations, langues), que cet outil ne touche pas.",
@@ -1 +1 @@
1
- {"version":3,"file":"usage-guidance.js","sourceRoot":"","sources":["../../src/tools/usage-guidance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage-guidance.js","sourceRoot":"","sources":["../../src/tools/usage-guidance.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,12 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ export declare const ValidationDecisionOutputSchema: z.ZodObject<{
4
+ id: z.ZodString;
5
+ decided: z.ZodBoolean;
6
+ state: z.ZodOptional<z.ZodString>;
7
+ documentType: z.ZodOptional<z.ZodString>;
8
+ documentId: z.ZodOptional<z.ZodString>;
9
+ reason: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strip>;
2
11
  export declare function registerValidationTools(server: McpServer): void;
3
12
  //# sourceMappingURL=validations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/tools/validations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0D/D"}
1
+ {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/tools/validations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,eAAO,MAAM,8BAA8B;;;;;;;iBAUzC,CAAC;AAcH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoH/D"}
@@ -1,7 +1,34 @@
1
- import { IdSchema, ValidationSearchSchema } from "../schemas/index.js";
1
+ import { z } from "zod";
2
+ import { IdSchema, ValidationDecisionSchema, ValidationSearchSchema } from "../schemas/index.js";
3
+ import { readString } from "../config/env.js";
4
+ import { isFeatureDisabled } from "../config/env-flags.js";
5
+ import { buildJsonApiBody, confirmChoice } from "./crud-factory.js";
6
+ import { composeDescription } from "./description-builders.js";
2
7
  import { apiRequest, apiSearch, buildSearchQuery, formatListResponse, formatDetailResponse, } from "../services/boond-client.js";
3
8
  import { progressReporterFrom } from "../services/progress.js";
4
9
  import { defaultGetDescription } from "./description-builders.js";
10
+ const DECISION_STATE = { validate: "validated", reject: "rejected" };
11
+ export const ValidationDecisionOutputSchema = z.object({
12
+ id: z.string(),
13
+ decided: z.boolean().describe("false quand l'utilisateur a refusé la confirmation (aucun appel API)"),
14
+ state: z.string().optional().describe("État demandé (`validated` / `rejected`)"),
15
+ documentType: z
16
+ .string()
17
+ .optional()
18
+ .describe("Type du document validé (timesreport / absencesreport / expensesreport)"),
19
+ documentId: z.string().optional(),
20
+ reason: z.string().optional(),
21
+ });
22
+ /** `BOOND_MCP_CONFIRM_REJECT=0|false|no|off` opts out of the confirmation prompt on a rejection. */
23
+ function rejectConfirmationDisabled() {
24
+ return isFeatureDisabled(readString("BOOND_MCP_CONFIRM_REJECT"));
25
+ }
26
+ function documentRef(response) {
27
+ const entity = Array.isArray(response.data) ? response.data[0] : response.data;
28
+ const rel = entity?.relationships?.dependsOn?.data;
29
+ const ref = Array.isArray(rel) ? rel[0] : rel;
30
+ return ref ? { documentType: ref.type, documentId: ref.id } : {};
31
+ }
5
32
  export function registerValidationTools(server) {
6
33
  server.registerTool("boond_validations_search", {
7
34
  title: "Rechercher des validations",
@@ -9,14 +36,6 @@ export function registerValidationTools(server) {
9
36
 
10
37
  ⚠️ \`startMonth\` et \`endMonth\` (YYYY-MM) sont requis par l'API.
11
38
 
12
- Args:
13
- - startMonth (string, requis): YYYY-MM (ex: '2025-01')
14
- - endMonth (string, requis): YYYY-MM
15
- - documentTypes (string[], optional): 'absencesReport' | 'timesReport' | 'expensesReport'
16
- - validationStates (string[], optional): 'waitingForValidation' | 'validated' | 'rejected'
17
- - resourceTypes (number[], optional)
18
- - keywords (string, optional): préfixes 'TPS', 'EXP', 'ABS', 'COMP'
19
-
20
39
  Returns: Liste des validations correspondantes.`,
21
40
  inputSchema: ValidationSearchSchema,
22
41
  annotations: {
@@ -51,5 +70,63 @@ Returns: Liste des validations correspondantes.`,
51
70
  content: [{ type: "text", text: formatDetailResponse(response) }],
52
71
  };
53
72
  });
73
+ // Issue #251: approve / reject a CRA, an expense report or an absence request.
74
+ server.registerTool("boond_validations_update", {
75
+ title: "Valider ou refuser un CRA / une note de frais / une absence",
76
+ description: composeDescription({
77
+ purpose: "Approuve (`validate`) ou refuse (`reject`) une validation en attente : CRA, note de frais ou demande d'absence.",
78
+ when: 'après `boond_validations_search` (`validationStates: ["waitingForValidation"]`) et l\'examen du document (`boond_timesheets_get`, `boond_expenses_get`, `boond_absences_get`).',
79
+ instead: "`boond_validations_get` pour relire la validation avant de décider ; il n'existe pas d'autre chemin d'écriture sur le workflow de validation (`state` n'est pas un champ des CRA / notes / absences).",
80
+ behaviour: [
81
+ "`PUT /validations/{id}` avec `state: validated | rejected` (le vocabulaire de `validationStates`) et `reason`. Route déduite du modèle `validation` et non éprouvée sur un tenant de test : un 404 / 405 doit être remonté tel quel.",
82
+ "Un **refus** demande une confirmation à l'utilisateur final si le client MCP déclare la capacité `elicitation` (désactivable par `BOOND_MCP_CONFIRM_REJECT=0`) ; un refus de confirmer renvoie `decided: false` sans appel API.",
83
+ "Idempotent : rejouer la même décision renvoie le même état.",
84
+ ],
85
+ returns: "`{ id, decided, state, documentType, documentId, reason? }` et la fiche de la validation mise à jour.",
86
+ }),
87
+ inputSchema: ValidationDecisionSchema,
88
+ outputSchema: ValidationDecisionOutputSchema,
89
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
90
+ }, async (params) => {
91
+ const { id, decision, reason } = params;
92
+ const state = DECISION_STATE[decision];
93
+ if (decision === "reject") {
94
+ const confirmation = await confirmChoice(server, {
95
+ disabled: rejectConfirmationDisabled(),
96
+ message: `Refuser la validation #${id} dans BoondManager${reason ? ` (motif : ${reason})` : ""} ? Le demandeur sera notifié par le workflow.`,
97
+ title: `Refus de la validation #${id}`,
98
+ description: "Choisir « Refuser » pour confirmer, sinon rien ne sera modifié.",
99
+ confirmTitle: "Refuser",
100
+ });
101
+ if (!confirmation.confirmed) {
102
+ return {
103
+ content: [
104
+ {
105
+ type: "text",
106
+ text: `⛔ Refus de la validation #${id} annulé (${confirmation.reason ?? "non confirmé"}).`,
107
+ },
108
+ ],
109
+ structuredContent: { id, decided: false, ...(confirmation.reason ? { reason: confirmation.reason } : {}) },
110
+ };
111
+ }
112
+ }
113
+ const body = buildJsonApiBody("validation", { state, ...(reason !== undefined ? { reason } : {}) }, id);
114
+ const response = await apiRequest(`/validations/${id}`, "PUT", body);
115
+ return {
116
+ content: [
117
+ {
118
+ type: "text",
119
+ text: `✅ Validation #${id} → ${state}.\n\n${formatDetailResponse(response)}`,
120
+ },
121
+ ],
122
+ structuredContent: {
123
+ id,
124
+ decided: true,
125
+ state,
126
+ ...documentRef(response),
127
+ ...(reason !== undefined ? { reason } : {}),
128
+ },
129
+ };
130
+ });
54
131
  }
55
132
  //# sourceMappingURL=validations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validations.js","sourceRoot":"","sources":["../../src/tools/validations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EACL,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE;;;;;;;;;;;;gDAY6B;QAC1C,WAAW,EAAE,sBAAsB;QACnC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,KAAc,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QACrF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;SACtG,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,qBAAqB,CAAC;YACjC,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,EAAE,mBAAmB,EAAE;YAC7F,OAAO,EAAE,KAAK;SACf,CAAC;QACF,WAAW,EAAE,QAAQ;QACrB,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC3E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"validations.js","sourceRoot":"","sources":["../../src/tools/validations.ts"],"names":[],"mappings":"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"}
@@ -47,7 +47,7 @@ export function registerWorkflowTools(server, policy) {
47
47
  idempotentHint: true,
48
48
  openWorldHint: false,
49
49
  },
50
- }, async (params) => {
50
+ }, (params) => {
51
51
  const text = p.build((params ?? {}));
52
52
  return {
53
53
  content: [{ type: "text", text }],
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAqB,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAqB;IAC5E,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,sEAAsE;QACtE,mEAAmE;QACnE,yDAAyD;QACzD,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAAE,SAAS;QAC5E,MAAM,CAAC,YAAY,CACjB,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAC1B;YACE,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,kBAAkB,CAAC;gBAC9B,OAAO,EAAE,CAAC,CAAC,WAAW;gBACtB,IAAI,EAAE,kIAAkI;gBACxI,OAAO,EACL,mBAAmB,CAAC,CAAC,IAAI,gDAAgD;oBACzE,8EAA8E;oBAC9E,mDAAmD;gBACrD,SAAS,EAAE;oBACT,sGAAsG;iBACvG;gBACD,OAAO,EACL,iGAAiG;oBACjG,0EAA0E;aAC7E,CAAC;YACF,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,KAAK;aACrB;SACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAuC,CAAC,CAAC;YAC3E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;aAC3C,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/tools/workflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAqB,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAqB;IAC5E,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,sEAAsE;QACtE,mEAAmE;QACnE,yDAAyD;QACzD,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAAE,SAAS;QAC5E,MAAM,CAAC,YAAY,CACjB,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAC1B;YACE,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,kBAAkB,CAAC;gBAC9B,OAAO,EAAE,CAAC,CAAC,WAAW;gBACtB,IAAI,EAAE,kIAAkI;gBACxI,OAAO,EACL,mBAAmB,CAAC,CAAC,IAAI,gDAAgD;oBACzE,8EAA8E;oBAC9E,mDAAmD;gBACrD,SAAS,EAAE;oBACT,sGAAsG;iBACvG;gBACD,OAAO,EACL,iGAAiG;oBACjG,0EAA0E;aAC7E,CAAC;YACF,WAAW,EAAE,CAAC,CAAC,UAAU;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,KAAK;aACrB;SACF,EACD,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAuC,CAAC,CAAC;YAC3E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;aAC3C,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { type Server } from "node:http";
1
2
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
3
  export interface HttpTransportOptions {
3
4
  host: string;
@@ -43,21 +44,94 @@ export interface HttpTransportOptions {
43
44
  * or BOOND_API_TOKEN, or BasicAuth). Intended for single-tenant / self-hosted
44
45
  * deployments where the operator owns both the server and the credentials.
45
46
  * Set `BOOND_HTTP_STATIC_AUTH=true` to enable via `resolveHttpOptions()`.
47
+ *
48
+ * In this mode **nothing** authenticates the MCP client: whoever reaches the
49
+ * port acts with the operator's BoondManager rights. `apiKey` is what closes
50
+ * that (issue #230), and `assertStaticAuthPolicy` refuses to start without
51
+ * one on a non-loopback bind.
46
52
  */
47
53
  staticAuth?: boolean;
54
+ /**
55
+ * Shared secret the MCP client must present in static-auth mode, as
56
+ * `Authorization: Bearer <key>` or `X-Api-Key: <key>`. Compared in constant
57
+ * time. Set via `MCP_HTTP_API_KEY`. Ignored (with a warning) in OAuth mode,
58
+ * where the Bearer is the BoondManager access token.
59
+ */
60
+ apiKey?: string;
61
+ /**
62
+ * Explicit opt-out of the "static auth off loopback requires an API key"
63
+ * start-up refusal — for a deployment whose network is the boundary (a
64
+ * private gateway). Set via `MCP_HTTP_INSECURE_STATIC_AUTH=1`.
65
+ */
66
+ insecureStaticAuth?: boolean;
67
+ /**
68
+ * Node `server.keepAliveTimeout`: how long an idle keep-alive connection is
69
+ * kept open. Must exceed the idle timeout of any load balancer in front
70
+ * (60 s AWS ALB, 75 s nginx by default) — Node's 5 s default is below both,
71
+ * which is how a LB reuses a connection Node just closed and answers `502`
72
+ * (issue #237). Default 65 s; env `MCP_HTTP_KEEP_ALIVE_TIMEOUT_MS`.
73
+ */
74
+ keepAliveTimeoutMs?: number;
75
+ /**
76
+ * Node `server.headersTimeout`: budget to receive a request's headers. Node
77
+ * requires it above `keepAliveTimeout`; a lower value is bumped to
78
+ * `keepAliveTimeoutMs + 1000` with a warning. Default 66 s; env
79
+ * `MCP_HTTP_HEADERS_TIMEOUT_MS`.
80
+ */
81
+ headersTimeoutMs?: number;
82
+ /**
83
+ * Node `server.requestTimeout`: budget to receive a whole request (headers +
84
+ * body). Generous because it also bounds slow clients on long tool calls.
85
+ * Default 5 min; env `MCP_HTTP_REQUEST_TIMEOUT_MS`.
86
+ */
87
+ requestTimeoutMs?: number;
88
+ /**
89
+ * OAuth mode only (issue #234): validate each Bearer against BoondManager
90
+ * (`GET /application/current-user`, cached per token for
91
+ * `tokenValidationTtlMs`) **before** dispatching, so an expired or revoked
92
+ * token is answered with HTTP `401` + `WWW-Authenticate: … error="invalid_token"`
93
+ * (RFC 6750 §3.1) — the signal a spec-compliant MCP client turns into a new
94
+ * authorization flow. Without it the 401 only surfaces inside a `tools/call`
95
+ * result, which no client re-authorizes from. Off by default because it
96
+ * costs one BoondManager call per token per TTL; env `MCP_HTTP_VALIDATE_TOKEN`.
97
+ */
98
+ validateToken?: boolean;
99
+ /** Positive/negative cache lifetime of a token validation, in ms. Default 60 s; env `MCP_HTTP_TOKEN_VALIDATION_TTL_MS`. */
100
+ tokenValidationTtlMs?: number;
101
+ /**
102
+ * Grace period `close()` gives in-flight connections (an open SSE stream, a
103
+ * request mid-body) before destroying them with `closeAllConnections()`.
104
+ * Idle keep-alive connections are closed immediately. Default 10 s; env
105
+ * `MCP_HTTP_SHUTDOWN_TIMEOUT_MS`.
106
+ */
107
+ shutdownTimeoutMs?: number;
48
108
  }
49
109
  export interface HttpServerHandle {
110
+ /**
111
+ * Stop accepting connections, close idle ones now and in-flight ones after
112
+ * `shutdownTimeoutMs`, then resolve. Idempotent: a second call (a second
113
+ * SIGTERM) returns the same promise instead of failing on an already-closed
114
+ * server (issue #237).
115
+ */
50
116
  close: () => Promise<void>;
51
117
  address: {
52
118
  host: string;
53
119
  port: number;
54
120
  path: string;
55
121
  };
122
+ /** The underlying Node server — for observability (applied timeouts) and tests. */
123
+ server: Server;
56
124
  /** Current count of live stateful sessions (always 0 in stateless mode). */
57
125
  sessionCount: () => number;
58
126
  /** Manually trigger an idle sweep; returns the number of sessions reaped. */
59
127
  sweepIdleSessions: () => Promise<number>;
60
128
  }
129
+ export declare const DEFAULT_KEEP_ALIVE_TIMEOUT_MS = 65000;
130
+ export declare const DEFAULT_HEADERS_TIMEOUT_MS = 66000;
131
+ export declare const DEFAULT_REQUEST_TIMEOUT_MS = 300000;
132
+ export declare const DEFAULT_SHUTDOWN_TIMEOUT_MS = 10000;
133
+ export declare const DEFAULT_TOKEN_VALIDATION_TTL_MS = 60000;
134
+ export declare const MAX_TOKEN_VALIDATION_ENTRIES = 500;
61
135
  /**
62
136
  * Resolves the effective Host header allow-list given user options and the
63
137
  * bound listen interface. Returns an empty array when validation is disabled
@@ -109,5 +183,47 @@ export declare function isOriginAllowed(policy: OriginPolicy, origin: string): b
109
183
  */
110
184
  export declare function isDiscoveryPath(reqUrl: string | undefined, mcpPath: string): boolean;
111
185
  export declare function resolveHttpOptions(): HttpTransportOptions;
186
+ /**
187
+ * The socket timeouts applied to the Node server, with the one invariant Node
188
+ * itself enforces made explicit: `headersTimeout` must be strictly greater
189
+ * than `keepAliveTimeout`, otherwise a kept-alive connection can be timed out
190
+ * while waiting for its next request's headers. A configuration that breaks it
191
+ * is repaired (headers = keep-alive + 1 s) and logged rather than refused.
192
+ */
193
+ export declare function resolveServerTimeouts(options: Pick<HttpTransportOptions, "keepAliveTimeoutMs" | "headersTimeoutMs" | "requestTimeoutMs">): {
194
+ keepAliveTimeout: number;
195
+ headersTimeout: number;
196
+ requestTimeout: number;
197
+ coerced: boolean;
198
+ };
199
+ /**
200
+ * Refuses a static-auth deployment that would expose the operator's
201
+ * BoondManager credentials to anyone who can reach the port (issue #230).
202
+ *
203
+ * Static auth skips the Bearer check entirely, and off loopback the `Host` /
204
+ * `Origin` validations are disabled too — the Docker image binds `0.0.0.0` by
205
+ * default — so with no `apiKey` the endpoint is an anonymous proxy carrying
206
+ * the operator's read *and* write rights. Loopback is exempt (only local
207
+ * processes can connect), and `insecureStaticAuth` is the explicit,
208
+ * named opt-out for a deployment whose network is the boundary. Throwing here
209
+ * rather than warning is deliberate: a warning on stderr is exactly what an
210
+ * operator running `docker run -e BOOND_HTTP_STATIC_AUTH=true` does not read.
211
+ */
212
+ export declare function assertStaticAuthPolicy(options: HttpTransportOptions): void;
213
+ /**
214
+ * Constant-time comparison of a presented API key against the configured one.
215
+ *
216
+ * `timingSafeEqual` throws on buffers of different lengths, so a length
217
+ * mismatch is answered by comparing the expected key against itself first —
218
+ * the call still costs one full comparison — and then returning `false`. The
219
+ * key's *length* is therefore observable, which is acceptable: it is not
220
+ * secret for a random key (the README generates 32 random bytes), and the
221
+ * alternative — hashing both sides to equalise lengths — reads to static
222
+ * analysers as a password stored under a fast hash, which it is not.
223
+ */
224
+ export declare function isApiKeyMatch(presented: string | null | undefined, expected: string): boolean;
225
+ /** Max accepted request body size (1 MiB). MCP initialize payloads are tiny;
226
+ * this caps the memory a single authenticated request can force us to buffer. */
227
+ export declare const MAX_BODY_BYTES: number;
112
228
  export declare function startHttpTransport(createServerFactory: () => McpServer, options: HttpTransportOptions): Promise<HttpServerHandle>;
113
229
  //# sourceMappingURL=http.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,4EAA4E;IAC5E,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AA8CD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmB5F;AAwCD,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;;OAIG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAkBpH;AAkBD,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAK7E;AAKD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGpF;AAiBD,wBAAgB,kBAAkB,IAAI,oBAAoB,CA2BzD;AAkFD,wBAAsB,kBAAkB,CACtC,mBAAmB,EAAE,MAAM,SAAS,EACpC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAmT3B"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}