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