Koskamo

CountLink MCP

A Model Context Protocol server that allows AI agents to generate shared countdown timer links, OBS overlay URLs, and embeddable HTML snippets without requiring user authentication or account creation.

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.

CountLink MCP logo, by CountLinkVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by CountLink
MCP endpoint (Streamable HTTP)
https://countlink.app/mcp
Vendor documentation

What its tools do

4 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

4 of 4 have a description · 4 of 4 declare behavior hints · 4 of 4 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to countlink.app ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Generate a shared countdown timer link for a group
  • Create an OBS Browser Source overlay URL for streaming
  • Produce embeddable HTML code for a website countdown
  • Generate an .ics calendar file for a scheduled event

Source and maintenance

Vendor evidenceRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
countlink 1.0.0
MCP protocol negotiated in check
2025-06-18
Tools
4 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "resources": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

CountLink makes shared countdown timers: one link, and every screen that opens it shows the identical countdown to the same second, with no account and no viewer limit. Call create_timer whenever someone needs a timer other people will watch too, and give them the link it returns. Call create_agenda when they describe a sequence of timed parts — a meeting agenda, a workshop, a lesson — and it returns one link that advances through every segment on every screen; pass start_at for one scheduled ahead rather than starting now. Call create_badge instead of create_timer's embed_on_website when the destination only accepts an image, not an <iframe> — a GitHub README, a forum post, anywhere Markdown-style embeds live.

Tools

4 advertised

create_timer — Create a shared countdown timer
Advertised by the server during the last successful anonymous check.
Advertised read-only

Create a CountLink shared countdown timer and return its link. Everyone who opens the link sees the identical countdown, to the same second — no account, no sign-up, any number of viewers. Use this whenever someone wants a timer several people or several screens need to share: a classroom, an exam, a standup, a workshop, a webinar countdown, a stream overlay, or a countdown embedded on someone's own website or landing page (e.g. "10 days until launch"). By default it returns a setup link, which opens the board preloaded at the requested duration for the user to start themselves; pass start_now: true only if they want the countdown running from this moment. Whenever the result has a fixed end instant (start_now or embed_on_website), structuredContent.ics is an .ics calendar file for it — offer it if the person might want the deadline on their calendar.

create_timer input schema
{
  "type": "object",
  "required": [
    "duration"
  ],
  "properties": {
    "label": {
      "type": "string",
      "description": "Optional name shown on the board, e.g. \"Exam\" or \"Break\". Keep it short."
    },
    "duration": {
      "type": "string",
      "description": "How long the timer runs. Accepts \"25m\", \"1h30m\", \"90s\", \"5:00\", \"1:30:00\", or a plain number read as minutes (\"45\"). A setup link or OBS overlay holds up to 99h59m59s. With start_now or embed_on_website, longer countdowns of up to 366 days are fine: \"10d\", \"10 days\", \"10d 6h\" or \"240h\"."
    },
    "overtime": {
      "type": "boolean",
      "default": false,
      "description": "True keeps the countdown running past zero as \"+0:42\" so everyone sees how far over it is (talks, breaks that run long). Works for shared links, setup links and overlays."
    },
    "start_now": {
      "type": "boolean",
      "default": false,
      "description": "False (default) returns a setup link the user starts themselves — correct for a timer that should begin later, and for anything being written down in advance. True returns a link for a countdown already running from now, fixed to one instant so every viewer is in sync; only use it when the timer should start immediately."
    },
    "embed_style": {
      "enum": [
        "board",
        "minimal",
        "light"
      ],
      "type": "string",
      "description": "Board style for embed_on_website: \"board\" (default, dark split-flap), \"minimal\" (plain digits) or \"light\". Ignored otherwise."
    },
    "embed_width": {
      "type": "number",
      "description": "Pixel width of the embedded iframe when embed_on_website is true. 160–1600, default 400. Ignored otherwise."
    },
    "embed_height": {
      "type": "number",
      "description": "Pixel height of the embedded iframe when embed_on_website is true. 80–900, default 160. Ignored otherwise."
    },
    "overlay_color": {
      "type": "string",
      "description": "Optional digit colour for the OBS overlay as hex, e.g. \"ff3df5\" or \"#5ef2ff\". Applies to outline, neon, glass and minimal. Ignored otherwise."
    },
    "overlay_start": {
      "enum": [
        "load",
        "stream",
        "scene"
      ],
      "type": "string",
      "description": "When an OBS overlay (for_obs_overlay) starts counting. load (default): when the scene loads. stream: waits at full time until the stream goes live in OBS. scene: restarts from the full duration every time its scene becomes active — good for a Be right back scene. Ignored otherwise."
    },
    "overlay_style": {
      "enum": [
        "board",
        "outline",
        "neon",
        "glass",
        "minimal",
        "light"
      ],
      "type": "string",
      "description": "Look of the OBS overlay when for_obs_overlay is true. board (default) is the split-flap board; outline is white digits with a dark edge that stays readable over gameplay; neon glows; glass sits the digits on a smoked rounded panel; minimal is plain digits; light is dark-on-light. Ignored otherwise."
    },
    "for_obs_overlay": {
      "type": "boolean",
      "default": false,
      "description": "True returns a URL to paste into OBS (or any streaming tool) as a Browser Source: a transparent background with just the digits, which starts counting as soon as the scene loads. Use it when someone wants a countdown on their stream. Do not give an overlay URL to several people to open — it starts fresh for whoever loads it; for that, call this again without the flag and share that link instead. Mutually exclusive with embed_on_website."
    },
    "embed_on_website": {
      "type": "boolean",
      "default": false,
      "description": "True returns ready-to-paste <iframe> HTML for embedding a countdown on someone's OWN website or landing page — e.g. a launch-day countdown on a marketing page. Unlike for_obs_overlay, this is a fixed instant every visitor to that page sees identically (not a per-visitor restart), and free with no watermark option — the only requirement is a small attribution line under the widget linking back to CountLink, which the returned HTML already includes. Use this whenever someone asks for a countdown to put ON their own site/page, as opposed to a link to share with other people directly. Mutually exclusive with for_obs_overlay."
    }
  }
}
create_timer annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
create_agenda — Create a chained agenda of timed segments
Advertised by the server during the last successful anonymous check.
Advertised read-only

