@frihet/mcp-server 1.14.5 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +6 -28
  2. package/dist/__tests__/fiscal-tools.test.js +56 -0
  3. package/dist/__tests__/fiscal-tools.test.js.map +1 -1
  4. package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts +27 -0
  5. package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts.map +1 -0
  6. package/dist/__tests__/get-envelope-unwrap-regression.test.js +223 -0
  7. package/dist/__tests__/get-envelope-unwrap-regression.test.js.map +1 -0
  8. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts +30 -0
  9. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts.map +1 -0
  10. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js +164 -0
  11. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js.map +1 -0
  12. package/dist/__tests__/openai-grouped-compose.test.js +5 -0
  13. package/dist/__tests__/openai-grouped-compose.test.js.map +1 -1
  14. package/dist/__tests__/openai-profile.test.js +3 -0
  15. package/dist/__tests__/openai-profile.test.js.map +1 -1
  16. package/dist/__tests__/schema-envelope-guard.test.d.ts +18 -0
  17. package/dist/__tests__/schema-envelope-guard.test.d.ts.map +1 -0
  18. package/dist/__tests__/schema-envelope-guard.test.js +56 -0
  19. package/dist/__tests__/schema-envelope-guard.test.js.map +1 -0
  20. package/dist/client.d.ts +17 -7
  21. package/dist/client.d.ts.map +1 -1
  22. package/dist/client.js +112 -94
  23. package/dist/client.js.map +1 -1
  24. package/dist/openai-profile.d.ts +2 -2
  25. package/dist/openai-profile.d.ts.map +1 -1
  26. package/dist/openai-profile.js +15 -5
  27. package/dist/openai-profile.js.map +1 -1
  28. package/dist/redaction.d.ts +2 -1
  29. package/dist/redaction.d.ts.map +1 -1
  30. package/dist/redaction.js +5 -1
  31. package/dist/redaction.js.map +1 -1
  32. package/dist/resources/register-all.d.ts +3 -0
  33. package/dist/resources/register-all.d.ts.map +1 -1
  34. package/dist/resources/register-all.js +3 -0
  35. package/dist/resources/register-all.js.map +1 -1
  36. package/dist/tool-exposure.d.ts +6 -6
  37. package/dist/tool-exposure.js +7 -7
  38. package/dist/tools/clients.js +1 -1
  39. package/dist/tools/clients.js.map +1 -1
  40. package/dist/tools/deposits.js +1 -1
  41. package/dist/tools/deposits.js.map +1 -1
  42. package/dist/tools/expenses.js +1 -1
  43. package/dist/tools/expenses.js.map +1 -1
  44. package/dist/tools/fiscal.d.ts.map +1 -1
  45. package/dist/tools/fiscal.js +50 -3
  46. package/dist/tools/fiscal.js.map +1 -1
  47. package/dist/tools/invoices.js +4 -4
  48. package/dist/tools/invoices.js.map +1 -1
  49. package/dist/tools/products.js +1 -1
  50. package/dist/tools/products.js.map +1 -1
  51. package/dist/tools/quotes.js +1 -1
  52. package/dist/tools/quotes.js.map +1 -1
  53. package/dist/tools/register-all.d.ts +2 -2
  54. package/dist/tools/register-all.js +3 -3
  55. package/dist/tools/shared.d.ts +66 -11
  56. package/dist/tools/shared.d.ts.map +1 -1
  57. package/dist/tools/shared.js +84 -10
  58. package/dist/tools/shared.js.map +1 -1
  59. package/dist/tools/stay.js +2 -2
  60. package/dist/tools/stay.js.map +1 -1
  61. package/dist/tools/vendors.js +1 -1
  62. package/dist/tools/vendors.js.map +1 -1
  63. package/package.json +4 -3
  64. package/scripts/no-public-leak.sh +45 -0
