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
What one command does
Setup walks through three checks and only saves what passed:
- Copilot. It finds the Copilot CLI, offers to install it, and signs you in with
copilot login. - 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. - Clients. It registers the server with the Copilot CLI and in every VS Code user
mcp.jsonit 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.
-
1Copilot
Find or install the CLI, then
copilot login -
2Atlassian
Site, email and token, proved against
/myself -
3Clients
Copilot CLI and VS Code, other servers kept
The tokenmacOS Keychain, Windows DPAPI or the Linux Secret Service. Never a config file.
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.
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.
-
1Model call
Reads the question, asks for
jira_my_issues -
2Tool call
Reads Jira with your own account
-
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.
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.
You, in your browser
127.0.0.1:8717
the desk
A form on another site
no X-Pilotkit ✗
403
A DNS name pointed here
wrong Host ✗
421
The model, asking for a shell
permission handler ✗
refused, with the reason
Tools in a desk chatOnly pilotkit's seven.
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>
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.
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