# prescriptio_linkedin_posts

Lire le TEXTE de vos publications LinkedIn pour ecrire avec votre voix (scope:mine, defaut, recentes d'abord), ou rechercher des exemples dans la base commune de publications publiques collectees (scope:shared, query, author). Texte jusqu'a 16000 caracteres, source, disponibilite et troncature explicites ; pagination next_cursor. Un apercu n'est pas un texte integral. Les posts communs ne prouvent pas votre style. Aucun envoi ni collecte. Pour les statistiques : prescriptio_linkedin_perf.

| | |
|---|---|
| Effets | lecture seule |
| Portée OAuth | `mcp:read` |
| Offre requise | aucune — ouvert à tous les comptes |
| Données lues | `mine` : vos publications et statistiques privées ; `shared` : publications publiques du corpus commun, sans impressions privées |
| Distribution | MCP historique |

Cet outil n'a pas d'équivalent REST : il s'appelle par le connecteur MCP.

## Paramètres

| Paramètre | Type | Requis | Bornes | Description |
|---|---|---|---|---|
| `author` | texte | — | min. caractères 1, max. caractères 200 | shared uniquement : nom ou URL du profil de l'auteur, recherche litterale. |
| `cursor` | texte | — | min. caractères 1, max. caractères 5 | next_cursor de la page precedente, avec les memes filtres. Maximum 10000 ; affiner au-dela. |
| `limit` | entier | — | min 1, max 50, défaut `10` | — |
| `post_urn` | texte | — | min. caractères 1, max. caractères 100 | Relire une publication par l'identifiant post_urn rendu par cet outil. |
| `query` | texte | — | min. caractères 1, max. caractères 300 | Texte recherche. Dans shared : mots entiers, accents ignores ; virgules ou points-virgules separent des sujets alternatifs. |
| `scope` | `mine` · `shared` | — | défaut `"mine"` | mine : vos publications, pour lire votre voix ; shared : corpus commun de publications publiques collectees, jamais les statistiques privees des autres comptes. |
| `type` | `text` · `image` · `video` · `article` · `newsletter` · `document` · `poll` · `post` | — | — | — |

Tout autre paramètre est refusé (`additionalProperties: false`).

## Exemple d'appel

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

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "scope": "mine"
    },
    "name": "prescriptio_linkedin_posts"
  }
}
```

En HTTP, c'est ce corps que l'on poste :

```bash
curl -sS https://prescriptio.fr/api/mcp \
  -H 'Authorization: Bearer <jeton>' \
  -H 'Content-Type: application/json' \
  -d '{"id":1,"jsonrpc":"2.0","method":"tools/call","params":{"arguments":{"scope":"mine"},"name":"prescriptio_linkedin_posts"}}'
```

## Forme de la réponse

Le résultat est enveloppé par le protocole : un bloc `content[0].text` qui porte le JSON sérialisé, et `structuredContent` qui porte le même objet. Le squelette ci-dessous donne les **types**, jamais des valeurs réelles.

```json
{
  "_meta": {},
  "next_cursor": "<texte>",
  "results": [
    {
      "fields": {
        "author_name": "<texte>",
        "author_url": "<texte>",
        "comments_count": 0,
        "content_chars": 0,
        "content_source": "own_post",
        "content_status": "captured",
        "content_text": "<texte>",
        "content_truncated": false,
        "impressions": 0,
        "post_type": "<texte>",
        "post_url": "<texte>",
        "post_urn": "<texte>",
        "posted_at": "<texte>",
        "reactions_count": 0,
        "reposts_count": 0
      },
      "id": "<texte>",
      "resume": "<texte>",
      "titre": "<texte>"
    }
  ],
  "total_estimated": 0
}
```

Un champ absent ou `null` n'est ni un zéro ni une estimation : la source ne l'a pas renseigné. Les propriétés additionnelles restent autorisées ; ce squelette n'invente pas les champs manquants.

## Erreurs

Le connecteur MCP renvoie une erreur JSON-RPC pour ce qui empêche l'appel, et une erreur *métier* (`isError`) lisible par le modèle pour ce que l'appel n'a pas pu faire.

| Code JSON-RPC | Quand | Que faire |
|---|---|---|
| `-32601` | Outil inconnu | Appeler `tools/list` ; ne pas deviner un nom |
| `-32602` | Argument absent ou hors schéma | Corriger l'argument nommé dans le message |
| `-32003` | Portée OAuth absente de l'autorisation | Reconnecter en acceptant `mcp:read` ou `mcp:write` |
| `-32004` | Quota dépassé | Attendre le délai indiqué ; ne jamais boucler |
| `-32603` | Dépendance indisponible | Réessayer plus tard ; ne pas rejouer une écriture sans vérifier |

Sur les routes REST `/api/mcp/v1/*`, les mêmes situations sont des codes HTTP : `400 invalid_arguments` / `invalid_cursor`, `401 unauthenticated`, `403 insufficient_scope` / `access_denied` / `user_required` / `organization_required` / `role_denied`, `404 not_found`, `409 conflict`, `429 quota_exceeded` (avec `Retry-After` quand il est connu), `503 unavailable`, `504 timeout`. Le corps porte `error.code`, `error.message`, `error.retry_after_seconds` et `api_contract_version`.

⚠ Un message d'erreur n'est jamais une donnée : ne pas le recopier comme un fait, et ne pas inventer un identifiant ou une URL qu'il ne contient pas.

## Quotas

Un appel compte pour **une unité** dans les deux compteurs d'appels, partagés entre le connecteur MCP et les routes REST :

| Compteur | Compte gratuit | Abonné | Accès interne |
|---|---|---|---|
| Appels / 24 h glissantes | 100 | 5000 | illimité |
| Appels / 60 s (anti-rafale) | 5 | 30 | illimité |
| Dossiers distincts / jour civil (Paris) | 5 | 500 | illimité |

Cet outil ne consomme aucune unité de dossier : chercher est gratuit, c'est la lecture d'un dossier (`prescriptio_dce`, `prescriptio_mairies` et leurs téléchargements) qui est décomptée.

**Aucun outil n'est réservé à une offre** (décision du 2026-09-17) : un compte gratuit voit et appelle le catalogue entier, ce sont ces plafonds qui bornent son usage.

## Voir aussi

[Référence technique](/docs/reference/concepts.md) · [Tous les outils](/docs/api/index.md) · [OpenAPI](/openapi.json) · [Texte pour agents](/llms-full.txt)
