Koskamo

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.

Zovo Focus Timer MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Zovo
MCP endpoint (Streamable HTTP)
https://focus-timer.zovo.one/mcp
Vendor documentation

What 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

Community listingRegistry 1.0.0

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
Server-advertised capabilities
{
  "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.

Zovo Focus Timer runs live pomodoro, countdown, and interval timers in the conversation and plans study or work sessions into whole pomodoros with clock times and a calendar (.ics) file. Use show_focus_timer for a timer now; use plan_focus_session to fit pomodoros into a time window.

Tools

2 advertised

show_focus_timer — Show focus timer
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

show_focus_timer input schema
{
  "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."
    }
  }
}
show_focus_timer output schema
{
  "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
}
show_focus_timer annotations
{
  "title": "Show focus timer",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
plan_focus_session — Plan focus session
Advertised by the server during the last successful anonymous check.
Advertised read-only

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).

plan_focus_session input schema
{
  "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."
    }
  }
}
plan_focus_session output schema
{
  "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
}
plan_focus_session annotations
{
  "title": "Plan focus session",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

focus-timer-widget — Zovo Focus Timer view

Advertised by the server during the last successful anonymous check.

Interactive view for Zovo Focus Timer.

focus-timer-widget URI
ui://widget/focus-timer-v2-1.0.0-25ee840ba688f60cb3a8a9b43235c093d5dbaf333329e81f7f28ce9f4d0b14d0.html

MIME type: text/html;profile=mcp-app

focus-timer-widget-legacy — Zovo Focus Timer view (previous versions)

Advertised by the server during the last successful anonymous check.

focus-timer-widget-legacy URI template
ui://widget/focus-timer-{version}.html

MIME type: text/html;profile=mcp-app

30-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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http zovo-focus-timer-mcp https://focus-timer.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add zovo-focus-timer-mcp --url https://focus-timer.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable zovo-focus-timer-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "zovo-focus-timer-mcp": {
      "url": "https://focus-timer.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "zovo-focus-timer-mcp": {
      "type": "streamableHttp",
      "url": "https://focus-timer.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zovo-focus-timer-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zovo-focus-timer-mcp": {
      "type": "http",
      "url": "https://focus-timer.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http zovo-focus-timer-mcp https://focus-timer.zovo.one/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "zovo-focus-timer-mcp": {
      "url": "https://focus-timer.zovo.one/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.