All servers · Buy Pro $19 · Source · Claude Desktop bundle (.mcpb)
Work with clients in other countries without doing time zone arithmetic in your head. Ask "what time is it for Maria in Lisbon", "convert 3pm Warsaw to New York and Bangalore", or "find an hour next week that works for me, my client in New York and my designer in London" and get an answer you can act on: ranked meeting slots where everyone is inside their own working hours, the exact daily overlap, when the clocks change, how many business days a delivery date is, and a calendar file you can send. Saved contacts, working hours and nothing else live as plain JSON on your own machine.
Built by theluckystrike.

Find a meeting time that works for everyone abroad, convert any time between cities, and write the invite -- zero setup, all local.
npm publish for @theluckystrike/mcp-timezone is pending. Until then, the .mcpb one-click bundle or a
clone+build is the working path -- both are verified below.
One-click (.mcpb): download timezone.mcpb from the latest release and double-click it in Claude Desktop:
https://github.com/theluckystrike/mcp-servers/releases/latest
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"timezone": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-timezone"]
}
}
}
Claude Code:
claude mcp add timezone -- npx -y @theluckystrike/mcp-timezone
Cursor (.cursor/mcp.json):
{
"mcpServers": {
"timezone": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-timezone"]
}
}
}
The npx form above starts working the moment the package is published. Until then, use the .mcpb bundle above,
or build from source with exactly these three commands:
git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/timezone
Then point your client's command at node with one arg: the absolute path to servers/timezone/dist/index.js.
To run in Pro mode set MCP_LICENSE_KEY in the same config block, or call license_activate once with your key.
| Tool | What it does |
|---|---|
now |
The current time in any list of places, with the zone abbreviation and UTC offset. With no arguments: this machine's zone and UTC. |
convert_time |
Convert a time from one place to any number of others. Reads "2026-09-10 15:00", an ISO timestamp, or "3pm tomorrow" as wall-clock time in from_zone; a trailing Z or an explicit offset wins over from_zone. Flags a next-day or previous-day result. |
find_meeting_slots |
Ranked times where every participant is inside their own working hours, on a 30-minute grid, weekends skipped. Ranked by fairness (see below). |
overlap |
The daily window when every listed place is at work, in UTC and in each local clock, computed on a real date so DST weeks are honest. |
dst_changes |
Every clock change in a place for a year: the exact UTC instant, the offset before and after, and the local time either side. |
business_days |
Business days between two dates in a place, excluding weekends and any holidays you pass. |
ics_create |
Write a .ics calendar file for one meeting and return the path. |
contacts_set |
Remember a client or teammate's zone and working hours. |
contacts_list |
Everyone you have saved, their local time now, and whether they are inside working hours. |
license_status |
Free or Pro, and where to upgrade. |
license_activate |
Activate a Pro key (verified offline). |
Also exposed: the resource tz://contacts (saved contacts and their current local time) and the prompt
schedule_with (proposes times with saved contacts, then offers to write the invite).
No tool names required.
| You say | Tool |
|---|---|
| "What time is it in Warsaw, New York and Bangalore right now?" | now |
| "Convert 3pm Warsaw on 10 September to New York and India." | convert_time |
| "Find an hour next week for me in Warsaw, my client in New York and my designer in London." | find_meeting_slots |
| "When are Warsaw and New York both at work?" | overlap |
| "Do the clocks change in Warsaw before our March call?" | dst_changes |
| "How many business days from 1 to 30 September, excluding the 15th?" | business_days |
| "Write me the .ics for Thursday 3pm Warsaw, 45 minutes, invite maria@acme.com." | ics_create |
| "Remember that Maria is in Lisbon and works 10 to 6." | contacts_set |
| "Who's awake right now?" | contacts_list |
You: Find an hour next week for me in Warsaw, my client in New York and my designer in London.
find_meeting_slots { participants: [{name:"Me",zone:"Warsaw"},{name:"Client",zone:"New York"},
{name:"Designer",zone:"London"}], duration_minutes: 60, days: 5 }
Assistant: 15 slots fit all 3 participants. Best first:
1. 2026-09-07T13:30:00.000Z fairness 3.00h
Me 15:30-16:30 | Client 09:30-10:30 | Designer 14:30-15:30
Three hours of fairness is not a flaw in the ranking, it is the truth about Warsaw and New York: with 09:00-17:00 days on both sides the shared window is only 15:00-17:00 Warsaw, so somebody's meeting is always far from the middle of their day. The score says so instead of hiding it. Widen one person's hours and the score improves.
You: Write the invite for that one, 45 minutes, and send it to maria@acme.com.
ics_create { title:"Kickoff with Acme", start:"2026-09-10 15:00", zone:"Warsaw",
duration_minutes:45, attendees:["maria@acme.com"] }
Assistant: Wrote /Users/you/.local/share/mcp-servers/timezone/meeting.ics
Kickoff with Acme: 2026-09-10 15:00 Thu (CEST, UTC+02:00) for 45 min
DTSTART 2026-09-10T13:00:00.000Z (UTC)
find_meeting_slots scores every candidate by the worst participant's distance from 13:00 local, in hours,
and sorts ascending. The worst, not the average, on purpose: a slot that is pleasant for two people and 07:00
for the third must never outrank one that is 10:00 for everybody. A fairness of 0 would mean the meeting sits
at midday for all of them; anything under about 2 is comfortable.
A slot is only offered when the whole meeting -- start to end -- is inside every participant's working window, on their own local calendar day. Weekends in the first participant's zone are skipped. When nothing fits, the server says so and shows the windows, rather than proposing a 06:00 call.
City and country names resolve through a built-in table of 510 entries (300+ cities, every commonly used
country, US state shorthands and abbreviations like PST, IST, CET). Every entry is verified against
Intl.supportedValuesOf("timeZone") at startup; an entry this Node build cannot resolve is dropped with a
line on stderr rather than silently answering with the wrong zone.
America/Denver and you get exactly that.UTC+2 style offsets resolve to the matching fixed zone (Etc/GMT-2 -- the Etc signs are inverted by the
IANA database, not by this server).unknown time zone or place: "Warsawa". Did you mean: warsaw (Europe/Warsaw)?DST is not stored here at all. Every offset comes from the ICU data inside your Node build via
Intl.DateTimeFormat, so the rules stay current as Node updates instead of going stale in a bundled table.
| Free | Pro | |
|---|---|---|
now, convert_time, overlap, dst_changes, business_days |
Unlimited | Unlimited |
find_meeting_slots participants |
Up to 3 | Unlimited |
find_meeting_slots search window |
Up to 5 days | Unlimited |
Recurring-slot search (recurring: true) |
-- | Yes |
| Saved contacts | 5 | Unlimited |
.ics files |
3 per month | Unlimited |
Pro is $19 one-time, or $39 for every server in the bundle: Get Pro. Activation is offline: keys are Ed25519 signatures verified against a public key compiled into the package.
Contacts and the monthly .ics counter live in one JSON file:
${XDG_DATA_HOME:-~/.local/share}/mcp-servers/timezone/data.json.
Every write happens under an advisory lock at .../timezone/.lock, held across the whole load-mutate-save
cycle, so two clients sharing one data dir cannot discard each other's contacts. The save writes a temporary
file and renames it into place, so a crash mid-write leaves either the old file or the new one.
If data.json is ever unreadable or not valid JSON, the server does not treat that as "no contacts yet".
It moves the file aside byte-for-byte as data.json.corrupt-<timestamp>, writes a data.json.corrupt marker,
and every later call fails with data file is corrupt; moved to ...; nothing was written until you restore a
good copy and delete the marker.
from_zone, not UTC. 2026-09-10 15:00 with
from_zone: "Warsaw" is 15:00 in Warsaw. A trailing Z or an explicit +05:30 is honoured exactly and
from_zone is then only used for display.02:30 on 2026-03-29 in Warsaw resolves to
03:30 local (the instant right after the jump), which is what calendars do. It is never silently moved back..ics files carry UTC times (DTSTART:20260910T130000Z) and no VTIMEZONE block. That is deliberate:
a hand-written VTIMEZONE with stale DST rules is the classic way an invite lands an hour off.business_days yourself) or anyone's lunch.work_start/work_end or read the dates.npx hangs or fails to find the package: npm publish is pending. Use the .mcpb bundle or the
clone-and-build path above.America/Argentina/Cordoba is available even when the city name is not in the table.node -v. Older builds ship older DST rules.--mcp-debug.license_status, and confirm MCP_LICENSE_KEY is set in the process the
client launches, not just your shell.All data stays local: contacts live in ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/timezone/data.json.
The server makes no network requests, has no telemetry and needs no account. Time zone data comes from the
ICU database already inside Node.
Does it handle daylight saving? Yes, and it does not store any DST rules of its own. Every offset is read from the ICU data in your Node build, so Warsaw and New York being 5 hours apart (not 6) between 8 and 29 March 2026 falls out correctly.
Why is my best slot still awkward? Because a real overlap can be two hours wide. The fairness score reports the worst person's distance from their midday so you can see the cost and decide who absorbs it.
Can I use half-hour zones? Yes. India (+05:30), Nepal (+05:45), Adelaide (+09:30) and Chatham are handled like any other zone; the slot grid is 30 minutes, so a half-hour zone produces :00 and :30 local starts.
Does it read my calendar?
No. It knows only the working hours you give it. It writes .ics files; it never reads or connects to a
calendar service.
Does it need an internet connection? No. There are no network calls anywhere, including license activation.
MIT
Exact config path, entry and caveats: Claude Desktop · Claude Code · Cursor · VS Code · Windsurf · Cline · all clients
MCP Timezone Planner vs meeting-mcp and timezone-toolkit: which MCP server to pick · all comparisons
How to track billable hours inside Claude Code and Cursor · Create an invoice PDF from a chat message with an MCP server · Ask questions about an Excel or CSV file from Cursor or Claude · Watch a product price with Claude and get told when it drops · What the free tier includes and what Pro adds · Log expenses and mileage in Claude, split VAT, rebill to an invoice · Convert currencies in Claude with real ECB rates, no API key · Generate Word proposals and contracts from a chat message · Find a meeting time across time zones without doing the arithmetic · All guides