# prescriptio_recherche

Triage rapide multi-source : situe un sujet dans TOUTE la donnee du bati (marches, entreprises, attributions, DCE, permis, contacts, PV de mairies, annonces legales, ventes immobilieres) et rend les ~10 resultats les plus pertinents toutes sources confondues. ATTENTION : SANS filtre de statut (ouvert/ferme) NI de DCE — pour TROUVER ou FILTRER des appels d'offres (statut ouvert, DCE consultable, tri par date limite, publies recemment, ferment bientot), utiliser DIRECTEMENT prescriptio_marches (filtres type:"ouvert", avec_dce:true, sort:"deadline", cloture_dans_jours). Chaque resultat indique sa source : approfondir avec l'outil dedie (fields.approfondir). Un sujet = tous ses mots exiges ("BIM geometre" donne ~0 resultat) ; plusieurs sujets se separent par des virgules ("BIM, geometre" = l'un OU l'autre, 12 au plus).

État : implémenté ; distribution : historique uniquement ; offre payante : false ; effets : lecture.

## Entrée MCP

```json
{
  "properties": {
    "limit": {
      "description": "Nombre de resultats (defaut 10, max 10 — triage toutes sources confondues).",
      "maximum": 10,
      "minimum": 1,
      "type": "integer"
    },
    "localisation": {
      "description": "Zone geographique. UNE granularite : { region } (couvre tous ses departements en un appel — ne jamais les enumerer) OU { dept } OU { commune } (combinable avec dept pour lever un homonyme). National = OMETTRE localisation (jamais dept:\"all\" ni \"france\").",
      "properties": {
        "commune": {
          "description": "Nom de commune (accents/casse ignores), code postal ou code INSEE. Arrondissements de Paris/Lyon/Marseille inclus automatiquement.",
          "type": "string"
        },
        "dept": {
          "description": "Code departement : 2 chiffres (\"69\"), \"2A\"/\"2B\", ou DOM \"971\"-\"976\".",
          "type": "string"
        },
        "insee": {
          "description": "Code INSEE exact issu de la carte. Prioritaire sur commune; jamais interprété comme code postal.",
          "pattern": "^(?:[0-9]{5}|2[A-Ba-b][0-9]{3})$",
          "type": "string"
        },
        "region": {
          "description": "Nom officiel de region (ex. \"Auvergne-Rhone-Alpes\", \"Ile-de-France\").",
          "type": "string"
        }
      },
      "type": "object"
    },
    "query": {
      "description": "Le sujet a rechercher — UN seul sujet par appel.",
      "minLength": 2,
      "type": "string"
    }
  },
  "required": [
    "query"
  ],
  "type": "object"
}
```

## Sortie MCP

```json
{
  "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": {
            "description": "Champs propres à la source.",
            "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"
}
```

[Contrats externes et limites](/docs/reference/concepts.md).
