# annuaire_entreprises

Annuaire des entreprises du bati (SIRENE + RNE/INPI, ~5,6 M fiches). Avec siren (9 chiffres) ou siret (14 chiffres) : la FICHE complete d'une entreprise — identite, activite (NAF), effectif, forme juridique, date de creation, capital, dirigeants et evolution du chiffre d'affaires (bilans deposes). Pour une activité et une zone : naf:["71.11Z"] et localisation:{dept:"69"} liste les architectes du Rhône sans query. Avec query (+ localisation) : LISTER des entreprises par nom / activite dans une zone. Avec rge=true et localisation, lister les qualifications valables aujourd’hui ; specialite_rge reprend les familles de la carte. Les coordonnees (telephone, e-mail, site) ne sont jamais dans la fiche : elles se revelent a l'unite cote application. Toujours citer le SIREN/SIRET renvoye.

| | |
|---|---|
| Effets | lecture seule |
| Portée OAuth | `mcp:read` |
| Offre requise | aucune — ouvert à tous les comptes |
| Données lues | la donnée publique du bâti — aucune coordonnée personnelle n'est jamais renvoyée |
| Distribution | connecteurs ChatGPT/Claude (`connectors-1.0.0`) et MCP historique |

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

## Paramètres

| Paramètre | Type | Requis | Bornes | Description |
|---|---|---|---|---|
| `cursor` | texte | — | — | Curseur next_cursor de la page precedente, repasse tel quel. |
| `limit` | entier | — | min 1, max 50, défaut `20` | — |
| `localisation` | objet | — | — | Zone geographique (mode liste), UNE granularite. National = omettre (jamais dept:"all"). |
| `localisation.commune` | texte | — | — | Nom de commune, code postal ou code INSEE. Préférer insee pour le code fourni par la carte. |
| `localisation.dept` | texte | — | — | Code departement : 01-95, 2A/2B ou 971-976 (ex. "69"). |
| `localisation.insee` | texte | — | — | Code INSEE exact; prioritaire sur commune et jamais interprété comme code postal. |
| `localisation.region` | texte | — | — | Nom de region (ex. Auvergne-Rhone-Alpes) — couvre tous ses departements en un appel. |
| `naf` | liste de texte | — | — | Codes NAF (activite) : sous-classes « 4333Z » / « 43.33Z » ou divisions « 43 » (deployees en leurs sous-classes). Filtre la liste ; SANS query, liste les entreprises de l'activite sur la zone, RGE et certifiees d'abord — c'est la recette « les carreleurs du 69 » (les mots ne trouvent pas un metier, le NAF si). |
| `query` | texte | — | — | Recherche plein texte (nom, activite NAF, RGE) pour LISTER des entreprises. UNE requete = UN sujet. Combiner avec localisation pour cibler une zone. Optionnelle si naf est fourni. |
| `rge` | booléen | — | — | Ne retenir que les entreprises actives dont la qualification RGE est valable aujourd'hui. Une localisation est requise sans query ni naf. |
| `siren` | texte | — | format `^\d{9}$` | SIREN 9 chiffres : fiche complete de l'entreprise (identite, NAF, effectif, forme juridique, creation, dirigeants, evolution du chiffre d'affaires). |
| `siret` | texte | — | format `^\d{14}$` | SIRET 14 chiffres : fiche d'un etablissement precis. |
| `specialite_rge` | `menuiseries` · `pac` · `isolation` · `chauffage` · `solaire` · `bois` · `ventilation` · `etudes` | — | — | Même famille de qualification que la carte RGE; implique rge=true. |

## Exemple d'appel

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

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "limit": 20,
      "localisation": {
        "dept": "69"
      },
      "naf": [
        "71.11Z"
      ]
    },
    "name": "annuaire_entreprises"
  }
}
```

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":{"limit":20,"localisation":{"dept":"69"},"naf":["71.11Z"]},"name":"annuaire_entreprises"}}'
```

## 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": {
        "adresse": "<texte>",
        "capital_social_eur": 0,
        "categorie": "<texte>",
        "code_naf": "<texte>",
        "code_postal": "<texte>",
        "date_creation": "<texte>",
        "departement": "<texte>",
        "dirigeants": [
          {}
        ],
        "effectif": "<texte>",
        "est_rge": false,
        "etat": "<texte>",
        "evolution_ca": [
          {}
        ],
        "forme_juridique": "<texte>",
        "libelle_naf": "<texte>",
        "nom_commercial": "<texte>",
        "nombre_certifications_actives": 0,
        "raison_sociale": "<texte>",
        "raison_sociale_connue": false,
        "rge_date_fin": "<texte>",
        "rge_domaines": [
          "<texte>"
        ],
        "siren": "<texte>",
        "siret": "<texte>",
        "url": "<texte>",
        "ville": "<texte>"
      },
      "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)
