@frihet/mcp-server 1.16.2 → 1.16.4

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 (203) hide show
  1. package/README.md +1 -1
  2. package/dist/openai-profile.js +1 -1
  3. package/package.json +7 -4
  4. package/scripts/postinstall.js +30 -8
  5. package/dist/__tests__/audit-server-version.test.d.ts +0 -13
  6. package/dist/__tests__/audit-server-version.test.d.ts.map +0 -1
  7. package/dist/__tests__/audit-server-version.test.js +0 -96
  8. package/dist/__tests__/audit-server-version.test.js.map +0 -1
  9. package/dist/__tests__/banking-client-contract.test.d.ts +0 -20
  10. package/dist/__tests__/banking-client-contract.test.d.ts.map +0 -1
  11. package/dist/__tests__/banking-client-contract.test.js +0 -133
  12. package/dist/__tests__/banking-client-contract.test.js.map +0 -1
  13. package/dist/__tests__/banking-tools.test.d.ts +0 -18
  14. package/dist/__tests__/banking-tools.test.d.ts.map +0 -1
  15. package/dist/__tests__/banking-tools.test.js +0 -252
  16. package/dist/__tests__/banking-tools.test.js.map +0 -1
  17. package/dist/__tests__/contract.test.d.ts +0 -33
  18. package/dist/__tests__/contract.test.d.ts.map +0 -1
  19. package/dist/__tests__/contract.test.js +0 -208
  20. package/dist/__tests__/contract.test.js.map +0 -1
  21. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts +0 -13
  22. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.d.ts.map +0 -1
  23. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js +0 -420
  24. package/dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js.map +0 -1
  25. package/dist/__tests__/demo-mode.test.d.ts +0 -11
  26. package/dist/__tests__/demo-mode.test.d.ts.map +0 -1
  27. package/dist/__tests__/demo-mode.test.js +0 -119
  28. package/dist/__tests__/demo-mode.test.js.map +0 -1
  29. package/dist/__tests__/einvoice-day4-tools.test.d.ts +0 -16
  30. package/dist/__tests__/einvoice-day4-tools.test.d.ts.map +0 -1
  31. package/dist/__tests__/einvoice-day4-tools.test.js +0 -421
  32. package/dist/__tests__/einvoice-day4-tools.test.js.map +0 -1
  33. package/dist/__tests__/einvoice-integration.test.d.ts +0 -24
  34. package/dist/__tests__/einvoice-integration.test.d.ts.map +0 -1
  35. package/dist/__tests__/einvoice-integration.test.js +0 -142
  36. package/dist/__tests__/einvoice-integration.test.js.map +0 -1
  37. package/dist/__tests__/einvoice-tools.test.d.ts +0 -16
  38. package/dist/__tests__/einvoice-tools.test.d.ts.map +0 -1
  39. package/dist/__tests__/einvoice-tools.test.js +0 -411
  40. package/dist/__tests__/einvoice-tools.test.js.map +0 -1
  41. package/dist/__tests__/fiscal-tools.test.d.ts +0 -21
  42. package/dist/__tests__/fiscal-tools.test.d.ts.map +0 -1
  43. package/dist/__tests__/fiscal-tools.test.js +0 -271
  44. package/dist/__tests__/fiscal-tools.test.js.map +0 -1
  45. package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts +0 -27
  46. package/dist/__tests__/get-envelope-unwrap-regression.test.d.ts.map +0 -1
  47. package/dist/__tests__/get-envelope-unwrap-regression.test.js +0 -223
  48. package/dist/__tests__/get-envelope-unwrap-regression.test.js.map +0 -1
  49. package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts +0 -14
  50. package/dist/__tests__/intelligence-duplicate-invoice.test.d.ts.map +0 -1
  51. package/dist/__tests__/intelligence-duplicate-invoice.test.js +0 -108
  52. package/dist/__tests__/intelligence-duplicate-invoice.test.js.map +0 -1
  53. package/dist/__tests__/kitchen-tools.test.d.ts +0 -18
  54. package/dist/__tests__/kitchen-tools.test.d.ts.map +0 -1
  55. package/dist/__tests__/kitchen-tools.test.js +0 -399
  56. package/dist/__tests__/kitchen-tools.test.js.map +0 -1
  57. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts +0 -30
  58. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.d.ts.map +0 -1
  59. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js +0 -164
  60. package/dist/__tests__/mutation-unwrap-and-schema-regression.test.js.map +0 -1
  61. package/dist/__tests__/observability-redaction.test.d.ts +0 -13
  62. package/dist/__tests__/observability-redaction.test.d.ts.map +0 -1
  63. package/dist/__tests__/observability-redaction.test.js +0 -94
  64. package/dist/__tests__/observability-redaction.test.js.map +0 -1
  65. package/dist/__tests__/openai-grouped-compose.test.d.ts +0 -26
  66. package/dist/__tests__/openai-grouped-compose.test.d.ts.map +0 -1
  67. package/dist/__tests__/openai-grouped-compose.test.js +0 -245
  68. package/dist/__tests__/openai-grouped-compose.test.js.map +0 -1
  69. package/dist/__tests__/openai-profile.test.d.ts +0 -10
  70. package/dist/__tests__/openai-profile.test.d.ts.map +0 -1
  71. package/dist/__tests__/openai-profile.test.js +0 -168
  72. package/dist/__tests__/openai-profile.test.js.map +0 -1
  73. package/dist/__tests__/pagination-cursor-param.test.d.ts +0 -27
  74. package/dist/__tests__/pagination-cursor-param.test.d.ts.map +0 -1
  75. package/dist/__tests__/pagination-cursor-param.test.js +0 -96
  76. package/dist/__tests__/pagination-cursor-param.test.js.map +0 -1
  77. package/dist/__tests__/pos-tools.test.d.ts +0 -16
  78. package/dist/__tests__/pos-tools.test.d.ts.map +0 -1
  79. package/dist/__tests__/pos-tools.test.js +0 -244
  80. package/dist/__tests__/pos-tools.test.js.map +0 -1
  81. package/dist/__tests__/recurring-tools.test.d.ts +0 -23
  82. package/dist/__tests__/recurring-tools.test.d.ts.map +0 -1
  83. package/dist/__tests__/recurring-tools.test.js +0 -352
  84. package/dist/__tests__/recurring-tools.test.js.map +0 -1
  85. package/dist/__tests__/schema-envelope-guard.test.d.ts +0 -18
  86. package/dist/__tests__/schema-envelope-guard.test.d.ts.map +0 -1
  87. package/dist/__tests__/schema-envelope-guard.test.js +0 -56
  88. package/dist/__tests__/schema-envelope-guard.test.js.map +0 -1
  89. package/dist/__tests__/stay-tools.test.d.ts +0 -17
  90. package/dist/__tests__/stay-tools.test.d.ts.map +0 -1
  91. package/dist/__tests__/stay-tools.test.js +0 -259
  92. package/dist/__tests__/stay-tools.test.js.map +0 -1
  93. package/dist/__tests__/team-tools.test.d.ts +0 -18
  94. package/dist/__tests__/team-tools.test.d.ts.map +0 -1
  95. package/dist/__tests__/team-tools.test.js +0 -228
  96. package/dist/__tests__/team-tools.test.js.map +0 -1
  97. package/dist/__tests__/time-tools.test.d.ts +0 -19
  98. package/dist/__tests__/time-tools.test.d.ts.map +0 -1
  99. package/dist/__tests__/time-tools.test.js +0 -286
  100. package/dist/__tests__/time-tools.test.js.map +0 -1
  101. package/dist/__tests__/tool-exposure.test.d.ts +0 -11
  102. package/dist/__tests__/tool-exposure.test.d.ts.map +0 -1
  103. package/dist/__tests__/tool-exposure.test.js +0 -264
  104. package/dist/__tests__/tool-exposure.test.js.map +0 -1
  105. package/dist/client-interface.d.ts.map +0 -1
  106. package/dist/client-interface.js.map +0 -1
  107. package/dist/client.d.ts.map +0 -1
  108. package/dist/client.js.map +0 -1
  109. package/dist/demo-client.d.ts.map +0 -1
  110. package/dist/demo-client.js.map +0 -1
  111. package/dist/demo-fixtures.d.ts.map +0 -1
  112. package/dist/demo-fixtures.js.map +0 -1
  113. package/dist/index.d.ts.map +0 -1
  114. package/dist/index.js.map +0 -1
  115. package/dist/logger.d.ts.map +0 -1
  116. package/dist/logger.js.map +0 -1
  117. package/dist/metrics.d.ts.map +0 -1
  118. package/dist/metrics.js.map +0 -1
  119. package/dist/observability.d.ts.map +0 -1
  120. package/dist/observability.js.map +0 -1
  121. package/dist/openai-profile.d.ts.map +0 -1
  122. package/dist/openai-profile.js.map +0 -1
  123. package/dist/prompts/register-all.d.ts.map +0 -1
  124. package/dist/prompts/register-all.js.map +0 -1
  125. package/dist/redaction.d.ts.map +0 -1
  126. package/dist/redaction.js.map +0 -1
  127. package/dist/resources/register-all.d.ts.map +0 -1
  128. package/dist/resources/register-all.js.map +0 -1
  129. package/dist/tool-exposure.d.ts.map +0 -1
  130. package/dist/tool-exposure.js.map +0 -1
  131. package/dist/tools/accountingClose.d.ts.map +0 -1
  132. package/dist/tools/accountingClose.js.map +0 -1
  133. package/dist/tools/audit_gl.d.ts.map +0 -1
  134. package/dist/tools/audit_gl.js.map +0 -1
  135. package/dist/tools/backend-availability.d.ts.map +0 -1
  136. package/dist/tools/backend-availability.js.map +0 -1
  137. package/dist/tools/bank_rules.d.ts.map +0 -1
  138. package/dist/tools/bank_rules.js.map +0 -1
  139. package/dist/tools/banking.d.ts.map +0 -1
  140. package/dist/tools/banking.js.map +0 -1
  141. package/dist/tools/clients.d.ts.map +0 -1
  142. package/dist/tools/clients.js.map +0 -1
  143. package/dist/tools/crm.d.ts.map +0 -1
  144. package/dist/tools/crm.js.map +0 -1
  145. package/dist/tools/deposits.d.ts.map +0 -1
  146. package/dist/tools/deposits.js.map +0 -1
  147. package/dist/tools/einvoice.d.ts.map +0 -1
  148. package/dist/tools/einvoice.js.map +0 -1
  149. package/dist/tools/expenses.d.ts.map +0 -1
  150. package/dist/tools/expenses.js.map +0 -1
  151. package/dist/tools/fiscal.d.ts.map +0 -1
  152. package/dist/tools/fiscal.js.map +0 -1
  153. package/dist/tools/gestoria.d.ts.map +0 -1
  154. package/dist/tools/gestoria.js.map +0 -1
  155. package/dist/tools/hr.d.ts.map +0 -1
  156. package/dist/tools/hr.js.map +0 -1
  157. package/dist/tools/igic.d.ts.map +0 -1
  158. package/dist/tools/igic.js.map +0 -1
  159. package/dist/tools/impuesto_sociedades.d.ts.map +0 -1
  160. package/dist/tools/impuesto_sociedades.js.map +0 -1
  161. package/dist/tools/intelligence.d.ts.map +0 -1
  162. package/dist/tools/intelligence.js.map +0 -1
  163. package/dist/tools/invoices.d.ts.map +0 -1
  164. package/dist/tools/invoices.js.map +0 -1
  165. package/dist/tools/kitchen.d.ts.map +0 -1
  166. package/dist/tools/kitchen.js.map +0 -1
  167. package/dist/tools/onboard_vies.d.ts.map +0 -1
  168. package/dist/tools/onboard_vies.js.map +0 -1
  169. package/dist/tools/onboarding.d.ts.map +0 -1
  170. package/dist/tools/onboarding.js.map +0 -1
  171. package/dist/tools/payroll.d.ts.map +0 -1
  172. package/dist/tools/payroll.js.map +0 -1
  173. package/dist/tools/permissions.d.ts.map +0 -1
  174. package/dist/tools/permissions.js.map +0 -1
  175. package/dist/tools/portal_domain.d.ts.map +0 -1
  176. package/dist/tools/portal_domain.js.map +0 -1
  177. package/dist/tools/pos.d.ts.map +0 -1
  178. package/dist/tools/pos.js.map +0 -1
  179. package/dist/tools/products.d.ts.map +0 -1
  180. package/dist/tools/products.js.map +0 -1
  181. package/dist/tools/quotes.d.ts.map +0 -1
  182. package/dist/tools/quotes.js.map +0 -1
  183. package/dist/tools/recurring.d.ts.map +0 -1
  184. package/dist/tools/recurring.js.map +0 -1
  185. package/dist/tools/register-all.d.ts.map +0 -1
  186. package/dist/tools/register-all.js.map +0 -1
  187. package/dist/tools/shared.d.ts.map +0 -1
  188. package/dist/tools/shared.js.map +0 -1
  189. package/dist/tools/stay.d.ts.map +0 -1
  190. package/dist/tools/stay.js.map +0 -1
  191. package/dist/tools/team.d.ts.map +0 -1
  192. package/dist/tools/team.js.map +0 -1
  193. package/dist/tools/time.d.ts.map +0 -1
  194. package/dist/tools/time.js.map +0 -1
  195. package/dist/tools/vendors.d.ts.map +0 -1
  196. package/dist/tools/vendors.js.map +0 -1
  197. package/dist/tools/webhooks.d.ts.map +0 -1
  198. package/dist/tools/webhooks.js.map +0 -1
  199. package/dist/types.d.ts.map +0 -1
  200. package/dist/types.js.map +0 -1
  201. package/scripts/audit-mcp-refs.mjs +0 -402
  202. package/scripts/no-public-leak.sh +0 -60
  203. package/scripts/test-openai-grouped-compose.mjs +0 -173
