Skip to main content
Haki propose deux mécanismes d’intégration Cursor, complémentaires et installables ensemble : le serveur MCP (l’agent choisit d’appeler des outils) et les Cursor Hooks (Cursor invoque des commandes automatiquement, sans coopération du modèle). Les deux sont packagés par le CLI haki — génération pure, rien n’est jamais écrit sur disque à votre place.

Serveur MCP — 4 outils, jamais plus

Monté dans l’API FastAPI elle-même sur /mcp (transport Streamable HTTP) — un seul serveur à faire tourner.
1

Cliquer le deeplink

Add Haki to Cursor — installe le serveur MCP en un clic.
2

Coller la Project Rule

Dans .cursor/rules/haki.mdc — indique à l’agent quand mémoriser et quand se souvenir.
3

C'est tout

Cursor retient vos décisions, conventions et erreurs résolues entre les sessions.

Les quatre outils

query, budget_tokens=900
Rappelle la mémoire du projet pertinente pour une tâche. À appeler avant de planifier ou modifier du code. Renvoie un bloc prêt à injecter (context), les faits bruts, les warnings, token_count et trace_id.
content, kind='agent.observation'
Mémorise un fait durable : décision technique, convention, erreur résolue. À appeler en fin de tâche. Idempotent par contenu (sha256(kind + content), sans horodatage) — appeler deux fois le même souvenir ne duplique rien. La consolidation est synchrone en dev (HAKI_MCP_AUTOCONSOLIDATE=true, défaut), donc le fait est rappelable immédiatement.
trace_id
Pourquoi une mémoire a été utilisée : quels faits inclus, exclus ou bloqués, et le reason_code de chacun.
mode='disable'
Oublie toute la mémoire du sujet configuré pour ce serveur, dans ce projet. mode="disable" (réversible) ou mode="delete" (effacement réel). Renvoie le reçu (forget_id) et les compteurs.
Aucun outil n’accepte de subject_id en paramètre. Le scope (project_id et subject_id) vient entièrement de la configuration serveur (HAKI_MCP_PROJECT_ID, HAKI_MCP_SUBJECT_ID), jamais du modèle — c’est l’invariant de sécurité « le client ne doit pas laisser le modèle choisir ces valeurs ». Une équipe qui partage un même déploiement Cursor a besoin d’une configuration serveur par personne, exactement comme chaque installation a déjà son propre projet.

Configuration

Limite honnête, mesurée pas promise

MCP ne permet pas d’intercepter 100 % des conversations Cursor : le serveur ne voit que les appels d’outils que Cursor décide de faire. La Project Rule instruit l’agent sur le quand — la couverture réelle est mesurée, jamais promise (voir research/Haki_Memory_Runtime.md).
C’est précisément la limite que les Cursor Hooks ci-dessous contournent pour la capture : ils ne dépendent d’aucune coopération du modèle.

Cursor Hooks — capture garantie et rappel de session

Ajouté et testé en conditions réelles contre un serveur local (prj_demo/org_demo) : haki hooks n’écrit rien sur disque, hook-session-start écrit bien haki-session.mdc avec le contenu mémorisé réel (fait + épisode retrouvés via /v1/context), et le fallback « rien de mémorisé » pour un sujet vierge ; hook-capture crée un événement agent.observation récupérable via /v1/timeline, dédupliqué quand rejoué avec le même conversation_id/generation_id ; le contrat fail-open a été vérifié sur 6 scénarios (API injoignable, aucune config, JSON stdin invalide, stdin vide, texte vide, échec d’écriture du .mdc) — toujours stdout "{}" et code de sortie 0.
Affiche trois blocs à coller (génération pure, jamais d’écriture automatique — même principe que haki mcp) : le .cursor/hooks.json, le template initial .cursor/rules/haki-session.mdc, et les instructions d’installation.

Pourquoi ce mécanisme existe, en plus du MCP

Les Cursor Hooks sont des processus locaux que Cursor lance lui-même (JSON en entrée/sortie via stdio, pas un serveur HTTP), configurés dans .cursor/hooks.json. Deux hooks sont packagés :
Purement observationnel côté Cursor (aucun bug connu au moment de l’écriture) — le plus fiable des trois hooks disponibles côté Cursor. Capture chaque réponse de l’agent sans coopération du modèle, contrairement à haki_capture (MCP) que le modèle peut simplement ne jamais appeler. Idempotent par conversation_id + generation_id.
beforeSubmitPrompt (le troisième hook Cursor existant) ne peut qu’autoriser ou refuser une soumission — son schéma de sortie documenté n’a aucun champ d’injection de contenu, contrairement à sessionStart. Il n’est donc pas utilisé pour le rappel de mémoire.

.cursor/hooks.json généré

Le scope (subject_id/project_id/org_id) est gravé dans la commande au moment de la génération, jamais déduit à l’exécution — même invariant que pour le MCP. La commande générée ne porte jamais la clé API : elle est résolue par le CLI haki déjà installé, depuis ~/.haki/config.json.
.cursor/hooks.json et .cursor/rules/haki-session.mdc sont du code exécuté automatiquement — relisez-les avant de les committer, comme vous relieriez une config CI. Les écrire automatiquement (depuis un agent, ou à l’ouverture d’un dépôt) est exactement le motif derrière une CVE réelle de sandbox-escape Cursor (« un fichier du workspace écrit une config de hook qui s’exécute sans approbation »). Le module hooks_setup.py ne fait que générer et afficher — c’est vous qui collez.

Contrat fail-open

Un hook Cursor ne doit jamais faire planter la boucle de l’agent. Sur toute erreur (config absente, API injoignable, JSON stdin invalide, texte vide, échec d’écriture du .mdc…), haki hook-capture et haki hook-session-start impriment un JSON vide inoffensif ({}) et sortent avec le code 0 — jamais une trace Python, jamais un code non nul. La raison de l’échec est loguée sur stderr uniquement, jamais mélangée au JSON stdout que Cursor parse.

Installation

1

Coller le JSON

Dans .cursor/hooks.json à la racine du projet.
2

Créer le fichier de règle

.cursor/rules/haki-session.mdc avec le template affiché — une seule fois : le hook sessionStart le réécrit ensuite à chaque session.
3

Vérifier l'installation du CLI

haki status — les hooks invoquent haki directement, ils ne portent aucune clé API en dur.
4

Ouvrir une nouvelle session Cursor

hook-session-start met à jour le .mdc ; hook-capture mémorise chaque réponse de l’agent automatiquement, sans action de votre part.

Roadmap

OAuth pour Cursor (remplacer le bearer de dev HAKI_API_KEY) reste en roadmap — voir le tableau de statut du README racine.