boondmanager-mcp-server 2.6.2 → 2.7.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 (70) hide show
  1. package/README.md +115 -4
  2. package/dist/schemas/index.d.ts +29 -3
  3. package/dist/schemas/index.d.ts.map +1 -1
  4. package/dist/schemas/index.js +90 -17
  5. package/dist/schemas/index.js.map +1 -1
  6. package/dist/services/boond-client.d.ts +8 -0
  7. package/dist/services/boond-client.d.ts.map +1 -1
  8. package/dist/services/boond-client.js +15 -14
  9. package/dist/services/boond-client.js.map +1 -1
  10. package/dist/services/logger.d.ts +8 -0
  11. package/dist/services/logger.d.ts.map +1 -1
  12. package/dist/services/logger.js +26 -1
  13. package/dist/services/logger.js.map +1 -1
  14. package/dist/tools/accounts.d.ts.map +1 -1
  15. package/dist/tools/accounts.js +9 -37
  16. package/dist/tools/accounts.js.map +1 -1
  17. package/dist/tools/actions.d.ts.map +1 -1
  18. package/dist/tools/actions.js +56 -2
  19. package/dist/tools/actions.js.map +1 -1
  20. package/dist/tools/agencies.d.ts.map +1 -1
  21. package/dist/tools/agencies.js +9 -37
  22. package/dist/tools/agencies.js.map +1 -1
  23. package/dist/tools/business-units.d.ts.map +1 -1
  24. package/dist/tools/business-units.js +9 -37
  25. package/dist/tools/business-units.js.map +1 -1
  26. package/dist/tools/calendars.d.ts.map +1 -1
  27. package/dist/tools/calendars.js +9 -37
  28. package/dist/tools/calendars.js.map +1 -1
  29. package/dist/tools/crud-factory.d.ts +33 -3
  30. package/dist/tools/crud-factory.d.ts.map +1 -1
  31. package/dist/tools/crud-factory.js +39 -18
  32. package/dist/tools/crud-factory.js.map +1 -1
  33. package/dist/tools/expenses.d.ts.map +1 -1
  34. package/dist/tools/expenses.js +25 -100
  35. package/dist/tools/expenses.js.map +1 -1
  36. package/dist/tools/flags.d.ts.map +1 -1
  37. package/dist/tools/flags.js +9 -37
  38. package/dist/tools/flags.js.map +1 -1
  39. package/dist/tools/invoices.d.ts.map +1 -1
  40. package/dist/tools/invoices.js +26 -80
  41. package/dist/tools/invoices.js.map +1 -1
  42. package/dist/tools/logs.d.ts.map +1 -1
  43. package/dist/tools/logs.js +9 -33
  44. package/dist/tools/logs.js.map +1 -1
  45. package/dist/tools/opportunities.d.ts.map +1 -1
  46. package/dist/tools/opportunities.js +28 -20
  47. package/dist/tools/opportunities.js.map +1 -1
  48. package/dist/tools/orders.d.ts.map +1 -1
  49. package/dist/tools/orders.js +22 -95
  50. package/dist/tools/orders.js.map +1 -1
  51. package/dist/tools/poles.d.ts.map +1 -1
  52. package/dist/tools/poles.js +9 -37
  53. package/dist/tools/poles.js.map +1 -1
  54. package/dist/tools/roles.d.ts.map +1 -1
  55. package/dist/tools/roles.js +9 -37
  56. package/dist/tools/roles.js.map +1 -1
  57. package/dist/tools/threads.d.ts.map +1 -1
  58. package/dist/tools/threads.js +9 -37
  59. package/dist/tools/threads.js.map +1 -1
  60. package/dist/tools/todolists.d.ts.map +1 -1
  61. package/dist/tools/todolists.js +9 -37
  62. package/dist/tools/todolists.js.map +1 -1
  63. package/dist/tools/webhooks.d.ts.map +1 -1
  64. package/dist/tools/webhooks.js +9 -37
  65. package/dist/tools/webhooks.js.map +1 -1
  66. package/dist/transports/http.d.ts.map +1 -1
  67. package/dist/transports/http.js +18 -9
  68. package/dist/transports/http.js.map +1 -1
  69. package/manifest.json +2 -2
  70. package/package.json +2 -2
