Aller au contenu

API publique

API en lecture seule sur le dossier.

CORS ouvert, mise en cache à la périphérie, sans clé. Les mêmes règles que le site : l’inconnu n’est pas zéro, et les revendications contestées restent dans le libellé.

Sans clé · CORS ouvert · GET uniquement

Comment utiliser les chiffres

  • Inconnu n’est pas zéro

    Un `affected` null signifie que le chiffre est inconnu ou non publié. Ce n’est jamais 0. Ne le sommez pas, ne le représentez pas comme une absence, et ne traitez pas une cellule CSV vide comme un incident sans victime.

  • Un périmètre contesté reste contesté

    Un incident au statut "disputed" est une violation réelle dont l’ampleur annoncée est contestée. Les chiffres revendiqués par les attaquants restent dans le texte `affectedLabel`, jamais dans le champ numérique, jamais dans un agrégat.

  • Pas d’attribution inférée

    Les attaquants ne sont nommés que lorsque la source citée le permet. N’inférez pas un groupe à partir de la méthode ou du secteur.

  • Pas un registre exhaustif

    Il s’agit d’un ensemble curaté d’incidents majeurs rendus publics, pas de toutes les violations en France. Citez le `sourceUrl` original de chaque fiche.

Points d’accès

GET /api

Index auto-descriptif : conventions, chaque endpoint, paramètres et exemples. Passez `?lang=fr` pour le texte français. La doc HTML reste sur /docs.

Essayer cette requête

GET /api?lang=fr

Paramètres

en | fr

Réponse

Réglez les champs, puis envoyez. Cela interroge l’API réelle.

GET /api/incidents

Lister et rechercher les incidents. Le JSON inclut le `detail` localisé complet sur chaque ligne (contrairement à MCP `list_incidents`, qui renvoie des lignes compactes). Les effectifs inconnus se trient en dernier avec `sort=affected`, jamais comme zéro. Le CSV laisse la cellule affected vide. Le flux et les routes llms acceptent aussi `?lang=fr`.

Essayer cette requête

GET /api/incidents?limit=5&lang=fr

Paramètres

Recherche plein texte sur l’organisation, le secteur, la méthode, les données, le risque, la confiance, la source et les champs longs de la fiche.

government | company

critical | high | medium | low

confirmed | disputed | unknown

Nom exact du secteur, insensible à la casse.

ex. 2026

Date ISO, borne inférieure inclusive.

Date ISO, borne supérieure inclusive.

date | affected | org (date par défaut)

desc | asc (desc par défaut)

1–200, 100 par défaut

0 par défaut

json | csv

en | fr

L’essai commence à 5 pour garder ce panneau lisible. La valeur par défaut de l’API est 100.

Réponse

Réglez les champs, puis envoyez. Cela interroge l’API réelle.

GET /api/incidents/{id}

Un incident avec son `detail` localisé (lead, timeline, how, taken, notTaken, impact, response, methodDisclosure, revision et quotes optionnels) plus `lastResearched`, `source` et `sources`. Chaque source a un `kind` (primary | official | secondary), un `publisher` et un `published` optionnel. Un identifiant inconnu renvoie 404 et la liste des identifiants valides. Pas de CSV ici ; le CSV de la liste reste compact et laisse `affected` inconnu vide.

Essayer cette requête

GET /api/incidents/ants?lang=fr

Chemin

Identifiant d’incident du dossier.

Paramètres

en | fr

Réponse

Réglez les champs, puis envoyez. Cela interroge l’API réelle.

GET /api/summary

Chiffres nationaux ANSSI et CNIL, plus les décomptes issus de cette liste. Les agrégats n’incluent jamais les inconnus ni les revendications d’attaquants contestées.

Essayer cette requête

GET /api/summary?lang=fr

Paramètres

en | fr

Réponse

Réglez les champs, puis envoyez. Cela interroge l’API réelle.

GET /api/sources

Toutes les sources, avec `kind` (primary | official | secondary), `publisher`, date `published` optionnelle, et les incidents qui les citent.

Essayer cette requête

GET /api/sources

Exemples

Réponse

Réglez les champs, puis envoyez. Cela interroge l’API réelle.

GET /api/patterns

Faiblesses récurrentes et la mesure prioritaire pour chacune.

Essayer cette requête

GET /api/patterns?lang=fr

Paramètres

en | fr

Réponse

Réglez les champs, puis envoyez. Cela interroge l’API réelle.

GET /api/recommendations

Recommandations pour les organisations et le grand public. Les fiches grand public incluent explainerSlug lorsqu’un guide /learn existe.

Essayer cette requête

GET /api/recommendations?lang=fr

Paramètres

organizations | public

en | fr

Réponse

Réglez les champs, puis envoyez. Cela interroge l’API réelle.

MCP Streamable HTTP

Le même jeu en lecture seule, exposé comme serveur MCP distant. Sans clé. JSON sans état en Streamable HTTP, donc il tourne sur des fonctions serverless ordinaires et parle encore aux clients de 2025.

POST https://cyberwatch-france.timbenniks.dev/mcp

Comment l’installer

Pointez n’importe quel hôte MCP vers cette URL. Pas de jeton. Après l’ajout, rechargez l’hôte et vérifiez que les outils apparaissent.

Cursor

