# salons

Les contacts pris sur un salon (stand, evenement) et le message de suivi automatique. action:"ajouter" enregistre un contact : email (obligatoire), salon, nom, entreprise, fonction, note. Le message part tout seul apres le delai regle par l'organisation ; cet outil n'envoie rien lui-meme. Le meme contact sur le meme salon n'est jamais enregistre deux fois. action:"lister" (defaut) rend les contacts, avec leur salon, leur statut d'envoi et le domaine de leur adresse — l'adresse elle-meme n'est jamais renvoyee. action:"parametres" lit le message automatique (objet, corps, signature, delai, salon en cours) ; avec ecrire:true, elle l'enregistre. Jetons du corps remplaces a l'envoi : {{prenom}}, {{nom}}, {{entreprise}}, {{salon}}. action:"annuaire" rend les salons du bati et de la prescription : dates relevees sur le site de chaque organisateur, avec la page (source_dates) et le jour de verification ; filtres famille et q. action:"participer" cree le salon pour l'organisation, depuis l'annuaire (slug) ou a la main (salon, ville, debut, fin), et pose sa checklist de preparation. action:"performances" rend par salon les contacts pris (dont ceux de l'application mobile), les messages partis, les fiches de prospection, les etapes du pipeline et le cout par contact.

| | |
|---|---|
| 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 n'a pas d'équivalent REST : il s'appelle par le connecteur MCP.

## Paramètres

| Paramètre | Type | Requis | Bornes | Description |
|---|---|---|---|---|
| `action` | `lister` · `ajouter` · `parametres` · `annuaire` · `participer` · `performances` | — | — | lister (defaut) \| ajouter \| parametres \| annuaire \| participer \| performances |
| `corps` | texte | — | max. caractères 4000 | parametres + ecrire : le message, avec ses jetons. |
| `debut` | texte | — | max. caractères 10 | participer : date de debut, aaaa-mm-jj. |
| `delai_minutes` | entier | — | min 0, max 1440 | parametres + ecrire : l'attente avant l'envoi (0 = tout de suite). |
| `ecrire` | booléen | — | — | parametres : true pour enregistrer les champs fournis. |
| `email` | texte | — | max. caractères 254 | ajouter : l'adresse du contact. Obligatoire. |
| `entreprise` | texte | — | max. caractères 200 | ajouter : la societe du contact. |
| `envoi_auto` | booléen | — | — | ajouter : forcer ou empecher le message de suivi pour CE contact (defaut : le reglage de l'organisation). |
| `famille` | texte | — | max. caractères 40 | annuaire : borne a une famille (batiment, prescription, bois, energie, immobilier, logement, collectivites, materiel, amenagement, pierre, piscine, prevention). |
| `fin` | texte | — | max. caractères 10 | participer : date de fin, aaaa-mm-jj. |
| `fonction` | texte | — | max. caractères 160 | ajouter : son role (gerant, responsable travaux...). |
| `limit` | entier | — | min 1, max 200 | lister : nombre de contacts (defaut 50). |
| `nom` | texte | — | max. caractères 160 | ajouter : prenom et nom, tels qu'ils ont ete donnes. |
| `note` | texte | — | max. caractères 2000 | ajouter : ce qui a ete dit, en clair. C'est ce qu'on relit le lendemain. |
| `objet` | texte | — | max. caractères 200 | parametres + ecrire : l'objet du message. |
| `q` | texte | — | max. caractères 80 | annuaire : cherche dans le nom, la ville, le lieu et le resume (accents ignores). |
| `salon` | texte | — | max. caractères 120 | Le salon ou l'evenement. ajouter : defaut = le salon en cours de l'organisation ; si le nom est celui d'un salon de l'organisation, le contact lui est rattache. lister : borne la liste a ce salon. participer : le nom du salon a creer (hors annuaire). |
| `salon_id` | texte | — | max. caractères 40 | ajouter : l'identifiant du salon de l'organisation (plus sur qu'un nom). |
| `signature` | texte | — | max. caractères 1000 | parametres + ecrire : la signature. |
| `slug` | texte | — | max. caractères 60 | participer : le slug d'un salon de l'annuaire (rendu par action:"annuaire"). Ses dates et son lieu sont repris de l'annuaire. |
| `ville` | texte | — | max. caractères 120 | participer : la ville, pour un salon hors annuaire. |

## Exemple d'appel

_squelette synthétique : les repères `<…>` se remplacent._

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

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":"lister"},"name":"salons"}}'
```

## 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
{
  "_meta": {},
  "next_cursor": "<texte>",
  "results": [
    {
      "fields": {},
      "id": "<texte>",
      "resume": "<texte>",
      "titre": "<texte>"
    }
  ],
  "total_estimated": 0
}
```

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)
