@frihet/mcp-server 1.17.0 → 2.0.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 (87) hide show
  1. package/README.md +84 -59
  2. package/dist/agent-onboarding.d.ts +1 -1
  3. package/dist/agent-onboarding.js +3 -3
  4. package/dist/canary/mcp-harness.d.ts +1 -1
  5. package/dist/canary/mcp-harness.js +4 -1
  6. package/dist/capability-truth.js +20 -12
  7. package/dist/claude-candidate-contract.d.ts +482 -0
  8. package/dist/claude-candidate-contract.js +87 -0
  9. package/dist/claude-output-privacy.d.ts +17 -0
  10. package/dist/claude-output-privacy.js +240 -0
  11. package/dist/claude-profile.d.ts +18 -0
  12. package/dist/claude-profile.js +260 -0
  13. package/dist/client-interface.d.ts +26 -20
  14. package/dist/client.d.ts +65 -29
  15. package/dist/client.js +278 -167
  16. package/dist/demo-client.d.ts +27 -21
  17. package/dist/demo-client.js +31 -14
  18. package/dist/deposit-contract.d.ts +29 -0
  19. package/dist/deposit-contract.js +76 -0
  20. package/dist/fetch-no-redirect.d.ts +3 -0
  21. package/dist/fetch-no-redirect.js +16 -0
  22. package/dist/fiscal-aliases.d.ts +2 -2
  23. package/dist/fiscal-aliases.js +2 -2
  24. package/dist/fiscal-period.d.ts +26 -0
  25. package/dist/fiscal-period.js +31 -0
  26. package/dist/google-profile.d.ts +19 -0
  27. package/dist/google-profile.js +122 -0
  28. package/dist/index.js +31 -7
  29. package/dist/logger.d.ts +1 -1
  30. package/dist/logger.js +2 -2
  31. package/dist/muse-profile.d.ts +19 -0
  32. package/dist/muse-profile.js +122 -0
  33. package/dist/observability.js +3 -2
  34. package/dist/openai-profile.d.ts +2 -2
  35. package/dist/openai-profile.js +37 -11
  36. package/dist/openai-review-contract.d.ts +1 -1
  37. package/dist/openai-review-contract.js +4 -5
  38. package/dist/openai-review-oauth.d.ts +107 -7
  39. package/dist/openai-review-oauth.js +161 -17
  40. package/dist/prompts/register-all.js +32 -78
  41. package/dist/redaction.d.ts +5 -0
  42. package/dist/redaction.js +9 -0
  43. package/dist/resources/register-all.js +150 -54
  44. package/dist/retry-after.d.ts +19 -0
  45. package/dist/retry-after.js +84 -0
  46. package/dist/server-composition.d.ts +5 -2
  47. package/dist/server-composition.js +35 -5
  48. package/dist/tool-exposure.d.ts +6 -5
  49. package/dist/tool-exposure.js +15 -13
  50. package/dist/tools/audit_gl.js +8 -8
  51. package/dist/tools/backend-availability.d.ts +8 -29
  52. package/dist/tools/backend-availability.js +31 -30
  53. package/dist/tools/bank_rules.js +66 -15
  54. package/dist/tools/banking.js +5 -13
  55. package/dist/tools/clients.js +252 -6
  56. package/dist/tools/deposits.js +107 -97
  57. package/dist/tools/einvoice.d.ts +17 -3
  58. package/dist/tools/einvoice.js +59 -12
  59. package/dist/tools/fiscal.d.ts +3 -4
  60. package/dist/tools/fiscal.js +93 -60
  61. package/dist/tools/gestoria.js +15 -7
  62. package/dist/tools/hr.js +41 -11
  63. package/dist/tools/igic.d.ts +9 -8
  64. package/dist/tools/igic.js +34 -64
  65. package/dist/tools/impuesto_sociedades.d.ts +4 -5
  66. package/dist/tools/impuesto_sociedades.js +16 -37
  67. package/dist/tools/intelligence.js +164 -10
  68. package/dist/tools/invoices.js +109 -42
  69. package/dist/tools/kitchen.js +19 -9
  70. package/dist/tools/quotes.js +86 -25
  71. package/dist/tools/recurring.js +26 -25
  72. package/dist/tools/register-all.d.ts +2 -2
  73. package/dist/tools/register-all.js +9 -6
  74. package/dist/tools/search.d.ts +19 -0
  75. package/dist/tools/search.js +84 -0
  76. package/dist/tools/shared.d.ts +17 -37
  77. package/dist/tools/shared.js +96 -30
  78. package/dist/tools/team.js +8 -16
  79. package/dist/tools/time.js +4 -12
  80. package/dist/tools/vendors.js +240 -6
  81. package/dist/types.d.ts +3 -1
  82. package/dist/workflows/daily-operational-brief.d.ts +163 -0
  83. package/dist/workflows/daily-operational-brief.js +881 -0
  84. package/docs/agent-onboarding.json +15 -5
  85. package/package.json +26 -12
  86. package/dist/tools/onboarding.d.ts +0 -19
  87. package/dist/tools/onboarding.js +0 -64
package/README.md CHANGED
@@ -20,9 +20,10 @@
20
20
  <a href="https://www.npmjs.com/package/@frihet/mcp-server"><img src="https://img.shields.io/npm/dm/@frihet/mcp-server?style=flat&color=18181b&labelColor=09090b&label=downloads" alt="npm downloads"></a>
21
21
  <a href="https://smithery.ai/servers/frihet/frihet-mcp"><img src="https://smithery.ai/badge/frihet/frihet-mcp" alt="Smithery installs"></a>
22
22
  <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>
