Skip to main content
Glama

tempo-mcp

MCP server that lets Claude log, list, and delete Tempo worklogs against Jira issues.

Setup

  1. npm install && npm run build

  2. Copy .env.example to .env and 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.net

    • JIRA_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.js

Or 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 by issueKey, authorAccountId, and date range (from/to).

  • post_worklog — log time against an issue (issueKey, timeSpentHours or timeSpentSeconds, startDate, authorAccountId, optional startTime/description). Defaults to a dry-run preview; pass confirm: true to actually write it.

  • update_worklog — change an existing worklog's time/date/description by tempoWorklogId. Same dry-run/confirm: true behavior.

  • delete_worklog — delete a worklog by tempoWorklogId. Same dry-run/confirm: true behavior (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

  • authorAccountId is allowlisted, not free-form. post_worklog will only attribute a worklog to the credentialed account (from JIRA_EMAIL/whoami) unless AUTHORIZED_AUTHOR_ACCOUNT_IDS in .env explicitly 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, and delete_worklog all preview what they would do and require an explicit confirm: true to 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_worklog call (success or failure) is appended as a JSON line to logs/audit.jsonl (gitignored) — a local record of what was written, independent of Tempo's own history.

  • Keep .env file permissions restricted, especially on a shared machine — it holds both the Tempo API token and Jira Basic-auth credentials in plaintext.

Available Tools

3 tools
delete_worklogA

Delete a Tempo worklog by its Tempo worklog ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
tempoWorklogIdYesThe Tempo worklog ID to delete

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date (YYYY-MM-DD), inclusive
fromNoStart date (YYYY-MM-DD), inclusive
limitNo
issueKeyNoJira issue key to filter by, e.g. PROJ-1234
authorAccountIdNoJira account ID of the worklog author to filter by

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
issueKeyYesJira issue key to log time against, e.g. PROJ-1234
startDateYesDate the work was done, YYYY-MM-DD
startTimeNoTime of day work started, HH:MM:SS (defaults to 09:00:00)
descriptionNoDescription of the work performed
authorAccountIdYesJira account ID of the person the time is logged on behalf of
timeSpentSecondsYesTime spent, in seconds (e.g. 3600 for 1 hour)

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 3 tool updatesv0.1.0
    • First observeddelete_worklog
    • First observedget_worklogs
    • First observedpost_worklog

TDQS

A3.7/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a distinct operation on worklogs: create (post), read (get), and delete. There is no overlap or ambiguity between them.

Naming Consistency5/5

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.

Tool Count5/5

Three tools is a well-scoped set for a focused worklog integration. Each tool covers an essential action without unnecessary bloat.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Connects Jira with Claude, enabling users to search issues, view issue details, update issues, add comments, and retrieve project information through natural language commands.
    1
    43 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants like Claude to interact with Jira for project management tasks, including issue creation, updates, workflow transitions, and bulk operations.
    19 npm
    4
    MIT