Connect an assistant (MCP)

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)

  1. 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.
  2. 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.
  3. 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.
  4. 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.

{
  "mcpServers": {
    "call-me-awake": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://staging.callmeawake.com/mcp", "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer wk_..." }
    }
  }
}

Claude Code

With OAuth (you sign in once in the browser):

claude mcp add --transport http call-me-awake https://staging.callmeawake.com/mcp

Then start claude, run /mcp, pick call-me-awake and choose to authenticate.

With an API key instead (no browser step; good for scripts and headless machines):

claude mcp add --transport http call-me-awake https://staging.callmeawake.com/mcp \
  --header "Authorization: Bearer wk_..."

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.

{
  "mcpServers": {
    "call-me-awake": {
      "url": "https://staging.callmeawake.com/mcp",
      "headers": { "Authorization": "Bearer wk_..." }
    }
  }
}

ChatGPT

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:

curl -sS https://staging.callmeawake.com/mcp \
  -H "Authorization: Bearer wk_..." \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

API keys

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_context read-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_timezones read-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
query required string

City, country, airport code (e.g. 'NRT') or part of a zone name

limit integer min 1 max 50 default 5

list_wakeup_calls read-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_call changes 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`.

Field Type Description
kind required any one of "once", "recurring"
timezone required string

IANA zone id

local_time string

24-hour HH:MM

pattern ^([01]\d|2[0-3]):[0-5]\d$
local_date string (date)

Required for kind=once unless in_minutes is given

in_minutes integer min 1 max 1440
days_of_week array of any items: "mon", "tue", "wed", "thu", "fri", "sat", "sun"
label string max length 60
message string

Short spoken note, e.g. 'Your flight is at nine'

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.

max length 40
phone_number_id string

Defaults to the primary verified number

idempotency_key string

update_wakeup_call changes 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.

Field Type Description
schedule_id required string

The id from list_wakeup_calls

kind any one of "once", "recurring"
timezone string

IANA zone id

local_time string

24-hour HH:MM

pattern ^([01]\d|2[0-3]):[0-5]\d$
local_date string (date)

For kind=once, in the call's zone

days_of_week array of any items: "mon", "tue", "wed", "thu", "fri", "sat", "sun"
start_date string (date)

Recurring: first local date

end_date any or any

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_call changes 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_id required string

The id from list_wakeup_calls

mode any one of "delete", "disable"
idempotency_key string

skip_next changes 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_id required string

The id from list_wakeup_calls

idempotency_key string

pause_wakeup_call changes 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_id required string

The id from list_wakeup_calls

until required string (date)

Local date in the call's own zone

idempotency_key string

resume_wakeup_call changes 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_id required string

The id from list_wakeup_calls

idempotency_key string

list_call_history read-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 1 max 50 default 10

get_account read-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_wakeups changes 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
itinerary required array of object min items 1 max items 60
itinerary[].local_date required string (date)

Date in that entry's zone

itinerary[].timezone required string

IANA zone id

itinerary[].local_time required 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_text required The 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_time required Weekday wake-up time, 24-hour HH:MM
  • weekend_time required Weekend wake-up time, 24-hour HH:MM
  • timezone required IANA 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.