@frihet/mcp-server 1.7.0-beta.1 → 1.9.0-beta.1

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 (65) hide show
  1. package/README.md +8 -6
  2. package/dist/__tests__/banking-tools.test.d.ts +18 -0
  3. package/dist/__tests__/banking-tools.test.d.ts.map +1 -0
  4. package/dist/__tests__/banking-tools.test.js +252 -0
  5. package/dist/__tests__/banking-tools.test.js.map +1 -0
  6. package/dist/__tests__/fiscal-tools.test.d.ts +20 -0
  7. package/dist/__tests__/fiscal-tools.test.d.ts.map +1 -0
  8. package/dist/__tests__/fiscal-tools.test.js +233 -0
  9. package/dist/__tests__/fiscal-tools.test.js.map +1 -0
  10. package/dist/__tests__/pos-tools.test.d.ts +16 -0
  11. package/dist/__tests__/pos-tools.test.d.ts.map +1 -0
  12. package/dist/__tests__/pos-tools.test.js +244 -0
  13. package/dist/__tests__/pos-tools.test.js.map +1 -0
  14. package/dist/__tests__/recurring-tools.test.d.ts +16 -0
  15. package/dist/__tests__/recurring-tools.test.d.ts.map +1 -0
  16. package/dist/__tests__/recurring-tools.test.js +166 -0
  17. package/dist/__tests__/recurring-tools.test.js.map +1 -0
  18. package/dist/__tests__/stay-tools.test.d.ts +17 -0
  19. package/dist/__tests__/stay-tools.test.d.ts.map +1 -0
  20. package/dist/__tests__/stay-tools.test.js +259 -0
  21. package/dist/__tests__/stay-tools.test.js.map +1 -0
  22. package/dist/__tests__/time-tools.test.d.ts +17 -0
  23. package/dist/__tests__/time-tools.test.d.ts.map +1 -0
  24. package/dist/__tests__/time-tools.test.js +199 -0
  25. package/dist/__tests__/time-tools.test.js.map +1 -0
  26. package/dist/client-interface.d.ts +89 -0
  27. package/dist/client-interface.d.ts.map +1 -1
  28. package/dist/client.d.ts +89 -0
  29. package/dist/client.d.ts.map +1 -1
  30. package/dist/client.js +145 -0
  31. package/dist/client.js.map +1 -1
  32. package/dist/index.js +0 -0
  33. package/dist/tools/banking.d.ts +19 -0
  34. package/dist/tools/banking.d.ts.map +1 -0
  35. package/dist/tools/banking.js +155 -0
  36. package/dist/tools/banking.js.map +1 -0
  37. package/dist/tools/fiscal.d.ts +22 -0
  38. package/dist/tools/fiscal.d.ts.map +1 -0
  39. package/dist/tools/fiscal.js +215 -0
  40. package/dist/tools/fiscal.js.map +1 -0
  41. package/dist/tools/pos.d.ts +15 -0
  42. package/dist/tools/pos.d.ts.map +1 -0
  43. package/dist/tools/pos.js +156 -0
  44. package/dist/tools/pos.js.map +1 -0
  45. package/dist/tools/recurring.d.ts +16 -0
  46. package/dist/tools/recurring.d.ts.map +1 -0
  47. package/dist/tools/recurring.js +67 -0
  48. package/dist/tools/recurring.js.map +1 -0
  49. package/dist/tools/register-all.d.ts +2 -2
  50. package/dist/tools/register-all.d.ts.map +1 -1
  51. package/dist/tools/register-all.js +14 -2
  52. package/dist/tools/register-all.js.map +1 -1
  53. package/dist/tools/shared.d.ts +169 -0
  54. package/dist/tools/shared.d.ts.map +1 -1
  55. package/dist/tools/shared.js +140 -0
  56. package/dist/tools/shared.js.map +1 -1
  57. package/dist/tools/stay.d.ts +6 -78
  58. package/dist/tools/stay.d.ts.map +1 -1
  59. package/dist/tools/stay.js +121 -343
  60. package/dist/tools/stay.js.map +1 -1
  61. package/dist/tools/time.d.ts +18 -0
  62. package/dist/tools/time.d.ts.map +1 -0
  63. package/dist/tools/time.js +134 -0
  64. package/dist/tools/time.js.map +1 -0
  65. package/package.json +3 -3
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
  <a href="https://smithery.ai/server/frihet/frihet-mcp"><img src="https://smithery.ai/badge/frihet/frihet-mcp" alt="Smithery installs"></a>
