Brahim Bousnguar

Notes · Article

One command to make GitHub Copilot read your Jira, and see what every answer costs

By · · 5 min read

Listen · 7:06 · read by an AI voice

Listen to this article0:00 / 7:06

Read by an AI voice · MP3

GitHub Copilot can read your Jira issues and Confluence pages. It just needs an MCP server, an Atlassian API token and two config files in two formats first. pilotkit does all of that with one command, pilotkit setup, and adds a small local desk that shows what each answer cost in AI credits.

It's open source and on npm: npm install -g pilotkit. It started as a desk I run at work. pilotkit is the version colleagues can install on their own PCs without me sitting next to them.

Copilot can't see your tickets yet

A Copilot seat comes with chat, agent mode in VS Code and a CLI. None of them know your Atlassian site exists.

Doing it by hand means installing an MCP server, creating an API token and usually pasting it into a JSON file, then registering the server twice: copilot mcp add for the Copilot CLI, and a mcp.json for VS Code in a different format. Easy to do once for yourself, tedious to walk a whole team through.

By hand

Four jobs

Install an MCP server

Create an API token, paste it into a JSON file

copilot mcp add for the Copilot CLI

A mcp.json for VS Code, in another format

vs

pilotkit

One command

pilotkit setup

The token goes to the OS keychain, never to a file

Registered in both clients, other servers kept

Same result, two routes. The blue card is the one you can hand to a colleague.

What one command does

Setup walks through three checks and only saves what passed:

  1. Copilot. It finds the Copilot CLI, offers to install it, and signs you in with copilot login.
  2. Atlassian. It asks for the site, your email and an API token, then proves them with one call to /rest/api/3/myself. A wrong token gets two more tries.
  3. Clients. It registers the server with the Copilot CLI and in every VS Code user mcp.json it finds, keeping the other servers and a backup of the file.

The token never lands in a config file. On a Mac it goes into the Keychain through security -i, which reads its command from stdin. Passing the token as an argument would put it in the process list, where other programs running as you can read it with ps. On Windows it's a file only your Windows account can decrypt (DPAPI), and on Linux it's the Secret Service.

One bug I caught before it bit anyone: with Homebrew, Node's own path points into a versioned Cellar folder. Register that and the command breaks at the next brew upgrade. Setup now registers the opt/ path, which survives upgrades.

  1. 1Copilot

    Find or install the CLI, then copilot login

  2. 2Atlassian

    Site, email and token, proved against /myself

  3. 3Clients

    Copilot CLI and VS Code, other servers kept

The tokenmacOS Keychain, Windows DPAPI or the Linux Secret Service. Never a config file.

Each step checks its answer before the next one starts, so a bad token never gets saved.

Seven tools, all read-only

The MCP server has seven tools: whoami, jira_my_issues, jira_search, jira_get_issue, jira_list_projects, confluence_search and confluence_get_page. They only send GET requests, with your own Atlassian account, so Copilot sees what you'd see in a browser and nothing more. It can't comment, move a ticket or edit a page. Want a comment? Ask for a draft and paste it yourself.

They also return short text, on purpose. Jira stores descriptions as ADF, a JSON tree, and Confluence stores pages as XHTML. Both are noisy. Every character a tool returns goes back to the model with every later call in the chat, so pilotkit turns them into compact Markdown and cuts a description at 6,000 characters and a page at 8,000 by default.

Reads

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

Writes

  • comment
  • transition
  • edit a page

Short outputADF and XHTML become compact Markdown, cut at 6,000 and 8,000 characters.

Seven tools that read and none that write. The struck-out ones don't exist.

The fun part: what an answer costs

Copilot bills in AI credits against a monthly allowance, and the chat window doesn't tell you what a question just spent. So pilotkit start opens a desk on 127.0.0.1:8717 that runs Copilot through the official Copilot SDK and counts.

After every model call the SDK sends an assistant.usage event. Its copilotUsage.totalNanoAiu is the cost in nano AI units, and 1,000,000,000 of them make one credit. The desk stores that per call in SQLite and puts the total under each answer, with a table of the model calls and tool calls behind it.

