Koskamo

theluckystrike Timezone Planner MCP

A community MCP server that helps users schedule meetings across multiple time zones by finding overlapping working hours, checking daylight saving time changes, and generating .ics calendar invites.

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.

theluckystrike Timezone Planner MCP logo, by theluckystrikeCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by theluckystrike
You need:Free tier needs no keyGet a free token. It lasts 30 days and allows 600 calls per hour.
MCP endpoint (Streamable HTTP)
https://mcp.zovo.one/mcp/timezone
Vendor documentation

What its tools do

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

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

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Find meeting slots inside everyone's working hours
  • Check daylight saving time changes for specific dates
  • Convert times between different time zones
  • Generate .ics calendar invite files

Source and maintenance

Community listingRegistry 0.23.0
Maintenance checked

Protocol and capabilities

Server
mcp-timezone 0.22.6
MCP protocol negotiated in check
2025-11-25
Tools
11 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "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.

Time zone work for people and teams in different places. It covers the current time in cities, countries or IANA zones, moving a time between zones, shared working hours across places, ranked meeting slots, daylight-saving changes, business-day counts that exclude weekends but have no holiday calendar, saved contacts with their zones and working hours, and .ics meeting invites. Contacts are stored per user account on McpStamp's hosted service, and the user's own zone comes from the shared business profile. The free tier allows 5 contacts and 3 invites a month. One lifetime key unlocks this server and all 58 others: https://mcp.zovo.one/buy/bundle?src=instr.timezone

Tools

11 advertised

license_status — License status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.

license_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
license_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
license_activate — Activate license
Advertised by the server during the last successful anonymous check.

Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.

license_activate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "key"
  ],
  "properties": {
    "key": {
      "type": "string",
      "description": "License key from checkout, MCPL1.<payload>.<signature>"
    }
  }
}
license_activate annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
now — Current time in zones
Advertised by the server during the last successful anonymous check.

The current time in one or more places, each with the zone it resolved to and the local date, time and offset, under one UTC instant. Accepts IANA zones, cities, countries and abbreviations.

now input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "zones": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 100
      },
      "maxItems": 50,
      "description": "Places or IANA zones, e.g. ['Warsaw','New York','India']"
    }
  }
}
now annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
convert_time — Convert a time between zones
Advertised by the server during the last successful anonymous check.

Convert one time from from_zone into every zone in to_zones, marking any day change, plus the UTC instant. The time is wall-clock in from_zone unless it carries an offset or a trailing Z. '3pm tomorrow' works.

convert_time input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "time",
    "from_zone",
    "to_zones"
  ],
  "properties": {
    "gap": {
      "enum": [
        "forward",
        "backward"
      ],
      "type": "string",
      "description": "What to do with a time that does not exist because the clocks jumped forward: 'forward' takes the time after the jump, 'backward' the time before it. Without this, such a time is refused."
    },
    "fold": {
      "enum": [
        "first",
        "second"
      ],
      "type": "string",
      "description": "Which occurrence of a time that happens twice because the clocks went back. Default 'first'."
    },
    "time": {
      "type": "string",
      "maxLength": 100,
      "description": "'2026-09-10 15:00', '2026-09-10T15:00:00Z', '3pm tomorrow', 'now'"
    },
    "to_zones": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 100
      },
      "maxItems": 50,
      "minItems": 1,
      "description": "Places to convert into"
    },
    "from_zone": {
      "type": "string",
      "maxLength": 100,
      "description": "Place the time is given in, e.g. 'Warsaw' or 'Europe/Warsaw'"
    }
  }
}
convert_time annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
overlap — Daily working-hours overlap
Advertised by the server during the last successful anonymous check.

The window each day when every listed place is inside working hours. Computed on a real date, so a DST week that widens or narrows the overlap is reflected.

overlap input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "zones"
  ],
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 100,
      "description": "Date to compute on, YYYY-MM-DD, default today"
    },
    "zones": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 100
      },
      "maxItems": 50,
      "minItems": 2,
      "description": "Places, e.g. ['Warsaw','New York','Bangalore']"
    },
    "work_end": {
      "type": "string",
      "maxLength": 16,
      "description": "Local working day end, default 17:00"
    },
    "work_start": {
      "type": "string",
      "maxLength": 16,
      "description": "Local working day start, default 09:00"
    }
  }
}
overlap annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
find_meeting_slots — Find meeting slots
Advertised by the server during the last successful anonymous check.

Rank the times when every participant is inside their own working hours. Returns each slot as a UTC instant with the local time for every participant and a fairness score, best first.

