erp
MCP serverCommerce & financeGive your AI the ability to handle core business operations like invoicing, tax, and banking for Spanish and EU markets. This integration connects your AI to an ERP system that follows fiscal rules including VeriFactu, TicketBAI, and Facturae.
Use erp in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add erp and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use erp
Needs your own erp account. You sign in to it and approve access when you connect.
Details
Available today. Use it from your connected AI after setup.
Add the integration, then ask your AI to draft an invoice or review a tax task to see it in action.
What your AI can do with it
- Create and manage invoices that meet Spanish and EU fiscal requirements
- Stay compliant with VeriFactu, TicketBAI, and Facturae rules
- Handle tax records and tax-related tasks
- Work with your banking information
- Keep invoicing, tax, and banking together in one place
Install erp
The server’s own address, for the clients that take one directly. Or connect Ahel once and every client you use reads it from one address, with the account kept on Ahel rather than in each client’s config.
Claude Code
claude mcp add --transport http --scope user erp 'https://mcp.frihet.io/mcp'Run it once in your project, then open /mcp to approve any sign-in the server asks for.
Claude Desktop
https://mcp.frihet.io/mcpAdd a custom connector in Settings, paste this address, and approve the sign-in.
Cursor
cursor://anysphere.cursor-deeplink/mcp/install?name=erp&config=eyJ1cmwiOiJodHRwczovL21jcC5mcmloZXQuaW8vbWNwIn0=Open the link and Cursor adds the server at that address.
ChatGPT
https://mcp.frihet.io/mcpIn Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.
Codex
codex mcp add erp --url 'https://mcp.frihet.io/mcp'Run it once, then sign in with codex mcp login erp if the server asks for an account.
From the project's README
As published by frihet-io/frihet-mcp in README.md.
AI-native MCP server for business management. Servidor MCP nativo con IA para gestión empresarial.
Distribution
| Channel | Status | Install |
|---|---|---|
| npm | Live | npx @frihet/mcp-server |
| Remote endpoint | Live | https://mcp.frihet.io/mcp (zero install, OAuth or API key) |
| Smithery | Live | smithery.ai/servers/frihet/frihet-mcp |
| MCP Registry | Live | registry.modelcontextprotocol.io |
| GitHub MCP Registry | Live | github.com/mcp/io.frihet/erp |
| Glama | Live | glama.ai/mcp/servers/Frihet-io/frihet-mcp |
| mcp.so | Auto-index (unverified) | mcp.so — indexes from npm + GitHub |
| PulseMCP | Auto-index (unverified) | pulsemcp.com — indexes from npm + GitHub |
| Cursor Marketplace | Coming soon | cursor.com/marketplace |
| ChatGPT Apps | Coming soon | chatgpt.com |
| Anthropic Claude Directory | Coming soon | claude.ai/settings/connectors |
Surface truth: the catalogue contains 158 canonical operations. The local full profile serves 163 tool names, 11 resources, and 10 prompts (158 canonical operations plus 5 fiscal aliases). The hosted grouped profile serves 166 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.
What is this
An MCP server that connects your AI assistant to Frihet. Create invoices by talking. Query expenses in natural language. Manage your entire business from your IDE.
You: "Create an invoice for TechStart SL, 40 hours of consulting at 75 EUR/hour, due March 1st"
Claude: Done. Invoice INV-2026-089 created. Total: 3,000.00 EUR + 21% IVA = 3,630.00 EUR.
158 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.
Try it instantly (no signup)
Kick the tires with zero setup — no account, no API key:
FRIHET_DEMO=1 npx -y @frihet/mcp-server
In demo mode the server answers from realistic example fixtures (Spanish invoices with IVA/IGIC, expenses, clients, products, a bank account, and more) — every record uses demo_-prefixed IDs and the server prints a DEMO MODE banner on startup. Nothing is persisted and no network call is ever made. Writes are simulated and fiscal actions (e-invoice, VeriFactu, TicketBAI, FACe, payroll) return a clearly-labeled simulation — never a real submission to any tax authority.
When you're ready for your real data, drop the flag and add your key (app.frihet.io → Settings → API keys). See Install below.
For AI agents
If you are an agent reading this repository rather than a person reading a page, everything you need is machine-readable and generated from the running server — you do not have to parse this README.
| What | Where |
|---|---|
| Onboarding contract: quickstart per client, auth, safe workflow, human-authority tool lists, error recovery | docs/agent-onboarding.json — also shipped inside the npm package |
Per-tool capability truth: callability, writesFrihet, externalInteraction, externalSideEffects | _meta["io.frihet/capability"] on every entry of tools/list |
| How to behave once connected | the instructions string returned by initialize — your client hands it to you automatically |
Three rules the contract encodes, in short:
- Orient before acting.
get_business_contextand thefrihet://tax/ratesresource decide the correct fiscal treatment. Do not recall a Spanish tax rate from memory. - Draft, show, stop.
create_invoice,create_quoteandcreate_credit_noteall default tostatus=draft— no fiscal number, no hash, nothing sent to a tax authority. Present the draft and hand back. - Human authority is not yours to assume. Any tool with a non-empty
externalSideEffectsreaches a client's inbox, a webhook, money, or AEAT / VeriFactu / TicketBAI / FACe. Several also takeconfirm=true; that flag records a human decision — never set it to satisfy your own plan.
docs/agent-onboarding.json is regenerated from the live surface by npm run generate:agent-onboarding and gated in CI by npm run gate:agent-onboarding, so its tool lists and counts cannot drift from the server.
Install
One-line (Claude Code, Cursor, Copilot, Codex, Windsurf, Gemini CLI, and more)
npx skills add Frihet-io/frihet-mcp
Claude Code plugin (skill + MCP server in one install)
This repository is also a Claude Code plugin (frihet-erp): installing it wires up both the business-management skill and the MCP server.
# Try it locally
claude --plugin-dir /path/to/frihet-mcp
Marketplace availability is pending. Use the local plugin command above or the Claude Code MCP command below to connect today.
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 → Settings → API keys).
Claude Code — one command
claude mcp add frihet -s user -e FRIHET_API_KEY=fri_your_key_here -- npx -y @frihet/mcp-server
claude mcp list # verify: frihet ✓ Connected
The CLI owns the config file, so there is nothing to hand-edit and no path to get wrong. (User scope writes ~/.claude.json, not ~/.claude/mcp.json.)
Codex CLI — one command
codex mcp add frihet --env FRIHET_API_KEY=fri_your_key_here -- npx -y @frihet/mcp-server
codex mcp list # verify
Codex config is TOML, not JSON. codex mcp add writes:
[mcp_servers.frihet]
command = "npx"
args = ["-y", "@frihet/mcp-server"]
[mcp_servers.frihet.env]
FRIHET_API_KEY = "fri_your_key_here"
Pasting a JSON
mcpServersblock into~/.codex/config.tomlis a TOML parse error that takes down your whole Codex config, not just this server. Use the command above.
Claude Desktop, Cursor, Windsurf, Cline — JSON config
{
"mcpServers": {
"frihet": {
"command": "npx",
"args": ["-y", "@frihet/mcp-server"],
"env": {
"FRIHET_API_KEY": "fri_your_key_here"
}
}
}
}
| Tool | Config file |
|---|---|
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Cursor | .cursor/mcp.json or ~/.cursor/mcp.json |
| Windsurf | ~/.windsurf/mcp.json |
| Cline | VS Code settings or .cline/mcp.json |
The JSON above is identical for these four clients; only the file path changes. Claude Code and Codex are not in this table — they manage their own config through the CLI commands shown above.
Remote (no install)
Use the hosted endpoint at mcp.frihet.io -- zero local dependencies, runs on Cloudflare Workers.
With API key:
{
"mcpServers": {
"frihet": {
"type": "streamable-http",
"url": "https://mcp.frihet.io/mcp",
"headers": {
"Authorization": "Bearer fri_your_key_here"
}
}
}
}
With OAuth 2.0 + PKCE (browser-based login, no API key needed):
Clients that support OAuth (Claude Desktop, Smithery, etc.) can connect directly to https://mcp.frihet.io/mcp and authenticate via browser. The server implements the full OAuth 2.1 authorization code flow with PKCE.
Get your API key
- Log into app.frihet.io
- Go to Settings > API
- Click Create API key
- Copy the key (starts with
fri_) -- it's only shown once
What you can do
Talk to your ERP. These are real prompts, not marketing copy.
Invoicing
"Show me all unpaid invoices"
"Create an invoice for Acme SL with 10h of consulting at 95/hour"
"Mark invoice abc123 as paid"
"How much has ClientName been invoiced this year?"
Expenses
"Log a 59.99 EUR expense for Adobe Creative Cloud, category: software, tax-deductible"
"List all expenses from January"
"What did I spend on travel last quarter?"
Clients
"Add a new client: TechStart SL, NIF B12345678, email admin@techstart.es"
"Show me all my clients"
"Update ClientName's address to Calle Mayor 1, Madrid 28001"
CRM
"Add a contact to Acme SL: Ana Garcia, CTO, ana@acme.es"
"Log a call with TechStart: discussed Q2 proposal, they're interested in upgrade"
"Add a note to ClientName: prefers invoices in English, payment NET 30"
"Show me all activities for Acme SL"
Quotes
"Create a quote for Design Studio: logo design (2000 EUR) + brand guidelines (3500 EUR)"
"Show me all pending quotes"
Webhooks
"Set up a webhook to notify https://my-app.com/hook when invoices are paid"
"List all my active webhooks"
What to expect
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 158 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.
Works great:
"Create an invoice for TechStart SL, 40h consulting at 75 EUR/h" --> creates the invoice
"Show unpaid invoices over 1,000 EUR" --> queries and filters
"Log a 120 EUR expense for the Madrid train, category: travel" --> records the expense
"Update client Acme's email to billing@acme.es" --> modifies the record
Does not do:
- OCR or PDF scanning -- you cannot upload an invoice image and have it read
- File upload or attachment handling
- Image processing of any kind
If you need to digitize paper invoices or receipts, extract the data first (e.g., Claude Vision API, a dedicated OCR service, or manual entry), then use the MCP to create the record:
1. Scan/photograph the invoice
2. Use Claude Vision: "Read this invoice image and extract the vendor, items, amounts, and dates"
3. Then: "Create an expense in Frihet for [extracted data]"
Catalogue operations (158)
Invoices (12)
| Tool | What it does |
|---|---|
list_invoices | List invoices with pagination |
get_invoice | Get full invoice details by ID |
create_invoice | Create a new invoice with line items |
update_invoice | Update any invoice field |
delete_invoice | Delete a draft invoice; a sent/paid one is cancelled, not destroyed (confirm=true required) |
search_invoices | Find invoices by client name, date, or status |
send_invoice | Email invoice to client (PDF attachment) — reaches a third party, confirm=true required |
mark_invoice_paid | Mark an invoice as paid with optional payment date |
get_invoice_pdf | Get bounded invoice PDF bytes as base64 |
get_invoice_einvoice | Get bounded XML or Factur-X PDF bytes for an invoice |
create_credit_note | Create a credit note linked to an existing invoice |
apply_late_fee | Apply a late payment fee to an overdue invoice |
Expenses (5)
| Tool | What it does |
|---|---|
list_expenses | List expenses with pagination |
get_expense | Get expense details |
create_expense | Record a new expense |
update_expense | Modify an expense |
delete_expense | Delete an expense |
Clients (5)
| Tool | What it does |
|---|---|
list_clients | List all clients |
get_client | Get client details |
create_client | Register a new client |
update_client | Update client info |
delete_client | Remove a client |
CRM: Contacts (3)
| Tool | What it does |
|---|---|
list_client_contacts | List all contacts for a client |
create_client_contact | Add a contact person to a client |
delete_client_contact | Remove a contact from a client |
CRM: Activities (2)
| Tool | What it does |
|---|---|
list_client_activities | List CRM activities (calls, emails, meetings, tasks) |
log_client_activity | Log a call, email, meeting, or task against a client |
CRM: Notes (3)
| Tool | What it does |
|---|---|
list_client_notes | List all notes for a client |
create_client_note | Add a free-form note to a client |
delete_client_note | Remove a note from a client |
Products (5)
| Tool | What it does |
|---|---|
list_products | List products and services |
get_product | Get product details |
create_product | Add a product or service |
update_product | Update pricing or details |
delete_product | Remove a product |
Quotes (6)
| Tool | What it does |
|---|---|
list_quotes | List all quotes |
get_quote | Get quote details |
create_quote | Draft a new quote |
update_quote | Modify a quote |
delete_quote | Delete only a clean draft with no delivery, response, attachment, or conversion evidence; refuse protected drafts; cancel non-drafts (confirm=true required) |
send_quote | Email quote to client for acceptance |
Webhooks (6)
| Tool | What it does |
|---|---|
list_webhooks | List configured webhooks |
get_webhook | Get webhook details |
create_webhook | Register a new webhook endpoint |
update_webhook | Modify events or URL |
delete_webhook | Remove a webhook |
test_webhook | Send a test payload to a configured webhook endpoint |
Intelligence (4)
| Tool | What it does |
|---|---|
get_business_context | Full snapshot: profile, plan, recent activity, top clients, current month |
get_monthly_summary | Monthly P&L: revenue, expenses, profit, tax liability, top clients by revenue |
get_quarterly_taxes | Quarterly tax prep: Modelo 303/130 fields, collected vs deductible, liability |
duplicate_invoice | Clone an invoice for recurring billing (copies items/client/tax, starts as draft) |
E-Invoicing (10)
| Tool | What it does |
|---|---|
send_einvoice | Dispatch an invoice in 11 formats (XRechnung, Factur-X, FatturaPA, PEPPOL, Facturae, UBL, CII) via email / Chorus Pro / SDI / PEPPOL / download |
get_einvoice_status | Poll Hatchet workflow run status until succeeded/failed — returns ackId, XML URL, PDF/A-3 URL |
validate_einvoice_xml | Validate raw XML against format schema + schematron rules (KOSIT / Mustang / XSD / Schematron) |
export_datev | Export accounting data as DATEV EXTF (Buchungsstapel / Debitoren / Kreditoren) in CP1252 encoding |
einvoice_export | Export e-invoice data in machine-readable formats (JSON/XML) for archival or integration |
face_submit | Submit invoice to FACe (Spain B2G government e-invoicing platform) |
face_status | Poll submission status from FACe for a submitted invoice |
ticketbai_submit | Submit TicketBAI fiscal record to Basque Country tax authority (Hacienda) |
ticketbai_status | Poll TicketBAI submission status from the Basque tax authority |
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 |
Time Tracking (6)
| Tool | What it does |
|---|---|
list_time_entries | List time entries with filter by user, project, date range, billable status |
get_time_entry | Get full details of a single time entry by ID |
create_time_entry | Log hours for a project (billable flag, description, date) |
update_time_entry | Update any field on an existing time entry (PATCH semantics) |
delete_time_entry | Soft-delete a time entry (confirm=true required) |
get_time_summary | Aggregate total/billable/non-billable hours for a period, with optional groupBy (user/project/day) |
Recurring Invoices (8)
| Tool | What it does |
|---|---|
list_recurring_invoices | List all recurring invoice templates (filter by active/paused) |
get_recurring_invoice | Get full details of a recurring template by ID |
create_recurring_invoice | Create a new recurring invoice template (daily/weekly/monthly/quarterly/yearly) |
update_recurring_invoice | Update template fields — affects future generated invoices only |
pause_recurring_invoice | Pause an active template — no invoices generated while paused |
resume_recurring_invoice | Resume a paused template — next invoice on next scheduled cycle |
delete_recurring_invoice | Permanently delete a template (confirm=true required) |
run_recurring_now | Manually trigger immediate generation of the next invoice instance |
Team Management (4)
| Tool | What it does |
|---|---|
list_team_members | List active members + pending invites (owner excluded) |
invite_team_member | Invite a new member by email with role (admin/editor/accountant/viewer) |
update_team_member_role | Change an existing member's role (admin/editor/accountant/viewer) |
remove_team_member | Remove a member from the workspace (confirm=true required) |
Gestoria — Accountants (5)
| Tool | What it does |
|---|---|
gestoria_message_send | Send a message in a contextual thread (documentRequest / filingItem / obligation) |
gestoria_messages_list | List messages in a thread, newest first; paginate backwards with before |
gestoria_template_create | Create a reusable document request template with variables + due-date offset |
gestoria_template_bulk_send | Bulk send a template to up to 500 client workspaces in one call |
gestoria_aging_consolidated | Cross-client AR aging report (buckets, per-workspace breakdown, top overdue) |
Audit GL (3)
| Tool | What it does |
|---|---|
frihet_gl_entry_approve | Approve a GL journal entry (gestor/admin only — TRUST AREA) |
frihet_gl_entry_reject | Reject a GL entry with a mandatory reason (TRUST AREA) |
frihet_gl_entry_audit_log | Retrieve full audit trail for a GL entry |
White-label Portal Domain (3)
| Tool | What it does |
|---|---|
frihet_portal_domain_add | Add a custom domain to the client portal (returns DNS CNAME records) |
frihet_portal_domain_verify | Verify DNS propagation for a custom portal domain |
frihet_portal_domain_remove | Remove a custom portal domain (reverts to default Frihet subdomain) |
Self-onboard & VIES (2)
| Tool | What it does |
|---|---|
frihet_portal_onboard_link_generate | Generate a time-limited self-onboard link for a prospective client |
frihet_tax_id_vies_lookup | Validate an EU VAT number (CIF intracomunitario) via VIES |
IGIC — Canary Islands Indirect Tax (4)
| Tool | What it does |
|---|---|
frihet_modelo_415_summary | M415 annual operations >€3,005 (Canarias equivalent of M347) — not deployed, returns NOT_DEPLOYED |
frihet_modelo_425_summary | M425 annual IGIC recap for Canary Islands businesses — not deployed, returns NOT_DEPLOYED |
frihet_modelo_418_summary | M418 monthly individual IGIC return, régimen especial del grupo de entidades — not deployed, returns NOT_DEPLOYED |
frihet_aiem_calculate | AIEM (Arbitrio Importación) calculation for Canarias — not deployed, returns NOT_DEPLOYED |
Impuesto sobre Sociedades — Corporate Tax (2)
| Tool | What it does |
|---|---|
frihet_modelo_200_summary | Modelo 200 annual IS return — not deployed, returns NOT_DEPLOYED |
frihet_modelo_202_summary | Modelo 202 installment payments (1P/2P/3P) — not deployed, returns NOT_DEPLOYED |
Bank Categorization Rules (2)
| Tool | What it does |
|---|---|
frihet_bank_rules_list | List all bank auto-categorization rules (conditions + actions + status) |
frihet_bank_rule_create | Create a new rule to auto-categorize transactions by description, amount, counterparty |
Deposits (7)
| Tool | What it does |
|---|---|
list_deposits | List deposits with pagination |
get_deposit | Get deposit details by ID |
create_deposit | Record a new client deposit |
update_deposit | Update deposit fields |
delete_deposit | Delete a deposit (confirm=true required) |
apply_deposit | Apply a deposit balance against an invoice |
refund_deposit | Issue a refund for a deposit |
Vendors (5)
| Tool | What it does |
|---|---|
list_vendors | List all vendors/suppliers |
get_vendor | Get vendor details |
create_vendor | Add a new vendor |
update_vendor | Update vendor info |
delete_vendor | Remove a vendor |
Banking (5)
Shortened here. Read the whole README on GitHub.
Signals
- GitHub stars
- 11
- Forks
- 3
- Last commit
- Oct 2026
- Weekly_downloads
- 294 weekly_downloads
Advanced
- Delivery
- erp MCP server → your Ahel connector (mcp.ahel.ai) → your AI.
- Item type
- mcp-server
- Key
io-frihet-erp- Source
- github.com/frihet-io/frihet-mcp
- Hosted endpoint
https://mcp.frihet.io/mcp
github.com/frihet-io/frihet-mcp
More in Commerce & finance
MCP server · mikeypetrillo
More in Commerce & financecrypto-quant-signal-mcp
MCP server · algovaultlabs
More in Commerce & financeHive Intelligence MCP
MCP server · hive-intel
More in Commerce & financekeryx
MCP server · tang-vu
More in Commerce & financetruss44-mcp-crypto-price
MCP server · truss44
More in Commerce & financetrading-mcp
MCP server · ai-rook
More in Commerce & finance