Brahim Bousnguar

Notes · Article

Une commande pour faire lire votre Jira à GitHub Copilot, et voir ce que coûte chaque réponse

Par · · 6 min de lecture

GitHub Copilot peut lire vos tickets Jira et vos pages Confluence. Il lui faut juste, au préalable, un serveur MCP, un jeton d’API Atlassian et deux fichiers de config dans deux formats différents. pilotkit fait tout ça en une commande, pilotkit setup, et ajoute un petit bureau local, une page de chat qui affiche ce que chaque réponse a coûté en crédits IA.

C’est open source et sur npm : npm install -g pilotkit. Tout est parti d’un bureau de ce genre que je fais tourner au travail. pilotkit, c’est la version que les collègues peuvent installer sur leur propre PC sans que je sois assis à côté d’eux.

Copilot ne voit pas encore vos tickets

Une licence Copilot donne accès au chat, au mode agent dans VS Code et à une CLI. Aucun des trois ne sait que votre site Atlassian existe.

Le faire à la main, c’est installer un serveur MCP, créer un jeton d’API et, en général, le coller dans un fichier JSON, puis enregistrer le serveur deux fois : copilot mcp add pour la CLI Copilot, et un mcp.json pour VS Code dans un autre format. Facile à faire une fois pour soi, fastidieux quand il faut y guider toute une équipe.

À la main

Quatre tâches

Installer un serveur MCP

Créer un jeton d’API, le coller dans un fichier JSON

copilot mcp add pour la CLI Copilot

Un mcp.json pour VS Code, dans un autre format

contre

pilotkit

Une commande

pilotkit setup

Le jeton va dans le trousseau du système, jamais dans un fichier

Enregistré dans les deux clients, autres serveurs conservés

Même résultat, deux chemins. La carte en bleu, c’est celle que vous pouvez confier à un collègue.

Ce que fait une seule commande

Le setup enchaîne trois vérifications et n’enregistre que ce qui a réussi :

  1. Copilot. Il trouve la CLI Copilot, propose de l’installer et vous connecte avec copilot login.
  2. Atlassian. Il demande le site, votre e-mail et un jeton d’API, puis les vérifie d’un seul appel à /rest/api/3/myself. Un mauvais jeton a droit à deux essais de plus.
  3. Clients. Il enregistre le serveur dans la CLI Copilot et dans chaque mcp.json utilisateur de VS Code qu’il trouve, en conservant les autres serveurs et une sauvegarde du fichier.

Le jeton n’atterrit jamais dans un fichier de config. Sur Mac, il va dans le trousseau macOS via security -i, qui lit sa commande sur stdin. Passer le jeton en argument le mettrait dans la liste des processus, où d’autres programmes lancés sous votre compte peuvent le lire avec ps. Sur Windows, c’est un fichier que seul votre compte Windows peut déchiffrer (DPAPI), et sur Linux, c’est le Secret Service.

Un bug que j’ai attrapé avant qu’il ne fasse de victime : avec Homebrew, le chemin que Node donne pour lui-même pointe dans un dossier Cellar versionné. Enregistrez celui-là, et la commande casse au prochain brew upgrade. Le setup enregistre maintenant le chemin opt/, qui survit aux mises à jour.

  1. 1Copilot

    Trouver ou installer la CLI, puis copilot login

  2. 2Atlassian

    Site, e-mail et jeton, validés via /myself

  3. 3Clients

    CLI Copilot et VS Code, autres serveurs conservés

Le jetonTrousseau macOS, DPAPI sous Windows ou Secret Service sous Linux. Jamais un fichier de config.

Chaque étape vérifie sa réponse avant que la suivante ne commence, donc un mauvais jeton n’est jamais enregistré.

Sept outils, tous en lecture seule

Le serveur MCP a sept outils : whoami, jira_my_issues, jira_search, jira_get_issue, jira_list_projects, confluence_search et confluence_get_page. Ils n’envoient que des requêtes GET, avec votre propre compte Atlassian, donc Copilot voit ce que vous verriez dans un navigateur, et rien de plus. Il ne peut ni commenter, ni déplacer un ticket, ni modifier une page. Besoin d’un commentaire ? Demandez un brouillon et collez-le vous-même.

Ils renvoient aussi du texte court, exprès. Jira stocke les descriptions en ADF, un arbre JSON, et Confluence stocke les pages en XHTML. Les deux sont verbeux. Chaque caractère renvoyé par un outil repart vers le modèle à chaque appel suivant du chat, donc pilotkit les convertit en Markdown compact et coupe par défaut une description à 6 000 caractères et une page à 8 000.

Lecture

  • whoami
  • jira_my_issues
  • jira_search
  • jira_get_issue
  • jira_list_projects
  • confluence_search
  • confluence_get_page

Écriture

  • commentaire
  • transition
  • modifier une page

Sortie courteL’ADF et le XHTML deviennent du Markdown compact, coupé à 6 000 et 8 000 caractères.

Sept outils qui lisent, aucun qui écrit. Ceux qui sont barrés n’existent pas.

Le plus amusant : ce que coûte une réponse

Copilot facture en crédits IA sur un quota mensuel, et la fenêtre de chat ne vous dit pas ce qu’une question vient de dépenser. Alors pilotkit start ouvre un bureau sur 127.0.0.1:8717 qui fait tourner Copilot via le Copilot SDK officiel, et qui compte.

Après chaque appel au modèle, le SDK envoie un événement assistant.usage. Son champ copilotUsage.totalNanoAiu donne le coût en nano-unités IA (nano AI units), et il en faut 1 000 000 000 pour faire un crédit. Le bureau stocke ce coût par appel dans SQLite et affiche le total sous chaque réponse, avec un tableau des appels au modèle et des appels d’outil qui l’ont produite.

