@frihet/mcp-server 1.16.3 → 1.16.5

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 (209) hide show
  1. package/README.md +1 -1
  2. package/dist/client-interface.d.ts +1 -1
  3. package/dist/client.d.ts +13 -1
  4. package/dist/client.js +70 -6
  5. package/dist/demo-client.d.ts +1 -1
  6. package/dist/demo-client.js +23 -3
  7. package/dist/openai-profile.js +1 -1
  8. package/dist/tools/invoices.js +24 -11
  9. package/package.json +11 -5
  10. package/scripts/postinstall.js +30 -8
  11. package/dist/__tests__/audit-server-version.test.d.ts +0 -13
  12. package/dist/__tests__/audit-server-version.test.d.ts.map +0 -1
  13. package/dist/__tests__/audit-server-version.test.js +0 -96
  14. package/dist/__tests__/audit-server-version.test.js.map +0 -1
  15. package/dist/__tests__/banking-client-contract.test.d.ts +0 -20
  16. package/dist/__tests__/banking-client-contract.test.d.ts.map +0 -1
  17. package/dist/__tests__/banking-client-contract.test.js +0 -133
  18. package/dist/__tests__/banking-client-contract.test.js.map +0 -1
  19. package/dist/__tests__/banking-tools.test.d.ts +0 -18
  20. package/dist/__tests__/banking-tools.test.d.ts.map +0 -1
  21. package/dist/__tests__/banking-tools.test.js +0 -252
  22. package/dist/__tests__/banking-tools.test.js.map +0 -1
  23. package/dist/__tests__/contract.test.d.ts +0 -33
  24. package/dist/__tests__/contract.test.d.ts.map +0 -1
  25. package/dist/__tests__/contract.test.js +0 -208
  26. package/dist/__tests__/contract.test.js.map +0 -1
  27. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts +0 -13
  28. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts.map +0 -1
  29. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js +0 -420
  30. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js.map +0 -1
  31. package/dist/__tests__/demo-mode.test.d.ts +0 -11
  32. package/dist/__tests__/demo-mode.test.d.ts.map +0 -1
  33. package/dist/__tests__/demo-mode.test.js +0 -119
  34. package/dist/__tests__/demo-mode.test.js.map +0 -1
  35. package/dist/__tests__/einvoice-day4-tools.test.d.ts +0 -16
  36. package/dist/__tests__/einvoice-day4-tools.test.d.ts.map +0 -1
  37. package/dist/__tests__/einvoice-day4-tools.test.js +0 -421
  38. package/dist/__tests__/einvoice-day4-tools.test.js.map +0 -1
  39. package/dist/__tests__/einvoice-integration.test.d.ts +0 -24
  40. package/dist/__tests__/einvoice-integration.test.d.ts.map +0 -1
  41. package/dist/__tests__/einvoice-integration.test.js +0 -142
  42. package/dist/__tests__/einvoice-integration.test.js.map +0 -1
  43. package/dist/__tests__/einvoice-tools.test.d.ts +0 -16
  44. package/dist/__tests__/einvoice-tools.test.d.ts.map +0 -1
  45. package/dist/__tests__/einvoice-tools.test.js +0 -411
  46. package/dist/__tests__/einvoice-tools.test.js.map +0 -1
  47. package/dist/__tests__/fiscal-tools.test.d.ts +0 -21
  48. package/dist/__tests__/fiscal-tools.test.d.ts.map +0 -1
  49. package/dist/__tests__/fiscal-tools.test.js +0 -271
  50. package/dist/__tests__/fiscal-tools.test.js.map +0 -1
  51. package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts +0 -27
  52. package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts.map +0 -1
  53. package/dist/__tests__/get-envelope-unwrap-regression.test.js +0 -223
  54. package/dist/__tests__/get-envelope-unwrap-regression.test.js.map +0 -1
  55. package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts +0 -14
  56. package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts.map +0 -1
  57. package/dist/__tests__/intelligence-duplicate-invoice.test.js +0 -108
  58. package/dist/__tests__/intelligence-duplicate-invoice.test.js.map +0 -1
  59. package/dist/__tests__/kitchen-tools.test.d.ts +0 -18
  60. package/dist/__tests__/kitchen-tools.test.d.ts.map +0 -1
  61. package/dist/__tests__/kitchen-tools.test.js +0 -399
  62. package/dist/__tests__/kitchen-tools.test.js.map +0 -1
  63. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts +0 -30
  64. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts.map +0 -1
  65. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js +0 -164
  66. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js.map +0 -1
  67. package/dist/__tests__/observability-redaction.test.d.ts +0 -13
  68. package/dist/__tests__/observability-redaction.test.d.ts.map +0 -1
  69. package/dist/__tests__/observability-redaction.test.js +0 -94
  70. package/dist/__tests__/observability-redaction.test.js.map +0 -1
  71. package/dist/__tests__/openai-grouped-compose.test.d.ts +0 -26
  72. package/dist/__tests__/openai-grouped-compose.test.d.ts.map +0 -1
  73. package/dist/__tests__/openai-grouped-compose.test.js +0 -245
  74. package/dist/__tests__/openai-grouped-compose.test.js.map +0 -1
  75. package/dist/__tests__/openai-profile.test.d.ts +0 -10
  76. package/dist/__tests__/openai-profile.test.d.ts.map +0 -1
  77. package/dist/__tests__/openai-profile.test.js +0 -168
  78. package/dist/__tests__/openai-profile.test.js.map +0 -1
  79. package/dist/__tests__/pagination-cursor-param.test.d.ts +0 -27
  80. package/dist/__tests__/pagination-cursor-param.test.d.ts.map +0 -1
  81. package/dist/__tests__/pagination-cursor-param.test.js +0 -96
  82. package/dist/__tests__/pagination-cursor-param.test.js.map +0 -1
  83. package/dist/__tests__/pos-tools.test.d.ts +0 -16
  84. package/dist/__tests__/pos-tools.test.d.ts.map +0 -1
  85. package/dist/__tests__/pos-tools.test.js +0 -244
  86. package/dist/__tests__/pos-tools.test.js.map +0 -1
  87. package/dist/__tests__/recurring-tools.test.d.ts +0 -23
  88. package/dist/__tests__/recurring-tools.test.d.ts.map +0 -1
  89. package/dist/__tests__/recurring-tools.test.js +0 -352
  90. package/dist/__tests__/recurring-tools.test.js.map +0 -1
  91. package/dist/__tests__/schema-envelope-guard.test.d.ts +0 -18
  92. package/dist/__tests__/schema-envelope-guard.test.d.ts.map +0 -1
  93. package/dist/__tests__/schema-envelope-guard.test.js +0 -56
  94. package/dist/__tests__/schema-envelope-guard.test.js.map +0 -1
  95. package/dist/__tests__/stay-tools.test.d.ts +0 -17
  96. package/dist/__tests__/stay-tools.test.d.ts.map +0 -1
  97. package/dist/__tests__/stay-tools.test.js +0 -259
  98. package/dist/__tests__/stay-tools.test.js.map +0 -1
  99. package/dist/__tests__/team-tools.test.d.ts +0 -18
  100. package/dist/__tests__/team-tools.test.d.ts.map +0 -1
  101. package/dist/__tests__/team-tools.test.js +0 -228
  102. package/dist/__tests__/team-tools.test.js.map +0 -1
  103. package/dist/__tests__/time-tools.test.d.ts +0 -19
  104. package/dist/__tests__/time-tools.test.d.ts.map +0 -1
  105. package/dist/__tests__/time-tools.test.js +0 -286
  106. package/dist/__tests__/time-tools.test.js.map +0 -1
  107. package/dist/__tests__/tool-exposure.test.d.ts +0 -11
  108. package/dist/__tests__/tool-exposure.test.d.ts.map +0 -1
  109. package/dist/__tests__/tool-exposure.test.js +0 -264
  110. package/dist/__tests__/tool-exposure.test.js.map +0 -1
  111. package/dist/client-interface.d.ts.map +0 -1
  112. package/dist/client-interface.js.map +0 -1
  113. package/dist/client.d.ts.map +0 -1
  114. package/dist/client.js.map +0 -1
  115. package/dist/demo-client.d.ts.map +0 -1
  116. package/dist/demo-client.js.map +0 -1
  117. package/dist/demo-fixtures.d.ts.map +0 -1
  118. package/dist/demo-fixtures.js.map +0 -1
  119. package/dist/index.d.ts.map +0 -1
  120. package/dist/index.js.map +0 -1
  121. package/dist/logger.d.ts.map +0 -1
  122. package/dist/logger.js.map +0 -1
  123. package/dist/metrics.d.ts.map +0 -1
  124. package/dist/metrics.js.map +0 -1
  125. package/dist/observability.d.ts.map +0 -1
  126. package/dist/observability.js.map +0 -1
  127. package/dist/openai-profile.d.ts.map +0 -1
  128. package/dist/openai-profile.js.map +0 -1
  129. package/dist/prompts/register-all.d.ts.map +0 -1
  130. package/dist/prompts/register-all.js.map +0 -1
  131. package/dist/redaction.d.ts.map +0 -1
  132. package/dist/redaction.js.map +0 -1
  133. package/dist/resources/register-all.d.ts.map +0 -1
  134. package/dist/resources/register-all.js.map +0 -1
  135. package/dist/tool-exposure.d.ts.map +0 -1
  136. package/dist/tool-exposure.js.map +0 -1
  137. package/dist/tools/accountingClose.d.ts.map +0 -1
  138. package/dist/tools/accountingClose.js.map +0 -1
  139. package/dist/tools/audit_gl.d.ts.map +0 -1
  140. package/dist/tools/audit_gl.js.map +0 -1
  141. package/dist/tools/backend-availability.d.ts.map +0 -1
  142. package/dist/tools/backend-availability.js.map +0 -1
  143. package/dist/tools/bank_rules.d.ts.map +0 -1
  144. package/dist/tools/bank_rules.js.map +0 -1
  145. package/dist/tools/banking.d.ts.map +0 -1
  146. package/dist/tools/banking.js.map +0 -1
  147. package/dist/tools/clients.d.ts.map +0 -1
  148. package/dist/tools/clients.js.map +0 -1
  149. package/dist/tools/crm.d.ts.map +0 -1
  150. package/dist/tools/crm.js.map +0 -1
  151. package/dist/tools/deposits.d.ts.map +0 -1
  152. package/dist/tools/deposits.js.map +0 -1
  153. package/dist/tools/einvoice.d.ts.map +0 -1
  154. package/dist/tools/einvoice.js.map +0 -1
  155. package/dist/tools/expenses.d.ts.map +0 -1
  156. package/dist/tools/expenses.js.map +0 -1
  157. package/dist/tools/fiscal.d.ts.map +0 -1
  158. package/dist/tools/fiscal.js.map +0 -1
  159. package/dist/tools/gestoria.d.ts.map +0 -1
  160. package/dist/tools/gestoria.js.map +0 -1
  161. package/dist/tools/hr.d.ts.map +0 -1
  162. package/dist/tools/hr.js.map +0 -1
  163. package/dist/tools/igic.d.ts.map +0 -1
  164. package/dist/tools/igic.js.map +0 -1
  165. package/dist/tools/impuesto_sociedades.d.ts.map +0 -1
  166. package/dist/tools/impuesto_sociedades.js.map +0 -1
  167. package/dist/tools/intelligence.d.ts.map +0 -1
  168. package/dist/tools/intelligence.js.map +0 -1
  169. package/dist/tools/invoices.d.ts.map +0 -1
  170. package/dist/tools/invoices.js.map +0 -1
  171. package/dist/tools/kitchen.d.ts.map +0 -1
  172. package/dist/tools/kitchen.js.map +0 -1
  173. package/dist/tools/onboard_vies.d.ts.map +0 -1
  174. package/dist/tools/onboard_vies.js.map +0 -1
  175. package/dist/tools/onboarding.d.ts.map +0 -1
  176. package/dist/tools/onboarding.js.map +0 -1
  177. package/dist/tools/payroll.d.ts.map +0 -1
  178. package/dist/tools/payroll.js.map +0 -1
  179. package/dist/tools/permissions.d.ts.map +0 -1
  180. package/dist/tools/permissions.js.map +0 -1
  181. package/dist/tools/portal_domain.d.ts.map +0 -1
  182. package/dist/tools/portal_domain.js.map +0 -1
  183. package/dist/tools/pos.d.ts.map +0 -1
  184. package/dist/tools/pos.js.map +0 -1
  185. package/dist/tools/products.d.ts.map +0 -1
  186. package/dist/tools/products.js.map +0 -1
  187. package/dist/tools/quotes.d.ts.map +0 -1
  188. package/dist/tools/quotes.js.map +0 -1
  189. package/dist/tools/recurring.d.ts.map +0 -1
  190. package/dist/tools/recurring.js.map +0 -1
  191. package/dist/tools/register-all.d.ts.map +0 -1
  192. package/dist/tools/register-all.js.map +0 -1
  193. package/dist/tools/shared.d.ts.map +0 -1
  194. package/dist/tools/shared.js.map +0 -1
  195. package/dist/tools/stay.d.ts.map +0 -1
  196. package/dist/tools/stay.js.map +0 -1
  197. package/dist/tools/team.d.ts.map +0 -1
  198. package/dist/tools/team.js.map +0 -1
  199. package/dist/tools/time.d.ts.map +0 -1
  200. package/dist/tools/time.js.map +0 -1
  201. package/dist/tools/vendors.d.ts.map +0 -1
  202. package/dist/tools/vendors.js.map +0 -1
  203. package/dist/tools/webhooks.d.ts.map +0 -1
  204. package/dist/tools/webhooks.js.map +0 -1
  205. package/dist/types.d.ts.map +0 -1
  206. package/dist/types.js.map +0 -1
  207. package/scripts/audit-mcp-refs.mjs +0 -402
  208. package/scripts/no-public-leak.sh +0 -60
  209. package/scripts/test-openai-grouped-compose.mjs +0 -173
