@frihet/mcp-server 1.6.0 → 1.7.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
  <a href="https://smithery.ai/server/frihet/frihet-mcp"><img src="https://smithery.ai/badge/frihet/frihet-mcp" alt="Smithery installs"></a>
18
18
  <a href="https://registry.modelcontextprotocol.io/?q=io.frihet"><img src="https://img.shields.io/badge/MCP_Registry-io.frihet%2Ferp-4A90D9?style=flat&logo=anthropic&logoColor=white" alt="MCP Registry"></a>
19
19
  <a href="https://github.com/Frihet-io/frihet-mcp/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-18181b?style=flat&labelColor=09090b" alt="license"></a>
20
- <img src="https://img.shields.io/badge/tools-55-18181b?style=flat&labelColor=09090b" alt="55 tools">
20
+ <img src="https://img.shields.io/badge/tools-66-18181b?style=flat&labelColor=09090b" alt="66 tools">
21
21
  <img src="https://img.shields.io/badge/node-%3E%3D18-18181b?style=flat&labelColor=09090b" alt="node >=18">
22
22
  <a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-18181b?style=flat&labelColor=09090b" alt="TypeScript"></a>
23
23
  </p>
@@ -33,7 +33,7 @@ You: "Create an invoice for TechStart SL, 40 hours of consulting at 75 EUR/h
33
33
  Claude: Done. Invoice INV-2026-089 created. Total: 3,000.00 EUR + 21% IVA = 3,630.00 EUR.
