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

# 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 ».

Date: 2026-05-15
Tags: MCP, Code review, GitHub
URL: https://tamsi.dev/blog/ai-code-reviewer-mcp

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.

```typescript
// 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.