Ma première vraie question, sur mes tickets Jira ouverts, avec Claude Haiku 5.5 : 2 appels au modèle, 1 appel d’outil, 0,12 crédit. Le premier appel a demandé jira_my_issues, le second a rédigé la réponse. Une relance dans le même chat a coûté 0,03.

Quand un appel revient sans coût, le bureau l’estime à partir du prix des tokens du modèle et le marque d’un ≈. Chaque chat a aussi un plafond, 60 crédits par défaut, que Copilot applique lui-même via sessionLimits.maxAiCredits. Copilot refuse un plafond inférieur à 30.

  1. 1Appel au modèle

    Lit la question, demande jira_my_issues

  2. 2Appel d’outil

    Lit Jira avec votre propre compte

  3. 3Appel au modèle

    Rédige la réponse à partir du résultat

0,12crédit pour cette première question, Claude Haiku 5.5

0,03pour une relance dans le même chat

60crédits, le plafond par défaut d’un chat

1 crédit1 000 000 000 de nano-unités IA, lus dans assistant.usage après chaque appel au modèle.

Une réponse, démontée. Les chiffres viennent de ma première vraie question sur le bureau.

Verrouillé sur cette machine

Un bureau qui dépense des crédits ne devrait répondre à personne d’autre. Il n’écoute que sur 127.0.0.1, mais cela seul ne suffit pas : une page web que vous visitez peut toujours envoyer des requêtes à localhost. Il vérifie donc deux choses de plus.

L’en-tête Host doit valoir 127.0.0.1 ou localhost. Un nom DNS qui pointe vers 127.0.0.1 reçoit un 421, ce qui bloque le DNS rebinding. Et chaque écriture exige un en-tête X-Pilotkit: 1. Un formulaire ou une image sur un autre site ne peut pas en envoyer, donc il reçoit un 403 et ne peut pas dépenser vos crédits.

À l’intérieur, les sessions Copilot du bureau ne voient que les outils pilotkit. Un gestionnaire de permissions refuse le shell, les fichiers, les URL et les autres serveurs MCP, avec une raison que le modèle peut lire.

  1. Vous, dans votre navigateur

    127.0.0.1:8717

    le bureau

  2. Un formulaire sur un autre site

    pas de X-Pilotkit ✗

    403

  3. Un nom DNS pointé ici

    mauvais Host ✗

    421

  4. Le modèle, qui demande un shell

    gestionnaire de permissions ✗

    refusé, avec la raison

Outils dans un chat du bureauSeulement les sept de pilotkit.

Quatre façons de frapper à la porte, une seule qui entre. Le 421 et le 403, c’est ce que le bureau a répondu quand je les ai essayés.

Votre logo, pas le mien

Je l’ai fait pour des collègues, donc il doit ressembler à l’outil de leur entreprise, pas à mon projet perso. Mais un logo d’entreprise est une marque déposée, et il n’a rien à faire dans un dépôt public.

Le package reste donc neutre, et un pack de marque porte l’identité visuelle : un dossier avec un brand.json et un logo, partagé en interne sur un drive ou une URL intranet.

pilotkit setup --brand ./brand-acme

Il définit le nom, le logo, la couleur d’accent et la phrase d’accueil sur le bureau et dans le setup, et peut pré-remplir le site Atlassian. Le dépôt fournit un seul exemple, pour une entreprise qui n’existe pas : Acme.

Package public

Bureau pilotkit

Nom, logo et couleur neutres

Un pack d’exemple, pour une Acme inventée

+

Le pack de votre entreprise

Votre bureau

Votre nom, votre logo, votre couleur d’accent

Une phrase d’accueil, des liens d’aide, le site Atlassian pré-rempli

Partagé sur un drive ou une URL intranet

Appliqué avecpilotkit setup --brand <folder or URL>

Les marques restent chez l’entreprise qui les possède. Le dépôt public ne connaît qu’Acme.

Essayez-le

npm install -g pilotkit
pilotkit setup
pilotkit start

Il vous faut Node 22.13 ou plus récent, un abonnement Copilot et un site Atlassian Cloud. Une fois le setup fait, les mêmes outils marchent aussi dans le mode agent de VS Code et dans la CLI Copilot. pilotkit doctor vérifie chaque élément et dit quoi lancer quand quelque chose cloche.

1 · npm

Installer

  • npm install -g pilotkit
  • Node 22.13 ou plus récent

2 · Setup

Connecter

  • pilotkit setup
  • Connexion Copilot, jeton Atlassian

3 · Questions

Bureau

  • pilotkit start
  • Ou VS Code, ou la CLI Copilot

TestémacOS, avec un vrai site Jira et Confluence Cloud. Pas encore : Windows et Linux.

Trois commandes jusqu’à une première réponse.

C’est une toute première version, la v0.1, sous licence Apache-2.0, sur npm. Je l’ai testé sur macOS avec un vrai site Jira et Confluence Cloud : les sept outils, le bureau, sur ordinateur comme sur téléphone, et les garde-fous ci-dessus. Windows et Linux ne sont pas encore vérifiés, donc si vous le lancez là-dessus, dites-moi ce qui casse. Les issues sont ouvertes sur GitHub.

GitHub Copilot est une marque de GitHub ; Atlassian, Jira et Confluence sont des marques d’Atlassian. pilotkit est un projet indépendant.

Texte brut: pilotkit-copilot-jira-confluence.md · Flux Atom · Toutes les notes

Contact

Écrivez-moi.

b.bousnguar@gmail.com

Intégration SAP Commerce Cloud, MuleSoft et Salesforce · Nantes · FR / EN