keeping-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KEEPING_TOKEN | Yes | Keeping personal access token (required) | |
| KEEPING_ORG_ID | No | Pin all calls to one organisation id. When unset and the token has access to multiple orgs, write tools require explicit organisation_id input per call. | |
| KEEPING_LOG_LEVEL | No | Server stderr log verbosity. Accepts: debug, info, warn, error. | info |
| KEEPING_REQUIRE_CONFIRM | No | When true, write tools return a preview unless called with confirm: true. Setting to false disables the gate. | true |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| keeping_meA | Returns the authenticated user (id, first_name, surname, code, role, state) wrapped under a |
| keeping_organisationsA | Returns the list of organisations the token can access. Each organisation includes feature flags (projects, tasks, timesheet_mode) verbatim from the API. Cached for the server's lifetime. |
| keeping_projectsA | Returns the list of projects available for the selected organisation. If the projects feature is disabled for the organisation, returns a human-readable note instead of an error. Not cached — fresh per call. |
| keeping_tasksA | Returns the list of tasks available for the selected organisation. If the tasks feature is disabled for the organisation, returns a human-readable note instead of an error. Not cached — fresh per call. |
| keeping_list_entriesA | Returns time entries for a date range. Wire shape preserved exactly as returned by the Keeping API — no field renaming — so this tool doubles as schema discovery for Phase 3 write tools. Dates are calendar dates in YYYY-MM-DD; not UTC timestamps. Single-day calls hit |
| keeping_timer_statusA | Returns the most recent time entry for the authenticated user plus a derived |
| keeping_add_entryA | Create a new time entry. DRY-RUN BY DEFAULT — call without confirm first to receive a would_post preview; call again with confirm: true ONLY after a human reviewed the preview. Body shape depends on the organisation's timesheet mode: 'times' mode requires start/end (HH:mm in org timezone); 'hours' mode requires a decimal hours value. Purpose defaults to 'work'. The date defaults to today in Europe/Amsterdam. |
| keeping_update_entryA | Edit an existing time entry owned by the authenticated user. PATCH semantics — only the fields you supply are updated. DRY-RUN BY DEFAULT — call without confirm first to receive a would_post preview; call again with confirm: true ONLY after a human reviewed the preview. NOTE: date, purpose, and user_id are immutable in Keeping; this tool does not accept them. |
| keeping_delete_entryA | DESTRUCTIVE: permanently deletes the entry — cannot be undone. Owns the dry-run gate: without confirm: true, the tool fetches the entry and returns a would_delete preview so a human can verify the right entry is targeted. Only call with confirm: true after a human reviewed the preview. |
| keeping_start_timerA | Start a new ongoing time entry (a running timer). Implemented as POST /{orgId}/time-entries with |
| keeping_stop_timerA | Stop an ongoing time entry (running timer) by setting its end. Implemented as PATCH /{orgId}/time-entries/{entry_id}/stop. Returns the updated entry plus server_time_ms — the millisecond-precision server timestamp captured from the X-Server-Time-Ms response header (TIMER-02). When the header is missing or unparseable, server_time_ms falls back to the local clock and a warning is logged to stderr. DRY-RUN BY DEFAULT — call without confirm first to receive a would_post preview; call again with confirm: true ONLY after a human reviewed the preview. |
| keeping_resume_timerA | Resume a previously-stopped time entry as an ongoing timer. Implemented as POST /{orgId}/time-entries/{entry_id}/resume. Returns the resumed entry plus server_time_ms — the millisecond-precision server timestamp captured from the X-Server-Time-Ms response header (TIMER-02). When the header is missing or unparseable, server_time_ms falls back to the local clock and a warning is logged to stderr. NOTE: Keeping may return a different time_entry.id than the input entry_id — when the original entry's date is no longer 'today', Keeping creates a NEW ongoing entry rather than modifying the old one. Always read time_entry.id from the response; do not assume it matches your input. Cannot resume locked entries (returns a 403 error). DRY-RUN BY DEFAULT — call without confirm first to receive a would_post preview; call again with confirm: true ONLY after a human reviewed the preview. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 12 tools
Most tools map to a distinct resource or action, but there is some overlap: keeping_add_entry and keeping_start_timer both create time entries, and keeping_timer_status overlaps with keeping_list_entries as a read surface. The detailed descriptions and dry-run gates help an agent disambiguate, but the boundaries are slightly fuzzy.
All tools share a keeping_ prefix and use snake_case, with clear action_object names like add_entry, delete_entry, and stop_timer. The main inconsistency is that resource listers are split between noun-only names (keeping_organisations, keeping_projects, keeping_tasks) and verb-based names (keeping_list_entries), while keeping_timer_status is neither a verb pattern nor a simple resource name.
12 tools is well within the target range and maps cleanly to the server's purpose: identity and org context, resource lookups, time-entry CRUD, and timer lifecycle. Each tool has a clear role, with no obvious filler or redundant duplicates.
The tool surface covers the core Keeping workflows: list/create/update/delete time entries, start/stop/resume timers, and resolve org/project/task context. It also handles feature-fag disables and provides dry-run previews for destuctive and mutating operations, so agents do not hit dead ends. Missing write access to projects/tasks is not an obvious gap for a time-tracking MCP server.