@frihet/mcp-server 1.14.4 → 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.
- package/README.md +6 -28
- package/dist/__tests__/fiscal-tools.test.js +56 -0
- package/dist/__tests__/fiscal-tools.test.js.map +1 -1
- package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts +27 -0
- package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts.map +1 -0
- package/dist/__tests__/get-envelope-unwrap-regression.test.js +223 -0
- package/dist/__tests__/get-envelope-unwrap-regression.test.js.map +1 -0
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts +30 -0
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts.map +1 -0
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js +164 -0
- package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js.map +1 -0
- package/dist/__tests__/openai-grouped-compose.test.js +5 -0
- package/dist/__tests__/openai-grouped-compose.test.js.map +1 -1
- package/dist/__tests__/openai-profile.test.js +3 -0
- package/dist/__tests__/openai-profile.test.js.map +1 -1
- package/dist/__tests__/schema-envelope-guard.test.d.ts +18 -0
- package/dist/__tests__/schema-envelope-guard.test.d.ts.map +1 -0
- package/dist/__tests__/schema-envelope-guard.test.js +56 -0
- package/dist/__tests__/schema-envelope-guard.test.js.map +1 -0
- package/dist/client.d.ts +17 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +112 -94
- package/dist/client.js.map +1 -1
- package/dist/openai-profile.d.ts +2 -2
- package/dist/openai-profile.d.ts.map +1 -1
- package/dist/openai-profile.js +15 -5
- package/dist/openai-profile.js.map +1 -1
- package/dist/redaction.d.ts +2 -1
- package/dist/redaction.d.ts.map +1 -1
- package/dist/redaction.js +5 -1
- package/dist/redaction.js.map +1 -1
- package/dist/resources/register-all.d.ts +3 -0
- package/dist/resources/register-all.d.ts.map +1 -1
- package/dist/resources/register-all.js +3 -0
- package/dist/resources/register-all.js.map +1 -1
- package/dist/tool-exposure.d.ts +6 -6
- package/dist/tool-exposure.js +7 -7
- package/dist/tools/clients.js +1 -1
- package/dist/tools/clients.js.map +1 -1
- package/dist/tools/deposits.js +1 -1
- package/dist/tools/deposits.js.map +1 -1
- package/dist/tools/expenses.js +1 -1
- package/dist/tools/expenses.js.map +1 -1
- package/dist/tools/fiscal.d.ts.map +1 -1
- package/dist/tools/fiscal.js +50 -3
- package/dist/tools/fiscal.js.map +1 -1
- package/dist/tools/invoices.d.ts.map +1 -1
- package/dist/tools/invoices.js +77 -6
- package/dist/tools/invoices.js.map +1 -1
- package/dist/tools/products.js +1 -1
- package/dist/tools/products.js.map +1 -1
- package/dist/tools/quotes.d.ts.map +1 -1
- package/dist/tools/quotes.js +49 -1
- package/dist/tools/quotes.js.map +1 -1
- package/dist/tools/register-all.d.ts +2 -2
- package/dist/tools/register-all.js +3 -3
- package/dist/tools/shared.d.ts +66 -11
- package/dist/tools/shared.d.ts.map +1 -1
- package/dist/tools/shared.js +84 -10
- package/dist/tools/shared.js.map +1 -1
- package/dist/tools/stay.js +2 -2
- package/dist/tools/stay.js.map +1 -1
- package/dist/tools/vendors.js +1 -1
- package/dist/tools/vendors.js.map +1 -1
- package/package.json +4 -3
- 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.
|
|
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
|
|
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.
|
|
762
|
-
- **Single company** -- one API key maps to one Frihet workspace.
|
|
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"}
|