- Quickstarts
- Quickstart: MCP
Quickstarts
Quickstart: MCP
Connect an MCP client to Greatwait with OAuth or a scoped API key, and reach an observed callback.
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.
| What | Where |
|---|---|
| Server address | https://api.greatwait.dev/mcp |
| Discovery | https://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 resource | What it is for |
|---|---|---|
| 1 | resource greatwait://meta/version | Read the deployed version |
| 2 | tool endpoints_list | List callback endpoints |
| 3 | tool schedules_create | Create a schedule |
| 4 | tool schedules_read | Read a schedule |
| 5 | tool occurrences_list | List retained occurrences |
| 6 | tool occurrences_read | Read an occurrence |
| 7 | tool attempts_list | List delivery attempts |
| 8 | tool attempts_read | Read a delivery attempt |
| 9 | tool schedules_cancel | Cancel 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.
- 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"
}
}
}
- 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
- 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.
-
Issue a scoped key. On the API keys panel, issue a key with the scopes this setup lists. The secret is shown once.
-
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 see | What 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.