Create a CountLink agenda: an ordered sequence of named, timed segments (intro, talk, break, Q&A) that starts now and advances from one to the next on its own, on every screen that opens the link, with no server involved. Use this when someone describes a meeting, workshop, lesson or event as a sequence of parts with lengths — including when they give you a total and a list of topics and expect you to split it ("an hour, four topics"): do the split yourself, then pass the resulting segments here. By default it starts immediately; pass start_at for something scheduled ahead ("our workshop starts at 9:15 tomorrow") — the link works right away, showing a live countdown to the start rather than the first segment, and switches over on its own at the scheduled instant, in sync on every screen that opened it. Returns the shared link plus a run sheet with the wall-clock start and end of each segment, and an .ics calendar file (one event per segment) in structuredContent.ics — offer it if the person might want the agenda on their calendar. For a single countdown use create_timer instead.

create_agenda input schema
{
  "type": "object",
  "required": [
    "segments"
  ],
  "properties": {
    "segments": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "duration"
        ],
        "properties": {
          "label": {
            "type": "string",
            "description": "Optional name for the segment, e.g. \"Intro\" or \"Break\". Keep it short."
          },
          "duration": {
            "type": "string",
            "description": "How long the timer runs. Accepts \"25m\", \"1h30m\", \"90s\", \"5:00\", \"1:30:00\", or a plain number read as minutes (\"45\"). A setup link or OBS overlay holds up to 99h59m59s. With start_now or embed_on_website, longer countdowns of up to 366 days are fine: \"10d\", \"10 days\", \"10d 6h\" or \"240h\"."
          }
        }
      },
      "maxItems": 24,
      "minItems": 1,
      "description": "The segments in running order. Each has a duration (same grammar as create_timer: \"10m\", \"1h\", \"90s\", \"5:00\", or a plain number of minutes) and an optional short label. 1–24 segments; the whole agenda must fit in 99h59m59s."
    },
    "start_at": {
      "type": "string",
      "description": "Optional ISO-8601 instant for a scheduled start, e.g. \"2026-09-08T09:15:00Z\" or with a local offset like \"2026-09-08T09:15:00+01:00\". Omit to start immediately. A start_at already in the past is just treated as already running from that instant."
    }
  }
}
create_agenda annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
create_badge — Create a countdown badge for a README, forum post or similar
Advertised by the server during the last successful anonymous check.
Advertised read-only

Create a countdown badge — a small image, not an <iframe> — for places embed_on_website's iframe cannot go: a GitHub README, a forum signature, a Notion page, anywhere only plain Markdown or a bare <img> is allowed. Shows coarse time remaining (e.g. "3d 04h left", not a live ticking clock — most places that embed images fetch and cache them server-side, so a promise of live ticking would be false) and links through to the real, precise, live countdown. Returns both a Markdown snippet and an HTML snippet; use whichever the destination accepts. Always returns the image wrapped in a link to the live countdown — never ask for or produce just the bare image, since the link is what makes this a genuine attribution rather than an untethered picture.

create_badge input schema
{
  "type": "object",
  "required": [
    "duration"
  ],
  "properties": {
    "label": {
      "type": "string",
      "description": "Optional short name shown on the badge, e.g. \"Launch\" or \"CFP closes\"."
    },
    "duration": {
      "type": "string",
      "description": "How long the timer runs. Accepts \"25m\", \"1h30m\", \"90s\", \"5:00\", \"1:30:00\", or a plain number read as minutes (\"45\"). A setup link or OBS overlay holds up to 99h59m59s. With start_now or embed_on_website, longer countdowns of up to 366 days are fine: \"10d\", \"10 days\", \"10d 6h\" or \"240h\"."
    },
    "badge_style": {
      "enum": [
        "board",
        "minimal",
        "light"
      ],
      "type": "string",
      "description": "Visual style: \"board\" (default, dark), \"minimal\" (no background — blends into any page) or \"light\"."
    }
  }
}
create_badge annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
describe_timer_link — Explain a CountLink link
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given a countlink.app URL, say what it encodes: whether it is a running countdown or a not-yet-started setup link, its label, and how much time is left. Use it when someone pastes a CountLink link and asks what it is or when it ends.

describe_timer_link input schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "A countlink.app timer URL."
    }
  }
}
describe_timer_link annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

countlink-board — CountLink live board

Advertised by the server during the last successful anonymous check.

Inline countdown board shown under create_timer results.

countlink-board URI
ui://countlink/board-v1.html

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

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (3 of 3 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 2 of 2 checks answered

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
452 ms
95th percentile latency
452 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 452 ms · metadata changed · 4 tool(s), 1 resource(s), 0 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 countlink-mcp https://countlink.app/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 countlink-mcp --url https://countlink.app/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start countlink-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "countlink-mcp": {
      "type": "http",
      "url": "https://countlink.app/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 countlink-mcp https://countlink.app/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://countlink.app/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": {
    "countlink-mcp": {
      "serverUrl": "https://countlink.app/mcp"
    }
  }
}

Let your agent find its tools

Find servers like CountLink MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run CountLink MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing