Retour au blog

Pourquoi un MCP de revue de code — et pas seulement le chat Cursor

Donner à l’agent des actions concrètes sur GitHub plutôt qu’un gros prompt « regarde mon repo ».

5 min de lecture
  • MCP
  • Code review
  • GitHub

Demander à Cursor « fais une code review » sur un gros diff, c’est pratique une fois. En répétition — PRs open source, projets clients, mes propres repos — tu veux quelque chose de reproductible : mêmes axes (bugs, sécurité, tests manquants), mêmes sorties, sans re-expliquer le contexte à chaque session.

L’intérêt du MCP ici

ai-code-reviewer-mcp n’est pas une « meilleure prompt engineering ». C’est exposer des outils : lire le diff, cibler un fichier, formuler un commentaire PR. L’agent choisit les étapes ; moi je contrôle ce qu’il a le droit de toucher. Ça évite les reviews vague-du-vendredi et ça s’accroche au modèle distant (tokens gratuits) dont je parle dans l’autre article.

Pourquoi c’est utile pour moi

  • Open source : feedback structuré avant de merge, sans ouvrir cinq onglets.
  • Même logique branchée sur mon Qwen distant (vLLM sur AWS) — pas de surcoût Cursor par review.
  • Démo Gradio sur Hugging Face pour montrer le concept sans installer MCP.
  • Template pour d’autres intégrations « l’AI agit sur un vrai système ».

Comment c’est monté (en bref)

Serveur MCP TypeScript (stdio) + Octokit pour GitHub + client OpenAI-compatible branché sur le Qwen servi en vLLM sur AWS. Les outils découpent la review : lister les fichiers du diff, récupérer un hunk, analyser avec un prompt ciblé (bug / sécurité / dette / tests).

  • `list_changed_files` / `get_file_diff` — contexte minimal, pas le repo entier.
  • `analyze_snippet` — un focus à la fois, sortie JSON structurée.
  • Même stack LLM que Cursor (base URL custom) → tokens gratuits, pas de double facturation.
  • Space Gradio sur Hugging Face : même moteur d’analyse, sans couche MCP, pour démo publique.
// Un outil = une responsabilité
server.tool('analyze_snippet', { path, diffHunk, focus }, async (input) => {
  const findings = await llmReview(input) // → vLLM AWS
  return { content: [{ type: 'text', text: JSON.stringify(findings) }] }
})

En bref

Je n’ai pas construit ça pour remplacer un humain en review finale. Je l’ai construit pour automatiser la première passe — celle que personne n’a envie de refaire à la main — et pour prouver que MCP + LLM self-hosted, c’est un combo crédible en dehors des demos Twitter.