My first real question, about my open Jira issues, with Claude Haiku 5.5: 2 model calls, 1 tool call, 0.12 credits. The first call asked for jira_my_issues, the second wrote the answer. A follow-up in the same chat cost 0.03.

When a call comes back without a cost, the desk estimates it from the model's token prices and marks it with ≈. Each chat also gets a cap, 60 credits by default, which Copilot enforces itself through sessionLimits.maxAiCredits. It won't take less than 30.

  1. 1Model call

    Reads the question, asks for jira_my_issues

  2. 2Tool call

    Reads Jira with your own account

  3. 3Model call

    Writes the answer from the result

0.12credits for that first question, Claude Haiku 5.5

0.03for a follow-up in the same chat

60credits, the default cap per chat

1 credit1,000,000,000 nano AI units, read from assistant.usage after every model call.

One answer, taken apart. The numbers are from my first real question on the desk.

Locked to this machine

A desk that spends credits shouldn't answer anyone else. It listens on 127.0.0.1 only, and that isn't enough on its own: a web page you visit can still send requests to localhost. So it checks two more things.

The Host header must be 127.0.0.1 or localhost. A DNS name pointed at 127.0.0.1 gets a 421, which stops DNS rebinding. And every write needs an X-Pilotkit: 1 header. A form or an image on another site can't send one, so it gets a 403 and can't spend your credits.

Inside, the desk's Copilot sessions only see the pilotkit tools. A permission handler refuses the shell, files, URLs and other MCP servers, with a reason the model can read.

  1. You, in your browser

    127.0.0.1:8717

    the desk

  2. A form on another site

    no X-Pilotkit ✗

    403

  3. A DNS name pointed here

    wrong Host ✗

    421

  4. The model, asking for a shell

    permission handler ✗

    refused, with the reason

Tools in a desk chatOnly pilotkit's seven.

Four ways to knock, one that gets in. The 421 and the 403 are what the desk answered when I tried them.

Your logo, not mine

I made it for colleagues, so it should look like their company's tool, not my side project. But a company logo is a trademark, and it doesn't belong in a public repo.

So the package stays neutral and a brand pack carries the look: a folder with a brand.json and a logo, shared inside the company on a drive or an intranet URL.

pilotkit setup --brand ./brand-acme

It sets the name, logo, accent colour and welcome line on the desk and in setup, and can pre-fill the Atlassian site. The repo ships one example, for a company that doesn't exist: Acme.

Public package

pilotkit desk

Neutral name, logo and colour

One example pack, for a made-up Acme

+

Your company's pack

Your desk

Your name, logo and accent colour

A welcome line, help links, the Atlassian site pre-filled

Shared on a drive or an intranet URL

Applied withpilotkit setup --brand <folder or URL>

The marks stay with the company that owns them. The public repo only knows Acme.

Try it

npm install -g pilotkit
pilotkit setup
pilotkit start

You need Node 22.13 or newer, a Copilot plan and an Atlassian Cloud site. Once it's set up, the same tools also work in VS Code's agent mode and in the Copilot CLI. pilotkit doctor checks every part and says what to run when something's off.

1 · npm

Install

  • npm install -g pilotkit
  • Node 22.13 or newer

2 · Setup

Connect

  • pilotkit setup
  • Copilot sign-in, Atlassian token

3 · Ask

Desk

  • pilotkit start
  • Or VS Code, or the Copilot CLI

TestedmacOS, against a real Jira and Confluence Cloud site. Not yet: Windows and Linux.

Three commands to a first answer.

It's v0.1 and Apache-2.0, on npm. I've tested it on macOS against a real Jira and Confluence Cloud site: all seven tools, the desk on desktop and phone, and the guards above. Windows and Linux aren't verified yet, so if you run it there, tell me what breaks. Issues are open on GitHub.

GitHub Copilot is a GitHub trademark; Atlassian, Jira and Confluence are Atlassian's. pilotkit is an independent project.

Plain text: pilotkit-copilot-jira-confluence.md · Atom feed · All notes

Contact

Say hello.

b.bousnguar@gmail.com

SAP Commerce Cloud, MuleSoft and Salesforce integration · Nantes · EN / FR