claude-code mcp knowledge-base sqlite tutorial

MCP + Claude Code : construis ta knowledge base IA privée

Samuel De Queiroz

Ton IA a le QI d’un génie mais la mémoire d’un poisson rouge.

Tu lui expliques ton business, tes clients, ta stack technique. Elle répond brillamment. Tu fermes la session. Le lendemain, tu recommences à zéro.

J’ai résolu ce problème en 2 heures. Pas avec un RAG cloud à 200$/mois. Pas avec un vector store hébergé chez un tiers. Avec un serveur MCP privé qui tourne sur un Mac Mini dans mon bureau.

Le problème : une IA amnésique dans un business qui a besoin de contexte

Je suis consultant et formateur IA. Mon quotidien, c’est jongler entre des clients (Cdiscount, SFR, des fondations), des projets SaaS, de la création de contenu, et de la prospection. Chaque tâche nécessite du contexte métier que Claude ne peut pas deviner.

Quand je demande à Claude Code de rédiger un article pour mon blog, il ne sait pas que mon style c’est “expert accessible, pas corporate”. Quand je lui demande de préparer une formation, il ne connaît pas mes clients ni leurs problématiques spécifiques. Quand je travaille sur mon SaaS médical CotaCheck, il n’a aucune idée des 405 codes CCAM que j’ai déjà validés.

La solution classique ? Le RAG. Tu découpes tes documents en chunks, tu génères des embeddings, tu stockes ça dans un vector store, et tu interroges le tout avant chaque prompt. Ça marche, mais c’est une usine à gaz pour un consultant solo.

La solution : MCP, le standard qui change tout

MCP — Model Context Protocol — est le protocole ouvert créé par Anthropic pour connecter Claude à des sources de données externes. Pas un hack. Pas un wrapper. Un standard, avec un SDK officiel et une spécification publique.

L’idée est simple : au lieu de coller du contexte manuellement dans chaque prompt, tu donnes à Claude Code accès à un serveur qui sait chercher dans tes documents. Claude interroge le serveur quand il en a besoin. Automatiquement.

Concrètement, j’ai construit un serveur qui expose 3 outils :

  • search_knowledge : recherche full-text dans tous mes documents
  • get_document : récupère un document complet par son nom
  • list_topics : liste tout ce qui est indexé

Claude Code les appelle comme n’importe quel outil. Pas de prompt engineering. Pas de copier-coller. Le contexte arrive quand il faut.

Le stack : Bun + SQLite FTS5 + SDK MCP

Voici ce que j’utilise. Tout est volontairement simple.

Bun pour le runtime. Plus rapide que Node.js, SQLite intégré nativement (pas besoin de compiler des bindings C), et le TypeScript marche out of the box.

SQLite FTS5 pour la recherche full-text. Pas d’embeddings, pas de vector store, pas d’API externe. FTS5 est un module natif de SQLite qui crée un index inversé sur tes textes. Tu cherches “formation Claude Cdiscount”, il trouve les chunks pertinents en millisecondes. Pour un corpus de quelques dizaines de documents métier, c’est largement suffisant — et infiniment plus simple qu’un pipeline RAG classique.

Le SDK MCP officiel (@modelcontextprotocol/sdk) pour exposer les outils à Claude Code via HTTP.

L’architecture en 30 secondes

Mon Mac Mini "Alexandria" (always-on)
├── Bun + MCP Server (port 3100)
├── SQLite FTS5 (knowledge.db)
└── corpus/ (mes fichiers .md)

Mon Mac principal "Cerveau"
├── Claude Code
└── settings.json → MCP: alexandria @ 100.64.78.7:3100

Deux machines connectées via Tailscale (VPN mesh, gratuit). Claude Code sur Cerveau interroge Alexandria automatiquement. Mes données ne quittent jamais mon réseau.

Le serveur MCP en 100 lignes

Le coeur du serveur tient en un fichier TypeScript. Voici la structure simplifiée :

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { Database } from "bun:sqlite";

const db = new Database("knowledge.db");
const server = new McpServer({ name: "alexandria", version: "1.0.0" });

// Outil de recherche full-text
server.tool("search_knowledge", "Cherche dans la knowledge base",
  { query: z.string(), limit: z.number().default(10) },
  async ({ query, limit }) => {
    const results = db.prepare(`
      SELECT heading, content, filename
      FROM chunks_fts
      JOIN chunks ON chunks.id = chunks_fts.rowid
      JOIN documents ON documents.id = chunks.document_id
      WHERE chunks_fts MATCH ?
      LIMIT ?
    `).all(query, limit);
    return { content: [{ type: "text", text: formatResults(results) }] };
  }
);

L’ingestion est tout aussi simple : tu lis tes fichiers Markdown, tu les découpes par titres H2/H3, et tu insères les chunks dans SQLite avec les triggers FTS5 qui maintiennent l’index automatiquement.

L’ingestion du corpus

Mon corpus actuel, c’est 23 documents Markdown :

  • 7 fiches de contexte projet : chaque projet a sa fiche avec l’objectif, les décisions prises, les connexions avec d’autres projets
  • 9 briefs de veille hebdomadaire : mes résumés des annonces IA de chaque semaine
  • 5 fiches machines : la documentation de mon infrastructure
  • 1 audit technique : l’audit complet de ma base CCAM pour CotaCheck
  • 1 mémoire système : l’état global de mes projets et décisions

