Draft the weekly Jira status report your stakeholders actually read

Every Friday afternoon: what got done, what is in flight, what is blocked and what scope was added, written for people who never open Jira.

Runs
Fridays at 15:00
Uses
Jira
Posts
Report card

What lands on your board

AcmeJira weekly status report · Claude Code

On track for the sprint goal, one blocker

Sprint 24 goal: self-serve SSO setup. 11 issues done this week, 6 in progress, 1 blocked and 3 added.

Done11
In progress6
Blocked1
Added3
SectionItemNote
DoneUpload SAML metadata from the admin page (ACME-611)Live behind the sso flag
DoneVerify a domain with a DNS TXT record (ACME-603)
In progressEnforce SSO for all members of a workspace (ACME-618)Priya, in review
BlockedListing in the Okta app catalog (ACME-622)Waiting on Okta partner review since Oct 12
AddedSCIM deprovisioning (ACME-640)Asked for by a customer on Oct 14

ACME-622 needs a contact at Okta to move. The rest of the sprint goal can ship without it.

Done
An example with made-up numbers. Your agent posts your real ones.

What it does

Every Friday someone filters the board four ways and retypes issue titles into sentences leadership can follow. Stakeholders want three answers: did the team finish what it said, what is stuck, and did the plan change.

The agent answers those straight from Jira for one project or sprint, one short section each, with issue keys kept at the end of each line for anyone who wants to click through. Scope that came in mid-week gets its own section, which is the part hand-written updates usually leave out.

How it works

  1. 1Fix the scope

    Use one project or one sprint per report. For a sprint, read it with GET /rest/agile/1.0/board/{boardId}/sprint?state=active to get its id, name, goal, startDate and endDate; for a project, cover the last 7 days.

  2. 2Pull what got done

    GET /rest/api/3/search/jql with jql=project = ACME AND statusCategory = Done AND statusCategoryChangedDate >= -7d and fields=summary,issuetype,assignee,parent,labels. Group by epic (parent) so the report reads as features, not tickets.

  3. 3Pull work in flight and stuck

    Query statusCategory = "In Progress" for active work and (Flagged is not EMPTY OR status = Blocked) for blocked work, both within the same project or sprint = <id>. For each blocked issue, read the latest comment to find what it waits on.

  4. 4Find added scope

    Query created >= -7d within the scope. For a sprint, also search its open issues with expand=changelog and keep the ones whose Sprint field gained this sprint after startDate. Report the count and any story points added.

  5. 5

    5Write it for stakeholders

    Four short sections (Done, In progress, Blocked, Added), each line in plain language with the issue key at the end. Open with one sentence on whether the sprint goal or milestone is on track.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • Headline: on track or not, against the sprint goal or milestone.
  • Done this week, grouped by epic.
  • In progress, with the owner of each item.
  • Blocked, with what each issue waits on and who can clear it.
  • Added: issues and points that arrived after the plan was set.
  • A copy-ready version for Slack or email.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/jira-weekly-status-report/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the jira-weekly-status-report skill

    Or paste the prompt instead of installing:

    promptFrom Jira Cloud (GET /rest/api/3/search/jql, plus the Agile API for the sprint), write this week's status report for project ACME or its active sprint. Done: statusCategory = Done AND statusCategoryChangedDate >= -7d, grouped by epic. In progress: statusCategory = "In Progress", with assignee. Blocked: Flagged is not EMPTY OR status = Blocked, with what each one waits on (check the latest comment). Added: issues created or moved into the sprint in the last 7 days. Open with one sentence on whether the sprint goal is on track, write every line in plain language for non-engineers, and put the issue key at the end of each line.
  3. Put it on a schedule

    Fridays at 15:00, from cron on any machine where Claude Code is signed in:

    crontab0 15 * * 5 claude -p "Run the jira-weekly-status-report skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: jira-weekly-status-report
description: "Every Friday afternoon: what got done, what is in flight, what is blocked and what scope was added, written for people who never open Jira. Use when the user asks for this, or when it runs on a schedule."
---