find_meeting_slots input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "participants"
  ],
  "properties": {
    "days": {
      "type": "integer",
      "maximum": 366,
      "description": "How many days ahead to search, default 5, at most 366. Free tier: a search longer than 5 days is shortened to 5, not refused",
      "exclusiveMinimum": 0
    },
    "limit": {
      "type": "integer",
      "maximum": 100,
      "description": "How many slots to return, default 8. Slots are ranked by fairness: the score is the WORST participant's distance in hours from 13:00 local, so a slot that is 07:00 for one person never outranks one that suits everybody",
      "exclusiveMinimum": 0
    },
    "recurring": {
      "type": "boolean",
      "description": "Pro: also report the weekly recurring times that work on every searched weekday"
    },
    "participants": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1,
            "description": "Person or client name. A name you already saved with contacts_set needs nothing else: their zone and working hours are read from the contact"
          },
          "zone": {
            "type": "string",
            "maxLength": 100,
            "description": "Their place or IANA zone. Optional: leave it out for a saved contact, and leave it out for YOURSELF - your own zone comes from your shared business profile, so you never have to be asked for it"
          },
          "work_end": {
            "type": "string",
            "maxLength": 16,
            "description": "Their local day end, default 17:00 or the saved contact's"
          },
          "work_start": {
            "type": "string",
            "maxLength": 16,
            "description": "Their local day start, default 09:00 or the saved contact's"
          }
        }
      },
      "maxItems": 100,
      "minItems": 1,
      "description": "Who has to attend. A zone is OPTIONAL per person: a saved contact supplies their own, and anyone left without one (you, typically) takes the timezone on your shared business profile, so never ask the caller what timezone they are in - include yourself by name and let the server resolve it. Every slot returned is inside all of their hours; weekends in the first participant's zone are skipped. Free tier: up to 3 participants"
    },
    "earliest_date": {
      "type": "string",
      "maxLength": 100,
      "description": "First date to consider, YYYY-MM-DD, default today"
    },
    "duration_minutes": {
      "type": "integer",
      "maximum": 1440,
      "description": "Meeting length in minutes, default 60, at most 1440",
      "exclusiveMinimum": 0
    }
  }
}
find_meeting_slots annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
dst_changes — Daylight-saving changes
Advertised by the server during the last successful anonymous check.

The clock changes in a place for a year, with the exact UTC instant and the offset before and after. Use it to check whether a recurring call moves for one of you in March or October.

dst_changes input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "zone"
  ],
  "properties": {
    "year": {
      "type": "integer",
      "maximum": 2200,
      "minimum": 1850,
      "description": "Calendar year, default this year"
    },
    "zone": {
      "type": "string",
      "maxLength": 100,
      "description": "Place or IANA zone"
    }
  }
}
dst_changes annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
business_days — Count business days
Advertised by the server during the last successful anonymous check.

Count business days between two dates in a place, inclusive, with the calendar total and the weekend and holiday counts. It has NO holiday calendar: without holidays, only weekends are excluded.

business_days input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "from",
    "to",
    "zone"
  ],
  "properties": {
    "to": {
      "type": "string",
      "maxLength": 100,
      "description": "End date, YYYY-MM-DD (inclusive)"
    },
    "from": {
      "type": "string",
      "maxLength": 100,
      "description": "Start date, YYYY-MM-DD (inclusive). A date that does not exist, such as 2026-02-30, is refused, never rolled forward"
    },
    "zone": {
      "type": "string",
      "maxLength": 100,
      "description": "Place whose calendar to use"
    },
    "holidays": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 32
      },
      "maxItems": 400,
      "description": "Dates to exclude, strict YYYY-MM-DD. This tool has no national holiday calendar: unless you pass holidays here only weekends are excluded, so do not report the answer as a public-holiday-adjusted count"
    }
  }
}
business_days annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
contacts_set — Save a contact's zone
Advertised by the server during the last successful anonymous check.

Save one person's zone and working hours so later calls can name them. Returns the resolved zone and their local time now. Saving the same name REPLACES that contact and says so. Free: 5 contacts.

contacts_set input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name",
    "zone"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Their name"
    },
    "zone": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Their place or IANA zone"
    },
    "work_end": {
      "type": "string",
      "maxLength": 16,
      "description": "Local day end, default 17:00"
    },
    "work_start": {
      "type": "string",
      "maxLength": 16,
      "description": "Local day start, default 09:00"
    }
  }
}
contacts_set annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
contacts_list — List saved contacts
Advertised by the server during the last successful anonymous check.
Advertised read-only

