Jira Issue Fetcher
Read Jira Server and Jira Data Center issues directly from GitHub Copilot
(and other compatible VS Code chat agents) through a single read-only
Language Model Tool.
When your prompt references a Jira issue — by key such as ABC-123 or by a
/browse/ABC-123 URL — the agent can call this tool to fetch the issue's current
data (summary, description, status, comments, attachments metadata, custom
fields, and more) and use it to help you analyze, implement, or fix code in your
workspace.
This extension does not support Jira Cloud. It targets Jira Server / Data
Center using a Personal Access Token (PAT).
What it does
- Contributes two read-only tools:
#getJiraIssue (capability get_jira_issue) — reads issue data.
#getJiraAttachment (capability get_jira_attachment) — visually exposes one
attachment (screenshot / GIF / MP4 / WebM) to a vision-capable agent.
- Authenticates to Jira with
Authorization: Bearer <your PAT>.
- Calls
GET {baseUrl}/rest/api/2/issue/{issueKey}?fields=*all&expand=names,schema,renderedFields,changelog.
- Returns stable, structured JSON. Both tools are read-only: they never
create, edit, transition, comment on, or modify Jira in any way.
Supported Jira versions
- Jira Server (7.x / 8.x / 9.x) with Personal Access Tokens.
- Jira Data Center with Personal Access Tokens.
Personal Access Tokens are supported by Jira Server / Data Center 8.14 and
later. Jira Cloud (Basic auth with email + API token, or OAuth) is intentionally
not supported in this version.
Create a Jira Personal Access Token
- Sign in to your Jira Server / Data Center web UI.
- Open your profile menu → Profile → Personal Access Tokens
(URL is usually
{baseUrl}/secure/ViewProfile.jspa → Personal Access Tokens).
- Choose Create token, give it a name, and (optionally) an expiry.
- Copy the token value. You will not be able to see it again.
The token inherits your Jira permissions, so it can only read issues you can
already see.
Run Jira Issue Fetcher: Configure from the Command Palette
(Ctrl+Shift+P / Cmd+Shift+P):
- Enter your Jira base URL, for example
https://jira.company.com.
- Use the scheme and host (and context path, if any), e.g.
https://jira.company.com or https://host.example/jira.
- Do not include a trailing slash or an issue path. Any trailing slash is
removed automatically.
- Enter your Personal Access Token in the masked input box.
The base URL is saved to your user (global) settings as
jiraIssueFetcher.jiraUrlBase. The token is stored in VS Code SecretStorage
and is never written to settings.json.
Other commands:
- Jira Issue Fetcher: Test Connection — verifies the stored credentials
against
{baseUrl}/rest/api/2/myself.
- Jira Issue Fetcher: Clear Credentials — removes the base URL and the token
after confirmation.
- Open the Chat view and switch to Agent mode.
- Open the tools picker (the tools/🛠 button) and make sure Get Jira Issue
is enabled, or reference it explicitly in your prompt with
#getJiraIssue.
- The agent decides when to call the tool based on your prompt. You can always
force it by typing
#getJiraIssue ABC-123.
ABC-123 đang gặp lỗi gì? / “What is going wrong in ABC-123?”
- “Read ticket
https://jira.company.com/browse/ABC-123 and check the current code.”
- “Based on the steps to reproduce in ABC-123, find the root cause in this workspace.”
- “Explain how JavaScript Promises work.”
- “Fix the TODO in this file.”
- “What’s wrong with this GitHub issue?”
- “Write a unit test for the current function.”
The result is read-only
The tool only reads Jira. It never modifies issues and never calls another
language model. It returns JSON shaped like:
{
"ok": true,
"data": {
"source": "jira",
"readOnly": true,
"issueKey": "ABC-123",
"summary": "…",
"description": "…",
"status": { "…": "…" },
"comments": [ /* … */ ],
"attachments": [ /* metadata only */ ],
"customFieldsByName": { /* … */ },
"stepsToReproduce": null,
"metadata": { "fetchedAt": "…", "jiraBaseUrl": "…", "warnings": [] }
}
}
On failure it returns a structured error:
{
"ok": false,
"error": {
"code": "JIRA_NOT_CONFIGURED",
"message": "…",
"action": "Run command: Jira Issue Fetcher: Configure"
}
}
Special fields (Steps to Reproduce, Expected Result, Actual Result,
Acceptance Criteria) are located by matching field display names returned
by expand=names — not by hard-coded custom field IDs — so they work across
different Jira instances. If a field cannot be found, its value is null; the
tool never invents content.
Attachments
get_jira_issue returns attachments as metadata only — it never downloads
file bytes. Each attachment includes name, mimeType, size,
author.displayName, the Jira contentUrl / thumbnailUrl / selfUrl, and
classification flags (isImage, isAnimatedImage, isVideo,
canBeReadWithTool) plus an attachmentToolInput you pass to the second tool.
Attachment URLs point to Jira and may require authentication (a Bearer token
or an active Jira session) to open. Credentials are never embedded in these URLs.
Visual attachment analysis (get_jira_attachment)
A second read-only tool, referenced in chat as #getJiraAttachment, lets a
vision-capable agent actually see a Jira attachment. get_jira_issue never
downloads media automatically — the agent decides when a screenshot or recording
is worth inspecting, then calls get_jira_attachment with the issueKey and the
attachmentId returned by get_jira_issue (never an invented ID, never a URL).
Supported formats: PNG, JPG/JPEG, WebP, GIF, MP4, WebM.
- Static images (PNG/JPEG) are returned as actual image content. WebP is
converted to PNG first for consistent vision behavior.
- GIF, MP4 and WebM are decoded locally with the bundled FFmpeg. The tool
samples low-resolution candidate frames, removes near-duplicate frames, selects
~6–10 representative frames, and returns them as PNG images in chronological
order with millisecond timestamps.
- Near-duplicate detection happens locally inside the extension (deterministic
image comparison — no AI, no external service).
- No Jira media is uploaded to any extension-owned backend. The PAT stays in
VS Code SecretStorage; downloads go only to your configured Jira host.
Modes (the agent picks one): auto (default, ~8 frames), timeline (even
coverage, ~10 frames), detail (denser sampling for subtle UI changes, ~12).
A vision-capable model is required to interpret the returned images. If the
selected model cannot accept images, the frames are still returned but cannot be
analyzed.
Example attachment prompts
- “Read ABC-123 and inspect the QA screenshots before proposing a fix.”
- “Read ABC-123. If the attached recording is relevant, inspect it and compare the
observed behavior with the current implementation.”
- “Use the detailed attachment view for ABC-123 because the UI glitch is very subtle.”
Troubleshooting
| Symptom |
Meaning |
What to do |
UNAUTHORIZED (HTTP 401) |
The PAT is invalid, expired, or revoked. |
Run Jira Issue Fetcher: Configure and paste a fresh token. |
FORBIDDEN (HTTP 403) |
The account tied to the PAT lacks permission to view the issue. |
Ask a Jira admin for access, or use a token from an account that can see the issue. |
NOT_FOUND (HTTP 404) |
The issue does not exist, or your account cannot see it. |
Double-check the key/URL and your project permissions. |
TLS_ERROR |
The server certificate could not be validated. |
Ensure the base URL is correct and its certificate chain is trusted by your OS. The extension never disables TLS verification. |
NON_JSON_RESPONSE |
A login page or proxy responded instead of the REST API. |
Verify the base URL points at Jira itself (not an SSO gateway). |
TIMEOUT / NETWORK_ERROR |
The request could not complete. |
Check connectivity/VPN and try again. |
UNSUPPORTED_ATTACHMENT_TYPE |
The attachment is not PNG/JPEG/WebP/GIF/MP4/WebM. |
Only these formats can be visually analyzed. |
ATTACHMENT_TOO_LARGE / VIDEO_TOO_LONG |
Media exceeds the size/duration caps. |
Caps: 10 MB image, 20 MB GIF, 100 MB video, 5 min. |
FFMPEG_NOT_FOUND / UNSUPPORTED_PLATFORM |
FFmpeg isn't available for your OS/architecture. |
The extension supports Windows x64, Linux x64, and macOS (Intel & Apple Silicon). Install it from the Marketplace so the build matching your platform is used; other platforms aren't supported yet. |
MEDIA_DECODE_FAILED / FFPROBE_FAILED |
FFmpeg could not decode the media. |
The file may be corrupt; try re-uploading it in Jira. |
ATTACHMENT_NOT_OWNED_BY_ISSUE / ATTACHMENT_HOST_NOT_ALLOWED |
The attachment ID is not part of the issue, or its URL is off-host. |
Use only attachmentToolInput values from get_jira_issue. |
Security
- Your Personal Access Token is stored only in VS Code SecretStorage. It is
never written to
settings.json, workspace state, .env files, logs,
telemetry, error messages, or the tool result.
- The
jiraIssueFetcher.jiraUrlBase setting is application-scoped, so a
workspace cannot override it and redirect requests (and your token) elsewhere.
- Requests go only to the Jira base URL you configured. A URL supplied in a
prompt must resolve to that same origin/context path or the request is refused.
- The extension uses the built-in
fetch; there are no third-party runtime
dependencies, no shell execution, and no eval.
- TLS certificate validation is never disabled.
- Attachment downloads use the PAT only against your configured Jira host;
redirects to any other host are refused so the token is never leaked (SSRF-safe).
get_jira_attachment accepts only an issueKey + attachmentId (never a URL)
and verifies the attachment belongs to that issue before downloading.
- FFmpeg is invoked with
spawn / shell: false and argument arrays; attachment
filenames are never passed to a shell. Downloaded media is written to a random
temp file and deleted after processing.
Privacy
- No telemetry. This extension collects nothing and phones no home.
- No backend. There is no intermediary server. Data flows only between your
VS Code and your Jira instance.
- Jira responses are handed to the agent in-memory and are never written to disk
by this extension.
- Attachment media is processed in a temporary file that is deleted after use;
it is never persisted in your workspace or committed.
License
This extension is licensed under the MIT License. It bundles the
FFmpeg ffmpeg / ffprobe binaries, which are distributed under their own
license — see THIRD_PARTY_NOTICES.md.