Un serveur MCP kanban pour ChatGPT, Claude, Cursor et Codex

Par Andrei Finogeev, fondateur de Weft ·

Weft est un tableau kanban hébergé — Backlog, Todo, Doing, Done, avec des sprints facultatifs — et son serveur MCP se trouve à l’adresse https://letsweft.com/api/mcp. Ajoutez cette URL à votre client IA et connectez-vous une fois avec OAuth ; rien à installer ni à faire tourner en local. Dès lors, l’assistant lit le tableau, crée et déplace des cartes, réserve une carte avant de travailler dessus pour que deux agents ne prennent jamais la même, rend compte de son avancement, vous demande quand une décision vous revient, et clôt la carte avec ce qu’il a fait. Gratuit pour 50 tâches et 200 appels IA par mois.

URL du serveur MCP
https://letsweft.com/api/mcp

Streamable HTTP · OAuth, ou un jeton d’accès personnel · 32 outils

L’ajouter à votre client IA

ChatGPT

Ouvrir Weft dans ChatGPT — ou le configurer à la main :

  1. 1Ouvrez « Plugins » dans la barre latérale de ChatGPT — ou Settings → Plugins.
  2. 2Cherchez « Weft » et ouvrez la fiche.
  3. 3Cliquez sur « Connect » et regardez ce à quoi Weft peut accéder.
  4. 4Connectez-vous avec votre compte Weft dans la fenêtre qui s’ouvre.

Mentionnez le plugin avec @ dans un chat : « @Weft qu’y a-t-il sur mon tableau ? » — ou choisissez Weft dans le menu +. Si vous avez sauté l’installation, ChatGPT propose de le connecter directement.

Claude Desktop

  1. 1Ouvrez Claude Desktop → Settings → Connectors.
  2. 2Cliquez sur « Add custom connector ».
  3. 3Collez l’URL MCP de Weft ci-dessous et enregistrez.
  4. 4Terminez l’OAuth dans la fenêtre de navigateur qui s’ouvre.

Démarrez un nouveau chat et demandez : « qu’y a-t-il sur mon tableau Weft ? ». Claude récupère l’état de votre tableau via le connecteur Weft.

Claude Code

bash
claude mcp add --transport http weft https://letsweft.com/api/mcp

Lancez `claude` dans n’importe quel projet, puis demandez : « qu’y a-t-il sur mon tableau ? ». Une fenêtre de navigateur s’ouvre la première fois pour l’OAuth.

Cursor

Ajouter à Cursor — ou le configurer à la main :

~/.cursor/mcp.json
{
  "mcpServers": {
    "weft": {
      "url": "https://letsweft.com/api/mcp"
    }
  }
}

Ouvrez Cursor → Settings → MCP. Le serveur « weft » doit apparaître avec un voyant vert une fois l’OAuth terminé.

Codex CLI

~/.codex/config.toml
[mcp_servers.weft]
url = "https://letsweft.com/api/mcp"

Lancez `codex mcp login weft` pour vous connecter dans le navigateur, puis ouvrez `codex` et demandez : « qu’y a-t-il sur mon tableau ? ». `/mcp` liste le serveur connecté et ses outils.

VS Code

Installer l’extension Weft — ou le configurer à la main :

.vscode/mcp.json
{
  "servers": {
    "weft": {
      "type": "http",
      "url": "https://letsweft.com/api/mcp"
    }
  }
}

Ouvrez le chat, passez le sélecteur de mode sur Agent et demandez : « qu'est-ce qu'il y a sur mon tableau ? ». Une fenêtre de navigateur s'ouvre pour l'OAuth la première fois. « MCP: List Servers » doit afficher weft en Running.

Windsurf

  1. 1Ouvrez Windsurf → Settings → Cascade → MCP servers.
  2. 2Cliquez sur « Add server » et choisissez Remote (HTTP).
  3. 3Collez l’URL MCP de Weft ci-dessous et enregistrez.
  4. 4Terminez l’OAuth dans la fenêtre de navigateur qui s’ouvre.

Ouvrez Cascade et demandez : « qu’y a-t-il sur mon tableau ? ». Cascade marque les réponses qui ont utilisé le serveur Weft.

Gemini CLI

bash
gemini extensions install https://github.com/AndreiFinogeev/weft-gemini-extension

Lancez `gemini` et demandez : « qu’y a-t-il sur mon tableau weft ? ». Un navigateur s’ouvre pour l’OAuth la première fois. `gemini extensions list` doit afficher « weft ».

Conçu pour les agents, pas seulement pour vous

Des réservations, pas des collisions

start_task pose un bail sur une carte avant qu’un agent travaille dessus. Un second agent qui demande du travail reçoit une autre carte, et une carte dont l’agent s’est tu est proposée à nouveau quand le bail expire.

Avancement et comptes rendus

