# marches_dossier_analyse_enregistrer

Pousse VOTRE analyse d'un dossier d'appel d'offres : verdict (go / no_go / a_verifier) et ses motifs, critères pondérés, pièces de candidature et d'offre (une pièce par entrée), qualifications, modalités de dépôt, tâches datées (échéance en date ou relative à la remise : J-15), remarques, synthèse. Écrire en français, avec les accents. Lire d'abord les pièces avec marches_dce, puis pousser ici ; l'analyse coexiste avec l'analyse partagée de Prescriptio quand elle existe (les faits du règlement), elle porte le jugement. Désigner le dossier par draft_id, ou par marche_id / annonce_id (il est alors ouvert en même temps, idempotent). L'analyse remplit la fiche du dossier et reste PRIVÉE à l'organisation ; marches_dossiers la rend (context.analyse_personnelle). Repousser REMPLACE l'analyse précédente. Un payload hors bornes est refusé avec le détail de ce qui dépasse (jamais tronqué en silence).

| | |
|---|---|
| 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 |
|---|---|---|---|---|
| `annonce_id` | texte | — | max. caractères 200 | Reference d'un DCE (annonce_id), a defaut de draft_id — la cle des cards DCE et du viewer. |
| `ca_minimum` | nombre | — | min 0 | Chiffre d'affaires minimal exigé, en euros. |
| `criteres` | liste de objet | — | max. éléments 40 | Critères d'attribution pondérés : [{nom, pct, sous:[...]}]. pct en pourcentage (0-100). |
| `draft_id` | texte | — | — | UUID du dossier (marches_dossier_suivre ou marches_dossiers le renvoient). Sinon fournir marche_id ou annonce_id : le dossier est ouvert en meme temps (idempotent). |
| `marche_id` | texte | — | — | UUID d'un marche public (marches_publics), a defaut de draft_id. |
| `modele` | texte | — | max. caractères 80 | Modèle qui a produit l'analyse (traçabilité). |
| `motifs` | liste de texte | — | max. éléments 10 | Les raisons du verdict, une par entrée, en français accentué. |
| `notes` | liste de texte | — | max. éléments 10 | Remarques qui ne sont ni une pièce ni une tâche (pénalités, retenue de garantie, ce qui n'est PAS à remettre). |
| `pieces_candidature` | liste de texte | — | max. éléments 60 | Une pièce = une entrée (un livrable à produire), en français accentué. Les remarques (« CCAP et CCTP ne sont pas à remettre ») vont dans notes, pas ici : chaque entrée devient une case à cocher sur la fiche. |
| `pieces_offre` | liste de texte | — | max. éléments 60 | Une pièce = une entrée (un livrable à produire). Les pièces du stade attributaire (Kbis, attestations) y ont leur place, une par entrée. |
| `plateforme` | texte | — | max. caractères 200 | Plateforme et heure limite de remise. |
| `qualifications` | liste de texte | — | max. éléments 30 | — |
| `references_exigees` | entier | — | min 0, max 100 | — |
| `resume` | texte | — | max. caractères 4000 | Synthèse courte, en français accentué : de quoi décider d'y aller ou pas. Le verdict lui-même va dans verdict. |
| `signature_electronique` | booléen | — | — | — |
| `taches` | liste de objet | — | max. éléments 40 | Tâches datées proposées : [{titre, echeance}]. Elles s'affichent comme SUGGESTIONS sur la fiche, et s'ajoutent au planning en un clic ; sans adresse e-mail ni téléphone de personne dans le titre. |
| `verdict` | `go` · `no_go` · `a_verifier` | — | — | Le verdict, SÉPARÉ du résumé : go, no_go, ou a_verifier (par exemple une remise passée dont la relance est à confirmer). |
| `visite_obligatoire` | booléen | — | — | — |

## Exemple d'appel

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

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "verdict": "go"
    },
    "name": "marches_dossier_analyse_enregistrer"
  }
}
```

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":{"verdict":"go"},"name":"marches_dossier_analyse_enregistrer"}}'
```

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