# marches_dce

Pieces d'un dossier de consultation (DCE). marche_id accepte un UUID de marche OU l'annonce_id betterplace. TROIS modes. SOMMAIRE : { marche_id, type } sur un dossier multi-lots renvoie la table des matieres (une ligne par piece, avec pages_estimees). LECTURE : { marche_id, type, filename } renvoie le TEXTE de CETTE piece, pagine (~8000 caracteres ; page / pages_total ; redemander page:2 pour la suite). filename tolere un nom approximatif ("CCTP lot 12", "chape"). LOCALISER : { marche_id, query } dit dans QUELLES pieces le terme apparait — le moyen rapide de trouver le bon lot sans feuilleter. Recherche globale : { query } seul, sur tous les DCE. NE JAMAIS parcourir un dossier page par page : passer par query puis filename. "DCE consultable" = lisible ICI, pas un lien externe : consulter = restituer le texte, jamais un lien invente. Telechargement : marches_dce_lien_obtenir.

| | |
|---|---|
| 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/dce.read` (portée `mcp:read`), documenté sur [dce.read](/docs/api/dce.read.md).

## Paramètres

| Paramètre | Type | Requis | Bornes | Description |
|---|---|---|---|---|
| `filename` | texte | — | — | Nom de la piece a lire dans un dossier MULTI-LOTS. Un nom approximatif suffit (ex "CCTP lot 12", "chape") : il est resolu contre les pieces reelles. Omis sur un dossier multi-lots, l'outil renvoie la TABLE DES MATIERES au lieu de coller tous les fichiers bout a bout. |
| `marche_id` | texte | — | — | Identifiant du dossier : marche_id (UUID) OU annonce_id betterplace (ex "2833189") — les deux sont acceptes. Requis en mode lecture. |
| `page` | entier | — | min 1, défaut `1` | Page de lecture (~8000 caracteres) DANS la piece choisie. pages_total indique le total ; demander page:2, 3... pour la suite. Ne PAS feuilleter un dossier entier page par page : utiliser filename, ou query pour localiser. |
| `query` | texte | — | — | Avec marche_id : cherche DANS ce dossier et renvoie les pieces qui parlent du terme (le moyen rapide de trouver le bon lot). Sans marche_id : recherche semantique globale dans tous les DCE. |
| `type` | `rc` · `cctp` · `ccap` · `dpgf` · `bpu` | — | — | Piece a lire : rc (reglement de consultation), cctp (clauses techniques), ccap (clauses administratives), dpgf/bpu (prix). Requis en lecture ; en recherche, restreint a ce type. |

## Exemple d'appel

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

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "marche_id": "fixture-dce-001",
      "type": "rc"
    },
    "name": "marches_dce"
  }
}
```

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":{"marche_id":"fixture-dce-001","type":"rc"},"name":"marches_dce"}}'
```

## 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": "sommaire_dce",
  "count": 0,
  "doc_type": "<texte>",
  "fichiers": [
    {
      "filename": "<texte>",
      "pages_estimees": 0,
      "parties": 0
    }
  ],
  "fields": {},
  "filename": "<texte>",
  "hint": "<texte>",
  "marche_id": "<texte>",
  "ok": true,
  "page": 0,
  "pages_total": 0,
  "query": "<texte>",
  "results": [
    {
      "acheteur": "<texte>",
      "doc_type": "<texte>",
      "extrait": "<texte>",
      "filename": "<texte>",
      "lieu": "<texte>",
      "marche_id": "<texte>",
      "titre": "<texte>"
    }
  ],
  "texte": "<texte>",
  "titre": "<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 consomme **en plus une unité de dossier** : un dossier vaut une unité pour la journée, quel que soit le nombre de pièces lues ou téléchargées dedans. Le compteur de dossiers repart à minuit, heure de Paris ; les deux compteurs d'appels, eux, glissent sur leur fenêtre.

**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)
