mcp-plus-tard
Plus Tard MCP
Conecte su asistente de IA (Claude, Cursor, n8n…) a Plus Tard para programar sus publicaciones en Facebook, Instagram, LinkedIn, X/Twitter, TikTok, Threads, Bluesky y Google My Business mediante una simple conversación.
Endpoint de producción : https://mcp.plus-tard.com/mcp/
Documentación de usuario : https://plus-tard.com/api-mcp
Demo en 30 segundos
Usted : « Programa una publicación de Facebook en mi página Boréales mañana a las 10h: "¡Hola mundo!" »
Claude llama automáticamente a:
list_accounts→ encuentra el identificador de Facebook de "Boréales"
schedule_post(provider="facebook", page_id="…", planned_at="2026-05-05T10:00:00Z", text="¡Hola mundo!")Plus Tard : ✅ Publicación #1432 programada para el 05/05/2026 a las 10:00.
Related MCP server: atlas-social-mcp
Herramientas (5)
Herramienta | Descripción |
| Verifica que una clave API esté activa y devuelve sus metadatos. |
| Lista todas las cuentas de redes sociales conectadas a Plus Tard. |
| Programa una publicación en una sola red (1 llamada = 1 red). |
| Crea un nuevo usuario y devuelve una URL OAuth. |
| Detalle de un usuario: proveedores conectados y subcuentas. |
Recursos (2)
URI | Contenido |
| Lista JSON de las cuentas conectadas. |
| Detalle JSON de un usuario. |
Instalación del lado del cliente
Claude Desktop
Añada a ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) :
{
"mcpServers": {
"plus-tard": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.plus-tard.com/mcp/",
"--header",
"X-Api-Key:${PLUS_TARD_TOKEN}"
],
"env": {
"PLUS_TARD_TOKEN": "your_plus_tard_api_key"
}
}
}
}Claude Code (CLI)
claude mcp add plus-tard \
--transport http https://mcp.plus-tard.com/mcp/ \
--header "X-Api-Key: your_plus_tard_api_key"Claude.ai (web)
Settings → Connectors → Add custom connector — URL https://mcp.plus-tard.com/mcp/, header X-Api-Key: your_key.
Cursor / n8n
Mismas URL y header. Consulte la documentación completa.
Self-host (para desarrolladores)
Stack
Python 3.12 · FastAPI ·
mcp[fastapi](Streamable HTTP transport)httpx · pydantic v2 · pydantic-settings
pytest · pytest-asyncio · respx
Arquitectura
Client (Claude/Cursor/n8n)
│ Streamable HTTP + X-Api-Key header
▼
MCP server (this repo)
│ X-Api-Key forwarded as-is
▼
Plus Tard Symfony APICada solicitud MCP llega con X-Api-Key, que se propaga tal cual a
la API de Plus Tard. Sin sesión, sin almacenamiento del lado del servidor — cada
cliente utiliza su propia clave.
Desarrollo local
git clone https://github.com/<votre-org>/plus-tard-mcp.git
cd plus-tard-mcp
python3.12 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env
# Édite .env : PLUS_TARD_BASE_URL=https://plus-tard.com
uvicorn main:app --reload --port 8001El servidor escucha en http://127.0.0.1:8001/mcp/. Prueba rápida con el
MCP Inspector :
npx @modelcontextprotocol/inspector
# Transport: Streamable HTTP
# URL: http://127.0.0.1:8001/mcp/
# Header: X-Api-Key = ta_clef_plus_tardPruebas
pytest
# 24 passedDespliegue Docker (producción)
El repositorio proporciona Dockerfile + docker-compose.yml listos para un VPS
con nginx-proxy +
acme-companion :
sudo docker compose up -d --buildConsulte deploy/README.md para más detalles (snippet
nginx-proxy SSE-friendly, gestión TLS Let's Encrypt, actualización).
Configuración
Variable | Descripción | Por defecto |
| URL base de la API Plus Tard | (requerido) |
| Bind host para uvicorn |
|
| Bind port para uvicorn |
|
La autenticación se realiza por solicitud a través del header X-Api-Key —
ningún token se almacena del lado del servidor.
Hosts autorizados
El SDK MCP activa una protección anti-DNS rebinding que solo autoriza a los hosts incluidos en la lista blanca. Los hosts por defecto son:
mcp.plus-tard.comlocalhost,127.0.0.1(para desarrollo)
Para añadir su propio dominio, edite la lista en main.py
(TransportSecuritySettings.allowed_hosts).
Estructura del proyecto
.
├── main.py # FastAPI + FastMCP + middleware X-Api-Key
├── app/
│ ├── config.py # Settings via pydantic-settings
│ ├── auth/ # Dependency X-Api-Key (réutilisable hors MCP)
│ ├── models/ # Schémas pydantic v2 (post, account, user)
│ ├── services/ # PlusTardClient async (httpx)
│ └── tools/ # 5 tools métier (str → str)
├── tests/ # 24 tests pytest-asyncio
├── deploy/
│ ├── README.md # Guide déploiement VPS
│ ├── vhost.d/ # Snippet nginx-proxy SSE
│ └── twig/ # Template Symfony pour la doc utilisateur
├── docs/index.html # Doc utilisateur statique (HTML)
├── Dockerfile
├── docker-compose.yml
└── pyproject.tomlSeguridad
HTTPS únicamente en producción (TLS vía Let's Encrypt).
Sin registros (logs) del contenido de las publicaciones ni de los tokens API.
Anti-DNS rebinding vía
TransportSecuritySettingsdel SDK MCP.Multi-tenancy aislado : cada solicitud se procesa con su propio cliente httpx, cerrado al finalizar la solicitud (sin pooling cross-user).
Si sospecha que una clave se ha filtrado, revóquela desde su espacio Plus Tard.
Roadmap
[ ] Registro estructurado (JSON, sin tokens ni contenidos)
[ ] Rate limiting por clave API
[ ] Métricas Prometheus
[ ] Flujo OAuth para conectores (en lugar de una clave API copy-paste)
[ ] Soporte
completion/completeMCP para sugerencias depage_id(a la espera de un SDK Python que expongaToolReference)
Ideas y contribuciones son bienvenidas — abra un issue o un PR.
Enlaces útiles
API Plus Tard (v1.2)
mcp-remote (puente stdio↔HTTP para Claude Desktop)
Licencia
MIT © 2026 Plus Tard — Boréales Créations.
Hecho con ❤️ en Francia.
Available Tools
5 toolsget_userA
Récupère les informations d'un utilisateur Plus Tard par son id, incluant ses providers connectés (Facebook, Instagram, LinkedIn, etc.) et leurs sous-comptes (pages Facebook, comptes Instagram pro...). Utilise ce tool avant schedule_post pour identifier le bon page_id à utiliser : pour Facebook/Instagram, c'est l'id du sous-compte (providers[].accounts[].id) ; pour les autres providers (LinkedIn, Twitter, TikTok, Threads, Bluesky), c'est providers[].providerId.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the operation is 'récupère' (retrieves), implying read-only, but does not explicitly mention side effects, authentication, or error behavior. The basic nature is clear, but depth is limited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, but the second sentence is dense with provider-specific mapping details. All information is relevant and purposeful, though slightly lengthy for a simple getter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, but the description adds important context about provider types and page_id derivation. It does not cover error cases or permissions, but those are not essential given the schema and the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description only repeats 'par son id' without explaining where the user_id comes from or adding constraints. The parameter is self-explanatory by title, but the description does not enrich its semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb 'récupère' (retrieves) and the resource 'informations d'un utilisateur' by id, and distinguishes the tool by mentioning connected providers and sub-accounts. It also ties the tool to a specific use case (before schedule_post), making its purpose unambiguous relative to sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool before schedule_post to identify the correct page_id, and provides concrete mapping rules for different provider types. This gives clear guidance on when to use the tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsA
Liste tous les comptes réseaux sociaux connectés à Plus Tard. Utilise ce tool pour savoir quels comptes sont disponibles avant de planifier un post.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a read-only listing operation via the verb 'list', which is transparent. However, it does not explicitly state side effects, permissions, or error conditions. Since no annotations are provided, the description carries the full burden, but the simplicity of the operation makes this acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, directly stating what it does and when to use it. No unnecessary words or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description does not need to detail return values. It covers purpose and usage context sufficiently. Minor omission: it does not explicitly state that it is a non-destructive operation, but this is implied by the verb 'list'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to explain. The input schema is empty, and the description does not need to add parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Lists all social media accounts connected to Plus Tard.' It also provides context by implying it is a prerequisite for scheduling, which distinguishes it from scheduling actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a specific use case: 'Use this tool to know which accounts are available before scheduling a post.' This indicates when to use it, though it does not explicitly mention alternative tools or conditions for not using it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_userA
Crée un nouvel utilisateur Plus Tard et retourne une URL OAuth permettant de connecter ses comptes de réseaux sociaux. Utilise ce tool quand l'utilisateur veut onboarder un nouveau client ou se créer un compte. Email et langue sont optionnels — la langue par défaut est 'fr'. L'URL OAuth doit être ouverte dans un navigateur par l'utilisateur final pour qu'il connecte ses réseaux. Elle est valable 24h.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| language | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly discloses that the tool creates a user, returns an OAuth URL, requires the end user to open the URL in a browser, and that the URL is valid for 24 hours. It also notes the default language. This is robust transparency for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with the core action front-loaded, followed by usage guidance and then essential behavioral details (browser requirement and validity). Every sentence adds value, and the structure is logical. It is slightly verbose in the OAuth explanation but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return format is presumably covered) and no annotations, the description provides a comprehensive picture: what it does, when to use it, parameter defaults, and the critical OAuth flow requirement. It is complete enough for an agent to invoke correctly without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It states that email and language are optional and that the default language is 'fr'. While it doesn't elaborate on the purpose of the email parameter, the description covers both parameters sufficiently to guide invocation, which is adequate for only two optional parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Crée un nouvel utilisateur') and resource ('nouvel utilisateur Plus Tard'), and clearly distinguishes the action from siblings like get_user and list_accounts. The return of an OAuth URL is also explicit, leaving no ambiguity about the tool's primary function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use instruction: 'Utilise ce tool quand l'utilisateur veut onboarder un nouveau client ou se créer un compte.' This is clear guidance, though it does not explicitly state when not to use it or mention alternatives. The condition is specific enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_postA
Planifie un post sur un seul réseau social via Plus Tard. Utilise ce tool quand l'utilisateur veut programmer, publier ou scheduler du contenu sur Facebook, Instagram, LinkedIn, X/Twitter, TikTok, Threads, Bluesky ou Google My Business.
IMPORTANT :
- Un appel = un réseau. Pour publier sur plusieurs réseaux, appelle
ce tool plusieurs fois.
- AVANT D'APPELER ce tool : appelle d'abord list_accounts (ou
get_user pour la vue détaillée) pour obtenir le page_id correct.
- Le `page_id` à passer ici est l'identifiant EXTERNE du compte sur
le réseau social (champ `accountId` / `page_id` retourné par
list_accounts, ex. "1097653263583548"), PAS l'identifiant interne
Plus Tard (champ `id` / `internal_id`, ex. "34"). Confondre les
deux crée un post mal rattaché et apparaissant comme "compte
déconnecté".
- Pour les providers sans sous-comptes (Twitter, LinkedIn, TikTok,
Threads, Bluesky, Google), utilise le `providerId` retourné par
get_user.
- Instagram exige au moins une image ou vidéo dans image_posts.
- planned_at doit être une date/heure UTC future au format ISO8601
(ex: 2026-05-01T10:00:00Z).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| page_id | Yes | ||
| provider | Yes | ||
| planned_at | Yes | ||
| image_posts | No | ||
| tiktok_params | No | ||
| twitter_params | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It warns about common ID misuse and provider-specific constraints, but does not explicitly describe side effects (e.g., that this creates a scheduled post) or error/result behavior. It could be more transparent about what happens on success/failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear bullet points and an IMPORTANT section. It is somewhat lengthy but each sentence adds necessary guidance. The organization makes it easy to scan while covering multiple edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the input schema and existence of an output schema, the description covers essential pre-requisites, provider nuances, and required formats. It does not need to explain return values since an output schema exists. It is sufficiently complete for an AI agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful context for page_id (external vs internal), provider (providerId for sub-account-less providers), planned_at (future UTC ISO8601), and image_posts (required for Instagram). However, it does not explain text, tiktok_params, or twitter_params, leaving 4 of 7 parameters partially or entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool schedules a post on a single social network via Plus Tard and lists all supported providers. It distinguishes itself from sibling tools by specifying when to use it (for scheduling content) rather than validation, account listing, or registration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance ('quand l'utilisateur veut programmer, publier ou scheduler') and detailed operational instructions: one call per network, prerequisite calls to list_accounts/get_user, correct page_id vs internal ID, provider-specific handling, Instagram image requirement, and UTC date format. This is exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_api_keyA
Vérifie que la clef API Plus Tard fournie est valide. Utilise ce tool si l'utilisateur veut diagnostiquer un problème d'authentification ou simplement confirmer que sa clef est active. Retourne aussi la date de création et d'expiration de la clef.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly states the primary behavior (validation) and the return content (creation/expiration dates). It does not explicitly mention whether the operation is read-only or if it can fail, but the nature of validation and the absence of side effects are strongly implied. A small gap exists regarding error behavior, but overall the description is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences in French. It conveys the core purpose, usage scenario, and return information with no redundancy or unnecessary detail. Every sentence contributes directly to understanding the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description tells the agent what the tool does, when to use it, and what it returns. It does not specify the exact output format or error handling, but these are not essential for the agent to decide to invoke it. Given the simplicity of the tool, the description is sufficiently complete for practical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to describe. The schema coverage is effectively 100% since no parameters exist. The description correctly does not attempt to explain nonexistent parameters, so it fully satisfies this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool verifies an API key and returns its creation and expiration dates. It explicitly mentions when to use it (diagnosing authentication issues or confirming key activity), making its purpose unambiguous and distinct from sibling tools like list_accounts or get_user.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Utilise ce tool si l'utilisateur veut diagnostiquer un problème d'authentification ou confirmer que sa clef est active.' This tells the agent exactly when to invoke this tool, leaving no ambiguity about its applicability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
get_user - First observed
list_accounts - First observed
register_user - First observed
schedule_post - First observed
validate_api_key
TDQS
Scored across 5 tools
Each tool has a unique, non-overlapping purpose: validate_api_key checks authentication, list_accounts retrieves connected accounts, schedule_post creates a post, register_user creates a user, and get_user retrieves user details. No confusion between tools.
All tool names follow a consistent verb_noun pattern in lowercase with underscores (validate_api_key, list_accounts, schedule_post, register_user, get_user). The naming style is uniform and predictable.
With 5 tools, the server offers a focused set of operations for a social media scheduling service. Each tool addresses a distinct need without redundancy, fitting well within the typical 3-15 tool range.
The server covers core operations (validation, listing, scheduling, user management) but lacks tools for retrieving, updating, or deleting scheduled posts. This is a notable gap for a scheduling domain, preventing full lifecycle management.
Maintenance
Related MCP Connectors
Schedule, publish and manage social media posts across platforms.
Schedule and publish social posts across platforms, with drafts, media uploads and analytics.
Multi-platform social media post creation, scheduling, and publishing.
Schedule social media posts to 10 platforms: Instagram, TikTok, X, YouTube, LinkedIn, and more
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to manage scheduled social media posts and content automation across multiple platforms (X/Twitter, Reddit, LinkedIn, Instagram, TikTok, YouTube). Supports organizing campaigns into tracks, scheduling posts with natural language, and automating content workflows with local SQLite storage.79 npmMIT
- AlicenseAqualityDmaintenanceAI-powered social media posting across 14 platforms. Post to Twitter, Instagram, TikTok, Facebook, LinkedIn, YouTube and more with one command. AI adapts content per platform, schedules posts, and generates 30-day content calendars.6MIT
- FlicenseAqualityDmaintenanceSchedule and manage social media posts across Facebook, Instagram, Twitter/X, LinkedIn, YouTube, TikTok, and Pinterest directly from Claude.10-
- AlicenseAqualityAmaintenanceSchedule and manage social media posts across 13 platforms (Bluesky, Threads, Instagram, LinkedIn, Mastodon, YouTube, Facebook, Pinterest, Telegram, Nostr, X/Twitter, Discord, Tumblr and more). OAuth 2.0 + PKCE, 10 tools, draft-first workflow for AI agents.1018AGPL 3.0