23
+ <a href="https://github.com/mcp/io.frihet/erp"><img src="https://img.shields.io/badge/GitHub_MCP_Registry-Listed-18181b?style=flat&labelColor=09090b&logo=github" alt="Listed in GitHub MCP Registry"></a>
23
24
  <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>
24
- <img src="https://img.shields.io/badge/catalogue-157_operations-18181b?style=flat&labelColor=09090b" alt="157 canonical catalogue operations">
25
- <img src="https://img.shields.io/badge/node-%3E%3D20-18181b?style=flat&labelColor=09090b" alt="node >=20">
25
+ <img src="https://img.shields.io/badge/catalogue-156_operations-18181b?style=flat&labelColor=09090b" alt="156 canonical catalogue operations">
26
+ <img src="https://img.shields.io/badge/node-22.23.4%2B%20%7C%2024.22.1%2B%20%7C%2026.12.1%2B-18181b?style=flat&labelColor=09090b" alt="Node 22.23.4+ (22.x), 24.22.1+ (24.x), or 26.12.1+ (26.x)">
26
27
  <a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-18181b?style=flat&labelColor=09090b" alt="TypeScript"></a>
27
28
  </p>
28
29
 
@@ -34,20 +35,41 @@
34
35
 
35
36
  ## Distribution
36
37
 
