
Generate Status Report
- 178 installs
- 935 repo stars
- Updated July 27, 2026
- atlassian/atlassian-mcp-server
Generate project status reports from Jira issues and publish to Confluence.
About
Generate project status reports from Jira issues and publish to Confluence. When an agent needs to: (1) Create a status report for a project, (2) Summarize project progress or updates, (3) Generate weekly/daily reports from Jira, (4) Publish status summaries to Confluence, or (5) Analyze project blockers and completion. Queries Jira issues, categorizes by status/priority, and creates formatted reports for delivery managers and executives. Automatically query Jira for project status, analyze issues, and generate formatted status reports published to Confluence.
- Automatically query Jira for project status, analyze issues, and generate formatted status reports published to Confluen
- Generating a status report follows these steps:
- **Identify scope** - Determine project, time period, and target audience
- **Query Jira** - Fetch relevant issues using JQL queries
- **Analyze data** - Categorize issues and identify key insights
Generate Status Report by the numbers
- 178 all-time installs (skills.sh)
- Ranked #1,001 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
generate-status-report capabilities & compatibility
- Capabilities
- automatically query jira for project status, ana · generating a status report follows these steps: · **identify scope** determine project, time per · **query jira** fetch relevant issues using jql
- Use cases
- documentation
What generate-status-report says it does
Generate project status reports from Jira issues and publish to Confluence. When an agent needs to: (1) Create a status report for a project, (2) Summarize project progress or updates, (3) Generate we
npx skills add https://github.com/atlassian/atlassian-mcp-server --skill generate-status-reportAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 178 |
|---|---|
| repo stars | ★ 935 |
| Last updated | July 27, 2026 |
| Repository | atlassian/atlassian-mcp-server ↗ |
How do I apply generate-status-report using the workflow in its SKILL.md?
Generate project status reports from Jira issues and publish to Confluence. When an agent needs to: (1) Create a status report for a project, (2) Summarize project progress or updates, (3...
Who is it for?
Developers following the generate-status-report skill for the tasks it documents.
Skip if: Tasks outside the generate-status-report scope described in SKILL.md.
When should I use this skill?
User mentions generate-status-report or related triggers from the skill description.
What you get
Working generate-status-report setup aligned with the documented patterns and constraints.
Files
Generate Status Report
Keywords
status report, project status, weekly update, daily standup, Jira report, project summary, blockers, progress update, Confluence report, sprint report, project update, publish to Confluence, write to Confluence, post report
Automatically query Jira for project status, analyze issues, and generate formatted status reports published to Confluence.
CRITICAL: This skill should be interactive. Always clarify scope (time period, audience, Confluence destination) with the user before or after generating the report. Do not silently skip Confluence publishing—always offer it.
Workflow
Generating a status report follows these steps:
1. Identify scope - Determine project, time period, and target audience 2. Query Jira - Fetch relevant issues using JQL queries 3. Analyze data - Categorize issues and identify key insights 4. Format report - Structure content based on audience and purpose 5. Publish to Confluence - Create or update a page with the report
Step 1: Identify Scope
IMPORTANT: If the user's request is missing key information, ASK before proceeding with queries. Do not assume defaults without confirmation for Confluence publishing.
Clarify these details:
Project identification:
- Which Jira project key? (e.g., "PROJ", "ENG", "MKTG")
- If the user mentions a project by name but not key, search Jira to find the project key
Time period:
- If not specified, ask: "What time period should this report cover? (default: last 7 days)"
- Options: Weekly (7 days), Daily (24 hours), Sprint-based (2 weeks), Custom period
Target audience:
- If not specified, ask: "Who is this report for? (Executives/Delivery Managers, Team-level, or Daily standup)"
- Executives/Delivery Managers: High-level summary with key metrics and blockers
- Team-level: Detailed breakdown with issue-by-issue status
- Daily standup: Brief update on yesterday/today/blockers
Report destination:
- ALWAYS ASK if not specified: "Would you like me to publish this report to Confluence? If so, which space should I use?"
- If user says yes: Ask for space name or offer to list available spaces
- Determine: New page or update existing page?
- Ask about parent page if creating under a specific section
Step 2: Query Jira
Use the searchJiraIssuesUsingJql tool to fetch issues. Build JQL queries based on report needs.
Common Query Patterns
For comprehensive queries, use the scripts/jql_builder.py utility to programmatically build JQL strings. For quick queries, reference references/jql-patterns.md for examples.
All open issues in project:
project = "PROJECT_KEY" AND status != Done ORDER BY priority DESC, updated DESCIssues updated in last week:
project = "PROJECT_KEY" AND updated >= -7d ORDER BY priority DESCHigh priority and blocked issues:
project = "PROJECT_KEY" AND (priority IN (Highest, High) OR status = Blocked) AND status != Done ORDER BY priority DESCCompleted in reporting period:
project = "PROJECT_KEY" AND status = Done AND resolved >= -7d ORDER BY resolved DESCQuery Strategy
For most reports, execute multiple targeted queries rather than one large query:
1. Completed issues: Get recently resolved tickets 2. In-progress issues: Get active work items 3. Blocked issues: Get blockers requiring attention 4. High priority open: Get critical upcoming work
Use maxResults: 100 for initial queries. If pagination is needed, use nextPageToken from results.
Data to Extract
For each issue, capture:
key(e.g., "PROJ-123")summary(issue title)status(current state)priority(importance level)assignee(who's working on it)created/updated/resolveddatesdescription(if needed for context on blockers)
Step 3: Analyze Data
Process the retrieved issues to identify:
Metrics:
- Total issues by status (Done, In Progress, Blocked, etc.)
- Completion rate (if historical data available)
- Number of high priority items
- Unassigned issue count
Key insights:
- Major accomplishments (recently completed high-value items)
- Critical blockers (blocked high priority issues)
- At-risk items (overdue or stuck in progress)
- Resource bottlenecks (one assignee with many issues)
Categorization: Group issues logically:
- By status (Done, In Progress, Blocked)
- By priority (Highest → Low)
- By assignee or team
- By component or epic (if relevant)
Step 4: Format Report
Select the appropriate template based on audience. Templates are in references/report-templates.md.
For Executives and Delivery Managers
Use Executive Summary Format:
- Brief overall status (🟢 On Track / 🟡 At Risk / 🔴 Blocked)
- Key metrics (total, completed, in progress, blocked)
- Top 3 highlights (major accomplishments)
- Critical blockers with impact
- Upcoming priorities
Keep it concise - 1-2 pages maximum. Focus on what matters to decision-makers.
For Team-Level Reports
Use Detailed Technical Format:
- Completed issues listed with keys
- In-progress issues with assignee and priority
- Blocked issues with blocker description and action needed
- Risks and dependencies
- Next period priorities
Include more detail - Team needs issue-level visibility.
For Daily Updates
Use Daily Standup Format:
- What was completed yesterday
- What's planned for today
- Current blockers
- Brief notes
Keep it brief - This is a quick sync, not comprehensive analysis.
Step 5: Publish to Confluence
After generating the report, ALWAYS offer to publish to Confluence (unless user explicitly said not to).
If user hasn't specified Confluence details yet, ask:
- "Would you like me to publish this report to Confluence?"
- "Which Confluence space should I use?"
- "Should this be nested under a specific parent page?"
Use the createConfluencePage tool to publish the report.
Page creation:
createConfluencePage(
cloudId="[obtained from getConfluenceSpaces or URL]",
spaceId="[numerical space ID]",
title="[Project Name] - Status Report - [Date]",
body="[formatted report in Markdown]",
contentFormat="markdown",
parentId="[optional - parent page ID if nesting under another page]"
)Title format examples:
- "Project Phoenix - Weekly Status - Dec 3, 2025"
- "Engineering Sprint 23 - Status Report"
- "Q4 Initiatives - Status Update - Week 49"
Body formatting: Write the report content in Markdown. The tool will convert it to Confluence format. Use:
- Headers (
#,##,###) for structure - Bullet points for lists
- Bold (
**text**) for emphasis - Tables for metrics if needed
- Links to Jira issues:
[PROJ-123](https://yourinstance.atlassian.net/browse/PROJ-123)
Best practices:
- Include the report date prominently
- Link directly to relevant Jira issues
- Use consistent naming conventions for recurring reports
- Consider creating under a "Status Reports" parent page for organization
Finding the Right Space
If the user doesn't specify a Confluence space:
1. Use getConfluenceSpaces to list available spaces 2. Look for spaces related to the project (matching project name or key) 3. If unsure, ask the user which space to use 4. Default to creating in the most relevant team or project space
Updating Existing Reports
If updating an existing page instead of creating new:
1. Get the current page content:
getConfluencePage(
cloudId="...",
pageId="123456",
contentFormat="markdown"
)2. Update the page with new content:
updateConfluencePage(
cloudId="...",
pageId="123456",
body="[updated report content]",
contentFormat="markdown",
versionMessage="Updated with latest status - Dec 8, 2025"
)Complete Example Workflow
User request: "Generate a status report for Project Phoenix and publish it to Confluence"
Step 1 - Identify scope:
- Project: Phoenix (need to find project key)
- Time period: Last week (default)
- Audience: Not specified, assume executive level
- Destination: Confluence, need to find appropriate space
Step 2 - Query Jira:
# Find project key first
searchJiraIssuesUsingJql(
cloudId="...",
jql='project = "PHOENIX" OR project = "PHX"',
maxResults=1
)
# Query completed issues
searchJiraIssuesUsingJql(
cloudId="...",
jql='project = "PHX" AND status = Done AND resolved >= -7d',
maxResults=50
)
# Query blocked issues
searchJiraIssuesUsingJql(
cloudId="...",
jql='project = "PHX" AND status = Blocked',
maxResults=50
)
# Query in-progress high priority
searchJiraIssuesUsingJql(
cloudId="...",
jql='project = "PHX" AND status IN ("In Progress", "In Review") AND priority IN (Highest, High)',
maxResults=50
)Step 3 - Analyze:
- 15 issues completed (metrics)
- 3 critical blockers (key insight)
- Major accomplishment: API integration completed (highlight)
Step 4 - Format: Use Executive Summary Format from templates. Create concise report with metrics, highlights, and blockers.
Step 5 - Publish:
# Find appropriate space
getConfluenceSpaces(cloudId="...")
# Create page
createConfluencePage(
cloudId="...",
spaceId="12345",
title="Project Phoenix - Weekly Status - Dec 3, 2025",
body="[formatted markdown report]",
contentFormat="markdown"
)Tips for Quality Reports
Be data-driven:
- Include specific numbers and metrics
- Reference issue keys directly
- Show trends when possible (e.g., "completed 15 vs 12 last week")
Highlight what matters:
- Lead with the most important information
- Flag blockers prominently
- Celebrate significant wins
Make it actionable:
- For blockers, state what action is needed and from whom
- For risks, provide mitigation options
- For priorities, be specific about next steps
Keep it consistent:
- Use the same format for recurring reports
- Maintain predictable structure
- Include comparable metrics week-over-week
Provide context:
- Link to Jira for details
- Explain the impact of blockers
- Connect work to business objectives when possible
Resources
scripts/jql_builder.py
Python utility for programmatically building JQL queries. Use this when you need to construct complex or dynamic queries. Import and use the helper functions rather than manually concatenating JQL strings.
references/jql-patterns.md
Quick reference of common JQL query patterns for status reports. Use this for standard queries or as a starting point for custom queries.
references/report-templates.md
Detailed templates for different report types and audiences. Reference this to select the appropriate format and structure for your report.
JQL Query Patterns
Common JQL patterns for status report generation.
Basic Project Queries
All open issues in a project:
project = "PROJECT_KEY" AND status != DoneOpen issues by status:
project = "PROJECT_KEY" AND status IN ("To Do", "In Progress", "In Review")Priority-Based Queries
High priority open issues:
project = "PROJECT_KEY" AND status != Done AND priority IN ("Highest", "High")Blocked issues:
project = "PROJECT_KEY" AND status = BlockedTime-Based Queries
Updated in last week:
project = "PROJECT_KEY" AND updated >= -7dCompleted in reporting period:
project = "PROJECT_KEY" AND status = Done AND resolved >= -7dCreated this sprint:
project = "PROJECT_KEY" AND created >= -14dAssignee Queries
Unassigned issues:
project = "PROJECT_KEY" AND assignee is EMPTY AND status != DoneIssues by team member:
project = "PROJECT_KEY" AND assignee = "user@example.com" AND status != DoneCombined Queries for Reports
Current sprint overview:
project = "PROJECT_KEY" AND status IN ("To Do", "In Progress", "In Review", "Done") AND updated >= -7d ORDER BY priority DESC, updated DESCRisk items (high priority blocked or overdue):
project = "PROJECT_KEY" AND (status = Blocked OR (duedate < now() AND status != Done)) AND priority IN ("Highest", "High") ORDER BY priority DESCEpic and Component Queries
Issues by epic:
parent = "EPIC_KEY" AND status != DoneNote: Older Jira instances may use "Epic Link" = "EPIC_KEY" instead of parent.
Issues by component:
project = "PROJECT_KEY" AND component = "ComponentName" AND status != DoneStatus Report Templates
This file provides templates for different report formats based on audience and context.
Executive Summary Format
For delivery managers and executives who need high-level overview:
# [Project Name] - Status Report
**Date:** [Date]
**Reporting Period:** [Period]
## Executive Summary
[2-3 sentences summarizing overall status, major accomplishments, and critical blockers]
## Overall Status
🟢 On Track | 🟡 At Risk | 🔴 Blocked | ⚪ Not Started
## Key Metrics
- **Total Issues:** [number]
- **Completed This Period:** [number]
- **In Progress:** [number]
- **Blocked:** [number]
## Highlights
- [Major accomplishment 1]
- [Major accomplishment 2]
- [Major accomplishment 3]
## Critical Blockers
- **[Blocker Title]** - [Brief description and impact]
- **[Blocker Title]** - [Brief description and impact]
## Upcoming Priorities
- [Priority 1]
- [Priority 2]
- [Priority 3]Detailed Technical Format
For team-level reports with more technical detail:
# [Project Name] - Status Report
**Date:** [Date]
**Reporting Period:** [Period]
## Summary
[Overall project status and key takeaways]
## Progress This Period
### Completed
- [Issue Key] - [Summary]
- [Issue Key] - [Summary]
### In Progress
- [Issue Key] - [Summary] ([Assignee], [Priority])
- [Issue Key] - [Summary] ([Assignee], [Priority])
### Blocked
- [Issue Key] - [Summary]
- **Blocker:** [Description of blocker]
- **Impact:** [How this affects timeline/deliverables]
- **Action Needed:** [What needs to happen to unblock]
## Risks and Issues
- [Risk/Issue description with mitigation plan]
## Next Period Priorities
- [Planned work item 1]
- [Planned work item 2]
## Dependencies
- [External dependency description]Daily Standup Format
For daily status updates:
# Daily Status - [Date]
**Project:** [Project Name]
## Completed Yesterday
- [Issue Key] - [Brief summary]
## Planned for Today
- [Issue Key] - [Brief summary]
## Blockers
- [Blocker description] (Assigned to: [name])
## Notes
[Any additional context or observations]By Priority Breakdown
For priority-focused reporting:
# [Project Name] - Status by Priority
**Date:** [Date]
## Highest Priority (P0/Blocker)
- [Issue Key] - [Summary] - Status: [status]
## High Priority (P1/Critical)
- [Issue Key] - [Summary] - Status: [status]
## Medium Priority (P2/Major)
- [Issue Key] - [Summary] - Status: [status]
## Low Priority (P3/Minor)
[Summary count only unless specifically requested]#!/usr/bin/env python3
"""
JQL Query Builder Utility
Helper functions for building common JQL queries for status reports.
"""
from typing import List, Optional
import re
def sanitize_jql_value(value: str) -> str:
"""
Sanitize a value for use in JQL to prevent injection attacks.
Args:
value: The input value to sanitize
Returns:
Sanitized value safe for JQL queries
"""
if not value:
return value
# Remove or escape potentially dangerous characters
# Allow alphanumeric, spaces, hyphens, underscores, dots, @
safe_pattern = re.compile(r'^[a-zA-Z0-9\s\-_.@]+$')
if not safe_pattern.match(value):
raise ValueError(
f"Invalid characters in input: '{value}'. "
f"Only alphanumeric characters, spaces, hyphens, underscores, dots, and @ are allowed."
)
# Escape double quotes by doubling them (JQL escaping)
return value.replace('"', '""')
def sanitize_jql_list(values: List[str]) -> List[str]:
"""
Sanitize a list of values for use in JQL.
Args:
values: List of input values to sanitize
Returns:
List of sanitized values
"""
return [sanitize_jql_value(v) for v in values]
def build_project_query(
project_key: str,
statuses: Optional[List[str]] = None,
exclude_done: bool = True,
priorities: Optional[List[str]] = None,
days_back: Optional[int] = None,
assignee: Optional[str] = None,
order_by: str = "priority DESC, updated DESC"
) -> str:
"""
Build a JQL query for project status.
Args:
project_key: The Jira project key
statuses: List of statuses to include (e.g., ["To Do", "In Progress"])
exclude_done: Whether to exclude Done status (default True)
priorities: List of priorities to include (e.g., ["Highest", "High"])
days_back: Number of days to look back for updates (e.g., 7)
assignee: Specific assignee email or "EMPTY" for unassigned
order_by: JQL order by clause (default: "priority DESC, updated DESC")
Returns:
JQL query string
"""
# Sanitize inputs to prevent JQL injection
project_key = sanitize_jql_value(project_key)
conditions = [f'project = "{project_key}"']
if statuses:
statuses = sanitize_jql_list(statuses)
status_list = '", "'.join(statuses)
conditions.append(f'status IN ("{status_list}")')
elif exclude_done:
conditions.append('status != Done')
if priorities:
priorities = sanitize_jql_list(priorities)
priority_list = '", "'.join(priorities)
conditions.append(f'priority IN ("{priority_list}")')
if days_back:
if not isinstance(days_back, int) or days_back < 0:
raise ValueError(f"days_back must be a non-negative integer, got: {days_back}")
conditions.append(f'updated >= -{days_back}d')
if assignee:
if assignee.upper() == "EMPTY":
conditions.append('assignee is EMPTY')
else:
assignee = sanitize_jql_value(assignee)
conditions.append(f'assignee = "{assignee}"')
query = " AND ".join(conditions)
if order_by:
# Validate order_by contains only safe keywords
order_by = sanitize_jql_value(order_by)
query += f' ORDER BY {order_by}'
return query
def build_blocked_query(
project_key: str,
high_priority_only: bool = False
) -> str:
"""Build query for blocked issues."""
project_key = sanitize_jql_value(project_key)
query = f'project = "{project_key}" AND status = Blocked'
if high_priority_only:
query += ' AND priority IN (Highest, High)'
query += ' ORDER BY priority DESC, created ASC'
return query
def build_completed_query(
project_key: str,
days_back: int = 7
) -> str:
"""Build query for recently completed issues."""
project_key = sanitize_jql_value(project_key)
if not isinstance(days_back, int) or days_back < 0:
raise ValueError(f"days_back must be a non-negative integer, got: {days_back}")
return (
f'project = "{project_key}" AND '
f'status = Done AND '
f'resolved >= -{days_back}d '
f'ORDER BY resolved DESC'
)
def build_in_progress_query(
project_key: str,
priorities: Optional[List[str]] = None
) -> str:
"""Build query for in-progress issues."""
project_key = sanitize_jql_value(project_key)
query = f'project = "{project_key}" AND status IN ("In Progress", "In Review")'
if priorities:
priorities = sanitize_jql_list(priorities)
priority_list = '", "'.join(priorities)
query += f' AND priority IN ("{priority_list}")'
query += ' ORDER BY priority DESC, updated DESC'
return query
def build_risk_query(
project_key: str,
include_overdue: bool = True
) -> str:
"""Build query for risk items (blocked or overdue high priority)."""
project_key = sanitize_jql_value(project_key)
conditions = [f'project = "{project_key}"']
risk_conditions = ['status = Blocked']
if include_overdue:
risk_conditions.append('(duedate < now() AND status != Done)')
conditions.append(f'({" OR ".join(risk_conditions)})')
conditions.append('priority IN (Highest, High)')
query = " AND ".join(conditions)
query += ' ORDER BY priority DESC, duedate ASC'
return query
def build_unassigned_query(
project_key: str,
exclude_done: bool = True
) -> str:
"""Build query for unassigned issues."""
project_key = sanitize_jql_value(project_key)
query = f'project = "{project_key}" AND assignee is EMPTY'
if exclude_done:
query += ' AND status != Done'
query += ' ORDER BY priority DESC, created ASC'
return query
# Example usage
if __name__ == "__main__":
# Example queries
project = "PROJ"
print("Open Issues Query:")
print(build_project_query(project))
print()
print("High Priority In Progress:")
print(build_in_progress_query(project, priorities=["Highest", "High"]))
print()
print("Blocked Issues:")
print(build_blocked_query(project, high_priority_only=True))
print()
print("Completed Last Week:")
print(build_completed_query(project, days_back=7))
print()
print("Risk Items:")
print(build_risk_query(project))
print()
print("Unassigned Open Issues:")
print(build_unassigned_query(project))
Related skills
FAQ
What does generate-status-report do?
Generate project status reports from Jira issues and publish to Confluence. When an agent needs to: (1) Create a status report for a project, (2) Summarize project progress or updates, (3...
When should I use generate-status-report?
Invoke when Generate project status reports from Jira issues and publish to Confluence. When an agent needs to: (1) Create a status report for a project.
Is generate-status-report safe to install?
Review the Security Audits panel on this page before installing in production.