package/README.md CHANGED
@@ -39,13 +39,13 @@
39
39
  | **ChatGPT Apps** | Coming soon | [chatgpt.com](https://chatgpt.com) |
40
40
  | **Anthropic Claude Directory** | Coming soon | [claude.ai/settings/connectors](https://claude.ai/settings/connectors) |
41
41
 
42
- > **Tool count:** npm `latest` (1.14.5) ships all 157 tools, same as the remote endpoint (`mcp.frihet.io`).
42
+ > **Tool count:** npm `latest` (1.15.0) ships all 157 tools, same as the remote endpoint (`mcp.frihet.io`).
43
43
 
44
44
  ---
45
45
 
46
46
  ## What is this
47
47
 
48
- An MCP server that connects your AI assistant to [Frihet](https://frihet.io). Create invoices by talking. Query expenses in natural language. Manage your entire business from your IDE.
48
+ An MCP server that connects your AI assistant to [Frihet](https://frihet.io/?utm_source=github_readme&utm_medium=mcp_readme&utm_campaign=mcp_landgrab). Create invoices by talking. Query expenses in natural language. Manage your entire business from your IDE.
49
49
 
50
50
  ```
51
51
  You: "Create an invoice for TechStart SL, 40 hours of consulting at 75 EUR/hour, due March 1st"
@@ -314,8 +314,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
314
314
 
315
315
  ### E-Invoicing (10)
316
316
 
317
- > **Status: beta.** Tools call `api.frihet.io/v1/einvoice/*` directly. If an endpoint is not yet deployed (404), the tool falls back to `{ _stub: true, _note: "CF endpoint pending deploy", _plannedEndpoint: "..." }` so the server remains usable while transport ships.
318
-
319
317
  | Tool | What it does |
320
318
  |------|-------------|
321
319
  | `send_einvoice` | Dispatch an invoice in 11 formats (XRechnung, Factur-X, FatturaPA, PEPPOL, Facturae, UBL, CII) via email / Chorus Pro / SDI / PEPPOL / download |
@@ -327,12 +325,10 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
327
325
  | `face_status` | Poll submission status from FACe for a submitted invoice |
328
326
  | `ticketbai_submit` | Submit TicketBAI fiscal record to Basque Country tax authority (Hacienda) |
329
327
  | `ticketbai_status` | Poll TicketBAI submission status from the Basque tax authority |
330
- | `ksef_submit` | Submit invoice to KSeF (Poland national e-invoicing system — stub) |
328
+ | `ksef_submit` | Submit invoice to KSeF (Poland national e-invoicing system) |
331
329
 
332
330
  ### Time Tracking (6)
333
331
 
334
- > **Status: stub** — `/v1/time/*` endpoints planned. Tools surface 404 until backend ships.
335
-
336
332
  | Tool | What it does |
337
333
  |------|-------------|
338
334
  | `list_time_entries` | List time entries with filter by user, project, date range, billable status |
@@ -344,8 +340,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
344
340
 
345
341
  ### Recurring Invoices (8)
346
342
 
347
- > **Status: stub** — `/v1/recurring/*` endpoints planned. Tools surface 404 until backend ships.
348
-
349
343
  | Tool | What it does |
350
344
  |------|-------------|
351
345
  | `list_recurring_invoices` | List all recurring invoice templates (filter by active/paused) |
@@ -359,8 +353,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
359
353
 
360
354
  ### Team Management (4)
361
355
 
362
- > **Status: stub** — `/v1/team/*` endpoints planned. Tools surface 404 until backend ships.
363
-
364
356
  | Tool | What it does |
365
357
  |------|-------------|
366
358
  | `list_team_members` | List all workspace members with role and invite status |
@@ -370,8 +362,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
370
362
 
371
363
  ### Gestoria — Accountants (5)
372
364
 
373
- > **Status: stub** — `/v1/gestoria/*` REST surface lands with Wave Fase 1 closure (PRs #383 bulk send, #384 aging, #385 messaging). Tools surface 404 until the backend ships.
374
-
375
365
  | Tool | What it does |
376
366
  |------|-------------|
377
367
  | `gestoria_message_send` | Send a message in a contextual thread (documentRequest / filingItem / obligation) |
@@ -382,8 +372,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
382
372
 
383
373
  ### Audit GL (3)
384
374
 
385
- > **Status: stub** — `/v1/gl/*` proxies callables `approveGLEntry`, `rejectGLEntry`, `getGLEntryAuditLog` (PR #395). Tools surface 404 until backend ships.
386
-
387
375
  | Tool | What it does |
388
376
  |------|-------------|
389
377
  | `frihet_gl_entry_approve` | Approve a GL journal entry (gestor/admin only — TRUST AREA) |
@@ -392,8 +380,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
392
380
 
393
381
  ### White-label Portal Domain (3)
394
382
 
395
- > **Status: stub** — `/v1/portal/domain/*` proxies callables `addCustomPortalDomain`, `verifyCustomPortalDomain`, `removeCustomPortalDomain` (PR #397).
396
-
397
383
  | Tool | What it does |
398
384
  |------|-------------|
399
385
  | `frihet_portal_domain_add` | Add a custom domain to the client portal (returns DNS CNAME records) |
@@ -402,8 +388,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
402
388
 
403
389
  ### Self-onboard & VIES (2)
404
390
 
405
- > **Status: stub** — `/v1/portal/onboard/*` proxies callables `generatePortalOnboardLink`, `lookupTaxIdViaVIES` (PR #398). Public portal flows excluded from MCP.
406
-
407
391
  | Tool | What it does |
408
392
  |------|-------------|
409
393
  | `frihet_portal_onboard_link_generate` | Generate a time-limited self-onboard link for a prospective client |
@@ -411,8 +395,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
411
395
 
412
396
  ### IGIC — Canary Islands Indirect Tax (4)
413
397
 
414
- > **Status: stub** — `/v1/igic/*` service-layer reads (PR #390). ATC SOAP excluded (internal infra).
415
-
416
398
  | Tool | What it does |
417
399
  |------|-------------|
418
400
  | `frihet_modelo_415_summary` | M415 annual operations >€3,005 (Canarias equivalent of M347) |
@@ -422,8 +404,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
422
404
 
423
405
  ### Impuesto sobre Sociedades — Corporate Tax (2)
424
406
 
425
- > **Status: stub** — `/v1/is/*` service-layer reads for Spanish SLs/SAs (PR #392).
426
-
427
407
  | Tool | What it does |
428
408
  |------|-------------|
429
409
  | `frihet_modelo_200_summary` | Modelo 200 annual IS return (taxable base, deductions, net payable) |
@@ -431,8 +411,6 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
431
411
 
432
412
  ### Bank Categorization Rules (2)
433
413
 
434
- > **Status: stub** — `/v1/banking/rules` Q3-flagged (PR #394). Webhook handlers excluded.
435
-
436
414
  | Tool | What it does |
437
415
  |------|-------------|
438
416
  | `frihet_bank_rules_list` | List all bank auto-categorization rules (conditions + actions + status) |
@@ -758,8 +736,8 @@ npm run build # must pass before submitting
758
736
 
759
737
  ## Current limitations
760
738
 
761
- - **No OCR or file upload** -- the MCP works with structured data, not images or PDFs. Planned for a future release.
762
- - **Single company** -- one API key maps to one Frihet workspace. Multi-company support is not yet available.
739
+ - **No OCR or file upload** -- the MCP works with structured data, not images or PDFs.
740
+ - **Single company** -- one API key maps to one Frihet workspace.
763
741
  - **Frihet account required** -- you need an active account at [app.frihet.io](https://app.frihet.io) and an API key (starts with `fri_`).
764
742
 
765
743
  ---
@@ -794,4 +772,4 @@ npm run build # must pass before submitting
794
772
 
795
773
  MIT. See [LICENSE](./LICENSE).
796
774
 
797
- Built by [Frihet](https://frihet.io).
775
+ Built by [Frihet](https://frihet.io/?utm_source=github_readme&utm_medium=mcp_readme&utm_campaign=mcp_landgrab).
@@ -188,6 +188,62 @@ describe("verifactu_status — success path", () => {
188
188
  assert.equal(result.structuredContent["aeatResponse"], "0000");
189
189
  });
190
190
  });
191
+ // ── verifactu_status — app-level 404 semantics ───────────────────────────────
192
+ // The live endpoint (publicApi GET /fiscal/verifactu/:id/status) IS deployed and
193
+ // uses 404 for two app-level states. Neither may surface as the guard's
194
+ // "backend unavailable" (which tells the user the feature is not enabled — the
195
+ // exact misleading message a fresh invoice produced in the golden flow).
196
+ describe("verifactu_status — 404 'no submission yet' is a normal state, not an error", () => {
197
+ function makeNoSubmissionClient() {
198
+ const noSub = () => {
199
+ const msg = "No VeriFactu submission found for this invoice. Submit first via the VeriFactu submission flow.";
200
+ return Promise.reject(Object.assign(new Error(msg), { statusCode: 404, errorCode: msg }));
201
+ };
202
+ return { getVerifactuStatus: noSub };
203
+ }
204
+ test("maps to status=not_submitted success result (no isError, no backend_unavailable)", async () => {
205
+ const server = await makeServer(makeNoSubmissionClient);
206
+ const tool = server.tools.get("verifactu_status");
207
+ const result = await tool.handler({ invoiceId: "inv_fresh" });
208
+ assert.ok(!result.isError);
209
+ const sc = result.structuredContent;
210
+ assert.equal(sc["invoiceId"], "inv_fresh");
211
+ assert.equal(sc["status"], "not_submitted");
212
+ assert.equal(sc["accepted"], false);
213
+ assert.equal(sc["_backendUnavailable"], undefined);
214
+ // Copy must state it is a normal state — never "feature not enabled".
215
+ assert.ok(result.content[0].text.includes("NOT an error"));
216
+ assert.ok(!result.content[0].text.includes("not available yet"));
217
+ });
218
+ });
219
+ describe("verifactu_status — 404 'invoice not found' is a real error, not backend_unavailable", () => {
220
+ function makeInvoiceNotFoundClient() {
221
+ const nf = () => {
222
+ const msg = "Invoice 'inv_missing' not found";
223
+ return Promise.reject(Object.assign(new Error(msg), { statusCode: 404, errorCode: msg }));
224
+ };
225
+ return { getVerifactuStatus: nf };
226
+ }
227
+ test("returns isError with invoice_not_found (guides to internal id)", async () => {
228
+ const server = await makeServer(makeInvoiceNotFoundClient);
229
+ const tool = server.tools.get("verifactu_status");
230
+ const result = await tool.handler({ invoiceId: "inv_missing" });
231
+ assert.ok(result.isError);
232
+ const sc = result.structuredContent;
233
+ assert.equal(sc["error"], "invoice_not_found");
234
+ assert.equal(sc["_backendUnavailable"], undefined);
235
+ assert.ok(result.content[0].text.includes("internal invoice id"));
236
+ });
237
+ });
238
+ describe("verifactu_status — generic 404 still falls through to the backend guard", () => {
239
+ test("plain 'Not Found' body keeps backend_unavailable behavior", async () => {
240
+ const server = await makeServer(make404Client);
241
+ const tool = server.tools.get("verifactu_status");
242
+ const result = await tool.handler({ invoiceId: "inv_abc123" });
243
+ assert.ok(result.isError);
244
+ assert.equal(result.structuredContent["error"], "backend_unavailable");
245
+ });
246
+ });
191
247
  // ── verifactu_resubmit ───────────────────────────────────────────────────────
192
248
  describe("verifactu_resubmit — trust area gate", () => {
193
249
  test("confirm=false returns isError=true", async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"fiscal-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/fiscal-tools.test.ts"],"names":[],"mappings":"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"}
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,27 @@
1
+ /**
2
+ * Regression test for the "Output validation error" bug on every single-object
3
+ * get_* tool (get_invoice, get_expense, get_client, ... ) — root cause fix.
4
+ *
5
+ * BUG: single-object read methods in client.ts (getInvoice, getExpense, etc.)
6
+ * called `this.request(...)` (RAW) instead of `this.requestUnwrapped(...)`.
7
+ * The live Frihet ERP REST API wraps every single-object response in a
8
+ * `{ data: <item>, meta: {...} }` envelope (the same convention documented for
9
+ * the already-fixed `getFiscalModeloSummary`). Because the raw envelope was
10
+ * returned straight into the tool's `structuredContent`, and every get_* tool's
11
+ * `outputSchema` expects the FLAT item (not `{data, meta}`), every single-object
12
+ * get_* tool failed MCP output validation ("Output validation error") the
13
+ * moment a real backend response came back.
14
+ *
15
+ * Unlike `contract.test.ts` (which only proves the *schema* accepts an
16
+ * already-unwrapped fixture, via a hand-rolled `unwrap()` mirror function),
17
+ * THIS file boots a real `node:http` mock backend and points a REAL
18
+ * `FrihetClient` at it — the same pattern as `banking-client-contract.test.ts`.
19
+ * It exercises the actual `request()` → `requestUnwrapped()` wiring, so it
20
+ * would have caught the bug: before the fix, every assertion below that checks
21
+ * `"data" in result` / `"meta" in result` would have failed (the envelope keys
22
+ * would have leaked straight into the tool's structuredContent).
23
+ *
24
+ * Run: npm test (after build)
25
+ */
26
+ export {};
27
+ //# sourceMappingURL=get-envelope-unwrap-regression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-envelope-unwrap-regression.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/get-envelope-unwrap-regression.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Regression test for the "Output validation error" bug on every single-object
3
+ * get_* tool (get_invoice, get_expense, get_client, ... ) — root cause fix.
4
+ *
5
+ * BUG: single-object read methods in client.ts (getInvoice, getExpense, etc.)
6
+ * called `this.request(...)` (RAW) instead of `this.requestUnwrapped(...)`.
7
+ * The live Frihet ERP REST API wraps every single-object response in a
8
+ * `{ data: <item>, meta: {...} }` envelope (the same convention documented for
9
+ * the already-fixed `getFiscalModeloSummary`). Because the raw envelope was
10
+ * returned straight into the tool's `structuredContent`, and every get_* tool's
11
+ * `outputSchema` expects the FLAT item (not `{data, meta}`), every single-object
12
+ * get_* tool failed MCP output validation ("Output validation error") the
13
+ * moment a real backend response came back.
14
+ *
15
+ * Unlike `contract.test.ts` (which only proves the *schema* accepts an
16
+ * already-unwrapped fixture, via a hand-rolled `unwrap()` mirror function),
17
+ * THIS file boots a real `node:http` mock backend and points a REAL
18
+ * `FrihetClient` at it — the same pattern as `banking-client-contract.test.ts`.
19
+ * It exercises the actual `request()` → `requestUnwrapped()` wiring, so it
20
+ * would have caught the bug: before the fix, every assertion below that checks
21
+ * `"data" in result` / `"meta" in result` would have failed (the envelope keys
22
+ * would have leaked straight into the tool's structuredContent).
23
+ *
24
+ * Run: npm test (after build)
25
+ */
26
+ import { test, describe, before, after } from "node:test";
27
+ import assert from "node:assert/strict";
28
+ import { createServer } from "node:http";
29
+ import { FrihetClient } from "../client.js";
30
+ import { invoiceItemOutput, expenseItemOutput, clientItemOutput, productItemOutput, quoteItemOutput, vendorItemOutput, webhookItemOutput, depositItemOutput, reservationItemOutput, posSaleItemOutput, kitchenTicketItemOutput, bankAccountItemOutput, timeEntryItemOutput, timeSummaryOutput, recurringInvoiceItemOutput, pdfResultOutput, } from "../tools/shared.js";
31
+ import { eInvoiceStatusOutput } from "../tools/einvoice.js";
32
+ // ── Mock ERP backend: every single-object GET wraps the item in { data, meta } ──
33
+ let server;
34
+ let baseUrl;
35
+ /** Wrap an item exactly like the live CF does for single-object reads. */
36
+ function envelope(item, meta = { source: "test" }) {
37
+ return { data: item, meta };
38
+ }
39
+ const FIXTURES = {
40
+ invoice: { id: "inv_1", clientName: "Acme Corp", items: [{ description: "Consulting", quantity: 1, unitPrice: 100 }], total: 121, status: "sent" },
41
+ expense: { id: "exp_1", description: "AWS", amount: 42.5, category: "software" },
42
+ client: { id: "cli_1", name: "Acme Corp", email: "billing@acme.example" },
43
+ product: { id: "prod_1", name: "Widget", unitPrice: 19.99 },
44
+ quote: { id: "quo_1", clientName: "Acme Corp", items: [{ description: "Design", quantity: 1, unitPrice: 500 }] },
45
+ vendor: { id: "vend_1", name: "AWS Inc" },
46
+ webhook: { id: "wh_1", url: "https://example.com/hook", events: ["invoice.paid"] },
47
+ deposit: { id: "dep_1", clientId: "cli_1", amount: 300 },
48
+ reservation: { id: "res_1", propertyId: "prop_1", status: "confirmed", checkIn: "2026-08-01", checkOut: "2026-08-05", guestCount: 2 },
49
+ sale: { id: "sale_1", terminalId: "term_1", status: "succeeded", amountCents: 1500 },
50
+ kitchenTicket: { id: "kt_1", stationId: "station_1", status: "queued" },
51
+ bankAccount: { id: "acct_1", alias: "Main", ibanLast4: "4321" },
52
+ timeEntry: { id: "te_1", userId: "u_1", hours: 3.5 },
53
+ recurringInvoice: { id: "rec_1", templateName: "Monthly retainer", frequency: "monthly", status: "active" },
54
+ invoicePdf: { id: "inv_1", url: "https://cdn.example.com/inv_1.pdf", contentType: "application/pdf" },
55
+ timeSummary: { from: "2026-06-01", to: "2026-06-30", totalHours: 40, billableHours: 32, nonBillableHours: 8 },
56
+ einvoiceStatus: { status: "succeeded", step: "delivered", ackId: "ack_123" },
57
+ };
58
+ before(async () => {
59
+ server = createServer(async (req, res) => {
60
+ const url = new URL(req.url ?? "/", "http://localhost");
61
+ res.setHeader("Content-Type", "application/json");
62
+ const send = (body) => res.end(JSON.stringify(body));
63
+ if (url.pathname === "/invoices" && req.method === "GET") {
64
+ // List path — must stay as the RAW paginated envelope (requestPaginated).
65
+ return send({ data: [FIXTURES.invoice], total: 1, limit: 20, offset: 0 });
66
+ }
67
+ if (url.pathname === "/invoices/inv_1" && req.method === "GET")
68
+ return send(envelope(FIXTURES.invoice));
69
+ if (url.pathname === "/invoices/inv_1/pdf" && req.method === "GET")
70
+ return send(envelope(FIXTURES.invoicePdf));
71
+ if (url.pathname === "/invoices/inv_1/xml" && req.method === "GET") {
72
+ return send(envelope({ xml: "<Invoice/>", filename: "inv_1.xml", format: "ubl" }));
73
+ }
74
+ if (url.pathname === "/invoices/plain-xml/xml" && req.method === "GET") {
75
+ // `data` present but NOT an object (a bare string) — must NOT be unwrapped.
76
+ return send({ data: "<Invoice/>", meta: {} });
77
+ }
78
+ if (url.pathname === "/expenses/exp_1" && req.method === "GET")
79
+ return send(envelope(FIXTURES.expense));
80
+ if (url.pathname === "/clients/cli_1" && req.method === "GET")
81
+ return send(envelope(FIXTURES.client));
82
+ if (url.pathname === "/products/prod_1" && req.method === "GET")
83
+ return send(envelope(FIXTURES.product));
84
+ if (url.pathname === "/quotes/quo_1" && req.method === "GET")
85
+ return send(envelope(FIXTURES.quote));
86
+ if (url.pathname === "/vendors/vend_1" && req.method === "GET")
87
+ return send(envelope(FIXTURES.vendor));
88
+ if (url.pathname === "/webhooks/wh_1" && req.method === "GET")
89
+ return send(envelope(FIXTURES.webhook));
90
+ if (url.pathname === "/deposits/dep_1" && req.method === "GET")
91
+ return send(envelope(FIXTURES.deposit));
92
+ if (url.pathname === "/stay/reservations/res_1" && req.method === "GET")
93
+ return send(envelope(FIXTURES.reservation));
94
+ if (url.pathname === "/pos/sales/sale_1" && req.method === "GET")
95
+ return send(envelope(FIXTURES.sale));
96
+ if (url.pathname === "/kitchen/tickets/kt_1" && req.method === "GET")
97
+ return send(envelope(FIXTURES.kitchenTicket));
98
+ if (url.pathname === "/banking/accounts/acct_1" && req.method === "GET")
99
+ return send(envelope(FIXTURES.bankAccount));
100
+ if (url.pathname === "/time/entries/te_1" && req.method === "GET")
101
+ return send(envelope(FIXTURES.timeEntry));
102
+ if (url.pathname === "/time/summary" && req.method === "GET")
103
+ return send(envelope(FIXTURES.timeSummary));
104
+ if (url.pathname === "/recurring/invoices/rec_1" && req.method === "GET")
105
+ return send(envelope(FIXTURES.recurringInvoice));
106
+ if (url.pathname === "/einvoice/status/wf_1" && req.method === "GET")
107
+ return send(envelope(FIXTURES.einvoiceStatus));
108
+ res.statusCode = 404;
109
+ return send({ error: "not_found" });
110
+ });
111
+ await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
112
+ const { port } = server.address();
113
+ baseUrl = `http://127.0.0.1:${port}`;
114
+ });
115
+ after(async () => {
116
+ await new Promise((resolve) => server.close(() => resolve()));
117
+ });
118
+ function makeClient() {
119
+ return new FrihetClient("fri_test_key", baseUrl);
120
+ }
121
+ /** Every fixed getter must (a) unwrap the envelope AND (b) validate against
122
+ * the exact outputSchema the tool declares — the two facts together are what
123
+ * "Output validation error" required to be true before the fix was applied. */
124
+ function assertUnwrappedAndValid(result, schema) {
125
+ assert.equal(typeof result, "object");
126
+ assert.ok(result !== null);
127
+ assert.equal("data" in result, false, "envelope 'data' key must NOT leak into the tool result");
128
+ assert.equal("meta" in result, false, "envelope 'meta' key must NOT leak into the tool result");
129
+ const parsed = schema.safeParse(result);
130
+ assert.equal(parsed.success, true, parsed.success ? "" : JSON.stringify(parsed.error, null, 2));
131
+ }
132
+ describe("client.ts single-object get_* reads unwrap the { data, meta } envelope", () => {
133
+ test("getInvoice unwraps + validates against invoiceItemOutput", async () => {
134
+ const result = await makeClient().getInvoice("inv_1");
135
+ assertUnwrappedAndValid(result, invoiceItemOutput);
136
+ assert.equal(result.id, "inv_1");
137
+ });
138
+ test("getExpense unwraps + validates against expenseItemOutput", async () => {
139
+ const result = await makeClient().getExpense("exp_1");
140
+ assertUnwrappedAndValid(result, expenseItemOutput);
141
+ });
142
+ test("getClient unwraps + validates against clientItemOutput", async () => {
143
+ const result = await makeClient().getClient("cli_1");
144
+ assertUnwrappedAndValid(result, clientItemOutput);
145
+ });
146
+ test("getProduct unwraps + validates against productItemOutput", async () => {
147
+ const result = await makeClient().getProduct("prod_1");
148
+ assertUnwrappedAndValid(result, productItemOutput);
149
+ });
150
+ test("getQuote unwraps + validates against quoteItemOutput", async () => {
151
+ const result = await makeClient().getQuote("quo_1");
152
+ assertUnwrappedAndValid(result, quoteItemOutput);
153
+ });
154
+ test("getVendor unwraps + validates against vendorItemOutput", async () => {
155
+ const result = await makeClient().getVendor("vend_1");
156
+ assertUnwrappedAndValid(result, vendorItemOutput);
157
+ });
158
+ test("getWebhook unwraps + validates against webhookItemOutput", async () => {
159
+ const result = await makeClient().getWebhook("wh_1");
160
+ assertUnwrappedAndValid(result, webhookItemOutput);
161
+ });
162
+ test("getDeposit unwraps + validates against depositItemOutput", async () => {
163
+ const result = await makeClient().getDeposit("dep_1");
164
+ assertUnwrappedAndValid(result, depositItemOutput);
165
+ });
166
+ test("getReservation unwraps + validates against reservationItemOutput", async () => {
167
+ const result = await makeClient().getReservation("res_1");
168
+ assertUnwrappedAndValid(result, reservationItemOutput);
169
+ });
170
+ test("getSale unwraps + validates against posSaleItemOutput", async () => {
171
+ const result = await makeClient().getSale("sale_1");
172
+ assertUnwrappedAndValid(result, posSaleItemOutput);
173
+ });
174
+ test("getKitchenTicket unwraps + validates against kitchenTicketItemOutput", async () => {
175
+ const result = await makeClient().getKitchenTicket("kt_1");
176
+ assertUnwrappedAndValid(result, kitchenTicketItemOutput);
177
+ });
178
+ test("getBankAccount unwraps + validates against bankAccountItemOutput", async () => {
179
+ const result = await makeClient().getBankAccount("acct_1");
180
+ assertUnwrappedAndValid(result, bankAccountItemOutput);
181
+ });
182
+ test("getTimeEntry unwraps + validates against timeEntryItemOutput", async () => {
183
+ const result = await makeClient().getTimeEntry("te_1");
184
+ assertUnwrappedAndValid(result, timeEntryItemOutput);
185
+ });
186
+ test("getTimeSummary unwraps + validates against timeSummaryOutput", async () => {
187
+ const result = await makeClient().getTimeSummary({ from: "2026-06-01", to: "2026-06-30" });
188
+ assertUnwrappedAndValid(result, timeSummaryOutput);
189
+ });
190
+ test("getRecurringInvoice unwraps + validates against recurringInvoiceItemOutput", async () => {
191
+ const result = await makeClient().getRecurringInvoice("rec_1");
192
+ assertUnwrappedAndValid(result, recurringInvoiceItemOutput);
193
+ });
194
+ test("getInvoicePdf unwraps + validates against pdfResultOutput", async () => {
195
+ const result = await makeClient().getInvoicePdf("inv_1");
196
+ assertUnwrappedAndValid(result, pdfResultOutput);
197
+ });
198
+ test("getEInvoiceStatus unwraps + validates against eInvoiceStatusOutput", async () => {
199
+ const result = await makeClient().getEInvoiceStatus("wf_1");
200
+ assertUnwrappedAndValid(result, eInvoiceStatusOutput);
201
+ });
202
+ test("getInvoiceEInvoice unwraps the object-data envelope", async () => {
203
+ const result = (await makeClient().getInvoiceEInvoice("inv_1"));
204
+ assert.equal("data" in result, false);
205
+ assert.equal("meta" in result, false);
206
+ assert.equal(result.xml, "<Invoice/>");
207
+ assert.equal(result.filename, "inv_1.xml");
208
+ });
209
+ test("getInvoiceEInvoice does NOT false-unwrap a non-object 'data' value", async () => {
210
+ // Guards the adversarial-review concern: requestUnwrapped only unwraps when
211
+ // `data` is itself a non-array OBJECT. A bare-string `data` (not an envelope,
212
+ // just a coincidentally-named field) must pass through untouched.
213
+ const result = await makeClient().getInvoiceEInvoice("plain-xml");
214
+ assert.deepEqual(result, { data: "<Invoice/>", meta: {} });
215
+ });
216
+ test("listInvoices is unaffected — keeps the raw { data: [...], total, ... } envelope", async () => {
217
+ const result = await makeClient().listInvoices();
218
+ assert.ok(Array.isArray(result.data), "list reads must keep data as an array");
219
+ assert.equal(result.total, 1);
220
+ assert.equal(result.data[0].id, "inv_1");
221
+ });
222
+ });
223
+ //# sourceMappingURL=get-envelope-unwrap-regression.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-envelope-unwrap-regression.test.js","sourceRoot":"","sources":["../../src/__tests__/get-envelope-unwrap-regression.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Regression tests for the "invoices INOPERABLE via MCP" bug set (LANE B1).
3
+ *
4
+ * Two independent bugs made every WRITE path fail MCP output validation while
5
+ * reads (fixed in #64) worked:
6
+ *
7
+ * BUG-1 (envelope leak on mutations): create/update/action client methods
8
+ * called `this.request(...)` (RAW) instead of `this.requestUnwrapped(...)`.
9
+ * The live Frihet `/v1` API wraps EVERY mutation in `{ data, meta }`
10
+ * (publicApi.ts: 201/PUT/PATCH → `{ data: <resource>, meta }`; action POSTs
11
+ * → `actionResponse = { data: actionResult, meta }`). The raw envelope went
12
+ * straight into `structuredContent`, so `id`/`clientName`/`items`/`success`
13
+ * all read as `undefined` and the tool's outputSchema rejected the call.
14
+ *
15
+ * BUG-2 (output schemas too strict): list/search item schemas required fields
16
+ * that `fields=` projections and drafts legitimately omit (`GET
17
+ * /invoices?fields=id,total` → `{ id }`-shaped rows), and `actionResultOutput`
18
+ * required `success`+`id` that action endpoints never return in full.
19
+ *
20
+ * Part A boots a `node:http` mock backend that mimics the LIVE mutation envelope
21
+ * and drives a REAL `FrihetClient` (same pattern as
22
+ * get-envelope-unwrap-regression.test.ts) — it would fail before the BUG-1 fix.
23
+ * Part B pins the relaxed schemas against the real projected/draft/action shapes
24
+ * — it would fail before the BUG-2 fix. The final guard asserts the schemas are
25
+ * still strict enough to REJECT a raw envelope, so removing the unwrap regresses.
26
+ *
27
+ * Run: npm test (after build)
28
+ */
29
+ export {};
30
+ //# sourceMappingURL=mutation-unwrap-and-schema-regression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-unwrap-and-schema-regression.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mutation-unwrap-and-schema-regression.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}