De klant
Voor een gespecialiseerd administratiekantoor met ruim 100 klantadministraties ontwikkelen we een AI-automatiseringsstack bovenop hun bestaande boekhoudplatform (Yuki). De klant verzorgt voor uiteenlopende bedrijven de administratie en boekhouding. Een operatie waar volume, auditbaarheid en compliance allemaal tegelijk moeten kloppen.
De klant wordt op verzoek niet bij naam genoemd; technische details staan los van klant-specifieke gegevens.
Het probleem
De klant gebruikt al jaren een gevestigd boekhoudplatform met een eigen IDR-stack (OCR, classificatie, leveranciersherkenning per document). Dat platform doet één ding goed: per individueel document de juiste basisgegevens extraheren. Wat het niet doet:
- Patronen herkennen over administraties heen. Als leverancier X altijd op grootboekrekening Y wordt geboekt bij administratie A, dan zou je willen dat de stack dat ook voorstelt bij administratie B
- Een operator pro-actief signaleren dat een bekend type document ergens vastloopt in de workflow
- Eén-klik boeking uitvoeren via de SOAP API zodra de operator akkoord geeft
- Multi-admin rapportages genereren zonder dat de operator door 100+ administraties heen handmatig CSV's exporteert
Met 100+ administraties wordt elk van die handelingen exponentieel duurder. Dat is precies waar onze stack invult.
Onze positionering: complementair, niet vervangend
Een belangrijke ontwerpkeuze: we vervangen de IDR-functies van het boekhoudplatform niet. Wij positioneren onze stack expliciet complementair. Het boekhoudplatform doet wat het goed doet (per-document recognition). Onze stack voegt de cross-administratie laag toe: orchestratie, leverancier-naar-grootboek-suggesties op basis van historie, één-klik boeking, en monitoring van waar het platform's eigen automatisering strandt.
Dat onderscheid voorkomt eindeloze re-implementaties en houdt onze stack scherp gefocust op waar de echte winst zit.
De architectuur
We hebben de stack in zes lagen ontworpen, elk met een eigen verantwoordelijkheid:
1. Invoer: documenten en triggers
- E-mail intake via Gmail PubSub
- Webhook intake (POST
/hooks/document-intake) - Handmatige upload via het admin dashboard
- Geplande taken (nightly sync 02:00, retry elk uur, ochtend-review)
2. Intake-server
Express-server die binnenkomende PDF's deduplicaat (SHA-256 + supplier|invoice|amount), opslaat, en de AI-orkestratielaag triggert.
3. AI-orkestratielaag
Een lokaal draaiende MCP-compatible agent gateway die zeven gespecialiseerde AI-skills coördineert:
| Skill | Rol |
|---|---|
| Admin context | Administratieve context laden voor beslissingen |
| Document archief | PDF opslaan in het boekhoudplatform |
| Leverancier match | Factuur koppelen aan bekende leverancier |
| Voorstel bouwen | Boekingsvoorstel genereren incl. GL-rekening |
| Exception review | Afwijkingen en uitzonderingen afhandelen |
| Review callback | Goedkeuring of afwijzing van operator verwerken |
| Nightly sync | Lokale datastore syncen met het boekhoudplatform |
De agents praten met het boekhoudplatform via twee MCP-servers: een voor de SOAP API (29 tools), en een eigen browser-automatiserings-MCP (op Playwright) voor functionaliteit die niet via SOAP beschikbaar is. Die SOAP-MCP-server hebben we open source gepubliceerd zodat de community er ook van kan profiteren.
4. Policy-engine
Voor elk boekingsvoorstel bepaalt een expliciete policy welke van drie uitkomsten geldt:
| Uitkomst | Conditie | Actie |
|---|---|---|
| Auto-post | Exacte match, bedrag onder drempelbedrag | Automatisch geboekt |
| Review queue | Waarschijnlijke match, bedrag boven drempel | Naar operator |
| Dead letter | Duplicaat of harde blokkering | Vastgehouden voor handmatige actie |
De drempelbedragen en regels zijn configureerbaar per klant en per type leverancier, zodat de policy uitlegbaar en bijstuurbaar blijft.
5. Mens-in-de-loop via Telegram
Uitzonderingen worden niet weggegooid maar actief voorgelegd. Voor elke review- of dead-letter-factuur ontvangt de operator een Telegram-bericht met inline knoppen: goedkeuren, afwijzen, of opnieuw aanbieden. De beslissing wordt teruggestuurd via een review-callback en gelogd in de audit trail.
6. Admin dashboard
Next.js admin-dashboard waar de operator:
- per administratie de workflow-status ziet (open, data-entry voltooid, in behandeling, afgehandeld)
- multi-admin rapportages genereert (grootboeksaldi, afschrijvingen, salariskosten, workflow)
- de policy-engine bijstuurt (drempels, leveranciersregels, GL-labels)
- de audit trail doorzoekt voor compliance-vragen
7. Infra: observability en self-healing
- PM2 voor procesbeheer
- Watchdog die de gateway gezondheid pollt, automatisch herstart, en Telegram-alerts stuurt bij storingen
- Circuit breaker patronen: maximaal aantal herstarts per uur om vastgelopen state te voorkomen
- Onveranderlijk audit-logboek in SQLite: elke beslissing, prompt en tool-call is naderhand reproduceerbaar
Wat we hebben opgeleverd zonder iets te claimen wat niet kan
Op het moment van schrijven draait de stack nog niet volledig in productie. We kiezen bewust voor een zorgvuldige uitrol per pipeline-onderdeel, met de klant nauw betrokken bij elke stap. Wat al werkt:
- Volledige documentintake-pipeline (e-mail, webhook en upload, met deduplicatie)
- AI-skills voor archivering, leverancier-matching en voorstel-generatie
- Policy-engine met drie-staat classificatie
- Telegram-integratie voor mens-in-de-loop
- Multi-administratie nightly sync (100+ administraties via SOAP)
- Admin dashboard met workflow-overzichten en rapportages
- Watchdog met self-healing
- Open-source MCP server gepubliceerd op npm en GitHub
Op de roadmap:
- Cross-admin GL-suggesties op basis van
supplier_gl_history - Volledige multi-admin rapportage-pipeline
- Geleidelijke uitrol naar productie per klantadministratie
Wat we hieruit meenemen
Deze opdracht heeft ons stevige patronen opgeleverd die we nu ook bij andere klanten kunnen toepassen:
- Complementair bouwen in plaats van vervangen: accepteer wat bestaande platforms goed doen en richt je op de witte vlek
- MCP als integratiestandaard voor AI-agents: productie-grade, audit-baar en herbruikbaar
- Policy-engine voor agent autonomie: schrijf expliciet op wat de AI wel en niet mag, in plaats van te hopen dat het model zich gedraagt
- Mens-in-de-loop als feature, niet als fallback: operator-knoppen via Telegram of Slack maken automatisering juist sneller adopteerbaar
- Audit trail als basis voor vertrouwen: onveranderlijke logging maakt elke AI-beslissing achteraf uitlegbaar
- Open source publiceren wat generiek genoeg is om los te koppelen, versterkt expertise én geeft community-feedback terug
Stack en aanpak
| Laag | Keuze |
|---|---|
| Runtime | Node.js 20+, TypeScript (strict, ESM) |
| Monorepo | npm workspaces |
| Frontend dashboard | Next.js 16 (App Router), React 19, Tailwind CSS |
| Backend (intake) | Express 5 |
| Database | SQLite via better-sqlite3 (lokaal, snel, audit-trail-friendly) |
| Browser automation | Playwright (Chromium) |
| AI-protocol | Model Context Protocol (@modelcontextprotocol/sdk) |
| LLM | Claude (via MCP-compatible agent gateway) |
| Mens-in-de-loop | Telegram bot met inline keyboards |
| Process mgmt | PM2 met ecosystem-config en cron_restart |
| Hosting | Dedicated lokale machine + SMB-mount voor logs/db |
| Testing | Vitest |
Voor wie is dit relevant?
- Accountantskantoren met tientallen of honderden klantadministraties die cross-admin automatisering willen
- Finance-organisaties die hun bestaande boekhoudplatform willen versterken met AI zonder lock-in
- Software-partners die agentic workflows willen bouwen rondom een SOAP- of REST-API
- Iedereen die overweegt hoe AI veilig in een productieproces te integreren met audit trail en menselijke controle
Gerelateerd
- Open source MCP server die uit dit project voortkwam
- Technische blogpost over MCP en boekhouding
- Onze AI-diensten
Zelf met AI-orkestratie aan de slag?
Heb je een proces dat over tientallen administraties of vestigingen verspreid is, en wil je verkennen hoe AI je orchestratie en rapportage kan versnellen, met behoud van controle en compliance? Plan een vrijblijvend gesprek via info@codemill.dev of het contactformulier. We denken graag mee.
