Jonathan Kongolo

Fullstack developer · AI & MCP

← Projects

Karibu Help — MCP server and AI guide for newcomers to Norway

, , , ,
Role
Tech lead & backend developer
Period
2025
Client / context
Karibu Help — team of two developers plus social work expertise
Tech stack
TypeScript, Model Context Protocol SDK, OpenAI, PostgreSQL with pgvector, cheerio, zod, Docker, Vitest, Playwright
Outcome
Live at karibuhelp.no, serving ten languages with voice input and spoken answers.

Newcomers to Norway have to search across UDI, NAV, Helsenorge, the municipality and the tax authority to work out how to get a residence permit, a doctor, housing, a driving licence, language classes or a job. Every agency explains its own part; nobody explains how they connect. And all of it assumes you read Norwegian or English well.

Karibu Help puts that in one place. Users ask freely and get answers grounded in official sources, in ten languages, with voice input and spoken responses — so language ability is not what decides whether you find out what you are entitled to.

I was tech lead and backend developer in a team of two developers, with social work expertise on needs analysis and content review. I owned the architecture and the technical decisions. The core I built is an MCP server in TypeScript with over sixteen tools a language model can call directly: immigration, healthcare, housing, the introduction programme, language courses, student information, job search, employer verification, consumer rights, driving licences, journey planning, nearby places, weather, emergency help and checklists for new arrivals. Every tool has schema-validated input and output through zod, so the model gets predictable responses instead of free text.

The knowledge base is built by an ingestion pipeline I wrote. The crawler reads sitemaps, respects robots.txt, rate-limits itself, extracts main content from HTML, detects language and categorises before storing. Text is chunked, embedded through OpenAI and stored in PostgreSQL with pgvector, so the tools do semantic search against the source material. That is a RAG architecture: answers are grounded in ingested sources rather than in the model’s own weights — which matters when a wrong answer about a residence permit or a healthcare entitlement has real consequences for the person asking.

As tech lead I set up the codebase the project runs on — three buildable parts sharing a library: the MCP server, the shared code and the web interface — plus scripts for migrations, ingestion, embedding and administration. I also established the test strategy and development workflow: unit tests in Vitest with coverage reporting, end-to-end tests in Playwright, and ESLint and Prettier across the codebase. Everything runs in Docker with compose locally and deploy scripts for production.

A significant part of the work was collaborating with the social work side of the team. They know which questions newcomers actually have and where the information breaks down in practice; my job was translating that into tools, data model and ingestion strategy. It shaped which sources we prioritised and how answers are presented.

More projects