{
  "components": {
    "schemas": {
      "Error": {
        "properties": {
          "api_contract_version": {
            "type": "string"
          },
          "error": {
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "retry_after_seconds": {
                "type": [
                  "integer",
                  "null"
                ]
              }
            },
            "required": [
              "code",
              "message"
            ],
            "type": "object"
          }
        },
        "required": [
          "error",
          "api_contract_version"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "oauth2": {
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://prescriptio.fr/oauth/authorize",
            "scopes": {
              "mcp:read": "Consulter les données autorisées",
              "mcp:write": "Gérer les alertes et abonnements d'automatisation autorisés"
            },
            "tokenUrl": "https://prescriptio.fr/oauth/token"
          }
        },
        "type": "oauth2"
      }
    }
  },
  "info": {
    "description": "Opérations externes explicitement distribuées. Les outils MCP historiques restent décrits dans le catalogue ; aucune route interne ou d'administration n'est exposée.",
    "title": "Prescriptio — API des intégrations",
    "version": "1.0.0"
  },
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "openapi": "3.1.0",
  "paths": {
    "/api/mcp/v1/alertes.create": {
      "post": {
        "operationId": "alertes_create",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "departement": "69",
                "frequency": "daily",
                "name": "Veille synthétique isolation",
                "query": "isolation",
                "sources": [
                  "marche"
                ]
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "departement": {
                    "description": "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.",
                    "type": "string"
                  },
                  "departements": {
                    "description": "Plusieurs codes departement (memes regles que departement) : une region = la liste de ses departements.",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "frequency": {
                    "description": "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.",
                    "enum": [
                      "realtime",
                      "daily",
                      "weekly"
                    ],
                    "type": "string"
                  },
                  "montant_min": {
                    "description": "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.",
                    "minimum": 0,
                    "type": "number"
                  },
                  "name": {
                    "description": "Nom de l'alerte (requis pour add). Reutiliser un nom existant avec d'AUTRES criteres est une erreur : supprimer puis recreer.",
                    "maxLength": 120,
                    "type": "string"
                  },
                  "query": {
                    "description": "Mots-cles rejoues (requis pour add, 2 caracteres minimum). Une liste separee par des virgules vaut un OU.",
                    "maxLength": 500,
                    "type": "string"
                  },
                  "sources": {
                    "description": "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é). Aucune autre source n'est surveillable : une valeur hors de cette liste est REFUSEE.",
                    "items": {
                      "enum": [
                        "marche",
                        "dce",
                        "attribution",
                        "permis",
                        "reseaux_sociaux",
                        "mairie",
                        "bodacc",
                        "entreprise",
                        "contact",
                        "dvf"
                      ],
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "name",
                  "query"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "action": {
                      "const": "add"
                    },
                    "alerte": {
                      "properties": {
                        "created_at": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "departements": {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        "evaluee": {
                          "type": "string"
                        },
                        "frequency": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "id": {
                          "type": "string"
                        },
                        "is_active": {
                          "type": "boolean"
                        },
                        "kind": {
                          "type": "string"
                        },
                        "montant_min": {
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "name": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "query": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "sources": {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        },
                        "sources_surveillees": {
                          "items": {
                            "type": "string"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    },
                    "created": {
                      "type": "boolean"
                    },
                    "unchanged": {
                      "type": "boolean"
                    },
                    "warnings": {
                      "items": {
                        "type": "string"
                      },
                      "type": "array"
                    }
                  },
                  "required": [
                    "action",
                    "created"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:write"
            ]
          }
        ],
        "summary": "Créer une alerte autorisée. Même nom et mêmes critères : rejeu sans duplication ; critères différents : conflit. Le cron évalue périodiquement, sans garantie de temps réel amont.",
        "tags": [
          "alertes"
        ],
        "x-prescriptio-effect": "write",
        "x-prescriptio-mcp": "prescriptio_alerte",
        "x-prescriptio-paid-only": true
      }
    },
    "/api/mcp/v1/alertes.delete": {
      "post": {
        "operationId": "alertes_delete",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "id": "00000000-0000-0000-0000-000000000001"
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "id": {
                    "description": "UUID de l'alerte (requis pour remove ; via action:list).",
                    "type": "string"
                  }
                },
                "required": [
                  "id"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "action": {
                      "const": "remove"
                    },
                    "id": {
                      "type": "string"
                    },
                    "removed": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "action",
                    "removed",
                    "id"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:write"
            ]
          }
        ],
        "summary": "Supprimer une alerte de l'utilisateur ; une suppression répétée est sans effet supplémentaire.",
        "tags": [
          "alertes"
        ],
        "x-prescriptio-effect": "write",
        "x-prescriptio-mcp": "prescriptio_alerte",
        "x-prescriptio-paid-only": true
      }
    },
    "/api/mcp/v1/alertes.list": {
      "post": {
        "operationId": "alertes_list",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {},
              "schema": {
                "additionalProperties": false,
                "properties": {},
                "required": [],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "action": {
                      "const": "list"
                    },
                    "items": {
                      "items": {
                        "properties": {
                          "created_at": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "departements": {
                            "items": {
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "evaluee": {
                            "type": "string"
                          },
                          "frequency": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "id": {
                            "type": "string"
                          },
                          "is_active": {
                            "type": "boolean"
                          },
                          "kind": {
                            "type": "string"
                          },
                          "montant_min": {
                            "type": [
                              "number",
                              "null"
                            ]
                          },
                          "name": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "query": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "sources": {
                            "items": {
                              "type": "string"
                            },
                            "type": "array"
                          },
                          "sources_surveillees": {
                            "items": {
                              "type": "string"
                            },
                            "type": "array"
                          }
                        },
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "total": {
                      "type": "integer"
                    }
                  },
                  "required": [
                    "action",
                    "total",
                    "items"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:read"
            ]
          }
        ],
        "summary": "Lister les alertes appartenant à l'utilisateur et à son organisation ; maximum 200.",
        "tags": [
          "alertes"
        ],
        "x-prescriptio-effect": "read",
        "x-prescriptio-mcp": "prescriptio_alerte",
        "x-prescriptio-paid-only": true
      }
    },
    "/api/mcp/v1/dce.download": {
      "post": {
        "operationId": "dce_download",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "marche_id": "fixture-dce-001"
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "filename": {
                    "description": "Nom exact d'une piece a telecharger (facultatif). Omis, ou piece non stockee isolement : l'archive complete du dossier est renvoyee.",
                    "type": "string"
                  },
                  "marche_id": {
                    "description": "Identifiant du dossier : UUID de marche OU annonce_id betterplace (ex \"2833189\").",
                    "type": "string"
                  }
                },
                "required": [
                  "marche_id"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "action": {
                      "const": "telechargement_dce"
                    },
                    "content_type": {
                      "type": "string"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "doc_type": {
                      "type": "string"
                    },
                    "download_url": {
                      "description": "Lien temporaire ; ne pas journaliser ni indexer.",
                      "type": "string"
                    },
                    "expires_in": {
                      "type": "integer"
                    },
                    "fichiers": {
                      "items": {
                        "properties": {
                          "filename": {
                            "type": "string"
                          },
                          "pages_estimees": {
                            "type": "integer"
                          },
                          "parties": {
                            "type": "integer"
                          }
                        },
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "fields": {
                      "type": "object"
                    },
                    "filename": {
                      "type": "string"
                    },
                    "hint": {
                      "type": "string"
                    },
                    "marche_id": {
                      "type": "string"
                    },
                    "ok": {
                      "const": true
                    },
                    "page": {
                      "type": "integer"
                    },
                    "pages_total": {
                      "type": "integer"
                    },
                    "query": {
                      "type": "string"
                    },
                    "results": {
                      "items": {
                        "properties": {
                          "acheteur": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "doc_type": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "extrait": {
                            "type": "string"
                          },
                          "filename": {
                            "type": "string"
                          },
                          "lieu": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "marche_id": {
                            "type": "string"
                          },
                          "titre": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "texte": {
                      "type": "string"
                    },
                    "titre": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "ok",
                    "action",
                    "marche_id",
                    "filename",
                    "download_url",
                    "content_type",
                    "expires_in"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:read"
            ]
          }
        ],
        "summary": "Obtenir un téléchargement autorisé de DCE. Un lien signé est temporaire, ne constitue pas une citation durable et ne doit pas être journalisé.",
        "tags": [
          "dce"
        ],
        "x-prescriptio-effect": "read",
        "x-prescriptio-mcp": "prescriptio_dce_download",
        "x-prescriptio-paid-only": false
      }
    },
    "/api/mcp/v1/dce.read": {
      "post": {
        "operationId": "dce_read",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "marche_id": "fixture-dce-001",
                "type": "rc"
              },
              "schema": {
                "additionalProperties": false,
                "anyOf": [
                  {
                    "required": [
                      "query"
                    ]
                  },
                  {
                    "required": [
                      "marche_id",
                      "type"
                    ]
                  }
                ],
                "properties": {
                  "filename": {
                    "description": "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.",
                    "type": "string"
                  },
                  "marche_id": {
                    "description": "Identifiant du dossier : marche_id (UUID) OU annonce_id betterplace (ex \"2833189\") — les deux sont acceptes. Requis en mode lecture.",
                    "type": "string"
                  },
                  "page": {
                    "default": 1,
                    "description": "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.",
                    "minimum": 1,
                    "type": "integer"
                  },
                  "query": {
                    "description": "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 (offre payante).",
                    "type": "string"
                  },
                  "type": {
                    "description": "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.",
                    "enum": [
                      "rc",
                      "cctp",
                      "ccap",
                      "dpgf",
                      "bpu"
                    ],
                    "type": "string"
                  }
                },
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "action": {
                      "enum": [
                        "sommaire_dce",
                        "lecture_dce",
                        "recherche_dce",
                        "recherche_dans_dossier"
                      ]
                    },
                    "count": {
                      "type": "integer"
                    },
                    "doc_type": {
                      "type": "string"
                    },
                    "fichiers": {
                      "items": {
                        "properties": {
                          "filename": {
                            "type": "string"
                          },
                          "pages_estimees": {
                            "type": "integer"
                          },
                          "parties": {
                            "type": "integer"
                          }
                        },
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "fields": {
                      "type": "object"
                    },
                    "filename": {
                      "type": "string"
                    },
                    "hint": {
                      "type": "string"
                    },
                    "marche_id": {
                      "type": "string"
                    },
                    "ok": {
                      "const": true
                    },
                    "page": {
                      "type": "integer"
                    },
                    "pages_total": {
                      "type": "integer"
                    },
                    "query": {
                      "type": "string"
                    },
                    "results": {
                      "items": {
                        "properties": {
                          "acheteur": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "doc_type": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "extrait": {
                            "type": "string"
                          },
                          "filename": {
                            "type": "string"
                          },
                          "lieu": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "marche_id": {
                            "type": "string"
                          },
                          "titre": {
                            "type": [
                              "string",
                              "null"
                            ]
                          }
                        },
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "texte": {
                      "type": "string"
                    },
                    "titre": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "ok",
                    "action"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:read"
            ]
          }
        ],
        "summary": "Rechercher dans un dossier ou lire une pièce ciblée. L'identifiant canonique est annonce_id ; les modes sont décrits dans le schéma.",
        "tags": [
          "dce"
        ],
        "x-prescriptio-effect": "read",
        "x-prescriptio-mcp": "prescriptio_dce",
        "x-prescriptio-paid-only": false
      }
    },
    "/api/mcp/v1/entreprises.get": {
      "post": {
        "operationId": "entreprises_get",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "siren": "000000001"
              },
              "schema": {
                "additionalProperties": false,
                "oneOf": [
                  {
                    "required": [
                      "siren"
                    ]
                  },
                  {
                    "required": [
                      "siret"
                    ]
                  }
                ],
                "properties": {
                  "siren": {
                    "description": "SIREN 9 chiffres : fiche complete de l'entreprise (identite, NAF, effectif, forme juridique, creation, dirigeants, evolution du chiffre d'affaires).",
                    "pattern": "^\\d{9}$",
                    "type": "string"
                  },
                  "siret": {
                    "description": "SIRET 14 chiffres : fiche d'un etablissement precis.",
                    "pattern": "^\\d{14}$",
                    "type": "string"
                  }
                },
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "_meta": {
                      "type": "object"
                    },
                    "next_cursor": {
                      "description": "À repasser tel quel pour la page suivante ; null s'il n'y en a plus.",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "results": {
                      "description": "Résultats de la page courante.",
                      "items": {
                        "properties": {
                          "fields": {
                            "properties": {
                              "adresse": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "capital_social_eur": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "categorie": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "code_naf": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "code_postal": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "date_creation": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "departement": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "dirigeants": {
                                "items": {
                                  "type": "object"
                                },
                                "type": "array"
                              },
                              "effectif": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "est_rge": {
                                "type": "boolean"
                              },
                              "etat": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "evolution_ca": {
                                "items": {
                                  "type": "object"
                                },
                                "type": "array"
                              },
                              "forme_juridique": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "libelle_naf": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "nom_commercial": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "nombre_certifications_actives": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "raison_sociale": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "raison_sociale_connue": {
                                "type": "boolean"
                              },
                              "rge_date_fin": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "rge_domaines": {
                                "items": {
                                  "type": "string"
                                },
                                "type": "array"
                              },
                              "siren": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "siret": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "url": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "ville": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              }
                            },
                            "type": "object"
                          },
                          "id": {
                            "description": "Identifiant à citer (SIREN/SIRET, marche_id, réf DECP).",
                            "type": "string"
                          },
                          "resume": {
                            "type": "string"
                          },
                          "titre": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "id"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "total_estimated": {
                      "description": "Total connu ou estimation signalée par la source ; null si le total est inconnu. Ne jamais extrapoler depuis la taille de la page.",
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "results"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:read"
            ]
          }
        ],
        "summary": "Consulter une entreprise par SIREN ou un établissement par SIRET. Enveloppe results contenant une fiche.",
        "tags": [
          "entreprises"
        ],
        "x-prescriptio-effect": "read",
        "x-prescriptio-mcp": "prescriptio_entreprises",
        "x-prescriptio-paid-only": false
      }
    },
    "/api/mcp/v1/entreprises.search": {
      "post": {
        "operationId": "entreprises_search",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "limit": 20,
                "localisation": {
                  "dept": "69"
                },
                "naf": [
                  "71.11Z"
                ]
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "cursor": {
                    "description": "Curseur next_cursor de la page precedente, repasse tel quel.",
                    "type": "string"
                  },
                  "limit": {
                    "default": 20,
                    "maximum": 50,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "localisation": {
                    "additionalProperties": false,
                    "description": "Zone geographique (mode liste), UNE granularite. National = omettre (jamais dept:\"all\").",
                    "properties": {
                      "commune": {
                        "description": "Nom de commune, code postal ou code INSEE. Préférer insee pour le code fourni par la carte.",
                        "type": "string"
                      },
                      "dept": {
                        "description": "Code departement : 01-95, 2A/2B ou 971-976 (ex. \"69\").",
                        "type": "string"
                      },
                      "insee": {
                        "description": "Code INSEE exact; prioritaire sur commune et jamais interprété comme code postal.",
                        "type": "string"
                      },
                      "region": {
                        "description": "Nom de region (ex. Auvergne-Rhone-Alpes) — couvre tous ses departements en un appel.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "naf": {
                    "description": "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).",
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "query": {
                    "description": "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.",
                    "type": "string"
                  },
                  "rge": {
                    "description": "Ne retenir que les entreprises actives dont la qualification RGE est valable aujourd'hui. Une localisation est requise sans query ni naf.",
                    "type": "boolean"
                  },
                  "specialite_rge": {
                    "description": "Même famille de qualification que la carte RGE; implique rge=true.",
                    "enum": [
                      "menuiseries",
                      "pac",
                      "isolation",
                      "chauffage",
                      "solaire",
                      "bois",
                      "ventilation",
                      "etudes"
                    ],
                    "type": "string"
                  }
                },
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "_meta": {
                      "type": "object"
                    },
                    "next_cursor": {
                      "description": "À repasser tel quel pour la page suivante ; null s'il n'y en a plus.",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "results": {
                      "description": "Résultats de la page courante.",
                      "items": {
                        "properties": {
                          "fields": {
                            "properties": {
                              "adresse": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "capital_social_eur": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "categorie": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "code_naf": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "code_postal": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "date_creation": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "departement": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "dirigeants": {
                                "items": {
                                  "type": "object"
                                },
                                "type": "array"
                              },
                              "effectif": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "est_rge": {
                                "type": "boolean"
                              },
                              "etat": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "evolution_ca": {
                                "items": {
                                  "type": "object"
                                },
                                "type": "array"
                              },
                              "forme_juridique": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "libelle_naf": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "nom_commercial": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "nombre_certifications_actives": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "raison_sociale": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "raison_sociale_connue": {
                                "type": "boolean"
                              },
                              "rge_date_fin": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "rge_domaines": {
                                "items": {
                                  "type": "string"
                                },
                                "type": "array"
                              },
                              "siren": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "siret": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "url": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "ville": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              }
                            },
                            "type": "object"
                          },
                          "id": {
                            "description": "Identifiant à citer (SIREN/SIRET, marche_id, réf DECP).",
                            "type": "string"
                          },
                          "resume": {
                            "type": "string"
                          },
                          "titre": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "id"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "total_estimated": {
                      "description": "Total connu ou estimation signalée par la source ; null si le total est inconnu. Ne jamais extrapoler depuis la taille de la page.",
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "results"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:read"
            ]
          }
        ],
        "summary": "Rechercher des entreprises par activité NAF, nom et localisation. Résultats paginés sans coordonnées.",
        "tags": [
          "entreprises"
        ],
        "x-prescriptio-effect": "read",
        "x-prescriptio-mcp": "prescriptio_entreprises",
        "x-prescriptio-paid-only": false
      }
    },
    "/api/mcp/v1/events.ack": {
      "post": {
        "operationId": "events_ack",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "ack_token": "synthetic-use-token-from-poll",
                "subscription_id": "00000000-0000-0000-0000-000000000002"
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "ack_token": {
                    "maxLength": 512,
                    "type": "string"
                  },
                  "subscription_id": {
                    "type": "string"
                  }
                },
                "required": [
                  "subscription_id",
                  "ack_token"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "acknowledged": {
                      "type": "boolean"
                    },
                    "subscription_id": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "subscription_id",
                    "acknowledged"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:write"
            ]
          }
        ],
        "summary": "Acquitter un événement après traitement réussi. Chaque ack_token est lié à l'abonnement et à l'événement ; les acquittements hors ordre ne perdent pas les événements précédents.",
        "tags": [
          "events"
        ],
        "x-prescriptio-effect": "write",
        "x-prescriptio-mcp": "prescriptio_evenements_acquitter",
        "x-prescriptio-paid-only": true
      }
    },
    "/api/mcp/v1/events.poll": {
      "post": {
        "operationId": "events_poll",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "subscription_id": "00000000-0000-0000-0000-000000000002"
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "checkpoint": {
                    "maxLength": 512,
                    "type": "string"
                  },
                  "limit": {
                    "default": 100,
                    "maximum": 100,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "subscription_id": {
                    "type": "string"
                  }
                },
                "required": [
                  "subscription_id"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "checkpoint": {
                      "type": "string"
                    },
                    "has_more": {
                      "type": "boolean"
                    },
                    "results": {
                      "items": {
                        "properties": {
                          "ack_token": {
                            "type": "string"
                          },
                          "alerte_id": {
                            "type": "string"
                          },
                          "entity_id": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "entity_type": {
                            "type": [
                              "string",
                              "null"
                            ]
                          },
                          "id": {
                            "type": "string"
                          },
                          "occurred_at": {
                            "format": "date-time",
                            "type": "string"
                          },
                          "recorded_at": {
                            "format": "date-time",
                            "type": "string"
                          },
                          "subscription_id": {
                            "type": "string"
                          },
                          "type": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "id",
                          "alerte_id",
                          "type",
                          "occurred_at",
                          "recorded_at",
                          "subscription_id",
                          "ack_token"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    }
                  },
                  "required": [
                    "results",
                    "checkpoint",
                    "has_more"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:read"
            ]
          }
        ],
        "summary": "Lire au plus 100 événements après un checkpoint propre à l'abonnement. Rejouer un checkpoint retourne les mêmes identifiants ; aucun acquittement implicite.",
        "tags": [
          "events"
        ],
        "x-prescriptio-effect": "read",
        "x-prescriptio-mcp": "prescriptio_evenements",
        "x-prescriptio-paid-only": true
      }
    },
    "/api/mcp/v1/events.revoke": {
      "post": {
        "operationId": "events_revoke",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "subscription_id": "00000000-0000-0000-0000-000000000002"
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "subscription_id": {
                    "type": "string"
                  }
                },
                "required": [
                  "subscription_id"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "revoked": {
                      "type": "boolean"
                    }
                  },
                  "required": [
                    "id",
                    "revoked"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:write"
            ]
          }
        ],
        "summary": "Révoquer un abonnement. Les prochains polls sont refusés immédiatement.",
        "tags": [
          "events"
        ],
        "x-prescriptio-effect": "write",
        "x-prescriptio-mcp": "prescriptio_evenements_revoquer",
        "x-prescriptio-paid-only": true
      }
    },
    "/api/mcp/v1/events.subscribe": {
      "post": {
        "operationId": "events_subscribe",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "alerte_id": "00000000-0000-0000-0000-000000000001",
                "key": "scenario-isolation"
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "alerte_id": {
                    "type": "string"
                  },
                  "key": {
                    "maxLength": 120,
                    "minLength": 1,
                    "type": "string"
                  }
                },
                "required": [
                  "alerte_id",
                  "key"
                ],
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "checkpoint": {
                      "type": "string"
                    },
                    "created": {
                      "type": "boolean"
                    },
                    "first_run": {
                      "type": "string"
                    },
                    "id": {
                      "type": "string"
                    },
                    "subscription_id": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "subscription_id",
                    "created",
                    "checkpoint"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:write"
            ]
          }
        ],
        "summary": "Créer un abonnement de polling à une alerte active. Premier démarrage : événements futurs seulement. Conserver une clé stable par automatisation.",
        "tags": [
          "events"
        ],
        "x-prescriptio-effect": "write",
        "x-prescriptio-mcp": "prescriptio_evenements_abonner",
        "x-prescriptio-paid-only": true
      }
    },
    "/api/mcp/v1/marches.search": {
      "post": {
        "operationId": "marches_search",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "avec_dce": true,
                "limit": 20,
                "localisation": {
                  "dept": "69"
                },
                "query": "isolation",
                "sort": "deadline",
                "type": "ouvert"
              },
              "schema": {
                "additionalProperties": false,
                "properties": {
                  "avec_dce": {
                    "description": "true = uniquement les marches dont le DOSSIER (DCE) est consultable DANS Prescriptio via prescriptio_dce — pas le lien externe plateforme acheteur. Chaque resultat porte fields.dce_consultable.",
                    "type": "boolean"
                  },
                  "cloture_dans_jours": {
                    "description": "Date limite dans les N prochains jours (7 = ferment cette semaine). Combiner avec sort:\"deadline\".",
                    "maximum": 3650,
                    "minimum": 0,
                    "type": "integer"
                  },
                  "cursor": {
                    "description": "Curseur next_cursor de la page precedente, repasse tel quel.",
                    "type": "string"
                  },
                  "limit": {
                    "default": 20,
                    "maximum": 50,
                    "minimum": 1,
                    "type": "integer"
                  },
                  "localisation": {
                    "additionalProperties": false,
                    "description": "Zone geographique, UNE granularite. National = omettre (jamais dept:\"all\").",
                    "properties": {
                      "commune": {
                        "description": "Nom de la commune de l'ACHETEUR.",
                        "type": "string"
                      },
                      "dept": {
                        "description": "Code departement : 01-95, 2A/2B ou 971-978 (ex : \"69\").",
                        "type": "string"
                      },
                      "region": {
                        "description": "Nom de region (ex : Auvergne-Rhone-Alpes, PACA) — couvre tous ses departements en un appel.",
                        "type": "string"
                      }
                    },
                    "type": "object"
                  },
                  "publie_depuis_jours": {
                    "description": "Publies dans les N derniers jours (1 = veille du jour). Combiner avec sort:\"recent\".",
                    "maximum": 3650,
                    "minimum": 0,
                    "type": "integer"
                  },
                  "query": {
                    "description": "Recherche plein texte (titre, objet, acheteur, CPV). UNE requete = UN sujet : le plein texte exige TOUS les mots. Optionnelle si un filtre date/zone/type est fourni.",
                    "type": "string"
                  },
                  "sort": {
                    "description": "deadline = ferme le plus tot d'abord ; recent = publie le plus recemment d'abord ; pertinence (defaut avec query).",
                    "enum": [
                      "deadline",
                      "recent",
                      "pertinence"
                    ],
                    "type": "string"
                  },
                  "type": {
                    "description": "ouvert = encore en consultation (une offre peut etre deposee) ; ferme = cloture ou attribue. Omis = les deux.",
                    "enum": [
                      "ouvert",
                      "ferme"
                    ],
                    "type": "string"
                  }
                },
                "type": "object"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "_meta": {
                      "type": "object"
                    },
                    "next_cursor": {
                      "description": "À repasser tel quel pour la page suivante ; null s'il n'y en a plus.",
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "results": {
                      "description": "Résultats de la page courante.",
                      "items": {
                        "properties": {
                          "fields": {
                            "properties": {
                              "acheteur": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "codes_cpv": {
                                "items": {
                                  "type": "string"
                                },
                                "type": "array"
                              },
                              "date_attribution": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "date_limite": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "date_publication": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "dce_consultable": {
                                "type": "boolean"
                              },
                              "dept": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "duree_mois": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "id_boamp": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "jours_avant_cloture": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "montant_attribution": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "montant_estime_max": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "nature": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "statut": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "titulaire": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "type_marche": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "url": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "url_avis": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "ville": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              }
                            },
                            "type": "object"
                          },
                          "id": {
                            "description": "Identifiant à citer (SIREN/SIRET, marche_id, réf DECP).",
                            "type": "string"
                          },
                          "resume": {
                            "type": "string"
                          },
                          "titre": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "id"
                        ],
                        "type": "object"
                      },
                      "type": "array"
                    },
                    "total_estimated": {
                      "description": "Total connu ou estimation signalée par la source ; null si le total est inconnu. Ne jamais extrapoler depuis la taille de la page.",
                      "type": [
                        "integer",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "results"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Résultat métier autorisé"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Paramètre ou curseur invalide",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Jeton absent, expiré ou révoqué",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Scope, forfait ou accès insuffisant",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Objet ou opération introuvable",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Clé déjà utilisée avec d'autres critères",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Quota dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Dépendance indisponible",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          },
          "504": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Délai dépassé",
            "headers": {
              "Retry-After": {
                "description": "Délai en secondes lorsqu'il est connu",
                "schema": {
                  "type": "integer"
                }
              }
            }
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:read"
            ]
          }
        ],
        "summary": "Rechercher les avis de marchés ; ouvert et avec_dce filtrent des avis et des pièces consultables dans Prescriptio, pas des attributions.",
        "tags": [
          "marches"
        ],
        "x-prescriptio-effect": "read",
        "x-prescriptio-mcp": "prescriptio_marches",
        "x-prescriptio-paid-only": false
      }
    },
    "/api/mcp/v1/me": {
      "get": {
        "operationId": "connection_test",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "properties": {
                    "authenticated": {
                      "type": "boolean"
                    },
                    "scope": {
                      "type": "string"
                    },
                    "tier": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "authenticated",
                    "tier",
                    "scope"
                  ],
                  "type": "object"
                }
              }
            },
            "description": "Connexion autorisée"
          },
          "401": {
            "description": "Jeton absent ou révoqué"
          },
          "403": {
            "description": "Portée insuffisante"
          }
        },
        "security": [
          {
            "oauth2": [
              "mcp:read"
            ]
          }
        ],
        "summary": "Tester le jeton et lire son forfait et ses scopes, sans donnée personnelle."
      }
    }
  },
  "servers": [
    {
      "url": "https://prescriptio.fr"
    }
  ]
}
