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 |
Capabilities
Features and capabilities supported by this server
| 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 | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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