List saved contacts with their zone, local time now, working hours and whether they are inside them; weekends count as outside. It also prints YOUR zone from the shared business profile.

contacts_list input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
contacts_list annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
ics_create — Write a calendar invite
Advertised by the server during the last successful anonymous check.

Call this tool to write a .ics for one meeting and return the path plus the start in UTC and in your zone. Times are stored in UTC so it lands correctly in any client. Free: 3 files a month.

ics_create input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "title",
    "start",
    "zone",
    "duration_minutes"
  ],
  "properties": {
    "gap": {
      "enum": [
        "forward",
        "backward"
      ],
      "type": "string",
      "description": "What to do with a time that does not exist because the clocks jumped forward: 'forward' takes the time after the jump, 'backward' the time before it. Without this, such a time is refused."
    },
    "fold": {
      "enum": [
        "first",
        "second"
      ],
      "type": "string",
      "description": "Which occurrence of a time that happens twice because the clocks went back. Default 'first'."
    },
    "zone": {
      "type": "string",
      "maxLength": 100,
      "description": "Place the start time is given in"
    },
    "start": {
      "type": "string",
      "maxLength": 100,
      "description": "Start time, read in `zone` unless it carries an offset"
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Event title"
    },
    "location": {
      "type": "string",
      "maxLength": 200,
      "description": "Where, or a meeting link"
    },
    "out_path": {
      "type": "string",
      "maxLength": 4096,
      "description": "Name for the downloaded file, default meeting.ics"
    },
    "attendees": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 200
          },
          {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "maxLength": 200,
                "description": "Display name"
              },
              "email": {
                "type": "string",
                "maxLength": 200,
                "description": "Their email address"
              }
            }
          }
        ]
      },
      "maxItems": 100,
      "description": "Attendees. An entry with an email is invited (ATTENDEE:mailto:...); a name with no email is listed in the description instead, because a calendar cannot invite a name."
    },
    "description": {
      "type": "string",
      "maxLength": 5000,
      "description": "Body text"
    },
    "organizer_name": {
      "type": "string",
      "maxLength": 200,
      "description": "Your display name for the ORGANIZER line"
    },
    "organizer_email": {
      "type": "string",
      "maxLength": 200,
      "description": "Your email address, written as the ORGANIZER so replies have somewhere to go. Leave it out and your shared business profile's email is used; with neither, the ORGANIZER line is omitted rather than filled with an address you improvised"
    },
    "duration_minutes": {
      "type": "integer",
      "maximum": 1440,
      "description": "Length in minutes, at most 1440",
      "exclusiveMinimum": 0
    }
  }
}
ics_create annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

2 advertised

upgrade_to_pro — Explain the upgrade

Advertised by the server during the last successful anonymous check.

Explain what Pro on the timezone server costs and exactly what the user has to do, without leaving the conversation.

feature
The capped feature that prompted this, if there was one
schedule_with — Schedule with saved contacts

Advertised by the server during the last successful anonymous check.

Propose meeting times with saved contacts, using their stored zones and working hours.

names
Comma-separated contact names, or 'all' (required)
duration_minutes
Meeting length in minutes, default 60

Resources

2 advertised

pricing — Pricing and upgrade

Advertised by the server during the last successful anonymous check.

What timezone costs, what Pro unlocks, the checkout link that carries this connection's token, and the one step a person has to take. Machine-readable; read it before telling a user how to lift a free-tier cap.

pricing URI
pricing://timezone

MIME type: application/json

contacts — Saved contacts and their local time

Advertised by the server during the last successful anonymous check.

Every saved contact with their zone, working hours and current local time.

contacts URI
tz://contacts

MIME type: text/plain

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 (1 of 1 answered).

  1. 2026-11-07: 1 of 1 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
1322 ms
95th percentile latency
1322 ms

Maintenance history

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

  • · probe · passed · 1322 ms · metadata changed · 11 tool(s), 2 resource(s), 0 resource template(s), 2 prompt(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 timezone-planner-mcp https://mcp.zovo.one/mcp/timezone

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 timezone-planner-mcp --url https://mcp.zovo.one/mcp/timezone

Cursor

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

Cline

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

VS Code

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

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 timezone-planner-mcp https://mcp.zovo.one/mcp/timezone

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://mcp.zovo.one/mcp/timezone

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "timezone-planner-mcp": {
      "serverUrl": "https://mcp.zovo.one/mcp/timezone"
    }
  }
}

Let your agent find its tools

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