Kimai MCP server for Claude, Cursor, and AI agents: 28 time-tracking tools, timesheet writes guarded by per-call authorization and backups.
Strong foundation with 21 well-structured tools, comprehensive schemas, and consistent descriptions. All tools have explicit input schemas with type definitions and descriptions. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are correctly applied. Write operations include authorization gates and backup mechanisms. Main gaps: parameter descriptions are sometimes generic (e.g., 'Kimai entity ID' lacks format/range guidance); some enum parameters lack inline constraint documentation; output schemas are not formally documented in code; error recovery guidance is minimal.
Create a Kimai timesheet record. Sensitive edit: call only after explicit human authorization. The request and created record are saved to a temp backup file.
Duplicate an existing Kimai timesheet. Sensitive edit: call only after explicit human authorization. The source and created record are saved to a temp backup file.
Read one Kimai activity from /api/activities/<id>. This tool is read-only.
Read one Kimai customer from /api/customers/<id>. This tool is read-only.
Read one expense from /api/expenses/<id> when the Kimai expenses feature/plugin is available. This tool is read-only.
Read one Kimai invoice from /api/invoices/<id>. This tool is read-only.
Generic parameter descriptions lack actionable constraints. 'Kimai entity ID' does not specify format, range, or valid values. LLMs cannot validate inputs without explicit constraints (e.g., 'positive integer, 1 - 999999').
Output schemas are not formally documented in code. While responses are structured (via formatResponse and makeToolResponse), the schema of returned fields is not declared in tool registration. LLMs cannot plan downstream calls without knowing what fields to expect.
Error handling lacks recovery guidance. formatApiError() is called but error responses do not suggest next steps (e.g., 'Try search_customers() with a partial name' if a customer is not found). Agents receive errors but no actionable path forward.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2025-06-18+ | v2 |
Read one Kimai project from /api/projects/<id>. This tool is read-only.
Read Kimai API status, version, plugin, and timesheet configuration endpoints. This tool is read-only.
Read one task from /api/tasks/<id> when the Kimai tasks feature/plugin is available. This tool is read-only.
Read one Kimai team from /api/teams/<id>. This tool is read-only.
List activities visible to the Kimai API token from /api/activities, optionally filtered by project. This tool is read-only.
List customers visible to the Kimai API token from /api/customers. This tool is read-only.
List expenses from /api/expenses when the Kimai expenses feature/plugin is available. This tool is read-only.
List Kimai invoices from /api/invoices. This tool is read-only.
List projects visible to the Kimai API token from /api/projects, optionally filtered by customer. This tool is read-only.
List Kimai tags from /api/tags/find. This tool is read-only.
List tasks from /api/tasks when the Kimai tasks feature/plugin is available. This tool is read-only.
List Kimai teams from /api/teams. This tool is read-only.
Restart a stopped Kimai timesheet. Sensitive edit: call only after explicit human authorization. The existing record is saved to a temp backup file before restarting.
Stop an active Kimai timesheet. Sensitive edit: call only after explicit human authorization. The existing record is saved to a temp backup file before stopping.
Update a Kimai timesheet record. Sensitive edit: call only after explicit human authorization. The existing record is saved to a temp backup file before the edit.
Pagination parameters (page, size) lack documented limits. Kimai supports max size 500, but no min/max constraints are declared in schema. LLMs may pass invalid values (page=0, size=10000) without validation feedback.
Write operations require authorization_confirmed=true and authorization_note, but descriptions do not explain what happens if these are omitted or false. LLMs may not understand the gate is mandatory, risking silent failures or repeated attempts.