Authentication

Ethora MCP server authentication: OAuth 2.1, API keys and agent self-registration

One server, three entry points. Which one you use depends on whether your client can send headers, whether a human is present to log in, and whether a vendor runs OAuth.

OAuth 2.1 with PKCE Revocable API keys Agents register themselves
Ethora MCP server

In 30 seconds

The Ethora MCP server at https://mcp.chat.ethora.com has three entry points. /mcp is open: identify inside the session with ethora-user-login or ethora-user-register, or send Authorization: Bearer <token> on every request. /mcp/k/<api-key> puts the key in the path for clients that take a URL but no headers. /mcp/oauth accepts an OAuth 2.1 access token with the scopes read, write and admin enforced per tool.

Choose by client

  • Claude.ai or ChatGPT custom connector: the personal URL, because those clients accept no headers
  • Claude Code, Cursor, VS Code, your own agent: the open endpoint plus a Bearer header, or log in in-session
  • A listed connector, or an organisation that wants a login screen and scoped consent: the OAuth endpoint

Best for: deciding how an assistant or agent should hold an Ethora identity, from a pasted key to a scoped OAuth grant.

Step by step

1

Method 1: an API key

An API key is a revocable user token. Create one under Account, AI Assistants, or with ethora-api-key-create { name?, ttlDays? }: default 90 days, maximum 365, shown once with a connectorUrl. Send it as a Bearer header on the open endpoint, or use the path form for connectors. Keys carry no scope claim and get full access.

# header form, any client that sends headers
POST https://mcp.chat.ethora.com/mcp
Authorization: Bearer <your API key>

# path form, for Claude.ai and ChatGPT connectors
https://mcp.chat.ethora.com/mcp/k/<your API key>
2

Method 2: log in or register inside the session

Connect to /mcp with no credentials. ethora-user-login { email, password } binds an existing account; add createApiKey: true for a key to reuse. ethora-user-register { email, firstName, lastName } creates an account, logs the session in and returns a generated password, an API key and connectorUrl once: no browser, no email confirmation. This is how an agent gets its own identity.

1. connect  https://mcp.chat.ethora.com/mcp
2. call     ethora-user-register { email, firstName, lastName }
3. store    apiKey and connectorUrl from the result
4. next time, reconnect with  Authorization: Bearer <apiKey>
3

Method 3: OAuth 2.1

The authorization server is the Ethora API at https://api.chat.ethora.com: dynamic client registration, PKCE, scopes read, write and admin. The MCP server publishes RFC 9728 protected-resource metadata, and an unauthenticated request to /mcp/oauth gets 401 with a WWW-Authenticate header pointing at it. Users disconnect grants under Account, AI Assistants, Connected AI apps.

https://mcp.chat.ethora.com/mcp/oauth
# metadata: /.well-known/oauth-protected-resource/mcp/oauth
4

Scopes per tool

On /mcp/oauth the token’s scope is checked per call: read-only tools need read, the 12 destructive tools admin, everything else write. search, fetch, ethora-help, ethora-status and ethora-doctor need no scope. The identity tools (login, register, configure, ethora-api-key-*) are hidden because the token already fixes who you are. A grant lacking a scope gets INSUFFICIENT_SCOPE (403); reconnect and approve the wider scope.

5

Key lifecycle

ethora-api-key-list shows id, name, created and expiry, never the value. ethora-api-key-revoke { id } is immediate: the next request fails with REFRESH_RECORD_NOT_FOUND. Rotate by creating a new key, updating the client, then revoking the old. The server never logs request URLs or tokens.

6

Sessions and the stdio server

Each MCP session holds private in-memory state (login, selected app, tokens); nothing is shared between sessions. Stay in user auth mode on the hosted server: ethora-status shows authMode: user. The stdio server takes ETHORA_APP_JWT and optional ETHORA_B2B_TOKEN from the environment, or ethora-configure at runtime.

ETHORA_API_URL=https://api.chat.ethora.com/v1 ETHORA_APP_JWT="JWT <your app jwt>" npx -y @ethora/mcp-server

The tools this uses

Names and descriptions come from the server’s own tool list. Read-only tools are safe to auto-approve; destructive ones make your client ask first. Full reference.

ToolNameWhat it doesAccess
Register Accountethora-user-registerCreate a new Ethora user account by email + first/last name, then log in and bind the session.write
Log Inethora-user-loginAuthenticate as an existing Ethora user with email + password.write
Create API Keyethora-api-key-createMint a long-lived, revocable API key for the currently logged-in user.write
List API Keysethora-api-key-listList the current user’s API keys (id, name, createdAt, expiresAt).read-only
Revoke API Keyethora-api-key-revokeRevoke one of the current user’s API keys by id.destructive
Session Statusethora-statusReport the current Ethora MCP session state: configured API URL, active auth mode, which credentials are present (booleans like hasAppJwt - values never echoed),...read-only
Connection Doctorethora-doctorDiagnose the session: validate the config is internally consistent for the active auth mode and ping the Ethora API (GET /v1/ping).read-only
Help and Next Stepsethora-helpTask-oriented orientation for this MCP server: explains the three Ethora auth modes (user / app-token / B2B) and recommends next tool calls + recipes based on current...read-only
Use User Authethora-auth-use-userSwitch this session’s active auth mode to user-session, so subsequent calls authenticate as a logged-in Ethora user.write
Configure Connectionethora-configureSet the Ethora API URL and credentials for this MCP session.write

A worked example

“Register an Ethora account for [email protected] as Ops Agent, keep the API key for later, then list my apps and tell me how the session is authenticated.”
  1. ethora-user-register { email: "[email protected]", firstName: "Ops", lastName: "Agent" }
  2. ethora-status {}
  3. ethora-app-list {}
  4. ethora-api-key-list {}

An account bound to the session, a stored API key and connector URL, an empty app list and a status showing authMode: user.

Good to know

FAQ

Does the Ethora MCP server support OAuth?

Yes. The /mcp/oauth endpoint accepts OAuth 2.1 access tokens from the Ethora authorization server at api.chat.ethora.com, with dynamic client registration, PKCE and the scopes read, write and admin. Discovery follows RFC 9728: an unauthenticated request gets 401 with a WWW-Authenticate header.

How do I authenticate to a remote MCP server with an API key?

Send an Authorization Bearer header with the key on every request to mcp.chat.ethora.com/mcp, or, for clients that take a URL but no headers, put the key in the path after mcp.chat.ethora.com/mcp/k/. Create keys under Account, AI Assistants or with ethora-api-key-create.

Can an AI agent create its own Ethora account through MCP?

Yes. Connect to the open endpoint with no credentials and call ethora-user-register with an email, first name and last name. The response contains a generated password, an API key and a connector URL, shown once. The agent stores the key and reconnects with a Bearer header.

What scopes does the Ethora MCP server use?

Three: read for read-only tools, write for tools that create or update, admin for the 12 destructive tools. search, fetch, ethora-help, ethora-status and ethora-doctor need no scope. Scopes are enforced only on the OAuth endpoint; API keys carry no scope claim and get full access.

Is MCP traffic kept inside my own infrastructure on a self-hosted Ethora?

Yes. The MCP server ships with the Ethora monoserver deploy; enabling services.mcp.enabled in deploy.yml serves it on your own mcp subdomain with the same 90 tools, entry points and OAuth against your own API. Agent traffic never leaves the customer infrastructure.

Get started

Get a connector URL

Create a free Ethora account and mint a key under Account, AI Assistants, or let your agent register itself on the open endpoint. The tool reference documents every key tool.

Free tier available Revocable API keys Self-host with the monoserver