Kort antwoord
Je koppelt Exact Online aan Claude door een eigen MCP-server te bouwen die met OAuth 2.0 tegen de REST API van Exact praat en die je als remote server (Streamable HTTP, met OAuth 2.1 aan de Claude-kant) toevoegt als custom connector in Claude of via de MCP connector van de Claude API. Je hebt nodig: een app-registratie in de Exact App Store met client-ID, client-secret en een publieke HTTPS-redirect, een afgebakende set endpoints en tools, hosting op een publieke HTTPS-URL, en op Team of Enterprise een Owner die de connector toevoegt. Reken bij ons op 2 tot 4 weken en vanaf €5.000 voor alleen lezen, €7.500 tot €15.000 als Claude ook conceptfacturen mag aanmaken.
Van lezen naar doen.
Een access-token van Exact Online verloopt na 10 minuten, en een refresh-token dat 30 dagen niet gebruikt is, is dood (Exact, Step 3: Get and use access tokens, 2026). Die twee getallen bepalen of je Exact-koppeling met Claude na de demo nog werkt.
De demo is namelijk het makkelijke deel. Een MCP-server die één keer een klant opzoekt, bouw je in een middag; een server die na drie weken vakantie nog inlogt, het dagbudget van Exact niet opmaakt en geen factuur verwerkt zonder dat iemand kijkt, is het werk.
Deze pagina loopt die zes stappen af, specifiek voor Exact Online en specifiek voor de bouw.
Wat MCP is en wanneer je het nodig hebt, staat op wat MCP (Model Context Protocol) is; wat het kost, op wat een MCP-server kost.
Wat je bouwt: twee OAuth-lagen, één server
Het plaatje is simpel en wordt toch bijna altijd verkeerd getekend. Claude praat niet met Exact; Claude praat met jouw MCP-server, en jouw MCP-server praat met Exact.
Dat betekent twee losse autorisaties. Aan de Claude-kant is je MCP-server een OAuth 2.1 resource server: Claude haalt een token bij jouw autorisatieserver en biedt dat bij elk verzoek aan (MCP-autorisatiespecificatie, protocolversie 2026-07-28).
Aan de Exact-kant is diezelfde server een OAuth 2.0-client: hij bezit een client-ID en client-secret uit de Exact App Store en beheert per gebruiker een access- en refresh-token van Exact. De specificatie is hard over de scheiding: een MCP-server "MUST NOT accept or transit any other tokens", dus het Claude-token gaat nooit door naar Exact en het Exact-token nooit terug naar Claude.
Praktisch gevolg: je server heeft een eigen kluis nodig die een Claude-gebruiker koppelt aan een Exact-token en een administratie (division). Dat kluisje is het onderdeel dat in "even een MCP-server maken" ontbreekt.
Twee andere ontwerpkeuzes volgen uit de bronnen. Een server voor een team draait remote op een publieke HTTPS-URL met Streamable HTTP, waarbij elk bericht een HTTP POST naar één MCP-endpoint is (MCP-transports 2026-07-28); de Claude API accepteert bovendien uitsluitend die remote vorm (MCP connector van de Claude API).
Stap 1: app-registratie en OAuth 2.0 bij Exact Online
Alles begint in de Exact App Store, niet in code. Daar maak je een app-registratie aan en krijg je een client-ID en client-secret (Exact, Step 1: Get Client ID and Client Secret, 2026).
Drie regels uit die pagina bepalen je opzet meteen:
- De redirect-URI moet een publieke HTTPS-URL zijn; localhost of http geeft een 401.
- Sandbox- of testomgevingen bestaan niet; op de pagina over API-limieten adviseert Exact "strongly" maximaal vier app-registraties per app, één per DTAP-fase (ontwikkeling, test, acceptatie, productie) (Exact, API limits, 2026).
- Een app die alleen je eigen account gebruikt, werkt direct; pas als andere Exact-klanten hem moeten kunnen koppelen, komt de review van Exact erbij.
Dan de autorisatie zelf. Je stuurt de gebruiker naar /api/oauth2/auth met client_id, redirect_uri en response_type=code; na inloggen (twee-staps-verificatie zit in de flow) kiest de gebruiker in het consent-scherm welke administraties de app mag benaderen, en komt er een autorisatiecode terug die drie minuten geldig is (Exact, Step 2: Set up authorization requests, 2026).
Die code wissel je met een POST naar /api/oauth2/token om voor een access-token met expires_in: 600 en een refresh-token. De tokenregels uit de documentatie van Exact zijn strikter dan bij de meeste API's:
| Regel | Waarde volgens Exact | Wat het voor je server betekent |
|---|---|---|
| Geldigheid access-token | 600 seconden | Bewaar de verlooptijd per token aan je eigen kant |
| Vroegste moment om te verversen | 570 seconden na ontvangst | Eerder verversen geeft 401 "Access Token not expired" |
| Geadviseerd verversmoment | niet eerder dan 30 seconden vóór verloop | Eén timer per token, geen verversen per call |
| Geldigheid refresh-token | 30 dagen (sinds juli 2021) | Onbruikt na 30 dagen: gebruiker moet opnieuw autoriseren |
| Autorisatiecode | 3 minuten, eenmalig | De callback moet direct omwisselen, niet in een wachtrij |
Bron: Exact, Step 3, 2026. Eén regel staat er niet letterlijk, maar wel in onze koppelingsdocumentatie: het refresh-token roteert bij elke vernieuwing, dus twee processen die tegelijk verversen verbruiken elkaars token en leggen de koppeling stil tot iemand opnieuw inlogt (zie onze pagina over de Exact Online API en data/service-features/exact-online-koppeling.ts).
De rate limits horen ook bij deze stap, omdat ze per app en per administratie gelden. Exact publiceert 60 calls per minuut en 5.000 per dag per company, een HTTP 429 bij overschrijding, en de tellers in de headers X-RateLimit-Minutely-Remaining, X-RateLimit-Remaining en X-RateLimit-Reset (Exact, API limits, 2026).
Twee limieten uit diezelfde pagina kent bijna niemand, en ze zijn voor een AI-koppeling gevaarlijker dan de daglimiet. Meer dan 10 fouten (400, 401, 403 of 404) per uur, per API-key, per gebruiker, per administratie en per endpoint blokkeert je key tijdelijk voor een uur, en bij herhaling oplopend.
En calls zonder administratiecode in de URL, zoals /api/v1/current/Me, tellen niet mee voor de daglimiet. Dat is precies het endpoint waarmee je de division ophaalt, dus die stap is gratis.
Bij een Exact Online Premium-abonnement noemt dezelfde pagina een totaal van 30.000 calls per dag, zonder limiet per app.
Stap 2: endpoints en rechten kiezen
Nu de vraag die het ontwerp bepaalt: wat mag Claude zien en wat mag Claude doen? De verleiding is om "alles" te koppelen; de REST API-referentie van Exact telt honderden resources (Exact, REST API resources, 2026).
Wij beginnen met vijf leestools en één schrijftool. Dat is onze eigen indeling; de endpointpaden en toegestane HTTP-methoden komen letterlijk uit de referentie van Exact, de statuswaarden uit de detailpagina van SalesInvoices.
| Exact-endpoint | Methoden bij Exact | MCP-tool (ons ontwerp) | Lezen/schrijven | Autorisatie |
|---|---|---|---|---|
/api/v1/current/Me |
GET | intern: administratie (division) bepalen | lezen | Exact-token van de gebruiker; telt niet mee in de daglimiet |
/{division}/crm/Accounts |
GET, POST, PUT, DELETE | zoek_klant (alleen GET) |
lezen | MCP-scope exact:read; administraties uit het consent-scherm |
/{division}/read/financial/ReceivablesList |
GET | openstaande_facturen |
lezen | MCP-scope exact:read |
/{division}/salesinvoice/SalesInvoices |
GET, POST, PUT, DELETE | factuur_details (alleen GET) |
lezen | MCP-scope exact:read |
/{division}/logistics/Items |
GET, POST, PUT, DELETE | zoek_artikel (alleen GET) |
lezen | MCP-scope exact:read |
/{division}/financial/GLAccounts |
GET, POST, PUT, DELETE | grootboekschema (als resource, niet als tool) |
lezen | MCP-scope exact:read |
/{division}/salesinvoice/SalesInvoices + SalesInvoiceLines |
POST | maak_conceptfactuur |
schrijven | MCP-scope exact:write; standaard uit; bevestiging door een mens |
/{division}/financialtransaction/TransactionLines |
GET | bewust niet in versie 1 | lezen | pas na een kwartaal productie |
Drie toelichtingen bij die tabel.
De autorisatie-aanvraag van Exact kent geen scope-parameter. De documentatie noemt alleen client_id, redirect_uri, response_type en force_login; de begrenzing zit in de administraties die de gebruiker in het consent-scherm aanvinkt. Wat Claude mag, regel je daarom aan jouw kant: de scopes exact:read en exact:write zijn scopes van je MCP-server, niet van Exact.
Een conceptfactuur is bij Exact een open factuur. Nieuwe verkoopfacturen krijgen standaard status 20 (open) en zijn dan nog te wijzigen; verwerken naar status 50 gebeurt bij het afdrukken en is daarna onomkeerbaar. De tool maak_conceptfactuur doet dus een POST en stopt bij status 20; het afdrukken en versturen blijft mensenwerk.
Bij een POST naar SalesInvoices moet je de regels meesturen. De detailpagina zegt letterlijk dat je een parameter voor SalesInvoiceLines moet opnemen bij het aanmaken; een factuur zonder regels bestaat niet. Je tool valideert daarom eerst artikel, aantal en btw-code voordat hij Exact aanroept, want elke afgewezen call telt mee in het foutbudget van 10 per uur.
Wat er bewust níet in staat: aflettering en betalingen. Volgens onze koppelingsdocumentatie heeft afletteren geen REST-endpoint en loopt het via de oudere XML-API; dat is een klassieke koppeling, geen tool voor een taalmodel.
Stap 3: de MCP-server bouwen
Een MCP-server publiceert tools, resources en prompts. Voor Exact zijn de tools de handelingen uit de tabel, en is het grootboekschema een resource: het wijzigt zelden en Claude heeft het nodig om een boekingsvoorstel te begrijpen, maar hoeft het niet elke keer op te halen.
Bouw de server in de officiële SDK's (TypeScript of Python) en kies Streamable HTTP als transport; Claude ondersteunt dat en het oudere HTTP+SSE-transport wordt uitgefaseerd (Claude, Building custom connectors, 2026). Hosten kan op een edge-platform of op Nederlandse hosting; de afweging staat op de kostenpagina.
Dan het autorisatiewerk dat de meeste tijd kost. Volgens de specificatie moet je server Protected Resource Metadata publiceren (RFC 9728), bij elk token controleren dat het specifiek voor deze server is uitgegeven (RFC 8707) en een verlopen of ongeldig token met een 401 beantwoorden.
Claude legt daar zijn eigen eisen naast, en die staan niet in de MCP-spec (Claude, Authentication for connectors, 2026):
- Claude registreert zichzelf via Dynamic Client Registration of een Client ID Metadata Document; een pure machine-tot-machine-flow zonder gebruiker is niet ondersteund.
- Elke autorisatie-aanvraag bevat een PKCE-challenge (S256); je autorisatieserver moet dat adverteren.
- De eerste aanroep zonder token moet een 401 geven met een
WWW-Authenticate-header die naar je resource-metadata wijst; een header op een 200 negeert Claude. - Je token-endpoint moet
application/x-www-form-urlencodedaccepteren en binnen 10 seconden antwoorden; een refresh binnen 30 seconden. - De callback-URL voor Claude.ai, Desktop en mobiel is
https://claude.ai/api/mcp/auth_callback; Claude Code gebruikt een loopback-adres met wisselende poort. - Verkeer van Anthropic komt uit het bereik
160.79.104.0/21, handig als je firewall een allowlist voert.
Zo een autorisatieserver hoef je niet zelf te schrijven; hostingplatforms als Cloudflare bieden hem mee, en er zijn bibliotheken voor. Wat je wél zelf bouwt, is de koppeling tussen de Claude-identiteit die uit dat token komt en het Exact-token in je kluis.
Binnen elke tool doen we dan drie dingen die niets met MCP te maken hebben en alles met Exact. We lezen de X-RateLimit-headers en knijpen af vóór de 429; we cachen stamdata zoals artikelen en grootboekrekeningen; en we valideren invoer lokaal voordat er een call uitgaat, vanwege het foutbudget.
De laatste ontwerpregel gaat over de grootte van antwoorden. Claude.ai en Desktop kappen een tool-resultaat af rond 150.000 tekens en wachten maximaal 240 seconden per tool-aanroep (Claude, Building custom connectors, 2026), dus openstaande_facturen pagineert met $top en $select in plaats van de hele debiteurenlijst terug te geven.
Stap 4: aansluiten op Claude
Er zijn drie routes, en welke je kiest hangt af van wie er met de koppeling werkt.
Medewerkers in de Claude-app (Team of Enterprise). Een Owner gaat naar Organization settings, kiest Connectors, dan Add en Custom, vult de URL van je MCP-server in en optioneel een eigen OAuth-client-ID en secret (Claude, Third party connectors with remote MCP, 2026). Leden zien de connector daarna onder Customize en klikken Connect, waarna ze zelf de OAuth-flow doorlopen.
Dat laatste is belangrijk voor de Exact-kant: elke medewerker autoriseert apart en krijgt dus zijn eigen Exact-token in jouw kluis, met de administraties die híj heeft aangevinkt. Op Free, Pro en Max kan een gebruiker een custom connector zelf toevoegen onder Customize, maar die plannen hebben geen verwerkersovereenkomst; daarover meer in stap 5.
Eigen software via de Claude API. Daar sluit je de server aan met de MCP connector: beta-header mcp-client-2025-11-20, een mcp_servers-definitie met een https-URL en een authorization_token, en een mcp_toolset in de tools-array waarmee je per tool aan- of uitzet (MCP connector van de Claude API, 2026).
Let op twee beperkingen die de documentatie noemt. De connector ondersteunt alleen tools, geen resources of prompts, dus het grootboekschema lever je in die route als tekst in de systeemprompt; en het OAuth-token voor je MCP-server haal je zelf op en ververs je zelf, de API doet die flow niet voor je.
Wat de API-route kost, hangt af van het model en de tool-definities die bij elk verzoek meegaan; de tokentabel staat op het tarievenoverzicht van de Claude API. Bouwen wij die software, dan valt het onder AI-agents als de agent zelfstandig handelt, of onder maatwerk software als de MCP-server bij een grotere applicatie hoort.
Ontwikkelaars in Claude Code. Eén commando, claude mcp add, en de status onder /mcp; dat is ook de snelste manier om de autorisatieflow van je server te testen voordat een Owner hem voor het team toevoegt.
Stap 5: rechten, veiligheid en de verwerkersovereenkomst
Een AI die je boekhouding kan lezen, vraagt om een allowlist op drie lagen. Elke laag vangt een andere fout op.
| Laag | Wat je instelt | Waarom |
|---|---|---|
| Exact (consent-scherm) | alleen de administraties die de gebruiker nodig heeft | een holding met acht administraties geeft niet acht keer toegang |
| Je MCP-server | exact:read standaard, exact:write alleen na expliciete vrijgave |
schrijven vraagt validatie, foutafhandeling en een bevestigingsstap |
| Claude | schrijftools op Blocked, of in de API enabled: false als standaard met een allowlist |
ook een goed gebouwde tool wil je per team kunnen uitzetten |
De documentatie van Claude zegt het zelf: klik alleen op "Always allow" bij servers die je vertrouwt, en blokkeer losse tools die je niet nodig hebt onder Customize, Connectors. In de API is een denylist voor schrijvende of destructieve tools de aanbevolen vorm voor een leesassistent.
Begin alleen-lezen. In onze koppelingen zetten we schrijftools standaard uit tot de leesroute een paar weken klopt, en maak_conceptfactuur stopt ook daarna bij status 20: Claude stelt op, een mens verwerkt.
Voer een auditlog. Log elke tool-aanroep met gebruiker, administratie, endpoint en resultaat; Exact adviseert zelf om alle API-calls te loggen en je verkeer met hun tellers te vergelijken, en voor de AVG heb je dat spoor nodig om te kunnen uitleggen wie welke debiteurgegevens heeft opgevraagd.
Reken op prompt-injectie via je eigen data: een factuuromschrijving of klantnotitie uit Exact komt als tool-resultaat in de context van Claude, en de documentatie van Claude waarschuwt daar expliciet voor.
Geef daarom nooit vrije tekstvelden door die je niet nodig hebt, en laat een schrijftool nooit handelen op basis van tekst die uit een leestool kwam.
Dan de verwerkersovereenkomst: debiteuren, contactpersonen en openstaande posten zijn persoonsgegevens, dus je hebt een DPA met Anthropic nodig. Die zit in de voorwaarden van Team, Enterprise en de API en niet bij Free, Pro en Max, zoals we uitwerken op de pagina over de Claude-verwerkersovereenkomst.
Twee aanvullingen voor MCP specifiek: de MCP connector van de API valt niet onder zero data retention, en de partij die je MCP-server host is óók verwerker, dus met ons of met je hostingpartij sluit je een eigen overeenkomst.
Stap 6: testen en live gaan
Omdat Exact geen sandbox biedt, test je tegen een echte administratie. Wij doen dat met een aparte app-registratie voor test, met alle schrijftools uit, en pas in de laatste week met exact:write op een administratie waarin een open factuur geen schade doet.
De volgorde die bij ons werkt:
- Test de autorisatieflow van je MCP-server met de MCP inspector voordat je Claude erbij haalt; de flow met het 401-antwoord en de resource-metadata is waar de meeste eerste pogingen stranden.
- Sluit de server aan in Claude Code met
claude mcp adden laat een ontwikkelaar de vijf leestools één voor één aanroepen. - Laat de server 15 minuten draaien en controleer of de tokenverversing rond minuut 10 goed gaat, niet vóór seconde 570 en niet ná verloop.
- Roep bewust een tool aan met een onbestaand klant-ID en kijk of je validatie de call tegenhoudt vóór Exact hem afwijst; anders eet je foutbudget op.
- Simuleer een dag: tel de calls per medewerker per uur en zet dat af tegen 5.000 per administratie.
- Laat een Owner de connector toevoegen op Team of Enterprise, laat twee medewerkers verbinden en controleer in je auditlog dat ze elk hun eigen Exact-token en administraties hebben.
- Zet een wekelijkse healthcheck-call per token aan, zodat een refresh-token niet ongemerkt 30 dagen ongebruikt blijft.
- Zet
exact:writepas aan na een akkoord van de boekhouder op een reeks conceptfacturen die Claude heeft opgesteld.
Wat gebeurt er als je stap 4 en 7 overslaat? Dan werkt de koppeling tot de eerste zomervakantie en valt hij stil op de dag dat de enige gebruiker terugkomt, precies wanneer de achterstand het grootst is.
Valkuilen uit de praktijk
Deze tabel is van ons. De oorzaken en oplossingen komen uit onze koppelingsdocumentatie voor Exact Online (data/service-features/exact-online-koppeling.ts, data/blog/posts/exact-online-api-uitgelegd.ts) en uit de bronnen op deze pagina; het zijn ontwerpregels, geen projectmetingen.
| Valkuil | Wat er misgaat | Wat wij doen | Bron |
|---|---|---|---|
| Twee processen verversen tegelijk | het roterende refresh-token is verbruikt, koppeling stil tot herautorisatie | één lock rond het verversen, één token per gebruiker per administratie | onze koppelingsdocumentatie |
| Te vroeg verversen | 401 "Access Token not expired" vóór seconde 570 | verlooptijd per token opslaan, verversen 30 seconden vóór verloop | Exact, Step 3 |
| Refresh-token 30 dagen onbenut | gebruiker moet opnieuw inloggen, meestal op het slechtste moment | wekelijkse healthcheck-call per token | Exact, Step 3 |
| Division vergeten | vrijwel elke call faalt of raakt de verkeerde administratie | /current/Me bij het eerste gebruik, division als vaste toolparameter |
onze koppelingsdocumentatie; Exact, API limits |
| Foutbudget van 10 per uur | API-key een uur geblokkeerd, oplopend bij herhaling | invoer lokaal valideren, geen eindeloze retries, exponentiële backoff | Exact, API limits |
| 60 per minuut, 5.000 per dag | HTTP 429, koppeling plat tot de teller reset | X-RateLimit-headers uitlezen, afknijpen, stamdata cachen |
Exact, API limits; onze koppelingsdocumentatie |
| Geen sandbox | testen op productie zonder het door te hebben | aparte app-registratie voor test, schrijftools uit tijdens de bouw | Exact, Step 1 (geen sandbox); Exact, API limits (DTAP-advies) |
| Redirect-URI op localhost of http | 401 bij de autorisatie | publieke HTTPS-URL, letterlijk gelijk aan de registratie | Exact, Step 1 en 2 |
Geen $expand |
factuurregels vragen een aparte call per factuur | resultaat in de tool samenstellen, pagineren, $select gebruiken |
onze koppelingsdocumentatie |
| Token doorgeven aan Exact | strijdig met de MCP-spec, en een lek zodra één laag faalt | eigen kluis: Claude-identiteit naar Exact-token, nooit andersom | MCP-autorisatiespecificatie |
| Tool-resultaat te groot | afgekapt rond 150.000 tekens, of time-out na 240 seconden | $top, $select, samenvatten in de tool |
Claude, Building custom connectors |
| Traag token-endpoint | verbinding faalt bij meer dan 10 seconden | autorisatieserver los van de Exact-calls, geen upstream-werk in de token-route | Claude, Authentication for connectors |
Wat het kost en wanneer je het laat bouwen
Een MCP-server op Exact Online is bij ons een koppeling met een AI-laag, en dus geprijsd als koppeling. Uit data/service-features/api-koppelingen-systeemintegratie.ts: vanaf €5.000 in één richting (alleen lezen), €7.500 tot €15.000 als Claude ook mag schrijven, beheer €150 tot €500 per maand, live in 2 tot 4 weken tegen een vaste prijs na scoping.
Moet er een agent omheen die zelfstandig taken afhandelt, dan geldt de band uit data/services/ai-agents.ts: €2.500 setup en €350 per maand voor een basis agent, €4.500 en €500 per maand voor een geavanceerde agent met meerdere koppelingen. Zit de AI ín een nieuwe applicatie, dan start één ingebouwde AI-feature bij €8.500 (data/services/ai-software.ts), en de Snelstart-band van €5.000 uit data/pricing/tiers.ts is expliciet zonder externe systeemkoppelingen.
De volledige rekensom met hosting, tokens en beheer staat op wat een MCP-server kost; een prijsindicatie voor jouw administratie krijg je zonder verplichting.
Zelf bouwen is een reële optie als je een ontwikkelaar hebt die OAuth als resource server heeft gedaan. Laat je het door ons bouwen, dan is de scoping een gesprek van een paar uur over de tabel uit stap 2: welke tools, welke administraties, lezen of schrijven.
Bel ons op 085 016 0118 of beschrijf je administratie en je wensen in het contactformulier: je krijgt een tools-lijst en een vaste prijs terug.
Wij bouwen Claude-first en de server bindt je daar niet aan: MCP is een open standaard, dus dezelfde Exact-server werkt met andere MCP-clients. Welk model bij welk werk past, staat op de index over AI-modellen vergelijken; de API-uitleg van Exact zelf, zonder de AI-laag, houden we op de pagina over de Exact Online API.
Opgesteld met AI-ondersteuning, geredigeerd en inhoudelijk verantwoord door Bram Dokman.










