@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.
- package/README.md +84 -59
- package/dist/agent-onboarding.d.ts +1 -1
- package/dist/agent-onboarding.js +3 -3
- package/dist/canary/mcp-harness.d.ts +1 -1
- package/dist/canary/mcp-harness.js +4 -1
- package/dist/capability-truth.js +20 -12
- package/dist/claude-candidate-contract.d.ts +482 -0
- package/dist/claude-candidate-contract.js +87 -0
- package/dist/claude-output-privacy.d.ts +17 -0
- package/dist/claude-output-privacy.js +240 -0
- package/dist/claude-profile.d.ts +18 -0
- package/dist/claude-profile.js +260 -0
- package/dist/client-interface.d.ts +26 -20
- package/dist/client.d.ts +65 -29
- package/dist/client.js +278 -167
- package/dist/demo-client.d.ts +27 -21
- package/dist/demo-client.js +31 -14
- package/dist/deposit-contract.d.ts +29 -0
- package/dist/deposit-contract.js +76 -0
- package/dist/fetch-no-redirect.d.ts +3 -0
- package/dist/fetch-no-redirect.js +16 -0
- package/dist/fiscal-aliases.d.ts +2 -2
- package/dist/fiscal-aliases.js +2 -2
- package/dist/fiscal-period.d.ts +26 -0
- package/dist/fiscal-period.js +31 -0
- package/dist/google-profile.d.ts +19 -0
- package/dist/google-profile.js +122 -0
- package/dist/index.js +31 -7
- package/dist/logger.d.ts +1 -1
- package/dist/logger.js +2 -2
- package/dist/muse-profile.d.ts +19 -0
- package/dist/muse-profile.js +122 -0
- package/dist/observability.js +3 -2
- package/dist/openai-profile.d.ts +2 -2
- package/dist/openai-profile.js +37 -11
- package/dist/openai-review-contract.d.ts +1 -1
- package/dist/openai-review-contract.js +4 -5
- package/dist/openai-review-oauth.d.ts +107 -7
- package/dist/openai-review-oauth.js +161 -17
- package/dist/prompts/register-all.js +32 -78
- package/dist/redaction.d.ts +5 -0
- package/dist/redaction.js +9 -0
- package/dist/resources/register-all.js +150 -54
- package/dist/retry-after.d.ts +19 -0
- package/dist/retry-after.js +84 -0
- package/dist/server-composition.d.ts +5 -2
- package/dist/server-composition.js +35 -5
- package/dist/tool-exposure.d.ts +6 -5
- package/dist/tool-exposure.js +15 -13
- package/dist/tools/audit_gl.js +8 -8
- package/dist/tools/backend-availability.d.ts +8 -29
- package/dist/tools/backend-availability.js +31 -30
- package/dist/tools/bank_rules.js +66 -15
- package/dist/tools/banking.js +5 -13
- package/dist/tools/clients.js +252 -6
- package/dist/tools/deposits.js +107 -97
- package/dist/tools/einvoice.d.ts +17 -3
- package/dist/tools/einvoice.js +59 -12
- package/dist/tools/fiscal.d.ts +3 -4
- package/dist/tools/fiscal.js +93 -60
- package/dist/tools/gestoria.js +15 -7
- package/dist/tools/hr.js +41 -11
- package/dist/tools/igic.d.ts +9 -8
- package/dist/tools/igic.js +34 -64
- package/dist/tools/impuesto_sociedades.d.ts +4 -5
- package/dist/tools/impuesto_sociedades.js +16 -37
- package/dist/tools/intelligence.js +164 -10
- package/dist/tools/invoices.js +109 -42
- package/dist/tools/kitchen.js +19 -9
- package/dist/tools/quotes.js +86 -25
- package/dist/tools/recurring.js +26 -25
- package/dist/tools/register-all.d.ts +2 -2
- package/dist/tools/register-all.js +9 -6
- package/dist/tools/search.d.ts +19 -0
- package/dist/tools/search.js +84 -0
- package/dist/tools/shared.d.ts +17 -37
- package/dist/tools/shared.js +96 -30
- package/dist/tools/team.js +8 -16
- package/dist/tools/time.js +4 -12
- package/dist/tools/vendors.js +240 -6
- package/dist/types.d.ts +3 -1
- package/dist/workflows/daily-operational-brief.d.ts +163 -0
- package/dist/workflows/daily-operational-brief.js +881 -0
- package/docs/agent-onboarding.json +15 -5
- package/package.json +26 -12
- package/dist/tools/onboarding.d.ts +0 -19
- 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-
|
|
25
|
-
<img src="https://img.shields.io/badge/node
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
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),
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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` |
|
|
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
|
|
490
|
-
| `frihet_aiem_calculate` |
|
|
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
|
|
497
|
-
| `frihet_modelo_202_summary` | Modelo 202 installment payments (1P
|
|
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` |
|
|
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
|
|
634
|
+
### Onboarding — withdrawn via #124
|
|
603
635
|
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
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` |
|
|
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/
|
|
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
|
-
|
|
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 (
|
|
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) --
|
|
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
|
|
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: {
|
package/dist/agent-onboarding.js
CHANGED
|
@@ -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
|
|
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.
|
|
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: "
|
|
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 =
|
|
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
|
-
|
|
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
|
package/dist/capability-truth.js
CHANGED
|
@@ -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
|
-
|
|
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([
|
|
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"],
|