jira-tempo-mcp
MCP server for self-hosted Jira (Server / Data Center) + Tempo Timesheets 4. Track time, list worklogs, and generate weekly reports — all from your AI agent (Copilot, Claude, etc.) via the Model Context Protocol.
📖 Русская версия: README.ru.md
📚 Documentation
| Document | Description |
|---|---|
| API Reference | Full MCP tool reference with parameters and examples |
| Installation | Setup and installation guide |
| Configuration | Environment variables reference |
| Reports | Report formats (txt, md, json) and templates |
| Templates | Custom report templates reference (Jinja2 + Python) |
| Task templates | Task templates reference (parent issue + child subtasks from YAML) |
| Architecture | Project architecture and design decisions |
| CLI | Command-line interface reference |
| Troubleshooting | Common issues and solutions |
| MCP Integration | Integration with MCP clients (VS Code, etc.) |
| Deployment | Docker and deployment options |
📋 Features
| Tool | What it does |
|---|---|
list_worklogs |
List Tempo worklogs for a date range or single day |
get_worklog |
Get a single worklog by Tempo ID |
create_worklog |
Track time on a Jira issue with a comment |
delete_worklog |
Delete a worklog (undo mis-tracked time) |
get_issue |
Get Jira issue metadata (summary, status, project) |
create_issue |
Create a new Jira issue (optionally a subtask via parent key) |
add_issue_comment |
Add a comment to an existing Jira issue |
list_issue_templates |
List available task templates (builtin + user overrides) |
create_issue_from_template |
Create a parent issue plus ordered child subtasks from a task template |
list_favorite_issues |
List favorite issues for the current user |
search_users |
Search Jira users by name, surname, or username |
list_user_tasks |
Get tasks assigned to a Jira user with status, priority, comments |
generate_weekly_report |
Generate a weekly report (txt/md/json) from Tempo worklogs |
generate_team_report |
Generate a team report (txt/md/json) for multiple Jira users |
generate_tasks_report |
Generate a tasks report (md/txt/json) grouped by status |
list_issues_by_jql |
Search Jira issues by a JQL query (read-only, max 100) |
get_current_user |
Get info about the authenticated user (PAT owner) |
preview_report_template |
Preview a report template rendered with sample data |
list_report_templates |
List available report templates (builtin + custom) |
Since v0.2.0 the server supports team reports (per-user aggregation with
rate-limiting) and custom report templates (Jinja2 sandbox + opt-in Python).
Since v0.3.0 all report generators support three output formats: txt
(plain text), md (Markdown with tables and emojis), and json (structured
JSON). See docs/reports.md for details.
See docs/api.md for the full tool reference with parameters and examples.
🚀 Quick start
Get up and running in under a minute:
Install (one command):
curl -fsSL https://raw.githubusercontent.com/Korrnals/jira-tempo-mcp/main/scripts/install.sh | bash
Or from the package indexes once published:
pip install jira-tempo-mcp # PyPI
npm i -g jira-tempo-mcp # npm wrapper (installs the Python package)
Then install the report specialist into your AI harness (or skip — the CLI lists supported ones):
jira-tempo-mcp install-specialist
Update to the latest version:
jira-tempo-mcp update # pip upgrade (wheel) — or git pull + reinstall (editable)
This downloads and runs the interactive installer, which:
- ✅ Checks Python 3.11+ and pip
- ✅ Clones the repo and creates a venv
- ✅ Installs the package
- ✅ Guides you through Jira credentials setup
- ✅ Registers the MCP server in VS Code (user + workspace)
- ✅ Installs the standalone JTM: Jira Tempo Reports Copilot Chat agent by default (skip with
--no-agent) — see §JTM Agent for details
💡 Tip: The installer never requires
sudo— everything lives in user space. It's idempotent: re-running updates without clobbering existing config.
Uninstall:
# Remove everything (MCP server + Copilot Chat agent + skill):
curl -fsSL https://raw.githubusercontent.com/Korrnals/jira-tempo-mcp/main/scripts/install.sh | bash -- --uninstall
# …or from a local clone:
python install.py uninstall
# Remove ONLY the Copilot Chat agent (keep the MCP server):
python install.py --uninstall-agent
The full uninstall removes the VS Code mcp.json entry, the Copilot Chat agent + skill + knowledge doc, and optionally the .env.local Jira credentials and the pip package (it asks before removing those). The agent-only removal leaves the MCP server fully functional — use it if you installed the agent but decided you do not want it.
Docker:
# Option A — docker run with an .env file (chmod 600, gitignored):
cp .env.example .env # fill in JIRA_BASE_URL, JIRA_USER, JIRA_PAT
docker run -i --rm --env-file .env ghcr.io/korrnals/jira-tempo-mcp:0.4.0
# Option B — docker compose (uses docker-compose.yml at repo root):
docker compose up -d
docker compose logs -f jira-tempo-mcp
# drive the server via stdio:
docker compose run --rm -T jira-tempo-mcp
The image is published to ghcr for every release: ghcr.io/korrnals/jira-tempo-mcp:<version> and :latest. Pin to a version tag (e.g. :0.4.0) for reproducibility; use :latest to track the newest release.
⚠️ Warning: The install script URL works once the repository is public. Until then, clone manually and run
python install.py.
🔧 From source (development)
The interactive installer creates a venv, writes .env, registers the MCP
server in VS Code, and optionally verifies Jira connectivity:
cd jira-tempo-mcp
python install.py
Or install from source:
git clone https://github.com/Korrnals/jira-tempo-mcp.git
cd jira-tempo-mcp
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
jira-tempo-mcp serve
Or run via Docker:
docker run -i --rm \
--env-file .env \
ghcr.io/korrnals/jira-tempo-mcp:latest
Full installation paths: docs/installation.md.
⚙️ Configuration
All configuration is via environment variables. Required:
| Variable | Description |
|---|---|
JIRA_BASE_URL |
Jira base URL (no trailing slash) |
JIRA_USER |
Jira username (login) |
JIRA_PAT |
Personal Access Token — 🔑 never commit this |
Optional: JIRA_TIMEZONE, TEMPO_API_TOKEN, LOG_LEVEL, JIRA_HTTP_TIMEOUT,
and report-related vars (REPORT_*).
Full reference: docs/configuration.md.
🔌 MCP integration
The server runs over stdio and is registered in VS Code mcp.json:
{
"servers": {
"jira-tempo": {
"command": "${workspaceFolder}/.venv/bin/python",
"args": ["-m", "jira_tempo_mcp.server"],
"envFile": "/home/your-username/.config/Code/User/.env.local",
"env": {
"JIRA_BASE_URL": "https://jira.example.com",
"JIRA_USER": "your-username",
"PYTHONPATH": "${workspaceFolder}/src"
}
}
}
}
💡 Tip: Always use absolute paths for
envFile—~does not work in sandboxed environments (distrobox, snap, containers).
Full guide: docs/mcp-integration.md.
🖥️ CLI
jira-tempo-mcp # start the MCP server (default)
jira-tempo-mcp serve # start the MCP server
jira-tempo-mcp install # interactive installer
jira-tempo-mcp uninstall # reverse the installation
jira-tempo-mcp update # self-update (pip upgrade / git pull)
jira-tempo-mcp install-specialist # install the JTM agent into AI harnesses
jira-tempo-mcp --version # show version
Full reference: docs/cli.md.
🔒 Security
- 🔑 Tokens never leave the local process —
JIRA_PATis sent only to your Jira instance over HTTPS. - 🛡️ TLS verification always on, HTTP redirects disabled
(
follow_redirects=False) — prevents PAT leakage via redirect. - 👁️ Tokens masked in logs —
Config.__repr__replacesJIRA_PATwith***. - ✅ Input validation — issue keys, dates, and
output_dir(path traversal guard) are validated before any API call. - 🐳 Docker — multi-stage build, non-root user, secrets never baked in.
Full model: docs/architecture.md#security.
🛠️ Development
The canonical quality gate for this repo is the local make suite — GitHub
Actions are intentionally disabled here, so make ci is what every change
must pass before merge. It runs linting, type-checking, tests, and the build in
one command.
make ci # full quality gate — lint + typecheck + test + build
make lint # ruff
make typecheck # mypy
make test # pytest
make build # python -m build (sdist + wheel)
🤖 JTM Agent (standalone Copilot Chat agent)
This repo ships a standalone AI agent that produces Jira/Tempo worklog reports predictably by calling the jira-tempo MCP generators. It is IDE-agnostic in its knowledge, with a thin VS Code Copilot Chat wrapper for one-click report generation.
What installs where
python install.py installs the agent by default:
~/.copilot/agents/jtm-jira-tempo-reports.agent.md— the VS Code Copilot Chat agent.~/.copilot/skills/jira-tempo-reports/SKILL.md— the VS Code-specific skill (interactive picker flow).~/.copilot/skills/jira-tempo-reports/JTM_AGENT.md— the universal knowledge doc (7-type report matrix, scenarios, rules).
The wheel-installed package can re-install the specialist into this or other
harnesses (Copilot Chat, Claude Code, OpenCode — codex unsupported) at any
time, no git clone needed. claude installs skills only — VS Code
cross-scans the Claude agents dir, an extra agent file there would show a
duplicate picker entry:
jira-tempo-mcp install-specialist # all supported harnesses
jira-tempo-mcp install-specialist --remove # uninstall
Full harness table and flags: docs/cli.md.
A loud announcement block at the end of install.py confirms the install. To skip the agent: python install.py --no-agent. To remove only the agent: python install.py --uninstall-agent.
VS Code Copilot Chat (one-click)
After install, open Copilot Chat, pick the agent JTM: Jira Tempo Reports, and click 📊 Недельный отчёт (по умолчанию) for the one-click weekly report (basic + txt + current week + current user). The agent uses a graphical picker (vscode_askQuestions) for ambiguity resolution.
Other harnesses (Cursor, Claude Code, Continue, Aider) — click to expand
The universal knowledge doc JTM_AGENT.md (in copilot-integration/) is IDE-agnostic. Any MCP-capable agent reads it as context. Typical setup:
| Harness | MCP tools | Knowledge doc | Picker UI |
|---|---|---|---|
| VS Code Copilot Chat | auto-registered via install.py |
auto-installed into ~/.copilot/agents/ |
vscode_askQuestions (graphical) |
| Cursor | add jira-tempo to .cursor/mcp.json (same server entry as VS Code mcp.json) |
point Cursor rules at JTM_AGENT.md |
prose questions (no GUI picker) |
| Claude Code | add jira-tempo to ~/.claude/mcp.json |
reference JTM_AGENT.md in CLAUDE.md |
prose questions |
| Continue | add jira-tempo to ~/.continue/config.json MCP section |
reference JTM_AGENT.md in config |
prose questions |
| Aider / other MCP clients | per-client MCP config | pass JTM_AGENT.md as a context file (--read JTM_AGENT.md for Aider) |
prose questions |
The MCP server entry for non-VS Code harnesses (copy from the VS Code mcp.json the installer writes):
{
"jira-tempo": {
"command": "/path/to/your/venv/bin/python",
"args": ["-m", "jira_tempo_mcp.server"],
"env": { "PYTHONPATH": "/path/to/this/repo/src" }
}
}
Point PYTHONPATH at this repo's src/ so the package is importable. Provide JIRA_BASE_URL, JIRA_USER, JIRA_PAT via env vars or an env file per your harness.
What the agent does NOT do
- Jira write operations (create/update issues or worklogs) — read-only.
- Analytics beyond raw worklog aggregation (trends, forecasting) — out of scope.
- Custom template authoring (writing
.py/.j2template files) — out of scope.
See JTM_AGENT.md for the full 7-type report matrix, parameter semantics, and work scenarios.
🎨 Custom templates
Since v0.2.0 jira-tempo-mcp supports custom report templates. Drop a
.j2 file in a directory and it becomes selectable by name — no code change,
no restart beyond reloading the MCP server config.
Quickstart (3 steps)
-
Create the template directory:
mkdir -p ~/.config/jira-tempo-mcp/templates/
-
Add a
.j2template. Copy the ready-made example from this repo as a starting point:cp examples/templates/standup.j2 ~/.config/jira-tempo-mcp/templates/
-
Generate a report with it via the MCP tools:
list_report_templates— see available templates (builtin + custom, with typeJinja2/Python).generate_weekly_report(template="standup")— generate with the chosen template.
Preview before generating
The preview_report_template tool renders a template on built-in mock
worklogs — no Jira/Tempo call, no file written. Three sample-data profiles
are available:
sample_data |
What it shows |
|---|---|
default |
Several realistic worklogs with varied times (default) |
minimal |
A single worklog |
empty |
No worklogs — tests empty-state rendering |
preview_report_template(template_name="standup", sample_data="default")
Where templates live & engine details
Template directories per OS:
| OS | Default path |
|---|---|
| Linux | ~/.config/jira-tempo-mcp/templates/ |
| macOS | ~/Library/Application Support/jira-tempo-mcp/templates/ |
| Windows | %APPDATA%\jira-tempo-mcp\templates\ |
Two engines are supported:
- Jinja2 (
.j2) — recommended. Runs in aSandboxedEnvironment(safe: unsafe constructs like{{ config.__class__ }}are blocked). - Python (
.py) — opt-in only viaREPORT_TEMPLATE_ALLOW_PY=1. Runs arbitrary code — load only trusted files.
📖 Full author reference (context variables, worklog fields, Jinja2 filters, Python protocol, security model): docs/templates.md. For builtin template examples and the rendered-output gallery, see docs/reports.md.
License
MIT
🛠 CI / Релизы — кластерный конвейер release-pipeline
Этот проект подключён к общему кластерному конвейеру релизов
(Korrnals/release-pipeline,
K3s abyss-ai-agent, namespace release-pipeline). GitHub Actions не
используется (биллинг аккаунта заблокирован) — конвейер и есть штатный путь
релизов. Релизный артефакт подписывается трёхслойно: SHA256 → SBOM → cosign → GPG.
Релиз новой версии:
VERSION→ релизный коммит (конвенция репо) → тегvX.Y.Z→ push.- Обновить версию проекта в
projects[]файла~/.cache/release-pipeline-values.yamlи применить:helm upgrade --install release-pipeline \ ~/LABs/Projects/Project-Umbra/release-pipeline/chart/release-pipeline \ --kube-context abyss-ai-agent -n release-pipeline \ -f ~/.cache/release-pipeline-values.yaml
- Наблюдение:
kubectl --context abyss-ai-agent -n release-pipeline get jobs, логи:kubectl ... logs -f job/release-<proj>-<ver>.
Подробности (типы проектов, kaniko-контейнеры, teardown): README конвейера.
Metadata
Release files for jira-tempo-mcp 0.6.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jira_tempo_mcp-0.6.2.tar.gz | 258.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jira_tempo_mcp-0.6.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 366.0 kB
Release files / jira_tempo_mcp-0.6.2.tar.gz
| Download URL | jira_tempo_mcp-0.6.2.tar.gz |
|---|---|
| Size | 258.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b15778351f2bf11ecaf29090bac9b92dcfd7e822a15dca3b9faf69f0f0a0e80e
|
|
BLAKE2b-256 checksum How to use checksums |
f9bed527e28fc866e13f831b3466b2f1314e391b7dd6da4ec4c8cdee2b2c6f9a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / jira_tempo_mcp-0.6.2-py3-none-any.whl
| Download URL | jira_tempo_mcp-0.6.2-py3-none-any.whl |
|---|---|
| Size | 107.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f4ce67f486ebf2e699c797e249160f87af556a3e655fe1806afe5770b4fd02c0
|
|
BLAKE2b-256 checksum How to use checksums |
ff7a213f4ee4c58c2b92174f04dd3f20708e4a0e0b84e5cf6b4857ca039b026c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|