Skip to main content
Glama
boreales

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: atlas-social-mcp

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNo
languageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
page_idYes
providerYes
planned_atYes
image_postsNo
tiktok_paramsNo
twitter_paramsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedget_user
    • First observedlist_accounts
    • First observedregister_user
    • First observedschedule_post
    • First observedvalidate_api_key

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

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

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
    4
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    AI-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.
    6
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Social media scheduling and publishing for AI agents. 17 validation-first tools to post to X, LinkedIn, Instagram, TikTok, YouTube, Reddit, Discord, Telegram, and more through one connected workspace.
    316
    86
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/boreales/mcp-plus-tard'

If you have feedback or need assistance with the MCP directory API, please join our Discord server