Skip to main content
Glama
nbhson

Tempo Timesheet MCP Server

by nbhson

Tempo Timesheet MCP Server

npm node license

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=true and a single-use payload-bound approval token and confirm: 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) ──► verify
  1. tempo_preview_worklog validates the proposal, runs duplicate detection, and issues an approval token bound to the SHA-256 of the payload.

  2. You review and approve. Any change to the payload invalidates the token.

  3. The write tool requires WORKLOG_WRITE_ENABLED=true, the token, and an explicit confirm: true. Tokens are single-use — a replayed approval cannot create a second identical worklog. Timed-out writes return UNCERTAIN_OUTCOME and are never retried by the server.

Related MCP server: 7Pace-Connector

Tools (9)

Tool

Kind

Description

tempo_get_worklogs

read

Worklogs in a date range; scoped to your own account by default

tempo_get_worklog

read

One worklog by id

tempo_get_week_summary

read

Week (Mon–Sun) aggregated by day and issue

jira_search_issues

read

Jira search via JQL (enhanced search API)

tempo_preview_worklog

preview

Validate + duplicate-check a create/update; returns an approval token. Never writes

tempo_validate_worklog

preview

Validate a proposal without issuing a token

tempo_check_duplicate

preview

Confidence-scored duplicate check for a candidate entry

tempo_create_worklog

write (gated)

Create a worklog; needs token + confirm

tempo_update_worklog

write (gated)

Update a worklog; needs token + confirm

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-mcp

Or install globally:

npm install -g s-tempo-worklog-mcp
tempo-worklog-mcp

The 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

TEMPO_API_TOKEN

— (required)

Tempo API token

TEMPO_ACCOUNT_ID

auto-detected

Your Tempo accountId; auto-detected from an existing worklog when absent

TEMPO_BASE_URL

https://api.tempo.io

Tempo v4 base URL

JIRA_BASE_URL

— (optional)

https://<site>.atlassian.net

JIRA_EMAIL

— (optional)

Atlassian account email

JIRA_API_TOKEN

— (optional)

Atlassian API token

DEFAULT_TIMEZONE

system TZ

IANA name, e.g. Asia/Ho_Chi_Minh

LOG_LEVEL

info

debug | info | warn | error

WORKLOG_WRITE_ENABLED

false

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

Full 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-mcp

OpenCode 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-today daily summary with an aligned terminal report.

  • .opencode/commands/tempo-week.md — /tempo-week weekly 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-rewrite works like /tempo-log but 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 numeric issueId, 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

AUTH_ERROR (401)

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.

PERMISSION_ERROR (403)

Token valid but lacks scope/visibility (Tempo needs the Worklogs scope; check Jira project access).

WRITE_DISABLED

Writes are off by default. Set WORKLOG_WRITE_ENABLED=true and restart, then re-run the preview for a fresh token.

APPROVAL_REQUIRED

Token expired (>15 min), consumed, or the payload changed. Call tempo_preview_worklog again.

UNCERTAIN_OUTCOME

The write MAY have landed. Verify with tempo_get_worklog(s) before any retry — never blind-retry.

NETWORK_ERROR / TIMEOUT

Check connectivity/VPN/proxy (HTTPS_PROXY). For a timed-out write, verify before retrying.

CONFIG_ERROR

Configuration incomplete — compare with .env.example and restart.

RATE_LIMIT (429)

Wait for the suggested interval, then retry; narrow the date range or lower maxResults.

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 server

Test 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

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 issueKey vs issueId for PUT /worklogs/{id}; this server sends issueId (docs/api-contract.md).

  • Single user focus. Read tools default to your own account (pass authorAccountId to 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_ID explicitly.

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 authorAccountId on create).

  • Read tools now scope to your own account by default, so totals never silently include other users' worklogs; pass authorAccountId to 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_worklog now returns the structured WRITE_DISABLED error code like tempo_create_worklog.

Available Tools

9 tools
jira_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.

NameRequiredDescriptionDefault
jqlNo
textNo
maxResultsNo
projectKeyNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dateYes
issueKeyYes
descriptionNo
durationMinutesNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
dateYes
confirmYes
issueKeyYes
startTimeNo
descriptionYes
approvalTokenYes
durationMinutesYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
dateNo
weekStartDateNo
authorAccountIdNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
worklogIdYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
endDateYes
startDateYes
maxResultsNo
authorAccountIdNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
changesYes
confirmYes
worklogIdYes
approvalTokenYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
dateYes
issueKeyYes
startTimeNo
descriptionYes
durationMinutesYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 9 tool updatesv0.1.2
    • First observedjira_search_issues
    • First observedtempo_check_duplicate
    • First observedtempo_create_worklog
    • First observedtempo_get_week_summary
    • First observedtempo_get_worklog
    • First observedtempo_get_worklogs
    • First observedtempo_preview_worklog
    • First observedtempo_update_worklog
    • First observedtempo_validate_worklog

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers