WhenMeet.me — group scheduling

Group meeting scheduler — rank times everyone's free across Google & Outlook, book Meet/Teams.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
88%
Naming quality
95%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,317Tokens (tool definitions)
~1.0 KBTypical response size
Moderate attention impact (1.03% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "scheduler": {
      "url": "https://whenmeet.me/mcp"
    }
  }
}

Remote endpoints

https://whenmeet.me/mcpstreamable-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢find_common_slots(participants, from, to, durationMin, tz)

Rank the best meeting times for the given participants, merging live Google/Microsoft calendar data, hand-marked availability and the heat-map sources. Each participant is filtered (Mon–Fri, waking hours) and scored in their OWN timezone; scores factor in buffer time around existing meetings and prefer sooner slots. Returns up to 8 slots: everyone-free slots first (allFree:true), then — only if there are too few — the best compromise slots (allFree:false) with a freeCount. Defaults to the next 14 days. Requires authentication.

Input Schema

{
  "type": "object",
  "properties": {
    "participants": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Participant emails (the authenticated user is the host and should be included)."
    },
    "from": {
      "type": "number",
      "description": "Window start, unix ms. Default: now."
    },
    "to": {
      "type": "number",
      "description": "Window end, unix ms. Default: now + 14 days."
    },
    "durationMin": {
      "type": "number",
      "enum": [
        15,
        30,
        45,
        60
      ],
      "description": "Meeting length. Default 30."
    },
    "tz": {
      "type": "string",
      "description": "Requester IANA zone, e.g. Europe/Warsaw — the fallback zone for participants whose own timezone is unknown, and the zone for the round-hour scoring bonus."
    }
  },
  "required": [
    "participants"
  ]
}
🟡create_meeting(participants, startsAt, endsAt, title, conference, ...)

Confirm a meeting: writes the event into the authenticated host’s calendar with an optional Google Meet/Teams link, emails invites with an ICS attachment, and returns the share URL (/m/<id>). Requires authentication.

Input Schema

{
  "type": "object",
  "properties": {
    "participants": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "startsAt": {
      "type": "number",
      "description": "unix ms"
    },
    "endsAt": {
      "type": "number",
      "description": "unix ms"
    },
    "title": {
      "type": "string"
    },
    "conference": {
      "type": "string",
      "enum": [
        "meet",
        "teams"
      ],
      "description": "Omit for no conference link."
    },
    "tz": {
      "type": "string",
      "description": "IANA zone used to format times in invite emails."
    }
  },
  "required": [
    "participants",
    "startsAt",
    "endsAt"
  ]
}
🟢get_meeting(meetingId)

Read a meeting by its share-link id (the UUID from /m/<id>): time, title, conference URL, host, and any proposed alternate times with their status.

Input Schema

{
  "type": "object",
  "properties": {
    "meetingId": {
      "type": "string"
    }
  },
  "required": [
    "meetingId"
  ]
}
🟢get_meeting_availability(meetingId, from, to, durationMin, tz)

Aggregated group availability for an existing meeting (the symmetric heat-map): per-30-min-slot counts of how many participants are free, plus ranked slots (per-participant timezones, buffer + soonness scoring, allFree:true everyone-free slots and allFree:false compromise slots). Individual calendars are never exposed. No auth needed — the meeting id is the capability.

Input Schema

{
  "type": "object",
  "properties": {
    "meetingId": {
      "type": "string"
    },
    "from": {
      "type": "number",
      "description": "unix ms. Default: now."
    },
    "to": {
      "type": "number",
      "description": "unix ms. Default: now + 14 days."
    },
    "durationMin": {
      "type": "number",
      "enum": [
        15,
        30,
        45,
        60
      ]
    },
    "tz": {
      "type": "string"
    }
  },
  "required": [
    "meetingId"
  ]
}
⚪suggest_time(meetingId, suggestedBy, startsAt, endsAt, message, ...)

Propose a different time for an existing meeting on behalf of a guest. The host is notified by email and can accept or decline. Authenticated callers (Bearer PAT) skip the bot challenge; an anonymous caller must pass a Cloudflare Turnstile token in `turnstileToken` (only required when the server is configured with a Turnstile secret).

Input Schema

{
  "type": "object",
  "properties": {
    "meetingId": {
      "type": "string"
    },
    "suggestedBy": {
      "type": "string",
      "description": "Email of the person proposing."
    },
    "startsAt": {
      "type": "number",
      "description": "unix ms"
    },
    "endsAt": {
      "type": "number",
      "description": "unix ms"
    },
    "message": {
      "type": "string"
    },
    "turnstileToken": {
      "type": "string",
      "description": "Cloudflare Turnstile token; required for anonymous callers when a Turnstile secret is configured."
    }
  },
  "required": [
    "meetingId",
    "suggestedBy",
    "startsAt",
    "endsAt"
  ]
}
⚪respond_to_suggestion(meetingId, suggestionId, action)

Accept or decline a proposed alternate time. Accepting moves the meeting (calendar event included) and re-sends invites. Only the meeting host may call this — requires authentication.

Input Schema

{
  "type": "object",
  "properties": {
    "meetingId": {
      "type": "string"
    },
    "suggestionId": {
      "type": "string"
    },
    "action": {
      "type": "string",
      "enum": [
        "accept",
        "decline"
      ]
    }
  },
  "required": [
    "meetingId",
    "suggestionId",
    "action"
  ]
}
🟡set_manual_availability(email, windowFrom, windowTo, freeSlots, turnstileToken)

Publish hand-marked FREE time slots for an email address (the no-calendar fallback, e.g. Apple iCloud users). Replaces previously marked slots inside the window; the group heat-map updates immediately. Authenticated callers (Bearer PAT) skip the bot challenge; an anonymous caller must pass a Cloudflare Turnstile token in `turnstileToken` (only required when the server is configured with a Turnstile secret).

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "type": "string"
    },
    "windowFrom": {
      "type": "number",
      "description": "unix ms"
    },
    "windowTo": {
      "type": "number",
      "description": "unix ms"
    },
    "freeSlots": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "start": {
            "type": "number"
          },
          "end": {
            "type": "number"
          }
        },
        "required": [
          "start",
          "end"
        ]
      }
    },
    "turnstileToken": {
      "type": "string",
      "description": "Cloudflare Turnstile token; required for anonymous callers when a Turnstile secret is configured."
    }
  },
  "required": [
    "email",
    "windowFrom",
    "windowTo",
    "freeSlots"
  ]
}
🟢get_manual_availability(email, from, to)

Read previously hand-marked free slots for an email within a window.

Input Schema

{
  "type": "object",
  "properties": {
    "email": {
      "type": "string"
    },
    "from": {
      "type": "number"
    },
    "to": {
      "type": "number"
    }
  },
  "required": [
    "email",
    "from",
    "to"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools
verifiedversion not recorded8 tools