37
- | Channel | Status | Install |
38
- |---------|--------|---------|
39
- | **npm** | Live | `npx @frihet/mcp-server` |
40
- | **Remote endpoint** | Live | `https://mcp.frihet.io/mcp` (zero install, OAuth or API key) |
41
- | **Smithery** | Live | [smithery.ai/servers/frihet/frihet-mcp](https://smithery.ai/servers/frihet/frihet-mcp) |
42
- | **MCP Registry** | Live | [registry.modelcontextprotocol.io](https://registry.modelcontextprotocol.io/?q=io.frihet) |
43
- | **Glama** | Live | [glama.ai/mcp/servers/Frihet-io/frihet-mcp](https://glama.ai/mcp/servers/Frihet-io/frihet-mcp) |
44
- | **mcp.so** | Auto-index (unverified) | [mcp.so](https://mcp.so) — indexes from npm + GitHub |
45
- | **PulseMCP** | Auto-index (unverified) | [pulsemcp.com](https://pulsemcp.com) — indexes from npm + GitHub |
46
- | **Cursor Marketplace** | Coming soon | [cursor.com/marketplace](https://cursor.com/marketplace) |
47
- | **ChatGPT Apps** | Coming soon | [chatgpt.com](https://chatgpt.com) |
48
- | **Anthropic Claude Directory** | Coming soon | [claude.ai/settings/connectors](https://claude.ai/settings/connectors) |
49
-
50
- > **Surface truth:** the catalogue contains 157 canonical operations. The local full profile serves those plus 5 fiscal alias names (162 names). The hosted grouped profile also adds 3 local discovery names (165 names). Catalogue membership is not a promise that a backing API is enabled for every workspace.
38
+ Reviewed 2026-10-31. A directory entry is not proof of a working installation, vendor endorsement, or adoption. Package releases, hosted deployments and reviewed app versions are independent.
39
+
40
+ ### Use Frihet
41
+
42
+ | Channel | Availability | Entry point |
43
+ |---|---|---|
44
+ | npm | Published package; see its own release version | [npm](https://www.npmjs.com/package/@frihet/mcp-server) · `npx @frihet/mcp-server` |
45
+ | Remote MCP | Hosted connection route; OAuth or API key | `https://mcp.frihet.io/mcp` |
46
+ | ChatGPT app | Published 1.0.2, confirmed by the maintainer; not the separate 1.0.3 candidate | [Frihet in ChatGPT](https://chatgpt.com/plugins/plugin_asdk_app_6ac6b51bd7648191a0696bd1e725bfe6) |
47
+
48
+ ### Find Frihet
49
+
50
+ These are discovery links, not a count of independent integrations. Some third-party descriptions and cached copies are outdated.
51
+
52
+ | Surface | Evidence at review | Entry |
53
+ |---|---|---|
54
+ | Official MCP Registry | Specific registry entry indexed | [io.frihet/erp](https://registry.modelcontextprotocol.io/?q=io.frihet) |
55
+ | GitHub MCP Registry | Listing content retrieved; not a GitHub-verified connector claim | [Frihet ERP](https://github.com/mcp/io.frihet/erp) |
56
+ | ToolSDK MCP Registry | Entry read in upstream repository | [Registry entry](https://github.com/toolsdk-ai/toolsdk-mcp-registry/blob/main/packages/finance-fintech/frihet-mcp.json) |
57
+ | Glama | Specific listing indexed; summary needs refresh | [Listing](https://glama.ai/mcp/servers/Frihet-io/frihet-mcp) |
58
+ | Smithery | Specific listing indexed; live recheck blocked | [Listing](https://smithery.ai/servers/%40frihet/frihet-mcp) |
59
+ | mcpservers.org | Listing content retrieved; description outdated | [Listing](https://mcpservers.org/servers/frihet-io/frihet-mcp) |
60
+ | Cursor Directory | Community listing retrieved; separate from the official Cursor Marketplace | [Listing](https://cursor.directory/plugins/mcp-frihet) |
61
+ | mcp.so | Specific listing indexed; current installation not verified | [Listing](https://mcp.so/servers/frihet-mcp) |
62
+
63
+ Frihet also appears in **[punkpeye/awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)**, **[TensorBlock/awesome-mcp-servers](https://github.com/TensorBlock/awesome-mcp-servers/blob/main/docs/finance--crypto.md)** and **[ever-works/awesome-mcp-servers](https://github.com/ever-works/awesome-mcp-servers/blob/master/details/frihetmcp-server.md)**. Their retrieved descriptions still use an old tool count; the ever-works entry also links to a non-canonical repository URL. Use this repository's install instructions rather than copying those descriptions.
64
+
65
+ ### Pending or not reverified
66
+
67
+ - **Docker:** [submission PR #1711](https://github.com/docker/mcp-registry/pull/1711) remains open; do not describe it as published in Docker's catalog.
68
+ - **Cline:** [submission #2053](https://github.com/cline/mcp-marketplace/issues/2053) remains open; client compatibility is not marketplace approval.
69
+ - **PulseMCP:** historically reported; a current primary listing was not retrieved in this review.
70
+ - **Official Cursor Marketplace and Claude Directory:** public approval was not reverified here. This does not change existing submissions or manual MCP installation support.
71
+
72
+ > **Surface truth:** the catalogue contains 156 canonical operations. The local full profile serves 161 tool names, 11 resources, and 10 prompts (156 canonical operations plus 5 fiscal aliases). The hosted grouped profile serves 164 tool names, 7 resources, and 10 prompts (the same names plus 3 discovery tools, with API-backed resources kept local-only). The separately reviewed OpenAI profile serves 33 tool names, 0 resources, and 0 prompts. Catalogue membership is not a promise that a backing API is enabled for every workspace.
51
73
 
52
74
  ---
53
75
 
@@ -60,9 +82,13 @@ You: "Create an invoice for TechStart SL, 40 hours of consulting at 75 EUR/h
60
82
  Claude: Done. Invoice INV-2026-089 created. Total: 3,000.00 EUR + 21% IVA = 3,630.00 EUR.
61
83
  ```
62
84
 
63
- 157 canonical operations. Five fiscal aliases. Ten prompts. The local package serves 11 resources; the hosted Worker deliberately serves the 7 static resources, while API-backed workspace resources remain local-profile only.
85
+ 156 canonical operations. Five fiscal aliases. Ten prompts. The local package serves 11 resources; the hosted Worker deliberately serves the 7 static resources, while API-backed workspace resources remain local-profile only.
64
86
 
65
- <!-- v1.12.0-beta.1 — D4-B megasprint: HR (9), payroll (2), onboarding (2), permissions (2), period close (3), webhook test (1) = +19 = 157 tools total -->
87
+ <!-- v1.12.0-beta.1 — D4-B megasprint: HR (9), payroll (2), permissions (2), period close (3), webhook test (1) = +17 = 156 tools total
88
+ (Onboarding's two tools were withdrawn via #124 because the Frihet-ERP
89
+ /v1/onboarding/* family does not exist; the original +19 = 158 count
90
+ dropped to +17 = 156. The withdrawal is permanent until Frihet-ERP
91
+ ships the family.) -->
66
92
 
67
93
  ---
68
94
 
@@ -102,6 +128,10 @@ Three rules the contract encodes, in short:
102
128
 
103
129
  ## Install
104
130
 
131
+ Local npm/stdio installs require Node **22.23.4+ (22.x), 24.22.1+ (24.x), or 26.12.1+ (26.x)**, covering the [October 2026 Node security fixes](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases). Node 20 is end-of-life: upgrade the Node runtime used by your MCP client before starting the server. CI uses Node 22.23.4.
132
+
133
+ This source change does not update previously published npm package metadata or users' installed Node runtimes. Updated package metadata requires a separate npm release; users can upgrade their runtime now. The remote Cloudflare Worker has a separate runtime and release process.
134
+
105
135
  ### One-line (Claude Code, Cursor, Copilot, Codex, Windsurf, Gemini CLI, and more)
106
136
 
107
137
  ```bash
@@ -117,15 +147,17 @@ This repository is also a Claude Code plugin (`frihet-erp`): installing it wires
117
147
  claude --plugin-dir /path/to/frihet-mcp
118
148
  ```
119
149
 
120
- Once available in the community marketplace:
121
-
122
- ```text
123
- /plugin marketplace add anthropics/claude-plugins-community
124
- /plugin install frihet-erp@claude-community
125
- ```
150
+ Marketplace availability is pending. Use the local plugin command above or the Claude Code MCP command below to connect today.
126
151
 
127
152
  Skill invocation: `/frihet-erp:frihet-mcp`. The bundled `.mcp.json` launches `@frihet/mcp-server` via `npx` — set `FRIHET_API_KEY` in your environment (get one at [app.frihet.io](https://app.frihet.io) → Settings → API keys).
128
153
 
154
+ The [portable Claude plugin preview](plugins/claude/frihet-erp/README.md) bundles
155
+ real receivables, document-drafting and monthly-review skills with the existing
156
+ public remote MCP. Load `plugins/claude/frihet-erp` in Claude Code or upload a ZIP
157
+ of that folder in chat/Cowork. Its skills guide behavior; they do not filter the
158
+ hosted catalogue or establish Directory approval. The root local MCP setup above
159
+ keeps its existing API-key configuration.
160
+
129
161
  ### Claude Code — one command
130
162
 
131
163
  ```bash
@@ -269,7 +301,7 @@ Talk to your ERP. These are real prompts, not marketing copy.
269
301
 
270
302
  ## What to expect
271
303
 
272
- 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. Most of the 157 canonical operations are CRUD operations over the REST API; the rest are read-only summaries and fiscal/e-invoice actions. Alias and discovery names are counted separately.
304
+ 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. Most of the 156 canonical operations are CRUD operations over the REST API; the rest are read-only summaries and fiscal/e-invoice actions. Alias and discovery names are counted separately.
273
305
 
274
306
  **Works great:**
275
307
 
@@ -296,7 +328,7 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
296
328
 
297
329
  ---
298
330
 
299
- ## Catalogue operations (157)
331
+ ## Catalogue operations (156)
300
332
 
301
333
  ### Invoices (12)
302
334
 
@@ -412,7 +444,7 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
412
444
  | `face_status` | Poll submission status from FACe for a submitted invoice |
413
445
  | `ticketbai_submit` | Submit TicketBAI fiscal record to Basque Country tax authority (Hacienda) |
414
446
  | `ticketbai_status` | Poll TicketBAI submission status from the Basque tax authority |
415
- | `ksef_submit` | Submit invoice to KSeF (Poland) — *stub: transport is infra-ready in Frihet-ERP but not yet exposed as a live endpoint (production gated on KSeF cert); returns a labeled "unavailable" error until activated* |
447
+ | `ksef_submit` | **NOT_DEPLOYED** — Submit invoice to KSeF (Poland) — *stub: transport is infra-ready in Frihet-ERP but not yet exposed as a live endpoint (production gated on KSeF cert); returns a labeled "unavailable" error until activated* |
416
448
 
417
449
  ### Time Tracking (6)
418
450
 
@@ -436,7 +468,7 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
436
468
  | `pause_recurring_invoice` | Pause an active template — no invoices generated while paused |
437
469
  | `resume_recurring_invoice` | Resume a paused template — next invoice on next scheduled cycle |
438
470
  | `delete_recurring_invoice` | Permanently delete a template (confirm=true required) |
439
- | `run_recurring_now` | Manually trigger immediate generation of the next invoice instance |
471
+ | `run_recurring_now` | Generate the next recurring invoice with explicit `confirm=true` in full and grouped modes; workspace settings may trigger fiscal issuance, submission and webhooks |
440
472
 
441
473
  ### Team Management (4)
442
474
 
@@ -484,17 +516,17 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
484
516
 
485
517
  | Tool | What it does |
486
518
  |------|-------------|
487
- | `frihet_modelo_415_summary` | M415 annual operations >€3,005 (Canarias equivalent of M347) |
488
- | `frihet_modelo_425_summary` | M425 annual IGIC recap for Canary Islands businesses |
489
- | `frihet_modelo_418_summary` | M418 monthly IGIC return for large enterprises (grandes empresas) |
490
- | `frihet_aiem_calculate` | Calculate AIEM (Arbitrio Importación) for imported/produced goods in Canarias |
519
+ | `frihet_modelo_415_summary` | M415 annual operations >€3,005 (Canarias equivalent of M347) — not deployed, returns `NOT_DEPLOYED` |
520
+ | `frihet_modelo_425_summary` | M425 annual IGIC recap for Canary Islands businesses — not deployed, returns `NOT_DEPLOYED` |
521
+ | `frihet_modelo_418_summary` | M418 monthly individual IGIC return, régimen especial del grupo de entidades — not deployed, returns `NOT_DEPLOYED` |
522
+ | `frihet_aiem_calculate` | AIEM (Arbitrio Importación) calculation for Canarias — not deployed, returns `NOT_DEPLOYED` |
491
523
 
492
524
  ### Impuesto sobre Sociedades — Corporate Tax (2)
493
525
 
494
526
  | Tool | What it does |
495
527
  |------|-------------|
496
- | `frihet_modelo_200_summary` | Modelo 200 annual IS return (taxable base, deductions, net payable) |
497
- | `frihet_modelo_202_summary` | Modelo 202 installment payments (1P April, 2P October, 3P December) |
528
+ | `frihet_modelo_200_summary` | Modelo 200 annual IS return — not deployed, returns `NOT_DEPLOYED` |
529
+ | `frihet_modelo_202_summary` | Modelo 202 installment payments (1P/2P/3P) — not deployed, returns `NOT_DEPLOYED` |
498
530
 
499
531
  ### Bank Categorization Rules (2)
500
532
 
@@ -513,7 +545,7 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
513
545
  | `update_deposit` | Update deposit fields |
514
546
  | `delete_deposit` | Delete a deposit (confirm=true required) |
515
547
  | `apply_deposit` | Apply a deposit balance against an invoice |
516
- | `refund_deposit` | Issue a refund for a deposit |
548
+ | `refund_deposit` | Record a deposit refund in Frihet bookkeeping with `confirm=true`; optional `amount` records that portion, omission records the remaining refundable balance. Does not transfer money |
517
549
 
518
550
  ### Vendors (5)
519
551
 
@@ -542,7 +574,7 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
542
574
  | `get_modelo_303_summary` | Quarterly IVA return (Modelo 303) — collected vs deductible, net payable |
543
575
  | `get_modelo_130_summary` | Quarterly IRPF installment for self-employed (Modelo 130) |
544
576
  | `get_modelo_390_summary` | Annual IVA summary (Modelo 390) |
545
- | `get_modelo_180_summary` | Annual withholding summary for rentals (Modelo 180) |
577
+ | `get_modelo_180_summary` | Annual withholding summary for rentals (Modelo 180) — not deployed, returns `NOT_DEPLOYED` |
546
578
  | `get_modelo_347_summary` | Annual third-party transactions >€3,005 (Modelo 347) |
547
579
  | `verifactu_status` | Get VeriFactu submission status for a fiscal record |
548
580
  | `verifactu_resubmit` | Resubmit a rejected VeriFactu fiscal record |
@@ -599,12 +631,11 @@ If you need to digitize paper invoices or receipts, extract the data first (e.g.
599
631
  | `payroll_export` | Read normalized payroll-ready employee data; the format value is an echoed destination label, not a generated file |
600
632
  | `payroll_checklist` | List payable employees with payroll-profile readiness, missing fields, and monthly review state |
601
633
 
602
- ### Onboarding (2)
634
+ ### Onboarding — withdrawn via #124
603
635
 
604
- | Tool | What it does |
605
- |------|-------------|
606
- | `onboarding_status` | Get onboarding completion status for the current workspace |
607
- | `onboarding_persona_set` | Set or update the business persona (freelancer, SME, gestoría, etc.) |
636
+ The `onboarding_status` and `onboarding_persona_set` tools were withdrawn because the Frihet-ERP `/v1/onboarding/*` family does not exist as of this release. See [issue #124](https://github.com/Frihet-io/frihet-mcp/issues/124) for the audit and the precedent (`src/tools/igic.ts` shows the inline `NOT_DEPLOYED` stub pattern used for families whose backing API is not yet shipped; onboarding chose full withdrawal instead, because the catalogue should not over-promise tools that have no live handler).
637
+
638
+ If a future Frihet-ERP release ships the family, restore `src/tools/onboarding.ts`, the `onboardingStatusOutput` / `onboardingPersonaResultOutput` schemas in `src/tools/shared.ts`, the `getOnboardingStatus` / `setOnboardingPersona` methods on `IFrihetClient`, and the registration in `src/tools/register-all.ts` (the `Onboarding tools — withdrawn via #124` test in `src/__tests__/d4b-hr-payroll-onboarding-tools.test.ts` is the gate that will fail and remind the next maintainer what was here).
608
639
 
609
640
  ### Permissions (2)
610
641
 
@@ -652,7 +683,7 @@ The local package serves 11 resources: 7 static references plus 4 API-backed wor
652
683
  | Expense Categories | `frihet://config/expense-categories` | 8 categories with deductibility rules, IVA treatment, amortization |
653
684
  | Invoice Statuses | `frihet://config/invoice-statuses` | Status flow (draft > sent > paid/overdue > cancelled), transition rules, webhook events |
654
685
  | Currencies | `frihet://config/currencies` | 40 supported currencies with ISO codes, symbols, decimal places, locale formatting |
655
- | Countries | `frihet://config/countries` | 61 supported countries with fiscal zones, default tax rates, currencies, invoice prefixes |
686
+ | Countries | `frihet://config/countries` | Supported countries with fiscal zones, default tax rates, currencies, invoice prefixes |
656
687
 
657
688
  **Dynamic** (live data from your account):
658
689
 
@@ -719,6 +750,12 @@ Two transports:
719
750
  | `FRIHET_API_KEY` | Yes (stdio) | -- |
720
751
  | `FRIHET_API_URL` | No | `https://api.frihet.io/v1` |
721
752
  | `FRIHET_TOOL_MODE` | No | `full` |
753
+ | `FRIHET_CLAUDE_MODE` | No (unreleased local candidate) | `false` |
754
+
755
+ The source-only Claude candidate requires building this checkout and running
756
+ `dist/index.js`; existing npm releases are not claimed to support the flag.
757
+ See [candidate scope, exclusions and checks](marketplace/anthropic/SUBMISSION.md).
758
+ It cannot be combined with `FRIHET_OPENAI_MODE=true` and is not enabled in the deployed Worker.
722
759
 
723
760
  ---
724
761
 
@@ -781,7 +818,7 @@ Beyond raw MCP tools, this repo includes a **Claude Code skill** that adds busin
781
818
 
782
819
  ```bash
783
820
  git clone https://github.com/Frihet-io/frihet-mcp.git
784
- ln -s "$(pwd)/frihet-mcp/skill" ~/.claude/skills/frihet
821
+ ln -s "$(pwd)/frihet-mcp/skills/frihet-mcp" ~/.claude/skills/frihet-mcp
785
822
  ```
786
823
 
787
824
  Or with the universal installer:
@@ -790,20 +827,7 @@ Or with the universal installer:
790
827
  npx skills add Frihet-io/frihet-mcp
791
828
  ```
792
829
 
793
- ### Commands
794
-
795
- | Command | What it does |
796
- |---------|-------------|
797
- | `/frihet status` | Account overview, recent activity, pending payments |
798
- | `/frihet invoice` | Create, list, search invoices |
799
- | `/frihet expense` | Log and query expenses |
800
- | `/frihet clients` | Manage client database |
801
- | `/frihet quote` | Create and manage quotes |
802
- | `/frihet report` | Financial summaries (P&L, quarterly, overdue) |
803
- | `/frihet webhooks` | Configure automation triggers |
804
- | `/frihet setup` | Guided setup and connection test |
805
-
806
- The skill knows about IVA rates, IRPF retention, Modelo 303 prep, expense deductibility rules, and VeriFactu compliance.
830
+ The skill routes requests to the Frihet MCP tools (invoices, quotes, expenses, clients, monthly review) and tells the agent when to ask for confirmation before writes. It does not add standalone `/frihet` subcommands, and it does not ship VAT rates or deductibility rules: tax figures come from your Frihet data, not from the skill.
807
831
 
808
832
  Full documentation: [docs.frihet.io/desarrolladores/skill-claude-code](https://docs.frihet.io/desarrolladores/skill-claude-code)
809
833
 
@@ -857,7 +881,7 @@ npm run build # must pass before submitting
857
881
 
858
882
  | Package | What it is |
859
883
  |---------|-----------|
860
- | [`@frihet/mcp-server`](https://www.npmjs.com/package/@frihet/mcp-server) | This MCP server (157 canonical operations + 5 alias names; 11 local resources; 10 prompts) |
884
+ | [`@frihet/mcp-server`](https://www.npmjs.com/package/@frihet/mcp-server) | This MCP server (156 canonical operations + 5 alias names; 11 local resources; 10 prompts) |
861
885
  | [`@frihet/sdk`](https://github.com/Frihet-io/frihet-sdk) | TypeScript SDK (`frihet.invoices.create()`) |
862
886
  | [`frihet`](https://www.npmjs.com/package/frihet) | CLI (`frihet invoices list --status overdue`) |
863
887
  | [`n8n-nodes-frihet`](https://www.npmjs.com/package/n8n-nodes-frihet) | n8n community node for workflow automation |
@@ -873,7 +897,8 @@ npm run build # must pass before submitting
873
897
  - [MCP server docs](https://docs.frihet.io/desarrolladores/mcp-server) -- Setup guides, troubleshooting
874
898
  - [npm](https://www.npmjs.com/package/@frihet/mcp-server) -- Package registry
875
899
  - [Smithery](https://smithery.ai/servers/frihet/frihet-mcp) -- Smithery marketplace
876
- - [MCP Registry](https://registry.modelcontextprotocol.io/?q=io.frihet) -- Anthropic official registry
900
+ - [MCP Registry](https://registry.modelcontextprotocol.io/?q=io.frihet) -- Official Model Context Protocol registry
901
+ - [GitHub MCP Registry](https://github.com/mcp/io.frihet/erp) -- Frihet listing on GitHub
877
902
  - [Remote endpoint](https://mcp.frihet.io) -- Hosted MCP server (Cloudflare Workers)
878
903
  - [OpenAPI spec](https://api.frihet.io/openapi.json) -- Machine-readable API definition
879
904
  - [Security policy](./SECURITY.md) -- Private vulnerability reporting guidance
@@ -30,7 +30,7 @@ export declare const AGENT_ONBOARDING_CONTRACT_VERSION = 1;
30
30
  * ApiKeysSettings panel. The old index.ts wording ("Settings > Developers >
31
31
  * API Keys") pointed at a section that does not exist. */
32
32
  export declare const API_KEY_LOCATION = "https://app.frihet.io/settings/api";
33
- export declare const AGENT_SERVER_INSTRUCTIONS = "Frihet ERP \u2014 real business and fiscal records. Read freely, propose before you mutate.\n\nAUTH\n- Local (stdio): FRIHET_API_KEY=fri_... \u2014 create one at https://app.frihet.io/settings/api.\n- No key yet: FRIHET_DEMO=1 serves example fixtures. No network call, nothing persisted, demo_-prefixed IDs, fiscal actions simulated.\n- Hosted: https://mcp.frihet.io/mcp \u2014 OAuth 2.1 + PKCE, or Authorization: Bearer fri_...\n\nORIENT BEFORE ACTING (read-only)\n- get_business_context \u2014 fiscal zone, currency, IRPF/IVA defaults, plan limits. Call this first; the correct tax treatment depends on it.\n- Resources frihet://tax/rates and frihet://tax/calendar carry the Spanish rate table (IVA / IGIC / IPSI) and the filing deadlines. Read them instead of recalling a rate.\n\nCAPABILITY DISCOVERY\n- Every tool in tools/list carries _meta[\"io.frihet/capability\"] = {callability, writesFrihet, externalInteraction, externalSideEffects}. Read it before you call.\n- callability is a conservative fact, not a promise: api_dependent | runtime_checked | deferred | unavailable | local. Registration does NOT mean the backing API is enabled for this workspace; deferred and unavailable tools will refuse.\n- Large surface: set FRIHET_TOOL_MODE=grouped for progressive disclosure (list_tool_groups, search_tools, describe_tool) instead of loading every schema.\n\nTHE SAFE WORKFLOW \u2014 draft, show, stop\n- create_invoice defaults to status=draft: no fiscal number, no hash, nothing submitted to a tax authority. create_quote and create_credit_note are drafts too.\n- Build the draft, read it back, present it to the human, and stop there. Issuing is a separate, human-authorised step.\n\nHUMAN AUTHORITY \u2014 do not call unprompted\n- Any tool whose capability shows a non-empty externalSideEffects reaches outside Frihet \u2014 email to a client, webhook delivery, money movement, or a submission to AEAT / VeriFactu / TicketBAI / FACe. You cannot undo those.\n- Several also take confirm=true. That flag records the human's decision. Never set it to satisfy your own plan; ask, then pass what you were told.\n- delete_invoice does not always delete: an issued invoice is CANCELLED (status=cancelled) because VeriFactu forbids breaking the hash chain. Same for quotes.\n\nWHEN A CALL FAILS\n- Errors carry sanitized remediation text \u2014 read it, do not guess. 401 = key; 403 = scope or plan; 429 = wait Retry-After seconds.\n- After 409 IDEMPOTENCY_REQUEST_IN_PROGRESS, do NOT retry with a fresh Idempotency-Key. Read the resource back and decide from its actual state; a new key would create a second fiscal document.\n\nMachine-readable version of this contract: https://github.com/Frihet-io/frihet-mcp/blob/main/docs/agent-onboarding.json";
33
+ export declare const AGENT_SERVER_INSTRUCTIONS = "Frihet ERP \u2014 real business and fiscal records. Read freely, propose before you mutate.\n\nAUTH\n- Local (stdio): FRIHET_API_KEY=fri_... \u2014 create one at https://app.frihet.io/settings/api.\n- No key yet: FRIHET_DEMO=1 serves example fixtures. No network call, nothing persisted, demo_-prefixed IDs, fiscal actions simulated.\n- Hosted: https://mcp.frihet.io/mcp \u2014 OAuth 2.1 + PKCE, or Authorization: Bearer fri_...\n\nORIENT BEFORE ACTING (read-only)\n- get_business_context \u2014 fiscal zone, currency, IRPF/IVA defaults, plan limits. Call this first; the correct tax treatment depends on it.\n- Resources carry informational reference data with declared provenance: frihet://tax/rates and frihet://tax/calendar (Spanish statutory schedules and deadlines), frihet://config/expense-categories (LIRPF/LIVA deductibility guidelines), frihet://config/countries and currencies (defaults and ISO codes), frihet://api/schema (endpoint snapshot; canonical at https://api.frihet.io/v1/openapi.json). Read them instead of guessing, but treat as informational: writing tools and server endpoints enforce business and fiscal invariants server-side.\n\nCAPABILITY DISCOVERY\n- Every tool in tools/list carries _meta[\"io.frihet/capability\"] = {callability, writesFrihet, externalInteraction, externalSideEffects}. Read it before you call.\n- callability is a conservative fact, not a promise: api_dependent | runtime_checked | deferred | unavailable | local. Registration does NOT mean the backing API is enabled for this workspace; deferred and unavailable tools will refuse.\n- Large surface: set FRIHET_TOOL_MODE=grouped for progressive disclosure (list_tool_groups, search_tools, describe_tool) instead of loading every schema.\n\nTHE SAFE WORKFLOW \u2014 draft, show, stop\n- create_invoice defaults to status=draft: no fiscal number, no hash, nothing submitted to a tax authority. create_quote and create_credit_note are drafts too.\n- Build the draft, read it back, present it to the human, and stop there. Issuing is a separate, human-authorised step.\n\nHUMAN AUTHORITY \u2014 do not call unprompted\n- Any tool whose capability shows a non-empty externalSideEffects reaches outside Frihet \u2014 email to a client, webhook delivery, money movement, or a submission to AEAT / VeriFactu / TicketBAI / FACe. You cannot undo those.\n- Several also take confirm=true. It is a local client/agent interlock, not server-verifiable human attestation and not actor/resource/payload/expiry-bound. Never set it to satisfy your own plan; ask, then pass what you were told.\n- delete_invoice does not always delete: an issued invoice is CANCELLED (status=cancelled) because VeriFactu forbids breaking the hash chain. Same for quotes.\n\nWHEN A CALL FAILS\n- Errors carry sanitized remediation text \u2014 read it, do not guess. 401 = key; 403 = scope or plan; 429 = wait Retry-After seconds.\n- After 409 IDEMPOTENCY_REQUEST_IN_PROGRESS, do NOT retry with a fresh Idempotency-Key. Read the resource back and decide from its actual state; a new key would create a second fiscal document.\n\nMachine-readable version of this contract: https://github.com/Frihet-io/frihet-mcp/blob/main/docs/agent-onboarding.json";
34
34
  export interface AgentOnboardingDescriptor {
35
35
  onboardingContractVersion: number;
36
36
  server: {
@@ -47,7 +47,7 @@ AUTH
47
47
 
48
48
  ORIENT BEFORE ACTING (read-only)
49
49
  - get_business_context — fiscal zone, currency, IRPF/IVA defaults, plan limits. Call this first; the correct tax treatment depends on it.
50
- - Resources frihet://tax/rates and frihet://tax/calendar carry the Spanish rate table (IVA / IGIC / IPSI) and the filing deadlines. Read them instead of recalling a rate.
50
+ - Resources carry informational reference data with declared provenance: frihet://tax/rates and frihet://tax/calendar (Spanish statutory schedules and deadlines), frihet://config/expense-categories (LIRPF/LIVA deductibility guidelines), frihet://config/countries and currencies (defaults and ISO codes), frihet://api/schema (endpoint snapshot; canonical at https://api.frihet.io/v1/openapi.json). Read them instead of guessing, but treat as informational: writing tools and server endpoints enforce business and fiscal invariants server-side.
51
51
 
52
52
  CAPABILITY DISCOVERY
53
53
  - Every tool in tools/list carries _meta["${CAPABILITY_META_KEY}"] = {callability, writesFrihet, externalInteraction, externalSideEffects}. Read it before you call.
@@ -60,7 +60,7 @@ THE SAFE WORKFLOW — draft, show, stop
60
60
 
61
61
  HUMAN AUTHORITY — do not call unprompted
62
62
  - Any tool whose capability shows a non-empty externalSideEffects reaches outside Frihet — email to a client, webhook delivery, money movement, or a submission to AEAT / VeriFactu / TicketBAI / FACe. You cannot undo those.
63
- - Several also take confirm=true. That flag records the human's decision. Never set it to satisfy your own plan; ask, then pass what you were told.
63
+ - Several also take confirm=true. It is a local client/agent interlock, not server-verifiable human attestation and not actor/resource/payload/expiry-bound. Never set it to satisfy your own plan; ask, then pass what you were told.
64
64
  - delete_invoice does not always delete: an issued invoice is CANCELLED (status=cancelled) because VeriFactu forbids breaking the hash chain. Same for quotes.
65
65
 
66
66
  WHEN A CALL FAILS
@@ -214,7 +214,7 @@ export async function captureAgentOnboardingDescriptor() {
214
214
  {
215
215
  call: "resources/read frihet://tax/rates",
216
216
  kind: "read",
217
- note: "Authoritative IVA / IGIC / IPSI table. Do not recall a rate from memory.",
217
+ note: "Spanish statutory IVA / IGIC / IPSI reference schedule. Do not recall a rate from memory; server validates transaction math.",
218
218
  },
219
219
  {
220
220
  call: "list_clients",
@@ -15,7 +15,7 @@
15
15
  */
16
16
  export declare const HARNESS_CONTRACT_VERSION = 1;
17
17
  export declare const INSPECTOR_PINNED_VERSION = "2.3.0";
18
- export declare const CANONICAL_OPERATIONS_COUNT = 157;
18
+ export declare const CANONICAL_OPERATIONS_COUNT = 156;
19
19
  export declare const FISCAL_ALIASES_COUNT: number;
20
20
  export type CheckStatus = "PASS" | "FAIL" | "UNSUPPORTED" | "NOT_EXERCISED";
21
21
  export type OverallStatus = "PASS" | "PASS_WITH_GAPS" | "FAIL";
@@ -22,7 +22,10 @@ import { CAPABILITY_META_KEY } from "../capability-truth.js";
22
22
  import { FISCAL_MODELO_ALIASES } from "../fiscal-aliases.js";
23
23
  export const HARNESS_CONTRACT_VERSION = 1;
24
24
  export const INSPECTOR_PINNED_VERSION = "2.3.0";
25
- export const CANONICAL_OPERATIONS_COUNT = 157;
25
+ // Updated 2026-10-10 by issue #124 (IGIC-pattern withdraw of dead onboarding_status /
26
+ // onboarding_persona_set — the Frihet-ERP /v1/onboarding/* family is absent, so the
27
+ // MCP catalogue now declares 156 canonical operations, down from 158).
28
+ export const CANONICAL_OPERATIONS_COUNT = 156;
26
29
  export const FISCAL_ALIASES_COUNT = Object.keys(FISCAL_MODELO_ALIASES).length;
27
30
  /**
28
31
  * Executes the complete compatibility harness in-process and returns
@@ -14,17 +14,11 @@ const RUNTIME_CHECKED = new Set([
14
14
  "anomaly_list",
15
15
  "attendance_clock_in",
16
16
  "attendance_clock_out",
17
- "frihet_aiem_calculate",
18
17
  "frihet_bank_rule_create",
19
18
  "frihet_bank_rules_list",
20
19
  "frihet_gl_entry_approve",
21
20
  "frihet_gl_entry_audit_log",
22
21
  "frihet_gl_entry_reject",
23
- "frihet_modelo_200_summary",
24
- "frihet_modelo_202_summary",
25
- "frihet_modelo_415_summary",
26
- "frihet_modelo_418_summary",
27
- "frihet_modelo_425_summary",
28
22
  "frihet_portal_domain_add",
29
23
  "frihet_portal_domain_remove",
30
24
  "frihet_portal_domain_verify",
@@ -32,7 +26,6 @@ const RUNTIME_CHECKED = new Set([
32
26
  "frihet_tax_id_vies_lookup",
33
27
  "gestoria_template_create",
34
28
  "get_modelo_130_summary",
35
- "get_modelo_180_summary",
36
29
  "get_modelo_303_summary",
37
30
  "get_modelo_347_summary",
38
31
  "get_modelo_390_summary",
@@ -41,8 +34,6 @@ const RUNTIME_CHECKED = new Set([
41
34
  "leave_list",
42
35
  "leave_reject",
43
36
  "leave_request_create",
44
- "onboarding_persona_set",
45
- "onboarding_status",
46
37
  "overtime_report",
47
38
  "payroll_checklist",
48
39
  "payroll_export",
@@ -71,7 +62,19 @@ const DEFERRED = new Set([
71
62
  "create_reservation",
72
63
  "sync_channel",
73
64
  ]);
74
- const UNAVAILABLE = new Set(["ksef_submit"]);
65
+ // No Frihet-ERP route exists: publicApi.ts serves /fiscal/modelo/{303,130,390,347}
66
+ // only, and has no /igic/* (modelo or AIEM) and no /is/modelo/* route. These
67
+ // handlers return NOT_DEPLOYED without a call (ksef_submit: labelled unavailable).
68
+ const UNAVAILABLE = new Set([
69
+ "ksef_submit",
70
+ "get_modelo_180_summary",
71
+ "frihet_modelo_415_summary",
72
+ "frihet_modelo_418_summary",
73
+ "frihet_modelo_425_summary",
74
+ "frihet_aiem_calculate",
75
+ "frihet_modelo_200_summary",
76
+ "frihet_modelo_202_summary",
77
+ ]);
75
78
  const DESTRUCTIVE_UPDATES = new Set([
76
79
  // These writes can synchronously enqueue delivery to workspace webhooks.
77
80
  // Once an external endpoint receives the event, that disclosure cannot be
@@ -101,7 +104,6 @@ const DESTRUCTIVE_UPDATES = new Set([
101
104
  "send_invoice",
102
105
  "mark_invoice_paid",
103
106
  "update_kitchen_ticket",
104
- "onboarding_persona_set",
105
107
  "update_product",
106
108
  "update_quote",
107
109
  "send_quote",
@@ -147,11 +149,17 @@ const NON_IDEMPOTENT = new Set([
147
149
  "pause_recurring_invoice",
148
150
  "resume_recurring_invoice",
149
151
  ]);
150
- const WRITE_OVERRIDES = new Set(["frihet_portal_domain_verify"]);
152
+ const WRITE_OVERRIDES = new Set([
153
+ "frihet_portal_domain_verify",
154
+ // signed=true exercises a workspace certificate. MCP annotations are
155
+ // static, so classify the whole export tool conservatively.
156
+ "einvoice_export",
157
+ ]);
151
158
  const EXTERNAL_SIDE_EFFECTS = {
152
159
  create_invoice: ["webhook_delivery_or_configuration", "fiscal_or_einvoice_submission"],
153
160
  duplicate_invoice: ["webhook_delivery_or_configuration"],
154
161
  create_credit_note: ["webhook_delivery_or_configuration"],
162
+ run_recurring_now: ["webhook_delivery_or_configuration", "fiscal_or_einvoice_submission"],
155
163
  update_invoice: ["webhook_delivery_or_configuration", "fiscal_or_einvoice_submission"],
156
164
  mark_invoice_paid: ["webhook_delivery_or_configuration", "fiscal_or_einvoice_submission"],
157
165
  delete_invoice: ["webhook_delivery_or_configuration", "fiscal_or_einvoice_submission"],