@blufr/mcp-server
v0.1.0
Published
Blufr — serveur MCP stdio local : l'outil verify_diff vérifie le travail d'un agent de code (le diff est le contrat) et rend un verdict en clair. Tout reste local. Voir docs/mcp-clients.md.
Readme
Blufr — appelle le bluff de ton agent
Le diff est le contrat. Blufr lit ce qu'un agent IA a réellement livré (le diff, les métadonnées de session) et rend un verdict en clair — jamais du jargon, jamais du code brut. Les détecteurs jugent sur les faits (déterministe) ; le LLM ne fait que narrer. Chaque verdict produit la prochaine commande à copier, jamais une simple alerte.
Les 6 Tells
Le moteur cherche six signatures de « bluff » d'agent :
| Tell | Ce qu'il détecte | Source |
|---|---|---|
| Over-context | Session gonflée : contexte qui déborde la fenêtre (compaction), coût qui balloon | métadonnées de session |
| Mock | Du toc livré comme réel : fonction creuse, // TODO, valeur figée, catch vide | contenu (AST + motifs) |
| Omission | L'agent affirme plus que le livré ne montre (« testé » sans test réel) | déclaration ↔ livraison |
| Loop | L'agent tourne en rond : revert / toggling / churn stérile | fenêtre de commits |
| Overbet | Modèle surdimensionné pour la tâche (premium pour centrer un bouton) | modèle déclaré |
| Drift | Le livré s'écarte de l'intention du pilote (brief ↔ livraison) | brief ↔ livraison |
Verdict au ton poker : Bluff caught · Pot's clean · Folding session · All-in on a cheap bet, + le Tell nommé + une commande copiable.
Trois canaux, un seul moteur
verify(ctx) -> Verdict est commun aux trois. Un canal change seulement d'où viennent les faits, jamais qui juge.
- Upload (web) — colle ce que ton agent a produit → verdict en clair. UI + écran Feed.
npm run web→ http://localhost:4319 (/= vérification,/app= feed). - MCP — serveur stdio local
verify_diff, « Blufr vit dans ton agent », tout reste local.npm run mcp. Voirdocs/mcp-clients.mdpour les 8 clients. - GitHub webhook — audite le travail qui atterrit sur
main(commentaire de PR + Check Run non bloquant), avec debouncing de session ~15 min.
Démarrer
npm install
npm test # 138 tests (moteur, canaux, privacy red-team)
npm run demo # 🔴 loss/reset · 🟢 clean/close · 🟡 uncertain/clarify
npm run web # UI upload + Feed
npm run mcp # serveur MCP stdioDéploiement
Un seul conteneur (Dockerfile fourni) sert l'UI upload + le feed + le webhook GitHub — le debouncing stateful vit dans le conteneur (pas de KV externe). Cible : Railway. PORT est fourni par l'hébergeur.
⚠ Persistance : le feed et les compteurs analytics sont écrits dans BLUFR_DATA_DIR. Sans un volume Railway monté pointé par cette variable, feed + métriques repartent à zéro à chaque redéploiement. Variables pour l'audit GitHub (Phase B, optionnel) : GITHUB_WEBHOOK_SECRET, GITHUB_APP_ID, GITHUB_APP_PRIVATE_KEY.
Guide complet (volume, env vars, activation de la GitHub App, /healthz) : docs/deploy.md.
Confidentialité (non négociable)
Le diff n'est jamais stocké (traitement éphémère). La narration ne reçoit que des constats (faits), jamais le code. Le verdict sérialisé est sanitisé : aucun nom de modèle brut ni token de brief brut n'y survit — verrouillé par un test de régression red-team (test/privacy-redteam.test.ts, rapport dans docs/privacy-qa-report.md).
Architecture
src/
types.ts Finding, Verdict, ConsumptionRecord, DerivedMetric, NextAction
diff/parser.ts parseUnifiedDiff · linediff.ts (avant/après)
detectors/ over-context · mock (+mock-ast) · omission (+omission-ast) · loop · overbet · drift
cost/factors.ts table de facteurs versionnée + toUsd (porte CO2e ouverte)
narration/ prompts.ts (poker par Tell) · render.ts (rendu partagé multi-Tell)
channels/ upload · mcp (+server) · github (+api) · upload-server (UI + Feed + webhook)
verify.ts orchestrateur pur (+ sanitisation privacy centrale)
index.ts API publique
scripts/ extract-session-metadata (calibration A.8) · backtest-over-contextv0. Seuils Over-context et prix de la table = provisoires (calibrés sur données réelles ARLEN). Persistance des verdicts, durcissement AST étendu, et publication npm du serveur MCP = suite.
