Le scénario catastrophe qui m'a coûté une nuit de production

Il est 02:17 du matin, alerte PagerDuty. Notre agent IA déployé en production — celui qui récapitule les tickets Jira et pousse les résumés sur Slack — tombe en cascade. Dans les logs : Error: net::ERR_INTERNET_DISCONNECTED répété 47 fois en 90 secondes. Pire : nos tests E2E passaient au vert la veille, en local, sur une fibre 1 Gbps. Le coupable ? Nos utilisateurs naviguaient en 3G dans le métro. Nous n'avions jamais simulé la dégradation réseau. Cette nuit-là, j'ai juré qu'on intégrerait chrome-devtools-mcp au pipeline CI.

Dans ce tutoriel, je vous montre comment reproduire ce type d'incident de manière déterministe, puis comment brancher votre agent IA sur l'API HolySheep AI — S'inscrire ici pour observer son comportement sous contrainte. Vous repartirez avec trois scripts exécutables et une checklist d'erreurs courantes.

Qu'est-ce que chrome-devtools-mcp ?

chrome-devtools-mcp est un serveur MCP (Model Context Protocol) open-source qui expose l'intégralité du Chrome DevTools Protocol (CDP) à un agent IA. Concrètement, votre agent peut :

Contrairement à Playwright seul (qui supporte déjà le throttling via context.route), chrome-devtools-mcp permet à l'agent de décider dynamiquement du profil réseau en fonction du contexte — exactement ce qu'il faut pour des tests E2E agent-in-the-loop.

Installation pas-à-pas

1. Prérequis

2. Installer le serveur MCP

npm install -g chrome-devtools-mcp@latest

Vérification

chrome-devtools-mcp --version

Attendu : >= 0.7.2

3. Configurer le client MCP (Claude Desktop, Cursor ou agent custom)

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "chrome-devtools-mcp",
      "args": ["--port=9222", "--isolated=true"],
      "env": {
        "HOLYSHEEP_API_KEY": "YOUR_HOLYSHEEP_API_KEY",
        "HOLYSHEEP_BASE_URL": "https://api.holysheep.ai/v1"
      }
    }
  }
}

Cas concret : reproduire l'incident du métro

L'idée : faire naviguer l'agent sur notre app, forcer le profil Fast 3G (1,6 Mbps ↓, 750 Kbps ↑, 300 ms RTT, 2 % de perte), puis vérifier qu'il retombe proprement sur le cache Service Worker au lieu d'exploser en boucle.

Script E2E Python (Playwright + CDP via WebSocket)

import asyncio
from playwright.async_api import async_playwright

HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"
HOLYSHEEP_API_KEY  = "YOUR_HOLYSHEEP_API_KEY"
CDP_ENDPOINT       = "http://localhost:9222"

async def run_agent_e2e():
    async with async_playwright() as p:
        browser  = await p.chromium.connect_over_cdp(CDP_ENDPOINT)
        context  = browser.contexts[0]
        page     = await context.new_page()

        # 1. Activer le throttling Fast 3G via CDP
        cdp = await context.new_cdp_session(page)
        await cdp.send("Network.enable")
        await cdp.send("Network.emulateNetworkConditions", {
            "offline": False,
            "latency": 300,                # ms
            "downloadThroughput": 200_000, # bytes/s ≈ 1,6 Mbps
            "uploadThroughput":   93_750,  # bytes/s ≈ 750 Kbps
            "connectionType": "cellular3g"
        })

        # 2. Naviguer vers l'app sous test
        try:
            await page.goto("https://app.example.com/dashboard", timeout=15000)
        except Exception as e:
            print(f"[NET-ERROR] {type(e).__name__}: {e}")
            fallback = await page.evaluate(
                "() => navigator.serviceWorker.controller?.state"
            )
            assert fallback == "