api.evermuse.com is both the resource server and the authorization server. Most MCP clients
handle this flow automatically: you only see a browser sign-in and consent screen.
API keys are also accepted for clients that can’t run OAuth. See API keys.
What you see when you connect
1
Sign in
Your client opens
https://app.evermuse.com/oauth/authorize in your browser. The page shows which application is
asking to connect. Sign in with Google, Microsoft or email. If you don’t have an Evermuse account yet,
you can create one here.2
Choose a workspace
If you belong to more than one workspace, choose the one the application should access. With exactly one
workspace, it’s selected for you. If you have none, you can create one, and Evermuse walks you through a short setup
including creating your first product.
3
Review and approve
The consent screen names the application, the workspace and the permissions it will receive. Click
Allow access to approve or Deny to cancel. Denying returns you to the client with an
access_denied error.If your workspace has third-party MCP servers connected to Evermuse, you’re asked instead whether to allow
Evermuse access only or Evermuse + 3rd party access. Choose Evermuse access only: the MCP server doesn’t
give OAuth connections access to third-party tools, so the second option adds nothing.4
Back to your agent
Evermuse redirects you back to your client, which exchanges the authorization code for tokens. The first time an
application connects to a workspace, Evermuse sends you a confirmation email.
An authorization is always bound to one workspace. The agent can never read or write data in any other workspace
you belong to.
Scopes
If a client doesn’t send a
scope parameter, Evermuse grants mcp:read mcp:write. That is the standard for
Claude, ChatGPT, Cursor, Codex and other MCP clients. Scopes that weren’t part of the client’s registration are dropped.
Tools that write to your workspace are marked with
readOnlyHint: false in their annotations, so your client can ask
for confirmation before running them. See Tools reference for the full list.Technical reference
This section is for developers building their own MCP client or reviewing the integration.Discovery
A request to the MCP endpoint without credentials returns:
Protected Resource Metadata
Protected Resource Metadata
Endpoints
All endpoints are on
https://api.evermuse.com.
Client registration
Evermuse supports three ways for a client to identify itself:- Dynamic Client Registration
- Client ID Metadata Document
- Pre-registered clients
POST /oauth/register with a JSON body. redirect_uris is required. Every redirect URI must use https://, or
http:// with a localhost or 127.0.0.1 host. Evermuse issues a public client (no secret).201 Created with the registered metadata and a client_id. Registration is limited to
10 requests per hour per IP address.Authorization code flow with PKCE
1
Authorize
Redirect the user to:
response_type, client_id, redirect_uri, code_challenge, code_challenge_method and state are required.
Only S256 is accepted. The redirect_uri must exactly match one of the client’s registered URIs. scope is
optional. Evermuse redirects to its consent page, and after approval back to redirect_uri with code and state.
Authorization requests and codes expire after 10 minutes, and codes are single-use.2
Exchange the code
3
Call the MCP server
Send the access token on every request:
4
Refresh
Tokens
- Tokens are opaque random strings, not JWTs. Evermuse stores only a SHA-256 hash of each token.
- Refresh token rotation: every refresh issues a new refresh token and retires the old one. A retired refresh token
presented again within 30 seconds (for example, a retried request) returns
invalid_grantwithout side effects. Presented after that, it is treated as a replay: Evermuse revokes the entire token family, and the user must reconnect. - Tokens stop working automatically if the user leaves or is removed from the authorized workspace, or the account is deleted. Tool calls are refused at once. Other requests may keep succeeding for up to a minute while caches expire.
- A
401for an invalid or expired token doesn’t carry aWWW-Authenticateheader. Clients should treat any401witherror: "invalid_token"as a signal to refresh, and run the full flow again if the refresh fails.
Revoking access
The Evermuse app doesn’t yet have a page that lists connected applications. To end a connection:- From your AI client: disconnect or remove the Evermuse connector. Clients that revoke tokens on disconnect call
/oauth/revoke. Otherwise the access token expires within an hour, and the refresh token expires after 30 days without use. - From the confirmation email: reply to the email Evermuse sent when the application first connected, and our team will revoke it.
- By leaving the workspace: removing a user from a workspace invalidates all of their tokens for that workspace.
- Programmatically:
POST /oauth/revokewith atokenparameter. Revoking a refresh token revokes its whole token family, including access tokens issued from it. The endpoint always returns200 OK, as RFC 7009 requires.
OAuth errors
OAuth endpoints return errors as{"error": "...", "error_description": "..."}:
API keys
For server-to-server use, or clients that only support a static header, you can authenticate to the MCP server with a workspace API key instead of OAuth.- In Evermuse, go to Settings → API Keys and click Create API Key. See Authentication for screenshots.
- Enable the
mcp:readpermission, andmcp:writeif the agent should record or edit signals. MCP permissions require the key to have a default product. - Click Generate and copy the key. It is shown only once.
- Send it in the
x-api-keyheader: