⏱ 45 min
Outil principal : Codex CLI. Remplacer
codexparopencodeouclaudeselon votre outil.
Configurer des MCPs utiles et observer concrètement leur impact sur le comportement de l’agent.
Lancer l’agent :
codex # tool calls visibles nativement
# OpenCode : tool calls visibles nativement
# Claude Code : claude --verbose
Prompt simple :
>Liste tous les endpoints de l'API
Observer dans les logs :
[TOOL] read_file(filePath="src/api/routes.py")
[TOOL] grep(pattern="@app\.(get|post|put|delete)", output="content")
Grille d’observation :
| Critère | Oui/Non | Notes |
|---|---|---|
| Lit les fichiers avant de répondre | ||
| Utilise plusieurs outils en séquence | ||
| Vérifie les résultats | ||
| Demande clarification si ambigu |
Prompt complexe :
>Ajoute un endpoint GET /users/{id}/posts
>qui retourne les posts d'un utilisateur
>avec pagination (limit, offset)
Tracer les appels :
┌─────────────────────────────────────────────┐
│ Appel #1: read_file(src/api/routes.py) │
│ Appel #2: read_file(src/models/post.py) │
│ Appel #3: read_file(src/models/user.py) │
│ Appel #4: write_file(src/api/routes.py) │
│ Appel #5: run_command(pytest tests/) │
└─────────────────────────────────────────────┘
Question : L’agent a-t-il modifié les bons fichiers ?
Claude Code et Codex ont la recherche web intégrée nativement — rien à faire.
ddg_search.Quand l’agent travaille avec une librairie dont il peut avoir une connaissance périmée, context7 lui injecte la documentation réelle à jour.
Configurer context7 :
codex mcp add context7 -- npx -y @upstash/context7-mcp
Redémarrer l’agent, puis tester :
Avec la question de votre choix :
>utilise context7
>Comment migrer de on_event vers lifespan dans FastAPI ?
Observer le pattern :
[TOOL] context7_resolve-library-id [libraryName=fastapi]
[TOOL] context7_query-docs [libraryId=/tiangolo/fastapi, query=lifespan startup shutdown]
L’agent répond avec la vraie API FastAPI 0.115, pas ce qu’il “croit” savoir
On peut utiliser directement le MCP Chrome DevTools ou Playwright.
Pourquoi Playwright plutôt qu’un screenshot ?
Playwright renvoie une représentation textuelle du DOM, pas une image. Économie de tokens massive, et le LLM peut raisonner dessus sans vision.
Configurer le MCP Playwright :
Codex :
codex mcp add playwright -- npx -y @playwright/mcp
Opencode :
{
"mcp: [
"playwright": {
"type": "local",
"enabled": true,
"command": [
"npx",
"-y",
"@playwright/mcp"
]
}
]
}
L’exercice :
Avec Comparia qui tourne en local, demandez à l’agent d’interagir avec la page.
Observer les appels :
[TOOL] playwright_navigate(url="http://localhost:<PORT>")
[TOOL] playwright_snapshot()
[TOOL] playwright_click(ref="textarea.prompt-input")
[TOOL] playwright_fill(value="Explique le tool calling en 2 phrases")
[TOOL] playwright_click(ref="button[type=submit]")
[TOOL] playwright_snapshot()
Philosophie bash vs MCP. Les deux fonctionnent.
Si gh est installé et authentifié sur votre machine, l’agent peut l’utiliser directement sans aucune config :
>Utilise la CLI gh
>Liste les 5 dernières PRs ouvertes sur betagouv/comparia
>et résume les changements de chacune
L’agent exécutera quelque chose comme :
gh issue create \
--repo betagouv/comparia \
--title "Page d'accueil lente (>3s)" \
--body "..."
Avantages : zéro config, transparent, aucune surface d’attaque supplémentaire.
Limite : l’agent a accès à tout ce que gh peut faire — avec vos permissions complètes.
Le MCP GitHub expose des outils typés (create_issue, list_pull_requests, get_file_contents…) avec un périmètre configurable.
# ~/.config/opencode/mcp.yaml
mcpServers:
github:
command: npx
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: ${GITHUB_TOKEN}
Pour Claude Code : même format dans
~/.claude/settings.jsonsousmcpServers.
>Utilise le MCP github
>Liste les 5 dernières PRs ouvertes sur betagouv/comparia
>et résume les changements de chacune
Avantages : interface propre, token avec permissions fines (lecture seule si vous voulez), contexte riche.
Limite : le MCP lit les issues et PRs — qui peuvent contenir des tentatives de prompt injection (voir section risques dans le cours).
Faites les deux, comparez :
gh : créez une issue sur un de vos reposQuestion : Laquelle des deux approches vous semble plus adaptée à votre contexte ? Pourquoi ?
Une fois que vous êtes à l’aise avec le pattern MCP, voici ce que la communauté utilise le plus.
Slack
slack:
command: npx
args: ["-y", "@modelcontextprotocol/server-slack"]
env:
SLACK_BOT_TOKEN: ${SLACK_BOT_TOKEN}
SLACK_TEAM_ID: ${SLACK_TEAM_ID}
L’agent peut envoyer des messages, lire des canaux, rechercher dans l’historique. Utile pour des notifications automatiques en fin de tâche.
Telegram
Plusieurs MCPs communautaires disponibles — pratique si votre équipe est sur Telegram plutôt que Slack.
Filesystem étendu — accès à des dossiers en dehors du projet courant (logs système, exports, etc.).
Rappel sécurité : Un package compromis s’exécute avec vos permissions.
Module 4 : Bonnes Pratiques - AGENTS.md, Makefile, Docker, README.