Résultat : 351 chunks indexés en quelques secondes. Pas d’embeddings à calculer, pas de GPU nécessaire, pas de latence.

Ce que ça change au quotidien

Avant : le copier-coller permanent

Moi : "Rédige un article sur les subagents Claude Code"
Claude : *rédige un article générique*
Moi : "Non, dans MON style. Direct, pas corporate, avec des exemples terrain..."
Claude : *deuxième tentative*
Moi : "Et mentionne mes formations, mon offre L'Écosystème Claude..."
Claude : *troisième tentative*

Après : le contexte arrive automatiquement

Moi : "Rédige un article sur les subagents Claude Code"
Claude : *interroge Alexandria → trouve mon style éditorial,
          mes archétypes de marque, mon offre de formation,
          mes hooks qui marchent sur LinkedIn*
Claude : *rédige un article dans MON style du premier coup*

La différence, c’est que Claude a accès à tout mon contexte métier avant même de commencer à écrire. Il sait que mon ton est “sage + créateur + magicien”. Il sait que les hooks “Interdit / Cheaté” sont mes plus viraux sur LinkedIn. Il sait que mon CTA pointe vers un appel découverte sur Cal.com.

Les limites (soyons honnêtes)

FTS5 n’est pas un vector search. Il cherche des mots, pas des concepts. Si tu cherches “IA médicale”, il ne trouvera pas un document qui parle de “diagnostic assisté par ordinateur” sans mentionner “IA” ni “médical”. Pour un corpus métier où tu contrôles le vocabulaire, c’est rarement un problème. Pour un corpus large et hétérogène, un vrai RAG avec embeddings serait plus adapté.

Le corpus doit être maintenu manuellement. Quand tu écris une nouvelle fiche client ou un nouveau brief de veille, tu dois le copier dans le dossier corpus/ et relancer l’ingestion. C’est 30 secondes, mais c’est pas automatique. Un cron job ou un hook git résoudrait ça.

Le MCP SDK évolue vite. Entre le moment où j’ai commencé et celui où j’écris ces lignes, le transport recommandé est passé de SSE à StreamableHTTP. C’est le jeu avec un écosystème jeune. La bonne nouvelle : le protocole est stable, seule la couche transport change.

Comment reproduire ça chez toi

Tu n’as pas besoin de deux Mac Mini. Un seul laptop suffit — le serveur MCP peut tourner en local.

Étape 1 : Installe Bun (curl -fsSL https://bun.sh/install | bash)

Étape 2 : Crée un projet avec bun init et installe le SDK MCP (bun add @modelcontextprotocol/sdk zod)

Étape 3 : Crée ta base SQLite avec les tables documents, chunks, et l’index FTS5 chunks_fts

Étape 4 : Écris ton serveur MCP (100 lignes de TypeScript) qui expose search_knowledge, get_document, list_topics

Étape 5 : Configure Claude Code pour pointer vers ton serveur dans ~/.claude/settings.json :

{
  "mcpServers": {
    "ma-knowledge-base": {
      "type": "url",
      "url": "http://localhost:3100/mcp"
    }
  }
}

Étape 6 : Ingère tes documents Markdown et relance le serveur.

C’est tout. Claude Code a maintenant accès à toute ta knowledge base. Il interrogera ton serveur automatiquement quand il en aura besoin.

Le vrai avantage : la souveraineté

On parle beaucoup de souveraineté des données dans l’IA. Souvent, c’est du marketing. Ici, c’est concret : mes fiches clients, mes supports de formation, ma documentation comptable — tout ça reste sur mes machines. Jamais envoyé à un service tiers. Jamais indexé par un moteur de recherche. Jamais utilisé pour entraîner un modèle.

Et pourtant, mon IA y a accès instantanément, avec 351 chunks de contexte métier à portée de requête.

C’est ça, le vrai pouvoir du MCP : pas besoin de choisir entre performance et confidentialité. Tu peux avoir les deux.


Tu veux aller plus loin et construire un écosystème IA complet autour de Claude ? Ma formation “L’Écosystème Claude” couvre exactement ça : MCP servers, subagents, hooks, le tout configuré pour ton métier en 2 jours.

Réserve ton appel découverte

Questions fréquentes

Qu'est-ce qu'un serveur MCP et pourquoi en construire un privé ?

MCP (Model Context Protocol) est le standard ouvert d'Anthropic qui permet à Claude Code de se connecter à des sources de données externes. Un serveur MCP privé te permet de centraliser toutes tes connaissances métier (fiches clients, supports de formation, documentation technique) et de les rendre accessibles à ton IA sans jamais les envoyer sur un service tiers.

Quelles compétences techniques faut-il pour créer un serveur MCP ?

Si tu sais lancer un terminal et copier-coller des commandes, tu peux le faire. Le stack est simple : Bun (runtime JavaScript rapide), SQLite (base de données fichier, zéro config), et le SDK MCP officiel. Pas besoin de Docker, de Kubernetes ou d'une infra cloud complexe.

Mon serveur MCP privé est-il sécurisé ? Mes données restent-elles locales ?

Oui. Le serveur tourne sur ta propre machine, accessible uniquement via ton réseau local ou un VPN comme Tailscale. Tes données ne transitent jamais par un serveur externe. Claude Code interroge ton serveur MCP en local — tes fiches clients, tes supports de formation et ta documentation restent chez toi.