Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
KEEPING_TOKENYesKeeping personal access token (required)
KEEPING_ORG_IDNoPin 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_LEVELNoServer stderr log verbosity. Accepts: debug, info, warn, error.info
KEEPING_REQUIRE_CONFIRMNoWhen true, write tools return a preview unless called with confirm: true. Setting to false disables the gate.true

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
keeping_meA

Returns the authenticated user (id, first_name, surname, code, role, state) wrapped under a user key, plus the resolved organisation_id. Identity is cached for the server's lifetime. Pass the optional organisation_id input to override the KEEPING_ORG_ID default; required when the token has access to multiple organisations.

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 GET /{orgId}/time-entries?date=...; multi-day ranges hit GET /{orgId}/report/time-entries?from=...&to=....

keeping_timer_statusA

Returns the most recent time entry for the authenticated user plus a derived is_running boolean indicating whether a Keeping timer is currently running. Read-only; no API mutation. Use this to decide whether keeping_stop_timer (running timer → stop) or keeping_resume_timer (stopped entry → resume) is the appropriate next call (both ship in Phase 3).

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 start set and NO end / NO hours — Keeping interprets the omission of end as 'this entry is ongoing'. Returns { timer_id } on success; use this id with keeping_stop_timer or keeping_resume_timer. 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. start defaults to the current time in Europe/Amsterdam; purpose defaults to 'work'.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Red-Square-Software/keeping-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server