report_progress maintient la réservation pendant que l’agent travaille ; complete_task clôt la carte avec ce qui a été fait, ce qui ne l’a pas été, et des liens que vous pouvez vérifier.

Les questions vous attendent

request_input dépose une question avec des options dans votre boîte de réception — sur le web et sur votre téléphone — au lieu de laisser l’agent deviner ce que vous seul pouvez décider.

Votre attention donne le rythme

Quand trop de travail terminé attend votre relecture, les agents arrêtent de commencer de nouvelles cartes. C’est la limite de travail en cours du kanban, appliquée à vous.

Vous décidez de ce que chaque IA peut faire

Donnez à chaque assistant connecté un accès full, write ou en lecture seule, et déconnectez-le d’un clic. Les cartes supprimées vont dans la corbeille, au lieu de disparaître pour de bon.

Tableau Weft sur un téléphone, colonne Doing : trois tâches prises par un assistant IA, chacune marquée IA
Les assistants prennent la tâche suivante ; chaque carte indique qui travaille dessus.
Une tâche Weft terminée, créée par l’IA, avec le résultat consigné par l’assistant : ce qu’il a corrigé et le fait que 40 exécutions de tests ont réussi
Quand un assistant termine, il laisse un compte rendu : ce qu’il a fait et comment il l’a vérifié.

Les 32 outils

Chaque outil déclare s’il ne fait que lire, s’il écrit ou s’il supprime quelque chose : votre client sait ainsi quand vous demander d’abord.

