tempo-mcp
This server lets Claude manage Tempo worklogs in Jira via MCP tools.
Worklogs:
get_worklogslists worklogs filtered by issue key, author account ID, and date range;post_workloglogs time against an issue;update_worklogedits an existing worklog;delete_worklogremoves a worklog by Tempo ID.Safe writes:
post_worklog,update_worklog, anddelete_worklogpreview as dry-runs and only execute withconfirm: true.Lookups:
whoamireturns the credentialed Jira account;search_projectslists/filters projects;search_recent_issuesfinds issues by project, assignee, or text.Safety controls: author account IDs are allowlisted, writes are capped per session, and an audit log is kept locally.
Allows logging, listing, and deleting Tempo worklogs against Jira issues, with automatic resolution of issue keys to Jira issue IDs.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tempo-mcpLog 2 hours to PROJ-1234 for yesterday's sprint planning"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tempo-mcp
MCP server that lets Claude log, list, and delete Tempo worklogs against Jira issues.
Setup
npm install && npm run buildCopy
.env.exampleto.envand fill in:TEMPO_API_TOKEN— generated in Jira under Tempo → Settings → API Integration, scoped to Manage Worklogs.JIRA_BASE_URL— e.g.https://your-domain.atlassian.netJIRA_EMAIL/JIRA_API_TOKEN— used to resolve issue keys (e.g.PROJ-1234) to the numeric issue IDs Tempo requires. Generate the token at https://id.atlassian.com/manage-profile/security/api-tokens.
Related MCP server: JIRA MCP Server
Register with Claude Code
claude mcp add tempo-mcp -- node /path/to/tempo-mcp/dist/index.jsOr via .mcp.json, with the env vars above set in the entry's env block.
The server validates both Tempo and Jira credentials on startup and logs a clear pass/fail message to stderr (visible in Claude Code's MCP logs) before it accepts tool calls, rather than failing confusingly on first use.
Tools
Worklogs
get_worklogs— list worklogs, optionally filtered byissueKey,authorAccountId, and date range (from/to).post_worklog— log time against an issue (issueKey,timeSpentHoursortimeSpentSeconds,startDate,authorAccountId, optionalstartTime/description). Defaults to a dry-run preview; passconfirm: trueto actually write it.update_worklog— change an existing worklog's time/date/description bytempoWorklogId. Same dry-run/confirm: truebehavior.delete_worklog— delete a worklog bytempoWorklogId. Same dry-run/confirm: truebehavior (previews the real worklog before deleting it).
Lookups (so Claude doesn't need issue IDs or account IDs handed to it up front)
whoami— the Jira account the configured credentials belong to.search_projects— list/filter visible Jira projects.search_recent_issues— find issues by project, assignee, and/or free text, most recently updated first.
post_worklog requires an authorAccountId. Get your own via whoami; for others, use their Jira admin console profile URL, which shows their accountId. (An earlier find_users tool was removed — it depended on the "Browse users and groups" global permission, which returned an empty result with HTTP 200 rather than an error when missing, confirmed via direct API testing against this org's Jira instance.)
Issue keys are resolved to Tempo's required numeric issue ID automatically (and cached in-process) via the Jira REST API. Auth failures return a plain-English hint (e.g. "check JIRA_EMAIL/JIRA_API_TOKEN/JIRA_BASE_URL") instead of a raw, sometimes localized, HTTP error body.
Safety and abuse controls
authorAccountIdis allowlisted, not free-form.post_worklogwill only attribute a worklog to the credentialed account (fromJIRA_EMAIL/whoami) unlessAUTHORIZED_AUTHOR_ACCOUNT_IDSin.envexplicitly lists other account IDs. This exists specifically so that content Claude reads from a Jira issue or Tempo worklog description can't talk it into logging fabricated time against an arbitrary third party — the allowlist is controlled by you, in.env, not by anything the model reads.Every write is dry-run by default.
post_worklog,update_worklog, anddelete_worklogall preview what they would do and require an explicitconfirm: trueto actually execute.MAX_WRITES_PER_SESSION(default 20) caps how many writes a single running server process will perform before refusing further ones, as a blast-radius limit against a runaway or manipulated conversation. Restart the server to reset the count.Local audit log. Every
post_worklog/update_worklog/delete_worklogcall (success or failure) is appended as a JSON line tologs/audit.jsonl(gitignored) — a local record of what was written, independent of Tempo's own history.Keep
.envfile permissions restricted, especially on a shared machine — it holds both the Tempo API token and Jira Basic-auth credentials in plaintext.
Available Tools
3 toolsdelete_worklogA
Delete a Tempo worklog by its Tempo worklog ID.
| Name | Required | Description | Default |
|---|---|---|---|
| tempoWorklogId | Yes | The Tempo worklog ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It identifies that the tool deletes a record, but does not state that deletion is permanent or irreversible, what permissions are required, or whether the operation fails if the ID does not exist. For a destructive operation this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. It states the action, target, and key identifier efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one well-documented parameter and no output schema, so extensive detail is not required. However, the absence of usage guidance and any warning about the destructive nature of the operation leaves the overall description only marginally complete for an agent deciding whether and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter description already explains that tempoWorklogId is the ID to delete. The tool description adds nothing beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Delete') and a specific resource ('a Tempo worklog'), keyed by the Tempo worklog ID. It clearly distinguishes itself from the sibling tools get_worklogs and post_worklog by naming the destructive operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case—deleting a specific existing Tempo worklog—but provides no explicit guidance on when to choose this tool over alternatives, nor any mention of prerequisites like needing the worklog ID from get_worklogs. It is minimally adequate but leaves this to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_worklogsA
Fetch Tempo worklogs, optionally filtered by Jira issue key, author account ID, and/or date range.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (YYYY-MM-DD), inclusive | |
| from | No | Start date (YYYY-MM-DD), inclusive | |
| limit | No | ||
| issueKey | No | Jira issue key to filter by, e.g. PROJ-1234 | |
| authorAccountId | No | Jira account ID of the worklog author to filter by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. 'Fetch' clearly indicates a non-mutating read operation, but the description does not disclose additional behavioral details such as response format, defaults, pagination, or any prerequisites. It is minimal but not misleading.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence that front-loads the primary action and resource before naming the optional filters. Every word is informative, and there is no redundant or vague phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five optional parameters, no annotations, and no output schema, the description is adequate for tool selection but leaves operational details like return value shape, limit handling, and date-range constraints mostly to the schema. It is complete enough for a simple read tool, but not richly contextual.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so most parameters already have detailed schema documentation. The description adds a useful high-level grouping of parameters into filters (issue key, author, date range) but does not add significant parameter-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') with a concrete resource ('Tempo worklogs') and explicitly lists the optional filter dimensions (issue key, author account ID, date range). This makes the tool's purpose immediately clear and distinguishes it from the sibling post/delete operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving worklogs, but it does not explicitly state when to use this tool versus alternatives like post_worklog or delete_worklog. There is no mention of exclusions or conditions, though the sibling names make the distinction somewhat obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_worklogB
Log time in Tempo against a Jira issue on behalf of a given Jira account.
| Name | Required | Description | Default |
|---|---|---|---|
| issueKey | Yes | Jira issue key to log time against, e.g. PROJ-1234 | |
| startDate | Yes | Date the work was done, YYYY-MM-DD | |
| startTime | No | Time of day work started, HH:MM:SS (defaults to 09:00:00) | |
| description | No | Description of the work performed | |
| authorAccountId | Yes | Jira account ID of the person the time is logged on behalf of | |
| timeSpentSeconds | Yes | Time spent, in seconds (e.g. 3600 for 1 hour) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action but does not describe side effects, permissions required, idempotency, possible failures, or what happens after logging. The 'on behalf of' phrasing is helpful but is also already reflected in the 'authorAccountId' parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no filler. It front-loads the action and resource, and every phrase contributes meaningful context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, 4 required, no output schema, and no annotations, this single-sentence description is too thin. It does not indicate that it creates a new worklog, any required Tempo/Jira permissions, or what a successful response looks like. An agent would need to infer important operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds essentially no parameter-level detail, but the input schema has 100% parameter description coverage, including examples and defaults. The description does not need to repeat that information, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('log time'), a specific target ('a Jira issue'), and a distinctive scope ('on behalf of a given Jira account'). This clearly differentiates it from the sibling tools 'get_worklogs' and 'delete_worklog'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool instead of 'get_worklogs' or 'delete_worklog'. The verb 'log' implies creation, but there is no explicit context, prerequisites, or exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
delete_worklog - First observed
get_worklogs - First observed
post_worklog
TDQS
Scored across 3 tools
Each tool targets a distinct operation on worklogs: create (post), read (get), and delete. There is no overlap or ambiguity between them.
All tool names follow the verb_noun pattern with clear verbs (post, get, delete) and the same noun base (worklog(s)). The plural in get_worklogs is semantically appropriate for fetching multiple records.
Three tools is a well-scoped set for a focused worklog integration. Each tool covers an essential action without unnecessary bloat.
The set covers create, read, and delete but lacks an update operation, which is a notable gap for worklog management. Agents must work around this by deleting and recreating worklogs, which is not always desirable.
Maintenance
Related MCP Connectors
Connect to Atlassian Jira, Confluence, Loom, and more to search, create, and manage your work.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
Related MCP Servers
- AlicenseCqualityDmaintenanceConnects Jira with Claude, enabling users to search issues, view issue details, update issues, add comments, and retrieve project information through natural language commands.143 npm1MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude AI to interact with JIRA for project management and issue tracking, supporting JQL queries, comprehensive issue details retrieval with subtasks and linked issues, and release planning analysis.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants like Claude to interact with Jira for project management tasks, including issue creation, updates, workflow transitions, and bulk operations.19 npm4MIT
- FlicenseBqualityDmaintenanceConnects Claude to Jira, allowing users to query tasks, log work, add comments, and execute JQL queries through conversational AI.22-