Beleggen is voor veel mensen een drempel vol jargon, angst en onzekerheid. Toch is vroeg beginnen met eenvoudige, gespreide ETF-beleggingen één van de krachtigste manieren om vermogen op te bouwen. Ik bouwde Beleggen Coach als een persoonlijk project om die drempel te verlagen — een slimme app die beginners begeleidt van profiel tot concreet beleggingsplan, aangedreven door AI en domeinspecifieke data. In deze publieke case study focus ik op de productarchitectuur, UX-flow en technische keuzes, zonder de private broncode of interne repositorystructuur bloot te geven.
Wat is Beleggen Coach?
Beleggen Coach is een full-stack webapplicatie die een gebruiker begeleidt door een gestructureerd onboardingproces: profiel opstellen, risicotolerantie bepalen, ETF-suggesties krijgen op maat en een persoonlijk beleggingsplan genereren. Onder de motorkap werkt het platform met een duidelijke scheiding tussen frontend, backend en zes domeinspecifieke MCP-services die elk een specifiek deel van de beleggingsflow aansturen.
Wat is MCP?
Model Context Protocol (MCP) is een open standaard van Anthropic waarmee AI-assistenten zoals GitHub Copilot tools kunnen aanroepen via een gestandaardiseerde interface. In Beleggen Coach fungeert elke MCP server als een slimme module die Copilot-agents kunnen bevragen voor domeinkennis — van ETF-data tot gedragscoaching.
Architectuur in lagen
Voor de publieke portfolio volstaat het om de oplossing in lagen te tonen. Zo blijft de architectuur helder voor bezoekers van vorsters.dev, terwijl de private implementatiedetails en interne code-structuur afgeschermd blijven.
- Een Next.js frontend voor onboarding, ETF-overzichten en het persoonlijke beleggingsplan.
- Een FastAPI backend die profieldata, aanbevelingslogica en planopbouw orkestreert.
- Zes MCP-services voor profielintelligentie, ETF-screening, marktdata, plansimulatie, gedragscoaching en leercontent.
- Een gedeelde product- en documentatielaag zodat features, copy en AI-flow consistent kunnen evolueren.
Waarom geen repository dump?
Op vorsters.dev wil ik vooral tonen hoe het product werkt, welke architectuurkeuzes relevant zijn en welke businesswaarde eruit komt. De private broncode, interne mapstructuur en implementatiedetails blijven bewust buiten de publieke case study.
De systeemarchitectuur
De architectuur volgt een gelaagd model. De Next.js frontend communiceert via REST/JSON met de FastAPI backend. De backend beheert de PostgreSQL database (via SQLAlchemy async) en een Redis cache voor sessiedata en snelle opzoekingen. Daaronder hangen de MCP servers als autonome modules die via het stdio-protocol aangesproken worden door Copilot. Externe diensten zoals Clerk (authenticatie), OpenAI API (AI chat) en Yahoo Finance (live koersen) worden op de juiste lagen geïntegreerd.
Next.js App Router
Server Components voor snelle initiële laadtijd, Client Components voor interactieve dashboards. Routing via /dashboard, /etfs, /plan, /learn, /chat, /portfolio en /analytics.
FastAPI + uv
Async Python API met SQLAlchemy 2.0 en Alembic voor migraties. uv als supersnelle package manager vervangt pip/poetry. Routers per domein: onboarding, etfs, portfolio, chat.
PostgreSQL + Redis
PostgreSQL voor persistente data (profielen, posities, check-ins). Redis voor cache, sessiegeheugen bij AI chat en dagelijks herberekende ETF-rankings.
MCP via stdio
Elke MCP server draait als een onafhankelijk Python-proces. Copilot roept tools aan via het stdio-protocol. Elke tool geeft een gestandaardiseerd { success, data, error } object terug.
De zes MCP servers uitgelegd
Het hart van het AI-aspect van Beleggen Coach is het netwerk van zes domeinspecifieke MCP servers. Elk bedient een specifiek expertisedomein en kan onafhankelijk worden getest, gedeployed en geüpgraded. Dit is een fundamenteel ander patroon dan één grote AI-aanroep: kennis is verdeeld over specialisten.
investor-profile-mcp — Risicoscore
Ontvangt de onboarding-antwoorden (beleggingshorizon, risicobereidheid, maandelijkse inleg, leeftijd) en berekent een genormaliseerde risicoscore (0-100). Hogere score = hogere risicotolerantie = meer aandelengewicht in het plan.
etf-data-mcp — Screening & ranking
Beheert een gecureerde ETF-database met metadata: TER, categorie, regio, benchmark, historische volatiliteit. De tool get_top3_for_profile() combineert profiel-fit met marktdata en momentum voor een dagelijks bijgewerkte Top 3.
market-data-mcp — Live koersen
Haalt live en historische koersen op via yfinance of Alpha Vantage. Berekent volatiliteit, YTD-rendement en drawdown versus historisch gemiddelde. Wordt gecached in Redis om API-rate-limits te respecteren.
portfolio-plan-mcp — Beleggingsplan
Genereert een concreet beleggingsplan op basis van doelkapitaal, tijdshorizon, maandelijkse inleg en gekozen ETFs. Simuleert ook toekomstige portefeuillegroei met verwacht rendement en inflatiocorrectie.
behavior-coach-mcp — Gedragscoaching
Begeleidt de gebruiker bij emotionele beslissingen. Maandelijkse check-ins vragen naar gevoel, nieuws-invloeden en bereidheid om het plan aan te passen. De coach detecteert patroonafwijkingen en stuurt bij met motiverende inzichten.
learning-content-mcp — Leermateriaal
Levert gepersonaliseerd leermateriaal: artikelen, quizzen en mini-lessen op basis van het profiel van de gebruiker en zijn voortgang. Beginner krijgt andere content dan iemand die al 2 jaar belegt.
Custom Copilot Agents als AI-ontwikkelteam
Naast de runtime-MCP-servers bevat het project ook custom Copilot agents in .github/agents/. Dit zijn gespecialiseerde agents die ik gebruik tijdens de ontwikkeling zelf — niet op productie. Ze kennen de volledige codebase, de architectuurprincipes en de product-specs. Zo heb ik agents voor frontend componenten, API-routers, database-migraties en productanalyse die elk hun eigen expert-context meekrijgen via een gedetailleerde agent.md instructie.
# .github/copilot-instructions.md (fragment)
## Stack
- Frontend: Next.js 14 App Router, TypeScript, Tailwind CSS
- Backend: FastAPI, Python 3.12, SQLAlchemy 2.0 async, Alembic
- Database: PostgreSQL (via Docker), Redis
- Package manager: pnpm (monorepo), uv (Python)
- MCP: stdio protocol, elk eigen Python-package
## Principes
- Gebruik altijd async/await in FastAPI routes
- MCP tools returnen altijd { success: bool, data: ..., error: str | None }
- TypeScript strict mode — geen any-types
- Elke nieuwe feature begint met een migratie-bestandFase 6: de roadmap
Het project is opgezet in fasen. De eerste vijf fasen legden de fundering: onboarding flow, ETF-database, beleggingsplan, leercentrum en maandelijkse check-in. Fase 6 brengt het platform naar een volwassen productieniveau met zeven grote toevoegingen: login & authenticatie via Clerk, een volledig uitgebreid dashboard, AI-chatinterface met streaming, top-3 ETF-aanbevelingen op basis van live marktdata, portefeuille-opvolging, analytisch overzicht en een gecureerde bronpagina.
Fase 6 prioritering
Login & Auth is de basis voor alles persoonlijk. Daarna Dashboard → Bronpagina → Portefeuille → Top 3 ETFs → AI Chat → Analytics. De bronpagina is bewust vroeg gepland: geen afhankelijkheden, snel te bouwen, direct waarde voor de gebruiker.
AI Chat met guardrails
De AI-chatfunctie is technisch interessant én verantwoordelijk complex. De chat-router in FastAPI stuurt de gebruikersvraag naar OpenAI GPT-4o met een systeem-prompt die de context bevat: gebruikersprofiel, huidig plan, en relevante ETF-data opgehaald via MCP. Streaming via Server-Sent Events zorgt voor een vloeiende gebruikerservaring. Wat ik bewust niet doe: expliciete koopadvies geven. De guardrails in de systeem-prompt zorgen dat de AI altijd een disclaimer toevoegt en geen "koop nu" statements maakt.
# apps/api/src/routers/chat.py (vereenvoudigd)
@router.post("/chat")
async def chat(request: ChatRequest, user: TokenData = Depends(get_current_user)):
profile = await get_user_profile(user.user_id)
etf_context = await etf_data_mcp.get_top3_for_profile(profile.id)
system_prompt = f"""
Je bent een beleggingscoach voor beginners.
Gebruikersprofiel: {profile.model_dump_json()}
Huidige Top 3 ETFs: {etf_context}
REGELS:
- Geef nooit expliciete koop- of verkoopadvies
- Voeg altijd toe: "Dit is geen financieel advies."
- Leg termen uit in gewone taal
- Verwijs door naar een financieel adviseur bij complexe vragen
"""
async for chunk in openai_stream(system_prompt, request.messages):
yield f"data: {chunk}\n\n"Wat ik leerde van dit project
- MCP is een game-changer voor AI-geïntegreerde applicaties: kennis opdelen in domeinspecifieke servers maakt het systeem veel onderhoudbaarder dan één grote AI-aanroep
- uv als Python package manager is razendsnel — een volledige sync van een nieuw project duurt seconden in plaats van minuten
- pnpm monorepo + turborepo zorgt voor een nette scheiding maar vereist discipline in het beheer van gedeelde types
- Guardrails in de systeem-prompt zijn niet optioneel voor een financiële applicatie — ze zijn de eerste verdedigingslinie tegen onjuist advies
- Redis als cache voor ETF-data vermijdt dat elke gebruikersinteractie een dure API-call triggert naar Yahoo Finance of Alpha Vantage
- Custom Copilot agents tijdens ontwikkeling versnellen het werk aanzienlijk — ze kennen de architectuurprincipes en code-conventies beter dan een generieke AI
De beste beleggingsapp is niet de slimste — het is de meest begrijpbare. AI helpt niet door het antwoord te geven, maar door de vraag te verduidelijken.
De code bekijken
De broncode van Beleggen Coach blijft bewust privé. In deze write-up deel ik wel de architectuurkeuzes, de productstructuur en de belangrijkste lessen uit de bouw van het platform, zonder de volledige implementatie publiek te maken.
Disclaimer
Beleggen Coach is een persoonlijk leer- en demonstratieproject. De app geeft geen financieel advies. Alle ETF-suggesties en beleggingsplannen zijn puur informatief. Raadpleeg een gecertificeerd financieel adviseur voor persoonlijk beleggingsadvies.
