Authentification
Chaque requête vers https://mcp.postnext.io/api nécessite un en-tête Authorization avec un jeton Bearer. Vous avez deux façons d'en obtenir un.
OAuth (recommandé pour les clients IA)
Les clients IA exécutent Dynamic Client Registration à la première connexion, puis guident l'utilisateur via un écran de consentement OAuth. La page /mcp/connect le fait automatiquement. Votre client reçoit un jeton d'accès de 30 jours.
Clé API
Pour les scripts et la CI, générez une clé API personnelle dans l'app PostNext via Compte → Clés API. La clé commence par apikey_ et est présentée comme un jeton Bearer ordinaire.
Endpoint
Tous les appels de tools vont vers un unique endpoint JSON-RPC 2.0 en HTTPS POST.
Outils
list_scheduled_posts
Listez vos publications programmées (en file d'attente pour publication mais pas encore envoyées).
Arguments
limitfromRetourne
Un objet avec posts: [{id, platform, content, scheduledAt, status}]. Jusqu'à limit résultats.
Exemple
curl -X POST https://mcp.postnext.io/api \
-H "Authorization: Bearer apikey_xxx" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"tools/call","id":1,
"params":{"name":"list_scheduled_posts",
"arguments":{"limit":5}}}'
list_drafts
Listez vos brouillons (pas encore programmés).
Arguments
limitRetourne
Un objet avec drafts: [{id, platform, content, updatedAt}]. Jusqu'à limit résultats.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":2,
"params":{"name":"list_drafts","arguments":{"limit":10}}}
list_connected_accounts
Listez les comptes sociaux connectés à votre équipe.
Arguments
Aucun argument.
Retourne
Un objet avec accounts: [{platform, handle, connected, lastSyncAt}].
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":3,
"params":{"name":"list_connected_accounts","arguments":{}}}
get_account_healthPlan payant
Obtenez un résumé de santé sur toutes les plateformes connectées.
Arguments
platformwindowDaysRetourne
Un objet avec windowDays, postsScheduled, postsPublished, postsFailed, une ventilation byPlatform et topErrors[].
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":4,
"params":{"name":"get_account_health",
"arguments":{"windowDays":30}}}
create_post_draft
Créez un nouveau brouillon. Les brouillons ne sont pas auto-publiés.
Arguments
platformcontentmediaUrlsclientRequestIdRetourne
Un objet avec le nouveau brouillon : {id, platform, content, status: "DRAFT", createdAt}.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":5,
"params":{"name":"create_post_draft",
"arguments":{"platform":"twitter",
"content":"Hello from MCP"}}}
update_post_draft
Mettez à jour un brouillon existant. Au moins l'un des champs content ou mediaUrls doit être fourni.
Arguments
postIdcontentmediaUrlsclientRequestIdRetourne
Un objet avec le brouillon mis à jour : {id, platform, content, mediaUrls, status, updatedAt}.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":6,
"params":{"name":"update_post_draft",
"arguments":{"postId":"",
"content":"Updated copy"}}}
connect_channel
Générez une URL à usage unique que l'utilisateur peut ouvrir pour autoriser une nouvelle connexion de plateforme.
Arguments
platformRetourne
Un objet avec authUrl (lien à usage unique que l'utilisateur ouvre pour autoriser), expiresAt et platform.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":7,
"params":{"name":"connect_channel",
"arguments":{"platform":"linkedin"}}}
schedule_post
Place un brouillon (statut DRAFT) dans la file de publication BullMQ à un timestamp futur. Idempotent dans une dérive de ±60s; rejette les tentatives de re-planification à une autre heure sans annulation explicite.
Arguments
postIdscheduledAtRetourne
Un objet avec postId, scheduledAt (ISO), status: SCHEDULED.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":8,
"params":{"name":"schedule_post",
"arguments":{"postId":"",
"scheduledAt":"2026-05-10T09:00:00Z"}}}
cancel_scheduled_post
Annule une publication planifiée et la retire de la file. Le brouillon sous-jacent est conservé.
Arguments
postIdRetourne
Un objet avec postId et status: CANCELLED.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":9,
"params":{"name":"cancel_scheduled_post",
"arguments":{"postId":""}}}
delete_draft
Supprime définitivement un brouillon. Refuse les publications non DRAFT (utilisez cancel_scheduled_post pour SCHEDULED).
Arguments
postIdRetourne
Un objet avec postId et deleted: true.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":10,
"params":{"name":"delete_draft",
"arguments":{"postId":""}}}
get_post
Renvoie le PostGroup complet pour un postId avec le contenu par plateforme + statut + timestamps.
Arguments
postIdRetourne
Un objet avec postId, status, scheduledAt, createdAt, updatedAt et providers (carte plateforme → contenu).
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":11,
"params":{"name":"get_post",
"arguments":{"postId":""}}}
search_posts
Recherche de sous-chaîne (insensible à la casse) dans le contenu des publications de l'équipe active. Filtres: status, platform, limit (1-100, défaut 20).
Arguments
querystatusplatformlimitRetourne
Un objet avec posts: [{postId, status, platforms, snippet, scheduledAt, updatedAt}]. Le snippet contient le contexte correspondant avec des points de suspension de chaque côté.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":12,
"params":{"name":"search_posts",
"arguments":{"query":"launch","limit":10}}}
list_teams
Renvoie les équipes dont l'utilisateur authentifié est propriétaire ou admin, l'équipe active étant marquée.
Arguments
Aucun argument.
Retourne
Un objet avec currentTeamId et teams: [{teamId, teamName, isCurrent}].
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":13,
"params":{"name":"list_teams","arguments":{}}}
set_current_team
Change l'équipe active pour ce jeton Bearer. L'utilisateur doit en être membre. Persisté sur le document du jeton OAuth; la mutation in-session le rend immédiatement effectif pour les outils suivants dans la même conversation.
Arguments
teamIdRetourne
Un objet avec teamId, teamName, persisted (true si OAuth, false si clé API) et un note optionnel.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":14,
"params":{"name":"set_current_team",
"arguments":{"teamId":"team_xxxxx"}}}
get_plan_limits
Lit le niveau d'abonnement actuel de l'utilisateur et les quotas par palier (canaux, stockage, crédits IA, publication). Disponible sur tous les plans. Utile avant des outils mutateurs pour prédire si l'appel sera bloqué.
Arguments
Aucun argument.
Retourne
Un objet avec tier, tierDisplayName, isPaid, isTrial, upgradeUrl, limits (channels/storage/aiCalls/posts chacun sous la forme {limit, current, exceeded} ou {limit, allowed}) et creditsAvailable ({total, subscriptionRemaining, purchasedBalance} ou null).
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":15,
"params":{"name":"get_plan_limits","arguments":{}}}
get_post_metrics
Récupère les métriques d'engagement d'une publication publiée sur chaque plateforme où elle a été envoyée. Twitter et Instagram renvoient des métriques peuplées (likes, retweets/partages, commentaires/réponses, impressions); LinkedIn, Threads et TikTok renvoient seulement le statut de publication et l'URL (la collecte d'engagement est reportée à une version ultérieure). Un récapitulatif normalisé totals additionne likes/commentaires/partages/impressions des plateformes ayant fourni des données.
Arguments
postId Identifiant de publication PostNext issu d'un appel de liste.
Retourne
Un objet avec postId, status, providers: [{platform, publishedPostId, publishedUrl, publishedAt, status, metrics}] et totals: {likes, comments, shares, impressions}. metrics est un objet de compteurs numériques par plateforme, ou null lorsque la plateforme ne collecte pas encore l'engagement.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":16,
"params":{"name":"get_post_metrics",
"arguments":{"postId":""}}}
get_publish_status
Diagnostique une publication planifiée : état de la file, succès/erreur par plateforme, temps de traitement et jobId du worker. Renvoie isScheduled=false pour les publications qui existent en brouillon mais n'ont pas été placées dans la file, avec un hint pointant vers schedule_post.
Arguments
postId Identifiant de publication PostNext issu d'un appel de liste.
Retourne
Un objet avec postId, isScheduled, status, scheduledAt, publishedAt, platforms, processingTimeMs, jobId, topLevelError et results: [{platform, success, publishedPostId, publishedAt, error}]. Inclut hint quand isScheduled est false.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":17,
"params":{"name":"get_publish_status",
"arguments":{"postId":""}}}
update_brand_profile
Met à jour le profil de marque actif de l'utilisateur. Champs autorisés : bio, brandVoice, personalityTraits, mainThemes, expertiseAreas, preferredHashtags, audienceSize. Tout autre champ est abandonné silencieusement. Résout "actif" comme défaut d'équipe d'abord, puis le premier profil actif de l'utilisateur.
Arguments
brandVoice Tableau de descripteurs de ton de marque (p. ex. ["professionnel", "concis"]).
Other patchable fields: bio, personalityTraits, mainThemes, expertiseAreas, preferredHashtags, audienceSize.
Retourne
Un objet avec profileId, name, updated: [noms de champs patchés] et les valeurs actuelles de bio, brandVoice, personalityTraits, mainThemes, expertiseAreas, preferredHashtags, audienceSize après le patch.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":18,
"params":{"name":"update_brand_profile",
"arguments":{"brandVoice":["professional","concise"]}}}
get_best_time_to_post Paid plan
Recommande les meilleurs N créneaux (jourDeSemaine, heure) pour la prochaine publication sur une plateforme, classés par engagement par publication des 90 derniers jours. Twitter et Instagram renvoient des scores pondérés par engagement ; LinkedIn, Threads, TikTok classent uniquement par fréquence. Heures dans le fuseau IANA fourni (UTC par défaut). Plan payant requis.
Arguments
platform Plateforme sociale : twitter, instagram, linkedin, threads, ou tiktok.
timezone Nom de fuseau horaire IANA (p. ex. Europe/Paris, America/New_York). UTC par défaut.
topN Nombre de recommandations de créneaux à renvoyer (1-24, 5 par défaut).
Retourne
Un objet avec platform, timezone, sampleWindowDays, sampleSize, metricsAvailable et recommendations: [{dayOfWeek (1-7, Lun=1), dayLabel, hour (0-23), score, basedOn: {posts, avgEngagement}}]. Inclut hint pour les cas cold-start ou métriques indisponibles.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":19,
"params":{"name":"get_best_time_to_post",
"arguments":{"platform":"twitter","timezone":"Europe/Berlin","topN":5}}}
search_tools
Recherche le catalogue d'outils MCP par texte libre, catégorie ou intention. Renvoie catégories, requiresScope, descriptions d'une ligne et les tags de cas d'usage qui correspondent. Disponible sur tous les plans (surface de découverte).
Arguments
All optional. Call with no arguments to list every available tool.
query Recherche libre dans les noms, descriptions et tags d'usage des outils.
category Filtre sur une catégorie : posts, accounts, analytics, brand, teams, discovery, other.
Retourne
Un objet avec totalTools, matchCount, categories: [string[]] et tools: [{name, category, requiresScope, description, useCases, matchedOn: [name|category|description|use_case]}]. Inclut hint quand pas de correspondance ou pas de filtre.
Exemple
{"jsonrpc":"2.0","method":"tools/call","id":20,
"params":{"name":"search_tools",
"arguments":{"query":"why did my post fail"}}}
Ressources MCP
Les ressources sont du contexte en lecture seule que le client peut récupérer via la méthode MCP resources/read. Claude les charge au début de chaque conversation pour avoir le contexte compte/équipe/marque sans qu'il faille le réexpliquer à chaque fois.
postnext://account/summary
E-mail et identifiant du compte (pour que Claude confirme avec quel compte il opère), forfait, crédits IA utilisés / limite, nombre de brouillons, nombre de planifiés, canaux connectés. Comptages plafonnés à 100 chacun pour un chargement rapide.
postnext://channels/connected
Même forme que le résultat de list_connected_accounts; exposé en tant que ressource pour que Claude le charge une fois au début de la conversation (pas d'aller-retour d'appel d'outil).
postnext://brand-profiles/active
Le profil de marque actif de l'utilisateur (par défaut de l'équipe, avec repli sur le premier profil propre). Renvoie uniquement les champs pertinents pour le LLM : bio, expertiseAreas, personalityTraits, brandVoice, mainThemes, audienceSize, preferredHashtags.
postnext://teams/current
Métadonnées de l'équipe actuelle (teamId, teamName) plus totalTeamsAvailable. À combiner avec list_teams + set_current_team pour changer.
Workflows nommés
Raccourcis slash qui orchestrent plusieurs outils. Choisissez-en un et laissez votre assistant IA dérouler une tâche en plusieurs étapes, avec confirmation avant toute modification.
/weekly-plan
Lit le profil de marque, les canaux connectés et la file, puis propose 5-10 brouillons répartis du lundi au vendredi.
/draft-thread
Rédige un fil de 5-10 publications pour Twitter ou Threads à partir d'un sujet ou d'une URL que vous fournissez, dans le ton de votre marque.
/audit-queue
Parcourt les 7 prochains jours de publications planifiées et signale doublons, surcharge de plateforme et créneaux vides.
/channel-sweep
Compare les canaux connectés à la liste des plateformes prises en charge et suggère lesquels connecter ou rafraîchir.
Endpoints de découverte et OAuth
Métadonnées conformes aux standards pour qu'un client MCP puisse s'auto-configurer.
GET /.well-known/oauth-protected-resource/api— RFC 9728GET /.well-known/oauth-authorization-server— RFC 8414GET /oauth/.well-known/openid-configuration— OIDCPOST /oauth/reg— Dynamic Client Registration (RFC 7591)GET /oauth/auth— Authorize (PKCE-S256 required)POST /oauth/token— Token exchange
Open source
Des recettes prêtes à copier et une référence orientée développeurs vivent dans notre dépôt de docs public. Sous licence MIT ; pull requests bienvenues. github.com/postnextio/postnext-mcp
Pilote tes canaux sociaux depuis n'importe quel assistant IA
Planifie, rédige, programme et audite des publications sur 6 plateformes en discutant avec Claude, ChatGPT ou Cursor. Une connexion sécurisée, toutes les fonctionnalités PostNext.