# Jira weekly status report

Every Friday afternoon: what got done, what is in flight, what is blocked and what scope was added, written for people who never open Jira.

Every Friday someone filters the board four ways and retypes issue titles into sentences leadership can follow. Stakeholders want three answers: did the team finish what it said, what is stuck, and did the plan change.

The agent answers those straight from Jira for one project or sprint, one short section each, with issue keys kept at the end of each line for anyone who wants to click through. Scope that came in mid-week gets its own section, which is the part hand-written updates usually leave out.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Browse permission on the project, and the board ID for sprint reports (it is the number in the board URL, `.../boards/42`).
- Jira access through an MCP server or connector, or basic auth with `JIRA_EMAIL`, `JIRA_API_TOKEN` and `JIRA_BASE_URL`; the token also works for the Agile API under `/rest/agile/1.0`.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Fix the scope** (Jira): Use one project or one sprint per report. For a sprint, read it with `GET /rest/agile/1.0/board/{boardId}/sprint?state=active` to get its `id`, `name`, `goal`, `startDate` and `endDate`; for a project, cover the last 7 days.
2. **Pull what got done** (Jira): `GET /rest/api/3/search/jql` with `jql=project = ACME AND statusCategory = Done AND statusCategoryChangedDate >= -7d` and `fields=summary,issuetype,assignee,parent,labels`. Group by epic (`parent`) so the report reads as features, not tickets.
3. **Pull work in flight and stuck** (Jira): Query `statusCategory = "In Progress"` for active work and `(Flagged is not EMPTY OR status = Blocked)` for blocked work, both within the same project or `sprint = <id>`. For each blocked issue, read the latest comment to find what it waits on.
4. **Find added scope** (Jira): Query `created >= -7d` within the scope. For a sprint, also search its open issues with `expand=changelog` and keep the ones whose `Sprint` field gained this sprint after `startDate`. Report the count and any story points added.
5. **Write it for stakeholders**: Four short sections (Done, In progress, Blocked, Added), each line in plain language with the issue key at the end. Open with one sentence on whether the sprint goal or milestone is on track.

## Route B: the browser

### What you need

- Signed in to Jira with Browse permission on the project; the Sprint report also needs the board to be a Scrum board.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://home.atlassian.com/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the project and note the goal**: From Atlassian Home open Jira, then **Projects** and the project. For a sprint report open **Board**: the active sprint's name and goal sit at the top, and clicking the sprint name shows its start and end dates. For a project report, the window is the last 7 days.
2. **Pull what got done**: In the sidebar choose **Filters** > **View all work items**, switch to **JQL** and run `project = ACME AND statusCategory = Done AND statusCategoryChangedDate >= -7d`. Add the **Parent** column and sort by it so done work reads by epic.
3. **Pull work in flight and stuck**: Run `project = ACME AND statusCategory = "In Progress"` and then `project = ACME AND statusCategory != Done AND (Flagged is not EMPTY OR status = Blocked)`. Open each blocked item and read the newest entry under **Activity** > **Comments** to see what it waits on.
4. **Find added scope**: Run `project = ACME AND created >= -7d`. For a sprint, open **Reports** > **Sprint report** and pick the active sprint: items added after the sprint started are marked with an asterisk, and their estimates show in the table.
5. **Write it for stakeholders**: Four short sections (Done, In progress, Blocked, Added), each line in plain language with the key at the end, opening with one sentence on whether the sprint goal or milestone is on track.

Note: The asterisk for items added mid-sprint appears in the Sprint report of company-managed projects. Team-managed projects show a Sprint burndown instead; there, compare the scope line on day one with today and use the `created >= -7d` query for names.

## The report

