LABSCO SUMMARY
The timesheet you forgot turns into a list of specific days and issues.
getMissingWorklogDays is the reason to install this rather than call the Tempo API directly: it reads the user-schedule, drops holidays and non-working days, and returns the shortfall per day with a per-issue breakdown for the days that are partly filled — the part a raw worklog export never gives you. Using it across a team is a permissions question rather than a tooling one, since the user, program and team filters all depend on what the token owner's Permission Role allows. Bulk exists only on creation: edits and deletions are one worklog ID at a time.
What it is
A server over the Tempo worklog API with Jira alongside it — worklogs retrieved, created, edited and deleted, plus schedule-aware gap detection and grouped analytics.
What you get
- Worklogs for a date range, defaulting to the token owner's own and widening to other people through user, program or team filters that combine as a union
- Entries written one at a time or as an array in a single bulk call, then edited or deleted by worklog ID
- getMissingWorklogDays, which compares logged hours against the expected hours in the Tempo user-schedule, skips holidays and non-working days, and returns expected against logged with a per-issue breakdown for partially logged days
- getWorklogAnalytics, grouping hours, worklog count and percentage by issue, account, user, day, ISO 8601 week or month, sorted by hours
Requirements
TEMPO_API_TOKEN, JIRA_API_TOKEN, JIRA_EMAIL and JIRA_BASE_URL. Reading anyone else's worklogs needs a Tempo Permission Role carrying 'View Worklogs'; getMissingWorklogDays additionally needs the 'Schemes' scope on the Tempo token. MIT.
Setup effort
One command plus a key — npx -y @ivelin-web/tempo-mcp-server, then supply credentials
USE CASES
Filling in last week's missing hours
Ask which days fall short of the schedule and by how much, read the per-issue breakdown for the partial ones, then write the whole correction as a single bulk call rather than a dozen separate entries.
Answering where the sprint's hours went
Group the period's worklogs by issue to see what consumed it, then regroup by user or by week to see who and when. Percentages come back with the hours, so the split is readable without a spreadsheet.
Correcting time booked to the wrong issue
Find the entry in the range, fix its description, date or duration in place, or delete it and write it again against the right issue key.
7 tools
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
createWorklog
deleteWorklog
editWorklog
getMissingWorklogDays
Find working days in a date range where the user's logged time is below the expected hours from their Tempo user-schedule. Holidays and non-working days are skipped automatically. Returns days with their expected vs logged hours, plus a per-issue breakdown for partially-logged days. Requires the 'Schemes' scope on the Tempo API token (in addition to 'Worklogs'). Pass 'users' / 'program' / 'team' to check other people instead — returns a per-user report (requires permission to view their worklogs and schedules).
getWorklogAnalytics
Aggregate worklogs in a date range and return hours, worklog count, and percentage per group, sorted by hours descending. groupBy options: 'issue' (default), 'account', 'user', 'day', 'week' (ISO 8601), 'month'. Pass 'users' / 'program' / 'team' to analyze other people's worklogs (e.g. groupBy 'user' + program gives a per-person report for the whole program; requires 'View Worklogs' permission). Note: 'account' grouping reads the _Account_ work attribute on each worklog — worklogs without an account attribute are bucketed as 'No account', so this grouping is only meaningful if your team uses Tempo accounts.
retrieveWorklogs
Retrieve Tempo worklogs in a date range. Defaults to the authenticated user's own worklogs. Optional filters fetch other users' worklogs instead: 'users' (emails, display names, or accountIds), 'program' / 'team' (all current members of the Tempo program/team; name or id). Filters combine as a union. Viewing others requires the Tempo token owner to have a Permission Role with 'View Worklogs' plus Jira 'Browse Projects' — otherwise Tempo silently returns only permitted worklogs.
BEFORE YOU INSTALL
What to know first
Tools you get
7 tools when we connected. On ChatGPT, Plus and Pro accounts can only read; the write tools (create/edit worklogs) require a Business tier or higher.
Requires
- npx on PATH
- Node.js 18+
- TEMPO_API_TOKEN in your environment
- JIRA_API_TOKEN in your environment
- JIRA_EMAIL in your environment
- JIRA_BASE_URL in your environment
CONTEXT COST
Light Standing cost
Rated by the size of the 7 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
Connect your client
Server setup
npx -y @ivelin-web/tempo-mcp-serverMCP Clients
Claude Desktop, Cursor
{
"mcpServers": {
"Jira_Tempo": {
"command": "npx",
"args": [
"-y",
"@ivelin-web/tempo-mcp-server"
],
"env": {
"TEMPO_API_TOKEN": "<YOUR_TEMPO_API_TOKEN>",
"JIRA_API_TOKEN": "<YOUR_JIRA_API_TOKEN>",
"JIRA_EMAIL": "<YOUR_JIRA_EMAIL>",
"JIRA_BASE_URL": "https://<YOUR_ORG>.atlassian.net"
}
}
}
}Claude.ai
This route needs a deployment of the server on Cloudflare Workers. If your team has none yet, deploy one; a free Cloudflare account and Node.js 18+ with npm are enough, and the README's Remote deployment section has the full guide:
git clone https://github.com/ivelin-web/tempo-mcp-server.git
cd tempo-mcp-server
npm install
npx wrangler login
npx wrangler kv namespace create USERSPut the id that last command returns into kv_namespaces[0].id in wrangler.jsonc (the committed id belongs to the upstream maintainer's Cloudflare account), then store the encryption key and deploy:
openssl rand -base64 48 | npx wrangler secret put ENCRYPTION_KEY
npm run remote:deployOpen /setup on the workers.dev address the deploy printed, paste your Tempo API token, Jira base URL, Jira API token and Jira email, and hit Generate MCP URL
In Claude.ai → Settings → Connectors → Add custom connector, paste the personal URL it returned. The URL contains your credentials: treat it like a password
ChatGPT
With the personal URL from your team's deployment (see the Claude.ai tab): Settings → Apps → Advanced → Developer mode, add it as a custom MCP server (write tools need Business+)