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 |
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 |
|---|---|
| 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
- 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/julanbasnet/timermcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server