@@ -1,10 +1,24 @@
1
- import { ExpenseSearchSchema, ExpenseCreateSchema, ExpenseUpdateSchema, IdSchema } from "../schemas/index.js";
2
- import { apiRequest, buildSearchQuery, formatListResponse, formatDetailResponse } from "../services/boond-client.js";
3
- import { buildJsonApiBody, registerDeleteTool } from "./crud-factory.js";
1
+ import { ExpenseSearchSchema, ExpenseCreateSchema, ExpenseUpdateSchema } from "../schemas/index.js";
2
+ import { buildJsonApiBody, registerSearchTool, registerGetTool, registerCreateTool, registerUpdateTool, registerDeleteTool, } from "./crud-factory.js";
3
+ // Expense reports are searched on /expenses but read/written on /expenses-reports.
4
+ const SEARCH_OPTS = {
5
+ entityName: "note de frais",
6
+ entityNamePlural: "notes de frais",
7
+ apiPath: "/expenses",
8
+ prefix: "boond_expenses",
9
+ };
10
+ const REPORT_OPTS = { ...SEARCH_OPTS, apiPath: "/expenses-reports" };
11
+ /** Maps the resourceId/projectId convenience inputs to JSON:API relationships. */
12
+ function buildExpenseBody(params) {
13
+ const { id, resourceId, projectId, ...attrs } = params;
14
+ return buildJsonApiBody("expense", attrs, id, {
15
+ resource: resourceId ? { id: String(resourceId), type: "resource" } : undefined,
16
+ project: projectId ? { id: String(projectId), type: "project" } : undefined,
17
+ });
18
+ }
4
19
  export function registerExpenseTools(server) {
5
- // Search expenses
6
- server.registerTool("boond_expenses_search", {
7
- title: "Rechercher des notes de frais",
20
+ registerSearchTool(server, SEARCH_OPTS, {
21
+ schema: ExpenseSearchSchema,
8
22
  description: `Recherche des notes de frais dans BoondManager avec filtres par ressource, projet et période.
9
23
 
10
24
  Args:
@@ -14,101 +28,12 @@ Args:
14
28
  - page, pageSize: Pagination
15
29
 
16
30
  Returns: Liste des notes de frais correspondantes.`,
17
- inputSchema: ExpenseSearchSchema,
18
- annotations: {
19
- readOnlyHint: true,
20
- destructiveHint: false,
21
- idempotentHint: true,
22
- openWorldHint: true,
23
- },
24
- }, async (params) => {
25
- const query = buildSearchQuery(params);
26
- const response = await apiRequest("/expenses", "GET", undefined, query);
27
- return {
28
- content: [{ type: "text", text: formatListResponse(response, "note de frais") }],
29
- };
30
- });
31
- // Get expense details
32
- server.registerTool("boond_expenses_get", {
33
- title: "Détails d'une note de frais",
34
- description: `Récupère les informations détaillées d'une note de frais par son ID.`,
35
- inputSchema: IdSchema,
36
- annotations: {
37
- readOnlyHint: true,
38
- destructiveHint: false,
39
- idempotentHint: true,
40
- openWorldHint: false,
41
- },
42
- }, async (params) => {
43
- const response = await apiRequest(`/expenses-reports/${params.id}`);
44
- return {
45
- content: [{ type: "text", text: formatDetailResponse(response) }],
46
- };
47
- });
48
- // Create expense
49
- server.registerTool("boond_expenses_create", {
50
- title: "Créer une note de frais",
51
- description: `Crée une nouvelle note de frais dans BoondManager, liée à une ressource et optionnellement un projet.`,
52
- inputSchema: ExpenseCreateSchema,
53
- annotations: {
54
- readOnlyHint: false,
55
- destructiveHint: false,
56
- idempotentHint: false,
57
- openWorldHint: false,
58
- },
59
- }, async (params) => {
60
- const { resourceId, projectId, ...attrs } = params;
61
- const body = buildJsonApiBody("expense", attrs);
62
- const relationships = {};
63
- if (resourceId)
64
- relationships.resource = { data: { id: resourceId, type: "resource" } };
65
- if (projectId)
66
- relationships.project = { data: { id: projectId, type: "project" } };
67
- if (Object.keys(relationships).length > 0) {
68
- body.data.relationships = relationships;
69
- }
70
- const response = await apiRequest("/expenses-reports", "POST", body);
71
- const entity = Array.isArray(response.data) ? response.data[0] : response.data;
72
- return {
73
- content: [
74
- {
75
- type: "text",
76
- text: `✅ Note de frais créée avec succès.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
77
- },
78
- ],
79
- };
80
- });
81
- // Update expense
82
- server.registerTool("boond_expenses_update", {
83
- title: "Modifier une note de frais",
84
- description: `Met à jour une note de frais existante. Seuls les champs fournis sont modifiés.`,
85
- inputSchema: ExpenseUpdateSchema,
86
- annotations: {
87
- readOnlyHint: false,
88
- destructiveHint: false,
89
- idempotentHint: true,
90
- openWorldHint: false,
91
- },
92
- }, async (params) => {
93
- const { id, ...attrs } = params;
94
- const body = buildJsonApiBody("expense", attrs, id);
95
- const response = await apiRequest(`/expenses-reports/${id}`, "PUT", body);
96
- return {
97
- content: [
98
- {
99
- type: "text",
100
- text: `✅ Note de frais #${id} mise à jour.\n\n${formatDetailResponse(response)}`,
101
- },
102
- ],
103
- };
104
31
  });
105
- // Delete expense — via la factory pour l'élicitation de confirmation + structuredContent
106
- registerDeleteTool(server, {
107
- entityName: "note de frais",
108
- entityNamePlural: "notes de frais",
109
- apiPath: "/expenses-reports",
110
- prefix: "boond_expenses",
111
- }, {
32
+ registerGetTool(server, REPORT_OPTS, { withTab: false });
33
+ registerCreateTool(server, REPORT_OPTS, ExpenseCreateSchema, buildExpenseBody);
34
+ // BoondManager expects PUT (not PATCH) on /expenses-reports.
35
+ registerUpdateTool(server, REPORT_OPTS, ExpenseUpdateSchema, buildExpenseBody, { method: "PUT" });
36
+ registerDeleteTool(server, REPORT_OPTS, {
112
37
  title: "Supprimer une note de frais",
113
38
  description: `Supprime une note de frais de BoondManager. ⚠️ Action irréversible. Si le client MCP supporte l'élicitation, une confirmation est demandée avant la suppression.`,
114
39
  });
@@ -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":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,mFAAmF;AACnF,MAAM,WAAW,GAAG;IAClB,UAAU,EAAE,eAAe;IAC3B,gBAAgB,EAAE,gBAAgB;IAClC,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AACF,MAAM,WAAW,GAAG,EAAE,GAAG,WAAW,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAErE,kFAAkF;AAClF,SAAS,gBAAgB,CAAC,MAA+B;IACvD,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IACvD,OAAO,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAwB,EAAE;QAClE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS;QAC/E,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;KAC5E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE;QACtC,MAAM,EAAE,mBAAmB;QAC3B,WAAW,EAAE;;;;;;;;mDAQkC;KAChD,CAAC,CAAC;IACH,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IAC/E,6DAA6D;IAC7D,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE;QACtC,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,kKAAkK;KAChL,CAAC,CAAC;AACL,CAAC"}
@@ -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;AAIzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6CzD"}
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,40 +1,12 @@
1
- import { IdSchema, SearchSchema } from "../schemas/index.js";
2
- import { apiRequest, buildSearchQuery, formatListResponse, formatDetailResponse } from "../services/boond-client.js";
1
+ import { registerSearchTool, registerGetTool } from "./crud-factory.js";
2
+ const OPTS = {
3
+ entityName: "drapeau",
4
+ entityNamePlural: "drapeaux",
5
+ apiPath: "/flags",
6
+ prefix: "boond_flags",
7
+ };
3
8
  export function registerFlagTools(server) {
4
- server.registerTool("boond_flags_search", {
5
- title: "Rechercher des drapeaux/étiquettes",
6
- description: `Recherche des drapeaux (flags/étiquettes) dans BoondManager.
7
-
8
- Returns: Liste des drapeaux correspondants.`,
9
- inputSchema: SearchSchema,
10
- annotations: {
11
- readOnlyHint: true,
12
- destructiveHint: false,
13
- idempotentHint: true,
14
- openWorldHint: true,
15
- },
16
- }, async (params) => {
17
- const query = buildSearchQuery(params);
18
- const response = await apiRequest("/flags", "GET", undefined, query);
19
- return {
20
- content: [{ type: "text", text: formatListResponse(response, "drapeau") }],
21
- };
22
- });
23
- server.registerTool("boond_flags_get", {
24
- title: "Détails d'un drapeau/étiquette",
25
- description: `Récupère les informations détaillées d'un drapeau par son ID.`,
26
- inputSchema: IdSchema,
27
- annotations: {
28
- readOnlyHint: true,
29
- destructiveHint: false,
30
- idempotentHint: true,
31
- openWorldHint: false,
32
- },
33
- }, async (params) => {
34
- const response = await apiRequest(`/flags/${params.id}`);
35
- return {
36
- content: [{ type: "text", text: formatDetailResponse(response) }],
37
- };
38
- });
9
+ registerSearchTool(server, OPTS);
10
+ registerGetTool(server, OPTS, { withTab: false });
39
11
  }
40
12
  //# sourceMappingURL=flags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/tools/flags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAErH,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EAAE;;4CAEyB;QACtC,WAAW,EAAE,YAAY;QACzB,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,EAAE;QACf,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;SACpF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EAAE,+DAA+D;QAC5E,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,UAAU,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,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":"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 +1 @@
1
- {"version":3,"file":"invoices.d.ts","sourceRoot":"","sources":["../../src/tools/invoices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmI5D"}
1
+ {"version":3,"file":"invoices.d.ts","sourceRoot":"","sources":["../../src/tools/invoices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6BzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8C5D"}
@@ -1,8 +1,24 @@
1
- import { InvoiceSearchSchema, InvoiceCreateSchema, InvoiceUpdateSchema, IdSchema } from "../schemas/index.js";
2
- import { apiRequest, buildSearchQuery, formatListResponse, formatDetailResponse } from "../services/boond-client.js";
3
- import { buildJsonApiBody, registerDeleteTool } from "./crud-factory.js";
1
+ import { InvoiceSearchSchema, InvoiceCreateSchema, InvoiceUpdateSchema } from "../schemas/index.js";
2
+ import { apiRequest, buildSearchQuery, formatListResponse } from "../services/boond-client.js";
3
+ import { buildJsonApiBody, buildListStructured, SearchOutputSchema, registerGetTool, registerCreateTool, registerUpdateTool, registerDeleteTool, } from "./crud-factory.js";
4
+ const OPTS = {
5
+ entityName: "facture",
6
+ entityNamePlural: "factures",
7
+ apiPath: "/invoices",
8
+ prefix: "boond_invoices",
9
+ };
10
+ /** Maps the companyId/projectId convenience inputs to JSON:API relationships. */
11
+ function buildInvoiceBody(params) {
12
+ const { id, companyId, projectId, ...attrs } = params;
13
+ return buildJsonApiBody("invoice", attrs, id, {
14
+ company: companyId ? { id: String(companyId), type: "company" } : undefined,
15
+ project: projectId ? { id: String(projectId), type: "project" } : undefined,
16
+ });
17
+ }
4
18
  export function registerInvoiceTools(server) {
5
- // Search invoices
19
+ // Search invoices — kept hand-rolled: it applies a `period` default and
20
+ // forwards the startDate/endDate period window, which the generic factory
21
+ // search does not model.
6
22
  server.registerTool("boond_invoices_search", {
7
23
  title: "Rechercher des factures",
8
24
  description: `Recherche des factures dans BoondManager avec filtres par société, projet et période.
@@ -15,6 +31,7 @@ Args:
15
31
 
16
32
  Returns: Liste des factures correspondantes.`,
17
33
  inputSchema: InvoiceSearchSchema,
34
+ outputSchema: SearchOutputSchema,
18
35
  annotations: {
19
36
  readOnlyHint: true,
20
37
  destructiveHint: false,
@@ -31,84 +48,13 @@ Returns: Liste des factures correspondantes.`,
31
48
  const response = await apiRequest("/invoices", "GET", undefined, query);
32
49
  return {
33
50
  content: [{ type: "text", text: formatListResponse(response, "facture") }],
51
+ structuredContent: buildListStructured(response),
34
52
  };
35
53
  });
36
- // Get invoice details
37
- server.registerTool("boond_invoices_get", {
38
- title: "Détails d'une facture",
39
- description: `Récupère les informations détaillées d'une facture par son ID.`,
40
- inputSchema: IdSchema,
41
- annotations: {
42
- readOnlyHint: true,
43
- destructiveHint: false,
44
- idempotentHint: true,
45
- openWorldHint: false,
46
- },
47
- }, async (params) => {
48
- const response = await apiRequest(`/invoices/${params.id}`);
49
- return {
50
- content: [{ type: "text", text: formatDetailResponse(response) }],
51
- };
52
- });
53
- // Create invoice
54
- server.registerTool("boond_invoices_create", {
55
- title: "Créer une facture",
56
- description: `Crée une nouvelle facture dans BoondManager, optionnellement liée à une société et un projet.`,
57
- inputSchema: InvoiceCreateSchema,
58
- annotations: {
59
- readOnlyHint: false,
60
- destructiveHint: false,
61
- idempotentHint: false,
62
- openWorldHint: false,
63
- },
64
- }, async (params) => {
65
- const { companyId, projectId, ...attrs } = params;
66
- const body = buildJsonApiBody("invoice", attrs);
67
- const relationships = {};
68
- if (companyId)
69
- relationships.company = { data: { id: companyId, type: "company" } };
70
- if (projectId)
71
- relationships.project = { data: { id: projectId, type: "project" } };
72
- if (Object.keys(relationships).length > 0) {
73
- body.data.relationships = relationships;
74
- }
75
- const response = await apiRequest("/invoices", "POST", body);
76
- const entity = Array.isArray(response.data) ? response.data[0] : response.data;
77
- return {
78
- content: [
79
- {
80
- type: "text",
81
- text: `✅ Facture créée avec succès.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
82
- },
83
- ],
84
- };
85
- });
86
- // Update invoice
87
- server.registerTool("boond_invoices_update", {
88
- title: "Modifier une facture",
89
- description: `Met à jour une facture existante. Seuls les champs fournis sont modifiés.`,
90
- inputSchema: InvoiceUpdateSchema,
91
- annotations: {
92
- readOnlyHint: false,
93
- destructiveHint: false,
94
- idempotentHint: true,
95
- openWorldHint: false,
96
- },
97
- }, async (params) => {
98
- const { id, ...attrs } = params;
99
- const body = buildJsonApiBody("invoice", attrs, id);
100
- const response = await apiRequest(`/invoices/${id}`, "PATCH", body);
101
- return {
102
- content: [
103
- {
104
- type: "text",
105
- text: `✅ Facture #${id} mise à jour.\n\n${formatDetailResponse(response)}`,
106
- },
107
- ],
108
- };
109
- });
110
- // Delete invoice — via la factory pour l'élicitation de confirmation + structuredContent
111
- registerDeleteTool(server, { entityName: "facture", entityNamePlural: "factures", apiPath: "/invoices", prefix: "boond_invoices" }, {
54
+ registerGetTool(server, OPTS, { withTab: false });
55
+ registerCreateTool(server, OPTS, InvoiceCreateSchema, buildInvoiceBody);
56
+ registerUpdateTool(server, OPTS, InvoiceUpdateSchema, buildInvoiceBody);
57
+ registerDeleteTool(server, OPTS, {
112
58
  title: "Supprimer une facture",
113
59
  description: `Supprime une facture de BoondManager. ⚠️ Action irréversible. Si le client MCP supporte l'élicitation, une confirmation est demandée avant la suppression.`,
114
60
  });
@@ -1 +1 @@
1
- {"version":3,"file":"invoices.js","sourceRoot":"","sources":["../../src/tools/invoices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invoices.js","sourceRoot":"","sources":["../../src/tools/invoices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC/F,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,IAAI,GAAG;IACX,UAAU,EAAE,SAAS;IACrB,gBAAgB,EAAE,UAAU;IAC5B,OAAO,EAAE,WAAW;IACpB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,iFAAiF;AACjF,SAAS,gBAAgB,CAAC,MAA+B;IACvD,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IACtD,OAAO,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAwB,EAAE;QAClE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;QAC3E,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;KAC5E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,wEAAwE;IACxE,0EAA0E;IAC1E,yBAAyB;IACzB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE;;;;;;;;6CAQ0B;QACvC,WAAW,EAAE,mBAAmB;QAChC,YAAY,EAAE,kBAAkB;QAChC,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,EAAE;QACf,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,SAAS;YAAE,KAAK,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5D,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;QACtD,KAAK,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YACnF,iBAAiB,EAAE,mBAAmB,CAAC,QAAQ,CAAC;SACjD,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IACxE,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;IACxE,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE;QAC/B,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,4JAA4J;KAC1K,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6CxD"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAOxD"}
@@ -1,40 +1,16 @@
1
- import { IdSchema, SearchSchema } from "../schemas/index.js";
2
- import { apiRequest, buildSearchQuery, formatListResponse, formatDetailResponse } from "../services/boond-client.js";
1
+ import { registerSearchTool, registerGetTool } from "./crud-factory.js";
2
+ const OPTS = {
3
+ entityName: "log",
4
+ entityNamePlural: "logs",
5
+ apiPath: "/logs",
6
+ prefix: "boond_logs",
7
+ };
3
8
  export function registerLogTools(server) {
4
- server.registerTool("boond_logs_search", {
5
- title: "Rechercher des logs d'audit",
9
+ registerSearchTool(server, OPTS, {
6
10
  description: `Recherche des logs d'audit dans BoondManager (historique des actions utilisateurs).
7
11
 
8
12
  Returns: Liste des logs correspondants.`,
9
- inputSchema: SearchSchema,
10
- annotations: {
11
- readOnlyHint: true,
12
- destructiveHint: false,
13
- idempotentHint: true,
14
- openWorldHint: true,
15
- },
16
- }, async (params) => {
17
- const query = buildSearchQuery(params);
18
- const response = await apiRequest("/logs", "GET", undefined, query);
19
- return {
20
- content: [{ type: "text", text: formatListResponse(response, "log") }],
21
- };
22
- });
23
- server.registerTool("boond_logs_get", {
24
- title: "Détails d'un log d'audit",
25
- description: `Récupère les informations détaillées d'un log d'audit par son ID.`,
26
- inputSchema: IdSchema,
27
- annotations: {
28
- readOnlyHint: true,
29
- destructiveHint: false,
30
- idempotentHint: true,
31
- openWorldHint: false,
32
- },
33
- }, async (params) => {
34
- const response = await apiRequest(`/logs/${params.id}`);
35
- return {
36
- content: [{ type: "text", text: formatDetailResponse(response) }],
37
- };
38
13
  });
14
+ registerGetTool(server, OPTS, { withTab: false });
39
15
  }
40
16
  //# sourceMappingURL=logs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAErH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE;;wCAEqB;QAClC,WAAW,EAAE,YAAY;QACzB,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,EAAE;QACf,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACpE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;SAChF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,mEAAmE;QAChF,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,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,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":"logs.js","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExE,MAAM,IAAI,GAAG;IACX,UAAU,EAAE,KAAK;IACjB,gBAAgB,EAAE,MAAM;IACxB,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE;QAC/B,WAAW,EAAE;;wCAEuB;KACrC,CAAC,CAAC;IACH,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"opportunities.d.ts","sourceRoot":"","sources":["../../src/tools/opportunities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkHzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiDhE"}
1
+ {"version":3,"file":"opportunities.d.ts","sourceRoot":"","sources":["../../src/tools/opportunities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoJzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsChE"}
@@ -86,32 +86,40 @@ Cas d'usage courants :
86
86
  Pagination : \`page\`, \`pageSize\` (max 500). Tri : \`sort: "creationDate"|"title"|"company.name"|"startDate"|"endDate"|"state"|"closingDate"|"answerDate"|"updateDate"|...\` + \`order\`.
87
87
 
88
88
  Returns : liste paginée des opportunités. Utiliser \`boond_opportunities_get\` ou les outils d'onglets pour le détail.`;
89
+ /**
90
+ * Builds the JSON:API body for create (no id) and update (with id) of an
91
+ * opportunity. Maps the friendly schema field names to the API's attribute /
92
+ * relationship names (see issues #113 and #124):
93
+ * - `name` → /data/attributes/title
94
+ * - `note` → /data/attributes/description (the API has no `note` attribute)
95
+ * - `{company,contact,pole,hrManager,mainManager,agency}Id` → relationships
96
+ * `buildJsonApiBody` strips undefined attributes and relationships, so partial
97
+ * updates only touch the supplied fields.
98
+ */
99
+ function buildOpportunityBody(params) {
100
+ const { id, name, note, companyId, contactId, poleId, hrManagerId, mainManagerId, agencyId, ...attributes } = params;
101
+ return buildJsonApiBody("opportunity", { ...attributes, title: name, description: note }, id, {
102
+ company: companyId ? { id: companyId, type: "company" } : undefined,
103
+ contact: contactId ? { id: contactId, type: "contact" } : undefined,
104
+ pole: poleId ? { id: poleId, type: "pole" } : undefined,
105
+ hrManager: hrManagerId ? { id: hrManagerId, type: "resource" } : undefined,
106
+ mainManager: mainManagerId ? { id: mainManagerId, type: "resource" } : undefined,
107
+ agency: agencyId ? { id: agencyId, type: "agency" } : undefined,
108
+ });
109
+ }
89
110
  export function registerOpportunityTools(server) {
90
111
  registerSearchTool(server, OPTS, {
91
112
  schema: OpportunitySearchSchema,
92
113
  description: OPPORTUNITY_SEARCH_DESCRIPTION,
93
114
  });
94
115
  registerGetTool(server, OPTS);
95
- registerCreateTool(server, OPTS, OpportunityCreateSchema, (params) => {
96
- // The Boond API expects the opportunity name under `/data/attributes/title`,
97
- // so the schema's `name` field must be mapped to `title` (see issue #113).
98
- const { companyId, contactId, name, ...rest } = params;
99
- const body = buildJsonApiBody("opportunity", { title: name, ...rest });
100
- const relationships = {};
101
- if (companyId)
102
- relationships.company = { data: { id: companyId, type: "company" } };
103
- if (contactId)
104
- relationships.contact = { data: { id: contactId, type: "contact" } };
105
- if (Object.keys(relationships).length > 0) {
106
- body.data.relationships = relationships;
107
- }
108
- return body;
109
- });
110
- registerUpdateTool(server, OPTS, OpportunityUpdateSchema, (params) => {
111
- // Same `name` → `title` mapping as create (issue #113). `title` stays
112
- // undefined when `name` is omitted, so buildJsonApiBody drops it.
113
- const { id, name, ...rest } = params;
114
- return buildJsonApiBody("opportunity", { title: name, ...rest }, id);
116
+ registerCreateTool(server, OPTS, OpportunityCreateSchema, buildOpportunityBody);
117
+ // Updates go through PUT /opportunities/{id}/information — the base resource
118
+ // returns 405 on PATCH (issue #124). buildJsonApiBody drops undefined values,
119
+ // so PUT still only touches the fields the caller supplied.
120
+ registerUpdateTool(server, OPTS, OpportunityUpdateSchema, buildOpportunityBody, {
121
+ method: "PUT",
122
+ pathSuffix: "information",
115
123
  });
116
124
  registerDeleteTool(server, OPTS);
117
125
  // Register one tool per opportunity tab
@@ -1 +1 @@
1
- {"version":3,"file":"opportunities.js","sourceRoot":"","sources":["../../src/tools/opportunities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opportunities.js","sourceRoot":"","sources":["../../src/tools/opportunities.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/tools/orders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+H1D"}
1
+ {"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../src/tools/orders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA2BzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmB1D"}