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, Cursor, Claude Desktop, other clients that can send a header |
| Address | https://aov-cart-drawer.firebaseapp.com/oauth/mcp | https://aov-cart-drawer.firebaseapp.com/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 change the drawer's settings |
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. If the connection was made with write access, a write is also checked against the narrower of the level the client was granted and the level stored on the connection.
There is no separate "delete" level. The few tools that remove something — a reward tier, an upsell rule, a block — are part of write access, and the first two need an explicit confirmation on every call.
Changing the level
The level is fixed when the connection is made. To give a tool more access, or less, create a new connection at the level you want and revoke the old one. Then restart the AI client so it reads the new tool list.
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 Cart Drawer, go to Settings → MCP connectors and pick your AI app.
- Copy the OAuth server 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.
- Type that code into Approval code in the app and click Review request. You see which app is asking and where it returns to.
- Choose what the app can do — Read cart drawer data, and optionally Write cart drawer settings — then Approve.
The AI app finishes the handshake by itself. The OAuth connections list shows the state of each connection:
| Status | Means |
|---|---|
| Active | The connection works |
| Incomplete | Approved, but the AI app has not finished connecting yet |
| Expired | The connection has passed its expiry time — connect again |
| Revoked | Turned off, and will never work again |
| The code | |
|---|---|
| Length | 8 characters |
| Valid for | 10 minutes |
Only approve a request you just started yourself. The review shows the app asking and the address it returns to — if either is unfamiliar, click Deny.
Connect with a key
This is the route for Claude Code, Cursor, Claude Desktop, and other clients that can send a request header.
- In AOV.ai Cart Drawer, go to Settings → MCP connectors, click Add connection 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 — Read only or Read and write.
- 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. 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 key connection shows its name, its badges, and when it was last used.
| Badge | Means |
|---|---|
| Active | The connection works |
| Revoked | Turned off, and will never work again |
| Recent activity | The key was used recently |
| Read only · Read and write | 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.
You can Rename a connection at any time.
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 is offered on a key connection that is already revoked. It removes the row from the list. It does not stop anything — revoking already did that.
This key does not work anywhere else
Cart Drawer 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 — see Store API |
A key minted for one is refused by the other, and 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 — 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 being able to change your drawer.
- Revoke rather than reuse. Creating a replacement takes seconds.
Reading an authentication error
Your assistant reads the refusal back to you in plain language.
| Message says | Means | Action |
|---|---|---|
| This connection was revoked | The key was not accepted | See the note below before you act |
| Isn't included in this store's current subscription | The subscription lapsed | Renew; the same connection resumes working. This differs from the Store API, which revokes its keys when the plan lapses |
| This key was issued for a different surface | An aov_sk_ Store API key was used on /mcp | Create an AI connection key in Settings → MCP connectors |
| Hit its limit of 60 requests per minute | Too many calls in one minute | Wait about a minute |
| This connection is read-only | The assistant tried to change something | Create a connection with write access, then restart the client |
"This connection was revoked" is also what you get when the client sends no key at all. The
message tells you to create a new key, and in that case creating one will not help — the new key will
not be sent either. Before minting a replacement, check that your client is actually passing the
Authorization header. See Troubleshooting.