{"id":"d043756f-63a1-4c90-8513-dd7ab7d2cab2","entityType":"agent","slug":"clawhub-chrischall-tempo-api-mcp","name":"tempo-api-mcp","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chrischall-tempo-api-mcp","canonicalPath":"/agent/clawhub-chrischall-tempo-api-mcp","generatedAt":"2026-10-09T21:52:46.224Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:46:06.063Z","emptyReason":null},"description":"Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.2K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:tempo-api-mcp","sourceUrl":"https://clawhub.ai/chrischall/tempo-api-mcp","homepage":"https://clawhub.ai/chrischall/skills/tempo-api-mcp","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chrischall/tempo-api-mcp","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chrischall/skills/tempo-api-mcp","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":67,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"tempo-api-mcp technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:46:06.063Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:46:06.063Z","emptyReason":null},"stars":null,"forks":null,"downloads":2186,"packageName":null,"latestVersion":"3.2.4","tractionLabel":"2.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:46:06.063Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T17:46:06.063Z","lastCrawledAt":"2026-10-09T17:46:06.063Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T17:46:06.063Z","lastVerifiedAt":null,"highlights":[{"version":"3.2.4","createdAt":"2026-10-06T15:50:24.971Z","changelog":"- Removed the file skill-card.md. - Minor update to SKILL.md; no functional or behavioral changes.","fileCount":3,"zipByteSize":7279},{"version":"3.2.3","createdAt":"2026-10-05T02:51:13.316Z","changelog":"- Removed the file: skill-card.md. - No changes to skill functionality or configuration.","fileCount":3,"zipByteSize":7279},{"version":"3.2.2","createdAt":"2026-10-03T01:44:05.693Z","changelog":"- Removed the file `skill-card.md` from the project. - No changes were made to the code or functionality.","fileCount":3,"zipByteSize":7240},{"version":"3.2.1","createdAt":"2026-09-25T15:56:20.221Z","changelog":"- Removed the file: skill-card.md - No changes to core functionality or documentation content - Housekeeping update to remove an unused documentation file","fileCount":3,"zipByteSize":7227},{"version":"3.2.0","createdAt":"2026-09-24T15:11:20.085Z","changelog":"- Removed the skill-card.md file (no longer included). - SKILL.md updated; minor formatting changes, no major content changes detected. - No changes to skill functionality or interface.","fileCount":3,"zipByteSize":7264},{"version":"3.1.2","createdAt":"2026-09-23T21:41:58.455Z","changelog":"- Updated documentation to clarify that update tools (worklog, plan, team, account) allow partial updates—only changed fields need to be provided; omitted fields keep their current values. - Removed the sample file skill-card.md. - No changes to interfaces or tool behavior; documentation only.","fileCount":3,"zipByteSize":6820},{"version":"3.1.1","createdAt":"2026-09-23T15:39:41.756Z","changelog":"- Removed the unused or outdated skill-card.md documentation file. - No changes to API functionality or user experience.","fileCount":3,"zipByteSize":6737},{"version":"3.1.0","createdAt":"2026-09-20T02:52:28.465Z","changelog":"- Removed the skill-card.md file. - No user-facing or functional changes to the skill's features or documentation; only auxiliary documentation was removed.","fileCount":3,"zipByteSize":6786}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:tempo-api-mcp","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17cjx1a349nz5apaqp02vgz4h85728z:tempo-api-mcp` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/chrischall/tempo-api-mcp before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T21:52:46.220Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chrischall-tempo-api-mcp/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:46:06.063Z","emptyReason":null},"readme":"Skill: tempo-api-mcp\n\nOwner: chrischall\n\nSummary: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n\nTags: latest:3.2.4\n\nVersion history:\n\nv3.2.4 | 2026-10-06T15:50:24.971Z | auto\n\n- Removed the file skill-card.md.\n- Minor update to SKILL.md; no functional or behavioral changes.\n\nv3.2.3 | 2026-10-05T02:51:13.316Z | auto\n\n- Removed the file: skill-card.md.\n- No changes to skill functionality or configuration.\n\nv3.2.2 | 2026-10-03T01:44:05.693Z | auto\n\n- Removed the file `skill-card.md` from the project.\n- No changes were made to the code or functionality.\n\nv3.2.1 | 2026-09-25T15:56:20.221Z | auto\n\n- Removed the file: skill-card.md\n- No changes to core functionality or documentation content\n- Housekeeping update to remove an unused documentation file\n\nv3.2.0 | 2026-09-24T15:11:20.085Z | auto\n\n- Removed the skill-card.md file (no longer included).\n- SKILL.md updated; minor formatting changes, no major content changes detected.\n- No changes to skill functionality or interface.\n\nv3.1.2 | 2026-09-23T21:41:58.455Z | auto\n\n- Updated documentation to clarify that update tools (worklog, plan, team, account) allow partial updates—only changed fields need to be provided; omitted fields keep their current values.\n- Removed the sample file skill-card.md. \n- No changes to interfaces or tool behavior; documentation only.\n\nv3.1.1 | 2026-09-23T15:39:41.756Z | auto\n\n- Removed the unused or outdated skill-card.md documentation file.\n- No changes to API functionality or user experience.\n\nv3.1.0 | 2026-09-20T02:52:28.465Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing or functional changes to the skill's features or documentation; only auxiliary documentation was removed.\n\nv3.0.0 | 2026-09-19T11:18:17.031Z | auto\n\n- Removed the skill-card.md file.\n- No changes to core functionality, setup, or usage instructions.\n\nv2.5.1 | 2026-09-10T17:51:14.721Z | auto\n\n### Adds support for a `view` parameter on all read (GET) tools.\n\n- All read endpoints now accept `view: \"compact\"` (default) or `view: \"full\"` to control response detail.\n- The SKILL.md file is updated with new tool signatures and a detailed explanation of the `view` behavior.\n- The `skill-card.md` file has been removed.\n\nv2.5.0 | 2026-09-04T22:22:57.215Z | auto\n\n- Removed the file: skill-card.md\n- No changes to functionality or documented API/tools.\n\nv2.4.0 | 2026-09-02T00:17:04.528Z | auto\n\n- Added a new `tempo_healthcheck()` tool for checking connector health, credential validity, and diagnosing authentication issues.\n- Removed the redundant `skill-card.md` file.\n- No changes to other tools or workflows; all existing functionality is unchanged.\n\nv2.3.2 | 2026-08-28T11:34:51.129Z | auto\n\n- Removed the file skill-card.md from the project.\n- No changes were made to the functionality or documentation in SKILL.md.\n\nv2.3.1 | 2026-07-31T19:37:14.455Z | auto\n\n- Removed the file: skill-card.md.\n- No code or functionality changes; documentation only.\n\nv2.3.0 | 2026-07-28T16:22:20.025Z | auto\n\n**Version 2.3.0 Changelog**\n\n- Added new query parameters (`updatedFrom?`) to worklog tools for incremental sync.\n- Expanded team tools: `tempo_get_team_memberships` now requires `teamId`, and `tempo_search_team_memberships` allows membership search by teams, accounts, or roles.\n- Enhanced account APIs: `tempo_get_account` now requires a numeric id, while `tempo_search_accounts` supports lookup by ids, keys, statuses, or global flag.\n- Added new timesheet functions: `tempo_get_timesheet_approvals_by_team` and `tempo_get_timesheet_reviewers` for advanced approval/chase workflows.\n- Updated and clarified usage notes, especially regarding required parameters and account id/key handling.\n- Removed the obsolete skill-card.md file.\n\nv2.2.0 | 2026-07-28T15:35:15.154Z | auto\n\n**Timesheet approval actions added and doc cleanup.**\n\n- Added new tools for timesheet workflow: submit, approve, reject, reopen, and recall timesheets.\n- Updated documentation to describe usage and required parameters for new timesheet actions.\n- Expanded example workflows to include timesheet approval actions.\n- Removed obsolete \"skill-card.md\" file.\n- General documentation cleanup and clarifications.\n\nv2.1.9 | 2026-07-19T12:46:22.386Z | auto\n\n- Removed the file `skill-card.md` to clean up redundant documentation.\n- No changes to skill functionality or user experience.\n\nv2.1.8 | 2026-07-14T10:41:07.788Z | auto\n\n- Removed the redundant file skill-card.md.\n- No changes to features or functionality.\n\nv2.1.7 | 2026-07-07T23:41:59.516Z | auto\n\n- Removed the file: skill-card.md.\n- No feature or functionality changes; this is a documentation cleanup release.\n\nv2.1.6 | 2026-07-05T22:38:51.565Z | auto\n\n- Removed the file: skill-card.md\n- No functional or user-facing changes.  \n- Documentation and available tools remain unchanged.\n\nv2.1.5 | 2026-06-13T00:55:16.487Z | auto\n\n- Removed the skill-card.md file.\n- No user-facing changes to functionality or documentation.\n\nv2.1.4 | 2026-05-29T21:35:51.815Z | auto\n\n- Expanded and clarified documentation in SKILL.md, detailing all available tools, setup methods, workflows, and API usage policies.\n- Added explicit example commands for common workflows such as logging time, checking worklogs, and managing approvals.\n- Clearly outlined authentication, data access boundaries, and terms of use for personal, single-user automation with Tempo.\n- Provided direct links to npm and GitHub repositories for easy reference.\n- Strengthened guidance on secure handling of API tokens and compliance with organizational and Tempo's terms.\n\nArchive index:\n\nArchive v3.2.4: 3 files, 7279 bytes\n\nFiles: skill-card.md (1903b), SKILL.md (15405b), _meta.json (132b)\n\nFile v3.2.4:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, timeSpentSeconds?, description?, attributes?, ...)` | Update an existing worklog — pass only what changes; omitted fields keep their current values |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan — omitted fields keep their current values |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name?, ...)` | Update a team — omitted fields keep their current values |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name?, ...)` | Update an account — omitted fields keep their current values |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's timesheet |\n| `tempo_search_timesheet_approval_logs(..., view?)` | Search approval audit logs |\n| `tempo_submit_timesheet(accountId, from, to?, ...)` | Submit a timesheet for approval |\n| `tempo_approve_timesheet(accountId, from, to?, ...)` | Approve a submitted timesheet |\n| `tempo_reject_timesheet(accountId, from, to?, ...)` | Reject a submitted timesheet |\n| `tempo_reopen_timesheet(accountId, from, to?, ...)` | Reopen an approved timesheet |\n| `tempo_recall_timesheet(accountId, from, to?, ...)` | Recall your own unapproved timesheet |\n| `tempo_get_periods(from, to, view?)` | Get Tempo period definitions |\n| `tempo_get_user_schedule(accountId, from, to, view?)` | Get a user's work schedule |\n| `tempo_get_global_configuration(view?)` | Get global Tempo settings |\n| `tempo_get_work_attributes(view?)` | List custom worklog attributes |\n| `tempo_get_roles(view?)` | List all Tempo roles |\n| `tempo_healthcheck()` | Is this connector working? Reports which credential resolved, whether api.tempo.io accepted it, and what to fix. Start here when another tool fails — an empty result can mean \"no data\" or \"never authenticated\", and this separates them. |\n\n## Response shape (`view`)\n\nEvery read tool takes `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault** — you get the slim rung without asking for it. That is 30 of this\nserver's 48 tools; the seventeen confirmation-gated writes and `tempo_healthcheck`\nhave no `view`.\n\n**Compact here is media stripping, not a field projection**, and the\ndifference is the thing to know before you rely on it. `src/view.ts` says so\noutright: this repo holds no captured Tempo payload and no documented field\nlist, so nothing in it can honestly claim to know which of Tempo's fields\nmatter and which are noise. Compact therefore does the one projection that\nneeds no such knowledge — it removes keys whose value is a picture (`avatar`,\n`picture`, `photo`, `icon`, `logo`, and their `Url` / `Uri` / `Link` forms)\nalong with bare image URLs. That is SUBTRACTIVE, so it cannot lose a field\nnobody knew about, which is what an invented field list would have risked: a\nworklog coming back with holes in it and reading like a verified answer.\n\n**The surprise to expect is that compact often changes nothing.** Tempo is a\ntime-tracking API — worklogs, plans, periods, approval logs — and a payload\nwith no picture in it comes back byte-identical on both rungs. So do not read\na short response as evidence that fields were withheld, and do not reach for\n`full` hoping a field you wanted is hiding behind it. If it is not in compact\nand it is not an image URL, Tempo did not send it.\n\n`view: \"full\"` returns Tempo's payload untouched. There is deliberately **no\n`raw` rung**: nothing here re-serialises or normalises a response, so `full`\nalready IS the upstream payload, and a third value would silently alias one\nthat exists.\n\nThe tools without `view` have it for two distinct reasons, neither of them an\noversight:\n\n- **The seventeen writes** — every `tempo_create_*` / `tempo_update_*` /\n  `tempo_delete_*` plus `submit` / `approve` / `reject` / `reopen` / `recall`\n  — answer with a receipt: a confirmation preview, or an id and a status. There is\n  nothing in a receipt to strip and everything in it to keep.\n- **`tempo_healthcheck`** returns a diagnostic verdict — which credential\n  resolved, whether `api.tempo.io` accepted it, what to fix. Same reasoning,\n  and it is the one read-only tool in that group.\n\nPassing `view` to one of those is not an error and does not fail: the tool\ndoes not declare it, so zod drops the unknown key and the call runs exactly as\nit would have. You get no warning, so do not treat a successful call as\nevidence the rung was honoured.\n\n## Workflows\n\n**Log time for today:**\n```\ntempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)\n```\n\n**See this week's time for a user:**\n```\ntempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")\n```\n\n**Check resource plan for a project:**\n```\ntempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])\n```\n\n**Find all worklogs for an issue:**\n```\ntempo_get_worklogs_by_issue(issueId: 456, from: \"2026-01-01\")\n```\n\n**Review pending timesheet approvals:**\n```\ntempo_get_timesheet_approvals_waiting()\ntempo_get_timesheet_approval_status(accountId, from: \"2026-03-01\", to: \"2026-03-31\")\n```\n\n**Act on a timesheet (all five actions ask the user to confirm first — see Confirmations below):**\n```\ntempo_get_periods(from: \"2026-03-01\", to: \"2026-03-31\")   # find the period boundaries\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\")\n# → on a client without confirmation prompts: status \"confirmation-required\", a preview, and a confirmToken\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\", confirmToken: \"<token>\")\n```\n\n**Chase a team's outstanding timesheets for a period:**\n```\ntempo_get_timesheet_approvals_by_team(teamId: 42, from: \"2026-03-01\", to: \"2026-03-31\")\ntempo_get_timesheet_reviewers(accountId)   # who to route a submission to\n```\n\n## Confirmations\n\nEvery write — each `tempo_create_*` / `tempo_update_*` / `tempo_delete_*` and the\nfive timesheet actions — asks the user to confirm before it changes anything.\nA client that can show a confirmation prompt (Claude Code) shows one, and the\nwrite runs once the user accepts. A client that cannot (claude.ai, Claude\nDesktop) gets two steps instead: the first call does nothing and returns\n`status: \"confirmation-required\"`, a `preview` of exactly what would be sent\n(method, path, `willSend` body, `willSendQuery`), and a `confirmToken`; only a\nrepeat call with the same arguments plus that `confirmToken` performs the write.\nWith `MCP_CONFIRM_ELICITATION=off` (needed on opencode v2, which never shows\nthe prompt) every client gets the two steps.\n\n- Under the default `MCP_CONFIRM_MODE=ask-user`, show the user the preview and\n  get their approval in chat before making the second call.\n- A token is single-use and expires (default 10 minutes). Reusing one fails\n  with `TOKEN_REUSED`; changing any argument — or, for an update, the resource\n  being edited upstream in between — fails with `DRAFT_CHANGED` and returns a\n  fresh preview and token.\n- With `MCP_CONFIRM_MODE=refuse`, writes are refused on such clients\n  (`reason: \"confirmation-unsupported\"`).\n\n## Notes\n\n- `timeSpentSeconds` is always an integer (e.g. `3600` = 1 hour, `1800` = 30 min)\n- `authorAccountId` is the Atlassian account id (not a username) — required for all worklog operations\n- `tempo_get_plans` requires both `from` and `to` — no other filter is mandatory\n- `tempo_get_periods` requires both `from` and `to`; `tempo_get_timesheet_approval_status` requires `from` (`to` optional) — the API rejects these calls without a period\n- Default pagination limit is 50 for most endpoints; use `offset` + `limit` to page through results\n- Accounts are addressed **two different ways**: `tempo_get_account` takes the numeric `id`, while update and delete take the string `key`. Resolve a key to an id with `tempo_search_accounts(keys: [\"ACCOUNT-123\"])`\n- `tempo_delete_worklog` is a hard delete — there is no restore\n- Timesheet actions take the period as `from` (required) + `to` (optional) — they apply to a whole period, not an individual worklog. `submit`/`recall` are the timesheet owner's actions; `approve`/`reject`/`reopen` require reviewer permissions\n- `recall` pulls back a timesheet that is still waiting for approval; `reopen` undoes an approval that already went through\n\n## Acknowledgement of Terms\n\nBy using this MCP server, you acknowledge and agree to the following:\n\n**1. This server accesses your own Tempo account via Tempo's official API.** Auth happens via your own per-user OAuth/API token, issued by your Tempo/Jira instance. It does not — and cannot — access anyone else's worklogs or your colleagues' time entries.\n\n**2. [Tempo's Terms of Use](https://www.tempo.io/terms-of-use) govern your use of this server**. The clauses most relevant here:\n\n> Your registration is solely for your personal use, and you shall not authorize others to use your account.\n\nAnd: users must not \"automate the use of the Service, such as by using scripts\" — *except* via documented APIs (Section 5.3.2(v)). API tokens are the sanctioned automation mechanism — that's what this server uses.\n\nYou are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.\n\n**3. Personal, single-user use only.** This project is not affiliated with, endorsed by, sponsored by, or in partnership with Tempo Software ehf or Atlassian. It is a personal automation tool for one Tempo-licensed user to drive their own worklogs and reports. Do not use it to log time on behalf of colleagues, to bulk-export reports across an org for resale, or to share your token with anyone else.\n\n**4. Your token is yours alone.** Tempo issues per-user OAuth/API tokens; **do not commit `TEMPO_API_TOKEN` to git**, do not paste it in shared chats, and rotate it if it's ever exposed.\n\n**5. Your employer's policy may add restrictions.** Tempo is typically licensed via Jira to an organization. Your employer may have IT/security/acceptable-use policies that further restrict scripted automation against Jira/Tempo — even when Tempo's own ToU allows it. **Check with your employer's IT/Jira admin** before automating against a corporate Tempo instance.\n\n**6. You accept full responsibility** for any consequences of using this server in connection with your Tempo account — rate limiting, token revocation, account warnings, your IT admin emailing you, or any enforcement action. If Tempo or your employer objects to your use, stop using this server.\n\nThis section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Tempo's actual ToU or your employer's policies.\n\nFile v3.2.4:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.2.4\",\n  \"publishedAt\": 1791301824971\n}\n\nFile v3.2.4:skill-card.md\n\n## Description:\n\nHelps agents use Tempo through MCP to review time tracking, resource plans, teams, accounts, and timesheet approvals and to make authorized changes.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nTempo/Jira users and their agents use this skill to review worklogs, allocations, and timesheet approvals, and to make authorized changes to time-tracking records.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill's personal-use description understates access to coworkers' worklogs, team data, and other-user timesheets when the token has broader permissions.\n\nMitigation: Review Tempo/Jira permissions before installation and use a least-privilege token; limit team, reviewer, account, plan, and approval access to what is needed.\n\nRisk: Authorized write actions can change or delete time records and act on timesheet approvals.\n\nMitigation: Keep confirmation prompts enabled for writes and review each proposed action before approving it.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [Tempo API MCP npm package](https://www.npmjs.com/package/tempo-api-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance, Configuration instructions]\n\n**Output Format:** [Markdown and structured Tempo tool responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Write operations request confirmation before execution.]\n\n## Skill Version(s):\n\n3.2.4 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.2.3: 3 files, 7279 bytes\n\nFiles: skill-card.md (2027b), SKILL.md (15283b), _meta.json (132b)\n\nFile v3.2.3:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, timeSpentSeconds?, description?, attributes?, ...)` | Update an existing worklog — pass only what changes; omitted fields keep their current values |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan — omitted fields keep their current values |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name?, ...)` | Update a team — omitted fields keep their current values |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name?, ...)` | Update an account — omitted fields keep their current values |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's timesheet |\n| `tempo_search_timesheet_approval_logs(..., view?)` | Search approval audit logs |\n| `tempo_submit_timesheet(accountId, from, to?, ...)` | Submit a timesheet for approval |\n| `tempo_approve_timesheet(accountId, from, to?, ...)` | Approve a submitted timesheet |\n| `tempo_reject_timesheet(accountId, from, to?, ...)` | Reject a submitted timesheet |\n| `tempo_reopen_timesheet(accountId, from, to?, ...)` | Reopen an approved timesheet |\n| `tempo_recall_timesheet(accountId, from, to?, ...)` | Recall your own unapproved timesheet |\n| `tempo_get_periods(from, to, view?)` | Get Tempo period definitions |\n| `tempo_get_user_schedule(accountId, from, to, view?)` | Get a user's work schedule |\n| `tempo_get_global_configuration(view?)` | Get global Tempo settings |\n| `tempo_get_work_attributes(view?)` | List custom worklog attributes |\n| `tempo_get_roles(view?)` | List all Tempo roles |\n| `tempo_healthcheck()` | Is this connector working? Reports which credential resolved, whether api.tempo.io accepted it, and what to fix. Start here when another tool fails — an empty result can mean \"no data\" or \"never authenticated\", and this separates them. |\n\n## Response shape (`view`)\n\nEvery read tool takes `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault** — you get the slim rung without asking for it. That is 30 of this\nserver's 48 tools; the seventeen confirmation-gated writes and `tempo_healthcheck`\nhave no `view`.\n\n**Compact here is media stripping, not a field projection**, and the\ndifference is the thing to know before you rely on it. `src/view.ts` says so\noutright: this repo holds no captured Tempo payload and no documented field\nlist, so nothing in it can honestly claim to know which of Tempo's fields\nmatter and which are noise. Compact therefore does the one projection that\nneeds no such knowledge — it removes keys whose value is a picture (`avatar`,\n`picture`, `photo`, `icon`, `logo`, and their `Url` / `Uri` / `Link` forms)\nalong with bare image URLs. That is SUBTRACTIVE, so it cannot lose a field\nnobody knew about, which is what an invented field list would have risked: a\nworklog coming back with holes in it and reading like a verified answer.\n\n**The surprise to expect is that compact often changes nothing.** Tempo is a\ntime-tracking API — worklogs, plans, periods, approval logs — and a payload\nwith no picture in it comes back byte-identical on both rungs. So do not read\na short response as evidence that fields were withheld, and do not reach for\n`full` hoping a field you wanted is hiding behind it. If it is not in compact\nand it is not an image URL, Tempo did not send it.\n\n`view: \"full\"` returns Tempo's payload untouched. There is deliberately **no\n`raw` rung**: nothing here re-serialises or normalises a response, so `full`\nalready IS the upstream payload, and a third value would silently alias one\nthat exists.\n\nThe tools without `view` have it for two distinct reasons, neither of them an\noversight:\n\n- **The seventeen writes** — every `tempo_create_*` / `tempo_update_*` /\n  `tempo_delete_*` plus `submit` / `approve` / `reject` / `reopen` / `recall`\n  — answer with a receipt: a confirmation preview, or an id and a status. There is\n  nothing in a receipt to strip and everything in it to keep.\n- **`tempo_healthcheck`** returns a diagnostic verdict — which credential\n  resolved, whether `api.tempo.io` accepted it, what to fix. Same reasoning,\n  and it is the one read-only tool in that group.\n\nPassing `view` to one of those is not an error and does not fail: the tool\ndoes not declare it, so zod drops the unknown key and the call runs exactly as\nit would have. You get no warning, so do not treat a successful call as\nevidence the rung was honoured.\n\n## Workflows\n\n**Log time for today:**\n```\ntempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)\n```\n\n**See this week's time for a user:**\n```\ntempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")\n```\n\n**Check resource plan for a project:**\n```\ntempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])\n```\n\n**Find all worklogs for an issue:**\n```\ntempo_get_worklogs_by_issue(issueId: 456, from: \"2026-01-01\")\n```\n\n**Review pending timesheet approvals:**\n```\ntempo_get_timesheet_approvals_waiting()\ntempo_get_timesheet_approval_status(accountId, from: \"2026-03-01\", to: \"2026-03-31\")\n```\n\n**Act on a timesheet (all five actions ask the user to confirm first — see Confirmations below):**\n```\ntempo_get_periods(from: \"2026-03-01\", to: \"2026-03-31\")   # find the period boundaries\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\")\n# → on a client without confirmation prompts: status \"confirmation-required\", a preview, and a confirmToken\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\", confirmToken: \"<token>\")\n```\n\n**Chase a team's outstanding timesheets for a period:**\n```\ntempo_get_timesheet_approvals_by_team(teamId: 42, from: \"2026-03-01\", to: \"2026-03-31\")\ntempo_get_timesheet_reviewers(accountId)   # who to route a submission to\n```\n\n## Confirmations\n\nEvery write — each `tempo_create_*` / `tempo_update_*` / `tempo_delete_*` and the\nfive timesheet actions — asks the user to confirm before it changes anything.\nA client that can show a confirmation prompt (Claude Code) shows one, and the\nwrite runs once the user accepts. A client that cannot (claude.ai, Claude\nDesktop) gets two steps instead: the first call does nothing and returns\n`status: \"confirmation-required\"`, a `preview` of exactly what would be sent\n(method, path, `willSend` body, `willSendQuery`), and a `confirmToken`; only a\nrepeat call with the same arguments plus that `confirmToken` performs the write.\n\n- Under the default `MCP_CONFIRM_MODE=ask-user`, show the user the preview and\n  get their approval in chat before making the second call.\n- A token is single-use and expires (default 10 minutes). Reusing one fails\n  with `TOKEN_REUSED`; changing any argument — or, for an update, the resource\n  being edited upstream in between — fails with `DRAFT_CHANGED` and returns a\n  fresh preview and token.\n- With `MCP_CONFIRM_MODE=refuse`, writes are refused on such clients\n  (`reason: \"confirmation-unsupported\"`).\n\n## Notes\n\n- `timeSpentSeconds` is always an integer (e.g. `3600` = 1 hour, `1800` = 30 min)\n- `authorAccountId` is the Atlassian account id (not a username) — required for all worklog operations\n- `tempo_get_plans` requires both `from` and `to` — no other filter is mandatory\n- `tempo_get_periods` requires both `from` and `to`; `tempo_get_timesheet_approval_status` requires `from` (`to` optional) — the API rejects these calls without a period\n- Default pagination limit is 50 for most endpoints; use `offset` + `limit` to page through results\n- Accounts are addressed **two different ways**: `tempo_get_account` takes the numeric `id`, while update and delete take the string `key`. Resolve a key to an id with `tempo_search_accounts(keys: [\"ACCOUNT-123\"])`\n- `tempo_delete_worklog` is a hard delete — there is no restore\n- Timesheet actions take the period as `from` (required) + `to` (optional) — they apply to a whole period, not an individual worklog. `submit`/`recall` are the timesheet owner's actions; `approve`/`reject`/`reopen` require reviewer permissions\n- `recall` pulls back a timesheet that is still waiting for approval; `reopen` undoes an approval that already went through\n\n## Acknowledgement of Terms\n\nBy using this MCP server, you acknowledge and agree to the following:\n\n**1. This server accesses your own Tempo account via Tempo's official API.** Auth happens via your own per-user OAuth/API token, issued by your Tempo/Jira instance. It does not — and cannot — access anyone else's worklogs or your colleagues' time entries.\n\n**2. [Tempo's Terms of Use](https://www.tempo.io/terms-of-use) govern your use of this server**. The clauses most relevant here:\n\n> Your registration is solely for your personal use, and you shall not authorize others to use your account.\n\nAnd: users must not \"automate the use of the Service, such as by using scripts\" — *except* via documented APIs (Section 5.3.2(v)). API tokens are the sanctioned automation mechanism — that's what this server uses.\n\nYou are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.\n\n**3. Personal, single-user use only.** This project is not affiliated with, endorsed by, sponsored by, or in partnership with Tempo Software ehf or Atlassian. It is a personal automation tool for one Tempo-licensed user to drive their own worklogs and reports. Do not use it to log time on behalf of colleagues, to bulk-export reports across an org for resale, or to share your token with anyone else.\n\n**4. Your token is yours alone.** Tempo issues per-user OAuth/API tokens; **do not commit `TEMPO_API_TOKEN` to git**, do not paste it in shared chats, and rotate it if it's ever exposed.\n\n**5. Your employer's policy may add restrictions.** Tempo is typically licensed via Jira to an organization. Your employer may have IT/security/acceptable-use policies that further restrict scripted automation against Jira/Tempo — even when Tempo's own ToU allows it. **Check with your employer's IT/Jira admin** before automating against a corporate Tempo instance.\n\n**6. You accept full responsibility** for any consequences of using this server in connection with your Tempo account — rate limiting, token revocation, account warnings, your IT admin emailing you, or any enforcement action. If Tempo or your employer objects to your use, stop using this server.\n\nThis section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Tempo's actual ToU or your employer's policies.\n\nFile v3.2.3:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.2.3\",\n  \"publishedAt\": 1791168673316\n}\n\nFile v3.2.3:skill-card.md\n\n## Description:\n\nHelps agents use Tempo to review and manage time tracking, resource plans, teams, accounts, and timesheet approvals.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nTempo users and their teams can ask an agent to inspect worklogs and plans, log time, and manage timesheet approvals within their granted permissions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: A Tempo token may expose or change colleagues' worklogs, plans, teams, accounts, and approvals, depending on its permissions.\n\nMitigation: Confirm actual Tempo/Jira permissions and obtain organizational approval before using the skill in a workplace instance.\n\nRisk: Write actions can alter or delete time-tracking records or change timesheet approval status.\n\nMitigation: Review each proposed change and require explicit user confirmation before performing writes.\n\nRisk: Installing the linked package and supplying a Tempo token grants software access to sensitive business data.\n\nMitigation: Install only if you trust the package and source, and protect the token from disclosure.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [tempo-api-mcp npm package](https://www.npmjs.com/package/tempo-api-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Natural-language responses based on Tempo tool results]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Results and available actions depend on the token's Tempo and Jira permissions.]\n\n## Skill Version(s):\n\n3.2.3 (source: server-resolved ClawHub release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.2.2: 3 files, 7240 bytes\n\nFiles: skill-card.md (1919b), SKILL.md (15283b), _meta.json (132b)\n\nFile v3.2.2:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, timeSpentSeconds?, description?, attributes?, ...)` | Update an existing worklog — pass only what changes; omitted fields keep their current values |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan — omitted fields keep their current values |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name?, ...)` | Update a team — omitted fields keep their current values |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name?, ...)` | Update an account — omitted fields keep their current values |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's timesheet |\n| `tempo_search_timesheet_approval_logs(..., view?)` | Search approval audit logs |\n| `tempo_submit_timesheet(accountId, from, to?, ...)` | Submit a timesheet for approval |\n| `tempo_approve_timesheet(accountId, from, to?, ...)` | Approve a submitted timesheet |\n| `tempo_reject_timesheet(accountId, from, to?, ...)` | Reject a submitted timesheet |\n| `tempo_reopen_timesheet(accountId, from, to?, ...)` | Reopen an approved timesheet |\n| `tempo_recall_timesheet(accountId, from, to?, ...)` | Recall your own unapproved timesheet |\n| `tempo_get_periods(from, to, view?)` | Get Tempo period definitions |\n| `tempo_get_user_schedule(accountId, from, to, view?)` | Get a user's work schedule |\n| `tempo_get_global_configuration(view?)` | Get global Tempo settings |\n| `tempo_get_work_attributes(view?)` | List custom worklog attributes |\n| `tempo_get_roles(view?)` | List all Tempo roles |\n| `tempo_healthcheck()` | Is this connector working? Reports which credential resolved, whether api.tempo.io accepted it, and what to fix. Start here when another tool fails — an empty result can mean \"no data\" or \"never authenticated\", and this separates them. |\n\n## Response shape (`view`)\n\nEvery read tool takes `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault** — you get the slim rung without asking for it. That is 30 of this\nserver's 48 tools; the seventeen confirmation-gated writes and `tempo_healthcheck`\nhave no `view`.\n\n**Compact here is media stripping, not a field projection**, and the\ndifference is the thing to know before you rely on it. `src/view.ts` says so\noutright: this repo holds no captured Tempo payload and no documented field\nlist, so nothing in it can honestly claim to know which of Tempo's fields\nmatter and which are noise. Compact therefore does the one projection that\nneeds no such knowledge — it removes keys whose value is a picture (`avatar`,\n`picture`, `photo`, `icon`, `logo`, and their `Url` / `Uri` / `Link` forms)\nalong with bare image URLs. That is SUBTRACTIVE, so it cannot lose a field\nnobody knew about, which is what an invented field list would have risked: a\nworklog coming back with holes in it and reading like a verified answer.\n\n**The surprise to expect is that compact often changes nothing.** Tempo is a\ntime-tracking API — worklogs, plans, periods, approval logs — and a payload\nwith no picture in it comes back byte-identical on both rungs. So do not read\na short response as evidence that fields were withheld, and do not reach for\n`full` hoping a field you wanted is hiding behind it. If it is not in compact\nand it is not an image URL, Tempo did not send it.\n\n`view: \"full\"` returns Tempo's payload untouched. There is deliberately **no\n`raw` rung**: nothing here re-serialises or normalises a response, so `full`\nalready IS the upstream payload, and a third value would silently alias one\nthat exists.\n\nThe tools without `view` have it for two distinct reasons, neither of them an\noversight:\n\n- **The seventeen writes** — every `tempo_create_*` / `tempo_update_*` /\n  `tempo_delete_*` plus `submit` / `approve` / `reject` / `reopen` / `recall`\n  — answer with a receipt: a confirmation preview, or an id and a status. There is\n  nothing in a receipt to strip and everything in it to keep.\n- **`tempo_healthcheck`** returns a diagnostic verdict — which credential\n  resolved, whether `api.tempo.io` accepted it, what to fix. Same reasoning,\n  and it is the one read-only tool in that group.\n\nPassing `view` to one of those is not an error and does not fail: the tool\ndoes not declare it, so zod drops the unknown key and the call runs exactly as\nit would have. You get no warning, so do not treat a successful call as\nevidence the rung was honoured.\n\n## Workflows\n\n**Log time for today:**\n```\ntempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)\n```\n\n**See this week's time for a user:**\n```\ntempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")\n```\n\n**Check resource plan for a project:**\n```\ntempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])\n```\n\n**Find all worklogs for an issue:**\n```\ntempo_get_worklogs_by_issue(issueId: 456, from: \"2026-01-01\")\n```\n\n**Review pending timesheet approvals:**\n```\ntempo_get_timesheet_approvals_waiting()\ntempo_get_timesheet_approval_status(accountId, from: \"2026-03-01\", to: \"2026-03-31\")\n```\n\n**Act on a timesheet (all five actions ask the user to confirm first — see Confirmations below):**\n```\ntempo_get_periods(from: \"2026-03-01\", to: \"2026-03-31\")   # find the period boundaries\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\")\n# → on a client without confirmation prompts: status \"confirmation-required\", a preview, and a confirmToken\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\", confirmToken: \"<token>\")\n```\n\n**Chase a team's outstanding timesheets for a period:**\n```\ntempo_get_timesheet_approvals_by_team(teamId: 42, from: \"2026-03-01\", to: \"2026-03-31\")\ntempo_get_timesheet_reviewers(accountId)   # who to route a submission to\n```\n\n## Confirmations\n\nEvery write — each `tempo_create_*` / `tempo_update_*` / `tempo_delete_*` and the\nfive timesheet actions — asks the user to confirm before it changes anything.\nA client that can show a confirmation prompt (Claude Code) shows one, and the\nwrite runs once the user accepts. A client that cannot (claude.ai, Claude\nDesktop) gets two steps instead: the first call does nothing and returns\n`status: \"confirmation-required\"`, a `preview` of exactly what would be sent\n(method, path, `willSend` body, `willSendQuery`), and a `confirmToken`; only a\nrepeat call with the same arguments plus that `confirmToken` performs the write.\n\n- Under the default `MCP_CONFIRM_MODE=ask-user`, show the user the preview and\n  get their approval in chat before making the second call.\n- A token is single-use and expires (default 10 minutes). Reusing one fails\n  with `TOKEN_REUSED`; changing any argument — or, for an update, the resource\n  being edited upstream in between — fails with `DRAFT_CHANGED` and returns a\n  fresh preview and token.\n- With `MCP_CONFIRM_MODE=refuse`, writes are refused on such clients\n  (`reason: \"confirmation-unsupported\"`).\n\n## Notes\n\n- `timeSpentSeconds` is always an integer (e.g. `3600` = 1 hour, `1800` = 30 min)\n- `authorAccountId` is the Atlassian account id (not a username) — required for all worklog operations\n- `tempo_get_plans` requires both `from` and `to` — no other filter is mandatory\n- `tempo_get_periods` requires both `from` and `to`; `tempo_get_timesheet_approval_status` requires `from` (`to` optional) — the API rejects these calls without a period\n- Default pagination limit is 50 for most endpoints; use `offset` + `limit` to page through results\n- Accounts are addressed **two different ways**: `tempo_get_account` takes the numeric `id`, while update and delete take the string `key`. Resolve a key to an id with `tempo_search_accounts(keys: [\"ACCOUNT-123\"])`\n- `tempo_delete_worklog` is a hard delete — there is no restore\n- Timesheet actions take the period as `from` (required) + `to` (optional) — they apply to a whole period, not an individual worklog. `submit`/`recall` are the timesheet owner's actions; `approve`/`reject`/`reopen` require reviewer permissions\n- `recall` pulls back a timesheet that is still waiting for approval; `reopen` undoes an approval that already went through\n\n## Acknowledgement of Terms\n\nBy using this MCP server, you acknowledge and agree to the following:\n\n**1. This server accesses your own Tempo account via Tempo's official API.** Auth happens via your own per-user OAuth/API token, issued by your Tempo/Jira instance. It does not — and cannot — access anyone else's worklogs or your colleagues' time entries.\n\n**2. [Tempo's Terms of Use](https://www.tempo.io/terms-of-use) govern your use of this server**. The clauses most relevant here:\n\n> Your registration is solely for your personal use, and you shall not authorize others to use your account.\n\nAnd: users must not \"automate the use of the Service, such as by using scripts\" — *except* via documented APIs (Section 5.3.2(v)). API tokens are the sanctioned automation mechanism — that's what this server uses.\n\nYou are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.\n\n**3. Personal, single-user use only.** This project is not affiliated with, endorsed by, sponsored by, or in partnership with Tempo Software ehf or Atlassian. It is a personal automation tool for one Tempo-licensed user to drive their own worklogs and reports. Do not use it to log time on behalf of colleagues, to bulk-export reports across an org for resale, or to share your token with anyone else.\n\n**4. Your token is yours alone.** Tempo issues per-user OAuth/API tokens; **do not commit `TEMPO_API_TOKEN` to git**, do not paste it in shared chats, and rotate it if it's ever exposed.\n\n**5. Your employer's policy may add restrictions.** Tempo is typically licensed via Jira to an organization. Your employer may have IT/security/acceptable-use policies that further restrict scripted automation against Jira/Tempo — even when Tempo's own ToU allows it. **Check with your employer's IT/Jira admin** before automating against a corporate Tempo instance.\n\n**6. You accept full responsibility** for any consequences of using this server in connection with your Tempo account — rate limiting, token revocation, account warnings, your IT admin emailing you, or any enforcement action. If Tempo or your employer objects to your use, stop using this server.\n\nThis section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Tempo's actual ToU or your employer's policies.\n\nFile v3.2.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.2.2\",\n  \"publishedAt\": 1790991845693\n}\n\nFile v3.2.2:skill-card.md\n\n## Description:\n\nConnects an agent to Tempo for time tracking, resource planning, and timesheet management.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nTempo users and developers can ask an agent to review worklogs, plans, teams, accounts, and timesheet approvals, or to make authorized changes to them.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: A privileged Tempo token may expose coworker worklogs, teams, accounts, projects, and approval data.\n\nMitigation: Use a least-privilege token where possible and review access to sensitive data before using the skill.\n\nRisk: A leaked Tempo API token could grant access to time-tracking data.\n\nMitigation: Keep the token out of shared repositories and chats; rotate it if exposed.\n\nRisk: Create, update, delete, and timesheet approval actions can change or remove records.\n\nMitigation: Review the action preview and confirm only intended changes, especially deletions and approval decisions.\n\n## Reference(s):\n\n- [Tempo API MCP on ClawHub](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [Tempo API MCP npm package](https://www.npmjs.com/package/tempo-api-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Configuration guidance]\n\n**Output Format:** [Conversational text or Markdown, with configuration examples when needed]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Responses depend on the connected Tempo account's permissions.]\n\n## Skill Version(s):\n\n3.2.2 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.2.1: 3 files, 7227 bytes\n\nFiles: skill-card.md (1894b), SKILL.md (15283b), _meta.json (132b)\n\nFile v3.2.1:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, timeSpentSeconds?, description?, attributes?, ...)` | Update an existing worklog — pass only what changes; omitted fields keep their current values |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan — omitted fields keep their current values |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name?, ...)` | Update a team — omitted fields keep their current values |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name?, ...)` | Update an account — omitted fields keep their current values |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's timesheet |\n| `tempo_search_timesheet_approval_logs(..., view?)` | Search approval audit logs |\n| `tempo_submit_timesheet(accountId, from, to?, ...)` | Submit a timesheet for approval |\n| `tempo_approve_timesheet(accountId, from, to?, ...)` | Approve a submitted timesheet |\n| `tempo_reject_timesheet(accountId, from, to?, ...)` | Reject a submitted timesheet |\n| `tempo_reopen_timesheet(accountId, from, to?, ...)` | Reopen an approved timesheet |\n| `tempo_recall_timesheet(accountId, from, to?, ...)` | Recall your own unapproved timesheet |\n| `tempo_get_periods(from, to, view?)` | Get Tempo period definitions |\n| `tempo_get_user_schedule(accountId, from, to, view?)` | Get a user's work schedule |\n| `tempo_get_global_configuration(view?)` | Get global Tempo settings |\n| `tempo_get_work_attributes(view?)` | List custom worklog attributes |\n| `tempo_get_roles(view?)` | List all Tempo roles |\n| `tempo_healthcheck()` | Is this connector working? Reports which credential resolved, whether api.tempo.io accepted it, and what to fix. Start here when another tool fails — an empty result can mean \"no data\" or \"never authenticated\", and this separates them. |\n\n## Response shape (`view`)\n\nEvery read tool takes `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault** — you get the slim rung without asking for it. That is 30 of this\nserver's 48 tools; the seventeen confirmation-gated writes and `tempo_healthcheck`\nhave no `view`.\n\n**Compact here is media stripping, not a field projection**, and the\ndifference is the thing to know before you rely on it. `src/view.ts` says so\noutright: this repo holds no captured Tempo payload and no documented field\nlist, so nothing in it can honestly claim to know which of Tempo's fields\nmatter and which are noise. Compact therefore does the one projection that\nneeds no such knowledge — it removes keys whose value is a picture (`avatar`,\n`picture`, `photo`, `icon`, `logo`, and their `Url` / `Uri` / `Link` forms)\nalong with bare image URLs. That is SUBTRACTIVE, so it cannot lose a field\nnobody knew about, which is what an invented field list would have risked: a\nworklog coming back with holes in it and reading like a verified answer.\n\n**The surprise to expect is that compact often changes nothing.** Tempo is a\ntime-tracking API — worklogs, plans, periods, approval logs — and a payload\nwith no picture in it comes back byte-identical on both rungs. So do not read\na short response as evidence that fields were withheld, and do not reach for\n`full` hoping a field you wanted is hiding behind it. If it is not in compact\nand it is not an image URL, Tempo did not send it.\n\n`view: \"full\"` returns Tempo's payload untouched. There is deliberately **no\n`raw` rung**: nothing here re-serialises or normalises a response, so `full`\nalready IS the upstream payload, and a third value would silently alias one\nthat exists.\n\nThe tools without `view` have it for two distinct reasons, neither of them an\noversight:\n\n- **The seventeen writes** — every `tempo_create_*` / `tempo_update_*` /\n  `tempo_delete_*` plus `submit` / `approve` / `reject` / `reopen` / `recall`\n  — answer with a receipt: a confirmation preview, or an id and a status. There is\n  nothing in a receipt to strip and everything in it to keep.\n- **`tempo_healthcheck`** returns a diagnostic verdict — which credential\n  resolved, whether `api.tempo.io` accepted it, what to fix. Same reasoning,\n  and it is the one read-only tool in that group.\n\nPassing `view` to one of those is not an error and does not fail: the tool\ndoes not declare it, so zod drops the unknown key and the call runs exactly as\nit would have. You get no warning, so do not treat a successful call as\nevidence the rung was honoured.\n\n## Workflows\n\n**Log time for today:**\n```\ntempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)\n```\n\n**See this week's time for a user:**\n```\ntempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")\n```\n\n**Check resource plan for a project:**\n```\ntempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])\n```\n\n**Find all worklogs for an issue:**\n```\ntempo_get_worklogs_by_issue(issueId: 456, from: \"2026-01-01\")\n```\n\n**Review pending timesheet approvals:**\n```\ntempo_get_timesheet_approvals_waiting()\ntempo_get_timesheet_approval_status(accountId, from: \"2026-03-01\", to: \"2026-03-31\")\n```\n\n**Act on a timesheet (all five actions ask the user to confirm first — see Confirmations below):**\n```\ntempo_get_periods(from: \"2026-03-01\", to: \"2026-03-31\")   # find the period boundaries\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\")\n# → on a client without confirmation prompts: status \"confirmation-required\", a preview, and a confirmToken\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\", confirmToken: \"<token>\")\n```\n\n**Chase a team's outstanding timesheets for a period:**\n```\ntempo_get_timesheet_approvals_by_team(teamId: 42, from: \"2026-03-01\", to: \"2026-03-31\")\ntempo_get_timesheet_reviewers(accountId)   # who to route a submission to\n```\n\n## Confirmations\n\nEvery write — each `tempo_create_*` / `tempo_update_*` / `tempo_delete_*` and the\nfive timesheet actions — asks the user to confirm before it changes anything.\nA client that can show a confirmation prompt (Claude Code) shows one, and the\nwrite runs once the user accepts. A client that cannot (claude.ai, Claude\nDesktop) gets two steps instead: the first call does nothing and returns\n`status: \"confirmation-required\"`, a `preview` of exactly what would be sent\n(method, path, `willSend` body, `willSendQuery`), and a `confirmToken`; only a\nrepeat call with the same arguments plus that `confirmToken` performs the write.\n\n- Under the default `MCP_CONFIRM_MODE=ask-user`, show the user the preview and\n  get their approval in chat before making the second call.\n- A token is single-use and expires (default 10 minutes). Reusing one fails\n  with `TOKEN_REUSED`; changing any argument — or, for an update, the resource\n  being edited upstream in between — fails with `DRAFT_CHANGED` and returns a\n  fresh preview and token.\n- With `MCP_CONFIRM_MODE=refuse`, writes are refused on such clients\n  (`reason: \"confirmation-unsupported\"`).\n\n## Notes\n\n- `timeSpentSeconds` is always an integer (e.g. `3600` = 1 hour, `1800` = 30 min)\n- `authorAccountId` is the Atlassian account id (not a username) — required for all worklog operations\n- `tempo_get_plans` requires both `from` and `to` — no other filter is mandatory\n- `tempo_get_periods` requires both `from` and `to`; `tempo_get_timesheet_approval_status` requires `from` (`to` optional) — the API rejects these calls without a period\n- Default pagination limit is 50 for most endpoints; use `offset` + `limit` to page through results\n- Accounts are addressed **two different ways**: `tempo_get_account` takes the numeric `id`, while update and delete take the string `key`. Resolve a key to an id with `tempo_search_accounts(keys: [\"ACCOUNT-123\"])`\n- `tempo_delete_worklog` is a hard delete — there is no restore\n- Timesheet actions take the period as `from` (required) + `to` (optional) — they apply to a whole period, not an individual worklog. `submit`/`recall` are the timesheet owner's actions; `approve`/`reject`/`reopen` require reviewer permissions\n- `recall` pulls back a timesheet that is still waiting for approval; `reopen` undoes an approval that already went through\n\n## Acknowledgement of Terms\n\nBy using this MCP server, you acknowledge and agree to the following:\n\n**1. This server accesses your own Tempo account via Tempo's official API.** Auth happens via your own per-user OAuth/API token, issued by your Tempo/Jira instance. It does not — and cannot — access anyone else's worklogs or your colleagues' time entries.\n\n**2. [Tempo's Terms of Use](https://www.tempo.io/terms-of-use) govern your use of this server**. The clauses most relevant here:\n\n> Your registration is solely for your personal use, and you shall not authorize others to use your account.\n\nAnd: users must not \"automate the use of the Service, such as by using scripts\" — *except* via documented APIs (Section 5.3.2(v)). API tokens are the sanctioned automation mechanism — that's what this server uses.\n\nYou are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.\n\n**3. Personal, single-user use only.** This project is not affiliated with, endorsed by, sponsored by, or in partnership with Tempo Software ehf or Atlassian. It is a personal automation tool for one Tempo-licensed user to drive their own worklogs and reports. Do not use it to log time on behalf of colleagues, to bulk-export reports across an org for resale, or to share your token with anyone else.\n\n**4. Your token is yours alone.** Tempo issues per-user OAuth/API tokens; **do not commit `TEMPO_API_TOKEN` to git**, do not paste it in shared chats, and rotate it if it's ever exposed.\n\n**5. Your employer's policy may add restrictions.** Tempo is typically licensed via Jira to an organization. Your employer may have IT/security/acceptable-use policies that further restrict scripted automation against Jira/Tempo — even when Tempo's own ToU allows it. **Check with your employer's IT/Jira admin** before automating against a corporate Tempo instance.\n\n**6. You accept full responsibility** for any consequences of using this server in connection with your Tempo account — rate limiting, token revocation, account warnings, your IT admin emailing you, or any enforcement action. If Tempo or your employer objects to your use, stop using this server.\n\nThis section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Tempo's actual ToU or your employer's policies.\n\nFile v3.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.2.1\",\n  \"publishedAt\": 1790351780221\n}\n\nFile v3.2.1:skill-card.md\n\n## Description:\n\nHelps agents use Tempo through an MCP server to review worklogs and resource plans, log time, and manage permitted timesheet actions.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nTempo users and authorized reviewers can query time entries and resource plans, log time, and manage timesheet approvals within their granted permissions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: A Tempo token may expose more team, account, and timesheet data than expected.\n\nMitigation: Review token permissions before installation, use a least-privilege token, and limit team-wide queries to authorized tasks.\n\nRisk: Delete operations, account or team changes, and timesheet approval actions can affect other records.\n\nMitigation: Review the target and proposed changes, then obtain explicit confirmation before each write.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [Tempo API MCP npm package](https://www.npmjs.com/package/tempo-api-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Configuration instructions, Shell commands]\n\n**Output Format:** [Markdown with configuration and command examples; Tempo tool results in text or structured data]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include worklogs, plans, team and account data, and timesheet status; changes require confirmation.]\n\n## Skill Version(s):\n\n3.2.1 (source: server-resolved release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.2.0: 3 files, 7264 bytes\n\nFiles: skill-card.md (1898b), SKILL.md (15283b), _meta.json (132b)\n\nFile v3.2.0:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, timeSpentSeconds?, description?, attributes?, ...)` | Update an existing worklog — pass only what changes; omitted fields keep their current values |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan — omitted fields keep their current values |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name?, ...)` | Update a team — omitted fields keep their current values |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name?, ...)` | Update an account — omitted fields keep their current values |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's timesheet |\n| `tempo_search_timesheet_approval_logs(..., view?)` | Search approval audit logs |\n| `tempo_submit_timesheet(accountId, from, to?, ...)` | Submit a timesheet for approval |\n| `tempo_approve_timesheet(accountId, from, to?, ...)` | Approve a submitted timesheet |\n| `tempo_reject_timesheet(accountId, from, to?, ...)` | Reject a submitted timesheet |\n| `tempo_reopen_timesheet(accountId, from, to?, ...)` | Reopen an approved timesheet |\n| `tempo_recall_timesheet(accountId, from, to?, ...)` | Recall your own unapproved timesheet |\n| `tempo_get_periods(from, to, view?)` | Get Tempo period definitions |\n| `tempo_get_user_schedule(accountId, from, to, view?)` | Get a user's work schedule |\n| `tempo_get_global_configuration(view?)` | Get global Tempo settings |\n| `tempo_get_work_attributes(view?)` | List custom worklog attributes |\n| `tempo_get_roles(view?)` | List all Tempo roles |\n| `tempo_healthcheck()` | Is this connector working? Reports which credential resolved, whether api.tempo.io accepted it, and what to fix. Start here when another tool fails — an empty result can mean \"no data\" or \"never authenticated\", and this separates them. |\n\n## Response shape (`view`)\n\nEvery read tool takes `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault** — you get the slim rung without asking for it. That is 30 of this\nserver's 48 tools; the seventeen confirmation-gated writes and `tempo_healthcheck`\nhave no `view`.\n\n**Compact here is media stripping, not a field projection**, and the\ndifference is the thing to know before you rely on it. `src/view.ts` says so\noutright: this repo holds no captured Tempo payload and no documented field\nlist, so nothing in it can honestly claim to know which of Tempo's fields\nmatter and which are noise. Compact therefore does the one projection that\nneeds no such knowledge — it removes keys whose value is a picture (`avatar`,\n`picture`, `photo`, `icon`, `logo`, and their `Url` / `Uri` / `Link` forms)\nalong with bare image URLs. That is SUBTRACTIVE, so it cannot lose a field\nnobody knew about, which is what an invented field list would have risked: a\nworklog coming back with holes in it and reading like a verified answer.\n\n**The surprise to expect is that compact often changes nothing.** Tempo is a\ntime-tracking API — worklogs, plans, periods, approval logs — and a payload\nwith no picture in it comes back byte-identical on both rungs. So do not read\na short response as evidence that fields were withheld, and do not reach for\n`full` hoping a field you wanted is hiding behind it. If it is not in compact\nand it is not an image URL, Tempo did not send it.\n\n`view: \"full\"` returns Tempo's payload untouched. There is deliberately **no\n`raw` rung**: nothing here re-serialises or normalises a response, so `full`\nalready IS the upstream payload, and a third value would silently alias one\nthat exists.\n\nThe tools without `view` have it for two distinct reasons, neither of them an\noversight:\n\n- **The seventeen writes** — every `tempo_create_*` / `tempo_update_*` /\n  `tempo_delete_*` plus `submit` / `approve` / `reject` / `reopen` / `recall`\n  — answer with a receipt: a confirmation preview, or an id and a status. There is\n  nothing in a receipt to strip and everything in it to keep.\n- **`tempo_healthcheck`** returns a diagnostic verdict — which credential\n  resolved, whether `api.tempo.io` accepted it, what to fix. Same reasoning,\n  and it is the one read-only tool in that group.\n\nPassing `view` to one of those is not an error and does not fail: the tool\ndoes not declare it, so zod drops the unknown key and the call runs exactly as\nit would have. You get no warning, so do not treat a successful call as\nevidence the rung was honoured.\n\n## Workflows\n\n**Log time for today:**\n```\ntempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)\n```\n\n**See this week's time for a user:**\n```\ntempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")\n```\n\n**Check resource plan for a project:**\n```\ntempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])\n```\n\n**Find all worklogs for an issue:**\n```\ntempo_get_worklogs_by_issue(issueId: 456, from: \"2026-01-01\")\n```\n\n**Review pending timesheet approvals:**\n```\ntempo_get_timesheet_approvals_waiting()\ntempo_get_timesheet_approval_status(accountId, from: \"2026-03-01\", to: \"2026-03-31\")\n```\n\n**Act on a timesheet (all five actions ask the user to confirm first — see Confirmations below):**\n```\ntempo_get_periods(from: \"2026-03-01\", to: \"2026-03-31\")   # find the period boundaries\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\")\n# → on a client without confirmation prompts: status \"confirmation-required\", a preview, and a confirmToken\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\", confirmToken: \"<token>\")\n```\n\n**Chase a team's outstanding timesheets for a period:**\n```\ntempo_get_timesheet_approvals_by_team(teamId: 42, from: \"2026-03-01\", to: \"2026-03-31\")\ntempo_get_timesheet_reviewers(accountId)   # who to route a submission to\n```\n\n## Confirmations\n\nEvery write — each `tempo_create_*` / `tempo_update_*` / `tempo_delete_*` and the\nfive timesheet actions — asks the user to confirm before it changes anything.\nA client that can show a confirmation prompt (Claude Code) shows one, and the\nwrite runs once the user accepts. A client that cannot (claude.ai, Claude\nDesktop) gets two steps instead: the first call does nothing and returns\n`status: \"confirmation-required\"`, a `preview` of exactly what would be sent\n(method, path, `willSend` body, `willSendQuery`), and a `confirmToken`; only a\nrepeat call with the same arguments plus that `confirmToken` performs the write.\n\n- Under the default `MCP_CONFIRM_MODE=ask-user`, show the user the preview and\n  get their approval in chat before making the second call.\n- A token is single-use and expires (default 10 minutes). Reusing one fails\n  with `TOKEN_REUSED`; changing any argument — or, for an update, the resource\n  being edited upstream in between — fails with `DRAFT_CHANGED` and returns a\n  fresh preview and token.\n- With `MCP_CONFIRM_MODE=refuse`, writes are refused on such clients\n  (`reason: \"confirmation-unsupported\"`).\n\n## Notes\n\n- `timeSpentSeconds` is always an integer (e.g. `3600` = 1 hour, `1800` = 30 min)\n- `authorAccountId` is the Atlassian account id (not a username) — required for all worklog operations\n- `tempo_get_plans` requires both `from` and `to` — no other filter is mandatory\n- `tempo_get_periods` requires both `from` and `to`; `tempo_get_timesheet_approval_status` requires `from` (`to` optional) — the API rejects these calls without a period\n- Default pagination limit is 50 for most endpoints; use `offset` + `limit` to page through results\n- Accounts are addressed **two different ways**: `tempo_get_account` takes the numeric `id`, while update and delete take the string `key`. Resolve a key to an id with `tempo_search_accounts(keys: [\"ACCOUNT-123\"])`\n- `tempo_delete_worklog` is a hard delete — there is no restore\n- Timesheet actions take the period as `from` (required) + `to` (optional) — they apply to a whole period, not an individual worklog. `submit`/`recall` are the timesheet owner's actions; `approve`/`reject`/`reopen` require reviewer permissions\n- `recall` pulls back a timesheet that is still waiting for approval; `reopen` undoes an approval that already went through\n\n## Acknowledgement of Terms\n\nBy using this MCP server, you acknowledge and agree to the following:\n\n**1. This server accesses your own Tempo account via Tempo's official API.** Auth happens via your own per-user OAuth/API token, issued by your Tempo/Jira instance. It does not — and cannot — access anyone else's worklogs or your colleagues' time entries.\n\n**2. [Tempo's Terms of Use](https://www.tempo.io/terms-of-use) govern your use of this server**. The clauses most relevant here:\n\n> Your registration is solely for your personal use, and you shall not authorize others to use your account.\n\nAnd: users must not \"automate the use of the Service, such as by using scripts\" — *except* via documented APIs (Section 5.3.2(v)). API tokens are the sanctioned automation mechanism — that's what this server uses.\n\nYou are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.\n\n**3. Personal, single-user use only.** This project is not affiliated with, endorsed by, sponsored by, or in partnership with Tempo Software ehf or Atlassian. It is a personal automation tool for one Tempo-licensed user to drive their own worklogs and reports. Do not use it to log time on behalf of colleagues, to bulk-export reports across an org for resale, or to share your token with anyone else.\n\n**4. Your token is yours alone.** Tempo issues per-user OAuth/API tokens; **do not commit `TEMPO_API_TOKEN` to git**, do not paste it in shared chats, and rotate it if it's ever exposed.\n\n**5. Your employer's policy may add restrictions.** Tempo is typically licensed via Jira to an organization. Your employer may have IT/security/acceptable-use policies that further restrict scripted automation against Jira/Tempo — even when Tempo's own ToU allows it. **Check with your employer's IT/Jira admin** before automating against a corporate Tempo instance.\n\n**6. You accept full responsibility** for any consequences of using this server in connection with your Tempo account — rate limiting, token revocation, account warnings, your IT admin emailing you, or any enforcement action. If Tempo or your employer objects to your use, stop using this server.\n\nThis section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Tempo's actual ToU or your employer's policies.\n\nFile v3.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.2.0\",\n  \"publishedAt\": 1790262680085\n}\n\nFile v3.2.0:skill-card.md\n\n## Description:\n\nAccess Tempo time-tracking data via MCP for worklogs, plans, teams, accounts, resource allocations, and timesheet approvals.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Tempo users use this skill to connect an agent to Tempo so it can retrieve time-tracking data, manage worklogs and plans, and handle timesheet approval workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The Tempo token may allow access to or modification of team and coworker time data when the account has those permissions.\n\nMitigation: Use a least-privileged Tempo token and review team, account, delete, and approval actions before allowing them to run.\n\nRisk: The bundled terms section understates the possibility of broader Tempo access through account permissions.\n\nMitigation: Do not rely on self-only access claims; treat all reachable Tempo data as governed by the token's actual permissions.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [npm package](https://www.npmjs.com/package/tempo-api-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands, Configuration, API calls, Guidance]\n\n**Output Format:** [Markdown with inline JSON and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read tools support compact or full views; write actions use confirmation previews or receipts.]\n\n## Skill Version(s):\n\n3.2.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.1.2: 3 files, 6820 bytes\n\nFiles: skill-card.md (2212b), SKILL.md (13985b), _meta.json (132b)\n\nFile v3.1.2:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, timeSpentSeconds?, description?, attributes?, ...)` | Update an existing worklog — pass only what changes; omitted fields keep their current values |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan — omitted fields keep their current values |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name?, ...)` | Update a team — omitted fields keep their current values |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name?, ...)` | Update an account — omitted fields keep their current values |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's timesheet |\n| `tempo_search_timesheet_approval_logs(..., view?)` | Search approval audit logs |\n| `tempo_submit_timesheet(accountId, from, to?, ...)` | Submit a timesheet for approval |\n| `tempo_approve_timesheet(accountId, from, to?, ...)` | Approve a submitted timesheet |\n| `tempo_reject_timesheet(accountId, from, to?, ...)` | Reject a submitted timesheet |\n| `tempo_reopen_timesheet(accountId, from, to?, ...)` | Reopen an approved timesheet |\n| `tempo_recall_timesheet(accountId, from, to?, ...)` | Recall your own unapproved timesheet |\n| `tempo_get_periods(from, to, view?)` | Get Tempo period definitions |\n| `tempo_get_user_schedule(accountId, from, to, view?)` | Get a user's work schedule |\n| `tempo_get_global_configuration(view?)` | Get global Tempo settings |\n| `tempo_get_work_attributes(view?)` | List custom worklog attributes |\n| `tempo_get_roles(view?)` | List all Tempo roles |\n| `tempo_healthcheck()` | Is this connector working? Reports which credential resolved, whether api.tempo.io accepted it, and what to fix. Start here when another tool fails — an empty result can mean \"no data\" or \"never authenticated\", and this separates them. |\n\n## Response shape (`view`)\n\nEvery read tool takes `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault** — you get the slim rung without asking for it. That is 30 of this\nserver's 48 tools; the seventeen confirm-gated writes and `tempo_healthcheck`\nhave no `view`.\n\n**Compact here is media stripping, not a field projection**, and the\ndifference is the thing to know before you rely on it. `src/view.ts` says so\noutright: this repo holds no captured Tempo payload and no documented field\nlist, so nothing in it can honestly claim to know which of Tempo's fields\nmatter and which are noise. Compact therefore does the one projection that\nneeds no such knowledge — it removes keys whose value is a picture (`avatar`,\n`picture`, `photo`, `icon`, `logo`, and their `Url` / `Uri` / `Link` forms)\nalong with bare image URLs. That is SUBTRACTIVE, so it cannot lose a field\nnobody knew about, which is what an invented field list would have risked: a\nworklog coming back with holes in it and reading like a verified answer.\n\n**The surprise to expect is that compact often changes nothing.** Tempo is a\ntime-tracking API — worklogs, plans, periods, approval logs — and a payload\nwith no picture in it comes back byte-identical on both rungs. So do not read\na short response as evidence that fields were withheld, and do not reach for\n`full` hoping a field you wanted is hiding behind it. If it is not in compact\nand it is not an image URL, Tempo did not send it.\n\n`view: \"full\"` returns Tempo's payload untouched. There is deliberately **no\n`raw` rung**: nothing here re-serialises or normalises a response, so `full`\nalready IS the upstream payload, and a third value would silently alias one\nthat exists.\n\nThe tools without `view` have it for two distinct reasons, neither of them an\noversight:\n\n- **The seventeen writes** — every `tempo_create_*` / `tempo_update_*` /\n  `tempo_delete_*` plus `submit` / `approve` / `reject` / `reopen` / `recall`\n  — answer with a receipt: a dry-run preview, or an id and a status. There is\n  nothing in a receipt to strip and everything in it to keep.\n- **`tempo_healthcheck`** returns a diagnostic verdict — which credential\n  resolved, whether `api.tempo.io` accepted it, what to fix. Same reasoning,\n  and it is the one read-only tool in that group.\n\nPassing `view` to one of those is not an error and does not fail: the tool\ndoes not declare it, so zod drops the unknown key and the call runs exactly as\nit would have. You get no warning, so do not treat a successful call as\nevidence the rung was honoured.\n\n## Workflows\n\n**Log time for today:**\n```\ntempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)\n```\n\n**See this week's time for a user:**\n```\ntempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")\n```\n\n**Check resource plan for a project:**\n```\ntempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])\n```\n\n**Find all worklogs for an issue:**\n```\ntempo_get_worklogs_by_issue(issueId: 456, from: \"2026-01-01\")\n```\n\n**Review pending timesheet approvals:**\n```\ntempo_get_timesheet_approvals_waiting()\ntempo_get_timesheet_approval_status(accountId, from: \"2026-03-01\", to: \"2026-03-31\")\n```\n\n**Act on a timesheet (all five actions are confirm-gated — the first call is a dry run):**\n```\ntempo_get_periods(from: \"2026-03-01\", to: \"2026-03-31\")   # find the period boundaries\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\")\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\", confirm: true)\n```\n\n**Chase a team's outstanding timesheets for a period:**\n```\ntempo_get_timesheet_approvals_by_team(teamId: 42, from: \"2026-03-01\", to: \"2026-03-31\")\ntempo_get_timesheet_reviewers(accountId)   # who to route a submission to\n```\n\n## Notes\n\n- `timeSpentSeconds` is always an integer (e.g. `3600` = 1 hour, `1800` = 30 min)\n- `authorAccountId` is the Atlassian account id (not a username) — required for all worklog operations\n- `tempo_get_plans` requires both `from` and `to` — no other filter is mandatory\n- `tempo_get_periods` requires both `from` and `to`; `tempo_get_timesheet_approval_status` requires `from` (`to` optional) — the API rejects these calls without a period\n- Default pagination limit is 50 for most endpoints; use `offset` + `limit` to page through results\n- Accounts are addressed **two different ways**: `tempo_get_account` takes the numeric `id`, while update and delete take the string `key`. Resolve a key to an id with `tempo_search_accounts(keys: [\"ACCOUNT-123\"])`\n- `tempo_delete_worklog` is a hard delete — there is no restore\n- Timesheet actions take the period as `from` (required) + `to` (optional) — they apply to a whole period, not an individual worklog. `submit`/`recall` are the timesheet owner's actions; `approve`/`reject`/`reopen` require reviewer permissions\n- `recall` pulls back a timesheet that is still waiting for approval; `reopen` undoes an approval that already went through\n\n## Acknowledgement of Terms\n\nBy using this MCP server, you acknowledge and agree to the following:\n\n**1. This server accesses your own Tempo account via Tempo's official API.** Auth happens via your own per-user OAuth/API token, issued by your Tempo/Jira instance. It does not — and cannot — access anyone else's worklogs or your colleagues' time entries.\n\n**2. [Tempo's Terms of Use](https://www.tempo.io/terms-of-use) govern your use of this server**. The clauses most relevant here:\n\n> Your registration is solely for your personal use, and you shall not authorize others to use your account.\n\nAnd: users must not \"automate the use of the Service, such as by using scripts\" — *except* via documented APIs (Section 5.3.2(v)). API tokens are the sanctioned automation mechanism — that's what this server uses.\n\nYou are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.\n\n**3. Personal, single-user use only.** This project is not affiliated with, endorsed by, sponsored by, or in partnership with Tempo Software ehf or Atlassian. It is a personal automation tool for one Tempo-licensed user to drive their own worklogs and reports. Do not use it to log time on behalf of colleagues, to bulk-export reports across an org for resale, or to share your token with anyone else.\n\n**4. Your token is yours alone.** Tempo issues per-user OAuth/API tokens; **do not commit `TEMPO_API_TOKEN` to git**, do not paste it in shared chats, and rotate it if it's ever exposed.\n\n**5. Your employer's policy may add restrictions.** Tempo is typically licensed via Jira to an organization. Your employer may have IT/security/acceptable-use policies that further restrict scripted automation against Jira/Tempo — even when Tempo's own ToU allows it. **Check with your employer's IT/Jira admin** before automating against a corporate Tempo instance.\n\n**6. You accept full responsibility** for any consequences of using this server in connection with your Tempo account — rate limiting, token revocation, account warnings, your IT admin emailing you, or any enforcement action. If Tempo or your employer objects to your use, stop using this server.\n\nThis section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Tempo's actual ToU or your employer's policies.\n\nFile v3.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.1.2\",\n  \"publishedAt\": 1790199718455\n}\n\nFile v3.1.2:skill-card.md\n\n## Description:\n\nAccess Tempo time-tracking and resource-planning data through an MCP server for worklogs, plans, teams, accounts, projects, and timesheet approvals.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Tempo/Jira users use this skill to query and manage Tempo worklogs, resource plans, teams, accounts, projects, and timesheet approvals from an agent with a configured Tempo API token.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: A Tempo token may allow access to worklog, team, reviewer, account, and planning data beyond the immediate request.\n\nMitigation: Install with a least-privilege Tempo token and limit use to data the token holder is authorized to access.\n\nRisk: The connector can modify Tempo data, including deletes, approvals, rejections, reopens, and account or team changes.\n\nMitigation: Require explicit user confirmation before any destructive, approval, reviewer, account, or team change is executed.\n\nRisk: Team and colleague data may be exposed through the supplied token's permissions.\n\nMitigation: Confirm the intended scope before reading team or reviewer data and avoid bulk export or colleague-level reporting unless authorized.\n\n## Reference(s):\n\n- [tempo-api-mcp ClawHub skill page](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [tempo-api-mcp npm package](https://www.npmjs.com/package/tempo-api-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, configuration, API calls]\n\n**Output Format:** [Markdown with JSON and bash code blocks plus MCP tool-call guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Read tools can return compact or full Tempo payloads; write tools return receipts or dry-run previews.]\n\n## Skill Version(s):\n\n3.1.2 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.1.1: 3 files, 6737 bytes\n\nFiles: skill-card.md (2130b), SKILL.md (13779b), _meta.json (132b)\n\nFile v3.1.1:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, authorAccountId, startDate, timeSpentSeconds, ...)` | Update an existing worklog |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name, ...)` | Update a team |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name, ...)` | Update an account |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's timesheet |\n| `tempo_search_timesheet_approval_logs(..., view?)` | Search approval audit logs |\n| `tempo_submit_timesheet(accountId, from, to?, ...)` | Submit a timesheet for approval |\n| `tempo_approve_timesheet(accountId, from, to?, ...)` | Approve a submitted timesheet |\n| `tempo_reject_timesheet(accountId, from, to?, ...)` | Reject a submitted timesheet |\n| `tempo_reopen_timesheet(accountId, from, to?, ...)` | Reopen an approved timesheet |\n| `tempo_recall_timesheet(accountId, from, to?, ...)` | Recall your own unapproved timesheet |\n| `tempo_get_periods(from, to, view?)` | Get Tempo period definitions |\n| `tempo_get_user_schedule(accountId, from, to, view?)` | Get a user's work schedule |\n| `tempo_get_global_configuration(view?)` | Get global Tempo settings |\n| `tempo_get_work_attributes(view?)` | List custom worklog attributes |\n| `tempo_get_roles(view?)` | List all Tempo roles |\n| `tempo_healthcheck()` | Is this connector working? Reports which credential resolved, whether api.tempo.io accepted it, and what to fix. Start here when another tool fails — an empty result can mean \"no data\" or \"never authenticated\", and this separates them. |\n\n## Response shape (`view`)\n\nEvery read tool takes `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault** — you get the slim rung without asking for it. That is 30 of this\nserver's 48 tools; the seventeen confirm-gated writes and `tempo_healthcheck`\nhave no `view`.\n\n**Compact here is media stripping, not a field projection**, and the\ndifference is the thing to know before you rely on it. `src/view.ts` says so\noutright: this repo holds no captured Tempo payload and no documented field\nlist, so nothing in it can honestly claim to know which of Tempo's fields\nmatter and which are noise. Compact therefore does the one projection that\nneeds no such knowledge — it removes keys whose value is a picture (`avatar`,\n`picture`, `photo`, `icon`, `logo`, and their `Url` / `Uri` / `Link` forms)\nalong with bare image URLs. That is SUBTRACTIVE, so it cannot lose a field\nnobody knew about, which is what an invented field list would have risked: a\nworklog coming back with holes in it and reading like a verified answer.\n\n**The surprise to expect is that compact often changes nothing.** Tempo is a\ntime-tracking API — worklogs, plans, periods, approval logs — and a payload\nwith no picture in it comes back byte-identical on both rungs. So do not read\na short response as evidence that fields were withheld, and do not reach for\n`full` hoping a field you wanted is hiding behind it. If it is not in compact\nand it is not an image URL, Tempo did not send it.\n\n`view: \"full\"` returns Tempo's payload untouched. There is deliberately **no\n`raw` rung**: nothing here re-serialises or normalises a response, so `full`\nalready IS the upstream payload, and a third value would silently alias one\nthat exists.\n\nThe tools without `view` have it for two distinct reasons, neither of them an\noversight:\n\n- **The seventeen writes** — every `tempo_create_*` / `tempo_update_*` /\n  `tempo_delete_*` plus `submit` / `approve` / `reject` / `reopen` / `recall`\n  — answer with a receipt: a dry-run preview, or an id and a status. There is\n  nothing in a receipt to strip and everything in it to keep.\n- **`tempo_healthcheck`** returns a diagnostic verdict — which credential\n  resolved, whether `api.tempo.io` accepted it, what to fix. Same reasoning,\n  and it is the one read-only tool in that group.\n\nPassing `view` to one of those is not an error and does not fail: the tool\ndoes not declare it, so zod drops the unknown key and the call runs exactly as\nit would have. You get no warning, so do not treat a successful call as\nevidence the rung was honoured.\n\n## Workflows\n\n**Log time for today:**\n```\ntempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)\n```\n\n**See this week's time for a user:**\n```\ntempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")\n```\n\n**Check resource plan for a project:**\n```\ntempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])\n```\n\n**Find all worklogs for an issue:**\n```\ntempo_get_worklogs_by_issue(issueId: 456, from: \"2026-01-01\")\n```\n\n**Review pending timesheet approvals:**\n```\ntempo_get_timesheet_approvals_waiting()\ntempo_get_timesheet_approval_status(accountId, from: \"2026-03-01\", to: \"2026-03-31\")\n```\n\n**Act on a timesheet (all five actions are confirm-gated — the first call is a dry run):**\n```\ntempo_get_periods(from: \"2026-03-01\", to: \"2026-03-31\")   # find the period boundaries\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\")\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\", confirm: true)\n```\n\n**Chase a team's outstanding timesheets for a period:**\n```\ntempo_get_timesheet_approvals_by_team(teamId: 42, from: \"2026-03-01\", to: \"2026-03-31\")\ntempo_get_timesheet_reviewers(accountId)   # who to route a submission to\n```\n\n## Notes\n\n- `timeSpentSeconds` is always an integer (e.g. `3600` = 1 hour, `1800` = 30 min)\n- `authorAccountId` is the Atlassian account id (not a username) — required for all worklog operations\n- `tempo_get_plans` requires both `from` and `to` — no other filter is mandatory\n- `tempo_get_periods` requires both `from` and `to`; `tempo_get_timesheet_approval_status` requires `from` (`to` optional) — the API rejects these calls without a period\n- Default pagination limit is 50 for most endpoints; use `offset` + `limit` to page through results\n- Accounts are addressed **two different ways**: `tempo_get_account` takes the numeric `id`, while update and delete take the string `key`. Resolve a key to an id with `tempo_search_accounts(keys: [\"ACCOUNT-123\"])`\n- `tempo_delete_worklog` is a hard delete — there is no restore\n- Timesheet actions take the period as `from` (required) + `to` (optional) — they apply to a whole period, not an individual worklog. `submit`/`recall` are the timesheet owner's actions; `approve`/`reject`/`reopen` require reviewer permissions\n- `recall` pulls back a timesheet that is still waiting for approval; `reopen` undoes an approval that already went through\n\n## Acknowledgement of Terms\n\nBy using this MCP server, you acknowledge and agree to the following:\n\n**1. This server accesses your own Tempo account via Tempo's official API.** Auth happens via your own per-user OAuth/API token, issued by your Tempo/Jira instance. It does not — and cannot — access anyone else's worklogs or your colleagues' time entries.\n\n**2. [Tempo's Terms of Use](https://www.tempo.io/terms-of-use) govern your use of this server**. The clauses most relevant here:\n\n> Your registration is solely for your personal use, and you shall not authorize others to use your account.\n\nAnd: users must not \"automate the use of the Service, such as by using scripts\" — *except* via documented APIs (Section 5.3.2(v)). API tokens are the sanctioned automation mechanism — that's what this server uses.\n\nYou are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.\n\n**3. Personal, single-user use only.** This project is not affiliated with, endorsed by, sponsored by, or in partnership with Tempo Software ehf or Atlassian. It is a personal automation tool for one Tempo-licensed user to drive their own worklogs and reports. Do not use it to log time on behalf of colleagues, to bulk-export reports across an org for resale, or to share your token with anyone else.\n\n**4. Your token is yours alone.** Tempo issues per-user OAuth/API tokens; **do not commit `TEMPO_API_TOKEN` to git**, do not paste it in shared chats, and rotate it if it's ever exposed.\n\n**5. Your employer's policy may add restrictions.** Tempo is typically licensed via Jira to an organization. Your employer may have IT/security/acceptable-use policies that further restrict scripted automation against Jira/Tempo — even when Tempo's own ToU allows it. **Check with your employer's IT/Jira admin** before automating against a corporate Tempo instance.\n\n**6. You accept full responsibility** for any consequences of using this server in connection with your Tempo account — rate limiting, token revocation, account warnings, your IT admin emailing you, or any enforcement action. If Tempo or your employer objects to your use, stop using this server.\n\nThis section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Tempo's actual ToU or your employer's policies.\n\nFile v3.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.1.1\",\n  \"publishedAt\": 1790177981756\n}\n\nFile v3.1.1:skill-card.md\n\n## Description:\n\nAccess Tempo time-tracking data via MCP for Tempo worklogs, plans, teams, accounts, resource allocations, and timesheet approvals.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Tempo users use this skill to configure and operate a Tempo MCP connector for querying time-tracking data, logging work, managing resource plans, and handling timesheet approval workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The connected MCP server can access or change Tempo and Jira-adjacent team, account, worklog, plan, and timesheet approval data according to the permissions of the configured Tempo token.\n\nMitigation: Use a least-privilege Tempo token where possible and review agent actions carefully before deletes, account or team changes, worklog edits, or timesheet approval actions.\n\nRisk: The skill requires a Tempo API token, and exposed credentials could allow unauthorized access within the token's Tempo permissions.\n\nMitigation: Keep TEMPO_API_TOKEN out of source control and shared chats, store it only in approved local configuration or secret-management mechanisms, and rotate it if exposure is suspected.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [npm package](https://www.npmjs.com/package/tempo-api-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Markdown, Code, Shell commands, Configuration]\n\n**Output Format:** [Markdown with JSON and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include MCP tool names, configuration examples, and operational guidance for Tempo API access.]\n\n## Skill Version(s):\n\n3.1.1 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.1.0: 3 files, 6786 bytes\n\nFiles: skill-card.md (2248b), SKILL.md (13779b), _meta.json (132b)\n\nFile v3.1.0:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, authorAccountId, startDate, timeSpentSeconds, ...)` | Update an existing worklog |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name, ...)` | Update a team |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name, ...)` | Update an account |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's timesheet |\n| `tempo_search_timesheet_approval_logs(..., view?)` | Search approval audit logs |\n| `tempo_submit_timesheet(accountId, from, to?, ...)` | Submit a timesheet for approval |\n| `tempo_approve_timesheet(accountId, from, to?, ...)` | Approve a submitted timesheet |\n| `tempo_reject_timesheet(accountId, from, to?, ...)` | Reject a submitted timesheet |\n| `tempo_reopen_timesheet(accountId, from, to?, ...)` | Reopen an approved timesheet |\n| `tempo_recall_timesheet(accountId, from, to?, ...)` | Recall your own unapproved timesheet |\n| `tempo_get_periods(from, to, view?)` | Get Tempo period definitions |\n| `tempo_get_user_schedule(accountId, from, to, view?)` | Get a user's work schedule |\n| `tempo_get_global_configuration(view?)` | Get global Tempo settings |\n| `tempo_get_work_attributes(view?)` | List custom worklog attributes |\n| `tempo_get_roles(view?)` | List all Tempo roles |\n| `tempo_healthcheck()` | Is this connector working? Reports which credential resolved, whether api.tempo.io accepted it, and what to fix. Start here when another tool fails — an empty result can mean \"no data\" or \"never authenticated\", and this separates them. |\n\n## Response shape (`view`)\n\nEvery read tool takes `view: \"compact\" | \"full\"`, and **`compact` is the\ndefault** — you get the slim rung without asking for it. That is 30 of this\nserver's 48 tools; the seventeen confirm-gated writes and `tempo_healthcheck`\nhave no `view`.\n\n**Compact here is media stripping, not a field projection**, and the\ndifference is the thing to know before you rely on it. `src/view.ts` says so\noutright: this repo holds no captured Tempo payload and no documented field\nlist, so nothing in it can honestly claim to know which of Tempo's fields\nmatter and which are noise. Compact therefore does the one projection that\nneeds no such knowledge — it removes keys whose value is a picture (`avatar`,\n`picture`, `photo`, `icon`, `logo`, and their `Url` / `Uri` / `Link` forms)\nalong with bare image URLs. That is SUBTRACTIVE, so it cannot lose a field\nnobody knew about, which is what an invented field list would have risked: a\nworklog coming back with holes in it and reading like a verified answer.\n\n**The surprise to expect is that compact often changes nothing.** Tempo is a\ntime-tracking API — worklogs, plans, periods, approval logs — and a payload\nwith no picture in it comes back byte-identical on both rungs. So do not read\na short response as evidence that fields were withheld, and do not reach for\n`full` hoping a field you wanted is hiding behind it. If it is not in compact\nand it is not an image URL, Tempo did not send it.\n\n`view: \"full\"` returns Tempo's payload untouched. There is deliberately **no\n`raw` rung**: nothing here re-serialises or normalises a response, so `full`\nalready IS the upstream payload, and a third value would silently alias one\nthat exists.\n\nThe tools without `view` have it for two distinct reasons, neither of them an\noversight:\n\n- **The seventeen writes** — every `tempo_create_*` / `tempo_update_*` /\n  `tempo_delete_*` plus `submit` / `approve` / `reject` / `reopen` / `recall`\n  — answer with a receipt: a dry-run preview, or an id and a status. There is\n  nothing in a receipt to strip and everything in it to keep.\n- **`tempo_healthcheck`** returns a diagnostic verdict — which credential\n  resolved, whether `api.tempo.io` accepted it, what to fix. Same reasoning,\n  and it is the one read-only tool in that group.\n\nPassing `view` to one of those is not an error and does not fail: the tool\ndoes not declare it, so zod drops the unknown key and the call runs exactly as\nit would have. You get no warning, so do not treat a successful call as\nevidence the rung was honoured.\n\n## Workflows\n\n**Log time for today:**\n```\ntempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)\n```\n\n**See this week's time for a user:**\n```\ntempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")\n```\n\n**Check resource plan for a project:**\n```\ntempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])\n```\n\n**Find all worklogs for an issue:**\n```\ntempo_get_worklogs_by_issue(issueId: 456, from: \"2026-01-01\")\n```\n\n**Review pending timesheet approvals:**\n```\ntempo_get_timesheet_approvals_waiting()\ntempo_get_timesheet_approval_status(accountId, from: \"2026-03-01\", to: \"2026-03-31\")\n```\n\n**Act on a timesheet (all five actions are confirm-gated — the first call is a dry run):**\n```\ntempo_get_periods(from: \"2026-03-01\", to: \"2026-03-31\")   # find the period boundaries\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\")\ntempo_approve_timesheet(accountId, from: \"2026-03-01\", to: \"2026-03-31\", comment: \"LGTM\", confirm: true)\n```\n\n**Chase a team's outstanding timesheets for a period:**\n```\ntempo_get_timesheet_approvals_by_team(teamId: 42, from: \"2026-03-01\", to: \"2026-03-31\")\ntempo_get_timesheet_reviewers(accountId)   # who to route a submission to\n```\n\n## Notes\n\n- `timeSpentSeconds` is always an integer (e.g. `3600` = 1 hour, `1800` = 30 min)\n- `authorAccountId` is the Atlassian account id (not a username) — required for all worklog operations\n- `tempo_get_plans` requires both `from` and `to` — no other filter is mandatory\n- `tempo_get_periods` requires both `from` and `to`; `tempo_get_timesheet_approval_status` requires `from` (`to` optional) — the API rejects these calls without a period\n- Default pagination limit is 50 for most endpoints; use `offset` + `limit` to page through results\n- Accounts are addressed **two different ways**: `tempo_get_account` takes the numeric `id`, while update and delete take the string `key`. Resolve a key to an id with `tempo_search_accounts(keys: [\"ACCOUNT-123\"])`\n- `tempo_delete_worklog` is a hard delete — there is no restore\n- Timesheet actions take the period as `from` (required) + `to` (optional) — they apply to a whole period, not an individual worklog. `submit`/`recall` are the timesheet owner's actions; `approve`/`reject`/`reopen` require reviewer permissions\n- `recall` pulls back a timesheet that is still waiting for approval; `reopen` undoes an approval that already went through\n\n## Acknowledgement of Terms\n\nBy using this MCP server, you acknowledge and agree to the following:\n\n**1. This server accesses your own Tempo account via Tempo's official API.** Auth happens via your own per-user OAuth/API token, issued by your Tempo/Jira instance. It does not — and cannot — access anyone else's worklogs or your colleagues' time entries.\n\n**2. [Tempo's Terms of Use](https://www.tempo.io/terms-of-use) govern your use of this server**. The clauses most relevant here:\n\n> Your registration is solely for your personal use, and you shall not authorize others to use your account.\n\nAnd: users must not \"automate the use of the Service, such as by using scripts\" — *except* via documented APIs (Section 5.3.2(v)). API tokens are the sanctioned automation mechanism — that's what this server uses.\n\nYou are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.\n\n**3. Personal, single-user use only.** This project is not affiliated with, endorsed by, sponsored by, or in partnership with Tempo Software ehf or Atlassian. It is a personal automation tool for one Tempo-licensed user to drive their own worklogs and reports. Do not use it to log time on behalf of colleagues, to bulk-export reports across an org for resale, or to share your token with anyone else.\n\n**4. Your token is yours alone.** Tempo issues per-user OAuth/API tokens; **do not commit `TEMPO_API_TOKEN` to git**, do not paste it in shared chats, and rotate it if it's ever exposed.\n\n**5. Your employer's policy may add restrictions.** Tempo is typically licensed via Jira to an organization. Your employer may have IT/security/acceptable-use policies that further restrict scripted automation against Jira/Tempo — even when Tempo's own ToU allows it. **Check with your employer's IT/Jira admin** before automating against a corporate Tempo instance.\n\n**6. You accept full responsibility** for any consequences of using this server in connection with your Tempo account — rate limiting, token revocation, account warnings, your IT admin emailing you, or any enforcement action. If Tempo or your employer objects to your use, stop using this server.\n\nThis section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Tempo's actual ToU or your employer's policies.\n\nFile v3.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.1.0\",\n  \"publishedAt\": 1789872748465\n}\n\nFile v3.1.0:skill-card.md\n\n## Description:\n\nAccess Tempo time-tracking data via MCP for worklogs, plans, teams, accounts, resource allocation, and timesheet approvals.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and Tempo/Jira users use this skill to query time-tracking data, log or update work, manage resource plans, inspect teams and accounts, and handle timesheet approval workflows through a registered Tempo MCP server.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Tempo permissions may expose team or colleague data despite the artifact's single-user wording.\n\nMitigation: Use a least-privilege Tempo token, confirm the token's accessible scope before use, and avoid sharing or committing the token.\n\nRisk: Write, delete, and approval tools can change worklogs, plans, teams, accounts, or timesheet state.\n\nMitigation: Confirm every write, delete, submit, approve, reject, reopen, or recall action and verify target IDs, dates, and periods before execution.\n\nRisk: Corporate Tempo or Jira automation may be subject to employer policy or administrative restrictions.\n\nMitigation: Check applicable IT, Jira, and Tempo policies before automating against an organization-managed workspace.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [npm package](https://www.npmjs.com/package/tempo-api-mcp)\n- [Tempo Terms of Use](https://www.tempo.io/terms-of-use)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, API calls, Guidance]\n\n**Output Format:** [Markdown guidance with JSON configuration snippets, shell commands, and MCP tool-call descriptions]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires a registered Tempo MCP server and a Tempo API token.]\n\n## Skill Version(s):\n\n3.1.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v3.0.0: 3 files, 6810 bytes\n\nFiles: skill-card.md (2347b), SKILL.md (13779b), _meta.json (132b)\n\nFile v3.0.0:SKILL.md\n\n---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, authorAccountId, startDate, timeSpentSeconds, ...)` | Update an existing worklog |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo account |\n\n### Plans (Resource Allocations)\n| Tool | Description |\n|------|-------------|\n| `tempo_get_plans(from, to, ..., view?)` | List plans for a date range |\n| `tempo_get_plan(id, view?)` | Get a single plan by id |\n| `tempo_create_plan(assigneeId, assigneeType, planItemId, planItemType, startDate, endDate, ...)` | Create a resource allocation plan |\n| `tempo_update_plan(id, ...)` | Update an existing plan |\n| `tempo_delete_plan(id)` | Delete a plan |\n\n### Teams\n| Tool | Description |\n|------|-------------|\n| `tempo_get_teams(..., view?)` | List teams with optional filters |\n| `tempo_get_team(id, view?)` | Get a single team by id |\n| `tempo_create_team(name, ...)` | Create a new team |\n| `tempo_update_team(id, name, ...)` | Update a team |\n| `tempo_delete_team(id)` | Delete a team |\n| `tempo_get_team_memberships(teamId, view?)` | All memberships for one team |\n| `tempo_search_team_memberships(teamIds?, accountIds?, roleIds?, view?)` | Membership search across teams via POST |\n\n### Accounts\n| Tool | Description |\n|------|-------------|\n| `tempo_get_accounts(view?)` | List all accounts (OPEN and CLOSED) |\n| `tempo_get_account(id, view?)` | Get a single account by **numeric id** |\n| `tempo_search_accounts(ids?, keys?, statuses?, global?, view?)` | Search accounts; also resolves a key to an id |\n| `tempo_create_account(key, name, ...)` | Create a new account |\n| `tempo_update_account(key, name, ...)` | Update an account |\n| `tempo_delete_account(key)` | Delete an account |\n| `tempo_get_account_categories(id?, view?)` | List account categories (not paginated) |\n\n### Projects & Timesheets\n| Tool | Description |\n|------|-------------|\n| `tempo_get_projects(view?)` | List Tempo Financial Manager projects |\n| `tempo_get_project(id, view?)` | Get a project by id |\n| `tempo_get_timesheet_approval_status(accountId, from, to?, view?)` | Get timesheet approval status for a user |\n| `tempo_get_timesheet_approvals_waiting(view?)` | List timesheets waiting for approval |\n| `tempo_get_timesheet_approvals_by_team(teamId, from, to?, view?)` | Get every team member's approval for a period |\n| `tempo_get_timesheet_reviewers(accountId, view?)` | List who can review a user's time\n\nArchive v2.5.1: 3 files, 6816 bytes\n\nFiles: skill-card.md (2356b), SKILL.md (13779b), _meta.json (132b)","readmeExcerpt":"Skill: tempo-api-mcp Owner: chrischall Summary: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involvi","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}"},{"language":"bash","snippet":"git clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build"},{"language":"json","snippet":"{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}"},{"language":"text","snippet":"tempo_create_worklog(authorAccountId, issueId, startDate: \"today\", timeSpentSeconds: 3600)"},{"language":"text","snippet":"tempo_get_worklogs_by_user(accountId, from: \"2026-03-16\", to: \"2026-03-20\")"},{"language":"text","snippet":"tempo_get_plans(from: \"2026-03-01\", to: \"2026-03-31\", projectIds: [123])"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: tempo-api-mcp\ndescription: Access Tempo time-tracking data via MCP. Use when the user asks about Tempo worklogs, plans, teams, accounts, or wants to log time, check resource allocations, or manage timesheet approvals. Triggers on phrases like \"log my time in Tempo\", \"how many hours did I log this week\", \"check my team's worklogs\", \"what's the resource plan for this sprint\", or any request involving Jira/Tempo time tracking. Requires tempo-api-mcp installed and the tempo server registered (see Setup below).\n---\n\n# tempo-api-mcp\n\nMCP server for Tempo — natural-language time-tracking and resource planning via the Tempo API.\n\n- **npm:** [npmjs.com/package/tempo-api-mcp](https://www.npmjs.com/package/tempo-api-mcp)\n- **Source:** [github.com/chrischall/tempo-api-mcp](https://github.com/chrischall/tempo-api-mcp)\n\n## Setup\n\n### Option A — npx (recommended)\n\nAdd to `.mcp.json` in your project or `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"tempo-api-mcp\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\n### Option B — from source\n\n```bash\ngit clone https://github.com/chrischall/tempo-api-mcp\ncd tempo-api-mcp\nnpm install && npm run build\n```\n\nThen add to `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"tempo\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/tempo-api-mcp/dist/index.js\"],\n      \"env\": {\n        \"TEMPO_API_TOKEN\": \"your-api-token-here\"\n      }\n    }\n  }\n}\n```\n\nOr use a `.env` file in the project directory with `TEMPO_API_TOKEN=<value>`.\n\n### Getting your API token\n\n1. Log in to your Tempo workspace\n2. Go to **Settings → API integration**\n3. Create a new token and copy it\n\n## Authentication\n\nBearer token auth — attached to every request as `Authorization: Bearer <token>`.\n\n## Tools\n\n### Worklogs\n| Tool | Description |\n|------|-------------|\n| `tempo_get_worklogs(..., view?)` | List worklogs with optional filters (project, issue, date range) |\n| `tempo_get_worklog(id, view?)` | Get a single worklog by id |\n| `tempo_create_worklog(authorAccountId, issueId, startDate, timeSpentSeconds, ...)` | Log time against a Jira issue |\n| `tempo_update_worklog(id, timeSpentSeconds?, description?, attributes?, ...)` | Update an existing worklog — pass only what changes; omitted fields keep their current values |\n| `tempo_delete_worklog(id)` | Delete a worklog |\n| `tempo_search_worklogs(authorIds?, issueIds?, projectIds?, from?, to?, ..., view?)` | Advanced search via POST |\n| `tempo_get_worklogs_by_user(accountId, from?, to?, updatedFrom?, view?)` | All worklogs for a user |\n| `tempo_get_worklogs_by_project(projectId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira project |\n| `tempo_get_worklogs_by_issue(issueId, from?, to?, updatedFrom?, view?)` | All worklogs for a Jira issue |\n| `tempo_get_worklogs_by_team(teamId, from?, to?, updatedFrom?, view?)` | All worklogs for a Tempo team |\n| `tempo_get_worklogs_by_account(accountKey,"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn700jq4sjtf2anb0rk3ft4p7n856872\",\n  \"slug\": \"tempo-api-mcp\",\n  \"version\": \"3.2.4\",\n  \"publishedAt\": 1791301824971\n}"},{"path":"skill-card.md","content":"## Description:\n\nHelps agents use Tempo through MCP to review time tracking, resource plans, teams, accounts, and timesheet approvals and to make authorized changes.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chrischall](https://clawhub.ai/user/chrischall)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nTempo/Jira users and their agents use this skill to review worklogs, allocations, and timesheet approvals, and to make authorized changes to time-tracking records.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill's personal-use description understates access to coworkers' worklogs, team data, and other-user timesheets when the token has broader permissions.\n\nMitigation: Review Tempo/Jira permissions before installation and use a least-privilege token; limit team, reviewer, account, plan, and approval access to what is needed.\n\nRisk: Authorized write actions can change or delete time records and act on timesheet approvals.\n\nMitigation: Keep confirmation prompts enabled for writes and review each proposed action before approving it.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/chrischall/skills/tempo-api-mcp)\n- [Tempo API MCP npm package](https://www.npmjs.com/package/tempo-api-mcp)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Guidance, Configuration instructions]\n\n**Output Format:** [Markdown and structured Tempo tool responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Write operations request confirmation before execution.]\n\n## Skill Version(s):\n\n3.2.4 (source: ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1217,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T17:46:06.063Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T17:46:06.063Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T21:52:46.224Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}