Call Me Awake runs a Model Context Protocol (MCP) server.
Connect an assistant and you can say "wake me at 6:30 tomorrow, Tokyo time" and it sets a real phone call, pinned to that time zone.
It can list, create, move, skip, pause and cancel your calls; it never touches your phone numbers, billing or API keys.
The server
URL
https://staging.callmeawake.com/mcp
Transport
Streamable HTTP, stateless, JSON responses (no session id, no event stream).
Sign in
OAuth 2.1 (authorization code with PKCE, dynamic client registration, one scope, wakeupcall), or an
API key sent as a bearer token.
Discovery
A request without credentials gets 401 and a WWW-Authenticate header that points at
https://staging.callmeawake.com/.well-known/oauth-protected-resource, which clients follow to find the sign-in server.
Limits
30 tool calls a minute per sign-in or key. Every call is logged on your account as made by an assistant.
The URL must be reachable from your client. Claude.ai and ChatGPT connect from the vendor's cloud, so a server on
localhost will not work for them; use Claude Code or the generic setup for local testing.
Set up your client
Vendors rename their menus often. These steps are the shape of the setup; where a step names a menu, check the client's own docs for its current name.
Claude.ai (custom connector, OAuth)
Open Claude's connector settings (Settings, then Connectors) and choose to add a custom connector. On Team and Enterprise plans an organization owner adds it first. Custom connectors are not on every plan: check Anthropic's docs.
Name it Call Me Awake and enter the URL https://staging.callmeawake.com/mcp. Leave any OAuth client ID and secret fields empty: the client registers itself.
Choose Connect. You are sent to Call Me Awake to sign in, then to a screen that says the assistant wants to manage your wake-up calls. Approve it.
Back in a chat, turn the connector on from the tools menu, then ask for a call.
You can disconnect any assistant later under connected apps in your settings.
Claude Desktop
Add it as a custom connector, exactly as for Claude.ai above, with the same URL (https://staging.callmeawake.com/mcp) and the same sign-in. This is the supported way to add a remote server; check Anthropic's docs for where Claude Desktop shows connectors.
The claude_desktop_config.json file is for local servers that Claude Desktop starts itself and does not take a remote URL. If you want a key-based setup there, a bridge such as the third-party mcp-remote package can proxy a remote server. We have not tested it: check its docs before relying on it.
claude mcp list shows whether it connected. By default the server is saved for you in this project only; the options for sharing it are in Claude Code's docs. Never commit a key to a shared project file.
Cursor (API key)
Use an API key, not OAuth. Cursor's sign-in returns through a cursor:// link, and Call Me Awake only accepts https and loopback redirects for OAuth clients, so the OAuth flow cannot complete. If a later Cursor release offers an https redirect, OAuth will work: check Cursor's docs.
Add the server to ~/.cursor/mcp.json (or .cursor/mcp.json in a project; do not commit a key). Check Cursor's docs for the current file format.
ChatGPT can connect to a remote MCP server as a custom connector on some plans (it may sit behind a developer-mode switch). Give it the URL https://staging.callmeawake.com/mcp and choose OAuth. We have not been able to confirm the current menus or plan requirements: check OpenAI's docs.
Any other MCP client
Point it at https://staging.callmeawake.com/mcp as a remote (Streamable HTTP) server. A client that supports MCP's OAuth flow finds everything it needs from the 401 challenge. One that does not takes a header: Authorization: Bearer wk_.... To check a key by hand:
An API key is a long secret that starts with wk_. Send it as Authorization: Bearer wk_.... The same key works for the REST API.
Create one from your account (see POST /api/v1/api-keys in the API reference). The full key is shown once, so store it like a password; delete it to revoke it.
A key has the read and write scopes unless you choose fewer. Downloading the full account export over the REST API needs the export scope, which a key has only if you add it when you make the key. Making or deleting keys, registering or removing a phone or browser, and deleting the account are never possible with a key: use the app or the web.
A key gives whoever holds it the same access as an assistant you signed in: keep it out of chats, screenshots and shared config files.
How the assistant is told to behave
The server sends every client these instructions, and each tool's description repeats the rules that matter for it:
Call Me Awake: wake-up call service (phone wake-up calls pinned to time zones). Manages the user's real phone wake-up calls. Every call is a wall-clock time in a named IANA time zone. Rules: call get_time_context before creating or moving a call and resolve dates like 'tomorrow' in the TARGET zone; never create a call without an explicit IANA zone (use search_timezones, and ask when candidates disagree); always say a time with its zone; read confirmation_text back to the user after every create, update or cancel. Phone numbers, billing, API keys, account deletion and turning calls back on after a press 9 are done by the user in the app or on the web, never here.
Tools (12)
Generated from the server. A tool that changes something takes an optional idempotency_key: repeating a call with the same key does not create a second wake-up call.
get_time_contextread-only
ALWAYS call this first before creating, moving, or reasoning about any wake-up call. Returns the current time in UTC, in the user's home zone, in the user's device zone (if known), and in any zones you pass. Use `now_local` of the TARGET zone to resolve words like 'tomorrow' or 'tonight'. Never compute dates from your own sense of the current time.
Field
Type
Description
zones
array of string
Extra IANA zones to report, e.g. the zone of a trip
search_timezonesread-only
Resolve a city, country, airport code, or partial zone name to IANA timezone identifiers. Returns ranked candidates with the current UTC offset. If more than one plausible candidate exists (e.g. 'Portland'), ask the user which one before scheduling.
Field
Type
Description
queryrequired
string
City, country, airport code (e.g. 'NRT') or part of a zone name
limit
integer
min 1max 50default 5
list_wakeup_callsread-only
List the user's wake-up calls. Each has its next call (`next_occurrence`: the local time with its IANA zone and UTC offset, `scheduled_at` in UTC, the time in the user's home zone) and a `summary` sentence. Always say a time together with its zone, never a bare time. `status`: 'active' (default) lists the calls that still ring; 'all' adds finished and turned-off ones.
Field
Type
Description
status
any
one of "active", "all"default "active"
create_wakeup_callchanges data
Create a wake-up call. `timezone` MUST be an IANA identifier (e.g. 'Asia/Tokyo'), never an abbreviation or offset; use `search_timezones` if unsure. For one-off calls provide `local_date` (resolved in the TARGET zone using `get_time_context`) or `in_minutes`. The response restates the call in the target zone and in the user's home zone; read it back to the user verbatim and mention any `notice`.
The name this call greets the user by, e.g. 'Kyle'. Letters, digits and basic punctuation only, no links or phone numbers. Leave it out to use the name the user set for their account.
max length 40
phone_number_id
string
Defaults to the primary verified number
idempotency_key
string
update_wakeup_callchanges data
Change a wake-up call: pass `schedule_id` (from `list_wakeup_calls`) and only the fields to change, with the same rules as `create_wakeup_call`. A new `timezone` MUST be an IANA identifier, never an abbreviation or offset (use `search_timezones`); resolve a new `local_date` in the TARGET zone using `get_time_context`. The response restates the call in the target zone and in the user's home zone; read `confirmation_text` back to the user verbatim and mention any `notice`. Changing the time, date (or days) or zone of a call that is turned off or done turns it back on, unless you also pass `enabled: false`. To clear a recurring call's end date, pass `end_date: ""`. Turning on a one-off whose time has passed fails with `time_in_past`: ask the user for a new date.
Recurring: last local date. An empty string clears it (no end date); that also sets a Done call again.
always ""
label
string
max length 60
message
string
max length 140
greeting_name
string
The name this call greets the user by, e.g. 'Kyle'. Letters, digits and basic punctuation only, no links or phone numbers. Leave it out to use the name the user set for their account. An empty string clears it.
max length 40
phone_number_id
string
enabled
boolean
backup_alarm
boolean
sms_fallback
boolean
idempotency_key
string
cancel_wakeup_callchanges data, can delete
Cancel a wake-up call. `mode` 'delete' removes it (the default for one-off calls); 'disable' turns it off so it can be turned back on later (the default for recurring calls). Read `confirmation_text` back to the user verbatim.
Field
Type
Description
schedule_idrequired
string
The id from list_wakeup_calls
mode
any
one of "delete", "disable"
idempotency_key
string
skip_nextchanges data
Skip only the next call of a recurring wake-up call; the days after it still ring. Returns the new next call with its zone. Read `confirmation_text` back to the user verbatim. To stop a one-off call, use `cancel_wakeup_call`.
Field
Type
Description
schedule_idrequired
string
The id from list_wakeup_calls
idempotency_key
string
pause_wakeup_callchanges data
Pause a recurring wake-up call: no calls on local dates before `until`, which is a date (YYYY-MM-DD) in the call's own zone, resolved there using `get_time_context`; it rings again from `until`. Read `confirmation_text` back to the user verbatim.
Field
Type
Description
schedule_idrequired
string
The id from list_wakeup_calls
untilrequired
string (date)
Local date in the call's own zone
idempotency_key
string
resume_wakeup_callchanges data
Resume a paused recurring wake-up call, so its next eligible day rings again. Read `confirmation_text` back to the user verbatim.
Field
Type
Description
schedule_idrequired
string
The id from list_wakeup_calls
idempotency_key
string
list_call_historyread-only
The user's past wake-up calls, newest first: each with a `summary` in prose that names its zone and what happened (answered on which attempt and confirmed when, or why not).
Field
Type
Description
limit
integer
min 1max 50default 10
get_accountread-only
The user's account: name, home time zone, verified phone numbers (masked), plan and calls left, and whether calls are turned off. Calls turned off by pressing 9 can be turned back on only by the user, in the app or on the web, never through this assistant; phone numbers, billing, API keys and deleting the account are also managed there. Send the user to the app for those.
No arguments.
plan_trip_wakeupschanges data
Set wake-up calls for a whole trip: one itinerary entry per call, each with `local_date`, `local_time` and `timezone` (an IANA identifier for where the user will be that morning; use `search_timezones` for each city, and resolve each date in that TARGET zone using `get_time_context`). Call it with `dry_run: true` (the default) first: it creates nothing and returns every entry resolved, with `scheduled_at`, the time in the user's home zone, any `notice`, and `conflicts` (calls already ringing that local day). Show that plan to the user, and only after they confirm call it again with `dry_run: false`, which creates every entry in one transaction (all or none). Read `confirmation_text` back to the user verbatim.
Field
Type
Description
itineraryrequired
array of object
min items 1max items 60
itinerary[].local_daterequired
string (date)
Date in that entry's zone
itinerary[].timezonerequired
string
IANA zone id
itinerary[].local_timerequired
string
24-hour HH:MM
pattern ^([01]\d|2[0-3]):[0-5]\d$
itinerary[].label
string
max length 60
itinerary[].message
string
max length 140
itinerary[].phone_number_id
string
dry_run
boolean
default true
idempotency_key
string
Resources (3)
Read-only data an assistant can load without calling a tool.
wakeupcall://me
The account summary (same as get_account).
wakeupcall://schedules
All of the user's wake-up calls, with their next call and zone.
wakeupcall://schedules/{schedule_id}(template)
One wake-up call with its next 7 calls, each with its zone and UTC offset.
Prompts (2)
Ready-made requests a client can offer from its prompt menu.
set_travel_wakeups
Set wake-up calls for a trip from an itinerary: resolve each city's zone, plan with a dry run, and create only after confirmation.
itinerary_textrequiredThe trip in the user's words: dates, cities, wake-up times
morning_routine
Two recurring wake-up calls, one for weekdays and one for weekends, created after confirmation.
weekday_timerequiredWeekday wake-up time, 24-hour HH:MM
weekend_timerequiredWeekend wake-up time, 24-hour HH:MM
timezonerequiredIANA zone of the place the calls ring, e.g. America/New_York
What stays in the app
Verifying a phone number, billing, API keys, deleting your account and turning calls back on after you pressed 9 on a call are done by you, in the app or on the web. The assistant has no tool for them and sends you there.
If it does not connect
401 Unauthorized. No credentials, an expired or revoked sign-in, or a key that was deleted. Reconnect the client, or create a new key.
The sign-in page never comes back. The client may use a redirect we do not accept (see Cursor); use an API key.
Rate limited. More than 30 tool calls in a minute; the assistant is told how long to wait.
Errors from a tool use the same codes as the REST API: see error codes.