- **Headline**: on track or not, against the sprint goal or milestone.
- **Done this week**, grouped by epic.
- **In progress**, with the owner of each item.
- **Blocked**, with what each issue waits on and who can clear it.
- **Added**: issues and points that arrived after the plan was set.
- A copy-ready version for Slack or email.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "jira-weekly-status-report/<date of this run, e.g. 2026-10-16>",
  "item_key": "jira-weekly-status-report",
  "project": "Acme",
  "source": "Jira weekly status report skill",
  "kind": "update",
  "title": "On track for the sprint goal, one blocker",
  "summary": "Sprint 24 goal: **self-serve SSO setup**. 11 issues done this week, 6 in progress, 1 blocked and 3 added.",
  "widget": [
    {
      "type": "Grid",
      "props": {
        "columns": 4
      },
      "children": [
        {
          "type": "Stat",
          "props": {
            "label": "Done",
            "value": 11,
            "tone": "ok"
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "In progress",
            "value": 6
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Blocked",
            "value": 1,
            "tone": "bad"
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Added",
            "value": 3,
            "tone": "warn"
          }
        }
      ]
    },
    {
      "type": "Table",
      "props": {
        "columns": [
          "Section",
          "Item",
          "Note"
        ],
        "rows": [
          [
            "Done",
            "Upload SAML metadata from the admin page (ACME-611)",
            "Live behind the sso flag"
          ],
          [
            "Done",
            "Verify a domain with a DNS TXT record (ACME-603)",
            ""
          ],
          [
            "In progress",
            "Enforce SSO for all members of a workspace (ACME-618)",
            "Priya, in review"
          ],
          [
            "Blocked",
            "Listing in the Okta app catalog (ACME-622)",
            "Waiting on Okta partner review since Oct 12"
          ],
          [
            "Added",
            "SCIM deprovisioning (ACME-640)",
            "Asked for by a customer on Oct 14"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "ACME-622 needs a contact at Okta to move. The rest of the sprint goal can ship without it.",
        "tone": "warn"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Fridays at 15:00 (`0 15 * * 5`). From cron, with the agent signed in on that machine:

```bash
0 15 * * 5 claude -p "Run the jira-weekly-status-report skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/jira-weekly-status-report#schedule

Source: https://briefkin.dev/skills/jira-weekly-status-report

What your agent needs

  • Browse permission on the project, and the board ID for sprint reports (it is the number in the board URL, .../boards/42).

  • Jira access through an MCP server or connector, or basic auth with JIRA_EMAIL, JIRA_API_TOKEN and JIRA_BASE_URL; the token also works for the Agile API under /rest/agile/1.0.

Connecting Jira

  1. Atlassian Rovo MCP Server, Atlassian's official remote server for Jira and Confluence at https://mcp.atlassian.com/v2/mcp. In Claude, add the Atlassian connector from the directory; in Claude Code, run claude mcp add --transport http atlassian https://mcp.atlassian.com/v2/mcp and authenticate with /mcp. It signs in with OAuth 2.1 or an API token and respects your Jira permissions (getting started).
  2. Atlassian CLI. After acli jira auth login, acli jira workitem search --jql "sprint in openSprints()" --json returns the same issues from a terminal.
  3. REST API with an API token. Create a token at id.atlassian.com under Security > API tokens. The skill reads JIRA_EMAIL, JIRA_API_TOKEN and JIRA_BASE_URL (https://acme.atlassian.net) and uses basic auth. A scoped token limited to read:jira-work and read:jira-user is narrower; scoped tokens call https://api.atlassian.com/ex/jira/{cloudId} instead of your site URL.

A classic token can do anything your account can, so prefer a scoped token with read scopes only, or an account that just has Browse permission on the projects in the report.

Questions

Our team does not use the Flagged field. How does it find blocked work?

It also checks for a status named Blocked, and you can add issues with an open blocking link (issueLinkType = "is blocked by" in JQL). Tell the prompt which convention your team uses and drop the others.

Can one report cover several teams?

Run it once per project or board, each with its own item_key, so every team gets its own card. A combined report works for two or three small teams; past that it no longer reads in a minute.

Do I need Briefkin to use the Jira weekly status report skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Jira pages themselves: the agent opens home.atlassian.com in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.