1. Quickstarts
  2. Quickstart: MCP

Greatwait is a remote MCP server. It speaks Streamable HTTP at one address, publishes RFC 9728 discovery beside it, registers clients dynamically, and authorizes them with OAuth 2.1 and S256 PKCE. A client that supports all of that needs the address and nothing else.

WhatWhere
Server addresshttps://api.greatwait.dev/mcp
Discoveryhttps://api.greatwait.dev/.well-known/oauth-protected-resource/mcp

A connection acts in one project and one environment for its whole life. There is no tool that moves between them, and a tool argument naming another project is refused rather than ignored.

​
Scopes

A connection that reaches first value needs endpoints:read, occurrences:read, schedules:read, schedules:write. A connection authorized for fewer lists fewer tools, which is the quickest way to tell a scope problem from a connection problem.

​
What an MCP client cannot do, and why

It cannot create a destination. Creating one returns a signing secret that is shown exactly once, and MCP has no channel that could carry it without putting it into ordinary tool history. So the destination is created by a person in the dashboard, or through the API, and the client works against it. Every withheld operation, with its reason, is in the MCP tools reference.

This is the sequence a connected client walks:

#Tool or resourceWhat it is for
1resource greatwait://meta/versionRead the deployed version
2tool endpoints_listList callback endpoints
3tool schedules_createCreate a schedule
4tool schedules_readRead a schedule
5tool occurrences_listList retained occurrences
6tool occurrences_readRead an occurrence
7tool attempts_listList delivery attempts
8tool attempts_readRead a delivery attempt
9tool schedules_cancelCancel a schedule

First value is reading the attempt, not creating the schedule. Creating a schedule proves the server accepted something; reading the occurrence and its delivery attempt is the first point at which you can see that a real call was made to your address and what came back.

Cancelling comes last because it only stops a schedule that has not fired. Once a one-shot has delivered there is nothing left to cancel, and the call answers state_conflict.

​
Cursor

The editor. Its MCP client is its own implementation rather than the reference SDK, which is why it is the second client this product proves against.

Before you start.

  • A project. Accept your Greatwait invitation, sign in, and create a project in the dashboard. projects.create accepts only a signed-in member, so a project is created by a person rather than by an API credential.
  • An HTTPS receiver you control. Have an HTTPS URL of your own that answers POST with a 2xx status, and can be reached from the public internet. Greatwait delivers your callback to an address you control. It does not offer a shared receiver to try, and it will not send your payload to a third-party inspection service on your behalf.

​
OAuth

Cursor discovers and registers itself from the address alone. The approval lives with Cursor and is disconnected from Greatwait’s connected-applications list.

  1. Add the server to Cursor’s MCP configuration. One entry, one address. Cursor reads the discovery document itself and works out that the server needs authorizing.

In ~/.cursor/mcp.json:

{
  "mcpServers": {
    "greatwait": {
      "url": "https://api.greatwait.dev/mcp"
    }
  }
}
  1. Authorize it. Cursor registers itself and opens Greatwait’s consent screen in your browser. Approve it there. Inside the editor the same step is the sign-in prompt beside the server in settings.
cursor-agent mcp login greatwait
  1. Check what it can do. The tools your connection is allowed to see. A connection authorized for fewer scopes lists fewer tools, which is the quickest way to tell a scope problem from a connection problem.
cursor-agent mcp list-tools greatwait

​
API key

The fallback, for when OAuth cannot be used. It trades a revocable approval for a secret sitting in a file.

This writes a credential to disk. This writes a credential secret into a file on your machine in plain text, where every process running as you can read it and any backup of your home directory keeps a copy. Prefer OAuth. If you use a key here, scope it to what the connection actually needs and rotate it on the same schedule as anything else you keep in a dotfile.

  1. Issue a scoped key. On the API keys panel, issue a key with the scopes this setup lists. The secret is shown once.

  2. Write the key into the configuration. Replace the placeholder with the secret. Nothing in Greatwait fills this in for you, and no page will show you the value again.

In ~/.cursor/mcp.json:

{
  "mcpServers": {
    "greatwait": {
      "headers": {
        "Authorization": "Bearer <the key, shown once at creation>"
      },
      "url": "https://api.greatwait.dev/mcp"
    }
  }
}

​
When it refuses

What you seeWhat to do
The consent screen refuses before showing any scopes, naming the redirect.Close any earlier authorization tab and start the sign-in again from the client. The client registers its own redirect when it registers itself, and a half-finished authorization from a previous attempt is the usual cause.
The browser approval succeeds but the client still reports the server as unauthorized.Run the sign-in step again. An authorization code is single-use and short-lived, and reusing one ends the grant it belonged to rather than returning a token.
The client reports the server as needing authentication, or lists no tools at all.The connection is not authorized. For OAuth, disconnect and reconnect the server so the client runs discovery and consent again. For a key, check the value was copied whole — it is shown once, and a truncated paste fails exactly like a wrong one.
Calls that worked a moment ago now refuse, immediately and always.Somebody revoked this credential, and nothing brings it back. Issue a new key on the API keys panel and put the new value in the client’s configuration.
The same as a revocation, but it began at a deadline you were told about.This key was rotated and its overlap has run out. The replacement was shown once when you rotated; if it was not kept, rotate again and use the new value.
Some tools work and one refuses, with a problem naming the scope it wanted.The connection is authorized for less than the tool needs. For OAuth, reconnect and approve the scopes the setup lists. For a key, issue one with those scopes — a key’s scopes are fixed when it is made.
A tool call names a destination or schedule the connection cannot see.Read the destination list through the client and use an identifier from it. A connection acts in one project and one environment for its whole life, so an identifier copied from another project is not there to be found.
A tool call is refused for an argument the client thought was optional.An argument naming another project or environment is refused rather than ignored. Drop it: the connection already says which project the work goes to.

​
Turning a connection off

An OAuth connection is disconnected from Connected applications on the access page, and the next tool call it makes is refused. A key is revoked from the API keys panel on the same page, and nothing brings it back — issue a new one and update the client’s configuration.