Skip to main content
Glama
mcp-plus-tard

mcp-plus-tard

by boreales

Plus Tard MCP

Python FastAPI MCP License

Connect your AI assistant (Claude, Cursor, n8n…) to Plus Tard to schedule your Facebook, Instagram, LinkedIn, X/Twitter, TikTok, Threads, Bluesky, and Google My Business posts through simple conversation.

Production endpoint : https://mcp.plus-tard.com/mcp/ User documentation : https://plus-tard.com/api-mcp


30-second demo

You : "Schedule a Facebook post on my Boréales page for tomorrow at 10 AM: 'Hello world!'"

Claude automatically calls:

  1. list_accounts → finds the Facebook ID for "Boréales"

  2. schedule_post(provider="facebook", page_id="…", planned_at="2026-05-05T10:00:00Z", text="Hello world!")

Plus Tard : ✅ Post #1432 scheduled for 05/05/2026 at 10:00 AM.


Related MCP server: FastSocial MCP Server

Tools (5)

Tool

Description

validate_api_key

Verifies that an API key is active and returns its metadata.

list_accounts

Lists all social media accounts connected to Plus Tard.

schedule_post

Schedules a post on a single network (1 call = 1 network).

register_user

Creates a new user and returns an OAuth URL.

get_user

User details: connected providers and sub-accounts.

Resources (2)

URI

Content

plus-tard://accounts

JSON list of connected accounts.

plus-tard://users/{id}

JSON detail of a user.


Client-side installation

Claude Desktop

Add to ~/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

Same URL and header. See the full documentation.


Self-host (for developers)

Stack

  • Python 3.12 · FastAPI · mcp[fastapi] (Streamable HTTP transport)

  • httpx · pydantic v2 · pydantic-settings

  • pytest · pytest-asyncio · respx

Architecture

Client (Claude/Cursor/n8n)
   │  Streamable HTTP + X-Api-Key header
   ▼
MCP server (this repo)
   │  X-Api-Key forwarded as-is
   ▼
Plus Tard Symfony API

Each MCP request arrives with X-Api-Key, which is propagated as-is to the Plus Tard API. No session, no server-side storage — each client uses its own key.

Local development

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 8001

The server listens on http://127.0.0.1:8001/mcp/. Quick test with the MCP Inspector:

npx @modelcontextprotocol/inspector
# Transport: Streamable HTTP
# URL: http://127.0.0.1:8001/mcp/
# Header: X-Api-Key = ta_clef_plus_tard

Tests

pytest
# 24 passed

Docker deployment (production)

The repository provides Dockerfile + docker-compose.yml ready for a VPS with nginx-proxy + acme-companion:

sudo docker compose up -d --build

See deploy/README.md for details (SSE-friendly nginx-proxy snippet, Let's Encrypt TLS management, updates).


Configuration

Variable

Description

Default

PLUS_TARD_BASE_URL

Base URL for the Plus Tard API

(required)

MCP_HOST

Bind host for uvicorn

0.0.0.0

MCP_PORT

Bind port for uvicorn

8001

Authentication is done per request via the X-Api-Key header — no tokens are stored server-side.

Allowed hosts

The MCP SDK enables anti-DNS rebinding protection that only allows whitelisted hosts. The default hosts are:

  • mcp.plus-tard.com

  • localhost, 127.0.0.1 (for dev)

To add your own domain, edit the list in main.py (TransportSecuritySettings.allowed_hosts).


Project structure

.
├── 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.toml

Security

  • HTTPS only in production (TLS via Let's Encrypt).

  • No logging of post content or API tokens.

  • Anti-DNS rebinding via TransportSecuritySettings from the MCP SDK.

  • Isolated multi-tenancy: each request is processed with its own httpx client, closed at the end of the request (no cross-user pooling).

  • If you suspect a key has leaked, revoke it from your Plus Tard space.


Roadmap

  • [ ] Structured logging (JSON, without tokens or content)

  • [ ] Rate limiting per API key

  • [ ] Prometheus metrics

  • [ ] OAuth flow for connectors (instead of a copy-paste API key)

  • [ ] Support for MCP completion/complete for page_id suggestions (waiting for a Python SDK that exposes ToolReference)

Ideas and contributions are welcome — open an issue or a PR.



License

MIT © 2026 Plus Tard — Boréales Créations.

Made with ❤️ in France.

Available Tools

5 tools
get_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.

Inputs: user_id (required). Returns: result

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.

Inputs: no named parameters. Returns: result

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.

Inputs: email, language. Returns: result

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).

Inputs: page_id (required), provider (required), planned_at (required), text, +3 more. Returns: result

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.

Inputs: no named parameters. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.3/5.0

    Scored across 5 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count5/5

    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.

    Completeness3/5

    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

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables 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.
      7
      18 npm
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Schedule 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.
      2
      10
      26
      AGPL 3.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables finding trending content across social networks and scheduling/publishing posts with full lifecycle management.
      92 npm
      MIT