@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.
- package/README.md +8 -6
- package/dist/__tests__/banking-tools.test.d.ts +18 -0
- package/dist/__tests__/banking-tools.test.d.ts.map +1 -0
- package/dist/__tests__/banking-tools.test.js +252 -0
- package/dist/__tests__/banking-tools.test.js.map +1 -0
- package/dist/__tests__/fiscal-tools.test.d.ts +20 -0
- package/dist/__tests__/fiscal-tools.test.d.ts.map +1 -0
- package/dist/__tests__/fiscal-tools.test.js +233 -0
- package/dist/__tests__/fiscal-tools.test.js.map +1 -0
- package/dist/__tests__/pos-tools.test.d.ts +16 -0
- package/dist/__tests__/pos-tools.test.d.ts.map +1 -0
- package/dist/__tests__/pos-tools.test.js +244 -0
- package/dist/__tests__/pos-tools.test.js.map +1 -0
- package/dist/__tests__/recurring-tools.test.d.ts +16 -0
- package/dist/__tests__/recurring-tools.test.d.ts.map +1 -0
- package/dist/__tests__/recurring-tools.test.js +166 -0
- package/dist/__tests__/recurring-tools.test.js.map +1 -0
- package/dist/__tests__/stay-tools.test.d.ts +17 -0
- package/dist/__tests__/stay-tools.test.d.ts.map +1 -0
- package/dist/__tests__/stay-tools.test.js +259 -0
- package/dist/__tests__/stay-tools.test.js.map +1 -0
- package/dist/__tests__/time-tools.test.d.ts +17 -0
- package/dist/__tests__/time-tools.test.d.ts.map +1 -0
- package/dist/__tests__/time-tools.test.js +199 -0
- package/dist/__tests__/time-tools.test.js.map +1 -0
- package/dist/client-interface.d.ts +89 -0
- package/dist/client-interface.d.ts.map +1 -1
- package/dist/client.d.ts +89 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +145 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/tools/banking.d.ts +19 -0
- package/dist/tools/banking.d.ts.map +1 -0
- package/dist/tools/banking.js +155 -0
- package/dist/tools/banking.js.map +1 -0
- package/dist/tools/fiscal.d.ts +22 -0
- package/dist/tools/fiscal.d.ts.map +1 -0
- package/dist/tools/fiscal.js +215 -0
- package/dist/tools/fiscal.js.map +1 -0
- package/dist/tools/pos.d.ts +15 -0
- package/dist/tools/pos.d.ts.map +1 -0
- package/dist/tools/pos.js +156 -0
- package/dist/tools/pos.js.map +1 -0
- package/dist/tools/recurring.d.ts +16 -0
- package/dist/tools/recurring.d.ts.map +1 -0
- package/dist/tools/recurring.js +67 -0
- package/dist/tools/recurring.js.map +1 -0
- package/dist/tools/register-all.d.ts +2 -2
- package/dist/tools/register-all.d.ts.map +1 -1
- package/dist/tools/register-all.js +14 -2
- package/dist/tools/register-all.js.map +1 -1
- package/dist/tools/shared.d.ts +169 -0
- package/dist/tools/shared.d.ts.map +1 -1
- package/dist/tools/shared.js +140 -0
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/stay.d.ts +6 -78
- package/dist/tools/stay.d.ts.map +1 -1
- package/dist/tools/stay.js +121 -343
- package/dist/tools/stay.js.map +1 -1
- package/dist/tools/time.d.ts +18 -0
- package/dist/tools/time.d.ts.map +1 -0
- package/dist/tools/time.js +134 -0
- package/dist/tools/time.js.map +1 -0
- 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-
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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
|
|
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 (
|
|
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"}
|