keeping-mcp
OfficialClick on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@keeping-mcplog 2 hours of development work for project Alpha"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
keeping-mcp
Open-source Model Context Protocol (MCP) server that exposes the Keeping (api.keeping.nl) time-tracking API as tools an AI coding assistant can call. Built for solo developers who use Claude Code (or any MCP-capable client) and want their billable hours logged into Keeping at the end of a session instead of typed in by hand, while keeping Keeping's existing native Jortt invoicing integration intact. Every write tool is dry-run by default — your hours never reach Keeping until you explicitly confirm.
⚠ Writes are dry-run BY DEFAULT
Every write tool (
keeping_add_entry,keeping_update_entry,keeping_delete_entry,keeping_start_timer,keeping_stop_timer,keeping_resume_timer) returns a preview unless you passconfirm: truein the tool call.Setting
KEEPING_REQUIRE_CONFIRM=falsein your environment disables this gate. Writes then happen on the first call — there is no second chance.Recommendation: never disable this gate unless you are running the server in a non-interactive automation context and have explicitly accepted the loss of the confirmation step.
Related MCP server: redmine-mcp-server
Install
From npm
No install required — npx fetches the package on first run:
KEEPING_TOKEN=kp_live_your_token_here npx -y keeping-mcpThe server speaks the MCP stdio protocol and stays in the foreground waiting for JSON-RPC frames on stdin — exit with Ctrl+C. In practice you do not run it by hand; an MCP-capable client (Claude Code, Claude Desktop, Cursor, etc.) spawns it for you using the config snippets below.
Optional — install globally so keeping-mcp is on your PATH:
npm install -g keeping-mcp
KEEPING_TOKEN=kp_live_your_token_here keeping-mcpRequires Node.js >=22. The package is published to npmjs.com/package/keeping-mcp with sigstore provenance attestations.
Claude Code on Windows 11
Add to %APPDATA%\Claude\claude_desktop_config.json or to your project's .mcp.json file.
{
"mcpServers": {
"keeping-mcp": {
"command": "cmd",
"args": ["/c", "npx", "-y", "keeping-mcp"],
"env": {
"KEEPING_TOKEN": "kp_live_your_token_here"
}
}
}
}The cmd /c wrapper is required on Windows — npx resolves to npx.cmd, and Claude Code's process spawn does not search PATHEXT extensions (see anthropics/claude-code#58510).
Claude Code on macOS / Linux
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or ~/.config/Claude/claude_desktop_config.json (Linux), or your project's .mcp.json.
{
"mcpServers": {
"keeping-mcp": {
"command": "npx",
"args": ["-y", "keeping-mcp"],
"env": {
"KEEPING_TOKEN": "kp_live_your_token_here"
}
}
}
}Other MCP clients
Any MCP-capable client that supports the stdio transport works. The server is started by npx -y keeping-mcp and reads KEEPING_TOKEN from its environment. Discoverable in the MCP Registry as io.github.Red-Square-Software/keeping-mcp.
Get a Keeping access token
Sign in to your Keeping account.
Open Preferences (top-right menu).
Find the section Show features for developers and enable it.
A new Personal access tokens section appears.
Click Generate new token, name it (e.g. "Claude Code"), and copy the value.
Store it as
KEEPING_TOKENin your shell environment OR in your Claude Code configenvblock.
The token has full read+write access to your time entries — treat it like a password. Never commit it to git, never paste it into a chat, never read it back from a tool response (keeping-mcp never echoes it).
Configuration
Variable | Required | Default | Purpose |
| yes | — | Keeping personal access token (created via the section above). |
| no |
| When |
| no | — | Pin all calls to one organisation id. When unset and the token has access to multiple orgs, write tools require explicit |
| no |
| Server stderr log verbosity. Accepts: |
⚠ Writes are dry-run BY DEFAULT
Every write tool (
keeping_add_entry,keeping_update_entry,keeping_delete_entry,keeping_start_timer,keeping_stop_timer,keeping_resume_timer) returns a preview unless you passconfirm: truein the tool call.Setting
KEEPING_REQUIRE_CONFIRM=falsein your environment disables this gate. Writes then happen on the first call — there is no second chance.Recommendation: never disable this gate unless you are running the server in a non-interactive automation context and have explicitly accepted the loss of the confirmation step.
Tools
keeping-mcp registers 12 tools when the server starts. Read tools (keeping_me, keeping_organisations, keeping_projects, keeping_tasks, keeping_list_entries, keeping_timer_status) call Keeping's API without confirmation. Write tools (keeping_add_entry, keeping_update_entry, keeping_delete_entry, keeping_start_timer, keeping_stop_timer, keeping_resume_timer) return a dry-run preview unless invoked with confirm: true (default behavior controlled by KEEPING_REQUIRE_CONFIRM).
Dry-run workflow (example transcript)
Write tools follow a two-step pattern: propose-then-confirm. The first call returns a preview of the HTTP request the server would send; the second call (with confirm: true) actually sends it.
Step 1 — preview (no confirm, no API call made). Illustrative; actual field names match Keeping's OpenAPI (see https://developer.keeping.nl).
{
"tool": "keeping_add_entry",
"input": {
"description": "Phase 4 release prep",
"hours": 1.5,
"project_id": 123
},
"response": {
"would_post": {
"method": "POST",
"url": "https://api.keeping.nl/v1/456/time-entries",
"body": {
"description": "Phase 4 release prep",
"hours": 1.5,
"project_id": 123,
"date": "2026-06-12",
"purpose": "work"
}
}
}
}Step 2 — confirm (confirm: true added, request is sent to Keeping). Illustrative; actual response shape mirrors Keeping's OpenAPI.
{
"tool": "keeping_add_entry",
"input": {
"description": "Phase 4 release prep",
"hours": 1.5,
"project_id": 123,
"confirm": true
},
"response": {
"id": 98765,
"day": "2026-06-12",
"hours": 1.5,
"description": "Phase 4 release prep",
"project_id": 123,
"purpose": "work"
}
}Verifying provenance
Releases are published via GitHub Actions OIDC trusted publishing (no long-lived npm tokens). Every release carries an npm provenance attestation linking the published tarball to a specific commit in this repository.
npm audit signatures
# or, for a single package:
npm view keeping-mcp --json | jq '.dist.attestations'Local development
git clone https://github.com/red-square-software/keeping-mcp.git
cd keeping-mcp
npm ci
npm test
npm run build
KEEPING_TOKEN=kp_live_your_token_here node dist/bin/keeping-mcp.jsAll server output goes to stderr — stdout is reserved for MCP JSON-RPC framing. Never write diagnostic output to stdout; use console.error for logging.
License
MIT — see LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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