OutilCe qu’il faitType
searchRecherche par mots-clés dans les tâches, les sprints, les décisions et les notes de mémoire. Renvoie jusqu’à 50 résultats classés {id, title, url}, dont les identifiants préfixés par type alimentent fetch.Lecture
fetchRécupère le contenu complet d’un résultat de recherche — titre, représentation textuelle, URL source et métadonnées structurées. Prend l’identifiant préfixé renvoyé par search.Lecture
initialize_boardCrée les colonnes par défaut Backlog, Todo, Doing et Done sur votre tableau Weft s’il n’en a aucune — la mise en place en un appel avant qu’un agent IA gère les tâches. Idempotent.Écriture
get_board_stateRenvoie un résumé compact du tableau Scrumban de l’utilisateur : colonnes, sprint actif, Doing, tâches en retard et clôtures récentes, environ 30 fois plus petit qu’un instantané complet.Lecture
list_columnsListe toutes les colonnes du tableau, dans l’ordre — identifiant, nom et position de chacune, pour qu’un agent sache exactement où une tâche peut aller.Lecture
list_tasksRenvoie les tâches de l’utilisateur authentifié, avec filtre facultatif par colonne, sprint, projet (nom ou identifiant), créateur (humain ou IA) ou assignee (l’exécutant).Lecture
create_taskCrée une nouvelle tâche sur le tableau de l’utilisateur. Elle arrive dans Backlog si aucune colonne n’est indiquée. La priorité est medium par défaut. À utiliser quand l’utilisateur demande d’ajouter une tâche.Écriture
bulk_create_tasksCrée jusqu’à 1000 tâches en un seul appel atomique — pour importer des exports Linear/Jira/Notion/Trello ou toute liste de 3 tâches ou plus, en ne consommant qu’un seul appel IA du quota.Écriture
update_taskModifie les champs d’une tâche existante. Seuls les champs transmis changent ; les champs omis sont conservés — à une exception près : effacer requiresReview est refusé à un agent, et le refus emporte toute la modification avec lui.Écriture
move_taskDéplace une tâche vers une autre colonne et une autre position. Un déplacement vers une colonne semantic='doing' lance la mesure du temps de cycle ; un déplacement vers semantic='done' enregistre l’heure de fin.Écriture
start_taskL’IA l’appelle au moment où elle commence à exécuter une tâche — la carte passe dans Doing, pour que l’utilisateur et tous les autres clients connectés la voient en cours (et ne la prennent pas deux fois). Lance la mesure du temps de cycle ; une tâche sans assignee est réservée par l’agent qui appelle (un assignee existant n’est jamais remplacé). Aucun identifiant de colonne nécessaire.Écriture
report_progressSignale que vous êtes toujours au travail. La réservation d’une tâche expire si le client se tait, et cet appel la renouvelle. Sans signe de vie, une tâche longue est considérée comme abandonnée et proposée à quelqu’un d’autre — délibérément, parce qu’un agent qui meurt en cours d’exécution ne signale rien : le silence est le seul signal dont dispose le tableau.Écriture
request_inputPose à la personne une question qu’elle seule peut trancher, et attend sans perdre la réservation de la tâche. Si elle est devant son client, un formulaire s’y affiche et la réponse revient dans le même appel — l’agent continue dans le même contexte, avec la même réservation. Si elle est absente, l’appel revient en attente et la question patiente dans sa file ; la réponse parvient à l’agent à son prochain start_task ou get_my_work. Pour l’irréversible et le réellement ambigu, pas pour « puis-je continuer ? » — chaque question consomme le même budget d’attention qui limite le nouveau travail.Écriture
submit_answerRapporte ce que la personne a répondu à une question posée par l’agent, et lui rend le travail avec le même runId et le même bail, pour qu’il continue la même tentative au lieu d’en recommencer une à froid. Marqué comme relayé, jamais comme une action de la personne elle-même — une réponse transmise par un agent et un clic fait par un humain sont deux types de preuve différents, et le tableau les garde séparés. Si la question a déjà reçu une réponse dans l’appli Weft, c’est cette réponse qui est renvoyée au lieu d’une erreur : ce qui compte, c’est que l’agent continue avec la bonne.Écriture
get_my_workDemande quoi faire ensuite au lieu de lire tout le tableau et de deviner. Renvoie les tâches attribuées à ce client, ce qui attend déjà l’humain, et s’il reste de la place dans la file d’attention. Indique aussi ce qui est en retard et ce qui arrive à échéance ou commence dans la semaine, pour qu’un agent apprenne une échéance sans avoir à la demander. Quand la file est pleine, le geste utile est d’aider à la vider, pas de commencer autre chose — et cet outil le dit avant qu’une tâche soit choisie.Lecture
complete_taskL’IA l’appelle quand le travail est réellement terminé — la carte passe dans Done avec l’heure de fin enregistrée, et le résultat facultatif (ce qui a été fait, où se trouve le résultat) est ajouté à la carte sous forme de note « Outcome (AI, date) ». Aucun identifiant de colonne nécessaire. Le travail marqué comme demandant votre intervention ne va PAS dans Done : il part dans votre file avec le compte rendu joint, et si l’agent a dit ce qu’il ferait ensuite, accepter approuve exactement cette étape et la lui rend. Si la tâche comporte un plan de vérification, le serveur exécute ses contrôles sur-le-champ — il récupère l’URL, cherche la citation, compare le hachage : un plan executable/state_delta dont tous les contrôles bloquants réussissent est clos comme vérifié par le serveur ; un contrôle bloquant en échec garde la carte hors de Done et montre à l’agent ce que le serveur a observé.Écriture
record_decisionUn outil, deux usages, un seul registre. (1) Relayer un verdict que vous avez donné en conversation sur un travail terminé qui vous attend — approuvé, à revoir, abandonné, plus tard — ce qui retire la carte de la file de relecture ; l’entrée est enregistrée comme relayée et non comme une action de votre part dans l’appli, et cette différence reste visible à dessein. (2) Consigner une décision autonome qui mérite d’être retenue — « Neon plutôt que Supabase », une leçon apprise — sous forme d’enregistrement MADR-lite immuable, avec les options pesées et la condition pour y revenir. Les enregistrements ne sont jamais modifiés : une nouvelle décision avec supersedesId remplace l’ancienne, et l’ancienne reste lisible telle qu’elle était le jour où elle a été prise. Ce sont ces enregistrements que get_context resservira à chaque agent la semaine suivante.Écriture
get_contextLes décisions et les leçons en vigueur de l’espace de travail, condensées dans un budget de jetons, des plus récentes aux plus anciennes — ce qu’un agent devrait lire avant de commencer quoi que ce soit de non trivial. Dérivé des décisions enregistrées au lieu d’être rédigé comme un document, il ne peut donc pas se périmer : une décision remplacée disparaît dès que sa remplaçante est enregistrée, et chaque ligne porte sa date. Restreignez-le à un projet ou à une tâche pour le cibler ; les lignes qui ne tiennent pas dans le budget sont comptées, jamais masquées en silence.Lecture
get_task_historyCe qui est arrivé à une tâche, pas seulement ses champs actuels. Trois modes : 'summary' (par défaut, ≤500 jetons — la carte, son dernier compte rendu, des compteurs), 'decisions' (chaque décision consignée à son sujet, verdicts et motifs compris — le motif d’un renvoi en reprise survit ici même après qu’une acceptation ultérieure a écrasé la carte), 'full' (le journal brut, limité à 100 événements, ce qu’il signale). Existe parce qu’un journal d’audit est trop bavard pour être lu tel quel, et que la ligne de la tâche ne garde que le dernier verdict.Lecture
trash_taskEnvoie une tâche dans la corbeille de votre tableau Weft. Récupérable pendant 30 jours via restore_task, après quoi une tâche planifiée la supprime définitivement.Suppression
restore_taskRécupère une tâche dans la corbeille dans les 30 jours qui suivent sa mise à la corbeille. La tâche revient sur le tableau là où elle était, intacte — un fondateur solo ne perd jamais de travail à cause d’une suppression accidentelle.Écriture
archive_done_tasksVide la colonne Done : chaque tâche qu’elle contient quitte le tableau pour l’archive — toujours trouvable via search/fetch et toujours visible dans l’historique de son sprint, jamais supprimée. Terminer un sprint archive automatiquement ses tâches terminées ; cet outil s’occupe du reste. Il prend toute la colonne en un appel, sans compteur et sans retour possible depuis MCP — restore_task restaure depuis la corbeille, pas depuis l’archive — c’est pourquoi il est marqué destructif : un client devrait demander confirmation à l’utilisateur avant de l’appeler.Suppression
list_projectsListe les projets du tableau — des contextes légers (une startup, un client, le personnel) auxquels une tâche peut appartenir. Exclut les projets archivés, sauf si includeArchived est activé.Lecture
create_projectCrée un contexte de projet. Le nom est unique par tableau ; la couleur est choisie par défaut dans une palette tournante ; url est le site web du projet, dont la favicon s’affiche sur les cartes de tâches.Écriture
update_projectRenomme un projet, change sa couleur ou l’URL de son site, ou l’archive/le désarchive. Les projets archivés disparaissent des sélecteurs ; leurs tâches gardent le rattachement.Écriture
list_sprintsListe tous les sprints (planifiés, actifs, terminés, archivés) de l’utilisateur, pour qu’un fondateur solo ou un agent consulte l’historique des sprints et leur statut actuel sans ouvrir l’appli.Lecture
get_active_sprintRenvoie le sprint actif, ou null si aucun sprint n’est en cours — pour qu’un fondateur solo ou un agent vérifie l’objectif du moment sans ouvrir l’appli.Lecture
create_sprintCrée un nouveau sprint au statut "planned" sur votre tableau Weft, prêt à être planifié avec un objectif et des dates. Utilisez start_sprint à part quand vous êtes prêt à commencer.Écriture
start_sprintFait passer un sprint planifié au statut actif. Un seul sprint peut être actif à la fois, sur tous les forfaits — si un autre sprint est en cours, l’appel échoue et le nomme ; terminez d’abord ce sprint, puis réessayez.Écriture
complete_sprintTermine le sprint actif. Ses tâches terminées sont archivées dans l’historique du sprint — elles quittent la colonne Done du tableau, restent trouvables et s’affichent sur la page du sprint. Les tâches non terminées restent sur le tableau, rattachées au sprint. Irréversible via MCP — les clients devraient demander confirmation quand l’intention est ambiguë.Suppression
add_task_to_sprintRattache une tâche existante à un sprint pour qu’elle apparaisse dans son périmètre et son burndown. Idempotent — l’appeler deux fois n’a aucun effet supplémentaire, on peut donc réessayer sans risque.Écriture
remove_task_from_sprintDétache une tâche de son sprint actuel sans la supprimer — la tâche reste sur le tableau dans sa colonne, simplement hors du périmètre de ce sprint et de son burndown.Écriture