package/README.md CHANGED
@@ -47,7 +47,7 @@
47
47
  | **ChatGPT Apps** | Coming soon | [chatgpt.com](https://chatgpt.com) |
48
48
  | **Anthropic Claude Directory** | Coming soon | [claude.ai/settings/connectors](https://claude.ai/settings/connectors) |
49
49
 
50
- > **Tool count:** npm `latest` (1.16.2) ships all 157 tools, same as the remote endpoint (`mcp.frihet.io`).
50
+ > **Tool count:** npm `latest` (1.16.4) ships all 157 tools, same as the remote endpoint (`mcp.frihet.io`).
51
51
 
52
52
  ---
53
53
 
@@ -267,7 +267,7 @@ const EXCLUDE_RESOURCES = new Set([
267
267
  export const OPENAI_CSP = "default-src 'self'; " +
268
268
  "script-src 'self' 'unsafe-inline' https://www.gstatic.com https://apis.google.com; " +
269
269
  "style-src 'self' 'unsafe-inline'; " +
270
- "connect-src 'self' https://api.frihet.io https://us-central1-gen-lang-client-0335716041.cloudfunctions.net " +
270
+ "connect-src 'self' https://api.frihet.io https://europe-west1-gen-lang-client-0335716041.cloudfunctions.net " +
271
271
  "https://identitytoolkit.googleapis.com https://securetoken.googleapis.com https://www.googleapis.com https://www.gstatic.com; " +
272
272
  "frame-src https://accounts.google.com https://github.com https://login.microsoftonline.com; " +
273
273
  "img-src 'self' data: https:; " +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frihet/mcp-server",
3
- "version": "1.16.2",
3
+ "version": "1.16.4",
4
4
  "description": "AI-native MCP server for Frihet ERP — 157 tools: invoicing, expenses, CRM, banking, POS + ES/EU fiscal compliance (VeriFactu, TicketBAI, Facturae). Zero-install at mcp.frihet.io. Works with Claude, ChatGPT, Cursor, Windsurf, Cline & any MCP client.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,10 +12,11 @@
12
12
  "test": "npm run build && node --test dist/__tests__/openai-profile.test.js dist/__tests__/tool-exposure.test.js dist/__tests__/einvoice-tools.test.js dist/__tests__/einvoice-day4-tools.test.js dist/__tests__/stay-tools.test.js dist/__tests__/pos-tools.test.js dist/__tests__/kitchen-tools.test.js dist/__tests__/banking-tools.test.js dist/__tests__/banking-client-contract.test.js dist/__tests__/pagination-cursor-param.test.js dist/__tests__/fiscal-tools.test.js dist/__tests__/time-tools.test.js dist/__tests__/recurring-tools.test.js dist/__tests__/team-tools.test.js dist/__tests__/d4b-hr-payroll-onboarding-tools.test.js dist/__tests__/audit-server-version.test.js dist/__tests__/openai-grouped-compose.test.js dist/__tests__/contract.test.js dist/__tests__/observability-redaction.test.js dist/__tests__/intelligence-duplicate-invoice.test.js dist/__tests__/get-envelope-unwrap-regression.test.js dist/__tests__/mutation-unwrap-and-schema-regression.test.js dist/__tests__/schema-envelope-guard.test.js dist/__tests__/demo-mode.test.js",
13
13
  "start": "node dist/index.js",
14
14
  "postinstall": "node scripts/postinstall.js || true",
15
- "prepublishOnly": "npm run build && npm run audit:mcp-refs -- --repo frihet-mcp",
15
+ "prepublishOnly": "npm run build && npm run audit:mcp-refs -- --repo frihet-mcp && npm run gate:no-legacy-region",
16
16
  "audit:mcp-refs": "node scripts/audit-mcp-refs.mjs",
17
17
  "audit:mcp-refs:fix": "node scripts/audit-mcp-refs.mjs --fix",
18
- "gate:no-leak": "bash scripts/no-public-leak.sh"
18
+ "gate:no-leak": "bash scripts/no-public-leak.sh",
19
+ "gate:no-legacy-region": "bash scripts/no-legacy-region.sh"
19
20
  },
20
21
  "keywords": [
21
22
  "accounting",
@@ -76,7 +77,9 @@
76
77
  },
77
78
  "files": [
78
79
  "dist",
79
- "scripts",
80
+ "!dist/__tests__",
81
+ "!dist/**/*.map",
82
+ "scripts/postinstall.js",
80
83
  "assets/banner.svg",
81
84
  "assets/banner-light.svg",
82
85
  "assets/logo-400.png",
@@ -2,13 +2,35 @@
2
2
  // Only show on interactive install, not CI
3
3
  if (process.env.CI || process.env.FRIHET_QUIET) process.exit(0);
4
4
 
5
+ // Version is read from package.json at runtime — never hardcode it here.
6
+ // A hardcoded literal drifts behind the published version (the shipped 1.16.3
7
+ // banner still said "v1.5.2"); the audit:mcp-refs gate also scans this file to
8
+ // block any re-introduced literal.
9
+ import { readFileSync } from 'node:fs';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { dirname, join } from 'node:path';
12
+
13
+ let version = '';
14
+ try {
15
+ const pkgPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
16
+ version = 'v' + JSON.parse(readFileSync(pkgPath, 'utf8')).version;
17
+ } catch {
18
+ version = '';
19
+ }
20
+
21
+ const WIDTH = 62;
22
+ const pad = (s) => s + ' '.repeat(Math.max(0, WIDTH - s.length));
23
+ const lines = [
24
+ pad(` @frihet/mcp-server ${version} installed`),
25
+ pad(''),
26
+ pad(' Docs: https://docs.frihet.io/desarrolladores/mcp-server'),
27
+ pad(' GitHub: https://github.com/Frihet-io/frihet-mcp'),
28
+ pad(''),
29
+ pad(' Star us if you find it useful!'),
30
+ ];
31
+ const border = '═'.repeat(WIDTH);
5
32
  console.log(`
6
- ╔══════════════════════════════════════════════════════╗
7
- ║ @frihet/mcp-server v1.5.2 installed ║
8
- ║ ║
9
- ║ Docs: https://docs.frihet.io/mcp ║
10
- ║ GitHub: https://github.com/Frihet-io/frihet-mcp ║
11
- ║ ║
12
- ║ Star us if you find it useful! ║
13
- ╚══════════════════════════════════════════════════════╝
33
+ ╔${border}╗
34
+ ${lines.map((l) => ` ║${l}║`).join('\n')}
35
+ ╚${border}╝
14
36
  `);
@@ -1,13 +0,0 @@
1
- /**
2
- * Tests for the server.json version gate in scripts/audit-mcp-refs.mjs.
3
- *
4
- * Regression guard: server.json carries the package version as BARE JSON values
5
- * (root `.version` and `.packages[0].version`). The audit's generic line-scan
6
- * version check requires an MCP marker on the same line, which never matched
7
- * those bare `"version": "x.y.z"` lines — so a desynced server.json passed the
8
- * publish gate silently and caused a Registry 400 "duplicate version" in
9
- * release 1.13.1. The `checkServerJsonVersion` helper closes that gap; these
10
- * tests prove it FAILS on drift and PASSES when synced.
11
- */
12
- export {};
13
- //# sourceMappingURL=audit-server-version.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-server-version.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/audit-server-version.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -1,96 +0,0 @@
1
- /**
2
- * Tests for the server.json version gate in scripts/audit-mcp-refs.mjs.
3
- *
4
- * Regression guard: server.json carries the package version as BARE JSON values
5
- * (root `.version` and `.packages[0].version`). The audit's generic line-scan
6
- * version check requires an MCP marker on the same line, which never matched
7
- * those bare `"version": "x.y.z"` lines — so a desynced server.json passed the
8
- * publish gate silently and caused a Registry 400 "duplicate version" in
9
- * release 1.13.1. The `checkServerJsonVersion` helper closes that gap; these
10
- * tests prove it FAILS on drift and PASSES when synced.
11
- */
12
- import { describe, test } from "node:test";
13
- import assert from "node:assert/strict";
14
- import { readFileSync, writeFileSync, mkdtempSync, rmSync } from "node:fs";
15
- import { tmpdir } from "node:os";
16
- import { join, resolve } from "node:path";
17
- import { fileURLToPath, pathToFileURL } from "node:url";
18
- // dist/__tests__/ → repo root is ../../ ; scripts + server.json live at root.
19
- const HERE = resolve(fileURLToPath(import.meta.url), "..");
20
- const REPO_ROOT = resolve(HERE, "..", "..");
21
- const SERVER_JSON_PATH = join(REPO_ROOT, "server.json");
22
- const PKG_PATH = join(REPO_ROOT, "package.json");
23
- // Import the pure helper from the audit script. The script is import-safe:
24
- // its CLI body is guarded by an `if (isMain)` check, so importing it does not
25
- // run the audit or call process.exit.
26
- const auditScriptUrl = pathToFileURL(resolve(REPO_ROOT, "scripts", "audit-mcp-refs.mjs")).href;
27
- const auditMod = await import(auditScriptUrl);
28
- const checkServerJsonVersion = auditMod.checkServerJsonVersion;
29
- const SOT_VERSION = JSON.parse(readFileSync(PKG_PATH, "utf8")).version;
30
- describe("server.json version gate", () => {
31
- test("exports a checkServerJsonVersion helper", () => {
32
- assert.equal(typeof checkServerJsonVersion, "function");
33
- });
34
- test("real server.json is in sync with package.json (no drift)", () => {
35
- const serverJson = JSON.parse(readFileSync(SERVER_JSON_PATH, "utf8"));
36
- const drifts = checkServerJsonVersion(serverJson, SOT_VERSION);
37
- assert.deepEqual(drifts, [], `server.json must match SoT ${SOT_VERSION} — drift: ${JSON.stringify(drifts)}`);
38
- });
39
- test("reports STALE when root .version drifts", () => {
40
- const serverJson = JSON.parse(readFileSync(SERVER_JSON_PATH, "utf8"));
41
- serverJson.version = "9.9.9";
42
- const drifts = checkServerJsonVersion(serverJson, SOT_VERSION);
43
- assert.equal(drifts.length, 1, "exactly one drift expected");
44
- assert.equal(drifts[0].jsonPath, ".version");
45
- assert.equal(drifts[0].found, "9.9.9");
46
- assert.equal(drifts[0].expected, SOT_VERSION);
47
- });
48
- test("reports STALE when .packages[0].version drifts", () => {
49
- const serverJson = JSON.parse(readFileSync(SERVER_JSON_PATH, "utf8"));
50
- serverJson.packages[0].version = "0.0.1";
51
- const drifts = checkServerJsonVersion(serverJson, SOT_VERSION);
52
- assert.equal(drifts.length, 1);
53
- assert.equal(drifts[0].jsonPath, ".packages[0].version");
54
- assert.equal(drifts[0].found, "0.0.1");
55
- });
56
- test("reports BOTH fields when both drift", () => {
57
- const serverJson = JSON.parse(readFileSync(SERVER_JSON_PATH, "utf8"));
58
- serverJson.version = "2.0.0";
59
- serverJson.packages[0].version = "2.0.0";
60
- const drifts = checkServerJsonVersion(serverJson, SOT_VERSION);
61
- assert.equal(drifts.length, 2);
62
- assert.deepEqual(drifts.map((d) => d.jsonPath).sort(), [".packages[0].version", ".version"]);
63
- });
64
- test("treats a missing version field as drift (not a silent pass)", () => {
65
- const serverJson = JSON.parse(readFileSync(SERVER_JSON_PATH, "utf8"));
66
- delete serverJson.version;
67
- const drifts = checkServerJsonVersion(serverJson, SOT_VERSION);
68
- assert.equal(drifts.length, 1);
69
- assert.equal(drifts[0].jsonPath, ".version");
70
- assert.equal(drifts[0].found, undefined);
71
- });
72
- // End-to-end proof the gate fires on a real desynced file, written to a temp
73
- // copy so the repo's server.json is never mutated. We reproduce the exact
74
- // helper-driven check the CLI runs, then confirm the synced copy is clean.
75
- test("temp-file round trip: desync fails, sync passes", () => {
76
- const dir = mkdtempSync(join(tmpdir(), "frihet-serverjson-"));
77
- try {
78
- const original = readFileSync(SERVER_JSON_PATH, "utf8");
79
- const tmpFile = join(dir, "server.json");
80
- // Desync the temp copy.
81
- const desynced = JSON.parse(original);
82
- desynced.version = "0.0.0-stale";
83
- writeFileSync(tmpFile, JSON.stringify(desynced, null, 2) + "\n");
84
- const staleDrifts = checkServerJsonVersion(JSON.parse(readFileSync(tmpFile, "utf8")), SOT_VERSION);
85
- assert.ok(staleDrifts.length > 0, "desynced temp file must report STALE");
86
- // Re-sync and confirm clean.
87
- writeFileSync(tmpFile, original);
88
- const cleanDrifts = checkServerJsonVersion(JSON.parse(readFileSync(tmpFile, "utf8")), SOT_VERSION);
89
- assert.deepEqual(cleanDrifts, [], "synced temp file must pass");
90
- }
91
- finally {
92
- rmSync(dir, { recursive: true, force: true });
93
- }
94
- });
95
- });
96
- //# sourceMappingURL=audit-server-version.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit-server-version.test.js","sourceRoot":"","sources":["../../src/__tests__/audit-server-version.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,8EAA8E;AAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AAEjD,2EAA2E;AAC3E,8EAA8E;AAC9E,sCAAsC;AACtC,MAAM,cAAc,GAAG,aAAa,CAClC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,oBAAoB,CAAC,CACpD,CAAC,IAAI,CAAC;AACP,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;AAC9C,MAAM,sBAAsB,GAAG,QAAQ,CAAC,sBAGwC,CAAC;AAEjF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAiB,CAAC;AAEjF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,KAAK,CAAC,OAAO,sBAAsB,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,CAAC,SAAS,CACd,MAAM,EACN,EAAE,EACF,8BAA8B,WAAW,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAC/E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;QACtE,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,4BAA4B,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;QACtE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;QACzC,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;QACtE,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;QAC7B,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;QACzC,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,SAAS,CACd,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EACpC,CAAC,sBAAsB,EAAE,UAAU,CAAC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;QACtE,OAAO,UAAU,CAAC,OAAO,CAAC;QAC1B,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,6EAA6E;IAC7E,0EAA0E;IAC1E,2EAA2E;IAC3E,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;YAEzC,wBAAwB;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,QAAQ,CAAC,OAAO,GAAG,aAAa,CAAC;YACjC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAEjE,MAAM,WAAW,GAAG,sBAAsB,CACxC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EACzC,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,sCAAsC,CAAC,CAAC;YAE1E,6BAA6B;YAC7B,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACjC,MAAM,WAAW,GAAG,sBAAsB,CACxC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EACzC,WAAW,CACZ,CAAC;YACF,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,20 +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
- export {};
20
- //# sourceMappingURL=banking-client-contract.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"banking-client-contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/banking-client-contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
@@ -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"}