boondmanager-mcp-server 2.3.0 → 2.5.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.
- package/README.md +20 -1
- package/dist/config/dictionary-overrides.d.ts +57 -0
- package/dist/config/dictionary-overrides.d.ts.map +1 -0
- package/dist/config/dictionary-overrides.js +193 -0
- package/dist/config/dictionary-overrides.js.map +1 -0
- package/dist/constants.d.ts +3 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -1
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +25 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/schemas/index.d.ts +64 -13
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +144 -20
- package/dist/schemas/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/services/boond-client.d.ts +34 -1
- package/dist/services/boond-client.d.ts.map +1 -1
- package/dist/services/boond-client.js +156 -4
- package/dist/services/boond-client.js.map +1 -1
- package/dist/tools/absences.d.ts.map +1 -1
- package/dist/tools/absences.js +12 -20
- package/dist/tools/absences.js.map +1 -1
- package/dist/tools/actions.d.ts.map +1 -1
- package/dist/tools/actions.js +63 -19
- package/dist/tools/actions.js.map +1 -1
- package/dist/tools/candidates.js +2 -2
- package/dist/tools/candidates.js.map +1 -1
- package/dist/tools/companies.js +2 -2
- package/dist/tools/companies.js.map +1 -1
- package/dist/tools/contacts.js +2 -2
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/crud-factory.d.ts +40 -2
- package/dist/tools/crud-factory.d.ts.map +1 -1
- package/dist/tools/crud-factory.js +164 -16
- package/dist/tools/crud-factory.js.map +1 -1
- package/dist/tools/documents.d.ts +3 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +118 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/expenses.d.ts.map +1 -1
- package/dist/tools/expenses.js +17 -20
- package/dist/tools/expenses.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/invoices.d.ts.map +1 -1
- package/dist/tools/invoices.js +12 -20
- package/dist/tools/invoices.js.map +1 -1
- package/dist/tools/opportunities.d.ts.map +1 -1
- package/dist/tools/opportunities.js +3 -3
- package/dist/tools/opportunities.js.map +1 -1
- package/dist/tools/orders.d.ts.map +1 -1
- package/dist/tools/orders.js +12 -20
- package/dist/tools/orders.js.map +1 -1
- package/dist/tools/positionings.d.ts.map +1 -1
- package/dist/tools/positionings.js +81 -16
- package/dist/tools/positionings.js.map +1 -1
- package/dist/tools/projects.js +2 -2
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/purchases.d.ts.map +1 -1
- package/dist/tools/purchases.js +16 -21
- package/dist/tools/purchases.js.map +1 -1
- package/dist/tools/resources.d.ts.map +1 -1
- package/dist/tools/resources.js +14 -3
- package/dist/tools/resources.js.map +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +15 -0
- package/dist/transports/http.js.map +1 -1
- package/manifest.json +18 -3
- package/package.json +2 -2
|
@@ -1,9 +1,131 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { apiRequest, buildSearchQuery, formatListResponse, formatDetailResponse, formatEntitySummary, } from "../services/boond-client.js";
|
|
2
3
|
import { SearchSchema, IdSchema, IdTabSchema } from "../schemas/index.js";
|
|
4
|
+
// ---- Structured output schemas (MCP outputSchema / structuredContent) ----
|
|
5
|
+
// Deliberately compact: the structured payload mirrors the text summary
|
|
6
|
+
// (ids + one-line summaries, or the caller-selected `fields`), never the full
|
|
7
|
+
// JSON:API resources — duplicating those would defeat the token economy of
|
|
8
|
+
// the text formatters. Detail (`get`) tools keep text-only output for the
|
|
9
|
+
// same reason: their text is already the machine-parseable JSON.
|
|
10
|
+
export const SearchOutputSchema = z.object({
|
|
11
|
+
total: z.number().optional().describe("Nombre total de résultats côté BoondManager"),
|
|
12
|
+
count: z.number().describe("Nombre d'éléments retournés sur cette page"),
|
|
13
|
+
items: z.array(z.object({
|
|
14
|
+
id: z.string().optional(),
|
|
15
|
+
type: z.string().optional(),
|
|
16
|
+
summary: z.string().optional().describe("Résumé standard (absent si `fields` est fourni)"),
|
|
17
|
+
attributes: z
|
|
18
|
+
.record(z.string(), z.unknown())
|
|
19
|
+
.optional()
|
|
20
|
+
.describe("Attributs projetés (présent si `fields` est fourni)"),
|
|
21
|
+
})),
|
|
22
|
+
});
|
|
23
|
+
export const MutationOutputSchema = z.object({
|
|
24
|
+
id: z.string().optional().describe("Identifiant de l'entité créée/modifiée"),
|
|
25
|
+
type: z.string().optional(),
|
|
26
|
+
});
|
|
27
|
+
export const DeleteOutputSchema = z.object({
|
|
28
|
+
id: z.string(),
|
|
29
|
+
deleted: z.boolean(),
|
|
30
|
+
reason: z.string().optional().describe("Présent quand la suppression n'a pas eu lieu (ex: refus utilisateur)"),
|
|
31
|
+
});
|
|
32
|
+
/** Build the compact structured payload for a search result page. Exported for unit testing. */
|
|
33
|
+
export function buildListStructured(response, fields) {
|
|
34
|
+
const data = (Array.isArray(response.data) ? response.data : [response.data]).filter((e) => e !== null && e !== undefined);
|
|
35
|
+
const projected = fields !== undefined && fields.length > 0;
|
|
36
|
+
const items = data.map((entity) => {
|
|
37
|
+
const item = {};
|
|
38
|
+
if (entity.id !== undefined)
|
|
39
|
+
item.id = String(entity.id);
|
|
40
|
+
if (entity.type !== undefined)
|
|
41
|
+
item.type = String(entity.type);
|
|
42
|
+
if (projected) {
|
|
43
|
+
const attrs = (entity.attributes ?? {});
|
|
44
|
+
const selected = {};
|
|
45
|
+
for (const field of fields) {
|
|
46
|
+
if (attrs[field] !== undefined)
|
|
47
|
+
selected[field] = attrs[field];
|
|
48
|
+
}
|
|
49
|
+
item.attributes = selected;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
item.summary = formatEntitySummary(entity);
|
|
53
|
+
}
|
|
54
|
+
return item;
|
|
55
|
+
});
|
|
56
|
+
const total = response.meta?.totals?.rows;
|
|
57
|
+
return {
|
|
58
|
+
...(typeof total === "number" ? { total } : {}),
|
|
59
|
+
count: items.length,
|
|
60
|
+
items,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function entityRef(response) {
|
|
64
|
+
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
65
|
+
const ref = {};
|
|
66
|
+
if (entity?.id !== undefined)
|
|
67
|
+
ref.id = String(entity.id);
|
|
68
|
+
if (entity?.type !== undefined)
|
|
69
|
+
ref.type = String(entity.type);
|
|
70
|
+
return ref;
|
|
71
|
+
}
|
|
72
|
+
// ---- Delete confirmation via MCP elicitation ----
|
|
73
|
+
/** `BOOND_MCP_CONFIRM_DELETE=0|false|no|off` opts out of the confirmation prompt. */
|
|
74
|
+
function deleteConfirmationDisabled() {
|
|
75
|
+
const v = process.env.BOOND_MCP_CONFIRM_DELETE;
|
|
76
|
+
if (!v)
|
|
77
|
+
return false;
|
|
78
|
+
return ["0", "false", "no", "off"].includes(v.trim().toLowerCase());
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Ask the end user to confirm a destructive delete through MCP elicitation
|
|
82
|
+
* (spec 2025-06-18). Clients that don't declare the `elicitation` capability
|
|
83
|
+
* keep the legacy behaviour (delete proceeds — `destructiveHint` already lets
|
|
84
|
+
* hosts gate the call). A failed elicitation round-trip (e.g. stateless HTTP
|
|
85
|
+
* quirks) also falls back to legacy rather than breaking deletes; only an
|
|
86
|
+
* explicit decline/cancel/`confirm=false` aborts.
|
|
87
|
+
*/
|
|
88
|
+
export async function confirmDeletion(server, entityName, id) {
|
|
89
|
+
if (deleteConfirmationDisabled())
|
|
90
|
+
return { confirmed: true };
|
|
91
|
+
let supportsElicitation;
|
|
92
|
+
try {
|
|
93
|
+
supportsElicitation = Boolean(server.server.getClientCapabilities()?.elicitation);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return { confirmed: true };
|
|
97
|
+
}
|
|
98
|
+
if (!supportsElicitation)
|
|
99
|
+
return { confirmed: true };
|
|
100
|
+
try {
|
|
101
|
+
const result = await server.server.elicitInput({
|
|
102
|
+
message: `Confirmer la suppression définitive de ${entityName} #${id} dans BoondManager ? Cette action est irréversible.`,
|
|
103
|
+
requestedSchema: {
|
|
104
|
+
type: "object",
|
|
105
|
+
properties: {
|
|
106
|
+
confirm: {
|
|
107
|
+
type: "boolean",
|
|
108
|
+
title: "Confirmer la suppression",
|
|
109
|
+
description: `Supprimer ${entityName} #${id}`,
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
required: ["confirm"],
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
if (result.action === "accept" && result.content?.confirm === true) {
|
|
116
|
+
return { confirmed: true };
|
|
117
|
+
}
|
|
118
|
+
return { confirmed: false, reason: result.action === "accept" ? "confirm=false" : result.action };
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return { confirmed: true };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
3
124
|
export function registerSearchTool(server, opts, overrides = {}) {
|
|
4
125
|
const schema = overrides.schema ?? SearchSchema;
|
|
5
126
|
const title = overrides.title ?? `Rechercher des ${opts.entityNamePlural}`;
|
|
6
|
-
const description = overrides.description ??
|
|
127
|
+
const description = overrides.description ??
|
|
128
|
+
`Recherche des ${opts.entityNamePlural} dans BoondManager par mots-clés avec pagination.
|
|
7
129
|
|
|
8
130
|
Args:
|
|
9
131
|
- keywords (string, optional): Termes de recherche (nom, email, compétences...)
|
|
@@ -15,6 +137,7 @@ Returns: Liste des ${opts.entityNamePlural} correspondants avec leur ID, nom et
|
|
|
15
137
|
title,
|
|
16
138
|
description,
|
|
17
139
|
inputSchema: schema,
|
|
140
|
+
outputSchema: SearchOutputSchema,
|
|
18
141
|
annotations: {
|
|
19
142
|
readOnlyHint: true,
|
|
20
143
|
destructiveHint: false,
|
|
@@ -22,11 +145,13 @@ Returns: Liste des ${opts.entityNamePlural} correspondants avec leur ID, nom et
|
|
|
22
145
|
openWorldHint: true,
|
|
23
146
|
},
|
|
24
147
|
}, async (params) => {
|
|
25
|
-
const
|
|
148
|
+
const p = params;
|
|
149
|
+
const query = buildSearchQuery(p);
|
|
26
150
|
const response = await apiRequest(opts.apiPath, "GET", undefined, query);
|
|
27
|
-
const text = formatListResponse(response, opts.entityName);
|
|
151
|
+
const text = formatListResponse(response, opts.entityName, p.fields);
|
|
28
152
|
return {
|
|
29
153
|
content: [{ type: "text", text }],
|
|
154
|
+
structuredContent: buildListStructured(response, p.fields),
|
|
30
155
|
};
|
|
31
156
|
});
|
|
32
157
|
}
|
|
@@ -48,9 +173,7 @@ Returns: Données JSON complètes de l'entité.`,
|
|
|
48
173
|
openWorldHint: false,
|
|
49
174
|
},
|
|
50
175
|
}, async (params) => {
|
|
51
|
-
const path = params.tab
|
|
52
|
-
? `${opts.apiPath}/${params.id}/${params.tab}`
|
|
53
|
-
: `${opts.apiPath}/${params.id}`;
|
|
176
|
+
const path = params.tab ? `${opts.apiPath}/${params.id}/${params.tab}` : `${opts.apiPath}/${params.id}`;
|
|
54
177
|
const response = await apiRequest(path);
|
|
55
178
|
const text = formatDetailResponse(response);
|
|
56
179
|
return {
|
|
@@ -65,6 +188,7 @@ export function registerCreateTool(server, opts, schema, buildBody) {
|
|
|
65
188
|
|
|
66
189
|
Returns: Données du/de la ${opts.entityName} créé(e) avec son ID.`,
|
|
67
190
|
inputSchema: schema,
|
|
191
|
+
outputSchema: MutationOutputSchema,
|
|
68
192
|
annotations: {
|
|
69
193
|
readOnlyHint: false,
|
|
70
194
|
destructiveHint: false,
|
|
@@ -76,10 +200,13 @@ Returns: Données du/de la ${opts.entityName} créé(e) avec son ID.`,
|
|
|
76
200
|
const response = await apiRequest(opts.apiPath, "POST", body);
|
|
77
201
|
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
78
202
|
return {
|
|
79
|
-
content: [
|
|
203
|
+
content: [
|
|
204
|
+
{
|
|
80
205
|
type: "text",
|
|
81
206
|
text: `✅ ${opts.entityName} créé(e) avec succès.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
|
|
82
|
-
}
|
|
207
|
+
},
|
|
208
|
+
],
|
|
209
|
+
structuredContent: entityRef(response),
|
|
83
210
|
};
|
|
84
211
|
});
|
|
85
212
|
}
|
|
@@ -90,6 +217,7 @@ export function registerUpdateTool(server, opts, schema, buildBody) {
|
|
|
90
217
|
|
|
91
218
|
Returns: Données mises à jour du/de la ${opts.entityName}.`,
|
|
92
219
|
inputSchema: schema,
|
|
220
|
+
outputSchema: MutationOutputSchema,
|
|
93
221
|
annotations: {
|
|
94
222
|
readOnlyHint: false,
|
|
95
223
|
destructiveHint: false,
|
|
@@ -102,21 +230,26 @@ Returns: Données mises à jour du/de la ${opts.entityName}.`,
|
|
|
102
230
|
const body = buildBody(p);
|
|
103
231
|
const response = await apiRequest(`${opts.apiPath}/${id}`, "PATCH", body);
|
|
104
232
|
return {
|
|
105
|
-
content: [
|
|
233
|
+
content: [
|
|
234
|
+
{
|
|
106
235
|
type: "text",
|
|
107
236
|
text: `✅ ${opts.entityName} #${id} mis(e) à jour.\n\n${formatDetailResponse(response)}`,
|
|
108
|
-
}
|
|
237
|
+
},
|
|
238
|
+
],
|
|
239
|
+
structuredContent: { id, ...entityRef(response) },
|
|
109
240
|
};
|
|
110
241
|
});
|
|
111
242
|
}
|
|
112
|
-
export function registerDeleteTool(server, opts) {
|
|
243
|
+
export function registerDeleteTool(server, opts, overrides = {}) {
|
|
113
244
|
server.registerTool(`${opts.prefix}_delete`, {
|
|
114
|
-
title: `Supprimer un(e) ${opts.entityName}`,
|
|
115
|
-
description:
|
|
245
|
+
title: overrides.title ?? `Supprimer un(e) ${opts.entityName}`,
|
|
246
|
+
description: overrides.description ??
|
|
247
|
+
`Supprime un(e) ${opts.entityName} de BoondManager. ⚠️ Action irréversible. Si le client MCP supporte l'élicitation, une confirmation est demandée à l'utilisateur avant la suppression.
|
|
116
248
|
|
|
117
249
|
Args:
|
|
118
250
|
- id (string): Identifiant de l'entité à supprimer`,
|
|
119
251
|
inputSchema: IdSchema,
|
|
252
|
+
outputSchema: DeleteOutputSchema,
|
|
120
253
|
annotations: {
|
|
121
254
|
readOnlyHint: false,
|
|
122
255
|
destructiveHint: true,
|
|
@@ -124,12 +257,27 @@ Args:
|
|
|
124
257
|
openWorldHint: false,
|
|
125
258
|
},
|
|
126
259
|
}, async (params) => {
|
|
260
|
+
const confirmation = await confirmDeletion(server, opts.entityName, params.id);
|
|
261
|
+
if (!confirmation.confirmed) {
|
|
262
|
+
return {
|
|
263
|
+
content: [
|
|
264
|
+
{
|
|
265
|
+
type: "text",
|
|
266
|
+
text: `❌ Suppression de ${opts.entityName} #${params.id} annulée par l'utilisateur.`,
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
structuredContent: { id: params.id, deleted: false, reason: confirmation.reason ?? "declined" },
|
|
270
|
+
};
|
|
271
|
+
}
|
|
127
272
|
await apiRequest(`${opts.apiPath}/${params.id}`, "DELETE");
|
|
128
273
|
return {
|
|
129
|
-
content: [
|
|
274
|
+
content: [
|
|
275
|
+
{
|
|
130
276
|
type: "text",
|
|
131
277
|
text: `🗑️ ${opts.entityName} #${params.id} supprimé(e).`,
|
|
132
|
-
}
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
structuredContent: { id: params.id, deleted: true },
|
|
133
281
|
};
|
|
134
282
|
});
|
|
135
283
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-factory.js","sourceRoot":"","sources":["../../src/tools/crud-factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"crud-factory.js","sourceRoot":"","sources":["../../src/tools/crud-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0H7D"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { apiDownload, apiUploadForm, formatDetailResponse } from "../services/boond-client.js";
|
|
2
|
+
import { IdSchema, DocumentCreateSchema } from "../schemas/index.js";
|
|
3
|
+
import { MAX_DOCUMENT_BYTES, CHARACTER_LIMIT } from "../constants.js";
|
|
4
|
+
import { registerDeleteTool, MutationOutputSchema } from "./crud-factory.js";
|
|
5
|
+
/** Mime types rendered as plain text instead of a base64 blob. */
|
|
6
|
+
function isTextMime(mime) {
|
|
7
|
+
return mime.startsWith("text/") || /[+/](json|xml)$|^application\/(json|xml|csv)$/.test(mime);
|
|
8
|
+
}
|
|
9
|
+
export function registerDocumentTools(server) {
|
|
10
|
+
// Download a document (CV, justificatif, contrat...)
|
|
11
|
+
server.registerTool("boond_documents_get", {
|
|
12
|
+
title: "Télécharger un document",
|
|
13
|
+
description: `Télécharge le contenu d'un document BoondManager (CV de candidat/ressource, justificatif, contrat, facture...) par son ID.
|
|
14
|
+
|
|
15
|
+
Où trouver les IDs de documents : dans les onglets des entités — ex. boond_candidates_information expose les relations 'resumes' (CV) et 'files' (dossier administratif).
|
|
16
|
+
|
|
17
|
+
Le contenu est retourné en ressource MCP embarquée (base64 pour les binaires type PDF/DOCX, texte brut pour les fichiers texte). Taille max: ${Math.round(MAX_DOCUMENT_BYTES / 1024 / 1024)} Mo — à n'utiliser que lorsque le contenu du fichier est réellement nécessaire (un CV en base64 occupe beaucoup de contexte).
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
- id (string): Identifiant du document`,
|
|
21
|
+
inputSchema: IdSchema,
|
|
22
|
+
annotations: {
|
|
23
|
+
readOnlyHint: true,
|
|
24
|
+
destructiveHint: false,
|
|
25
|
+
idempotentHint: true,
|
|
26
|
+
openWorldHint: false,
|
|
27
|
+
},
|
|
28
|
+
}, async (params) => {
|
|
29
|
+
const doc = await apiDownload(`/documents/${params.id}`);
|
|
30
|
+
const uri = `boond://documents/${params.id}`;
|
|
31
|
+
const name = doc.filename ?? `document-${params.id}`;
|
|
32
|
+
if (doc.data.length > MAX_DOCUMENT_BYTES) {
|
|
33
|
+
return {
|
|
34
|
+
isError: true,
|
|
35
|
+
content: [
|
|
36
|
+
{
|
|
37
|
+
type: "text",
|
|
38
|
+
text: `❌ Document #${params.id} (${name}) trop volumineux pour être retourné inline: ${(doc.data.length / 1024 / 1024).toFixed(1)} Mo (max ${Math.round(MAX_DOCUMENT_BYTES / 1024 / 1024)} Mo).`,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (isTextMime(doc.contentType)) {
|
|
44
|
+
let text = doc.data.toString("utf8");
|
|
45
|
+
if (text.length > CHARACTER_LIMIT) {
|
|
46
|
+
text = text.substring(0, CHARACTER_LIMIT) + "\n\n[Contenu tronqué...]";
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
content: [
|
|
50
|
+
{ type: "text", text: `Document #${params.id} — ${name} (${doc.contentType})\n\n${text}` },
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
content: [
|
|
56
|
+
{
|
|
57
|
+
type: "text",
|
|
58
|
+
text: `Document #${params.id} — ${name} (${doc.contentType}, ${(doc.data.length / 1024).toFixed(0)} Ko), contenu joint en ressource embarquée.`,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
type: "resource",
|
|
62
|
+
resource: {
|
|
63
|
+
uri,
|
|
64
|
+
mimeType: doc.contentType,
|
|
65
|
+
blob: doc.data.toString("base64"),
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
// Upload a document by URL
|
|
72
|
+
server.registerTool("boond_documents_create", {
|
|
73
|
+
title: "Téléverser un document",
|
|
74
|
+
description: `Attache un document à une entité BoondManager à partir d'une URL (l'API BoondManager télécharge elle-même le fichier — aucun fichier local n'est lu).
|
|
75
|
+
|
|
76
|
+
Cas d'usage typiques : attacher un CV à un candidat (parentType=candidateResume, parsing=true pour lancer l'analyse IA Boond), joindre un justificatif à une note de frais (expensesReport), un document à un projet/une société...
|
|
77
|
+
|
|
78
|
+
Returns: Métadonnées du document créé (ID).`,
|
|
79
|
+
inputSchema: DocumentCreateSchema,
|
|
80
|
+
outputSchema: MutationOutputSchema,
|
|
81
|
+
annotations: {
|
|
82
|
+
readOnlyHint: false,
|
|
83
|
+
destructiveHint: false,
|
|
84
|
+
idempotentHint: false,
|
|
85
|
+
openWorldHint: false,
|
|
86
|
+
},
|
|
87
|
+
}, async (params) => {
|
|
88
|
+
const fields = {
|
|
89
|
+
parentType: params.parentType,
|
|
90
|
+
parentId: String(params.parentId),
|
|
91
|
+
fileUrl: params.fileUrl,
|
|
92
|
+
};
|
|
93
|
+
if (params.parsing !== undefined)
|
|
94
|
+
fields.parsing = String(params.parsing);
|
|
95
|
+
const response = await apiUploadForm("/documents", fields);
|
|
96
|
+
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
97
|
+
const structured = {};
|
|
98
|
+
if (entity?.id !== undefined)
|
|
99
|
+
structured.id = String(entity.id);
|
|
100
|
+
if (entity?.type !== undefined)
|
|
101
|
+
structured.type = String(entity.type);
|
|
102
|
+
return {
|
|
103
|
+
content: [
|
|
104
|
+
{
|
|
105
|
+
type: "text",
|
|
106
|
+
text: `✅ Document créé avec succès.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
structuredContent: structured,
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
// Delete a document — factory: élicitation de confirmation + structuredContent
|
|
113
|
+
registerDeleteTool(server, { entityName: "document", entityNamePlural: "documents", apiPath: "/documents", prefix: "boond_documents" }, {
|
|
114
|
+
title: "Supprimer un document",
|
|
115
|
+
description: `Supprime un document de BoondManager. ⚠️ Action irréversible. Si le client MCP supporte l'élicitation, une confirmation est demandée avant la suppression.`,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=documents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expenses.d.ts","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"expenses.d.ts","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqI5D"}
|
package/dist/tools/expenses.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ExpenseSearchSchema, ExpenseCreateSchema, ExpenseUpdateSchema, IdSchema } from "../schemas/index.js";
|
|
2
2
|
import { apiRequest, buildSearchQuery, formatListResponse, formatDetailResponse } from "../services/boond-client.js";
|
|
3
|
-
import { buildJsonApiBody } from "./crud-factory.js";
|
|
3
|
+
import { buildJsonApiBody, registerDeleteTool } from "./crud-factory.js";
|
|
4
4
|
export function registerExpenseTools(server) {
|
|
5
5
|
// Search expenses
|
|
6
6
|
server.registerTool("boond_expenses_search", {
|
|
@@ -70,10 +70,12 @@ Returns: Liste des notes de frais correspondantes.`,
|
|
|
70
70
|
const response = await apiRequest("/expenses-reports", "POST", body);
|
|
71
71
|
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
72
72
|
return {
|
|
73
|
-
content: [
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
74
75
|
type: "text",
|
|
75
76
|
text: `✅ Note de frais créée avec succès.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
|
|
76
|
-
}
|
|
77
|
+
},
|
|
78
|
+
],
|
|
77
79
|
};
|
|
78
80
|
});
|
|
79
81
|
// Update expense
|
|
@@ -92,28 +94,23 @@ Returns: Liste des notes de frais correspondantes.`,
|
|
|
92
94
|
const body = buildJsonApiBody("expense", attrs, id);
|
|
93
95
|
const response = await apiRequest(`/expenses-reports/${id}`, "PUT", body);
|
|
94
96
|
return {
|
|
95
|
-
content: [
|
|
97
|
+
content: [
|
|
98
|
+
{
|
|
96
99
|
type: "text",
|
|
97
100
|
text: `✅ Note de frais #${id} mise à jour.\n\n${formatDetailResponse(response)}`,
|
|
98
|
-
}
|
|
101
|
+
},
|
|
102
|
+
],
|
|
99
103
|
};
|
|
100
104
|
});
|
|
101
|
-
// Delete expense
|
|
102
|
-
server
|
|
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
|
+
}, {
|
|
103
112
|
title: "Supprimer une note de frais",
|
|
104
|
-
description: `Supprime une note de frais de BoondManager. ⚠️ Action irréversible.`,
|
|
105
|
-
inputSchema: IdSchema,
|
|
106
|
-
annotations: {
|
|
107
|
-
readOnlyHint: false,
|
|
108
|
-
destructiveHint: true,
|
|
109
|
-
idempotentHint: false,
|
|
110
|
-
openWorldHint: false,
|
|
111
|
-
},
|
|
112
|
-
}, async (params) => {
|
|
113
|
-
await apiRequest(`/expenses-reports/${params.id}`, "DELETE");
|
|
114
|
-
return {
|
|
115
|
-
content: [{ type: "text", text: `🗑️ Note de frais #${params.id} supprimée.` }],
|
|
116
|
-
};
|
|
113
|
+
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.`,
|
|
117
114
|
});
|
|
118
115
|
}
|
|
119
116
|
//# sourceMappingURL=expenses.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expenses.js","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"expenses.js","sourceRoot":"","sources":["../../src/tools/expenses.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,kBAAkB;IAClB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,+BAA+B;QACtC,WAAW,EAAE;;;;;;;;mDAQgC;QAC7C,WAAW,EAAE,mBAAmB;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,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,eAAe,CAAC,EAAE,CAAC;SAC1F,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,sEAAsE;QACnF,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,qBAAqB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC3E,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,uGAAuG;QACpH,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;QACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,aAAa,GAA4B,EAAE,CAAC;QAClD,IAAI,UAAU;YAAE,aAAa,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC;QACxF,IAAI,SAAS;YAAE,aAAa,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;QACpF,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,IAAgD,CAAC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACvF,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,2CAA2C,MAAM,EAAE,EAAE,OAAO,oBAAoB,CAAC,QAAQ,CAAC,EAAE;iBACnG;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE,iFAAiF;QAC9F,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;QAChC,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,qBAAqB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,oBAAoB,EAAE,oBAAoB,oBAAoB,CAAC,QAAQ,CAAC,EAAE;iBACjF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,yFAAyF;IACzF,kBAAkB,CAChB,MAAM,EACN;QACE,UAAU,EAAE,eAAe;QAC3B,gBAAgB,EAAE,gBAAgB;QAClC,OAAO,EAAE,mBAAmB;QAC5B,MAAM,EAAE,gBAAgB;KACzB,EACD;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EAAE,kKAAkK;KAChL,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -34,5 +34,6 @@ export { registerValidationTools } from "./validations.js";
|
|
|
34
34
|
export { registerPoleTools } from "./poles.js";
|
|
35
35
|
export { registerReportingTools } from "./reporting.js";
|
|
36
36
|
export { registerPlanningAbsenceTools } from "./planning-absences.js";
|
|
37
|
+
export { registerDocumentTools } from "./documents.js";
|
|
37
38
|
export { registerWorkflowTools } from "./workflows.js";
|
|
38
39
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -34,5 +34,6 @@ export { registerValidationTools } from "./validations.js";
|
|
|
34
34
|
export { registerPoleTools } from "./poles.js";
|
|
35
35
|
export { registerReportingTools } from "./reporting.js";
|
|
36
36
|
export { registerPlanningAbsenceTools } from "./planning-absences.js";
|
|
37
|
+
export { registerDocumentTools } from "./documents.js";
|
|
37
38
|
export { registerWorkflowTools } from "./workflows.js";
|
|
38
39
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,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,
|
|
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"}
|
package/dist/tools/invoices.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { InvoiceSearchSchema, InvoiceCreateSchema, InvoiceUpdateSchema, IdSchema } from "../schemas/index.js";
|
|
2
2
|
import { apiRequest, buildSearchQuery, formatListResponse, formatDetailResponse } from "../services/boond-client.js";
|
|
3
|
-
import { buildJsonApiBody } from "./crud-factory.js";
|
|
3
|
+
import { buildJsonApiBody, registerDeleteTool } from "./crud-factory.js";
|
|
4
4
|
export function registerInvoiceTools(server) {
|
|
5
5
|
// Search invoices
|
|
6
6
|
server.registerTool("boond_invoices_search", {
|
|
@@ -75,10 +75,12 @@ Returns: Liste des factures correspondantes.`,
|
|
|
75
75
|
const response = await apiRequest("/invoices", "POST", body);
|
|
76
76
|
const entity = Array.isArray(response.data) ? response.data[0] : response.data;
|
|
77
77
|
return {
|
|
78
|
-
content: [
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
79
80
|
type: "text",
|
|
80
81
|
text: `✅ Facture créée avec succès.\nID: ${entity?.id}\n\n${formatDetailResponse(response)}`,
|
|
81
|
-
}
|
|
82
|
+
},
|
|
83
|
+
],
|
|
82
84
|
};
|
|
83
85
|
});
|
|
84
86
|
// Update invoice
|
|
@@ -97,28 +99,18 @@ Returns: Liste des factures correspondantes.`,
|
|
|
97
99
|
const body = buildJsonApiBody("invoice", attrs, id);
|
|
98
100
|
const response = await apiRequest(`/invoices/${id}`, "PATCH", body);
|
|
99
101
|
return {
|
|
100
|
-
content: [
|
|
102
|
+
content: [
|
|
103
|
+
{
|
|
101
104
|
type: "text",
|
|
102
105
|
text: `✅ Facture #${id} mise à jour.\n\n${formatDetailResponse(response)}`,
|
|
103
|
-
}
|
|
106
|
+
},
|
|
107
|
+
],
|
|
104
108
|
};
|
|
105
109
|
});
|
|
106
|
-
// Delete invoice
|
|
107
|
-
server
|
|
110
|
+
// Delete invoice — via la factory pour l'élicitation de confirmation + structuredContent
|
|
111
|
+
registerDeleteTool(server, { entityName: "facture", entityNamePlural: "factures", apiPath: "/invoices", prefix: "boond_invoices" }, {
|
|
108
112
|
title: "Supprimer une facture",
|
|
109
|
-
description: `Supprime une facture de BoondManager. ⚠️ Action irréversible.`,
|
|
110
|
-
inputSchema: IdSchema,
|
|
111
|
-
annotations: {
|
|
112
|
-
readOnlyHint: false,
|
|
113
|
-
destructiveHint: true,
|
|
114
|
-
idempotentHint: false,
|
|
115
|
-
openWorldHint: false,
|
|
116
|
-
},
|
|
117
|
-
}, async (params) => {
|
|
118
|
-
await apiRequest(`/invoices/${params.id}`, "DELETE");
|
|
119
|
-
return {
|
|
120
|
-
content: [{ type: "text", text: `🗑️ Facture #${params.id} supprimée.` }],
|
|
121
|
-
};
|
|
113
|
+
description: `Supprime une facture de BoondManager. ⚠️ Action irréversible. Si le client MCP supporte l'élicitation, une confirmation est demandée avant la suppression.`,
|
|
122
114
|
});
|
|
123
115
|
}
|
|
124
116
|
//# sourceMappingURL=invoices.js.map
|