18
18
  <a href="https://registry.modelcontextprotocol.io/?q=io.frihet"><img src="https://img.shields.io/badge/MCP_Registry-io.frihet%2Ferp-4A90D9?style=flat&logo=anthropic&logoColor=white" alt="MCP Registry"></a>
19
19
  <a href="https://github.com/Frihet-io/frihet-mcp/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-18181b?style=flat&labelColor=09090b" alt="license"></a>
20
- <img src="https://img.shields.io/badge/tools-66-18181b?style=flat&labelColor=09090b" alt="66 tools">
20
+ <img src="https://img.shields.io/badge/tools-94-18181b?style=flat&labelColor=09090b" alt="94 tools">
21
21
  <img src="https://img.shields.io/badge/node-%3E%3D18-18181b?style=flat&labelColor=09090b" alt="node >=18">
22
22
  <a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-18181b?style=flat&labelColor=09090b" alt="TypeScript"></a>
23
23
  </p>
@@ -33,7 +33,9 @@ You: "Create an invoice for TechStart SL, 40 hours of consulting at 75 EUR/h
33
33
  Claude: Done. Invoice INV-2026-089 created. Total: 3,000.00 EUR + 21% IVA = 3,630.00 EUR.
34
34
  ```
35
35
 
36
- 66 tools. 8 resources. 7 prompts. Structured output on every tool. Zero boilerplate.
36
+ 94 tools. 8 resources. 7 prompts. Structured output on every tool. Zero boilerplate.
37
+
38
+ <!-- v1.9.0-beta.1 — Wave Mature 1: Banking (5) + Fiscal (8) + Stay (5) + POS (4) + Time (4) + Recurring (2) = 94 tools total -->
37
39
 
38
40
  ---
39
41
 
@@ -161,7 +163,7 @@ Talk to your ERP. These are real prompts, not marketing copy.
161
163
 
162
164
  ## What to expect
163
165
 
164
- This MCP is a **structured data interface** -- you describe what you want in natural language, and the AI creates, queries, or modifies business records in Frihet. All 66 tools are CRUD operations over the REST API.
166
+ This MCP is a **structured data interface** -- you describe what you want in natural language, and the AI creates, queries, or modifies business records in Frihet. All 94 tools are CRUD operations over the REST API.
165
167
 
166
168
  **Works great:**
167
169
 
@@ -188,7 +190,7 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
188
190
 
189
191
  ---
190
192
 
191
- ## Tools (66)
193
+ ## Tools (94)
192
194
 
193
195
  ### Invoices (6)
194
196
 
@@ -294,7 +296,7 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
294
296
  | `validate_einvoice_xml` | Validate raw XML against format schema + schematron rules (KOSIT / Mustang / XSD / Schematron) |
295
297
  | `export_datev` | Export accounting data as DATEV EXTF (Buchungsstapel / Debitoren / Kreditoren) in CP1252 encoding |
296
298
 
297
- All 66 tools return **structured output** via `outputSchema` -- typed JSON, not raw text. List tools return paginated results (`{ data, total, limit, offset }`).
299
+ All 94 tools return **structured output** via `outputSchema` -- typed JSON, not raw text. List tools return paginated results (`{ data, total, limit, offset }`).
298
300
 
299
301
  ---
300
302
 
@@ -473,7 +475,7 @@ npm run build # must pass before submitting
473
475
 
474
476
  | Package | What it is |
475
477
  |---------|-----------|
476
- | [`@frihet/mcp-server`](https://www.npmjs.com/package/@frihet/mcp-server) | This MCP server (66 tools, 8 resources, 7 prompts) |
478
+ | [`@frihet/mcp-server`](https://www.npmjs.com/package/@frihet/mcp-server) | This MCP server (94 tools, 8 resources, 7 prompts) |
477
479
  | [`@frihet/sdk`](https://github.com/Frihet-io/frihet-sdk) | TypeScript SDK (`frihet.invoices.create()`) |
478
480
  | [`frihet`](https://www.npmjs.com/package/frihet) | CLI (`frihet invoices list --status overdue`) |
479
481
  | [`n8n-nodes-frihet`](https://www.npmjs.com/package/n8n-nodes-frihet) | n8n community node for workflow automation |
@@ -0,0 +1,18 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banking-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/banking-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -0,0 +1,252 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banking-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/banking-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Tests for Fiscal MCP tools — Wave 6 (8 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 8 fiscal tools registered
9
+ * 2. get_modelo_303_summary — success path + period param
10
+ * 3. get_modelo_130_summary — success path
11
+ * 4. get_modelo_390_summary — success path
12
+ * 5. get_modelo_180_summary — success path
13
+ * 6. get_modelo_347_summary — success path
14
+ * 7. verifactu_status — success path
15
+ * 8. verifactu_resubmit — confirm=false gate + confirm=true success
16
+ * 9. ticketbai_status — success path + province field
17
+ * 10. API error — 404 propagated as isError=true
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=fiscal-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiscal-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/fiscal-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Tests for Fiscal MCP tools — Wave 6 (8 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 8 fiscal tools registered
9
+ * 2. get_modelo_303_summary — success path + period param
10
+ * 3. get_modelo_130_summary — success path
11
+ * 4. get_modelo_390_summary — success path
12
+ * 5. get_modelo_180_summary — success path
13
+ * 6. get_modelo_347_summary — success path
14
+ * 7. verifactu_status — success path
15
+ * 8. verifactu_resubmit — confirm=false gate + confirm=true success
16
+ * 9. ticketbai_status — success path + province field
17
+ * 10. API error — 404 propagated as isError=true
18
+ */
19
+ import { test, describe, beforeEach } from "node:test";
20
+ import assert from "node:assert/strict";
21
+ class StubMcpServer {
22
+ tools = new Map();
23
+ registerTool(name, config, handler) {
24
+ this.tools.set(name, { name, config, handler });
25
+ }
26
+ }
27
+ // ── Mock data ────────────────────────────────────────────────────────────────
28
+ const MOCK_MODELO_SUMMARY = {
29
+ modeloCode: "303",
30
+ period: "2026-Q1",
31
+ totalsByRate: { "21": 4200.0, "10": 350.0, "4": 80.0 },
32
+ totalDeductible: 1200.0,
33
+ totalDue: 3430.0,
34
+ deadline: "2026-04-20",
35
+ };
36
+ const MOCK_VERIFACTU_STATUS = {
37
+ invoiceId: "inv_abc123",
38
+ lastSubmissionAt: "2026-05-09T10:00:00Z",
39
+ hash: "sha256:abcdef1234567890",
40
+ status: "success",
41
+ aeatResponse: "0000",
42
+ qrUrl: "https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678&numserie=2026-001&fecha=2026-05-09&importe=1210.00",
43
+ };
44
+ const MOCK_TICKETBAI_STATUS = {
45
+ invoiceId: "inv_def456",
46
+ lastSubmissionAt: "2026-05-09T11:00:00Z",
47
+ hash: "sha256:xyz9876543210",
48
+ status: "success",
49
+ aeatResponse: "0000",
50
+ qrUrl: "https://tbai.ehu.eus/qr/...",
51
+ province: "bizkaia",
52
+ };
53
+ // ── Client stubs ─────────────────────────────────────────────────────────────
54
+ function makeSuccessClient() {
55
+ return {
56
+ getFiscalModeloSummary: async (modeloCode, period) => ({
57
+ ...MOCK_MODELO_SUMMARY,
58
+ modeloCode,
59
+ period: period ?? "2026-Q1",
60
+ }),
61
+ getVerifactuStatus: async (_invoiceId) => MOCK_VERIFACTU_STATUS,
62
+ resubmitVerifactu: async (_invoiceId) => ({ ...MOCK_VERIFACTU_STATUS, status: "pending" }),
63
+ getTicketbaiStatus: async (_invoiceId) => MOCK_TICKETBAI_STATUS,
64
+ };
65
+ }
66
+ function make404Client() {
67
+ const notFound = () => {
68
+ const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
69
+ return Promise.reject(err);
70
+ };
71
+ return {
72
+ getFiscalModeloSummary: notFound,
73
+ getVerifactuStatus: notFound,
74
+ resubmitVerifactu: notFound,
75
+ getTicketbaiStatus: notFound,
76
+ };
77
+ }
78
+ // ── Helper ───────────────────────────────────────────────────────────────────
79
+ async function makeServer(clientFn) {
80
+ const server = new StubMcpServer();
81
+ const { registerFiscalTools } = await import("../tools/fiscal.js");
82
+ registerFiscalTools(server, clientFn());
83
+ return server;
84
+ }
85
+ // ── Registration tests ───────────────────────────────────────────────────────
86
+ describe("Fiscal Tools — Registration", () => {
87
+ let server;
88
+ beforeEach(async () => {
89
+ server = await makeServer(makeSuccessClient);
90
+ });
91
+ test("registers exactly 8 fiscal tools", () => {
92
+ assert.equal(server.tools.size, 8);
93
+ });
94
+ for (const name of [
95
+ "get_modelo_303_summary",
96
+ "get_modelo_130_summary",
97
+ "get_modelo_390_summary",
98
+ "get_modelo_180_summary",
99
+ "get_modelo_347_summary",
100
+ "verifactu_status",
101
+ "verifactu_resubmit",
102
+ "ticketbai_status",
103
+ ]) {
104
+ test(`registers ${name}`, () => {
105
+ assert.ok(server.tools.has(name), `${name} not registered`);
106
+ });
107
+ }
108
+ });
109
+ // ── Modelo summaries ─────────────────────────────────────────────────────────
110
+ describe("get_modelo_303_summary — success path", () => {
111
+ test("returns summary with totalsDue and period", async () => {
112
+ const server = await makeServer(makeSuccessClient);
113
+ const tool = server.tools.get("get_modelo_303_summary");
114
+ const result = await tool.handler({ period: "2026-Q1" });
115
+ assert.ok(!result.isError);
116
+ const sc = result.structuredContent;
117
+ assert.equal(sc["modeloCode"], "303");
118
+ assert.equal(sc["period"], "2026-Q1");
119
+ assert.equal(sc["totalDue"], 3430.0);
120
+ assert.ok(typeof sc["totalsByRate"] === "object");
121
+ });
122
+ test("content block mentions Modelo 303", async () => {
123
+ const server = await makeServer(makeSuccessClient);
124
+ const tool = server.tools.get("get_modelo_303_summary");
125
+ const result = await tool.handler({});
126
+ assert.ok(result.content[0].text.includes("303"));
127
+ });
128
+ test("404 propagates as isError=true", async () => {
129
+ const server = await makeServer(make404Client);
130
+ const tool = server.tools.get("get_modelo_303_summary");
131
+ const result = await tool.handler({ period: "2026-Q1" });
132
+ assert.ok(result.isError);
133
+ });
134
+ });
135
+ describe("get_modelo_130_summary — success path", () => {
136
+ test("returns modeloCode 130", async () => {
137
+ const server = await makeServer(makeSuccessClient);
138
+ const tool = server.tools.get("get_modelo_130_summary");
139
+ const result = await tool.handler({ period: "2026-Q1" });
140
+ assert.ok(!result.isError);
141
+ assert.equal(result.structuredContent["modeloCode"], "130");
142
+ });
143
+ });
144
+ describe("get_modelo_390_summary — success path", () => {
145
+ test("returns modeloCode 390", async () => {
146
+ const server = await makeServer(makeSuccessClient);
147
+ const tool = server.tools.get("get_modelo_390_summary");
148
+ const result = await tool.handler({ period: "2025" });
149
+ assert.ok(!result.isError);
150
+ assert.equal(result.structuredContent["modeloCode"], "390");
151
+ });
152
+ });
153
+ describe("get_modelo_180_summary — success path", () => {
154
+ test("returns modeloCode 180", async () => {
155
+ const server = await makeServer(makeSuccessClient);
156
+ const tool = server.tools.get("get_modelo_180_summary");
157
+ const result = await tool.handler({ period: "2025" });
158
+ assert.ok(!result.isError);
159
+ assert.equal(result.structuredContent["modeloCode"], "180");
160
+ });
161
+ });
162
+ describe("get_modelo_347_summary — success path", () => {
163
+ test("returns modeloCode 347", async () => {
164
+ const server = await makeServer(makeSuccessClient);
165
+ const tool = server.tools.get("get_modelo_347_summary");
166
+ const result = await tool.handler({ period: "2025" });
167
+ assert.ok(!result.isError);
168
+ assert.equal(result.structuredContent["modeloCode"], "347");
169
+ });
170
+ });
171
+ // ── verifactu_status ─────────────────────────────────────────────────────────
172
+ describe("verifactu_status — success path", () => {
173
+ test("returns status with hash and qrUrl", async () => {
174
+ const server = await makeServer(makeSuccessClient);
175
+ const tool = server.tools.get("verifactu_status");
176
+ const result = await tool.handler({ invoiceId: "inv_abc123" });
177
+ assert.ok(!result.isError);
178
+ const sc = result.structuredContent;
179
+ assert.equal(sc["invoiceId"], "inv_abc123");
180
+ assert.equal(sc["status"], "success");
181
+ assert.ok(typeof sc["hash"] === "string");
182
+ assert.ok(typeof sc["qrUrl"] === "string");
183
+ });
184
+ test("aeatResponse is present", async () => {
185
+ const server = await makeServer(makeSuccessClient);
186
+ const tool = server.tools.get("verifactu_status");
187
+ const result = await tool.handler({ invoiceId: "inv_abc123" });
188
+ assert.equal(result.structuredContent["aeatResponse"], "0000");
189
+ });
190
+ });
191
+ // ── verifactu_resubmit ───────────────────────────────────────────────────────
192
+ describe("verifactu_resubmit — trust area gate", () => {
193
+ test("confirm=false returns isError=true", async () => {
194
+ const server = await makeServer(makeSuccessClient);
195
+ const tool = server.tools.get("verifactu_resubmit");
196
+ const result = await tool.handler({ invoiceId: "inv_abc123", confirm: false });
197
+ assert.ok(result.isError);
198
+ assert.ok(result.content[0].text.includes("confirm=true"));
199
+ });
200
+ test("confirm=true proceeds and returns pending status", async () => {
201
+ const server = await makeServer(makeSuccessClient);
202
+ const tool = server.tools.get("verifactu_resubmit");
203
+ const result = await tool.handler({ invoiceId: "inv_abc123", confirm: true });
204
+ assert.ok(!result.isError);
205
+ assert.equal(result.structuredContent["status"], "pending");
206
+ });
207
+ test("confirm=true with 404 propagates isError=true", async () => {
208
+ const server = await makeServer(make404Client);
209
+ const tool = server.tools.get("verifactu_resubmit");
210
+ const result = await tool.handler({ invoiceId: "inv_missing", confirm: true });
211
+ assert.ok(result.isError);
212
+ });
213
+ });
214
+ // ── ticketbai_status ─────────────────────────────────────────────────────────
215
+ describe("ticketbai_status — success path", () => {
216
+ test("returns status with province field", async () => {
217
+ const server = await makeServer(makeSuccessClient);
218
+ const tool = server.tools.get("ticketbai_status");
219
+ const result = await tool.handler({ invoiceId: "inv_def456" });
220
+ assert.ok(!result.isError);
221
+ const sc = result.structuredContent;
222
+ assert.equal(sc["invoiceId"], "inv_def456");
223
+ assert.equal(sc["province"], "bizkaia");
224
+ assert.equal(sc["status"], "success");
225
+ });
226
+ test("404 propagates as isError=true", async () => {
227
+ const server = await makeServer(make404Client);
228
+ const tool = server.tools.get("ticketbai_status");
229
+ const result = await tool.handler({ invoiceId: "inv_missing" });
230
+ assert.ok(result.isError);
231
+ });
232
+ });
233
+ //# sourceMappingURL=fiscal-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiscal-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/fiscal-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tests for POS MCP tools — Wave 5 (4 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 4 tools registered on McpServer
9
+ * 2. list_terminals — success path + structuredContent shape
10
+ * 3. get_sale — success path + structuredContent shape
11
+ * 4. list_sales — success path + structuredContent shape
12
+ * 5. refund_sale — confirm=false blocked, confirm=true succeeds
13
+ * 6. API error path — 404 propagated through handleToolError
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=pos-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pos-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pos-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}