@frihet/mcp-server 1.16.2 → 1.16.4

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 (203) hide show
  1. package/README.md +1 -1
  2. package/dist/openai-profile.js +1 -1
  3. package/package.json +7 -4
  4. package/scripts/postinstall.js +30 -8
  5. package/dist/__tests__/audit-server-version.test.d.ts +0 -13
  6. package/dist/__tests__/audit-server-version.test.d.ts.map +0 -1
  7. package/dist/__tests__/audit-server-version.test.js +0 -96
  8. package/dist/__tests__/audit-server-version.test.js.map +0 -1
  9. package/dist/__tests__/banking-client-contract.test.d.ts +0 -20
  10. package/dist/__tests__/banking-client-contract.test.d.ts.map +0 -1
  11. package/dist/__tests__/banking-client-contract.test.js +0 -133
  12. package/dist/__tests__/banking-client-contract.test.js.map +0 -1
  13. package/dist/__tests__/banking-tools.test.d.ts +0 -18
  14. package/dist/__tests__/banking-tools.test.d.ts.map +0 -1
  15. package/dist/__tests__/banking-tools.test.js +0 -252
  16. package/dist/__tests__/banking-tools.test.js.map +0 -1
  17. package/dist/__tests__/contract.test.d.ts +0 -33
  18. package/dist/__tests__/contract.test.d.ts.map +0 -1
  19. package/dist/__tests__/contract.test.js +0 -208
  20. package/dist/__tests__/contract.test.js.map +0 -1
  21. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts +0 -13
  22. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts.map +0 -1
  23. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js +0 -420
  24. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js.map +0 -1
  25. package/dist/__tests__/demo-mode.test.d.ts +0 -11
  26. package/dist/__tests__/demo-mode.test.d.ts.map +0 -1
  27. package/dist/__tests__/demo-mode.test.js +0 -119
  28. package/dist/__tests__/demo-mode.test.js.map +0 -1
  29. package/dist/__tests__/einvoice-day4-tools.test.d.ts +0 -16
  30. package/dist/__tests__/einvoice-day4-tools.test.d.ts.map +0 -1
  31. package/dist/__tests__/einvoice-day4-tools.test.js +0 -421
  32. package/dist/__tests__/einvoice-day4-tools.test.js.map +0 -1
  33. package/dist/__tests__/einvoice-integration.test.d.ts +0 -24
  34. package/dist/__tests__/einvoice-integration.test.d.ts.map +0 -1
  35. package/dist/__tests__/einvoice-integration.test.js +0 -142
  36. package/dist/__tests__/einvoice-integration.test.js.map +0 -1
  37. package/dist/__tests__/einvoice-tools.test.d.ts +0 -16
  38. package/dist/__tests__/einvoice-tools.test.d.ts.map +0 -1
  39. package/dist/__tests__/einvoice-tools.test.js +0 -411
  40. package/dist/__tests__/einvoice-tools.test.js.map +0 -1
  41. package/dist/__tests__/fiscal-tools.test.d.ts +0 -21
  42. package/dist/__tests__/fiscal-tools.test.d.ts.map +0 -1
  43. package/dist/__tests__/fiscal-tools.test.js +0 -271
  44. package/dist/__tests__/fiscal-tools.test.js.map +0 -1
  45. package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts +0 -27
  46. package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts.map +0 -1
  47. package/dist/__tests__/get-envelope-unwrap-regression.test.js +0 -223
  48. package/dist/__tests__/get-envelope-unwrap-regression.test.js.map +0 -1
  49. package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts +0 -14
  50. package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts.map +0 -1
  51. package/dist/__tests__/intelligence-duplicate-invoice.test.js +0 -108
  52. package/dist/__tests__/intelligence-duplicate-invoice.test.js.map +0 -1
  53. package/dist/__tests__/kitchen-tools.test.d.ts +0 -18
  54. package/dist/__tests__/kitchen-tools.test.d.ts.map +0 -1
  55. package/dist/__tests__/kitchen-tools.test.js +0 -399
  56. package/dist/__tests__/kitchen-tools.test.js.map +0 -1
  57. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts +0 -30
  58. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts.map +0 -1
  59. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js +0 -164
  60. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js.map +0 -1
  61. package/dist/__tests__/observability-redaction.test.d.ts +0 -13
  62. package/dist/__tests__/observability-redaction.test.d.ts.map +0 -1
  63. package/dist/__tests__/observability-redaction.test.js +0 -94
  64. package/dist/__tests__/observability-redaction.test.js.map +0 -1
  65. package/dist/__tests__/openai-grouped-compose.test.d.ts +0 -26
  66. package/dist/__tests__/openai-grouped-compose.test.d.ts.map +0 -1
  67. package/dist/__tests__/openai-grouped-compose.test.js +0 -245
  68. package/dist/__tests__/openai-grouped-compose.test.js.map +0 -1
  69. package/dist/__tests__/openai-profile.test.d.ts +0 -10
  70. package/dist/__tests__/openai-profile.test.d.ts.map +0 -1
  71. package/dist/__tests__/openai-profile.test.js +0 -168
  72. package/dist/__tests__/openai-profile.test.js.map +0 -1
  73. package/dist/__tests__/pagination-cursor-param.test.d.ts +0 -27
  74. package/dist/__tests__/pagination-cursor-param.test.d.ts.map +0 -1
  75. package/dist/__tests__/pagination-cursor-param.test.js +0 -96
  76. package/dist/__tests__/pagination-cursor-param.test.js.map +0 -1
  77. package/dist/__tests__/pos-tools.test.d.ts +0 -16
  78. package/dist/__tests__/pos-tools.test.d.ts.map +0 -1
  79. package/dist/__tests__/pos-tools.test.js +0 -244
  80. package/dist/__tests__/pos-tools.test.js.map +0 -1
  81. package/dist/__tests__/recurring-tools.test.d.ts +0 -23
  82. package/dist/__tests__/recurring-tools.test.d.ts.map +0 -1
  83. package/dist/__tests__/recurring-tools.test.js +0 -352
  84. package/dist/__tests__/recurring-tools.test.js.map +0 -1
  85. package/dist/__tests__/schema-envelope-guard.test.d.ts +0 -18
  86. package/dist/__tests__/schema-envelope-guard.test.d.ts.map +0 -1
  87. package/dist/__tests__/schema-envelope-guard.test.js +0 -56
  88. package/dist/__tests__/schema-envelope-guard.test.js.map +0 -1
  89. package/dist/__tests__/stay-tools.test.d.ts +0 -17
  90. package/dist/__tests__/stay-tools.test.d.ts.map +0 -1
  91. package/dist/__tests__/stay-tools.test.js +0 -259
  92. package/dist/__tests__/stay-tools.test.js.map +0 -1
  93. package/dist/__tests__/team-tools.test.d.ts +0 -18
  94. package/dist/__tests__/team-tools.test.d.ts.map +0 -1
  95. package/dist/__tests__/team-tools.test.js +0 -228
  96. package/dist/__tests__/team-tools.test.js.map +0 -1
  97. package/dist/__tests__/time-tools.test.d.ts +0 -19
  98. package/dist/__tests__/time-tools.test.d.ts.map +0 -1
  99. package/dist/__tests__/time-tools.test.js +0 -286
  100. package/dist/__tests__/time-tools.test.js.map +0 -1
  101. package/dist/__tests__/tool-exposure.test.d.ts +0 -11
  102. package/dist/__tests__/tool-exposure.test.d.ts.map +0 -1
  103. package/dist/__tests__/tool-exposure.test.js +0 -264
  104. package/dist/__tests__/tool-exposure.test.js.map +0 -1
  105. package/dist/client-interface.d.ts.map +0 -1
  106. package/dist/client-interface.js.map +0 -1
  107. package/dist/client.d.ts.map +0 -1
  108. package/dist/client.js.map +0 -1
  109. package/dist/demo-client.d.ts.map +0 -1
  110. package/dist/demo-client.js.map +0 -1
  111. package/dist/demo-fixtures.d.ts.map +0 -1
  112. package/dist/demo-fixtures.js.map +0 -1
  113. package/dist/index.d.ts.map +0 -1
  114. package/dist/index.js.map +0 -1
  115. package/dist/logger.d.ts.map +0 -1
  116. package/dist/logger.js.map +0 -1
  117. package/dist/metrics.d.ts.map +0 -1
  118. package/dist/metrics.js.map +0 -1
  119. package/dist/observability.d.ts.map +0 -1
  120. package/dist/observability.js.map +0 -1
  121. package/dist/openai-profile.d.ts.map +0 -1
  122. package/dist/openai-profile.js.map +0 -1
  123. package/dist/prompts/register-all.d.ts.map +0 -1
  124. package/dist/prompts/register-all.js.map +0 -1
  125. package/dist/redaction.d.ts.map +0 -1
  126. package/dist/redaction.js.map +0 -1
  127. package/dist/resources/register-all.d.ts.map +0 -1
  128. package/dist/resources/register-all.js.map +0 -1
  129. package/dist/tool-exposure.d.ts.map +0 -1
  130. package/dist/tool-exposure.js.map +0 -1
  131. package/dist/tools/accountingClose.d.ts.map +0 -1
  132. package/dist/tools/accountingClose.js.map +0 -1
  133. package/dist/tools/audit_gl.d.ts.map +0 -1
  134. package/dist/tools/audit_gl.js.map +0 -1
  135. package/dist/tools/backend-availability.d.ts.map +0 -1
  136. package/dist/tools/backend-availability.js.map +0 -1
  137. package/dist/tools/bank_rules.d.ts.map +0 -1
  138. package/dist/tools/bank_rules.js.map +0 -1
  139. package/dist/tools/banking.d.ts.map +0 -1
  140. package/dist/tools/banking.js.map +0 -1
  141. package/dist/tools/clients.d.ts.map +0 -1
  142. package/dist/tools/clients.js.map +0 -1
  143. package/dist/tools/crm.d.ts.map +0 -1
  144. package/dist/tools/crm.js.map +0 -1
  145. package/dist/tools/deposits.d.ts.map +0 -1
  146. package/dist/tools/deposits.js.map +0 -1
  147. package/dist/tools/einvoice.d.ts.map +0 -1
  148. package/dist/tools/einvoice.js.map +0 -1
  149. package/dist/tools/expenses.d.ts.map +0 -1
  150. package/dist/tools/expenses.js.map +0 -1
  151. package/dist/tools/fiscal.d.ts.map +0 -1
  152. package/dist/tools/fiscal.js.map +0 -1
  153. package/dist/tools/gestoria.d.ts.map +0 -1
  154. package/dist/tools/gestoria.js.map +0 -1
  155. package/dist/tools/hr.d.ts.map +0 -1
  156. package/dist/tools/hr.js.map +0 -1
  157. package/dist/tools/igic.d.ts.map +0 -1
  158. package/dist/tools/igic.js.map +0 -1
  159. package/dist/tools/impuesto_sociedades.d.ts.map +0 -1
  160. package/dist/tools/impuesto_sociedades.js.map +0 -1
  161. package/dist/tools/intelligence.d.ts.map +0 -1
  162. package/dist/tools/intelligence.js.map +0 -1
  163. package/dist/tools/invoices.d.ts.map +0 -1
  164. package/dist/tools/invoices.js.map +0 -1
  165. package/dist/tools/kitchen.d.ts.map +0 -1
  166. package/dist/tools/kitchen.js.map +0 -1
  167. package/dist/tools/onboard_vies.d.ts.map +0 -1
  168. package/dist/tools/onboard_vies.js.map +0 -1
  169. package/dist/tools/onboarding.d.ts.map +0 -1
  170. package/dist/tools/onboarding.js.map +0 -1
  171. package/dist/tools/payroll.d.ts.map +0 -1
  172. package/dist/tools/payroll.js.map +0 -1
  173. package/dist/tools/permissions.d.ts.map +0 -1
  174. package/dist/tools/permissions.js.map +0 -1
  175. package/dist/tools/portal_domain.d.ts.map +0 -1
  176. package/dist/tools/portal_domain.js.map +0 -1
  177. package/dist/tools/pos.d.ts.map +0 -1
  178. package/dist/tools/pos.js.map +0 -1
  179. package/dist/tools/products.d.ts.map +0 -1
  180. package/dist/tools/products.js.map +0 -1
  181. package/dist/tools/quotes.d.ts.map +0 -1
  182. package/dist/tools/quotes.js.map +0 -1
  183. package/dist/tools/recurring.d.ts.map +0 -1
  184. package/dist/tools/recurring.js.map +0 -1
  185. package/dist/tools/register-all.d.ts.map +0 -1
  186. package/dist/tools/register-all.js.map +0 -1
  187. package/dist/tools/shared.d.ts.map +0 -1
  188. package/dist/tools/shared.js.map +0 -1
  189. package/dist/tools/stay.d.ts.map +0 -1
  190. package/dist/tools/stay.js.map +0 -1
  191. package/dist/tools/team.d.ts.map +0 -1
  192. package/dist/tools/team.js.map +0 -1
  193. package/dist/tools/time.d.ts.map +0 -1
  194. package/dist/tools/time.js.map +0 -1
  195. package/dist/tools/vendors.d.ts.map +0 -1
  196. package/dist/tools/vendors.js.map +0 -1
  197. package/dist/tools/webhooks.d.ts.map +0 -1
  198. package/dist/tools/webhooks.js.map +0 -1
  199. package/dist/types.d.ts.map +0 -1
  200. package/dist/types.js.map +0 -1
  201. package/scripts/audit-mcp-refs.mjs +0 -402
  202. package/scripts/no-public-leak.sh +0 -60
  203. package/scripts/test-openai-grouped-compose.mjs +0 -173
