@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,133 +0,0 @@
1
- /**
2
- * Client-contract smoke for the 5 banking client methods — Megasprint 1 (#848).
3
- *
4
- * The banking *tools* (banking-tools.test.ts) mock IFrihetClient, so they never
5
- * exercise the real HTTP layer. This file does: it boots a local node:http server
6
- * acting as the Frihet ERP backend, points a REAL FrihetClient at it, and asserts
7
- * every banking method hits the exact verb + path + payload the LIVE server actions
8
- * in Frihet-ERP expect (#848). Catches path/verb/body drift that a mock cannot.
9
- *
10
- * Live REST surface (verbatim from shipped server actions):
11
- * GET /v1/banking/accounts
12
- * GET /v1/banking/accounts/:id
13
- * GET /v1/banking/transactions
14
- * PATCH /v1/banking/transactions/:id/categorize
15
- * POST /v1/banking/transactions/:id/match
16
- *
17
- * Run: npm test (after build)
18
- */
19
- import { test, describe, before, after } from "node:test";
20
- import assert from "node:assert/strict";
21
- import { createServer } from "node:http";
22
- import { FrihetClient } from "../client.js";
23
- const captured = [];
24
- function readBody(req) {
25
- return new Promise((resolve) => {
26
- let raw = "";
27
- req.on("data", (chunk) => (raw += chunk));
28
- req.on("end", () => {
29
- if (!raw)
30
- return resolve(undefined);
31
- try {
32
- resolve(JSON.parse(raw));
33
- }
34
- catch {
35
- resolve(raw);
36
- }
37
- });
38
- });
39
- }
40
- // ── Mock ERP backend ─────────────────────────────────────────────────────────
41
- let server;
42
- let baseUrl;
43
- before(async () => {
44
- server = createServer(async (req, res) => {
45
- const url = new URL(req.url ?? "/", "http://localhost");
46
- captured.push({
47
- method: req.method ?? "",
48
- path: url.pathname,
49
- query: url.searchParams,
50
- body: await readBody(req),
51
- });
52
- res.setHeader("Content-Type", "application/json");
53
- // Account / transaction list endpoints → paginated shape
54
- if (url.pathname === "/banking/accounts" && req.method === "GET") {
55
- res.end(JSON.stringify({ data: [{ id: "acct_001", ibanLast4: "4321" }], total: 1, limit: 20, offset: 0 }));
56
- return;
57
- }
58
- if (url.pathname === "/banking/transactions" && req.method === "GET") {
59
- res.end(JSON.stringify({ data: [{ id: "tx_1", status: "posted" }], total: 1, limit: 20, offset: 0 }));
60
- return;
61
- }
62
- // Single account + mutations → bare record
63
- res.end(JSON.stringify({ id: "ok" }));
64
- });
65
- await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
66
- const { port } = server.address();
67
- baseUrl = `http://127.0.0.1:${port}`;
68
- });
69
- after(async () => {
70
- await new Promise((resolve) => server.close(() => resolve()));
71
- });
72
- function makeClient() {
73
- // Real client, real HTTP layer, pointed at our mock backend.
74
- return new FrihetClient("fri_test_key", baseUrl);
75
- }
76
- function lastRequest() {
77
- return captured[captured.length - 1];
78
- }
79
- // ── Contract assertions ──────────────────────────────────────────────────────
80
- describe("Banking client contract — #848 live REST surface", () => {
81
- test("listBankAccounts → GET /banking/accounts with pagination query", async () => {
82
- const client = makeClient();
83
- const result = await client.listBankAccounts({ limit: 20, offset: 0 });
84
- const req = lastRequest();
85
- assert.equal(req.method, "GET");
86
- assert.equal(req.path, "/banking/accounts");
87
- assert.equal(req.query.get("limit"), "20");
88
- assert.equal(req.query.get("offset"), "0");
89
- assert.ok(Array.isArray(result.data));
90
- });
91
- test("getBankAccount → GET /banking/accounts/:id (id URL-encoded)", async () => {
92
- const client = makeClient();
93
- await client.getBankAccount("acct/001");
94
- const req = lastRequest();
95
- assert.equal(req.method, "GET");
96
- assert.equal(req.path, "/banking/accounts/acct%2F001");
97
- });
98
- test("listTransactions → GET /banking/transactions with filters", async () => {
99
- const client = makeClient();
100
- await client.listTransactions({ accountId: "acct_001", from: "2026-05-01", to: "2026-05-31", status: "posted" });
101
- const req = lastRequest();
102
- assert.equal(req.method, "GET");
103
- assert.equal(req.path, "/banking/transactions");
104
- assert.equal(req.query.get("accountId"), "acct_001");
105
- assert.equal(req.query.get("from"), "2026-05-01");
106
- assert.equal(req.query.get("to"), "2026-05-31");
107
- assert.equal(req.query.get("status"), "posted");
108
- });
109
- test("categorizeTransaction → PATCH /banking/transactions/:id/categorize with body", async () => {
110
- const client = makeClient();
111
- await client.categorizeTransaction("tx_abc", { category: "supplies", notes: "Q1" });
112
- const req = lastRequest();
113
- assert.equal(req.method, "PATCH");
114
- assert.equal(req.path, "/banking/transactions/tx_abc/categorize");
115
- assert.deepEqual(req.body, { category: "supplies", notes: "Q1" });
116
- });
117
- test("matchTransactionToDocument → POST /banking/transactions/:id/match with body", async () => {
118
- const client = makeClient();
119
- await client.matchTransactionToDocument("tx_abc", { documentId: "inv_xyz", documentType: "invoice", notes: "recon" });
120
- const req = lastRequest();
121
- assert.equal(req.method, "POST");
122
- assert.equal(req.path, "/banking/transactions/tx_abc/match");
123
- assert.deepEqual(req.body, { documentId: "inv_xyz", documentType: "invoice", notes: "recon" });
124
- });
125
- test("methods return live data (not the old '404 until backend ships' stub)", async () => {
126
- // Proves the wiring: a real round-trip yields the backend payload, confirming
127
- // the stale 'planned/404' comment no longer reflects reality (#848 shipped).
128
- const client = makeClient();
129
- const accounts = await client.listBankAccounts();
130
- assert.equal(accounts.total, 1);
131
- });
132
- });
133
- //# sourceMappingURL=banking-client-contract.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"banking-client-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/banking-client-contract.test.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * Tests for Banking MCP tools — Wave 6 (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 banking tools registered
9
- * 2. list_bank_accounts — success path + structuredContent shape
10
- * 3. get_bank_account — success path
11
- * 4. list_transactions — success path + filters
12
- * 5. categorize_transaction — success path + update response
13
- * 6. match_transaction_to_invoice — confirm=false gate
14
- * 7. match_transaction_to_invoice — confirm=true success path
15
- * 8. API error — 404 propagated as isError=true
16
- */
17
- export {};
18
- //# sourceMappingURL=banking-tools.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"banking-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/banking-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -1,252 +0,0 @@
1
- /**
2
- * Tests for Banking MCP tools — Wave 6 (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 banking tools registered
9
- * 2. list_bank_accounts — success path + structuredContent shape
10
- * 3. get_bank_account — success path
11
- * 4. list_transactions — success path + filters
12
- * 5. categorize_transaction — success path + update response
13
- * 6. match_transaction_to_invoice — confirm=false gate
14
- * 7. match_transaction_to_invoice — confirm=true success path
15
- * 8. API error — 404 propagated as isError=true
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
- // ── Mock data ────────────────────────────────────────────────────────────────
26
- const MOCK_ACCOUNT = {
27
- id: "acct_001",
28
- alias: "Cuenta corriente BRTHLS",
29
- ibanLast4: "4321",
30
- currency: "EUR",
31
- balance: 12345.67,
32
- lastSyncedAt: "2026-05-10T08:00:00Z",
33
- createdAt: "2026-01-01T00:00:00Z",
34
- };
35
- const MOCK_ACCOUNTS_LIST = {
36
- data: [MOCK_ACCOUNT],
37
- total: 1,
38
- limit: 20,
39
- offset: 0,
40
- };
41
- const MOCK_TRANSACTION = {
42
- id: "tx_abc123",
43
- accountId: "acct_001",
44
- amount: -250.0,
45
- currency: "EUR",
46
- description: "Pago proveedor Acme",
47
- postedAt: "2026-05-09T14:23:00Z",
48
- category: "supplies",
49
- status: "posted",
50
- matchedDocId: null,
51
- };
52
- const MOCK_TRANSACTIONS_LIST = {
53
- data: [MOCK_TRANSACTION],
54
- total: 1,
55
- limit: 20,
56
- offset: 0,
57
- };
58
- // ── Client stubs ─────────────────────────────────────────────────────────────
59
- function makeSuccessClient() {
60
- return {
61
- listBankAccounts: async () => MOCK_ACCOUNTS_LIST,
62
- getBankAccount: async (_id) => MOCK_ACCOUNT,
63
- listTransactions: async () => MOCK_TRANSACTIONS_LIST,
64
- categorizeTransaction: async (_id, data) => ({ ...MOCK_TRANSACTION, category: data["category"] }),
65
- matchTransactionToDocument: async (_txId, data) => ({
66
- ...MOCK_TRANSACTION,
67
- matchedDocId: data["documentId"],
68
- }),
69
- };
70
- }
71
- function make404Client() {
72
- const notFound = () => {
73
- const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
74
- return Promise.reject(err);
75
- };
76
- return {
77
- listBankAccounts: notFound,
78
- getBankAccount: notFound,
79
- listTransactions: notFound,
80
- categorizeTransaction: notFound,
81
- matchTransactionToDocument: notFound,
82
- };
83
- }
84
- // ── Helper ───────────────────────────────────────────────────────────────────
85
- async function makeServer(clientFn) {
86
- const server = new StubMcpServer();
87
- const { registerBankingTools } = await import("../tools/banking.js");
88
- registerBankingTools(server, clientFn());
89
- return server;
90
- }
91
- // ── Registration tests ───────────────────────────────────────────────────────
92
- describe("Banking Tools — Registration", () => {
93
- let server;
94
- beforeEach(async () => {
95
- server = await makeServer(makeSuccessClient);
96
- });
97
- test("registers exactly 5 banking tools", () => {
98
- assert.equal(server.tools.size, 5);
99
- });
100
- test("registers list_bank_accounts", () => {
101
- assert.ok(server.tools.has("list_bank_accounts"));
102
- });
103
- test("registers get_bank_account", () => {
104
- assert.ok(server.tools.has("get_bank_account"));
105
- });
106
- test("registers list_transactions", () => {
107
- assert.ok(server.tools.has("list_transactions"));
108
- });
109
- test("registers categorize_transaction", () => {
110
- assert.ok(server.tools.has("categorize_transaction"));
111
- });
112
- test("registers match_transaction_to_invoice", () => {
113
- assert.ok(server.tools.has("match_transaction_to_invoice"));
114
- });
115
- });
116
- // ── list_bank_accounts ───────────────────────────────────────────────────────
117
- describe("list_bank_accounts — success path", () => {
118
- test("returns structuredContent with data array", async () => {
119
- const server = await makeServer(makeSuccessClient);
120
- const tool = server.tools.get("list_bank_accounts");
121
- const result = await tool.handler({});
122
- assert.ok(!result.isError);
123
- assert.ok(result.structuredContent);
124
- const sc = result.structuredContent;
125
- assert.ok(Array.isArray(sc["data"]));
126
- assert.equal(sc["data"].length, 1);
127
- assert.equal(sc["total"], 1);
128
- });
129
- test("first account has IBAN last 4 and balance", async () => {
130
- const server = await makeServer(makeSuccessClient);
131
- const tool = server.tools.get("list_bank_accounts");
132
- const result = await tool.handler({});
133
- const first = result.structuredContent["data"][0];
134
- assert.equal(first["id"], "acct_001");
135
- assert.equal(first["ibanLast4"], "4321");
136
- assert.equal(first["currency"], "EUR");
137
- assert.equal(first["balance"], 12345.67);
138
- });
139
- test("content block has type text and mentions bank_accounts", async () => {
140
- const server = await makeServer(makeSuccessClient);
141
- const tool = server.tools.get("list_bank_accounts");
142
- const result = await tool.handler({});
143
- assert.equal(result.content[0].type, "text");
144
- assert.ok(result.content[0].text.includes("bank_accounts"));
145
- });
146
- });
147
- // ── get_bank_account ─────────────────────────────────────────────────────────
148
- describe("get_bank_account — success path", () => {
149
- test("returns single account by ID", async () => {
150
- const server = await makeServer(makeSuccessClient);
151
- const tool = server.tools.get("get_bank_account");
152
- const result = await tool.handler({ id: "acct_001" });
153
- assert.ok(!result.isError);
154
- const sc = result.structuredContent;
155
- assert.equal(sc["id"], "acct_001");
156
- assert.equal(sc["alias"], "Cuenta corriente BRTHLS");
157
- });
158
- test("404 propagates as isError=true", async () => {
159
- const server = await makeServer(make404Client);
160
- const tool = server.tools.get("get_bank_account");
161
- const result = await tool.handler({ id: "acct_missing" });
162
- assert.ok(result.isError);
163
- assert.ok(result.content[0].text.includes("Error:"));
164
- });
165
- });
166
- // ── list_transactions ────────────────────────────────────────────────────────
167
- describe("list_transactions — success path", () => {
168
- test("returns transactions list", async () => {
169
- const server = await makeServer(makeSuccessClient);
170
- const tool = server.tools.get("list_transactions");
171
- const result = await tool.handler({ accountId: "acct_001", from: "2026-05-01", to: "2026-05-31" });
172
- assert.ok(!result.isError);
173
- const sc = result.structuredContent;
174
- assert.ok(Array.isArray(sc["data"]));
175
- assert.equal(sc["total"], 1);
176
- });
177
- test("first transaction has expected fields", async () => {
178
- const server = await makeServer(makeSuccessClient);
179
- const tool = server.tools.get("list_transactions");
180
- const result = await tool.handler({});
181
- const first = result.structuredContent["data"][0];
182
- assert.equal(first["id"], "tx_abc123");
183
- assert.equal(first["amount"], -250.0);
184
- assert.equal(first["status"], "posted");
185
- assert.equal(first["category"], "supplies");
186
- });
187
- test("accepts status filter without error", async () => {
188
- const server = await makeServer(makeSuccessClient);
189
- const tool = server.tools.get("list_transactions");
190
- const result = await tool.handler({ status: "posted" });
191
- assert.ok(!result.isError);
192
- });
193
- });
194
- // ── categorize_transaction ───────────────────────────────────────────────────
195
- describe("categorize_transaction — success path", () => {
196
- test("returns updated transaction with new category", async () => {
197
- const server = await makeServer(makeSuccessClient);
198
- const tool = server.tools.get("categorize_transaction");
199
- const result = await tool.handler({ id: "tx_abc123", category: "travel" });
200
- assert.ok(!result.isError);
201
- const sc = result.structuredContent;
202
- assert.equal(sc["id"], "tx_abc123");
203
- assert.equal(sc["category"], "travel");
204
- });
205
- test("content block mentions categorized", async () => {
206
- const server = await makeServer(makeSuccessClient);
207
- const tool = server.tools.get("categorize_transaction");
208
- const result = await tool.handler({ id: "tx_abc123", category: "software", notes: "SaaS Q2" });
209
- assert.ok(result.content[0].text.includes("categorized"));
210
- });
211
- });
212
- // ── match_transaction_to_invoice ─────────────────────────────────────────────
213
- describe("match_transaction_to_invoice — trust area gate", () => {
214
- test("confirm=false returns isError=true without calling API", async () => {
215
- const server = await makeServer(makeSuccessClient);
216
- const tool = server.tools.get("match_transaction_to_invoice");
217
- const result = await tool.handler({
218
- transactionId: "tx_abc123",
219
- documentId: "inv_xyz",
220
- documentType: "invoice",
221
- confirm: false,
222
- });
223
- assert.ok(result.isError, "should be isError when confirm=false");
224
- assert.ok(result.content[0].text.includes("confirm=true"));
225
- });
226
- test("confirm=true success path returns matched transaction", async () => {
227
- const server = await makeServer(makeSuccessClient);
228
- const tool = server.tools.get("match_transaction_to_invoice");
229
- const result = await tool.handler({
230
- transactionId: "tx_abc123",
231
- documentId: "inv_xyz456",
232
- documentType: "invoice",
233
- confirm: true,
234
- });
235
- assert.ok(!result.isError);
236
- const sc = result.structuredContent;
237
- assert.equal(sc["id"], "tx_abc123");
238
- assert.equal(sc["matchedDocId"], "inv_xyz456");
239
- });
240
- test("confirm=true with expense type works", async () => {
241
- const server = await makeServer(makeSuccessClient);
242
- const tool = server.tools.get("match_transaction_to_invoice");
243
- const result = await tool.handler({
244
- transactionId: "tx_abc123",
245
- documentId: "exp_abc",
246
- documentType: "expense",
247
- confirm: true,
248
- });
249
- assert.ok(!result.isError);
250
- });
251
- });
252
- //# sourceMappingURL=banking-tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"banking-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/banking-tools.test.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- /**
2
- * Output-schema CONTRACT tests.
3
- *
4
- * WHY THIS FILE EXISTS (the bug class it locks down forever):
5
- *
6
- * The MCP tools declare Zod `outputSchema`s and put the raw Cloud Function (CF)
7
- * response into `structuredContent`. The CF response has TWO shapes that have
8
- * historically drifted from the schemas and broken tools silently:
9
- *
10
- * 1. The `{ data, meta }` ENVELOPE. Single-object reads (e.g. the shipped
11
- * `/v1/fiscal/modelo/:code` CF) return `res.json({ data: <item>, meta })`;
12
- * list reads return `{ data: [<item>...], total, limit, offset }`. The
13
- * client unwraps single objects to `body.data` (`requestUnwrapped`) and
14
- * keeps the paginated envelope (`requestPaginated`). If the schema and the
15
- * unwrap disagree, the tool emits a structuredContent the model can't parse.
16
- *
17
- * 2. Firestore-TIMESTAMP-shaped fields. Firestore-direct reads can leak
18
- * `{ _seconds, _nanoseconds }` objects on date-ish fields instead of ISO
19
- * strings. The enumerated date fields are typed `z.string()`, so a raw
20
- * timestamp on `createdAt` would FAIL — but `.passthrough()` carries extra
21
- * Firestore-internal timestamp fields (`_syncedAt`, `lastTouchedAt`, …)
22
- * through untouched. This test pins BOTH facts: enumerated dates stay ISO
23
- * strings, and extra `{_seconds}` fields pass via `.passthrough()`.
24
- *
25
- * If a future refactor tightens a schema (drops `.passthrough()`, or retypes a
26
- * passthrough timestamp field as `z.string()`), or the CF starts returning a
27
- * shape the schema rejects, THIS test goes red in CI — instead of the bug
28
- * reaching an LLM as an unparseable tool result.
29
- *
30
- * Run: npm test (after build) — node:test + node:assert.
31
- */
32
- export {};
33
- //# sourceMappingURL=contract.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG"}