Authentication
There are two ways to connect, and which one you use is decided by your AI client rather than by you. Hosted clients sign in. Desktop and terminal clients send a key.
| Sign-in | API key | |
|---|---|---|
| Clients | ChatGPT, Claude on the web | Claude Code, Codex, Cursor, Claude Desktop, ChatGPT desktop |
| Address | https://upsell.avada.io/oauth/mcp | https://upsell.avada.io/mcp |
| Credential | None to copy or store | A key beginning aov_mcp_ |
| Sent as | Handled by the client | Authorization: Bearer aov_mcp_… |
| Access level | You choose it while approving | You choose it while creating |
| Rate limit | 60 requests per minute, per connection | 60 requests per minute, per connection |
| Requires | A paid plan, re-checked on every request | A paid plan, re-checked on every request |
Both routes end at the same place: a connection in Settings → MCP connectors, with its own access level, its own last-used time, and its own revoke button.
The two addresses are not interchangeable. A hosted client pointed at /mcp has nowhere to put a
credential and fails on its first call; a key-based client pointed at /oauth/mcp is asked to sign
in and cannot. Use the address the app shows for the client you picked.
Access levels
Every connection carries exactly one, whichever route made it.
| Level | Shown as | The assistant can |
|---|---|---|
| Read | Read only | Read this store's data only |
| Write | Read and write | Also turn campaigns on and off, and edit them |
| Manage | Read, write, and delete | Also delete campaigns, through the confirmed deletion workflow |
A connection starts at Read only unless you deliberately choose otherwise, and the level is enforced on the server: a read-only connection is never offered the write tools at all.
Changing the level later
You do not need to reconnect. On the connections list, each connection has its own controls:
- Enable write access — read-only connection gains create, edit and status changes
- Enable deletion access — a write connection also gains deletion
- Disable deletion access — back to read and write
- Make read-only — back to reading only
Raising a level asks you to confirm first, because every copy of that connection gains the new permission at once.
Your AI client reads the tool list when it connects, so it will not notice new tools until it reconnects. After raising a level, restart the client — you do not have to re-approve or paste the key again.
Connect by signing in
This is the route for ChatGPT and Claude on the web. Nothing is copied or stored by you.
- In AOV.ai Free Gift, go to Settings → MCP connectors and pick your AI app.
- Copy the Connection URL shown there and add it in the AI app as a custom connector.
- Start the connection in the AI app. It shows a one-time code such as
QLB5-FEAX. - Type that code back into the app and click Preview request. You see which app is asking and where it returns to.
- Choose the access level, then Approve.
The AI app finishes the handshake by itself within a few seconds. Until it does, the connection shows as Waiting; the list refreshes on its own, so there is no need to reload the page.
| The code | |
|---|---|
| Length | 8 characters, shown grouped as ABCD-1234 |
| Valid for | 10 minutes |
| Uses | One. A code that has been approved or denied cannot be used again |
Only approve a request you just started yourself. The preview names the app and the address it returns to — if either is unfamiliar, Deny. A denied request cannot be revived; the AI app has to start a new one.
Connect with a key
This is the route for Claude Code, Codex, Cursor, Claude Desktop and ChatGPT desktop.
- In AOV.ai Free Gift, go to Settings → MCP connectors and pick your client.
- Copy the Server address shown there. You will need it alongside the key.
- Type a Connection name — use the name of the tool you are connecting, for example Claude Desktop. It is only there to tell connections apart. 1–40 characters.
- Choose the Access level.
- Click Create key.
The key appears once, with a ready-to-paste setup snippet underneath. Copy the snippet for your tool, then follow Install a client.
The key is displayed only at this moment. The server stores a fingerprint of it, not the key, so it cannot be shown again — not by you, and not by support. Put it in a password manager before you close the banner.
If you try to reuse the name of a connection that is still active, the field shows an error and Create key stays disabled. Names have to be distinct so that revoking the right one later is unambiguous.
Where the key goes
Your client sends it as a bearer token on every call:
Authorization: Bearer aov_mcp_your_key_hereThe word Bearer, a single space, then the key. A missing prefix produces a refusal that reads like
a bad key rather than a bad request, which is a confusing hour to lose. The setup snippets in the app
already include it.
Nothing is ever sent in a URL. The key belongs in the Authorization header only.
Reading the connections list
Each connection shows its app icon, a name, its badges, and when it was last used.
| Badge | Means |
|---|---|
| Active | The connection works |
| Waiting | Approved, but the AI app has not finished connecting yet |
| Revoked | Turned off, and will never work again |
| Read only · Read and write · Read, write, and delete | Its access level |
Last-used time is not a live session. AI clients do not hold a socket open to the server — they call it when they need something and then go quiet. Recent use is the only evidence available, so an assistant sitting idle for twenty minutes still reports an old timestamp while remaining perfectly usable.
Revoke, and delete
Revoke stops the connection working. It takes effect on the very next call, it cannot be undone, and it affects only that connection — every other one keeps working. Revoke when a key may have leaked, when you stop using a tool, or when a laptop leaves your control.
Delete appears only on a connection that is already revoked. It removes the row from the list. It does not stop anything — revoking already did that — it just keeps the list readable once you have a few spent connections.
This key does not work anywhere else
Free Gift issues keys for two separate surfaces, and they are deliberately not interchangeable:
| Prefix | Surface | For |
|---|---|---|
aov_mcp_ | /mcp | AI clients |
aov_sk_ | /store-api/v1 | Your own scripts and integrations |
A key minted for one is refused by the other. Paste an aov_mcp_ key into a REST integration and it
is turned down as the wrong surface, rather than quietly becoming a second credential you have to
track. Revoking one surface never disturbs the other.
Keeping a connection safe
- Never paste a key into a chat, an issue, a commit, or a screenshot.
- Keep it out of shared config files and anything that reaches a repository. Where a client supports it, put it in an environment variable rather than inline — the Claude Desktop snippet does this.
- Use one named connection per tool. Shared credentials make the connections list meaningless and turn revoking into a choice between breaking everything and breaking nothing.
- Grant the lowest level that does the job. A tool you are still evaluating has no business holding delete access, and lowering a level later takes one click.
- Revoke rather than reuse. Creating a replacement takes a few seconds.
Reading an authentication error
Your assistant will read the refusal back to you in plain language. Each one is specific about what to do, and in particular about what not to do.
| Message says | Means | Action |
|---|---|---|
| No key was sent | The client is not passing the header at all | Fix the client config. Do not revoke your key — it is not the problem |
| This connection was revoked | It was turned off in the app | Make a new connection |
| This connection is read-only | The assistant tried to change something | Enable write access for it, then restart the client |
| Not included in your current plan | The store is no longer on a paid plan | Upgrade; the same connection resumes working |
| This is a Store API key | An aov_sk_ key was used on /mcp | Create an AI connection key instead |
| The app is no longer installed | The store uninstalled Free Gift | Reinstall. Revoking and re-minting will not help |
| Hit its limit of 60 requests per minute | Too many calls in one minute | Wait about a minute |
Full symptom-by-symptom detail is in Troubleshooting.