@@ -1,108 +0,0 @@
1
- /**
2
- * Regression test for duplicate_invoice (intelligence.ts).
3
- *
4
- * Bug: duplicate_invoice fetched the FULL raw stored invoice (getInvoice returns
5
- * the entire Firestore doc) and spread it into createInvoice, only blacklisting
6
- * 6 fields. The create endpoint validates against a Zod `.strict()` schema that
7
- * REJECTS unknown keys → HTTP 400, so any paid/sent/cancelled/e-invoiced invoice
8
- * failed to duplicate. Fix: allowlist-PICK only the writable create fields.
9
- *
10
- * This test asserts the body sent to createInvoice contains ONLY allowlisted
11
- * fields (no payments/verifactu/operationType/documentNumber/total/…).
12
- */
13
- import { test, describe } from "node:test";
14
- import assert from "node:assert/strict";
15
- class StubMcpServer {
16
- tools = new Map();
17
- registerTool(name, config, handler) {
18
- this.tools.set(name, { name, config, handler });
19
- }
20
- }
21
- // A realistic FULL stored invoice doc as getInvoice returns it: writable fields
22
- // PLUS many stored-only fields the strict create schema rejects.
23
- const STORED_INVOICE = {
24
- id: "inv_123",
25
- documentNumber: "2026-0042",
26
- status: "paid",
27
- total: 1210,
28
- createdAt: "2026-05-01T10:00:00Z",
29
- updatedAt: "2026-05-02T10:00:00Z",
30
- // ── writable (must be copied) ──
31
- clientName: "Acme Corp",
32
- clientId: "cli_9",
33
- clientAddress: "Gran Via 1, Madrid",
34
- clientTaxId: "B12345678",
35
- items: [{ description: "Consulting", quantity: 10, unitPrice: 100 }],
36
- dueDate: "2026-06-01",
37
- notes: "Thanks",
38
- taxRate: 21,
39
- irpfRate: 15,
40
- equivalenceSurchargeRate: 0,
41
- clientLocation: "peninsula",
42
- prepayment: 0,
43
- seriesId: "A",
44
- // ── stored-only (must NOT be copied — would 400 the strict create schema) ──
45
- payments: [{ amount: 1210, date: "2026-05-10" }],
46
- amountPaid: 1210,
47
- verifactu: { hash: "abc", chained: true },
48
- eInvoice: { format: "facturae" },
49
- operationType: "S1",
50
- poNumber: "PO-77",
51
- discountRate: 5,
52
- createdBy: "user_x",
53
- sentTo: "billing@acme.com",
54
- sentAt: "2026-05-02T10:00:00Z",
55
- cancelledAt: null,
56
- attachments: ["a.pdf"],
57
- };
58
- const REJECTED_FIELDS = [
59
- "payments", "amountPaid", "verifactu", "eInvoice", "operationType",
60
- "poNumber", "discountRate", "createdBy", "sentTo", "sentAt",
61
- "cancelledAt", "attachments", "documentNumber", "total", "createdAt", "updatedAt", "id",
62
- ];
63
- const COPYABLE_FIELDS = [
64
- "clientName", "clientId", "clientAddress", "clientTaxId", "items",
65
- "notes", "taxRate", "irpfRate", "equivalenceSurchargeRate",
66
- "clientLocation", "prepayment", "seriesId",
67
- ];
68
- async function makeServerCapturing(captured) {
69
- const server = new StubMcpServer();
70
- const client = {
71
- getInvoice: async (_id) => ({ ...STORED_INVOICE }),
72
- createInvoice: async (data) => {
73
- captured.body = data;
74
- return { id: "inv_dup", status: "draft", ...data };
75
- },
76
- };
77
- const { registerIntelligenceTools } = await import("../tools/intelligence.js");
78
- registerIntelligenceTools(server, client);
79
- return server;
80
- }
81
- describe("duplicate_invoice — allowlist pick", () => {
82
- test("sends ONLY writable fields to createInvoice (no strict-schema rejects)", async () => {
83
- const captured = {};
84
- const server = await makeServerCapturing(captured);
85
- const tool = server.tools.get("duplicate_invoice");
86
- assert.ok(tool, "duplicate_invoice should be registered");
87
- const result = await tool.handler({ id: "inv_123" });
88
- assert.notEqual(result.isError, true, "duplicate should not error");
89
- assert.ok(captured.body, "createInvoice should have been called");
90
- for (const f of REJECTED_FIELDS) {
91
- assert.equal(f in captured.body, false, `create body must NOT carry stored-only field "${f}"`);
92
- }
93
- for (const f of COPYABLE_FIELDS) {
94
- assert.equal(f in captured.body, true, `create body must carry writable field "${f}"`);
95
- }
96
- assert.equal(captured.body.status, "draft", "status forced to draft");
97
- assert.equal(typeof captured.body.issueDate, "string", "issueDate set");
98
- });
99
- test("honors newIssueDate + newDueDate overrides", async () => {
100
- const captured = {};
101
- const server = await makeServerCapturing(captured);
102
- const tool = server.tools.get("duplicate_invoice");
103
- await tool.handler({ id: "inv_123", newIssueDate: "2026-07-01", newDueDate: "2026-08-01" });
104
- assert.equal(captured.body.issueDate, "2026-07-01");
105
- assert.equal(captured.body.dueDate, "2026-08-01");
106
- });
107
- });
108
- //# sourceMappingURL=intelligence-duplicate-invoice.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intelligence-duplicate-invoice.test.js","sourceRoot":"","sources":["../../src/__tests__/intelligence-duplicate-invoice.test.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * Tests for Kitchen MCP tools — Wave 6 (6 tools).
3
- *
4
- * Uses Node.js built-in test runner (node:test + node:assert).
5
- * Run: npm test (after build)
6
- *
7
- * Coverage:
8
- * 1. Tool registration — all 6 tools registered on McpServer
9
- * 2. list_kitchen_tickets — success path + structuredContent shape
10
- * 3. get_kitchen_ticket — success path + structuredContent shape
11
- * 4. update_kitchen_ticket — success path + structuredContent shape
12
- * 5. list_kitchen_stations — success path + structuredContent shape
13
- * 6. list_menu_items — success path + structuredContent shape
14
- * 7. kitchen_flow_summary — success path + bottleneck detection
15
- * 8. API error path — 404 propagated through handleToolError
16
- */
17
- export {};
18
- //# sourceMappingURL=kitchen-tools.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kitchen-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/kitchen-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -1,399 +0,0 @@
1
- /**
2
- * Tests for Kitchen MCP tools — Wave 6 (6 tools).
3
- *
4
- * Uses Node.js built-in test runner (node:test + node:assert).
5
- * Run: npm test (after build)
6
- *
7
- * Coverage:
8
- * 1. Tool registration — all 6 tools registered on McpServer
9
- * 2. list_kitchen_tickets — success path + structuredContent shape
10
- * 3. get_kitchen_ticket — success path + structuredContent shape
11
- * 4. update_kitchen_ticket — success path + structuredContent shape
12
- * 5. list_kitchen_stations — success path + structuredContent shape
13
- * 6. list_menu_items — success path + structuredContent shape
14
- * 7. kitchen_flow_summary — success path + bottleneck detection
15
- * 8. API error path — 404 propagated through handleToolError
16
- */
17
- import { test, describe, beforeEach } from "node:test";
18
- import assert from "node:assert/strict";
19
- class StubMcpServer {
20
- tools = new Map();
21
- registerTool(name, config, handler) {
22
- this.tools.set(name, { name, config, handler });
23
- }
24
- }
25
- // ── Fixtures ─────────────────────────────────────────────────────────────────
26
- const MOCK_TICKET = {
27
- id: "tkt_001",
28
- stationId: "sta_grill",
29
- status: "preparing",
30
- tableRef: "T4",
31
- items: [
32
- { id: "ti_001", menuItemId: "mi_burger", name: "Burger", quantity: 2, notes: "no onions", status: "preparing" },
33
- ],
34
- createdAt: "2026-06-15T12:00:00Z",
35
- updatedAt: "2026-06-15T12:01:00Z",
36
- };
37
- const MOCK_TICKET_2 = {
38
- id: "tkt_002",
39
- stationId: "sta_grill",
40
- status: "queued",
41
- tableRef: "T5",
42
- items: [
43
- { id: "ti_002", menuItemId: "mi_fries", name: "Fries", quantity: 1, notes: "", status: "queued" },
44
- ],
45
- createdAt: "2026-06-15T12:02:00Z",
46
- updatedAt: "2026-06-15T12:02:00Z",
47
- };
48
- const MOCK_TICKET_3 = {
49
- id: "tkt_003",
50
- stationId: "sta_bar",
51
- status: "ready",
52
- tableRef: "T2",
53
- items: [
54
- { id: "ti_003", menuItemId: "mi_mojito", name: "Mojito", quantity: 3, notes: "", status: "ready" },
55
- ],
56
- createdAt: "2026-06-15T12:05:00Z",
57
- updatedAt: "2026-06-15T12:06:00Z",
58
- };
59
- const MOCK_TICKETS_LIST = {
60
- data: [MOCK_TICKET, MOCK_TICKET_2, MOCK_TICKET_3],
61
- total: 3,
62
- limit: 100,
63
- offset: 0,
64
- };
65
- const MOCK_STATION = {
66
- id: "sta_grill",
67
- name: "Grill",
68
- isActive: true,
69
- createdAt: "2026-01-01T00:00:00Z",
70
- updatedAt: "2026-01-01T00:00:00Z",
71
- };
72
- const MOCK_STATION_2 = {
73
- id: "sta_bar",
74
- name: "Bar",
75
- isActive: true,
76
- createdAt: "2026-01-01T00:00:00Z",
77
- updatedAt: "2026-01-01T00:00:00Z",
78
- };
79
- const MOCK_STATIONS_LIST = {
80
- data: [MOCK_STATION, MOCK_STATION_2],
81
- total: 2,
82
- limit: 100,
83
- offset: 0,
84
- };
85
- const MOCK_MENU_ITEM = {
86
- id: "mi_burger",
87
- name: "Burger",
88
- description: "Classic beef burger",
89
- priceCents: 1200,
90
- category: "Main",
91
- isActive: true,
92
- createdAt: "2026-01-01T00:00:00Z",
93
- updatedAt: "2026-01-01T00:00:00Z",
94
- };
95
- const MOCK_MENU_ITEMS_LIST = {
96
- data: [MOCK_MENU_ITEM],
97
- total: 1,
98
- limit: 20,
99
- offset: 0,
100
- };
101
- const MOCK_UPDATED_TICKET = { ...MOCK_TICKET, status: "ready" };
102
- // ── Client stubs ─────────────────────────────────────────────────────────────
103
- function makeSuccessClient() {
104
- return {
105
- listKitchenTickets: async () => MOCK_TICKETS_LIST,
106
- getKitchenTicket: async (_id) => MOCK_TICKET,
107
- updateKitchenTicket: async (_id, _data) => MOCK_UPDATED_TICKET,
108
- listKitchenStations: async () => MOCK_STATIONS_LIST,
109
- listMenuItems: async () => MOCK_MENU_ITEMS_LIST,
110
- };
111
- }
112
- function make404Client() {
113
- const notFound = () => {
114
- const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
115
- return Promise.reject(err);
116
- };
117
- return {
118
- listKitchenTickets: notFound,
119
- getKitchenTicket: notFound,
120
- updateKitchenTicket: notFound,
121
- listKitchenStations: notFound,
122
- listMenuItems: notFound,
123
- };
124
- }
125
- // ── Helper ───────────────────────────────────────────────────────────────────
126
- async function makeServer(clientFn) {
127
- const server = new StubMcpServer();
128
- const { registerKitchenTools } = await import("../tools/kitchen.js");
129
- registerKitchenTools(server, clientFn());
130
- return server;
131
- }
132
- // ── Registration tests ───────────────────────────────────────────────────────
133
- describe("Kitchen Tools — Registration", () => {
134
- let server;
135
- beforeEach(async () => {
136
- server = await makeServer(makeSuccessClient);
137
- });
138
- test("registers exactly 6 kitchen tools", () => {
139
- assert.equal(server.tools.size, 6);
140
- });
141
- test("registers list_kitchen_tickets", () => {
142
- assert.ok(server.tools.has("list_kitchen_tickets"), "list_kitchen_tickets not registered");
143
- });
144
- test("registers get_kitchen_ticket", () => {
145
- assert.ok(server.tools.has("get_kitchen_ticket"), "get_kitchen_ticket not registered");
146
- });
147
- test("registers update_kitchen_ticket", () => {
148
- assert.ok(server.tools.has("update_kitchen_ticket"), "update_kitchen_ticket not registered");
149
- });
150
- test("registers list_kitchen_stations", () => {
151
- assert.ok(server.tools.has("list_kitchen_stations"), "list_kitchen_stations not registered");
152
- });
153
- test("registers list_menu_items", () => {
154
- assert.ok(server.tools.has("list_menu_items"), "list_menu_items not registered");
155
- });
156
- test("registers kitchen_flow_summary", () => {
157
- assert.ok(server.tools.has("kitchen_flow_summary"), "kitchen_flow_summary not registered");
158
- });
159
- });
160
- // ── Output schemas ────────────────────────────────────────────────────────────
161
- describe("Kitchen Tools — Output schemas", () => {
162
- test("all tools have an outputSchema", async () => {
163
- const server = await makeServer(makeSuccessClient);
164
- const expected = [
165
- "list_kitchen_tickets",
166
- "get_kitchen_ticket",
167
- "update_kitchen_ticket",
168
- "list_kitchen_stations",
169
- "list_menu_items",
170
- "kitchen_flow_summary",
171
- ];
172
- for (const name of expected) {
173
- const tool = server.tools.get(name);
174
- assert.ok(tool.config.outputSchema, `${name} must have outputSchema`);
175
- }
176
- });
177
- });
178
- // ── list_kitchen_tickets ──────────────────────────────────────────────────────
179
- describe("list_kitchen_tickets — success path", () => {
180
- test("returns structuredContent with data array", async () => {
181
- const server = await makeServer(makeSuccessClient);
182
- const tool = server.tools.get("list_kitchen_tickets");
183
- const result = await tool.handler({ limit: 100, offset: 0 });
184
- assert.ok(!result.isError, "should not be an error");
185
- assert.ok(result.structuredContent, "structuredContent missing");
186
- const sc = result.structuredContent;
187
- assert.ok(Array.isArray(sc["data"]), "data should be an array");
188
- assert.equal(sc["data"].length, 3);
189
- assert.equal(sc["total"], 3);
190
- });
191
- test("first ticket has expected fields", async () => {
192
- const server = await makeServer(makeSuccessClient);
193
- const tool = server.tools.get("list_kitchen_tickets");
194
- const result = await tool.handler({});
195
- const sc = result.structuredContent;
196
- const first = sc["data"][0];
197
- assert.equal(first["id"], "tkt_001");
198
- assert.equal(first["status"], "preparing");
199
- assert.equal(first["stationId"], "sta_grill");
200
- assert.equal(first["tableRef"], "T4");
201
- });
202
- test("content block has type text and mentions tickets", async () => {
203
- const server = await makeServer(makeSuccessClient);
204
- const tool = server.tools.get("list_kitchen_tickets");
205
- const result = await tool.handler({});
206
- assert.ok(Array.isArray(result.content));
207
- assert.equal(result.content[0].type, "text");
208
- assert.ok(result.content[0].text.includes("kitchen tickets"));
209
- });
210
- test("404 error propagates as isError=true", async () => {
211
- const server = await makeServer(make404Client);
212
- const tool = server.tools.get("list_kitchen_tickets");
213
- const result = await tool.handler({});
214
- assert.ok(result.isError, "should be an error on 404");
215
- assert.ok(result.content[0].text.includes("Error:"));
216
- });
217
- });
218
- // ── get_kitchen_ticket ────────────────────────────────────────────────────────
219
- describe("get_kitchen_ticket — success path", () => {
220
- test("returns single ticket by ID", async () => {
221
- const server = await makeServer(makeSuccessClient);
222
- const tool = server.tools.get("get_kitchen_ticket");
223
- const result = await tool.handler({ id: "tkt_001" });
224
- assert.ok(!result.isError);
225
- const sc = result.structuredContent;
226
- assert.equal(sc["id"], "tkt_001");
227
- assert.equal(sc["status"], "preparing");
228
- assert.equal(sc["stationId"], "sta_grill");
229
- });
230
- test("404 error propagates as isError=true", async () => {
231
- const server = await makeServer(make404Client);
232
- const tool = server.tools.get("get_kitchen_ticket");
233
- const result = await tool.handler({ id: "tkt_missing" });
234
- assert.ok(result.isError, "should be an error on 404");
235
- assert.ok(result.content[0].text.includes("Error:"));
236
- });
237
- });
238
- // ── update_kitchen_ticket ─────────────────────────────────────────────────────
239
- describe("update_kitchen_ticket — success path", () => {
240
- test("returns updated ticket with new status", async () => {
241
- const server = await makeServer(makeSuccessClient);
242
- const tool = server.tools.get("update_kitchen_ticket");
243
- const result = await tool.handler({ id: "tkt_001", status: "ready" });
244
- assert.ok(!result.isError);
245
- const sc = result.structuredContent;
246
- assert.equal(sc["id"], "tkt_001");
247
- assert.equal(sc["status"], "ready");
248
- });
249
- test("content block is a mutate-type annotated text", async () => {
250
- const server = await makeServer(makeSuccessClient);
251
- const tool = server.tools.get("update_kitchen_ticket");
252
- const result = await tool.handler({ id: "tkt_001", status: "ready" });
253
- assert.equal(result.content[0].type, "text");
254
- assert.ok(result.content[0].text.includes("Kitchen ticket updated"));
255
- });
256
- test("calls client.updateKitchenTicket with correct args", async () => {
257
- let calledId;
258
- let calledData;
259
- const client = {
260
- updateKitchenTicket: async (id, data) => {
261
- calledId = id;
262
- calledData = data;
263
- return MOCK_UPDATED_TICKET;
264
- },
265
- };
266
- const server = new StubMcpServer();
267
- const { registerKitchenTools } = await import("../tools/kitchen.js");
268
- registerKitchenTools(server, client);
269
- await server.tools.get("update_kitchen_ticket").handler({ id: "tkt_001", status: "ready", stationId: "sta_bar" });
270
- assert.equal(calledId, "tkt_001");
271
- assert.equal(calledData?.["status"], "ready");
272
- assert.equal(calledData?.["stationId"], "sta_bar");
273
- });
274
- });
275
- // ── list_kitchen_stations ─────────────────────────────────────────────────────
276
- describe("list_kitchen_stations — success path", () => {
277
- test("returns stations list with total", async () => {
278
- const server = await makeServer(makeSuccessClient);
279
- const tool = server.tools.get("list_kitchen_stations");
280
- const result = await tool.handler({});
281
- assert.ok(!result.isError);
282
- const sc = result.structuredContent;
283
- assert.ok(Array.isArray(sc["data"]));
284
- assert.equal(sc["total"], 2);
285
- });
286
- test("first station has expected fields", async () => {
287
- const server = await makeServer(makeSuccessClient);
288
- const tool = server.tools.get("list_kitchen_stations");
289
- const result = await tool.handler({});
290
- const first = result.structuredContent["data"][0];
291
- assert.equal(first["id"], "sta_grill");
292
- assert.equal(first["name"], "Grill");
293
- assert.equal(first["isActive"], true);
294
- });
295
- });
296
- // ── list_menu_items ───────────────────────────────────────────────────────────
297
- describe("list_menu_items — success path", () => {
298
- test("returns menu items list with total", async () => {
299
- const server = await makeServer(makeSuccessClient);
300
- const tool = server.tools.get("list_menu_items");
301
- const result = await tool.handler({});
302
- assert.ok(!result.isError);
303
- const sc = result.structuredContent;
304
- assert.ok(Array.isArray(sc["data"]));
305
- assert.equal(sc["total"], 1);
306
- });
307
- test("first menu item has expected fields", async () => {
308
- const server = await makeServer(makeSuccessClient);
309
- const tool = server.tools.get("list_menu_items");
310
- const result = await tool.handler({ isActive: true });
311
- const first = result.structuredContent["data"][0];
312
- assert.equal(first["id"], "mi_burger");
313
- assert.equal(first["name"], "Burger");
314
- assert.equal(first["priceCents"], 1200);
315
- assert.equal(first["category"], "Main");
316
- assert.equal(first["isActive"], true);
317
- });
318
- });
319
- // ── kitchen_flow_summary ──────────────────────────────────────────────────────
320
- describe("kitchen_flow_summary — success path", () => {
321
- test("returns summary with stations array and totalOpenTickets", async () => {
322
- const server = await makeServer(makeSuccessClient);
323
- const tool = server.tools.get("kitchen_flow_summary");
324
- const result = await tool.handler({});
325
- assert.ok(!result.isError, "should not be an error");
326
- const sc = result.structuredContent;
327
- assert.ok(Array.isArray(sc["stations"]), "stations must be an array");
328
- assert.ok(typeof sc["totalOpenTickets"] === "number", "totalOpenTickets must be a number");
329
- assert.ok(typeof sc["generatedAt"] === "string", "generatedAt must be a string");
330
- });
331
- test("counts open tickets per station (2 grill, 1 bar — served/cancelled excluded)", async () => {
332
- // MOCK_TICKETS_LIST has tkt_001 (grill/preparing), tkt_002 (grill/queued), tkt_003 (bar/ready)
333
- // All are open (none served or cancelled)
334
- const server = await makeServer(makeSuccessClient);
335
- const tool = server.tools.get("kitchen_flow_summary");
336
- const result = await tool.handler({});
337
- const sc = result.structuredContent;
338
- const stations = sc["stations"];
339
- assert.equal(sc["totalOpenTickets"], 3);
340
- const grill = stations.find((s) => s["stationId"] === "sta_grill");
341
- const bar = stations.find((s) => s["stationId"] === "sta_bar");
342
- assert.ok(grill, "grill station should be present");
343
- assert.ok(bar, "bar station should be present");
344
- assert.equal(grill["openTickets"], 2);
345
- assert.equal(bar["openTickets"], 1);
346
- });
347
- test("flags grill as bottleneck (2 open tickets > bar 1)", async () => {
348
- const server = await makeServer(makeSuccessClient);
349
- const tool = server.tools.get("kitchen_flow_summary");
350
- const result = await tool.handler({});
351
- const sc = result.structuredContent;
352
- assert.equal(sc["bottleneckStationId"], "sta_grill");
353
- const stations = sc["stations"];
354
- const grill = stations.find((s) => s["stationId"] === "sta_grill");
355
- const bar = stations.find((s) => s["stationId"] === "sta_bar");
356
- assert.equal(grill["isBottleneck"], true);
357
- assert.equal(bar["isBottleneck"], false);
358
- });
359
- test("excludes served and cancelled tickets from counts", async () => {
360
- const servedTicket = { ...MOCK_TICKET, id: "tkt_served", stationId: "sta_grill", status: "served" };
361
- const cancelledTicket = { ...MOCK_TICKET, id: "tkt_cancelled", stationId: "sta_bar", status: "cancelled" };
362
- const client = {
363
- listKitchenTickets: async () => ({
364
- data: [MOCK_TICKET, servedTicket, cancelledTicket],
365
- total: 3,
366
- limit: 100,
367
- offset: 0,
368
- }),
369
- listKitchenStations: async () => MOCK_STATIONS_LIST,
370
- };
371
- const server = new StubMcpServer();
372
- const { registerKitchenTools } = await import("../tools/kitchen.js");
373
- registerKitchenTools(server, client);
374
- const result = await server.tools.get("kitchen_flow_summary").handler({});
375
- const sc = result.structuredContent;
376
- // Only tkt_001 (grill/preparing) is open
377
- assert.equal(sc["totalOpenTickets"], 1);
378
- const stations = sc["stations"];
379
- const grill = stations.find((s) => s["stationId"] === "sta_grill");
380
- const bar = stations.find((s) => s["stationId"] === "sta_bar");
381
- assert.equal(grill["openTickets"], 1);
382
- assert.equal(bar["openTickets"], 0);
383
- });
384
- test("content block mentions summary", async () => {
385
- const server = await makeServer(makeSuccessClient);
386
- const tool = server.tools.get("kitchen_flow_summary");
387
- const result = await tool.handler({});
388
- assert.ok(Array.isArray(result.content));
389
- assert.equal(result.content[0].type, "text");
390
- assert.ok(result.content[0].text.includes("Kitchen flow summary"));
391
- });
392
- test("404 error propagates as isError=true", async () => {
393
- const server = await makeServer(make404Client);
394
- const tool = server.tools.get("kitchen_flow_summary");
395
- const result = await tool.handler({});
396
- assert.ok(result.isError, "should be an error on 404");
397
- });
398
- });
399
- //# sourceMappingURL=kitchen-tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kitchen-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/kitchen-tools.test.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- /**
2
- * Regression tests for the "invoices INOPERABLE via MCP" bug set (LANE B1).
3
- *
4
- * Two independent bugs made every WRITE path fail MCP output validation while
5
- * reads (fixed in #64) worked:
6
- *
7
- * BUG-1 (envelope leak on mutations): create/update/action client methods
8
- * called `this.request(...)` (RAW) instead of `this.requestUnwrapped(...)`.
9
- * The live Frihet `/v1` API wraps EVERY mutation in `{ data, meta }`
10
- * (publicApi.ts: 201/PUT/PATCH → `{ data: <resource>, meta }`; action POSTs
11
- * → `actionResponse = { data: actionResult, meta }`). The raw envelope went
12
- * straight into `structuredContent`, so `id`/`clientName`/`items`/`success`
13
- * all read as `undefined` and the tool's outputSchema rejected the call.
14
- *
15
- * BUG-2 (output schemas too strict): list/search item schemas required fields
16
- * that `fields=` projections and drafts legitimately omit (`GET
17
- * /invoices?fields=id,total` → `{ id }`-shaped rows), and `actionResultOutput`
18
- * required `success`+`id` that action endpoints never return in full.
19
- *
20
- * Part A boots a `node:http` mock backend that mimics the LIVE mutation envelope
21
- * and drives a REAL `FrihetClient` (same pattern as
22
- * get-envelope-unwrap-regression.test.ts) — it would fail before the BUG-1 fix.
23
- * Part B pins the relaxed schemas against the real projected/draft/action shapes
24
- * — it would fail before the BUG-2 fix. The final guard asserts the schemas are
25
- * still strict enough to REJECT a raw envelope, so removing the unwrap regresses.
26
- *
27
- * Run: npm test (after build)
28
- */
29
- export {};
30
- //# sourceMappingURL=mutation-unwrap-and-schema-regression.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mutation-unwrap-and-schema-regression.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mutation-unwrap-and-schema-regression.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}