@@ -1,352 +0,0 @@
1
- /**
2
- * Tests for Recurring Invoice MCP tools — Wave Mature 3 (8 tools: 2 original + 6 new).
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 8 recurring tools registered
9
- * 2. list_recurring_invoices — success path + structuredContent shape
10
- * 3. list_recurring_invoices — status filter accepted
11
- * 4. get_recurring_invoice — success path
12
- * 5. create_recurring_invoice — success path
13
- * 6. update_recurring_invoice — success path + partial update
14
- * 7. pause_recurring_invoice — success path
15
- * 8. resume_recurring_invoice — success path
16
- * 9. delete_recurring_invoice — confirm=false gate
17
- * 10. delete_recurring_invoice — confirm=true success path
18
- * 11. run_recurring_now — success path (default draftOnly=true)
19
- * 12. run_recurring_now — draftOnly=false passes through
20
- * 13. API error — 404 propagated as isError=true
21
- */
22
- import { test, describe, beforeEach } from "node:test";
23
- import assert from "node:assert/strict";
24
- class StubMcpServer {
25
- tools = new Map();
26
- registerTool(name, config, handler) {
27
- this.tools.set(name, { name, config, handler });
28
- }
29
- }
30
- // ── Mock data ────────────────────────────────────────────────────────────────
31
- const MOCK_RECURRING_INVOICE = {
32
- id: "rec_abc123",
33
- templateName: "Factura mensual Acme",
34
- frequency: "monthly",
35
- nextRun: "2026-06-01",
36
- recipient: "billing@acme.com",
37
- lineItems: [
38
- { description: "Servicio SaaS", quantity: 1, unitPrice: 299.0 },
39
- ],
40
- status: "active",
41
- createdAt: "2026-01-01T00:00:00Z",
42
- };
43
- const MOCK_RECURRING_LIST = {
44
- data: [MOCK_RECURRING_INVOICE],
45
- total: 1,
46
- limit: 20,
47
- offset: 0,
48
- };
49
- const MOCK_RUN_RESULT = {
50
- success: true,
51
- id: "inv_new_001",
52
- message: "Invoice draft created from template rec_abc123",
53
- };
54
- const MOCK_ACTION = {
55
- success: true,
56
- id: "rec_abc123",
57
- message: "Operation completed",
58
- };
59
- // ── Client stubs ─────────────────────────────────────────────────────────────
60
- function makeSuccessClient() {
61
- return {
62
- listRecurringInvoices: async () => MOCK_RECURRING_LIST,
63
- getRecurringInvoice: async (_id) => MOCK_RECURRING_INVOICE,
64
- createRecurringInvoice: async (_data) => MOCK_RECURRING_INVOICE,
65
- updateRecurringInvoice: async (_id, data) => ({ ...MOCK_RECURRING_INVOICE, ...data }),
66
- pauseRecurringInvoice: async (_id) => ({ ...MOCK_ACTION, message: "Template paused" }),
67
- resumeRecurringInvoice: async (_id) => ({ ...MOCK_ACTION, message: "Template resumed" }),
68
- deleteRecurringInvoice: async (_id) => undefined,
69
- runRecurringNow: async (_templateId, _options) => MOCK_RUN_RESULT,
70
- };
71
- }
72
- function make404Client() {
73
- const notFound = () => {
74
- const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
75
- return Promise.reject(err);
76
- };
77
- return {
78
- listRecurringInvoices: notFound,
79
- getRecurringInvoice: notFound,
80
- createRecurringInvoice: notFound,
81
- updateRecurringInvoice: notFound,
82
- pauseRecurringInvoice: notFound,
83
- resumeRecurringInvoice: notFound,
84
- deleteRecurringInvoice: notFound,
85
- runRecurringNow: notFound,
86
- };
87
- }
88
- // ── Helper ───────────────────────────────────────────────────────────────────
89
- async function makeServer(clientFn) {
90
- const server = new StubMcpServer();
91
- const { registerRecurringTools } = await import("../tools/recurring.js");
92
- registerRecurringTools(server, clientFn());
93
- return server;
94
- }
95
- // ── Registration tests ───────────────────────────────────────────────────────
96
- describe("Recurring Tools — Registration", () => {
97
- let server;
98
- beforeEach(async () => {
99
- server = await makeServer(makeSuccessClient);
100
- });
101
- test("registers exactly 8 recurring tools", () => {
102
- assert.equal(server.tools.size, 8);
103
- });
104
- test("registers list_recurring_invoices", () => {
105
- assert.ok(server.tools.has("list_recurring_invoices"));
106
- });
107
- test("registers get_recurring_invoice", () => {
108
- assert.ok(server.tools.has("get_recurring_invoice"));
109
- });
110
- test("registers create_recurring_invoice", () => {
111
- assert.ok(server.tools.has("create_recurring_invoice"));
112
- });
113
- test("registers update_recurring_invoice", () => {
114
- assert.ok(server.tools.has("update_recurring_invoice"));
115
- });
116
- test("registers pause_recurring_invoice", () => {
117
- assert.ok(server.tools.has("pause_recurring_invoice"));
118
- });
119
- test("registers resume_recurring_invoice", () => {
120
- assert.ok(server.tools.has("resume_recurring_invoice"));
121
- });
122
- test("registers delete_recurring_invoice", () => {
123
- assert.ok(server.tools.has("delete_recurring_invoice"));
124
- });
125
- test("registers run_recurring_now", () => {
126
- assert.ok(server.tools.has("run_recurring_now"));
127
- });
128
- });
129
- // ── list_recurring_invoices ──────────────────────────────────────────────────
130
- describe("list_recurring_invoices — success path", () => {
131
- test("returns structuredContent with data array", async () => {
132
- const server = await makeServer(makeSuccessClient);
133
- const tool = server.tools.get("list_recurring_invoices");
134
- const result = await tool.handler({});
135
- assert.ok(!result.isError);
136
- const sc = result.structuredContent;
137
- assert.ok(Array.isArray(sc["data"]));
138
- assert.equal(sc["total"], 1);
139
- });
140
- test("first template has expected fields", async () => {
141
- const server = await makeServer(makeSuccessClient);
142
- const tool = server.tools.get("list_recurring_invoices");
143
- const result = await tool.handler({});
144
- const first = result.structuredContent["data"][0];
145
- assert.equal(first["id"], "rec_abc123");
146
- assert.equal(first["templateName"], "Factura mensual Acme");
147
- assert.equal(first["frequency"], "monthly");
148
- assert.equal(first["status"], "active");
149
- assert.equal(first["nextRun"], "2026-06-01");
150
- });
151
- test("content block has type text and mentions recurring_invoices", async () => {
152
- const server = await makeServer(makeSuccessClient);
153
- const tool = server.tools.get("list_recurring_invoices");
154
- const result = await tool.handler({});
155
- assert.equal(result.content[0].type, "text");
156
- assert.ok(result.content[0].text.includes("recurring_invoices"));
157
- });
158
- test("status=active filter accepted without error", async () => {
159
- const server = await makeServer(makeSuccessClient);
160
- const tool = server.tools.get("list_recurring_invoices");
161
- const result = await tool.handler({ status: "active" });
162
- assert.ok(!result.isError);
163
- });
164
- test("status=paused filter accepted without error", async () => {
165
- const server = await makeServer(makeSuccessClient);
166
- const tool = server.tools.get("list_recurring_invoices");
167
- const result = await tool.handler({ status: "paused" });
168
- assert.ok(!result.isError);
169
- });
170
- test("404 propagates as isError=true", async () => {
171
- const server = await makeServer(make404Client);
172
- const tool = server.tools.get("list_recurring_invoices");
173
- const result = await tool.handler({});
174
- assert.ok(result.isError);
175
- });
176
- });
177
- // ── get_recurring_invoice ────────────────────────────────────────────────────
178
- describe("get_recurring_invoice — success path", () => {
179
- test("returns template with expected fields", async () => {
180
- const server = await makeServer(makeSuccessClient);
181
- const tool = server.tools.get("get_recurring_invoice");
182
- const result = await tool.handler({ id: "rec_abc123" });
183
- assert.ok(!result.isError);
184
- const sc = result.structuredContent;
185
- assert.equal(sc["id"], "rec_abc123");
186
- assert.equal(sc["frequency"], "monthly");
187
- assert.equal(sc["status"], "active");
188
- });
189
- test("content block has type text", async () => {
190
- const server = await makeServer(makeSuccessClient);
191
- const tool = server.tools.get("get_recurring_invoice");
192
- const result = await tool.handler({ id: "rec_abc123" });
193
- assert.equal(result.content[0].type, "text");
194
- });
195
- test("404 propagates as isError=true", async () => {
196
- const server = await makeServer(make404Client);
197
- const tool = server.tools.get("get_recurring_invoice");
198
- const result = await tool.handler({ id: "rec_missing" });
199
- assert.ok(result.isError);
200
- });
201
- });
202
- // ── create_recurring_invoice ─────────────────────────────────────────────────
203
- describe("create_recurring_invoice — success path", () => {
204
- test("returns created template with expected fields", async () => {
205
- const server = await makeServer(makeSuccessClient);
206
- const tool = server.tools.get("create_recurring_invoice");
207
- const result = await tool.handler({
208
- templateName: "Factura mensual Acme",
209
- clientId: "cli_acme",
210
- frequency: "monthly",
211
- lineItems: [{ description: "Servicio SaaS", quantity: 1, unitPrice: 299.0 }],
212
- });
213
- assert.ok(!result.isError);
214
- const sc = result.structuredContent;
215
- assert.equal(sc["id"], "rec_abc123");
216
- assert.equal(sc["frequency"], "monthly");
217
- });
218
- test("content block mentions created", async () => {
219
- const server = await makeServer(makeSuccessClient);
220
- const tool = server.tools.get("create_recurring_invoice");
221
- const result = await tool.handler({
222
- templateName: "Test",
223
- clientId: "cli_test",
224
- frequency: "weekly",
225
- lineItems: [],
226
- });
227
- assert.ok(result.content[0].text.includes("created"));
228
- });
229
- test("404 propagates as isError=true", async () => {
230
- const server = await makeServer(make404Client);
231
- const tool = server.tools.get("create_recurring_invoice");
232
- const result = await tool.handler({ templateName: "T", clientId: "c", frequency: "monthly", lineItems: [] });
233
- assert.ok(result.isError);
234
- });
235
- });
236
- // ── update_recurring_invoice ─────────────────────────────────────────────────
237
- describe("update_recurring_invoice — success path", () => {
238
- test("returns updated template", async () => {
239
- const server = await makeServer(makeSuccessClient);
240
- const tool = server.tools.get("update_recurring_invoice");
241
- const result = await tool.handler({ id: "rec_abc123", templateName: "Factura mensual Acme v2" });
242
- assert.ok(!result.isError);
243
- const sc = result.structuredContent;
244
- assert.equal(sc["templateName"], "Factura mensual Acme v2");
245
- });
246
- test("content block mentions updated", async () => {
247
- const server = await makeServer(makeSuccessClient);
248
- const tool = server.tools.get("update_recurring_invoice");
249
- const result = await tool.handler({ id: "rec_abc123", frequency: "quarterly" });
250
- assert.ok(result.content[0].text.includes("updated"));
251
- });
252
- });
253
- // ── pause_recurring_invoice ──────────────────────────────────────────────────
254
- describe("pause_recurring_invoice — success path", () => {
255
- test("returns action result with success=true", async () => {
256
- const server = await makeServer(makeSuccessClient);
257
- const tool = server.tools.get("pause_recurring_invoice");
258
- const result = await tool.handler({ id: "rec_abc123" });
259
- assert.ok(!result.isError);
260
- assert.equal(result.structuredContent["success"], true);
261
- });
262
- test("content block mentions paused", async () => {
263
- const server = await makeServer(makeSuccessClient);
264
- const tool = server.tools.get("pause_recurring_invoice");
265
- const result = await tool.handler({ id: "rec_abc123" });
266
- assert.ok(result.content[0].text.includes("paused"));
267
- });
268
- test("404 propagates as isError=true", async () => {
269
- const server = await makeServer(make404Client);
270
- const tool = server.tools.get("pause_recurring_invoice");
271
- const result = await tool.handler({ id: "rec_missing" });
272
- assert.ok(result.isError);
273
- });
274
- });
275
- // ── resume_recurring_invoice ─────────────────────────────────────────────────
276
- describe("resume_recurring_invoice — success path", () => {
277
- test("returns action result with success=true", async () => {
278
- const server = await makeServer(makeSuccessClient);
279
- const tool = server.tools.get("resume_recurring_invoice");
280
- const result = await tool.handler({ id: "rec_abc123" });
281
- assert.ok(!result.isError);
282
- assert.equal(result.structuredContent["success"], true);
283
- });
284
- test("content block mentions resumed", async () => {
285
- const server = await makeServer(makeSuccessClient);
286
- const tool = server.tools.get("resume_recurring_invoice");
287
- const result = await tool.handler({ id: "rec_abc123" });
288
- assert.ok(result.content[0].text.includes("resumed"));
289
- });
290
- test("404 propagates as isError=true", async () => {
291
- const server = await makeServer(make404Client);
292
- const tool = server.tools.get("resume_recurring_invoice");
293
- const result = await tool.handler({ id: "rec_missing" });
294
- assert.ok(result.isError);
295
- });
296
- });
297
- // ── delete_recurring_invoice ─────────────────────────────────────────────────
298
- describe("delete_recurring_invoice — trust area gate", () => {
299
- test("confirm=false returns isError=true without calling API", async () => {
300
- const server = await makeServer(makeSuccessClient);
301
- const tool = server.tools.get("delete_recurring_invoice");
302
- const result = await tool.handler({ id: "rec_abc123", confirm: false });
303
- assert.ok(result.isError);
304
- assert.ok(result.content[0].text.includes("confirm=true"));
305
- });
306
- test("confirm=true succeeds and returns success=true", async () => {
307
- const server = await makeServer(makeSuccessClient);
308
- const tool = server.tools.get("delete_recurring_invoice");
309
- const result = await tool.handler({ id: "rec_abc123", confirm: true });
310
- assert.ok(!result.isError);
311
- assert.equal(result.structuredContent["success"], true);
312
- assert.equal(result.structuredContent["id"], "rec_abc123");
313
- });
314
- test("confirm=true with 404 propagates isError=true", async () => {
315
- const server = await makeServer(make404Client);
316
- const tool = server.tools.get("delete_recurring_invoice");
317
- const result = await tool.handler({ id: "rec_missing", confirm: true });
318
- assert.ok(result.isError);
319
- });
320
- });
321
- // ── run_recurring_now ────────────────────────────────────────────────────────
322
- describe("run_recurring_now — success path", () => {
323
- test("returns action result with success=true and new invoice ID", async () => {
324
- const server = await makeServer(makeSuccessClient);
325
- const tool = server.tools.get("run_recurring_now");
326
- const result = await tool.handler({ templateId: "rec_abc123" });
327
- assert.ok(!result.isError);
328
- const sc = result.structuredContent;
329
- assert.equal(sc["success"], true);
330
- assert.equal(sc["id"], "inv_new_001");
331
- assert.ok(typeof sc["message"] === "string");
332
- });
333
- test("draftOnly=false accepted without error", async () => {
334
- const server = await makeServer(makeSuccessClient);
335
- const tool = server.tools.get("run_recurring_now");
336
- const result = await tool.handler({ templateId: "rec_abc123", draftOnly: false });
337
- assert.ok(!result.isError);
338
- });
339
- test("content block mentions triggered", async () => {
340
- const server = await makeServer(makeSuccessClient);
341
- const tool = server.tools.get("run_recurring_now");
342
- const result = await tool.handler({ templateId: "rec_abc123" });
343
- assert.ok(result.content[0].text.includes("triggered"));
344
- });
345
- test("404 propagates as isError=true", async () => {
346
- const server = await makeServer(make404Client);
347
- const tool = server.tools.get("run_recurring_now");
348
- const result = await tool.handler({ templateId: "rec_missing" });
349
- assert.ok(result.isError);
350
- });
351
- });
352
- //# sourceMappingURL=recurring-tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recurring-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/recurring-tools.test.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * Pinning tests for the two codex findings on PR #65's schema relaxation:
3
- *
4
- * 1. HIGH — all-optional + passthrough action schemas would VALIDATE a raw
5
- * {data, meta} envelope, silently re-hiding the unwrap bug this PR fixes if
6
- * a client method ever regresses to raw request(). The anti-envelope
7
- * tripwire (data/meta: z.never().optional()) must reject it.
8
- *
9
- * 2. MEDIUM — paginatedOutput applied `.partial()` to EVERY list, dropping the
10
- * id/core contract for families whose tools expose no `fields=` projection
11
- * (time, POS, banking, kitchen, team, ...). Now `.partial()` is opt-in via
12
- * { projectable: true } — only the 10 list tools that actually accept
13
- * `fields=` use it.
14
- *
15
- * Run: npm test (after build)
16
- */
17
- export {};
18
- //# sourceMappingURL=schema-envelope-guard.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-envelope-guard.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schema-envelope-guard.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -1,56 +0,0 @@
1
- /**
2
- * Pinning tests for the two codex findings on PR #65's schema relaxation:
3
- *
4
- * 1. HIGH — all-optional + passthrough action schemas would VALIDATE a raw
5
- * {data, meta} envelope, silently re-hiding the unwrap bug this PR fixes if
6
- * a client method ever regresses to raw request(). The anti-envelope
7
- * tripwire (data/meta: z.never().optional()) must reject it.
8
- *
9
- * 2. MEDIUM — paginatedOutput applied `.partial()` to EVERY list, dropping the
10
- * id/core contract for families whose tools expose no `fields=` projection
11
- * (time, POS, banking, kitchen, team, ...). Now `.partial()` is opt-in via
12
- * { projectable: true } — only the 10 list tools that actually accept
13
- * `fields=` use it.
14
- *
15
- * Run: npm test (after build)
16
- */
17
- import { test, describe } from "node:test";
18
- import assert from "node:assert/strict";
19
- import { actionResultOutput, creditNoteResultOutput, paginatedOutput, invoiceItemOutput, timeEntryItemOutput, } from "../tools/shared.js";
20
- const ENVELOPE = { data: { success: true, status: "paid" }, meta: { requestId: "req_1" } };
21
- describe("anti-envelope tripwire — raw {data,meta} must NEVER validate", () => {
22
- test("actionResultOutput rejects a raw envelope", () => {
23
- assert.equal(actionResultOutput.safeParse(ENVELOPE).success, false);
24
- });
25
- test("creditNoteResultOutput rejects a raw envelope", () => {
26
- assert.equal(creditNoteResultOutput.safeParse(ENVELOPE).success, false);
27
- });
28
- test("actionResultOutput still accepts every legitimate live action shape", () => {
29
- // POST /invoices/:id/paid happy path
30
- assert.ok(actionResultOutput.safeParse({ success: true, status: "paid", paidAt: "2026-07-10" }).success);
31
- // already-paid path ({message, status}, no success)
32
- assert.ok(actionResultOutput.safeParse({ message: "Invoice already paid", status: "paid" }).success);
33
- });
34
- test("creditNoteResultOutput still accepts the live credit-note shape", () => {
35
- assert.ok(creditNoteResultOutput.safeParse({
36
- success: true,
37
- creditNote: { id: "cn_1", documentNumber: "R-2026-001", originalInvoiceId: "inv_1" },
38
- }).success);
39
- });
40
- });
41
- describe("paginatedOutput — partial rows are opt-in (projectable), not global", () => {
42
- const page = (row) => ({ data: [row], total: 1, limit: 20, offset: 0 });
43
- test("projectable list (invoices, exposes fields=) accepts an {id}-only projected row", () => {
44
- const schema = paginatedOutput(invoiceItemOutput, { projectable: true });
45
- assert.ok(schema.safeParse(page({ id: "inv_1" })).success);
46
- });
47
- test("non-projectable list (time entries, no fields= param) rejects an empty row", () => {
48
- const schema = paginatedOutput(timeEntryItemOutput);
49
- assert.equal(schema.safeParse(page({})).success, false);
50
- });
51
- test("non-projectable list still accepts a full row", () => {
52
- const schema = paginatedOutput(timeEntryItemOutput);
53
- assert.ok(schema.safeParse(page({ id: "te_1", hours: 2 })).success);
54
- });
55
- });
56
- //# sourceMappingURL=schema-envelope-guard.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-envelope-guard.test.js","sourceRoot":"","sources":["../../src/__tests__/schema-envelope-guard.test.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Tests for Stay MCP tools — Wave 4 (5 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 5 tools registered on McpServer
9
- * 2. list_reservations — success path + structuredContent shape
10
- * 3. get_reservation — success path + structuredContent shape
11
- * 4. create_reservation — success path + structuredContent shape
12
- * 5. list_properties — success path + structuredContent shape
13
- * 6. sync_channel — success path + structuredContent shape
14
- * 7. API error path — 404 propagated through handleToolError
15
- */
16
- export {};
17
- //# sourceMappingURL=stay-tools.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stay-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stay-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}