Plane MCP Server
officielLe serveur MCP officiel de Plane permet l'intégration avec les API de Plane, offrant une automatisation complète par IA des projets, éléments de travail, cycles et plus encore.
Documentation
Serveur Plane MCP
Un serveur Model Context Protocol (MCP) pour l'intégration avec Plane. Ce serveur fournit des outils et des ressources pour interagir avec Plane via des agents IA.
Fonctionnalités
- 🔧 Intégration Plane : Interagissez avec les API et services Plane
- 🔌 Transports multiples : Prend en charge les transports stdio, SSE et HTTP streamable
- 🌐 Distant et local : Fonctionne à la fois localement et en tant que service distant
- 🛠️ Extensible : Facile d'ajouter de nouveaux outils et ressources
Utilisation
Le serveur prend en charge trois méthodes de transport. Nous recommandons d'utiliser uvx car elle ne nécessite pas d'installation.
Prérequis :
- Python 3.10+ (pour le transport stdio, via
uvx) - Node.js 22+ (pour les transports distants, via
npx)
1. Transport Stdio (pour usage local)
Configuration du client MCP (en utilisant uvx - recommandé) :
{
"mcpServers": {
"plane": {
"command": "uvx",
"args": ["plane-mcp-server", "stdio"],
"env": {
"PLANE_API_KEY": "<your-api-key>",
"PLANE_WORKSPACE_SLUG": "<your-workspace-slug>",
"PLANE_BASE_URL": "https://api.plane.so"
}
}
}
}
2. Transport HTTP distant avec OAuth
Connectez-vous au serveur Plane MCP hébergé en utilisant l'authentification OAuth.
URL : https://mcp.plane.so/http/mcp
Configuration du client MCP (pour les outils comme Claude Desktop sans support natif MCP distant) :
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/mcp"]
}
}
}
Remarque : L'authentification OAuth sera gérée automatiquement lors de la connexion au serveur distant.
3. Transport HTTP distant avec jeton PAT
Connectez-vous au serveur Plane MCP hébergé en utilisant un jeton d'accès personnel (PAT).
URL : https://mcp.plane.so/http/api-key/mcp
En-têtes :
Authorization: Bearer <PAT_TOKEN>X-Workspace-slug: <SLUG>
Configuration du client MCP (pour les outils comme Claude Desktop sans support natif MCP distant) :
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/http/api-key/mcp"],
"headers": {
"Authorization": "Bearer <PAT_TOKEN>",
"X-Workspace-slug": "<SLUG>"
}
}
}
}
4. Transport SSE (Hérité)
⚠️ Transport hérité : Le transport SSE (Server-Sent Events) est maintenu pour la rétrocompatibilité. Les nouvelles implémentations devraient plutôt utiliser le transport HTTP (sections 2 ou 3).
Connectez-vous au serveur Plane MCP hébergé en utilisant l'authentification OAuth via Server-Sent Events.
URL : https://mcp.plane.so/sse
Configuration du client MCP (pour les outils qui prennent en charge le transport SSE) :
{
"mcpServers": {
"plane": {
"command": "npx",
"args": ["mcp-remote@latest", "https://mcp.plane.so/sse"]
}
}
}
Remarque : L'authentification OAuth sera gérée automatiquement lors de la connexion au serveur distant. Ce transport est déprécié au profit du transport HTTP.
Configuration
Authentification
Le serveur nécessite une authentification via des variables d'environnement :
PLANE_BASE_URL: URL de base pour l'API Plane (par défaut :https://api.plane.so) - OptionnelPLANE_API_KEY: Clé API pour l'authentification (requis pour le transport stdio)PLANE_WORKSPACE_SLUG: Identifiant du slug de l'espace de travail (requis pour le transport stdio)PLANE_ACCESS_TOKEN: Jeton d'accès pour l'authentification (alternative à la clé API)
Exemple (pour le transport stdio) :
export PLANE_BASE_URL="https://api.plane.so"
export PLANE_API_KEY="your-api-key"
export PLANE_WORKSPACE_SLUG="your-workspace-slug"
Remarque : Pour les transports HTTP distants (OAuth ou PAT), l'authentification est gérée via la méthode de connexion (flux OAuth ou en-têtes PAT) et ne nécessite pas ces variables d'environnement.
URI de redirection OAuth
Pour les transports HTTP/SSE OAuth, le serveur valide l'URI de redirection de chaque client par rapport à une liste autorisée. Les clients MCP courants (Cursor, VS Code, Claude.ai, connecteurs ChatGPT, localhost) sont autorisés par défaut.
Pour intégrer un nouveau client sans modification de code ni publication, ajoutez des motifs supplémentaires via une variable d'environnement :
PLANE_OAUTH_ALLOWED_REDIRECT_URIS: Motifs d'URI de redirection séparés par des virgules, ajoutés à la liste autorisée intégrée.
export PLANE_OAUTH_ALLOWED_REDIRECT_URIS="https://newclient.com/cb,https://other.app/oauth/*"
Les motifs prennent en charge la correspondance glob (* correspond à n'importe quel port, segment de chemin ou sous-domaine). Pour des raisons de sécurité, gardez l'hôte fixe et utilisez les caractères génériques uniquement pour le port/chemin.
Journalisation
Le serveur émet des logs JSON structurés. Chaque appel d'outil est journalisé avec son nom d'outil, sa durée, son statut et (lorsqu'ils sont disponibles) l'identifiant utilisateur opaque et le slug de l'espace de travail.
LOG_USER_INFO: Lorsquetrue, inclut les informations utilisateur (PII telles que le nom d'affichage) dans les logs à côté de l'identifiant utilisateur opaque. Par défautfalseafin que les PII ne soient jamais journalisées sauf consentement explicite. Seuls les transports HTTP OAuth et PAT (en-tête) portent un nom d'affichage ; stdio n'est pas affecté.
export LOG_USER_INFO="true"
Outils disponibles
Le serveur fournit des outils complets pour interagir avec Plane. Tous les outils utilisent des modèles Pydantic du SDK Plane pour la sécurité des types et la validation.
Projets
| Nom de l'outil | Description |
|---|---|
list_projects | Lister tous les projets dans un espace de travail avec pagination et filtrage optionnels |
create_project | Créer un nouveau projet avec nom, identifiant et configuration optionnelle |
retrieve_project | Récupérer un projet par ID |
update_project | Mettre à jour un projet avec des données partielles |
delete_project | Supprimer un projet par ID |
get_project_worklog_summary | Obtenir le résumé du journal de travail pour un projet |
get_project_members | Obtenir tous les membres d'un projet |
update_project_features | Mettre à jour la configuration des fonctionnalités d'un projet |
Éléments de travail
| Nom de l'outil | Description |
|---|---|
list_work_items | Lister tous les éléments de travail dans un projet avec filtrage et pagination optionnels |
create_work_item | Créer un nouvel élément de travail avec nom, assignés, étiquettes et autres attributs |
retrieve_work_item | Récupérer un élément de travail par ID avec expansion de champ optionnelle |
retrieve_work_item_by_identifier | Récupérer un élément de travail par identifiant de projet et numéro de séquence de ticket |
update_work_item | Mettre à jour un élément de travail avec des données partielles |
delete_work_item | Supprimer un élément de travail par ID |
search_work_items | Rechercher des éléments de travail dans un espace de travail avec une chaîne de requête |
Cycles
| Nom de l'outil | Description |
|---|---|
list_cycles | Lister les cycles dans un projet (mettre archived=true pour les archivés) |
create_cycle | Créer un nouveau cycle avec nom, dates et propriétaire |
retrieve_cycle | Récupérer un cycle par ID |
update_cycle | Mettre à jour un cycle avec des données partielles |
delete_cycle | Supprimer un cycle par ID |
manage_cycle_work_items | Ajouter et/ou supprimer des éléments de travail sur un cycle |
list_cycle_work_items | Lister les éléments de travail dans un cycle |
transfer_cycle_work_items | Transférer des éléments de travail d'un cycle à un autre |
manage_cycle_archive | Archiver ou désarchiver un cycle |
Modules
| Nom de l'outil | Description |
|---|---|
list_modules | Lister les modules dans un projet (mettre archived=true pour les archivés) |
create_module | Créer un nouveau module avec nom, dates, statut et membres |
retrieve_module | Récupérer un module par ID |
update_module | Mettre à jour un module avec des données partielles |
delete_module | Supprimer un module par ID |
manage_module_work_items | Ajouter et/ou supprimer des éléments de travail sur un module |
list_module_work_items | Lister les éléments de travail dans un module |
manage_module_archive | Archiver ou désarchiver un module |
Initiatives
| Nom de l'outil | Description |
|---|---|
list_initiatives | Lister toutes les initiatives dans un espace de travail |
create_initiative | Créer une nouvelle initiative avec nom, dates, état et responsable |
retrieve_initiative | Récupérer une initiative par ID |
update_initiative | Mettre à jour une initiative avec des données partielles |
delete_initiative | Supprimer une initiative par ID |
Éléments de travail d'admission
| Nom de l'outil | Description |
|---|---|
list_intake_work_items | Lister tous les éléments de travail d'admission dans un projet avec pagination optionnelle |
create_intake_work_item | Créer un nouvel élément de travail d'admission dans un projet |
retrieve_intake_work_item | Récupérer un élément de travail d'admission par ID d'élément de travail avec expansion de champ optionnelle |
update_intake_work_item | Mettre à jour un élément de travail d'admission avec des données partielles |
delete_intake_work_item | Supprimer un élément de travail d'admission par ID d'élément de travail |
Propriétés des éléments de travail
| Nom de l'outil | Description |
|---|---|
list_work_item_properties | Lister les propriétés d'élément de travail pour un type d'élément de travail |
create_work_item_property | Créer une nouvelle propriété d'élément de travail avec type, paramètres et règles de validation |
retrieve_work_item_property | Récupérer une propriété d'élément de travail par ID |
update_work_item_property | Mettre à jour une propriété d'élément de travail avec des données partielles |
delete_work_item_property | Supprimer une propriété d'élément de travail par ID |
Jalons
| Nom de l'outil | Description |
|---|---|
list_milestones | Lister tous les jalons dans un projet |
create_milestone | Créer un nouveau jalon |
retrieve_milestone | Récupérer un jalon par ID |
update_milestone | Mettre à jour un jalon par ID |
delete_milestone | Supprimer un jalon par ID |
manage_milestone_work_items | Ajouter et/ou supprimer des éléments de travail sur un jalon |
list_milestone_work_items | Lister les éléments de travail dans un jalon |
Étiquettes
| Nom de l'outil | Description |
|---|---|
list_labels | Lister toutes les étiquettes dans un projet |
create_label | Créer une nouvelle étiquette |
retrieve_label | Récupérer une étiquette par ID |
update_label | Mettre à jour une étiquette par ID |
delete_label | Supprimer une étiquette par ID |
États
| Nom de l'outil | Description |
|---|---|
list_states | Lister tous les états dans un projet |
create_state | Créer un nouvel état |
retrieve_state | Récupérer un état par ID |
update_state | Mettre à jour un état par ID |
delete_state | Supprimer un état par ID |
Commentaires d'élément de travail
| Nom de l'outil | Description |
|---|---|
list_work_item_comments | Lister les commentaires pour un élément de travail |
retrieve_work_item_comment | Récupérer un commentaire spécifique pour un élément de travail |
create_work_item_comment | Créer un commentaire pour un élément de travail |
update_work_item_comment | Mettre à jour un commentaire pour un élément de travail |
delete_work_item_comment | Supprimer un commentaire pour un élément de travail |
Liens d'élément de travail
| Nom de l'outil | Description |
|---|---|
list_work_item_links | Lister les liens pour un élément de travail |
retrieve_work_item_link | Récupérer un lien spécifique pour un élément de travail |
create_work_item_link | Créer un lien pour un élément de travail |
update_work_item_link | Mettre à jour un lien pour un élément de travail |
delete_work_item_link | Supprimer un lien pour un élément de travail |
Types d'élément de travail
| Nom de l'outil | Description |
|---|---|
list_work_item_types | Lister tous les types d'élément de travail dans un projet |
create_work_item_type | Créer un nouveau type d'élément de travail |
retrieve_work_item_type | Récupérer un type d'élément de travail par ID |
update_work_item_type | Mettre à jour un type d'élément de travail par ID |
delete_work_item_type | Supprimer un type d'élément de travail par ID |
import_work_item_types_to_project | Lier en masse des types d'élément de travail au niveau de l'espace de travail à un projet |
resolve_work_item_type | Trouver ou créer un type nommé pour un projet, en gérant automatiquement la portée espace de travail vs projet et l'importation |
Relations d'élément de travail
| Nom de l'outil | Description |
|---|---|
list_work_item_relations | Lister les relations pour un élément de travail |
create_work_item_relation | Créer des relations pour un élément de travail |
remove_work_item_relation | Supprimer une relation d'un élément de travail |
Définitions de relation d'élément de travail
| Nom de l'outil | Description |
|---|---|
list_work_item_relation_definitions | Lister les définitions de relation personnalisées de l'espace de travail |
create_work_item_relation_definition | Créer une définition de relation d'espace de travail |
update_work_item_relation_definition | Mettre à jour une définition de relation |
delete_work_item_relation_definition | Supprimer une définition de relation |
Activités d'élément de travail
| Nom de l'outil | Description |
|---|---|
list_work_item_activities | Lister les activités pour un élément de travail |
retrieve_work_item_activity | Récupérer une activité spécifique pour un élément de travail |
Journaux de travail
| Nom de l'outil | Description |
|---|---|
list_work_logs | Lister les journaux de travail pour un élément de travail |
create_work_log | Créer un journal de travail pour un élément de travail |
update_work_log | Mettre à jour un journal de travail pour un élément de travail |
delete_work_log | Supprimer un journal de travail pour un élément de travail |
Pages
| Nom de l'outil | Description |
|---|---|
list_pages | Lister les pages (espace de travail, ou celles d'un projet si project_id fourni) |
retrieve_page | Récupérer une page par ID (espace de travail, ou projet si project_id fourni) |
create_page | Créer une page d'espace de travail ou de projet |
Espaces de travail
| Nom de l'outil | Description |
|---|---|
get_workspace_members | Obtenir tous les membres de l'espace de travail actuel |
get_features | Obtenir les indicateurs de fonctionnalité (espace de travail, ou ceux d'un projet si project_id fourni) |
update_workspace_features | Mettre à jour les fonctionnalités de l'espace de travail actuel |
Utilisateurs
| Nom de l'outil | Description |
|---|---|
get_me | Obtenir les informations de l'utilisateur authentifié actuel |
Total des outils : Plus de 100 outils répartis dans 20 catégories
Développement
Exécution des tests
pytest
Formatage du code
black plane_mcp/
ruff check plane_mcp/
Licence
Licence MIT - voir le fichier LICENSE pour plus de détails.
Contribution
Les contributions sont les bienvenues ! N'hésitez pas à soumettre une Pull Request.
Avis de dépréciation
⚠️ La version Node.js de plane-mcp-server est dépréciée et n'est plus maintenue.
Ce dépôt représente la nouvelle implémentation Python+FastMCP du serveur Plane MCP. Si vous utilisiez l'ancienne version Node.js, veuillez migrer vers cette version basée sur Python pour continuer à bénéficier du support et des mises à jour.
La nouvelle implémentation offre :
- Une meilleure sécurité de typage grâce aux modèles Pydantic
- Des performances améliorées avec FastMCP
- Une couverture d'outils étendue
- Une maintenance et un développement actifs
Pour une aide à la migration, veuillez consulter les exemples de configuration dans ce README ou ouvrir une issue pour obtenir du support.
Ancienne configuration Node.js (dépréciée) :
Si vous utilisiez l'ancienne version Node.js de @makeplane/plane-mcp-server, votre configuration ressemblait à ceci :
{
"mcpServers": {
"plane": {
"command": "npx",
"args": [
"-y",
"@makeplane/plane-mcp-server"
],
"env": {
"PLANE_API_KEY": "<YOUR_API_KEY>",
"PLANE_API_HOST_URL": "<HOST_URL_FOR_SELF_HOSTED>",
"PLANE_WORKSPACE_SLUG": "<YOUR_WORKSPACE_SLUG>"
}
}
}
}
Veuillez migrer vers la nouvelle configuration basée sur Python présentée dans la section Utilisation ci-dessus.