# evenements_alertes

Gere les alertes de recherche de l'utilisateur : lister, creer, supprimer. Une alerte rejoue périodiquement une recherche sur les sources surveillables énumérées dans sources. Les limites de texte, géographie et fraîcheur diffèrent selon la source ; elles figurent dans le schéma et les warnings. realtime signifie chaque passage du robot, pas une ingestion instantanée. action:"add" -> name et query requis (+ sources, departement, montant_min, frequency). action:"remove" -> id (via action:"list"). Pas de modification : remove puis add.

| | |
|---|---|
| Effets | lecture et écriture dans l'espace du compte |
| Portée OAuth | `mcp:write` |
| Offre requise | aucune — ouvert à tous les comptes |
| Données lues | l'espace du compte authentifié (ses alertes, ses dossiers, sa base) |
| Distribution | MCP historique |

Cet outil est aussi distribué en REST : `POST /api/mcp/v1/alertes.list` (portée `mcp:read`), documenté sur [alertes.list](/docs/api/alertes.list.md).

## Paramètres

| Paramètre | Type | Requis | Bornes | Description |
|---|---|---|---|---|
| `action` | `list` · `add` · `remove` | oui | — | list (mes alertes), add (creer), remove (supprimer). |
| `departement` | texte | — | — | Code departement (01-95, 2A, 2B, 971-978). Sans effet sur la source attribution (DECP ne porte pas le departement) ; sur la source dce, restreint aux dossiers rapproches d'un marche. L'appel le signale dans warnings. |
| `departements` | liste de texte | — | — | Plusieurs codes departement (memes regles que departement) : une region = la liste de ses departements. |
| `frequency` | `realtime` · `daily` · `weekly` | — | — | Espacement MINIMAL du rejeu (defaut daily). Le robot passe toutes les 3 heures : realtime = a chaque passage, daily = au plus une fois par jour, weekly = une fois par semaine. |
| `id` | texte | — | — | UUID de l'alerte (requis pour remove ; via action:list). |
| `montant_min` | nombre | — | min 0 | Montant minimum en euros. S'applique a la source attribution UNIQUEMENT (DECP, montant renseigne). Sans effet sur marche, dce et permis : le montant estime n'est publie que sur 0,12 % des avis ouverts, le filtre y viderait l'alerte. |
| `name` | texte | — | max. caractères 120 | Nom de l'alerte (requis pour add). Reutiliser un nom existant avec d'AUTRES criteres est une erreur : supprimer puis recreer. |
| `query` | texte | — | max. caractères 500 | Mots-cles rejoues (requis pour add, 2 caracteres minimum). Une liste separee par des virgules vaut un OU. |
| `sources` | liste de `marche` · `dce` · `attribution` · `permis` · `reseaux_sociaux` · `mairie` · `bodacc` · `entreprise` · `contact` · `dvf` · `site` | — | — | Sources surveillables, defaut = toutes. marche = nouveaux avis publiés, plus un rappel quand la remise approche (J-7) ; dce = nouveaux dossiers de consultation citant vos termes ; attribution = marchés attribués (DECP) citant vos termes, dans les départements suivis ; permis = permis autorisés des 45 derniers jours (Sitadel, publié par dumps) ; reseaux_sociaux = nouveaux posts observés sur les réseaux sociaux citant vos termes ; mairie = nouveaux PV de conseils municipaux citant vos termes ; bodacc = nouvelles annonces légales (BODACC) citant vos termes ; entreprise = nouvelles entreprises de l'annuaire citant vos termes ; contact = nouveaux contacts de l'annuaire citant vos termes ; dvf = ventes immobilières récentes des départements suivis (le terme n'y est pas appliqué) ; site = nouvelles pages de sites d'entreprises citant vos termes. Aucune autre source n'est surveillable : une valeur hors de cette liste est REFUSEE. |

## Exemple d'appel

_exemple synthétique du contrat REST, adapté à l'action MCP._

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "action": "list"
    },
    "name": "evenements_alertes"
  }
}
```

En HTTP, c'est ce corps que l'on poste :

```bash
curl -sS https://prescriptio.fr/api/mcp \
  -H 'Authorization: Bearer <jeton>' \
  -H 'Content-Type: application/json' \
  -d '{"id":1,"jsonrpc":"2.0","method":"tools/call","params":{"arguments":{"action":"list"},"name":"evenements_alertes"}}'
```

## Forme de la réponse

Le résultat est enveloppé par le protocole : un bloc `content[0].text` qui porte le JSON sérialisé, et `structuredContent` qui porte le même objet. Le squelette ci-dessous donne les **types**, jamais des valeurs réelles.

```json
{
  "action": "<texte>",
  "download_url": "<texte>",
  "fields": {},
  "files": [
    {}
  ],
  "ok": false,
  "page": 0,
  "pages_total": 0,
  "quota": {},
  "texte": "<texte>"
}
```

Un champ absent ou `null` n'est ni un zéro ni une estimation : la source ne l'a pas renseigné. Les propriétés additionnelles restent autorisées ; ce squelette n'invente pas les champs manquants.

## Erreurs

Le connecteur MCP renvoie une erreur JSON-RPC pour ce qui empêche l'appel, et une erreur *métier* (`isError`) lisible par le modèle pour ce que l'appel n'a pas pu faire.

| Code JSON-RPC | Quand | Que faire |
|---|---|---|
| `-32601` | Outil inconnu | Appeler `tools/list` ; ne pas deviner un nom |
| `-32602` | Argument absent ou hors schéma | Corriger l'argument nommé dans le message |
| `-32003` | Portée OAuth absente de l'autorisation | Reconnecter en acceptant `mcp:read` ou `mcp:write` |
| `-32004` | Quota dépassé | Attendre le délai indiqué ; ne jamais boucler |
| `-32603` | Dépendance indisponible | Réessayer plus tard ; ne pas rejouer une écriture sans vérifier |

Sur les routes REST `/api/mcp/v1/*`, les mêmes situations sont des codes HTTP : `400 invalid_arguments` / `invalid_cursor`, `401 unauthenticated`, `403 insufficient_scope` / `access_denied` / `user_required` / `organization_required` / `role_denied`, `404 not_found`, `409 conflict`, `429 quota_exceeded` (avec `Retry-After` quand il est connu), `503 unavailable`, `504 timeout`. Le corps porte `error.code`, `error.message`, `error.retry_after_seconds` et `api_contract_version`.

⚠ Un message d'erreur n'est jamais une donnée : ne pas le recopier comme un fait, et ne pas inventer un identifiant ou une URL qu'il ne contient pas.

## Quotas

Un appel compte pour **une unité** dans les deux compteurs d'appels, partagés entre le connecteur MCP et les routes REST :

| Compteur | Compte gratuit | Abonné | Accès interne |
|---|---|---|---|
| Appels / 24 h glissantes | 100 | 5000 | illimité |
| Appels / 60 s (anti-rafale) | 5 | 30 | illimité |
| Dossiers distincts / jour civil (Paris) | 5 | 500 | illimité |

Cet outil ne consomme aucune unité de dossier : chercher est gratuit, c'est la lecture d'un dossier (`marches_dce`, `mairies_deliberations` et leurs téléchargements) qui est décomptée.

**Aucun outil n'est réservé à une offre** (décision du 2026-09-17) : un compte gratuit voit et appelle le catalogue entier, ce sont ces plafonds qui bornent son usage.

## Voir aussi

[Référence technique](/docs/reference/concepts.md) · [Tous les outils](/docs/api/index.md) · [OpenAPI](/openapi.json) · [Texte pour agents](/llms-full.txt)
