timermcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TIMERMCP_HOME | No | State + cards directory | ~/.timermcp |
| TIMERMCP_HOST | No | Set 0.0.0.0 to view from other devices on your LAN (no auth — trusted networks only) | 127.0.0.1 |
| TIMERMCP_PORT | No | Dashboard port | 5717 |
| TIMERMCP_NO_DASHBOARD | No | 1 disables the HTTP server | unset |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| timer_startA | Start a millisecond-precision stopwatch (or countdown) on the TimerMCP server. The server stamps the start on a MONOTONIC nanosecond clock the instant this call arrives. Elapsed time is computed server-side as stop-stamp minus start-stamp, so the constant part of the pipeline delay (user → Claude → server) cancels out between start and stop — only the difference in latency between the two calls can leak in. Args:
Returns: { started: [{name, elapsed_ms, started_wall, target_ms?}], announcement, dashboard_url } IMPORTANT: Relay the 'announcement' line to the user with matching energy — you are the track announcer. Mention the dashboard_url the first time so they can put the live wall display on a second screen. Errors: fails if a timer with the same name is already running (stop or cancel it first, or pick another name). |
| timer_stopA | Stop a running timer and get the official elapsed time in milliseconds. elapsed_ms = (monotonic stop-stamp − monotonic start-stamp) − start_offset_ms − stop_offset_ms. raw_elapsed_ms is the pure unadjusted monotonic difference. Because both stamps are taken server-side, symmetric pipeline latency cancels; offsets exist only to bias out asymmetry if the user wants. Args:
Returns: { session: {name, elapsed_ms, raw_elapsed_ms, formatted, splits, pb, pb_margin_ms?, target_ms?, over_under_ms?, id}, announcement, card_path, card_url } A shareable SVG result card is written on every stop (card_path on disk, card_url served by the dashboard). IMPORTANT: Relay the 'announcement' to the user — big finish energy if it's a PB. Quote the exact millisecond figure. |
| timer_splitA | Record a split (lap) on a running timer without stopping it — speedrun style. If a personal-best run exists for this timer name, the split is compared against the SAME split index on the PB run and delta_vs_best_ms is returned (negative = ahead of PB pace, like LiveSplit green). Args:
Returns: { name, index, label, at_ms, formatted, delta_vs_best_ms?, announcement } Relay the announcement; if delta_vs_best_ms is present, call out ahead/behind PB pace. |
| timer_statusA | Check what's on the clock right now. Read-only. Args:
Returns: { running: [{name, elapsed_ms, formatted, target_ms?, remaining_ms?, splits, best_ms?, recovered, runaway}], count, dashboard_url } 'recovered' = true means the server restarted mid-run and that timer fell back to wall-clock precision. 'runaway' = true means the timer has been running longer than the configured max_hours (default 4) — the user probably forgot it. Ask if they want to stop it, offering trim_to_ms to cap the recorded time at what they actually worked. elapsed_ms is a live server-side reading at the moment this call was processed. |
| timer_cancelA | Discard a running timer WITHOUT recording a session, PB, or history entry. Use for false starts ("wait, I wasn't ready"). The would-be elapsed is returned for reference only. Args:
Returns: { name, discarded_elapsed_ms } |
| timer_historyA | Personal bests, recent finished runs, and lifetime totals. Read-only. Args:
Returns: { bests: [{name, best_ms?, count, total_ms}], recent: [{id, name, elapsed_ms, formatted, pb, splits, stopped_wall, target_ms?, over_under_ms?}], lifetime_ms, lifetime_sessions } Great for "what's my record?", "how much have I tracked today?", or building a leaderboard recap for the user. |
| timer_configA | Read or update TimerMCP settings. Call with no args to read. Settings:
Returns: { config: {announcer, start_offset_ms, stop_offset_ms, max_hours, sync_enabled, sync_token_tail?, sync_url?}, dashboard_url, data_dir } |
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
- 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/julanbasnet/timermcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server