Cursor — enregistrez comme .cursor/mcp.json dans un projet, ou ~/.cursor/mcp.json pour tous les espaces de travail. Puis Cursor Settings → Tools & MCP, activez le serveur.

{
  "mcpServers": {
    "france-cyberwatch": {
      "url": "https://cyberwatch-france.timbenniks.dev/mcp"
    }
  }
}
Ajouter à Cursor

Claude

Claude Desktop — fusionnez dans claude_desktop_config.json (Claude → Réglages → Développeur). Les connecteurs Claude.ai peuvent utiliser la même URL.

{
  "mcpServers": {
    "france-cyberwatch": {
      "type": "http",
      "url": "https://cyberwatch-france.timbenniks.dev/mcp"
    }
  }
}

VS Code

VS Code — enregistrez comme .vscode/mcp.json, ou ajoutez le serveur via MCP: Add Server.

{
  "servers": {
    "france-cyberwatch": {
      "type": "http",
      "url": "https://cyberwatch-france.timbenniks.dev/mcp"
    }
  }
}

Outils

list_incidents

Rechercher et filtrer les incidents. Lignes compactes ; un `affected` inconnu reste null, jamais 0. Les décomptes inconnus se trient en dernier si sort vaut affected.

Entrée — q, kind, severity, status, sector, year, from, to, sort (date|affected|org), order, limit (≤200), offset, lang (en|fr). Mêmes filtres que GET /api/incidents.

get_incident

Un incident avec son détail localisé, lastResearched, et toutes les sources citées. Un identifiant inconnu liste les identifiants valides.

Entrée — id (obligatoire), lang (en|fr).

get_summary

Chiffres nationaux ANSSI et CNIL, plus les décomptes issus de cette liste. Les agrégats n’incluent jamais les inconnus ni les revendications d’attaquants contestées.

Entrée — lang (en|fr).

list_sources

Toutes les sources, avec kind (primary | official | secondary), publisher, date published optionnelle, et les incidents qui les citent.

list_patterns

Faiblesses récurrentes et la mesure prioritaire pour chacune.

Entrée — lang (en|fr).

list_recommendations

Recommandations pour les organisations et le grand public. Les fiches grand public incluent explainerSlug lorsqu’un guide /learn existe.

Entrée — audience (organizations | public), lang (en|fr).

Ressources

  • cyberwatch://conventions

    Comment utiliser les chiffres : l’inconnu n’est pas zéro, un périmètre contesté reste contesté, pas d’attribution inférée.

  • cyberwatch://incident/{id}

    Fiche localisée complète d’un incident, même contenu que get_incident.

Invites

  • explain_incident

    Demander au modèle d’expliquer une fiche sans inventer de chiffres ni d’attaquants.

    Entrée — id, lang (en|fr).

  • brief_the_dossier

    Un briefing court de la liste choisie, avec les règles de données en tête.

    Entrée — lang (en|fr).

WebMCP sur ce site

Quand un agent navigateur est déjà sur une page, ces outils s’exécutent dans l’onglet : ils peuvent filtrer la chronologie, ouvrir une fiche, et lire le jeu prérendu dans la page. Pas d’appel serveur de plus.

Comment l’activer

WebMCP est une proposition de standard web. Chrome l’expose derrière un flag (et une origin trial). Un pont WebMCP ou l’extension Model Context Tool Inspector peut aussi voir les outils enregistrés sur cette page.

Dans Chrome 146+, ouvrez chrome://flags/#enable-webmcp-testing, passez à Enabled, puis relancez. Ouvrez ce site, puis inspectez navigator.modelContext (ou document.modelContext) dans DevTools, ou utilisez l’extension inspector.

chrome://flags/#enable-webmcp-testing

Model Context Tool Inspector (Chrome Web Store) liste les outils, permet de les appeler, et peut discuter avec eux.

Si vous utilisez un pont WebMCP (par exemple Cursor parlant à l’onglet ouvert), épinglez cette origine et les outils de la page apparaissent comme outils web.*.

Outils de page

get_page_context

Où se trouve le lecteur : chemin, langue, type de page, et l’identifiant d’incident ouvert le cas échéant.

list_incidents

Chercher dans le jeu déjà chargé sur cette page. Un affected inconnu reste null.

Entrée — q, kind, severity, status, sector, year, limit, lang.

get_incident

Une fiche du jeu chargé sur la page, dans la langue courante (ou demandée).

Entrée — id (obligatoire), lang.

get_summary

Chiffres nationaux ANSSI/CNIL et décomptes curatés issus du jeu chargé sur la page.

open_incident

Ouvrir la fiche d’incident dans cet onglet.

Entrée — id (obligatoire).

open_page

Aller à une section du site (accueil, incidents, conseils, chiffres, docs, guides, quiz).

Entrée — page : home | incidents | guidance | numbers | docs | learn | quiz.

filter_timeline

Appliquer les filtres de la chronologie et ouvrir /incidents (ou /fr/incidents) avec une URL partageable.

Entrée — q, kind, severity, status, sector, year.

reset_filters

Effacer les filtres et ouvrir la liste complète des incidents.

Fichiers

Index machine

Le même catalogue en JSON, avec des URL d’exemple.

/api

Jeu de données brut

Le fichier source complet dont ce site et l’API sont construits.

/data/france-cyberwatch-data.json