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.
- package/README.md +57 -4
- package/dist/config/access-policy.d.ts.map +1 -1
- package/dist/config/access-policy.js +6 -18
- package/dist/config/access-policy.js.map +1 -1
- package/dist/config/dictionary-overrides.d.ts.map +1 -1
- package/dist/config/dictionary-overrides.js +2 -12
- package/dist/config/dictionary-overrides.js.map +1 -1
- package/dist/config/env.d.ts +63 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +116 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/profiles.d.ts +22 -8
- package/dist/config/profiles.d.ts.map +1 -1
- package/dist/config/profiles.js +48 -4
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/transport-kind.d.ts +8 -0
- package/dist/config/transport-kind.d.ts.map +1 -0
- package/dist/config/transport-kind.js +13 -0
- package/dist/config/transport-kind.js.map +1 -0
- package/dist/constants.d.ts +20 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +32 -1
- package/dist/constants.js.map +1 -1
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +6 -1
- package/dist/icons.js.map +1 -1
- package/dist/index.js +32 -20
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +6 -6
- package/dist/instructions.js.map +1 -1
- package/dist/prompts/index.d.ts +19 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +495 -25
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/periods.d.ts +45 -0
- package/dist/prompts/periods.d.ts.map +1 -0
- package/dist/prompts/periods.js +154 -0
- package/dist/prompts/periods.js.map +1 -0
- package/dist/resources/index.d.ts +14 -0
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +285 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/templates.d.ts +1 -1
- package/dist/resources/templates.d.ts.map +1 -1
- package/dist/resources/templates.js +2 -0
- package/dist/resources/templates.js.map +1 -1
- package/dist/schema-dialect.js.map +1 -1
- package/dist/schemas/filter-aliases.d.ts +1 -1
- package/dist/schemas/filter-aliases.d.ts.map +1 -1
- package/dist/schemas/filter-aliases.js +101 -2
- package/dist/schemas/filter-aliases.js.map +1 -1
- package/dist/schemas/index.d.ts +1045 -163
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +979 -330
- package/dist/schemas/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -3
- package/dist/server.js.map +1 -1
- package/dist/services/boond-client.d.ts +29 -213
- package/dist/services/boond-client.d.ts.map +1 -1
- package/dist/services/boond-client.js +29 -1168
- package/dist/services/boond-client.js.map +1 -1
- package/dist/services/dictionary.d.ts +27 -3
- package/dist/services/dictionary.d.ts.map +1 -1
- package/dist/services/dictionary.js +60 -23
- package/dist/services/dictionary.js.map +1 -1
- package/dist/services/document-text.d.ts +32 -0
- package/dist/services/document-text.d.ts.map +1 -0
- package/dist/services/document-text.js +120 -0
- package/dist/services/document-text.js.map +1 -0
- package/dist/services/format/detail.d.ts +16 -0
- package/dist/services/format/detail.d.ts.map +1 -0
- package/dist/services/format/detail.js +36 -0
- package/dist/services/format/detail.js.map +1 -0
- package/dist/services/format/html.d.ts +19 -0
- package/dist/services/format/html.d.ts.map +1 -0
- package/dist/services/format/html.js +87 -0
- package/dist/services/format/html.js.map +1 -0
- package/dist/services/format/list.d.ts +3 -0
- package/dist/services/format/list.d.ts.map +1 -0
- package/dist/services/format/list.js +44 -0
- package/dist/services/format/list.js.map +1 -0
- package/dist/services/format/summary.d.ts +23 -0
- package/dist/services/format/summary.d.ts.map +1 -0
- package/dist/services/format/summary.js +194 -0
- package/dist/services/format/summary.js.map +1 -0
- package/dist/services/format/tab.d.ts +9 -0
- package/dist/services/format/tab.d.ts.map +1 -0
- package/dist/services/format/tab.js +32 -0
- package/dist/services/format/tab.js.map +1 -0
- package/dist/services/http/auth.d.ts +44 -0
- package/dist/services/http/auth.d.ts.map +1 -0
- package/dist/services/http/auth.js +146 -0
- package/dist/services/http/auth.js.map +1 -0
- package/dist/services/http/download.d.ts +60 -0
- package/dist/services/http/download.d.ts.map +1 -0
- package/dist/services/http/download.js +160 -0
- package/dist/services/http/download.js.map +1 -0
- package/dist/services/http/errors.d.ts +45 -0
- package/dist/services/http/errors.d.ts.map +1 -0
- package/dist/services/http/errors.js +188 -0
- package/dist/services/http/errors.js.map +1 -0
- package/dist/services/http/rate-limit.d.ts +40 -0
- package/dist/services/http/rate-limit.d.ts.map +1 -0
- package/dist/services/http/rate-limit.js +92 -0
- package/dist/services/http/rate-limit.js.map +1 -0
- package/dist/services/http/retry.d.ts +46 -0
- package/dist/services/http/retry.d.ts.map +1 -0
- package/dist/services/http/retry.js +101 -0
- package/dist/services/http/retry.js.map +1 -0
- package/dist/services/http/transport.d.ts +85 -0
- package/dist/services/http/transport.d.ts.map +1 -0
- package/dist/services/http/transport.js +283 -0
- package/dist/services/http/transport.js.map +1 -0
- package/dist/services/logger.d.ts +53 -2
- package/dist/services/logger.d.ts.map +1 -1
- package/dist/services/logger.js +82 -21
- package/dist/services/logger.js.map +1 -1
- package/dist/services/oauth.d.ts +12 -0
- package/dist/services/oauth.d.ts.map +1 -1
- package/dist/services/oauth.js +21 -8
- package/dist/services/oauth.js.map +1 -1
- package/dist/services/rate-limiter.d.ts +9 -2
- package/dist/services/rate-limiter.d.ts.map +1 -1
- package/dist/services/rate-limiter.js +18 -6
- package/dist/services/rate-limiter.js.map +1 -1
- package/dist/services/request-context.d.ts +47 -0
- package/dist/services/request-context.d.ts.map +1 -0
- package/dist/services/request-context.js +112 -0
- package/dist/services/request-context.js.map +1 -0
- package/dist/services/search.d.ts +26 -0
- package/dist/services/search.d.ts.map +1 -0
- package/dist/services/search.js +98 -0
- package/dist/services/search.js.map +1 -0
- package/dist/services/update-checker.d.ts.map +1 -1
- package/dist/services/update-checker.js +15 -8
- package/dist/services/update-checker.js.map +1 -1
- package/dist/services/upload-source.d.ts +31 -0
- package/dist/services/upload-source.d.ts.map +1 -0
- package/dist/services/upload-source.js +180 -0
- package/dist/services/upload-source.js.map +1 -0
- package/dist/tools/absences.d.ts +9 -0
- package/dist/tools/absences.d.ts.map +1 -1
- package/dist/tools/absences.js +65 -20
- package/dist/tools/absences.js.map +1 -1
- package/dist/tools/actions.d.ts.map +1 -1
- package/dist/tools/actions.js +11 -27
- package/dist/tools/actions.js.map +1 -1
- package/dist/tools/advantages.d.ts +2 -0
- package/dist/tools/advantages.d.ts.map +1 -1
- package/dist/tools/advantages.js +66 -13
- package/dist/tools/advantages.js.map +1 -1
- package/dist/tools/alerts.d.ts +18 -0
- package/dist/tools/alerts.d.ts.map +1 -0
- package/dist/tools/alerts.js +82 -0
- package/dist/tools/alerts.js.map +1 -0
- package/dist/tools/application.d.ts +2 -1
- package/dist/tools/application.d.ts.map +1 -1
- package/dist/tools/application.js +9 -3
- package/dist/tools/application.js.map +1 -1
- package/dist/tools/candidates.d.ts +7 -0
- package/dist/tools/candidates.d.ts.map +1 -1
- package/dist/tools/candidates.js +96 -1
- package/dist/tools/candidates.js.map +1 -1
- package/dist/tools/contacts.d.ts.map +1 -1
- package/dist/tools/contacts.js +3 -7
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/contracts.d.ts +22 -0
- package/dist/tools/contracts.d.ts.map +1 -1
- package/dist/tools/contracts.js +185 -52
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/crud-factory.d.ts +33 -2
- package/dist/tools/crud-factory.d.ts.map +1 -1
- package/dist/tools/crud-factory.js +45 -17
- package/dist/tools/crud-factory.js.map +1 -1
- package/dist/tools/deliveries.d.ts +3 -0
- package/dist/tools/deliveries.d.ts.map +1 -1
- package/dist/tools/deliveries.js +50 -94
- package/dist/tools/deliveries.js.map +1 -1
- package/dist/tools/description-builders.d.ts +0 -1
- package/dist/tools/description-builders.d.ts.map +1 -1
- package/dist/tools/description-builders.js +47 -4
- package/dist/tools/description-builders.js.map +1 -1
- package/dist/tools/documents.d.ts.map +1 -1
- package/dist/tools/documents.js +113 -27
- package/dist/tools/documents.js.map +1 -1
- package/dist/tools/expenses.d.ts.map +1 -1
- package/dist/tools/expenses.js +2 -11
- package/dist/tools/expenses.js.map +1 -1
- package/dist/tools/find.d.ts +61 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +221 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/flags.d.ts +5 -0
- package/dist/tools/flags.d.ts.map +1 -1
- package/dist/tools/flags.js +116 -1
- package/dist/tools/flags.js.map +1 -1
- package/dist/tools/forms.d.ts +5 -0
- package/dist/tools/forms.d.ts.map +1 -0
- package/dist/tools/forms.js +64 -0
- package/dist/tools/forms.js.map +1 -0
- package/dist/tools/groupments.d.ts +5 -0
- package/dist/tools/groupments.d.ts.map +1 -0
- package/dist/tools/groupments.js +68 -0
- package/dist/tools/groupments.js.map +1 -0
- package/dist/tools/inactivities.d.ts +5 -0
- package/dist/tools/inactivities.d.ts.map +1 -0
- package/dist/tools/inactivities.js +59 -0
- package/dist/tools/inactivities.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/invoices.d.ts.map +1 -1
- package/dist/tools/invoices.js +27 -2
- package/dist/tools/invoices.js.map +1 -1
- package/dist/tools/linked-entity-filters.d.ts +48 -0
- package/dist/tools/linked-entity-filters.d.ts.map +1 -0
- package/dist/tools/linked-entity-filters.js +64 -0
- package/dist/tools/linked-entity-filters.js.map +1 -0
- package/dist/tools/notifications.d.ts.map +1 -1
- package/dist/tools/notifications.js +0 -5
- package/dist/tools/notifications.js.map +1 -1
- package/dist/tools/orders.d.ts.map +1 -1
- package/dist/tools/orders.js +33 -4
- package/dist/tools/orders.js.map +1 -1
- package/dist/tools/parameter-disclosure.js.map +1 -1
- package/dist/tools/payments.d.ts +3 -0
- package/dist/tools/payments.d.ts.map +1 -1
- package/dist/tools/payments.js +43 -109
- package/dist/tools/payments.js.map +1 -1
- package/dist/tools/positionings.d.ts.map +1 -1
- package/dist/tools/positionings.js +9 -39
- package/dist/tools/positionings.js.map +1 -1
- package/dist/tools/projects.d.ts.map +1 -1
- package/dist/tools/projects.js +5 -12
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/provider-invoices.d.ts +2 -0
- package/dist/tools/provider-invoices.d.ts.map +1 -1
- package/dist/tools/provider-invoices.js +30 -111
- package/dist/tools/provider-invoices.js.map +1 -1
- package/dist/tools/purchases.d.ts +2 -0
- package/dist/tools/purchases.d.ts.map +1 -1
- package/dist/tools/purchases.js +50 -104
- package/dist/tools/purchases.js.map +1 -1
- package/dist/tools/registration-decorators.d.ts +28 -0
- package/dist/tools/registration-decorators.d.ts.map +1 -1
- package/dist/tools/registration-decorators.js +107 -0
- package/dist/tools/registration-decorators.js.map +1 -1
- package/dist/tools/resources.d.ts.map +1 -1
- package/dist/tools/resources.js +27 -5
- package/dist/tools/resources.js.map +1 -1
- package/dist/tools/rights.d.ts +101 -0
- package/dist/tools/rights.d.ts.map +1 -0
- package/dist/tools/rights.js +75 -0
- package/dist/tools/rights.js.map +1 -0
- package/dist/tools/tab-tools.js +3 -3
- package/dist/tools/tab-tools.js.map +1 -1
- package/dist/tools/timesheets.d.ts +29 -0
- package/dist/tools/timesheets.d.ts.map +1 -1
- package/dist/tools/timesheets.js +196 -126
- package/dist/tools/timesheets.js.map +1 -1
- package/dist/tools/todolists.d.ts +2 -0
- package/dist/tools/todolists.d.ts.map +1 -1
- package/dist/tools/todolists.js +64 -1
- package/dist/tools/todolists.js.map +1 -1
- package/dist/tools/usage-guidance.d.ts.map +1 -1
- package/dist/tools/usage-guidance.js +12 -3
- package/dist/tools/usage-guidance.js.map +1 -1
- package/dist/tools/validations.d.ts +9 -0
- package/dist/tools/validations.d.ts.map +1 -1
- package/dist/tools/validations.js +86 -9
- package/dist/tools/validations.js.map +1 -1
- package/dist/tools/workflows.js +1 -1
- package/dist/tools/workflows.js.map +1 -1
- package/dist/transports/http.d.ts +116 -0
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +422 -92
- package/dist/transports/http.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/manifest.json +2 -2
- package/package.json +6 -5
package/dist/tools/todolists.js
CHANGED
|
@@ -1,12 +1,75 @@
|
|
|
1
|
-
import {
|
|
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;
|
|
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,
|
|
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é
|
|
45
|
-
instead: "aucune alternative
|
|
46
|
-
"
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH,MAAM,CAAC,MAAM,cAAc,GAAkC;IAC3D,uCAAuC;IACvC,8BAA8B,EAAE;QAC9B,IAAI,EAAE,mIAAmI;QACzI,OAAO,EACL,6GAA6G;YAC7G,0FAA0F;KAC7F;IACD,4BAA4B,EAAE;QAC5B,IAAI,EAAE,mHAAmH;QACzH,OAAO,EACL,4GAA4G;YAC5G,6GAA6G;YAC7G,mCAAmC;KACtC;IAED,sBAAsB;IACtB,mBAAmB,EAAE;QACnB,IAAI,EAAE,wGAAwG;QAC9G,OAAO,EACL,0GAA0G;YAC1G,0HAA0H;KAC7H;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE
|
|
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;
|
|
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 {
|
|
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;
|
|
1
|
+
{"version":3,"file":"validations.js","sourceRoot":"","sources":["../../src/tools/validations.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/workflows.js
CHANGED
|
@@ -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,
|
|
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":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|