MCP-server
Frihets MCP-server implementerer Model Context Protocol, så AI-assistenter kan interagere direkte med dit ERP. Opret fakturaer, registrer udgifter, forespørg kunder eller administrer tilbud — alt sammen fra dit IDE eller terminal, på naturligt sprog.
Nuværende version: 1.5.1 | 52 værktøjer | 11 ressourcer | 10 prompts | Struktureret output | Kompatibel med 30+ AI-agenter.
Du: "Opret en faktura til TechStart SL, 40 timers konsulentarbejde til 75 EUR/time, forfaldsdato 1. marts"
Claude: Udført. Faktura INV-2026-089 oprettet. Total: 3.000,00 EUR + 21% moms = 3.630,00 EUR.
Hvad du kan forvente (og hvad ikke)
MCP-serveren er en stateless bro mellem din AI-assistent og Frihets REST API. Hvert værktøjskald oversættes til en HTTP-anmodning til API'en.
Hvad den GØR:
- Komplet CRUD på fakturaer, udgifter, kunder, produkter, tilbud og webhooks
- Søgning af fakturaer efter kundenavn
- Adgang til referencedata (skattesatser, skattekalender, kategorier)
- Guidede arbejdsgange (månedlig afslutning, skatteforberedelse, opfølgning på skyldnere)
Hvad den IKKE GØR:
- OCR af dokumenter (det gør AI-assistenten inde i appen)
- Generering af PDF'er (brug REST API'en direkte:
GET /v1/invoices/:id/pdf) - Betalingsbehandling (betalinger håndteres via Stripe Connect i appen)
Krav
- Frihet-konto med API-adgang (betalingsplaner)
- API-nøgle genereret fra panelet
Sådan får du API-nøglen
- Log ind på app.frihet.io
- Gå til Indstillinger > Udviklere > API Keys
- Klik på Opret API-nøgle
- Kopier nøglen (starter med
fri_) — den vises kun én gang
Installation
Universal (30+ agenter)
Den hurtigste måde at installere MCP-serveren og forretningskompetencen på:
npx skills add Frihet-io/frihet-mcp
Fungerer med Claude Code, Cursor, Copilot, Codex, Windsurf, Gemini CLI, Goose, Roo Code og 30+ andre agenter.
MCP Registry
Serveren er registreret som io.frihet/erp i det officielle MCP Registry. MCP-klienter der understøtter registret kan automatisk opdage og installere det via dets kanoniske navn.
Direkte npx
npx -y @frihet/mcp-server@latest
Du behøver ikke at installere noget globalt. npx downloader og kører automatisk den seneste version.
Manuel konfiguration
Der er to forbindelsestilstande: lokal (serveren kører på din maskine via npx) og fjern (direkte forbindelse til mcp.frihet.io, uden installation).
Lokal (stdio)
{
"mcpServers": {
"frihet": {
"command": "npx",
"args": ["-y", "@frihet/mcp-server@latest"],
"env": {
"FRIHET_API_KEY": "fri_din_noegle_her"
}
}
}
}
Fjern (streamable-http)
{
"mcpServers": {
"frihet": {
"type": "streamable-http",
"url": "https://mcp.frihet.io/mcp",
"headers": {
"Authorization": "Bearer fri_din_noegle_her"
}
}
}
}
Klientkonfiguration
JSON-strukturen er identisk på tværs af alle klienter. Kun placeringen af konfigurationsfilen ændrer sig.
| Klient | Konfigurationsfil |
|---|---|
| Claude Code | ~/.claude/mcp.json |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) |
| Cursor | .cursor/mcp.json eller ~/.cursor/mcp.json |
| Windsurf | ~/.windsurf/mcp.json |
| Cline | Konfiguration af VS Code eller .cline/mcp.json |
| Codex CLI | ~/.codex/config.toml (MCP-sektion) |
Hvis du bruger Claude Code, kan du tilføje serveren med en enkelt kommando:
claude mcp add frihet -- npx -y @frihet/mcp-server@latest
Konfigurer derefter variablen FRIHET_API_KEY i den resulterende fil ~/.claude/mcp.json.
Miljøvariabler
| Variabel | Påkrævet | Standardværdi |
|---|---|---|
FRIHET_API_KEY | Ja | -- |
FRIHET_API_URL | Nej | https://api.frihet.io/v1 |
FRIHET_MCP_DEBUG | Nej | 0 |
FRIHET_API_URLer nyttig, hvis du peger på et staging-miljø eller en tilpasset instans. Det skal værehttps://med et hostname underfrihet.io.FRIHET_MCP_DEBUG=1aktiverer debug-niveau logs (nyttigt til diagnosticering af problemer).
OAuth-flow
MCP-serveren understøtter OAuth-autentificering ud over manuel API-nøgle. Når en MCP-klient starter OAuth-flow'et:
- Brugeren autentificerer via Firebase Auth (e-mail, Google, GitHub eller Microsoft)
- Klienten sender sessionstokenet til
POST /api/oauth/api-key - Serveren provisionerer en ny nøgle
fri_xxx...mærket "MCP OAuth" med en udløbsdato på 365 dage - Nøglen bruges automatisk til efterfølgende kald
Dette gør det muligt for brugere at forbinde MCP-serveren uden at kopiere nøgler manuelt.
Tilgængelige værktøjer (52)
Serveren eksponerer 52 værktøjer organiseret i 7 kategorier. Hvert værktøj inkluderer struktureret output (outputSchema + structuredContent), så assistenter kan parse svar pålideligt, samt sikkerheds- og indholdsannotationer. Tosproget (EN/ES).
Fakturaer (6 værktøjer)
| Værktøj | Beskrivelse | Nøgleparametre |
|---|---|---|
list_invoices | Liste fakturaer med paginering | limit, offset |
get_invoice | Henter en faktura efter ID | id |
create_invoice | Opretter en faktura med detaljerede linjer | clientName, items[] (description, quantity, unitPrice), status, dueDate, notes, taxRate |
update_invoice | Opdaterer felter i en faktura (delvis) | id, og ethvert felt der skal ændres |
delete_invoice | Sletter en faktura permanent | id |
search_invoices | Søger fakturaer efter kundenavn | clientName, limit, offset |
Mulige fakturastatusser: kladde, sendt, betalt, forfalden, annulleret
Udgifter (5 værktøjer)
| Værktøj | Beskrivelse | Nøgleparametre |
|---|---|---|
list_expenses | Liste udgifter med paginering | limit, offset |
get_expense | Henter en udgift efter ID | id |
create_expense | Registrerer en ny udgift | description, amount, category, date, vendor, taxDeductible |
update_expense | Ændrer en eksisterende udgift (delvis) | id, og ethvert felt der skal ændres |
delete_expense | Sletter en udgift permanent | id |
Kunder (5 værktøjer)
| Værktøj | Beskrivelse | Nøgleparametre |
|---|---|---|
list_clients | Liste alle kunder | limit, offset |
get_client | Henter en kunde efter ID | id |
create_client | Registrerer en ny kunde | name, email, phone, taxId, address (street, city, state, postalCode, country) |
update_client | Opdaterer data for en kunde (delvis) | id, og ethvert felt der skal ændres |
delete_client | Sletter en kunde permanent | id |
Produkter (5 værktøjer)
| Værktøj | Beskrivelse | Nøgleparametre |
|---|---|---|
list_products | Liste produkter og services | limit, offset |
get_product | Henter et produkt efter ID | id |
create_product | Opretter et produkt eller en service | name, unitPrice, description, taxRate |
update_product | Ændrer et eksisterende produkt (delvis) | id, og ethvert felt der skal ændres |
delete_product | Sletter et produkt permanent | id |
Tilbud (5 værktøjer)
| Værktøj | Beskrivelse | Nøgleparametre |
|---|---|---|
list_quotes | Liste tilbud | limit, offset |
get_quote | Henter et tilbud efter ID | id |
create_quote | Opretter et tilbud til en kunde | clientName, items[] (description, quantity, unitPrice), validUntil, notes, status |
update_quote | Ændrer et tilbud (delvis) | id, og ethvert felt der skal ændres |
delete_quote | Sletter et tilbud permanent | id |
Mulige tilbudsstatusser: kladde, sendt, accepteret, afvist, udløbet
Webhooks (5 værktøjer)
| Værktøj | Beskrivelse | Nøgleparametre |
|---|---|---|
list_webhooks | Liste konfigurerede webhooks | limit, offset |
get_webhook | Henter konfiguration af en webhook | id |
create_webhook | Registrerer et webhook-endpoint | url, events[], active, secret |
update_webhook | Ændrer en eksisterende webhook | id, og ethvert felt der skal ændres |
delete_webhook | Sletter en webhook permanent | id |
Tilgængelige webhook-begivenheder: invoice.created, invoice.updated, invoice.deleted, invoice.paid, expense.created, expense.updated, expense.deleted, client.created, client.updated, client.deleted, product.created, product.updated, product.deleted, quote.accepted. Se Webhooks for payload-format og HMAC-verifikation.
Tilgængelige ressourcer (8)
MCP-ressourcer er referencedata, som assistenten kan forespørge uden at foretage API-kald. De er statiske og altid tilgængelige.
| Ressource | URI | Beskrivelse |
|---|---|---|
| API-skema | frihet://api/schema | Oversigt over endpoints, autentificering, rate limits og fejlkoder |
| Skattesatser | frihet://tax/rates | moms (21/10/4%), IGIC (7/3/0%), IPSI, intra-EU, IRPF (15%/7%) |
| Skattekalender | frihet://tax/calendar | Fristdatoer for kvartalsvis indberetning (Model 303, 130, 420, 390) |
| Udgiftskategorier | frihet://config/expense-categories | 8 kategorier med regler for fradrag og skattemæssig behandling |
| Fakturastatusser | frihet://config/invoice-statuses | Statusflow (kladde, sendt, betalt, forfalden, annulleret) med triggere |
| Leverandører | frihet://config/vendors | Liste over registrerede leverandører med skatte- og kontaktoplysninger |
| Aktive integrationer | frihet://config/integrations | Status for tilsluttede integrationer (Stripe, Shopify osv.) |
| Virksomhedskonfiguration | frihet://config/business | Virksomhedens skatteoplysninger, skattezone, valuta og præferencer |
Tilgængelige prompts (7)
Prompts er guidede arbejdsgange, som assistenten udfører trin for trin. De påkaldes efter navn.
| Prompt | Beskrivelse | Parametre |
|---|---|---|
monthly-close | Månedlig afslutning: gennemgår ubetalte fakturaer, kategoriserer udgifter, verificerer skattemæssige forpligtelser, genererer resume | month (valgfrit) |
onboard-client | Klient onboarding: bestemmer skattesats baseret på placering, opretter registrering, genererer velkomsttilbud | clientName, country, region |
quarterly-tax-prep | Kvartalsvis skatteforberedelse: indsamler fakturaer, beregner moms/IGIC, genererer preview af Model 303/130 | quarter, fiscalZone |
overdue-followup | Opfølgning på skyldnere: identificerer forfaldne fakturaer, grupperer efter kunde, udarbejder rykkermeddelelser | — |
expense-batch | Batchbehandling af udgifter: kategoriserer, anvender skatter, verificerer fradragsberettigelse, opretter med bekræftelse | fiscalZone |
vendor-analysis | Leverandøranalyse: grupperer udgifter efter leverandør, beregner totaler, identificerer tendenser og besparelsesmuligheder | period (valgfrit) |
business-health | Virksomhedens sundhedsdiagnose: Nøgle-KPI'er, sammenligning med forrige måned, alarmer og handlingsorienterede anbefalinger | month (valgfrit) |
Du kan påkalde en prompt direkte: "Udfør den månedlige afslutning for februar" eller "Forbered skatterne for Q1".
Eksempler på brug
Disse er virkelige anmodninger på naturligt sprog, som assistenten oversætter til MCP-værktøjskald.
Opret en faktura
"Opret en faktura til Acme SL med 10 timers konsulentarbejde til 95 EUR/time, forfaldsdato 15. marts"
Assistenten kalder create_invoice med clientName: "Acme SL", en detaljelinje (10 x 95) og dueDate: "2026-03-15". Den beregner totalen automatisk.
Registrer en udgift
"Registrer en udgift på 59.99 EUR i Adobe Creative Cloud, kategori software, fradragsberettiget"
Kalder create_expense med description, amount: 59.99, category: "software" og taxDeductible: true.
Søg fakturaer fra en kunde
"Søg alle fakturaer fra TechStart SL"
Kalder search_invoices med clientName: "TechStart SL" og returnerer match med deres totaler og statusser.
Forespørg skyldnere
"Vis mig alle ubetalte fakturaer"
Kalder list_invoices og filtrerer efter status: "sent" eller "overdue", viser de forfaldne sorteret efter beløb.
Opret en kunde
"Ny kunde: Design Studio SL, NIF B87654321, email hola@designstudio.es, Madrid 28001"
Kalder create_client med navn, NIF, email og adresse.
Konfigurer automatisering
"Opret en webhook til at give besked til https://mi-app.com/hook, når en faktura betales"
Kalder create_webhook med url og events: ["invoice.paid"].
Opdater et produkt
"Øg prisen på konsulenttimen til 85 EUR"
Kalder update_product med produktets id og unitPrice: 85. Kun det angivne felt ændres.
Observabilitet
MCP-server v1.5.1 inkluderer struktureret logging og værktøjsmetrics.
Struktureret logging
Alle logs udstedes som JSON til stderr (MCP bruger stdout til protokollens meddelelser). Hver post inkluderer:
level:debug,info,warn,errorservice: altidfrihet-mcptimestamp: ISO 8601tool: værktøjets navn (når relevant)operation: operationstype (tool_call,api_call,api_retry,startup,shutdown_metrics)durationMs: udførelsestid i millisekundererror: fejldetaljer (message, code, statusCode)
Aktiver debug-logs med FRIHET_MCP_DEBUG=1.
Værktøjsmetrics
Serveren registrerer kald til hvert værktøj i hukommelsen: antal påkaldelser, fejl og gennemsnitlig varighed. Ved servernedlukning (SIGINT/SIGTERM) udsendes en oversigt:
{
"level": "info",
"message": "Shutdown after 3600s — 42 calls, 1 errors",
"operation": "shutdown_metrics",
"metadata": {
"tools": {
"list_invoices": { "calls": 15, "errors": 0, "avgMs": 230 },
"create_invoice": { "calls": 8, "errors": 1, "avgMs": 450 }
},
"uptime": 3600
}
}
Automatisk rate-limit retry
Når API'en svarer med 429, genforsøger serveren automatisk med eksponentiel backoff (op til 3 genforsøg). Genforsøgene logges:
{
"level": "warn",
"message": "Rate limited, retrying GET /invoices (attempt 2, delay 2000ms)",
"operation": "api_retry"
}
Du behøver ikke at håndtere rate limiting manuelt — serveren gør det for dig.
Transport
Frihets MCP-server understøtter to transporttilstande. Begge eksponerer de samme 52 værktøjer, 11 ressourcer og 10 prompts.
Lokal (stdio)
Serveren kører som en lokal proces på din maskine. Kommunikation mellem MCP-klienten og serveren bruger standard input/output (stdin/stdout).
- Kræver: Node.js installeret (downloades automatisk via
npx) - Fordel: Lavere latenstid, fungerer uden internetforbindelse (undtagen for API-kald)
- Anvendelsesscenarie: Daglig udvikling, intensiv brug, virksomhedsmiljøer med netværksbegrænsninger
Fjern (streamable-http)
Serveren kører på Cloudflare Workers. Din MCP-klient forbinder direkte til https://mcp.frihet.io/mcp via HTTP.
- Kræver: Kun internetforbindelse
- Fordel: Ingen lokal installation, ingen afhængigheder, fungerer på enhver enhed
- Anvendelsesscenarie: Hurtig opsætning, teams der foretrækker ikke at installere pakker, klienter der kun understøtter HTTP-transport
Hvis din MCP-klient ikke understøtter streamable-http (nogle ældre klienter understøtter kun stdio), brug den lokale tilstand.
Fejlhåndtering
Rate limiting
API'en tillader 100 anmodninger pr. minut pr. nøgle. Hvis grænsen overskrides, returnerer serveren en 429-fejl med ventetiden i retryAfter.
MCP-serveren håndterer automatisk rate limiting med eksponentiel backoff: genforsøger anmodningen efter at have ventet den angivne tid, uden brugerindgriben. Maksimalt 3 genforsøg.
Autentificeringsfejl
| Kode | Årsag | Løsning |
|---|---|---|
401 | API-nøgle ugyldig, udløbet eller ikke angivet | Verificer at nøglen i din konfiguration starter med fri_ og ikke er udløbet |
403 | Nøglen har ikke tilladelse til denne ressource | Generer en ny nøgle med de nødvendige tilladelser |
Andre fejl
| Kode | Beskrivelse |
|---|---|
400 | Forkerte parametre eller manglende påkrævede felter |
404 | Den anmodede ressource findes ikke |
408 | Timeout for anmodning (30 sekunder) |
413 | Anmodningskroppen overskrider 1 MB |
422 | Gyldige, men ubehandlingsdygtige data (f.eks. skatteprofil ikke konfigureret) |
429 | Grænse for anmodninger overskredet (forsøges automatisk igen) |
500 | Intern serverfejl |
Alle fejl returnerer en beskrivende tosproget (EN/ES) meddelelse, så assistenten kan kommunikere problemet klart til brugeren.
Grænser
| Koncept | Værdi |
|---|---|
| Anmodninger pr. minut | 100 pr. API-nøgle |
| Resultater pr. side | 100 maks. (50 som standard) |
| Anmodningskrop | 1 MB maks. |
| Webhook-payload | 100 KB maks. |
| Webhooks pr. konto | 20 maks. |
| Anmodningstimeout | 30 sekunder |
| Genforsøg pr. rate limit | 3 maks. |
Forskel fra REST API'en
| MCP-server | REST API | |
|---|---|---|
| Rettet mod | AI-assistenter (Claude, Cursor, Windsurf) | Applikationer, scripts, integrationer |
| Kommunikation | Naturligt sprog via MCP-klienten | Direkte HTTP/JSON |
| Autentificering | Miljøvariabel i klientkonfigurationen (eller OAuth) | Header X-API-Key eller Authorization: Bearer |
| Format | Formateret tekst + struktureret output til assistenten | Rå JSON |
| Rate limiting | Håndteres automatisk (eksponentiel backoff, 3 genforsøg) | Manuel (forbrugeren skal implementere genforsøg) |
| Observabilitet | Struktureret logging + metrics pr. værktøj | Anmodningslogs via X-Request-Id |
| Anvendelsesscenarie | Tal med dit ERP fra IDE'en | Byg programmatiske integrationer |
Internt oversætter MCP-serveren hvert værktøjskald til en anmodning til REST API'en. Den duplikerer ikke logik — det er en stateless bro.
Udvikling
For at bidrage eller køre serveren i udviklingstilstand:
git clone https://github.com/Frihet-io/frihet-mcp.git
cd frihet-mcp
npm install
npm run build
Kør lokalt:
FRIHET_API_KEY=fri_din_noegle node dist/index.js
Kør med debug-logs:
FRIHET_MCP_DEBUG=1 FRIHET_API_KEY=fri_din_noegle node dist/index.js
Test med MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.js
Relaterede ressourcer
- REST API — Komplet reference til endpoints, autentificering og fejlkoder
- Webhooks — Tilgængelige begivenheder, HMAC-SHA256 verifikation og retry-politik
- Skill til Claude Code — Forretningsintelligenslag oven på MCP-serveren
- Kildekode (GitHub) — Repository for MCP-serveren
- npm-pakke —
@frihet/mcp-server@1.5.1 - MCP Registry —
io.frihet/erp - Fjern endpoint — MCP-server hostet på Cloudflare Workers
- MCP-specifikation — Protokoldokumentation