Zovo Focus Timer MCP
Provides pomodoro, countdown, and interval timers with live widgets and session planning. It calculates accurate timers from stored end times, supports background tabs, and generates .ics calendar files for focus blocks.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://focus-timer.zovo.one/mcpWhat you can do with it
- Start a 25/5 pomodoro timer for study sessions
- Set a 10-minute countdown timer for presentations
- Plan pomodoros within a specific time window
- Generate .ics calendar files for focus blocks
Source and maintenance
Protocol and capabilities
- Server
- focus-timer 1.0.0
- MCP protocol
- 2025-06-18
- Tools
- 2 advertised
- Resources
- 1 advertised
- Resource templates
- 1 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
2 advertised
show_focus_timer — Show focus timer
Use this when the user wants a timer now: a pomodoro timer (25/5, 50/10, pomodoro timer for studying), a countdown timer ("10-minute timer"), or an interval timer (work/rest repeats, e.g. 45 s on, 15 s off). Returns the full phase plan (focus blocks, short and long breaks, totals) and shows a live timer with a progress ring, play, pause, skip and reset controls, and an optional chime. With a clock time for the first block and a time zone (IANA name such as Europe/Warsaw, a city, or an abbreviation such as EST), each phase also gets wall-clock times that stay correct across daylight-saving changes. Limits: up to 24 hours and 96 rounds; no phone notifications, alarms when the chat is closed, or music. Do not use for reminders about future appointments, questions about how long something takes (e.g. boiling an egg), or unit conversions.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"mode"
],
"properties": {
"date": {
"type": "string",
"maxLength": 10,
"description": "Optional date of start_time as YYYY-MM-DD, e.g. 2026-10-02. Defaults to today in time_zone."
},
"mode": {
"enum": [
"pomodoro",
"countdown",
"interval"
],
"type": "string",
"description": "Timer type: \"pomodoro\" (focus blocks with short and long breaks, e.g. 25/5), \"countdown\" (one countdown, e.g. 10 minutes), or \"interval\" (repeating work/rest, e.g. 45 s on, 15 s off)."
},
"label": {
"type": "string",
"maxLength": 60,
"description": "What the user is focusing on, shown on the timer, e.g. \"Biology chapter 3\" or \"Presentation practice\"."
},
"sound": {
"type": "boolean",
"description": "Play a short chime when each phase ends. Default true."
},
"rounds": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of focus blocks, e.g. 4 (pomodoro default). Ignored for countdown."
},
"time_zone": {
"type": "string",
"maxLength": 64,
"description": "Optional time zone for start_time: an IANA name (e.g. Europe/Warsaw, America/New_York), a city (e.g. Warsaw), or an abbreviation (e.g. EST, CET). Makes the clock times correct across daylight-saving changes."
},
"start_time": {
"type": "string",
"maxLength": 20,
"description": "Optional clock time the session starts, as HH:MM (24-hour) or 9:30 am, e.g. 14:00. When given, every phase gets wall-clock start and end times."
},
"auto_advance": {
"type": "boolean",
"description": "Start the next phase automatically when one ends. Default true; false pauses after each phase until the user presses Start."
},
"work_minutes": {
"type": "number",
"description": "Length of each focus or work block in minutes, e.g. 25 for a classic pomodoro or 50 for 50/10. For countdown this is the countdown length, e.g. 10. Decimals allowed: 0.5 = 30 seconds. Default 25 for pomodoro."
},
"long_break_every": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Take the long break after this many blocks, e.g. 4 (pomodoro default). 0 = never."
},
"long_break_minutes": {
"type": "number",
"description": "Longer break taken after every long_break_every blocks, in minutes, e.g. 15 (pomodoro default)."
},
"short_break_minutes": {
"type": "number",
"description": "Break between blocks in minutes, e.g. 5 (pomodoro default) or 10 for 50/10. For interval mode this is the rest, e.g. 0.25 = 15 seconds. 0 = no break."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"mode",
"label",
"summary",
"settings",
"totals",
"schedule",
"phases",
"notes",
"spare_minutes",
"downloads"
],
"properties": {
"mode": {
"type": "string"
},
"label": {
"type": "string"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"phases": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"minutes"
],
"properties": {
"end": {
"type": "string"
},
"type": {
"type": "string"
},
"label": {
"type": "string"
},
"round": {
"type": "number"
},
"start": {
"type": "string"
},
"minutes": {
"type": "number"
}
},
"additionalProperties": false
}
},
"totals": {
"type": "object",
"required": [
"focus_minutes",
"break_minutes",
"fixed_break_minutes",
"free_minutes",
"total_minutes",
"focus_blocks"
],
"properties": {
"focus_blocks": {
"type": "number"
},
"free_minutes": {
"type": "number"
},
"break_minutes": {
"type": "number"
},
"focus_minutes": {
"type": "number"
},
"total_minutes": {
"type": "number"
},
"fixed_break_minutes": {
"type": "number"
}
},
"additionalProperties": false
},
"summary": {
"type": "string"
},
"schedule": {
"anyOf": [
{
"type": "object",
"required": [
"date",
"date_label",
"time_zone",
"start",
"end",
"start_local",
"starts_at_ms"
],
"properties": {
"end": {
"type": "string"
},
"date": {
"type": "string"
},
"start": {
"type": "string"
},
"time_zone": {
"type": [
"string",
"null"
]
},
"date_label": {
"type": "string"
},
"start_local": {
"type": "string"
},
"starts_at_ms": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"settings": {
"type": "object",
"required": [
"work_minutes",
"short_break_minutes",
"long_break_minutes",
"rounds",
"long_break_every",
"auto_advance",
"sound"
],
"properties": {
"sound": {
"type": "boolean"
},
"rounds": {
"type": "number"
},
"auto_advance": {
"type": "boolean"
},
"work_minutes": {
"type": "number"
},
"long_break_every": {
"type": "number"
},
"long_break_minutes": {
"type": "number"
},
"short_break_minutes": {
"type": "number"
}
},
"additionalProperties": false
},
"downloads": {
"type": "object",
"properties": {
"ics": {
"type": "string"
}
},
"additionalProperties": false
},
"phase_count": {
"type": "number"
},
"spare_minutes": {
"type": [
"number",
"null"
]
},
"phases_truncated": {
"type": "boolean"
}
},
"additionalProperties": false
}{
"title": "Show focus timer",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}plan_focus_session — Plan focus session
Use this when the user wants pomodoros fitted into a time window: "I have 3 hours to study until 5pm", "plan pomodoros from 9:00 to 12:30 with a lunch break", "how many 50/10 blocks fit before my 3pm meeting". Fits the most whole focus blocks between the start and end time around fixed breaks (if the standard long break would cost a block, it shortens or drops it and says so, unless the user gave long-break settings) and returns clock times for every block, total focus minutes, spare time, an .ics calendar file with one event per focus block, and a live timer for the plan. Limits: one window of up to 24 hours; it does not read or change the user's calendar and does not build multi-day study plans (e.g. finals week).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"date": {
"type": "string",
"maxLength": 10,
"description": "Date of the session as YYYY-MM-DD, e.g. 2026-10-02. Defaults to today in time_zone."
},
"label": {
"type": "string",
"maxLength": 60,
"description": "Topic used for calendar event titles, e.g. \"Study: organic chemistry\". Default \"Focus\"."
},
"breaks": {
"type": "array",
"items": {
"type": "object",
"required": [
"start"
],
"properties": {
"end": {
"type": "string",
"maxLength": 20,
"description": "Break end as a clock time, e.g. 12:45."
},
"label": {
"type": "string",
"maxLength": 40,
"description": "Name shown in the plan, e.g. \"Lunch\"."
},
"start": {
"type": "string",
"maxLength": 20,
"description": "Break start as a clock time, e.g. 12:00 or 12 pm."
},
"minutes": {
"type": "number",
"description": "Break length in minutes if no end is given, e.g. 45."
}
}
},
"maxItems": 8,
"description": "Fixed breaks the plan must avoid, e.g. [{\"start\":\"12:00\",\"end\":\"12:45\",\"label\":\"Lunch\"}]."
},
"rounds": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Maximum number of pomodoros to schedule, e.g. 6. Without an end time the plan runs until this many are done."
},
"end_time": {
"type": "string",
"maxLength": 20,
"description": "When the session must end, e.g. 17:00 or 5pm (for \"until 5pm\"). Earlier times mean the next day; equal start and end times are refused. A bare hour such as 5 after a 14:00 start is read as 5pm, with a note; use 05:00 for next-day 5am."
},
"time_zone": {
"type": "string",
"maxLength": 64,
"description": "Time zone of the clock times: an IANA name (e.g. Europe/Warsaw), a city (e.g. New York), or an abbreviation (e.g. EST). With a zone, calendar events use absolute timestamps. With an explicit date and no zone, events use floating local time. If both date and zone are omitted, today's date and clock times use America/New_York, with a note."
},
"start_time": {
"type": "string",
"maxLength": 20,
"description": "When the session starts, as HH:MM or 9:00 am, e.g. 09:00. Needed unless end_time is given with available_minutes or rounds."
},
"work_minutes": {
"type": "number",
"description": "Focus block length in minutes, e.g. 25 (default) or 50."
},
"long_break_every": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Long break after this many focus blocks, e.g. 4 (default). 0 = never. Leave unset unless the user asks."
},
"available_minutes": {
"type": "number",
"description": "Total time available in minutes, e.g. 180 for \"I have 3 hours\". Used with start_time or end_time. Max 1440."
},
"long_break_minutes": {
"type": "number",
"description": "Long break in minutes, e.g. 15. Leave unset unless the user asks for one: by default it is 15 and may be shortened when that fits an extra focus block."
},
"short_break_minutes": {
"type": "number",
"description": "Break between focus blocks in minutes, e.g. 5 (default) or 10."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"mode",
"label",
"summary",
"settings",
"totals",
"schedule",
"phases",
"notes",
"spare_minutes",
"downloads"
],
"properties": {
"mode": {
"type": "string"
},
"label": {
"type": "string"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"phases": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"minutes"
],
"properties": {
"end": {
"type": "string"
},
"type": {
"type": "string"
},
"label": {
"type": "string"
},
"round": {
"type": "number"
},
"start": {
"type": "string"
},
"minutes": {
"type": "number"
}
},
"additionalProperties": false
}
},
"totals": {
"type": "object",
"required": [
"focus_minutes",
"break_minutes",
"fixed_break_minutes",
"free_minutes",
"total_minutes",
"focus_blocks"
],
"properties": {
"focus_blocks": {
"type": "number"
},
"free_minutes": {
"type": "number"
},
"break_minutes": {
"type": "number"
},
"focus_minutes": {
"type": "number"
},
"total_minutes": {
"type": "number"
},
"fixed_break_minutes": {
"type": "number"
}
},
"additionalProperties": false
},
"summary": {
"type": "string"
},
"schedule": {
"anyOf": [
{
"type": "object",
"required": [
"date",
"date_label",
"time_zone",
"start",
"end",
"start_local",
"starts_at_ms"
],
"properties": {
"end": {
"type": "string"
},
"date": {
"type": "string"
},
"start": {
"type": "string"
},
"time_zone": {
"type": [
"string",
"null"
]
},
"date_label": {
"type": "string"
},
"start_local": {
"type": "string"
},
"starts_at_ms": {
"type": [
"number",
"null"
]
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"settings": {
"type": "object",
"required": [
"work_minutes",
"short_break_minutes",
"long_break_minutes",
"rounds",
"long_break_every",
"auto_advance",
"sound"
],
"properties": {
"sound": {
"type": "boolean"
},
"rounds": {
"type": "number"
},
"auto_advance": {
"type": "boolean"
},
"work_minutes": {
"type": "number"
},
"long_break_every": {
"type": "number"
},
"long_break_minutes": {
"type": "number"
},
"short_break_minutes": {
"type": "number"
}
},
"additionalProperties": false
},
"downloads": {
"type": "object",
"properties": {
"ics": {
"type": "string"
}
},
"additionalProperties": false
},
"phase_count": {
"type": "number"
},
"spare_minutes": {
"type": [
"number",
"null"
]
},
"phases_truncated": {
"type": "boolean"
}
},
"additionalProperties": false
}{
"title": "Plan focus session",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
1 advertised
focus-timer-widget — Zovo Focus Timer view
Interactive view for Zovo Focus Timer.
ui://widget/focus-timer-v2-1.0.0-25ee840ba688f60cb3a8a9b43235c093d5dbaf333329e81f7f28ce9f4d0b14d0.htmlfocus-timer-widget-legacy — Zovo Focus Timer view (previous versions)
ui://widget/focus-timer-{version}.html30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 867 ms
- 95th percentile latency
- 867 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 867 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http zovo-focus-timer-mcp https://focus-timer.zovo.one/mcpCodex
codex mcp add zovo-focus-timer-mcp --url https://focus-timer.zovo.one/mcpCursor
{
"mcpServers": {
"zovo-focus-timer-mcp": {
"url": "https://focus-timer.zovo.one/mcp"
}
}
}Cline
{
"mcpServers": {
"zovo-focus-timer-mcp": {
"type": "streamableHttp",
"url": "https://focus-timer.zovo.one/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"zovo-focus-timer-mcp": {
"type": "http",
"url": "https://focus-timer.zovo.one/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http zovo-focus-timer-mcp https://focus-timer.zovo.one/mcpClaude Desktop
{
"mcpServers": {
"zovo-focus-timer-mcp": {
"url": "https://focus-timer.zovo.one/mcp"
}
}
}Windsurf
{
"mcpServers": {
"zovo-focus-timer-mcp": {
"serverUrl": "https://focus-timer.zovo.one/mcp"
}
}
}Let your agent find its tools
Find servers like Zovo Focus Timer MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.