34
34
  ```
35
35
 
36
- 55 tools. 8 resources. 7 prompts. Structured output on every tool. Zero boilerplate.
36
+ 66 tools. 8 resources. 7 prompts. Structured output on every tool. Zero boilerplate.
37
37
 
38
38
  ---
39
39
 
@@ -161,7 +161,7 @@ Talk to your ERP. These are real prompts, not marketing copy.
161
161
 
162
162
  ## What to expect
163
163
 
164
- This MCP is a **structured data interface** -- you describe what you want in natural language, and the AI creates, queries, or modifies business records in Frihet. All 55 tools are CRUD operations over the REST API.
164
+ This MCP is a **structured data interface** -- you describe what you want in natural language, and the AI creates, queries, or modifies business records in Frihet. All 66 tools are CRUD operations over the REST API.
165
165
 
166
166
  **Works great:**
167
167
 
@@ -188,7 +188,7 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
188
188
 
189
189
  ---
190
190
 
191
- ## Tools (55)
191
+ ## Tools (66)
192
192
 
193
193
  ### Invoices (6)
194
194
 
@@ -283,7 +283,18 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
283
283
  | `get_quarterly_taxes` | Quarterly tax prep: Modelo 303/130 fields, collected vs deductible, liability |
284
284
  | `duplicate_invoice` | Clone an invoice for recurring billing (copies items/client/tax, starts as draft) |
285
285
 
286
- All 55 tools return **structured output** via `outputSchema` -- typed JSON, not raw text. List tools return paginated results (`{ data, total, limit, offset }`).
286
+ ## E-Invoicing (4 new in v1.7 pre-release)
287
+
288
+ > **Status: beta — CF endpoints rolling out 2026-04-21 to 2026-04-28.** 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.
289
+
290
+ | Tool | What it does |
291
+ |------|-------------|
292
+ | `send_einvoice` | Dispatch an invoice in 11 formats (XRechnung, Factur-X, FatturaPA, PEPPOL, Facturae, UBL, CII) via email / Chorus Pro / SDI / PEPPOL / download |
293
+ | `get_einvoice_status` | Poll Hatchet workflow run status until succeeded/failed — returns ackId, XML URL, PDF/A-3 URL |
294
+ | `validate_einvoice_xml` | Validate raw XML against format schema + schematron rules (KOSIT / Mustang / XSD / Schematron) |
295
+ | `export_datev` | Export accounting data as DATEV EXTF (Buchungsstapel / Debitoren / Kreditoren) in CP1252 encoding |
296
+
297
+ All 66 tools return **structured output** via `outputSchema` -- typed JSON, not raw text. List tools return paginated results (`{ data, total, limit, offset }`).
287
298
 
288
299
  ---
289
300
 
@@ -462,7 +473,7 @@ npm run build # must pass before submitting
462
473
 
463
474
  | Package | What it is |
464
475
  |---------|-----------|
465
- | [`@frihet/mcp-server`](https://www.npmjs.com/package/@frihet/mcp-server) | This MCP server (55 tools, 8 resources, 7 prompts) |
476
+ | [`@frihet/mcp-server`](https://www.npmjs.com/package/@frihet/mcp-server) | This MCP server (66 tools, 8 resources, 7 prompts) |
466
477
  | [`@frihet/sdk`](https://github.com/Frihet-io/frihet-sdk) | TypeScript SDK (`frihet.invoices.create()`) |
467
478
  | [`frihet`](https://www.npmjs.com/package/frihet) | CLI (`frihet invoices list --status overdue`) |
468
479
  | [`n8n-nodes-frihet`](https://www.npmjs.com/package/n8n-nodes-frihet) | n8n community node for workflow automation |
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Integration tests for e-invoice MCP tools against live api.frihet.io.
3
+ *
4
+ * Skipped by default. Runs only when MCP_LIVE_TEST=true.
5
+ *
6
+ * Usage:
7
+ * MCP_LIVE_TEST=true FRIHET_API_KEY=fri_your_key npm test
8
+ *
9
+ * Manual QA path:
10
+ * 1. Set env vars above.
11
+ * 2. Run: npm run build && MCP_LIVE_TEST=true FRIHET_API_KEY=fri_xxx node --test dist/__tests__/einvoice-integration.test.js
12
+ * 3. Verify: each tool returns real data (no _stub flag) OR 404-fallback stub if CF endpoint is pending.
13
+ * 4. For send_einvoice: poll get_einvoice_status with the returned workflowRunId every 5s.
14
+ * 5. For validate_einvoice_xml: pass a minimal valid XRechnung CII document.
15
+ * 6. For export_datev: check the fileUrl is a signed URL valid for 24h.
16
+ *
17
+ * CF endpoint rollout schedule:
18
+ * - /v1/einvoice/send → 2026-04-21
19
+ * - /v1/einvoice/status/:id → 2026-04-21
20
+ * - /v1/einvoice/validate → 2026-04-24
21
+ * - /v1/einvoice/export-datev → 2026-04-28
22
+ */
23
+ export {};
24
+ //# sourceMappingURL=einvoice-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"einvoice-integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/einvoice-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Integration tests for e-invoice MCP tools against live api.frihet.io.
3
+ *
4
+ * Skipped by default. Runs only when MCP_LIVE_TEST=true.
5
+ *
6
+ * Usage:
7
+ * MCP_LIVE_TEST=true FRIHET_API_KEY=fri_your_key npm test
8
+ *
9
+ * Manual QA path:
10
+ * 1. Set env vars above.
11
+ * 2. Run: npm run build && MCP_LIVE_TEST=true FRIHET_API_KEY=fri_xxx node --test dist/__tests__/einvoice-integration.test.js
12
+ * 3. Verify: each tool returns real data (no _stub flag) OR 404-fallback stub if CF endpoint is pending.
13
+ * 4. For send_einvoice: poll get_einvoice_status with the returned workflowRunId every 5s.
14
+ * 5. For validate_einvoice_xml: pass a minimal valid XRechnung CII document.
15
+ * 6. For export_datev: check the fileUrl is a signed URL valid for 24h.
16
+ *
17
+ * CF endpoint rollout schedule:
18
+ * - /v1/einvoice/send → 2026-04-21
19
+ * - /v1/einvoice/status/:id → 2026-04-21
20
+ * - /v1/einvoice/validate → 2026-04-24
21
+ * - /v1/einvoice/export-datev → 2026-04-28
22
+ */
23
+ import { test, describe, before } from "node:test";
24
+ import assert from "node:assert/strict";
25
+ const LIVE = process.env["MCP_LIVE_TEST"] === "true";
26
+ const API_KEY = process.env["FRIHET_API_KEY"] ?? "";
27
+ const skip = (name, fn) => {
28
+ if (!LIVE) {
29
+ test(`[SKIPPED — set MCP_LIVE_TEST=true] ${name}`, () => {
30
+ // intentionally skipped
31
+ });
32
+ return;
33
+ }
34
+ test(name, fn);
35
+ };
36
+ class StubMcpServer {
37
+ tools = new Map();
38
+ registerTool(name, config, handler) {
39
+ this.tools.set(name, { name, config, handler });
40
+ }
41
+ }
42
+ // ── Setup ────────────────────────────────────────────────────────────────────
43
+ describe("E-Invoice Integration Tests — live api.frihet.io", () => {
44
+ let tools;
45
+ before(async () => {
46
+ if (!LIVE)
47
+ return;
48
+ if (!API_KEY)
49
+ throw new Error("FRIHET_API_KEY env var required for live tests");
50
+ const { FrihetClient } = await import("../client.js");
51
+ const { registerEInvoiceTools } = await import("../tools/einvoice.js");
52
+ const client = new FrihetClient(API_KEY);
53
+ const server = new StubMcpServer();
54
+ registerEInvoiceTools(server, client);
55
+ tools = server.tools;
56
+ });
57
+ // ── send_einvoice ──
58
+ skip("send_einvoice — dispatches invoice or returns 404-fallback stub", async () => {
59
+ const tool = tools.get("send_einvoice");
60
+ // Use a known test invoice ID from your Frihet sandbox
61
+ const result = await tool.handler({
62
+ invoiceId: process.env["TEST_INVOICE_ID"] ?? "inv_test_integration",
63
+ format: "xrechnung-cii",
64
+ dispatchMode: "download",
65
+ });
66
+ const sc = result.structuredContent;
67
+ if (sc["_stub"]) {
68
+ // CF endpoint not yet deployed — fallback is correct
69
+ assert.equal(sc["_note"], "CF endpoint pending deploy");
70
+ assert.ok(typeof sc["_plannedEndpoint"] === "string");
71
+ console.log("send_einvoice: 404-fallback stub (CF not yet deployed)");
72
+ }
73
+ else {
74
+ // Live response
75
+ assert.ok(typeof sc["workflowRunId"] === "string", "workflowRunId should be string");
76
+ assert.equal(sc["status"], "queued");
77
+ assert.ok(typeof sc["estimatedCompletionSec"] === "number");
78
+ console.log(`send_einvoice: queued workflowRunId=${sc["workflowRunId"]}`);
79
+ }
80
+ });
81
+ // ── get_einvoice_status ──
82
+ skip("get_einvoice_status — polls status or returns 404-fallback stub", async () => {
83
+ const tool = tools.get("get_einvoice_status");
84
+ const result = await tool.handler({
85
+ workflowRunId: process.env["TEST_WORKFLOW_RUN_ID"] ?? "wfr_test_integration",
86
+ });
87
+ const sc = result.structuredContent;
88
+ if (sc["_stub"]) {
89
+ assert.equal(sc["_note"], "CF endpoint pending deploy");
90
+ console.log("get_einvoice_status: 404-fallback stub (CF not yet deployed)");
91
+ }
92
+ else {
93
+ const validStatuses = ["queued", "running", "succeeded", "failed", "cancelled"];
94
+ assert.ok(validStatuses.includes(sc["status"]), `unexpected status: ${sc["status"]}`);
95
+ console.log(`get_einvoice_status: status=${sc["status"]} step=${sc["step"]}`);
96
+ }
97
+ });
98
+ // ── validate_einvoice_xml ──
99
+ skip("validate_einvoice_xml — validates XML or returns 404-fallback stub", async () => {
100
+ const tool = tools.get("validate_einvoice_xml");
101
+ // Minimal XRechnung CII document (intentionally invalid to test error reporting)
102
+ const minimalXml = `<?xml version="1.0" encoding="UTF-8"?>
103
+ <rsm:CrossIndustryInvoice xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100">
104
+ <rsm:ExchangedDocumentContext/>
105
+ <rsm:ExchangedDocument/>
106
+ <rsm:SupplyChainTradeTransaction/>
107
+ </rsm:CrossIndustryInvoice>`;
108
+ const result = await tool.handler({ xml: minimalXml, format: "xrechnung-cii" });
109
+ const sc = result.structuredContent;
110
+ if (sc["_stub"]) {
111
+ assert.equal(sc["_note"], "CF endpoint pending deploy");
112
+ console.log("validate_einvoice_xml: 404-fallback stub (CF not yet deployed)");
113
+ }
114
+ else {
115
+ assert.ok(typeof sc["valid"] === "boolean");
116
+ assert.ok(Array.isArray(sc["errors"]));
117
+ assert.ok(typeof sc["durationMs"] === "number");
118
+ console.log(`validate_einvoice_xml: valid=${sc["valid"]} errors=${sc["errors"].length} durationMs=${sc["durationMs"]}`);
119
+ }
120
+ });
121
+ // ── export_datev ──
122
+ skip("export_datev — exports DATEV EXTF or returns 404-fallback stub", async () => {
123
+ const tool = tools.get("export_datev");
124
+ const result = await tool.handler({
125
+ periodStart: "2026-01-01",
126
+ periodEnd: "2026-01-31",
127
+ format: "extf-buchungsstapel",
128
+ });
129
+ const sc = result.structuredContent;
130
+ if (sc["_stub"]) {
131
+ assert.equal(sc["_note"], "CF endpoint pending deploy");
132
+ console.log("export_datev: 404-fallback stub (CF not yet deployed)");
133
+ }
134
+ else {
135
+ assert.ok(typeof sc["fileUrl"] === "string" && sc["fileUrl"].startsWith("https://"));
136
+ assert.equal(sc["encoding"], "cp1252");
137
+ assert.ok(typeof sc["rowCount"] === "number");
138
+ console.log(`export_datev: filename=${sc["filename"]} rowCount=${sc["rowCount"]} fileUrl=${sc["fileUrl"]}`);
139
+ }
140
+ });
141
+ });
142
+ //# sourceMappingURL=einvoice-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"einvoice-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/einvoice-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tests for e-invoice MCP tools — wired to api.frihet.io with 404-fallback stubs.
3
+ *
4
+ * Uses Node.js built-in test runner (node:test + node:assert) — no extra deps.
5
+ * Run: node --experimental-strip-types --test src/__tests__/einvoice-tools.test.ts
6
+ * Or via: npm test (after build: node --test dist/__tests__/einvoice-tools.test.js)
7
+ *
8
+ * Coverage:
9
+ * 1. Tool registration — all 4 tools registered on McpServer (62→66)
10
+ * 2. 404-fallback path — when CF endpoint returns 404, stub fallback fires
11
+ * 3. Success path — when CF endpoint returns real data, it is passed through
12
+ * 4. Stub response shape — matches declared outputSchema (via fallback)
13
+ * 5. Langfuse wrapper confirmed invoked via traceMCPTool patch
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=einvoice-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"einvoice-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/einvoice-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}