Questions

Qu’est-ce qu’un serveur MCP kanban ?

Un serveur MCP (Model Context Protocol) qui expose un tableau kanban sous forme d’outils qu’un assistant IA peut appeler : lister les colonnes, lire les cartes, créer une carte, la passer dans Doing ou Done. Celui de Weft est hébergé : vous ajoutez une URL au lieu de faire tourner un processus sur votre machine.

Dois-je installer ou faire tourner quelque chose ?

Non. Ajoutez https://letsweft.com/api/mcp à votre client IA et connectez-vous avec OAuth. Les clients sans OAuth utilisent un jeton d’accès personnel créé dans Paramètres → Jetons d’accès.

Est-ce gratuit ?

Oui, pour 50 tâches et 200 appels IA par mois. Pro lève les limites pour 7 $ par place et par mois, ou 60 $ par place et par an.

Est-ce que ça marche avec ChatGPT Free ?

Oui. Weft figure dans le Plugin directory de ChatGPT et fonctionne sur tous les forfaits ChatGPT, y compris le gratuit. Ajouter une URL MCP brute dans ChatGPT est une fonction de Business, Enterprise et Edu, mais vous n’en avez pas besoin pour Weft.

Deux agents peuvent-ils partager un tableau ?

Oui — c’est à cela que sert le tableau. Chaque agent réserve une carte avec start_task avant de travailler dessus, pour qu’ils ne prennent pas la même carte, et chaque carte indique si c’est une IA ou une personne qui l’a créée ou terminée.

En quoi est-ce différent d’un serveur MCP kanban local ?

Les serveurs MCP kanban open source tournent sur votre machine et stockent le tableau dans un fichier ou une base de données locale : seuls les agents de cette machine le voient. Weft est un tableau partagé et hébergé : les mêmes cartes dans ChatGPT, Claude, Cursor, Codex, l’appli web et les applis iOS et Android, pour vous et votre équipe.

Voir aussi