Tempo Timesheet MCP Server
This MCP server gives coding agents safe, read-first access to Tempo Timesheets and Jira Cloud, with triple-gated worklog writes.
Query Tempo worklogs in an inclusive date range, scoped to your account by default.
Fetch a single Tempo worklog by ID.
Generate weekly (Monday–Sunday) summaries aggregated by day and issue from recorded worklogs only.
Search Jira issues via JQL or project/text filters.
Validate proposed worklogs and check for duplicate entries with confidence levels.
Preview worklog creates/updates without writing, returning an approval token when valid.
Create or update worklogs only when
WORKLOG_WRITE_ENABLED=true, a single-use approval token, andconfirm: trueare all present.Report uncertain write outcomes without retrying, and never expose worklog deletion.
Authenticates against Atlassian Cloud (Jira REST API v3) using an Atlassian account email and API token to look up issue keys for Tempo worklogs and enrich timesheet summaries.
Searches Jira Cloud issues via JQL using the enhanced search API, and resolves Tempo's numeric issue ids to human-readable issue keys; also used to supply issue keys when logging worklogs.
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 Timesheet MCP Serversummarize my Tempo worklogs for this week by day and issue"
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 Timesheet MCP Server
A local MCP server (stdio) that gives coding agents such as OpenCode or Claude Code safe, read-first access to Tempo Timesheets (REST API v4) and Jira Cloud (REST API v3): summarize logged work, detect duplicates, and — only through an explicit preview → approval → write pipeline — create or update worklogs.
Read-only by default. Writes are triple-gated:
WORKLOG_WRITE_ENABLED=trueand a single-use payload-bound approval token andconfirm: true. There is no delete tool.
How it works
┌─────────────────────┐ MCP over stdio ┌──────────────────────┐ REST API v4 ┌────────────────────┐
│ Coding agent │◄───────────────────►│ s-tempo-worklog-mcp │ ───────────────►│ Tempo Timesheets │
│ (OpenCode, Claude │ 9 tools (JSON) │ (this MCP server) │ │ (v4) │
│ Code, any client) │ │ validate · approve │ ───────────────►├────────────────────┤
└─────────────────────┘ │ write │ REST API v3 │ Jira Cloud │
▲ └──────────┬───────────┘ │ (v3) │
│ /tempo-today /tempo-week /tempo-log │ └────────────────────┘
│ (OpenCode slash commands) │ all credentials stay local
└──────────────────────────────────────────────┘ (env vars / .env)You (or your agent) issue commands in the CLI — natural language or the bundled slash commands.
The agent calls this MCP server over stdio; the server owns validation, duplicate detection, and the approval pipeline.
The server talks only to the Tempo v4 and (optionally) Jira v3 REST APIs. Credentials never leave your machine; the server is stdio-only.
The write pipeline (triple-gated)
preview ──► user approval ──► write (confirm + single-use token) ──► verifytempo_preview_worklogvalidates the proposal, runs duplicate detection, and issues an approval token bound to the SHA-256 of the payload.You review and approve. Any change to the payload invalidates the token.
The write tool requires
WORKLOG_WRITE_ENABLED=true, the token, and an explicitconfirm: true. Tokens are single-use — a replayed approval cannot create a second identical worklog. Timed-out writes returnUNCERTAIN_OUTCOMEand are never retried by the server.
Related MCP server: 7Pace-Connector
Tools (9)
Tool | Kind | Description |
| read | Worklogs in a date range; scoped to your own account by default |
| read | One worklog by id |
| read | Week (Mon–Sun) aggregated by day and issue |
| read | Jira search via JQL (enhanced search API) |
| preview | Validate + duplicate-check a create/update; returns an approval token. Never writes |
| preview | Validate a proposal without issuing a token |
| preview | Confidence-scored duplicate check for a candidate entry |
| write (gated) | Create a worklog; needs token + |
| write (gated) | Update a worklog; needs token + |
The write flow is: preview → show the user → explicit approval → write with
the same exact payload. The approval token is bound to the SHA-256 of the
payload (identified by numeric issueId), expires in 15 minutes, is consumed
by a successful write, and is invalidated by any change. Writes that time out
return UNCERTAIN_OUTCOME and are never retried by the server.
Install
Run directly with npx (no installation):
npx -y s-tempo-worklog-mcpOr install globally:
npm install -g s-tempo-worklog-mcp
tempo-worklog-mcpThe server reads configuration from environment variables. Create a .env
file next to where you run it, or set them in your MCP client config.
Variable | Default | Description |
| — (required) | Tempo API token |
| auto-detected | Your Tempo accountId; auto-detected from an existing worklog when absent |
|
| Tempo v4 base URL |
| — (optional) |
|
| — (optional) | Atlassian account email |
| — (optional) | Atlassian API token |
| system TZ | IANA name, e.g. |
|
|
|
|
| Master switch for write tools |
Jira is optional but recommended: Tempo v4 returns only numeric issue ids, so
without Jira the tools cannot display issue keys. All three JIRA_* variables
must be set together. See .env.example for a ready-made template.
Quick start (from source)
git clone https://github.com/nbhson/tool-logwork-mcp
cd tool-logwork-mcp
npm install
npm run build
cp .env.example .env # then fill in TEMPO_API_TOKEN (+ Jira if desired)
node dist/index.jsFull setup for OpenCode (MCP registration, skill, commands, troubleshooting): docs/setup-opencode.md.
Registering with MCP clients
The server speaks MCP over stdio. Generic pattern — run
npx -y s-tempo-worklog-mcp as the command and pass environment variables:
OpenCode (~/.config/opencode/opencode.json or project opencode.json):
{
"mcp": {
"tempo-worklog": {
"type": "local",
"command": ["npx", "-y", "s-tempo-worklog-mcp"],
"environment": {
"TEMPO_API_TOKEN": "your-tempo-token",
"JIRA_BASE_URL": "https://your-site.atlassian.net",
"JIRA_EMAIL": "you@example.com",
"JIRA_API_TOKEN": "your-jira-token"
}
}
}
}Claude Code:
claude mcp add tempo-worklog \
-e TEMPO_API_TOKEN=your-tempo-token \
-- npx -y s-tempo-worklog-mcpOpenCode skill & slash commands
This repository ships an agent skill and four slash commands (.opencode/).
After installing from npm, copy them into your project:
# OpenCode loads skills/commands from your project's .opencode/ directory
mkdir -p .opencode/skills
cp -r node_modules/s-tempo-worklog-mcp/.opencode/skills/tempo-timesheet .opencode/skills/
cp -r node_modules/s-tempo-worklog-mcp/.opencode/commands ./This gives you:
.opencode/skills/tempo-timesheet/SKILL.md— tool catalog + hard rules (preview-before-write, never retry uncertain writes, recorded-data-only summaries)..opencode/commands/tempo-today.md—/tempo-todaydaily summary with an aligned terminal report..opencode/commands/tempo-week.md—/tempo-weekweekly timesheet with per-day and per-issue breakdowns..opencode/commands/tempo-log.md—/tempo-log ABC-123 2h30m ...with the preview card and approval ritual baked in. Accepts a single entry or a batch of entries, inline or pasted from txt/md/csv/freeform text..opencode/commands/tempo-log-rewrite.md—/tempo-log-rewriteworks like/tempo-logbut first rewrites each description into a professional, concise work-log entry while strictly preserving its meaning. Both the original and the rewritten description are shown in the preview for verification; approval and the write pipeline are unchanged.
Details: docs/setup-opencode.md.
Safety model
Read-first. Every read tool is safe to call; nothing writes unless you go through the pipeline.
Triple-gated writes.
WORKLOG_WRITE_ENABLED=true+ preview approval token +confirm: true. The token binds to the SHA-256 of the exact payload (identified by numericissueId, so a Jira hiccup between preview and write cannot invalidate a valid approval), expires in 15 minutes, and is consumed on success — no replay, no duplicates from retries.Uncertain outcomes are reported, never retried. A timed-out write returns
UNCERTAIN_OUTCOME; the server never auto-retries a write.Honest scoping. Read tools scope results to your own account by default and say so; totals never silently mix in other users' worklogs.
No delete. Tempo delete is intentionally not exposed.
Recorded data only. Summaries count recorded worklogs only — no invented hours, no assumed work.
Troubleshooting
Every tool error envelope carries a stable machine-readable code and, for
common operational failures, an actionable hint field. The most common ones:
Error code | Meaning & what to do |
| Token missing/expired/revoked. Generate a fresh token (Tempo: Settings → API Integration; Jira: id.atlassian.com → Security → API tokens), update the env var, restart the server. |
| Token valid but lacks scope/visibility (Tempo needs the Worklogs scope; check Jira project access). |
| Writes are off by default. Set |
| Token expired (>15 min), consumed, or the payload changed. Call |
| The write MAY have landed. Verify with |
| Check connectivity/VPN/proxy ( |
| Configuration incomplete — compare with |
| Wait for the suggested interval, then retry; narrow the date range or lower |
More environment-specific symptoms (Jira partial config, auto-detection on a fresh account, timezone off-by-one): docs/setup-opencode.md.
Development
npm run typecheck # strict typecheck of src
npm run typecheck:test # typecheck of src + tests
npm run lint # eslint (src + tests)
npm run format # prettier
npm test # vitest (unit + integration, mocked HTTP)
npm run build # tsc -> dist/
npm start # run the stdio serverTest suite: 143 tests, all passing (unit: config, context helpers, date —
including timezone/week-boundary cases, duration, logger/error hints, approval,
report, duplicate, TTL cache; integration: Tempo client, Jira client, worklog
service, weekly-summary timezone regression (UTC/+7/+9/+10/−10, Sunday vs
Monday week anchoring, mocked clock), and the full MCP tool handler surface;
protocol-level: a real MCP Client over an InMemoryTransport pair exercises
initialize, tools/list (all 9 tools + JSON Schemas), and tool-call envelopes
end-to-end). HTTP is fully mocked — no credentials or network needed.
Coverage (v8): ~89% statements, ~78% branches, ~92% lines
(npm run test:coverage). npm publish runs the full gate automatically via
prepublishOnly.
Documentation
docs/architecture.md — layers, request flows, error model
docs/api-contract.md — verified endpoints + unverified assumptions
docs/security.md — credential handling, write-safety model
docs/workflows.md — agent workflows (daily/weekly/logging/update)
docs/setup-opencode.md — OpenCode registration + troubleshooting
docs/backlog.md — evaluated-but-deferred features (bulk edit, weekly template)
The Vietnamese design documents in
docs/design/ (architecture.md, security.md, skills.md,
structure.md, tools.md, workflow.md) are the original design briefs this
implementation follows; the docs/ files above describe the implementation
as built.
Known limitations
No delete. Tempo delete is intentionally not exposed in this MVP.
Update identifier risk. Tempo docs disagree on
issueKeyvsissueIdforPUT /worklogs/{id}; this server sendsissueId(docs/api-contract.md).Single user focus. Read tools default to your own account (pass
authorAccountIdto inspect another user); admin-style logging for others is out of scope.Approval state is in memory. Restarting the server invalidates pending approval tokens (by design — re-preview is cheap and safe).
No Overtime/Capacity/accounts endpoints. Worklogs and issue search only.
Caller identity needs one worklog. Auto-detecting your account reads the author of your most recent worklog; on a brand-new account with zero worklogs, set
TEMPO_ACCOUNT_IDexplicitly.
What's new in 0.4.0
Fixed auto-detection of the Tempo account id (it previously read the wrong endpoint and could send a wrong
authorAccountIdon create).Read tools now scope to your own account by default, so totals never silently include other users' worklogs; pass
authorAccountIdto override.Approval tokens are single-use — no replay/duplicate window after a successful write (still reusable when a write fails cleanly).
Approvals are bound by numeric
issueId, so a Jira hiccup between preview and write no longer invalidates a valid approval.Updating a worklog no longer fails when its existing duration is not a whole number of minutes (e.g. timer-derived
89m30s).Pagination: results are never returned beyond
maxResults, and exhausted pagination now fails loudly instead of silently truncating.Cleaner validation errors for malformed create previews (no crash on missing description);
tempo_update_worklognow returns the structuredWRITE_DISABLEDerror code liketempo_create_worklog.
Available Tools
9 toolsjira_search_issuesSearch Jira issuesA
Search Jira issues. Provide either a jql string, or projectKey and/or text (combined with AND). Read-only; requires JIRA_BASE_URL, JIRA_EMAIL and JIRA_API_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
| jql | No | ||
| text | No | ||
| maxResults | No | ||
| projectKey | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does real work by declaring 'Read-only' and listing the required JIRA_BASE_URL, JIRA_EMAIL and JIRA_API_TOKEN environment variables. However it says nothing about result ordering, pagination, or the behavior when all four optional parameters are omitted, which an agent needs to invoke safely.
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?
Two short sentences, front-loaded with the purpose, then the query-construction rule, then the safety/auth note. No filler; the only minor compression cost is that 'combined with AND' is terse enough to be slightly ambiguous.
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?
Four parameters with zero required fields, no annotations and no output schema means the description should carry most of the burden. It covers query construction and auth prerequisites but leaves maxResults, defaults, and the zero-argument case unexplained, so an agent could still call it incorrectly.
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 0%, so the description must compensate, and it does explain jql, projectKey and text and their AND combination. It omits maxResults entirely (no mention of paging or the 1-100 range) and does not clarify mutual exclusivity versus precedence between jql and the structured filters.
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?
States a specific verb+resource ('Search Jira issues'), which is immediately distinguishable from the tempo_* worklog siblings. It does not explicitly name an alternative or exclusion, but the domain difference is obvious from the name and title.
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?
'Provide either a jql string, or projectKey and/or text (combined with AND)' gives a concrete rule for how to drive the tool and implies the two query modes are alternatives. It stops short of stating precedence when both jql and projectKey are supplied, or what happens when no argument is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_check_duplicateCheck for duplicate worklogsA
Compare a proposed worklog against existing Tempo worklogs for the same issue and date. Returns possible matches with confidence (high/medium/low) and reasons. Heuristic only — it cannot guarantee uniqueness. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| issueKey | Yes | ||
| description | No | ||
| durationMinutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, and it discloses key traits: read-only, heuristic-only (cannot guarantee uniqueness), and the confidence/reason output shape. This is solid disclosure, though it doesn't explain what signal drives confidence levels.
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?
Three tight sentences, each earning its place: purpose, return shape, and limitation. Front-loaded and zero waste.
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 no output schema, the description steps up by describing return values (matches with confidence and reasons) and the heuristic limitation. It falls short only on explaining parameter roles for a 4-param tool.
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 coverage is 0%, so the description must compensate, but it only vaguely references 'the same issue and date' and 'proposed worklog.' It never explains description or durationMinutes or how these affect matching, leaving half the parameters undocumented.
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?
Specific verb and resource: 'Compare a proposed worklog against existing Tempo worklogs for the same issue and date.' An agent can distinguish it from creation tools, though it doesn't explicitly contrast with tempo_validate_worklog or tempo_preview_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?
Usage is implied (check before creating to avoid duplicates), but there is no explicit when-to-use guidance or named alternative among the many worklog siblings. The heuristic caveat hints at when it's appropriate without stating it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_create_worklogCreate a Tempo worklog (write, gated)A
Create a Tempo worklog after explicit user approval. Requires: writes enabled (WORKLOG_WRITE_ENABLED=true), confirm=true, and an approvalToken obtained from tempo_preview_worklog for the EXACT same proposal. Refuses to run without all three. Verifies the created worklog afterwards and reports uncertain outcomes instead of retrying.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| confirm | Yes | ||
| issueKey | Yes | ||
| startTime | No | ||
| description | Yes | ||
| approvalToken | Yes | ||
| durationMinutes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the write gating (env flag + confirm + token), post-write verification, and non-retry behavior on uncertain outcomes. It stops short of describing the response shape, error semantics, or permission scopes beyond the feature flag.
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?
Four tight sentences: purpose first, then hard prerequisites, then failure behavior. No restatement of the title and no filler; the gating conditions are front-loaded where an agent will read them.
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?
For a mutation tool with no annotations and no output schema, the definition covers the safety model and failure handling that matter most. The remaining gap is parameter meaning for five required/optional fields, which nothing else in the definition supplies.
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 0%, so the description must compensate for all 7 parameters. It adds real meaning for two of them (confirm must be true; approvalToken must come from tempo_preview_worklog for the identical proposal), but issueKey, date, durationMinutes, description, and startTime are left entirely to the JSON Schema patterns and bounds.
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?
States a specific verb and resource ('Create a Tempo worklog') and immediately differentiates itself from write-adjacent siblings by requiring an approvalToken from tempo_preview_worklog. An agent can distinguish this from tempo_update_worklog or tempo_preview_worklog without opening any schema.
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?
Explicitly names the preconditions for use: user approval, WORKLOG_WRITE_ENABLED=true, confirm=true, and an approvalToken for the exact same proposal. It also states the tool refuses to run without all three, which is a clear when-not-to-call signal, and routes the agent to tempo_preview_worklog as the prerequisite step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_get_week_summaryWeekly timesheet summaryA
Aggregate RECORDED Tempo worklogs for one week (Monday..Sunday) by day and by issue. The week is resolved from date or weekStartDate; defaults to the current week in the configured timezone. Only actually recorded worklogs are counted — missing days are listed as "no recorded worklogs", never as missing work. Read-only; requires TEMPO_API_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| weekStartDate | No | ||
| authorAccountId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it declares read-only behavior, states the TEMPO_API_TOKEN requirement, and discloses the key semantic that only actually recorded worklogs are counted. It does not describe the returned structure or volume, which keeps it below a 5.
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?
Four dense sentences with the operation front-loaded, then week resolution, then the counting caveat, then the auth note. Every sentence adds information; no filler or repetition.
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?
For an aggregation tool with no output schema and no annotations, the description covers the important semantics: scope, week resolution, default behavior, and the recorded-only counting rule. The main remaining gap is what the aggregate result actually looks like (day/issue grouping shape), plus the unresolved parameter precedence.
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 0%, so the description must compensate. It gives useful meaning for `date`/`weekStartDate` (week resolution and default), but leaves the precedence between the two parameters ambiguous and never mentions `authorAccountId` (presumably defaulting to the caller), leaving one of three parameters unexplained.
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?
States a specific verb (aggregate), a specific resource (recorded Tempo worklogs), and the output granularity (by day and by issue) for a bounded scope (Monday..Sunday). This implicitly separates it from the raw-listing siblings like tempo_get_worklogs, though no sibling is named explicitly.
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?
Explains how the target week is selected (from `date` or `weekStartDate`, defaulting to the current week in the configured timezone) and clarifies that unrecorded days are reported as 'no recorded worklogs' rather than as missing work. No explicit when-not-to-use or named alternative is given, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_get_worklogGet one Tempo worklogB
Retrieve a single Tempo worklog by its tempoWorklogId. Read-only; requires TEMPO_API_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
| worklogId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the load: it does disclose read-only semantics and the TEMPO_API_TOKEN requirement, which is genuinely useful. It omits what happens when the ID does not exist (error vs empty), and gives no sense of the returned payload for a tool with no output schema.
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?
Two tight, front-loaded sentences with no filler; the read-only and auth facts arrive early. Minor noise comes from the 'tempoWorklogId' label that doesn't match the schema's parameter name.
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?
For a simple one-parameter lookup this covers the essentials (what it fetches, that it is safe, that auth is needed), but with no annotations and no output schema it should also say what a worklog result contains and how a missing ID is surfaced.
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 single parameter has 0% schema description coverage, yet the description only restates its role ('by its tempoWorklogId') and even names it differently from the schema's 'worklogId'. No format, range (positive integer), or lookup-source guidance is added.
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?
States a specific verb+resource ('Retrieve a single Tempo worklog') and scopes it to one record, which implicitly separates it from the sibling tempo_get_worklogs that lists many. It never names that sibling, so the differentiation is inferable rather than explicit.
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?
There is no guidance on when to pick this over tempo_get_worklogs, tempo_preview_worklog, or tempo_validate_worklog. The word 'single' hints at the by-ID lookup case, but usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_get_worklogsGet Tempo worklogsA
Retrieve Tempo worklogs recorded within an inclusive date range (YYYY-MM-DD). Optionally scope to one Jira accountId. Read-only; requires TEMPO_API_TOKEN.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | Yes | ||
| startDate | Yes | ||
| maxResults | No | ||
| authorAccountId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real context: read-only semantics, an auth requirement (TEMPO_API_TOKEN), and inclusive range boundaries. It omits pagination/result-cap behavior despite a maxResults parameter capped at 5000, and says nothing about the shape or size of what comes back.
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?
Two tight sentences with no filler; the date-range constraint leads, the optional filter follows, and the safety/auth facts close. Nothing repeats the schema verbatim.
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?
For a 4-parameter read tool with no annotations and no output schema, an agent still lacks pagination guidance and any hint about the returned worklog fields. The auth and inclusivity notes are valuable, but coverage is partial.
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 coverage is 0%, so the description must compensate. It explains the YYYY-MM-DD format and the crucial 'inclusive' boundary semantics for startDate/endDate and clarifies that authorAccountId scopes to one Jira user, but maxResults is never mentioned, leaving the pagination knob undocumented in both places.
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?
States a specific verb (Retrieve) and resource (Tempo worklogs) plus the scoping dimension (date range, optional accountId), which cleanly separates it from the singular tempo_get_worklog and the aggregate tempo_get_week_summary. It doesn't explicitly name those siblings, so differentiation is inferred from the plural resource.
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 usage through 'date range' and 'optionally scope to one Jira accountId', giving enough for an agent to infer the list-vs-single distinction. But it never states when to prefer tempo_get_worklog, tempo_get_week_summary, or tempo_preview_worklog, leaving routing to the reader.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_preview_worklogPreview a worklog (no write)A
Prepare a proposed worklog for user review WITHOUT writing to Tempo. operation="create": pass proposal {issueKey, date, durationMinutes, description, startTime?}. operation="update": pass worklogId and changes {description?, timeSpentSeconds?, startDate?, startTime?}. Returns validation results, duplicates, and (when valid) an approvalToken required by the write tools. Show the full preview to the user and wait for explicit approval before calling a write tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does it well: it declares the tool is non-mutating, enumerates what the response contains (validation results, duplicates, approvalToken), and states that the token is required by the write tools. It omits operational details such as whether approval tokens expire or whether previews are persisted.
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 non-writing constraint and user-review workflow are front-loaded, followed by the two operation shapes and the return contract. Four dense sentences, none of which is filler or restates the title.
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?
For a tool with no annotations and no output schema, the description supplies the missing behavioral contract: it is a read-only preview, what it returns, and how the returned token gates subsequent writes. The critical agent failure mode — skipping the preview and writing directly — is explicitly guarded against.
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 coverage is 100%, so the baseline would be 3, but the description adds real meaning beyond the schema: it names which fields belong to the create proposal versus the update changes object, and explains the approvalToken's role in the downstream workflow. The optional-field markers (startTime?, description?, etc.) mirror the schema rather than adding new constraints.
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?
States a specific verb and resource ('Prepare a proposed worklog for user review WITHOUT writing to Tempo'), and the emphasis on 'WITHOUT writing' distinguishes it cleanly from tempo_create_worklog and tempo_update_worklog. An agent can tell what this does and what it does not do without opening the schema.
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?
Gives clear sequencing guidance: preview first, show the full result to the user, wait for explicit approval, then call a write tool. It also branches usage by operation=create vs operation=update. It stops short of explicitly positioning itself against tempo_validate_worklog and tempo_check_duplicate, which overlap in returning validation/duplicate results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_update_worklogUpdate a Tempo worklog (write, gated)A
Update an existing Tempo worklog after explicit user approval. Requires: writes enabled, confirm=true, and an approvalToken from tempo_preview_worklog (operation="update") for the EXACT same worklogId and changes. No worklog deletion exists in this MVP.
| Name | Required | Description | Default |
|---|---|---|---|
| changes | Yes | ||
| confirm | Yes | ||
| worklogId | Yes | ||
| approvalToken | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the safety burden well: writes must be enabled, confirm must be true, and the token must match the exact worklogId and change set, which implies the update is rejected on mismatch. It does not disclose whether 'changes' is a partial patch or a full replacement, nor any token expiry or error-response behavior.
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?
Three short sentences, front-loaded with the action, then prerequisites, then scope boundary. No filler and nothing repeated from the schema.
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?
For a mutation tool with no annotations, no output schema, and a nested changes object, the description covers gating and approval requirements thoroughly. The remaining gap is semantic: whether the changes object merges with or overwrites existing field values, which materially affects how an agent should populate 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 0%, so the description must compensate; it does so for the two non-obvious parameters, pinning confirm=true and defining approvalToken's provenance and matching constraint. worklogId and the nested changes fields are left to self-explanatory names and JSON constraints (patterns, min/max) rather than prose.
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?
States a specific verb ('Update') and resource ('an existing Tempo worklog'), with 'existing' implicitly separating it from tempo_create_worklog. The closing note that no deletion exists in this MVP further fences the tool's scope against ambiguous destructive expectations.
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?
Explicitly names the precondition (explicit user approval) and the mandatory workflow: obtain an approvalToken from tempo_preview_worklog with operation="update" for the exact same worklogId and changes. It routes the agent to the correct sibling and states what must happen before invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tempo_validate_worklogValidate a worklog proposalA
Validate a proposed worklog: issue existence/access, date, duration, description, and timezone warnings. Returns validation errors and warnings. Does NOT write and does NOT approve anything.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| issueKey | Yes | ||
| startTime | No | ||
| description | Yes | ||
| durationMinutes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it names the tool as non-mutating and non-approving and discloses that the output is errors plus warnings. It does not mention permission requirements for access checks or any call cost/limits, which keeps it from a 5.
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?
Two tight sentences with zero waste; the positive scope comes first and the negative boundary clause is front-loaded at the end where it reads as a guardrail.
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 no output schema, the description correctly states that validation errors and warnings are returned, which is the key return-value fact. It stops short of explaining whether validation is all-or-nothing or per-field, a minor gap for a read-only validator.
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 0% across 5 parameters, so the description must compensate. It names the concepts being checked (issue key, date, duration, description, plus timezone/start-time warnings), giving partial mapping, but adds no format or constraint detail such as minute units, the 1-1440 range, or that startTime is optional.
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?
States a specific verb (validate) and resource (proposed worklog), then enumerates the exact checks performed: issue existence/access, date, duration, description, timezone. The closing sentence explicitly separates it from write/approve siblings such as tempo_create_worklog, so an agent can distinguish it without opening any schema.
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 negation ('Does NOT write and does NOT approve anything') implies this is a pre-flight check before creating a worklog, but the description never says so explicitly, nor does it route the agent between this tool and the close sibling tempo_preview_worklog. Usage is inferable rather than stated.
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.
9 tool updates
v0.1.2- First observed
jira_search_issues - First observed
tempo_check_duplicate - First observed
tempo_create_worklog - First observed
tempo_get_week_summary - First observed
tempo_get_worklog - First observed
tempo_get_worklogs - First observed
tempo_preview_worklog - First observed
tempo_update_worklog - First observed
tempo_validate_worklog
TDQS
Scored across 9 tools
The read tools (get_worklog, get_worklogs, get_week_summary) are clearly distinct, as are create vs update. However, tempo_preview_worklog is a superset of tempo_validate_worklog and tempo_check_duplicate (it returns validation results, duplicate matches, and the approval token), so three tools circle the same pre-write proposal and an agent can easily pick the wrong one or call validate/check_duplicate and then wrongly assume it is cleared to write.
All tools follow a uniform <service>_<verb>_<noun> snake_case pattern (tempo_get_worklog, tempo_create_worklog, jira_search_issues), with the prefix consistently denoting the backing system. Verb choice is predictable across the CRUD/preview lifecycle.
Nine tools is well within a healthy range and each maps to a concrete step: read (single/range/summary), lookup (jira search), pre-write safety (preview/validate/check_duplicate), and write (create/update). No obviously filler tools.
Create and update are covered with strong safety rails, and reads cover single, ranged, and aggregated views. The notable gap is deletion (explicitly absent in the MVP), and there is no tool to inspect an existing worklog's issue metadata or list a user's worklogs outside a date range, both of which limit recovery from mistakes.
Maintenance
Related MCP Connectors
Work journal for coding agents: worklogs, tasks, project state and costs across projects.
Connects AI assistants to TrackingTime for querying time entries, projects, tasks, customers, and team data using natural language.
Runtime permission, approval, and audit layer for AI agent tool execution.
Time tracking and invoicing for AI agents and their humans: track, log and bill work by agent.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage Jira Cloud instances, including creating and updating issues, managing sprints and projects, adding comments, tracking worklogs, and searching with presets.7 npmMIT
- FlicenseAqualityDmaintenanceEnables Claude to interact with 7pace Timetracker for Jira, supporting time logging, worklog queries, and summaries.6-
- AlicenseAqualityBmaintenanceEnables Claude to log, list, and delete Tempo worklogs against Jira issues, with automatic issue key resolution via the Jira REST API.317 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with Jira and Confluence on Atlassian Cloud, supporting issue search, creation, updates, transitions, project listing, content search, page management, and comments.247 npm1MIT