Spec — MCP nexus-code-kg
contrat MCP `nexus-code-kg`
Objectif
Exposer le Meta KG Applications, c'est-a-dire le Code KG, a Codex et aux agents IA compatibles MCP sans leur donner d'acces DB direct, de secret Nexus ou de filesystem brut.
Le MCP nexus-code-kg est un adaptateur externe au runtime Nexus. Il appelle l'API
Nexus, applique les scopes MCP, retourne des paquets courts et preuves, puis
laisse Codex relire le code reel avant toute correction.
Le KG documentaire Nexus releve d'une surface MCP separee ciblee nexus-doc-kg.
Ne pas melanger les intentions code/SR et les intentions documentaires/metier.
Voir aussi 27-Nexus-MCP-Operating-Notes.md pour l'exploitation courante et
28-Nexus-Doc-KG-MCP-Spec.md pour le contrat du MCP documentaire.
Clients cibles
- Codex local sur le serveur Aurora.
- Agent IA web compatible MCP ou tool-calling : ChatGPT, Claude ou equivalent.
- Client interne Nexus futur.
Le contrat des tools doit rester identique quel que soit le transport retenu.
Principes
- API Nexus uniquement, pas d'acces DB direct.
- Lecture seule par defaut.
- Aucun mot de passe Nexus transmis a l'agent IA.
- Aucun secret retourne.
- Resolution des findings par preuve structuree, pas par hypothese sur un ID.
- Relire le code reel avant patch.
- Actions sensibles separees par scope et validation humaine.
Tools MCP
| Tool | Scope minimal | Usage |
|---|---|---|
kg_status | kg:read | Verifier disponibilite MCP/API Nexus, version, scopes actifs et capacites. |
kg_latest_graph | kg:read | Trouver le dernier graphe exploitable pour un repository, une branche ou un projet. |
kg_list_graphs | kg:read | Lister les graphes accessibles avec repository, branche, date, score et statut. |
kg_graph_summary | kg:read | Resumer nœuds, relations, score, findings, auditeurs et couverture. |
kg_search | kg:read | Rechercher fichiers, symboles, routes, composants, collections et findings. |
kg_expand | kg:read | Explorer les relations proches autour d'un nœud, fichier, symbole ou finding. |
kg_file_context | kg:read | Obtenir le contexte KG d'un fichier avant lecture et modification. |
kg_impact | kg:read | Estimer l'impact relationnel d'un fichier, symbole ou finding. |
kg_context_pack | kg:read | Generer un paquet deterministe cible pour Codex. |
kg_list_anomalies | kg:audit:read | Lister anomalies et findings filtres par repo, graphe, auditeur, type et severite. |
kg_get_anomaly | kg:audit:read | Obtenir un finding complet avec preuve, fichier, ligne, impact et verifications. |
kg_anomaly_context | kg:audit:read | Construire le contexte priorise autour d'une anomalie. |
kg_list_audit_risks | kg:audit:read | Lister les risques IA persistés et priorises d'un audit. |
kg_get_audit_risk | kg:audit:read | Resoudre un risque IA vers les findings KG par tuple de preuve. |
kg_audit_context | kg:audit:read | Combiner risque IA, findings sources, relations KG proches et tests conseilles. |
kg_match_current_repo | kg:read | Associer un repo local ou un repository explicite au meilleur graphe disponible, avec statut ambiguous si nécessaire. |
kg_compare_with_local_git | kg:read:local | Comparer commit graphe, HEAD local, branche et worktree pour décider si le KG est frais. |
kg_top_actionable_findings | kg:audit:read | Prioriser les findings actionnables pour Codex, en évitant le bruit de tests par défaut. |
kg_patch_context | kg:audit:read | Construire le pont finding -> fichier -> tests probables avant lecture du code réel. |
kg_list_audit_exports | kg:export:read | Lister les exports d'audit disponibles. |
kg_get_audit_export | kg:export:read | Lire un export structure existant pour preparer une correction. |
kg_compare_runs | kg:audit:read | Comparer deux runs ou audits : score, deltas, disparitions et nouveaux risques. |
kg_regenerate | kg:regenerate:request | Preparer ou demander une regeneration controlee apres correction. Tool sensible. |
kg_regenerate_dry_run | kg:read | Verifier une regeneration sans mutation, notamment pour clients OpenAI/Codex prudents. |
kg_regenerate_submit | kg:regenerate:request | Soumettre la regeneration reelle en arriere-plan avec confirmation explicite. |
Regeneration controlee Code KG
kg_regenerate est reserve au Code KG et doit rester orchestre par la SR
Method ou par une validation humaine explicite.
Regles minimales :
- le tool doit accepter un mode dry-run par defaut ;
- la mutation reelle exige
dry_run=falseetconfirmed_by_sr=true; - les chemins locaux sont reserves au runtime
local_stdioet aNEXUS_MCP_LOCAL_REPO_ROOTS; - en runtime
remote_http, les agents externes utilisentrepository+branch; le MCP resout le root API via son registre allowliste, sans exposer de chemin serveur au client ; - si le worktree est dirty, la mutation reelle exige
allow_dirty=trueet doit retourner un warning ; - le tool doit refuser un graphe ambigu ;
- le tool passe par l'API Nexus, pas par la base de donnees ;
- apres regeneration,
kg_compare_runsdoit comparer le graphe avant/apres si possible.
kg_regenerate ne doit pas etre expose au MCP documentaire nexus-doc-kg
par defaut. Le KG documentaire doit plutot retourner un statut ou une alerte si
le graphe est absent ou non genere.
Resolution des findings
Les risques IA et prompts exportes peuvent contenir des finding_id lisibles
mais non fiables comme qualified_name KG. Le MCP doit donc resoudre les
findings par tuple de preuve.
Tuple obligatoire :
(graph_id, source_tool, finding_type, path, line)Fallback autorise si la ligne est absente :
(graph_id, source_tool, finding_type, path)Si plusieurs candidats correspondent, le MCP doit retourner :
{
"status": "ambiguous",
"candidates": [],
"required_disambiguation": ["line", "message", "dedupe_key"]
}Il ne doit pas choisir silencieusement.
Schemas communs
Graph selector
{
"repository": "syl2042/Nexus-Pocket",
"branch": "main",
"graph_id": "optional",
"latest": true
}Finding proof
{
"graph_id": "uuid",
"source_tool": "nexus_kg|ruff|bandit|osv|audit_ai",
"finding_type": "bandit_b324_hashlib",
"path": "services/echo/app/services/meeting_service.py",
"line": 1094,
"message": "Use of weak SHA1 hash for security.",
"severity": "high"
}Codex action packet
{
"status": "ready",
"finding": {},
"file_context": {},
"nearby_relations": [],
"impact": {},
"recommended_reads": [],
"recommended_commands": [],
"safety_notes": []
}Règles d'usage par intention
| Intention Codex | Tool initial | Suite attendue |
|---|---|---|
| Comprendre l'etat d'un repo | kg_latest_graph puis kg_graph_summary | Lire score, findings, auditeurs, couverture. |
| Corriger un risque IA | kg_get_audit_risk | Resoudre les findings sources, puis kg_get_anomaly. |
| Corriger une anomalie precise | kg_get_anomaly | Appeler kg_file_context, relire le code reel, corriger, tester. |
| Modifier un fichier sensible | kg_file_context | Verifier relations proches et impact avant patch. |
| Explorer une zone inconnue | kg_search puis kg_expand | Construire contexte avant lecture code. |
| Preparer une correction groupee | kg_get_audit_export puis kg_audit_context | Prioriser high/medium et eviter la correction de masse. |
| Valider apres correction | kg_regenerate puis kg_compare_runs | Verifier disparition ou delta des findings. |
Pour les clients qui preferent des tools separes, utiliser
kg_regenerate_dry_run puis kg_regenerate_submit au lieu du tool compatible
kg_regenerate.
Priorisation
- High actionnable avec fichier et ligne.
- Findings bloquants : parsing, imports internes non resolus, runtime probable.
- Medium avec impact securite, runtime ou architecture.
- Clusters homogenes Ruff/Bandit valides.
- Low/info uniquement si demande explicite ou lot dedie.
- Faux positifs : documenter, ne pas corriger a l'aveugle.
Fraîcheur locale
Les tools avec local_path sont réservés au runtime local stdio et doivent
refuser proprement tout autre mode. Le serveur doit limiter les chemins à une
allowlist locale, par exemple /home/ubuntu/apps.
Verdicts attendus pour kg_compare_with_local_git :
fresh: commit graphe égal au HEAD local et worktree propre.stale_but_usable: écart limité ou worktree dirty sans croisement direct avec les findings.stale: commit différent ou comparaison impossible.unsafe_for_patch_decision: worktree dirty touchant des fichiers avec findings, ou situation ambiguë.
Codex ne doit jamais patcher sur la seule base du KG si le verdict n'est pas
fresh.
Cycle cible
kg_latest_graph
-> kg_graph_summary
-> kg_list_audit_risks ou kg_list_anomalies
-> kg_get_audit_risk ou kg_get_anomaly
-> kg_file_context / kg_impact
-> lecture du code reel
-> correction
-> tests
-> kg_regenerate si valide
-> kg_compare_runsLimites du lot courant
Cette spec ne cree pas de serveur MCP, endpoint API, UI, migration ou token. Elle definit le contrat qui guidera l'implementation ulterieure.