@frihet/mcp-server 1.7.0-beta.1 → 1.12.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 +262 -12
- 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__/d4b-hr-payroll-onboarding-tools.test.d.ts +13 -0
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts.map +1 -0
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js +420 -0
- package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js.map +1 -0
- package/dist/__tests__/einvoice-day4-tools.test.d.ts +16 -0
- package/dist/__tests__/einvoice-day4-tools.test.d.ts.map +1 -0
- package/dist/__tests__/einvoice-day4-tools.test.js +377 -0
- package/dist/__tests__/einvoice-day4-tools.test.js.map +1 -0
- package/dist/__tests__/einvoice-tools.test.d.ts +1 -1
- package/dist/__tests__/einvoice-tools.test.js +25 -12
- package/dist/__tests__/einvoice-tools.test.js.map +1 -1
- package/dist/__tests__/fiscal-tools.test.d.ts +21 -0
- package/dist/__tests__/fiscal-tools.test.d.ts.map +1 -0
- package/dist/__tests__/fiscal-tools.test.js +215 -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 +23 -0
- package/dist/__tests__/recurring-tools.test.d.ts.map +1 -0
- package/dist/__tests__/recurring-tools.test.js +352 -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__/team-tools.test.d.ts +18 -0
- package/dist/__tests__/team-tools.test.d.ts.map +1 -0
- package/dist/__tests__/team-tools.test.js +228 -0
- package/dist/__tests__/team-tools.test.js.map +1 -0
- package/dist/__tests__/time-tools.test.d.ts +19 -0
- package/dist/__tests__/time-tools.test.d.ts.map +1 -0
- package/dist/__tests__/time-tools.test.js +286 -0
- package/dist/__tests__/time-tools.test.js.map +1 -0
- package/dist/client-interface.d.ts +325 -0
- package/dist/client-interface.d.ts.map +1 -1
- package/dist/client.d.ts +325 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +404 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/tools/accountingClose.d.ts +20 -0
- package/dist/tools/accountingClose.d.ts.map +1 -0
- package/dist/tools/accountingClose.js +119 -0
- package/dist/tools/accountingClose.js.map +1 -0
- package/dist/tools/audit_gl.d.ts +19 -0
- package/dist/tools/audit_gl.d.ts.map +1 -0
- package/dist/tools/audit_gl.js +86 -0
- package/dist/tools/audit_gl.js.map +1 -0
- package/dist/tools/bank_rules.d.ts +23 -0
- package/dist/tools/bank_rules.d.ts.map +1 -0
- package/dist/tools/bank_rules.js +96 -0
- package/dist/tools/bank_rules.js.map +1 -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/einvoice.d.ts +70 -3
- package/dist/tools/einvoice.d.ts.map +1 -1
- package/dist/tools/einvoice.js +421 -3
- package/dist/tools/einvoice.js.map +1 -1
- package/dist/tools/fiscal.d.ts +23 -0
- package/dist/tools/fiscal.d.ts.map +1 -0
- package/dist/tools/fiscal.js +197 -0
- package/dist/tools/fiscal.js.map +1 -0
- package/dist/tools/gestoria.d.ts +28 -0
- package/dist/tools/gestoria.d.ts.map +1 -0
- package/dist/tools/gestoria.js +248 -0
- package/dist/tools/gestoria.js.map +1 -0
- package/dist/tools/hr.d.ts +24 -0
- package/dist/tools/hr.d.ts.map +1 -0
- package/dist/tools/hr.js +219 -0
- package/dist/tools/hr.js.map +1 -0
- package/dist/tools/igic.d.ts +19 -0
- package/dist/tools/igic.d.ts.map +1 -0
- package/dist/tools/igic.js +102 -0
- package/dist/tools/igic.js.map +1 -0
- package/dist/tools/impuesto_sociedades.d.ts +18 -0
- package/dist/tools/impuesto_sociedades.d.ts.map +1 -0
- package/dist/tools/impuesto_sociedades.js +64 -0
- package/dist/tools/impuesto_sociedades.js.map +1 -0
- package/dist/tools/onboard_vies.d.ts +22 -0
- package/dist/tools/onboard_vies.d.ts.map +1 -0
- package/dist/tools/onboard_vies.js +74 -0
- package/dist/tools/onboard_vies.js.map +1 -0
- package/dist/tools/onboarding.d.ts +19 -0
- package/dist/tools/onboarding.d.ts.map +1 -0
- package/dist/tools/onboarding.js +63 -0
- package/dist/tools/onboarding.js.map +1 -0
- package/dist/tools/payroll.d.ts +20 -0
- package/dist/tools/payroll.d.ts.map +1 -0
- package/dist/tools/payroll.js +73 -0
- package/dist/tools/payroll.js.map +1 -0
- package/dist/tools/permissions.d.ts +19 -0
- package/dist/tools/permissions.d.ts.map +1 -0
- package/dist/tools/permissions.js +52 -0
- package/dist/tools/permissions.js.map +1 -0
- package/dist/tools/portal_domain.d.ts +19 -0
- package/dist/tools/portal_domain.d.ts.map +1 -0
- package/dist/tools/portal_domain.js +85 -0
- package/dist/tools/portal_domain.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 +21 -0
- package/dist/tools/recurring.d.ts.map +1 -0
- package/dist/tools/recurring.js +239 -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 +53 -3
- package/dist/tools/register-all.js.map +1 -1
- package/dist/tools/shared.d.ts +481 -0
- package/dist/tools/shared.d.ts.map +1 -1
- package/dist/tools/shared.js +396 -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/team.d.ts +17 -0
- package/dist/tools/team.d.ts.map +1 -0
- package/dist/tools/team.js +141 -0
- package/dist/tools/team.js.map +1 -0
- package/dist/tools/time.d.ts +19 -0
- package/dist/tools/time.d.ts.map +1 -0
- package/dist/tools/time.js +179 -0
- package/dist/tools/time.js.map +1 -0
- package/dist/tools/webhooks.d.ts.map +1 -1
- package/dist/tools/webhooks.js +27 -1
- package/dist/tools/webhooks.js.map +1 -1
- package/package.json +12 -5
- package/scripts/audit-mcp-refs.mjs +331 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Fiscal MCP tools — Wave 6 (7 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 7 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. API error — 404 propagated as isError=true
|
|
17
|
+
*
|
|
18
|
+
* NOTE: ticketbai_status is tested in einvoice-day4-tools.test.ts (canonical).
|
|
19
|
+
*/
|
|
20
|
+
import { test, describe, beforeEach } from "node:test";
|
|
21
|
+
import assert from "node:assert/strict";
|
|
22
|
+
class StubMcpServer {
|
|
23
|
+
tools = new Map();
|
|
24
|
+
registerTool(name, config, handler) {
|
|
25
|
+
this.tools.set(name, { name, config, handler });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ── Mock data ────────────────────────────────────────────────────────────────
|
|
29
|
+
const MOCK_MODELO_SUMMARY = {
|
|
30
|
+
modeloCode: "303",
|
|
31
|
+
period: "2026-Q1",
|
|
32
|
+
totalsByRate: { "21": 4200.0, "10": 350.0, "4": 80.0 },
|
|
33
|
+
totalDeductible: 1200.0,
|
|
34
|
+
totalDue: 3430.0,
|
|
35
|
+
deadline: "2026-04-20",
|
|
36
|
+
};
|
|
37
|
+
const MOCK_VERIFACTU_STATUS = {
|
|
38
|
+
invoiceId: "inv_abc123",
|
|
39
|
+
lastSubmissionAt: "2026-05-09T10:00:00Z",
|
|
40
|
+
hash: "sha256:abcdef1234567890",
|
|
41
|
+
status: "success",
|
|
42
|
+
aeatResponse: "0000",
|
|
43
|
+
qrUrl: "https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=B12345678&numserie=2026-001&fecha=2026-05-09&importe=1210.00",
|
|
44
|
+
};
|
|
45
|
+
const MOCK_TICKETBAI_STATUS = {
|
|
46
|
+
invoiceId: "inv_def456",
|
|
47
|
+
lastSubmissionAt: "2026-05-09T11:00:00Z",
|
|
48
|
+
hash: "sha256:xyz9876543210",
|
|
49
|
+
status: "success",
|
|
50
|
+
aeatResponse: "0000",
|
|
51
|
+
qrUrl: "https://tbai.ehu.eus/qr/...",
|
|
52
|
+
province: "bizkaia",
|
|
53
|
+
};
|
|
54
|
+
// ── Client stubs ─────────────────────────────────────────────────────────────
|
|
55
|
+
function makeSuccessClient() {
|
|
56
|
+
return {
|
|
57
|
+
getFiscalModeloSummary: async (modeloCode, period) => ({
|
|
58
|
+
...MOCK_MODELO_SUMMARY,
|
|
59
|
+
modeloCode,
|
|
60
|
+
period: period ?? "2026-Q1",
|
|
61
|
+
}),
|
|
62
|
+
getVerifactuStatus: async (_invoiceId) => MOCK_VERIFACTU_STATUS,
|
|
63
|
+
resubmitVerifactu: async (_invoiceId) => ({ ...MOCK_VERIFACTU_STATUS, status: "pending" }),
|
|
64
|
+
getTicketbaiStatus: async (_invoiceId) => MOCK_TICKETBAI_STATUS,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function make404Client() {
|
|
68
|
+
const notFound = () => {
|
|
69
|
+
const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
|
|
70
|
+
return Promise.reject(err);
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
getFiscalModeloSummary: notFound,
|
|
74
|
+
getVerifactuStatus: notFound,
|
|
75
|
+
resubmitVerifactu: notFound,
|
|
76
|
+
getTicketbaiStatus: notFound,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// ── Helper ───────────────────────────────────────────────────────────────────
|
|
80
|
+
async function makeServer(clientFn) {
|
|
81
|
+
const server = new StubMcpServer();
|
|
82
|
+
const { registerFiscalTools } = await import("../tools/fiscal.js");
|
|
83
|
+
registerFiscalTools(server, clientFn());
|
|
84
|
+
return server;
|
|
85
|
+
}
|
|
86
|
+
// ── Registration tests ───────────────────────────────────────────────────────
|
|
87
|
+
describe("Fiscal Tools — Registration", () => {
|
|
88
|
+
let server;
|
|
89
|
+
beforeEach(async () => {
|
|
90
|
+
server = await makeServer(makeSuccessClient);
|
|
91
|
+
});
|
|
92
|
+
test("registers exactly 7 fiscal tools", () => {
|
|
93
|
+
assert.equal(server.tools.size, 7);
|
|
94
|
+
});
|
|
95
|
+
for (const name of [
|
|
96
|
+
"get_modelo_303_summary",
|
|
97
|
+
"get_modelo_130_summary",
|
|
98
|
+
"get_modelo_390_summary",
|
|
99
|
+
"get_modelo_180_summary",
|
|
100
|
+
"get_modelo_347_summary",
|
|
101
|
+
"verifactu_status",
|
|
102
|
+
"verifactu_resubmit",
|
|
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 is tested in einvoice-day4-tools.test.ts (canonical location).
|
|
215
|
+
//# 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"}
|
|
@@ -0,0 +1,244 @@
|
|
|
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
|
+
import { test, describe, beforeEach } from "node:test";
|
|
16
|
+
import assert from "node:assert/strict";
|
|
17
|
+
class StubMcpServer {
|
|
18
|
+
tools = new Map();
|
|
19
|
+
registerTool(name, config, handler) {
|
|
20
|
+
this.tools.set(name, { name, config, handler });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// ── Client stubs ─────────────────────────────────────────────────────────────
|
|
24
|
+
const MOCK_TERMINAL = {
|
|
25
|
+
id: "term_001",
|
|
26
|
+
label: "Front Desk",
|
|
27
|
+
deviceType: "bbpos_wisepos_e",
|
|
28
|
+
locationId: "loc_tenerife",
|
|
29
|
+
status: "online",
|
|
30
|
+
stripeReaderId: "tmr_xxxx",
|
|
31
|
+
createdAt: "2026-01-01T00:00:00Z",
|
|
32
|
+
updatedAt: "2026-01-01T00:00:00Z",
|
|
33
|
+
};
|
|
34
|
+
const MOCK_TERMINALS_LIST = {
|
|
35
|
+
data: [MOCK_TERMINAL],
|
|
36
|
+
total: 1,
|
|
37
|
+
limit: 20,
|
|
38
|
+
offset: 0,
|
|
39
|
+
};
|
|
40
|
+
const MOCK_SALE = {
|
|
41
|
+
id: "sale_abc123",
|
|
42
|
+
terminalId: "term_001",
|
|
43
|
+
status: "succeeded",
|
|
44
|
+
amountCents: 4200,
|
|
45
|
+
currency: "EUR",
|
|
46
|
+
paymentMethod: "card_present",
|
|
47
|
+
items: [
|
|
48
|
+
{ description: "Menu del dia", quantity: 2, unitPriceCents: 1200 },
|
|
49
|
+
{ description: "Agua", quantity: 2, unitPriceCents: 150 },
|
|
50
|
+
],
|
|
51
|
+
refundedAmountCents: 0,
|
|
52
|
+
createdAt: "2026-05-10T12:30:00Z",
|
|
53
|
+
updatedAt: "2026-05-10T12:30:00Z",
|
|
54
|
+
};
|
|
55
|
+
const MOCK_SALES_LIST = {
|
|
56
|
+
data: [MOCK_SALE],
|
|
57
|
+
total: 1,
|
|
58
|
+
limit: 20,
|
|
59
|
+
offset: 0,
|
|
60
|
+
};
|
|
61
|
+
const MOCK_REFUND = {
|
|
62
|
+
id: "ref_xyz789",
|
|
63
|
+
saleId: "sale_abc123",
|
|
64
|
+
status: "succeeded",
|
|
65
|
+
amountCents: 4200,
|
|
66
|
+
currency: "EUR",
|
|
67
|
+
reason: "requested_by_customer",
|
|
68
|
+
createdAt: "2026-05-10T13:00:00Z",
|
|
69
|
+
};
|
|
70
|
+
function makeSuccessClient() {
|
|
71
|
+
return {
|
|
72
|
+
listTerminals: async () => MOCK_TERMINALS_LIST,
|
|
73
|
+
getSale: async (_id) => MOCK_SALE,
|
|
74
|
+
listSales: async () => MOCK_SALES_LIST,
|
|
75
|
+
refundSale: async (_id, _data) => MOCK_REFUND,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function make404Client() {
|
|
79
|
+
const notFound = () => {
|
|
80
|
+
const err = Object.assign(new Error("Not Found"), { statusCode: 404, errorCode: "not_found" });
|
|
81
|
+
return Promise.reject(err);
|
|
82
|
+
};
|
|
83
|
+
return {
|
|
84
|
+
listTerminals: notFound,
|
|
85
|
+
getSale: notFound,
|
|
86
|
+
listSales: notFound,
|
|
87
|
+
refundSale: notFound,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// ── Helper ───────────────────────────────────────────────────────────────────
|
|
91
|
+
async function makeServer(clientFn) {
|
|
92
|
+
const server = new StubMcpServer();
|
|
93
|
+
const { registerPosTools } = await import("../tools/pos.js");
|
|
94
|
+
registerPosTools(server, clientFn());
|
|
95
|
+
return server;
|
|
96
|
+
}
|
|
97
|
+
// ── Registration tests ───────────────────────────────────────────────────────
|
|
98
|
+
describe("POS Tools — Registration", () => {
|
|
99
|
+
let server;
|
|
100
|
+
beforeEach(async () => {
|
|
101
|
+
server = await makeServer(makeSuccessClient);
|
|
102
|
+
});
|
|
103
|
+
test("registers exactly 4 POS tools", () => {
|
|
104
|
+
assert.equal(server.tools.size, 4);
|
|
105
|
+
});
|
|
106
|
+
test("registers list_terminals", () => {
|
|
107
|
+
assert.ok(server.tools.has("list_terminals"), "list_terminals not registered");
|
|
108
|
+
});
|
|
109
|
+
test("registers get_sale", () => {
|
|
110
|
+
assert.ok(server.tools.has("get_sale"), "get_sale not registered");
|
|
111
|
+
});
|
|
112
|
+
test("registers list_sales", () => {
|
|
113
|
+
assert.ok(server.tools.has("list_sales"), "list_sales not registered");
|
|
114
|
+
});
|
|
115
|
+
test("registers refund_sale", () => {
|
|
116
|
+
assert.ok(server.tools.has("refund_sale"), "refund_sale not registered");
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
// ── list_terminals ───────────────────────────────────────────────────────────
|
|
120
|
+
describe("list_terminals — success path", () => {
|
|
121
|
+
test("returns structuredContent with data array", async () => {
|
|
122
|
+
const server = await makeServer(makeSuccessClient);
|
|
123
|
+
const tool = server.tools.get("list_terminals");
|
|
124
|
+
const result = await tool.handler({});
|
|
125
|
+
assert.ok(!result.isError);
|
|
126
|
+
const sc = result.structuredContent;
|
|
127
|
+
assert.ok(Array.isArray(sc["data"]));
|
|
128
|
+
assert.equal(sc["data"].length, 1);
|
|
129
|
+
assert.equal(sc["total"], 1);
|
|
130
|
+
});
|
|
131
|
+
test("first terminal has expected fields", async () => {
|
|
132
|
+
const server = await makeServer(makeSuccessClient);
|
|
133
|
+
const tool = server.tools.get("list_terminals");
|
|
134
|
+
const result = await tool.handler({});
|
|
135
|
+
const first = result.structuredContent["data"][0];
|
|
136
|
+
assert.equal(first["id"], "term_001");
|
|
137
|
+
assert.equal(first["label"], "Front Desk");
|
|
138
|
+
assert.equal(first["status"], "online");
|
|
139
|
+
assert.equal(first["deviceType"], "bbpos_wisepos_e");
|
|
140
|
+
});
|
|
141
|
+
test("content block has type text", async () => {
|
|
142
|
+
const server = await makeServer(makeSuccessClient);
|
|
143
|
+
const tool = server.tools.get("list_terminals");
|
|
144
|
+
const result = await tool.handler({});
|
|
145
|
+
assert.equal(result.content[0].type, "text");
|
|
146
|
+
assert.ok(result.content[0].text.includes("terminals"));
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
// ── get_sale ─────────────────────────────────────────────────────────────────
|
|
150
|
+
describe("get_sale — success path", () => {
|
|
151
|
+
test("returns sale by ID", async () => {
|
|
152
|
+
const server = await makeServer(makeSuccessClient);
|
|
153
|
+
const tool = server.tools.get("get_sale");
|
|
154
|
+
const result = await tool.handler({ id: "sale_abc123" });
|
|
155
|
+
assert.ok(!result.isError);
|
|
156
|
+
const sc = result.structuredContent;
|
|
157
|
+
assert.equal(sc["id"], "sale_abc123");
|
|
158
|
+
assert.equal(sc["status"], "succeeded");
|
|
159
|
+
assert.equal(sc["amountCents"], 4200);
|
|
160
|
+
assert.equal(sc["currency"], "EUR");
|
|
161
|
+
});
|
|
162
|
+
test("items array present", async () => {
|
|
163
|
+
const server = await makeServer(makeSuccessClient);
|
|
164
|
+
const tool = server.tools.get("get_sale");
|
|
165
|
+
const result = await tool.handler({ id: "sale_abc123" });
|
|
166
|
+
const sc = result.structuredContent;
|
|
167
|
+
assert.ok(Array.isArray(sc["items"]));
|
|
168
|
+
assert.equal(sc["items"].length, 2);
|
|
169
|
+
});
|
|
170
|
+
test("404 error propagates as isError=true", async () => {
|
|
171
|
+
const server = await makeServer(make404Client);
|
|
172
|
+
const tool = server.tools.get("get_sale");
|
|
173
|
+
const result = await tool.handler({ id: "sale_missing" });
|
|
174
|
+
assert.ok(result.isError, "should be an error on 404");
|
|
175
|
+
assert.ok(result.content[0].text.includes("Error:"));
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
// ── list_sales ───────────────────────────────────────────────────────────────
|
|
179
|
+
describe("list_sales — success path", () => {
|
|
180
|
+
test("returns sales list with total", async () => {
|
|
181
|
+
const server = await makeServer(makeSuccessClient);
|
|
182
|
+
const tool = server.tools.get("list_sales");
|
|
183
|
+
const result = await tool.handler({});
|
|
184
|
+
assert.ok(!result.isError);
|
|
185
|
+
const sc = result.structuredContent;
|
|
186
|
+
assert.ok(Array.isArray(sc["data"]));
|
|
187
|
+
assert.equal(sc["total"], 1);
|
|
188
|
+
});
|
|
189
|
+
test("filters accepted without error", async () => {
|
|
190
|
+
const server = await makeServer(makeSuccessClient);
|
|
191
|
+
const tool = server.tools.get("list_sales");
|
|
192
|
+
const result = await tool.handler({
|
|
193
|
+
terminalId: "term_001",
|
|
194
|
+
status: "succeeded",
|
|
195
|
+
from: "2026-05-01",
|
|
196
|
+
to: "2026-05-31",
|
|
197
|
+
limit: 10,
|
|
198
|
+
offset: 0,
|
|
199
|
+
});
|
|
200
|
+
assert.ok(!result.isError);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
// ── refund_sale ──────────────────────────────────────────────────────────────
|
|
204
|
+
describe("refund_sale — Trust Area confirmation gate", () => {
|
|
205
|
+
test("confirm=false returns isError=true without calling API", async () => {
|
|
206
|
+
const server = await makeServer(makeSuccessClient);
|
|
207
|
+
const tool = server.tools.get("refund_sale");
|
|
208
|
+
const result = await tool.handler({ id: "sale_abc123", confirm: false });
|
|
209
|
+
assert.ok(result.isError, "should be an error when confirm=false");
|
|
210
|
+
assert.ok(result.content[0].text.includes("confirm=true"), "error message should mention confirm=true requirement");
|
|
211
|
+
});
|
|
212
|
+
test("confirm=true proceeds and returns refund data", async () => {
|
|
213
|
+
const server = await makeServer(makeSuccessClient);
|
|
214
|
+
const tool = server.tools.get("refund_sale");
|
|
215
|
+
const result = await tool.handler({
|
|
216
|
+
id: "sale_abc123",
|
|
217
|
+
confirm: true,
|
|
218
|
+
reason: "requested_by_customer",
|
|
219
|
+
});
|
|
220
|
+
assert.ok(!result.isError, "should succeed with confirm=true");
|
|
221
|
+
const sc = result.structuredContent;
|
|
222
|
+
assert.equal(sc["saleId"], "sale_abc123");
|
|
223
|
+
assert.equal(sc["status"], "succeeded");
|
|
224
|
+
assert.equal(sc["amountCents"], 4200);
|
|
225
|
+
});
|
|
226
|
+
test("partial refund with amountCents", async () => {
|
|
227
|
+
const server = await makeServer(makeSuccessClient);
|
|
228
|
+
const tool = server.tools.get("refund_sale");
|
|
229
|
+
const result = await tool.handler({
|
|
230
|
+
id: "sale_abc123",
|
|
231
|
+
confirm: true,
|
|
232
|
+
amountCents: 1200,
|
|
233
|
+
reason: "duplicate",
|
|
234
|
+
});
|
|
235
|
+
assert.ok(!result.isError, "partial refund should succeed");
|
|
236
|
+
});
|
|
237
|
+
test("404 on refund propagates as isError=true", async () => {
|
|
238
|
+
const server = await makeServer(make404Client);
|
|
239
|
+
const tool = server.tools.get("refund_sale");
|
|
240
|
+
const result = await tool.handler({ id: "sale_gone", confirm: true });
|
|
241
|
+
assert.ok(result.isError, "should be an error on 404");
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
//# sourceMappingURL=pos-tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pos-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/pos-tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Recurring Invoice MCP tools — Wave Mature 3 (8 tools: 2 original + 6 new).
|
|
3
|
+
*
|
|
4
|
+
* Uses Node.js built-in test runner (node:test + node:assert).
|
|
5
|
+
* Run: npm test (after build)
|
|
6
|
+
*
|
|
7
|
+
* Coverage:
|
|
8
|
+
* 1. Tool registration — all 8 recurring tools registered
|
|
9
|
+
* 2. list_recurring_invoices — success path + structuredContent shape
|
|
10
|
+
* 3. list_recurring_invoices — status filter accepted
|
|
11
|
+
* 4. get_recurring_invoice — success path
|
|
12
|
+
* 5. create_recurring_invoice — success path
|
|
13
|
+
* 6. update_recurring_invoice — success path + partial update
|
|
14
|
+
* 7. pause_recurring_invoice — success path
|
|
15
|
+
* 8. resume_recurring_invoice — success path
|
|
16
|
+
* 9. delete_recurring_invoice — confirm=false gate
|
|
17
|
+
* 10. delete_recurring_invoice — confirm=true success path
|
|
18
|
+
* 11. run_recurring_now — success path (default draftOnly=true)
|
|
19
|
+
* 12. run_recurring_now — draftOnly=false passes through
|
|
20
|
+
* 13. API error — 404 propagated as isError=true
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=recurring-tools.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurring-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/recurring-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|