AI
Connect AI
Point your own MCP client at xDiscount on every plan, Free included, and review everything it creates as a draft before a discount reaches shoppers.
Letting an AI assistant run your discounts
What Connect AI does
Connect AI lets you point your own AI assistant at xDiscount and ask for discounts in plain language instead of filling in the discount form yourself.
The Settings screen says it in two lines:
Connect your own AI assistant to create and manage discounts. Anything it creates arrives as a draft, it can never publish a discount without you.
You bring your own assistant. We store no provider keys and charge nothing extra for it.
How it works, in short:
- xDiscount generates a key for your store.
- You paste that key into your AI client as a bearer token, pointed at the
/mcpendpoint on this app’s URL. - Your assistant can then read your discounts and your performance figures, and create and change discounts. Anything it creates arrives as a Draft, whatever status it asked for.
- You review what it made in Discounts and set it to Active yourself.
Bring your own AI. xDiscount does not include an AI subscription and stores no AI provider keys. You use, and pay for, your own client: anything that speaks MCP and lets you set a bearer token.
Which plans include it
| Free | Starter | Growth | Scale | |
|---|---|---|---|---|
| Price / month | Free | USD 19 | USD 49 | USD 149 |
| Connect AI | Included | Included | Included | Included |
Connect AI is included on every plan, Free included. The Connect AI section in Settings always offers Generate a key. The plans differ on how many discounts can be active and how many discounted orders are included, never on this feature.
The plan is still checked when you ask for a key and on every tool call your assistant makes, so if a plan that withholds the feature is ever introduced, access stops straight away. Revoke is always available, whatever your plan.
Generating and managing your key
Generating a key
Open Settings
Click Settings in the sidebar.
Find Connect AI
Scroll to the Connect AI section. It is the fourth section down, below Plans and billing.
Generate a key
Click Generate a key.
Copy it straight away
The key appears immediately, in a warning banner headed Copy this now, it won’t be shown again. Copy it before you navigate away.
The key always starts with xdmcp_, so it is easy to recognise later in your client’s settings.
The banner tells you why the hurry:
Paste it into your MCP client as a bearer token. We only keep a hash, so we cannot show it to you later. If you lose it, generate a new one.
That is literal. xDiscount stores only a one-way hash of your key, not the key itself. Nobody, including support, can read it back to you. It is displayed exactly once, in your browser, and never again.
Paste it before you leave the screen
Put the key straight into your AI client’s connector settings before you leave the Settings screen. If you lose it nothing breaks, just click Generate a new key, but you will have to update your client.
Pointing your AI client at xDiscount
Every client words this differently, but all of them need the same two things:
| What your client asks for | What to give it |
|---|---|
| Server / endpoint URL | Your app’s URL with /mcp on the end. Settings states this under the status badge: “The endpoint is /mcp on this app’s URL.” |
| Authentication | Bearer token, the xdmcp_… key you just copied |
Nothing in the connection names your store. xDiscount works out which store is calling from the key itself, so there is no store field to fill in and no way for a key to reach another merchant’s discounts.
Checking whether it is actually connected
Once a key exists, the Connect AI section shows a badge:
| Badge | What it means |
|---|---|
| Key created, not used yet | The key exists, but no client has ever authenticated with it. Your client has not connected yet, so check the URL and the token |
| Connected | A client has successfully used the key at least once |
When the key has been used you also see Last used with the date. The badge deliberately does not say “Connected” just because a key was generated, otherwise you would go hunting for a fault in your assistant when setup simply was not finished.
Replacing or revoking a key
To replace it: click Generate a new key. There is only ever one key per store, so the new one immediately replaces the old. Any client still using the old key stops working, so update your client with the new value.
To revoke it: click Revoke, the red button beside it. Access stops on the very next request, and the badge, the created date and the last-used date are all cleared.
Neither button asks you to confirm
Revoke takes effect the moment you click it, and Generate a new key invalidates the previous one the moment you click it. There is no undo, but there is also nothing to lose beyond having to re-paste a key.
Revoke when:
- You have stopped using that AI client
- You pasted the key somewhere you should not have
- You want AI access off for a while
What your assistant can do
There are twelve tools. Your client lists them by name, and here is what each one actually does.
| Tool | What it does | Needs your confirmation |
|---|---|---|
| readDiscounts | Lists your discounts with type, value, schedule, conditions and sync state, up to 100 | No |
| readPerformance | Reads your daily performance figures, up to 90 days, newest first | No |
| createProductDiscount | Creates a discount. Always as a Draft | No |
| updateProductDiscount | Changes a discount’s name, type, value, schedule or priority | No |
| setDiscountRules | Replaces a discount’s conditions | No |
| addTargets | Listed as adding products or variants to a discount, but it publishes no product argument, so change a discount’s products in Discounts instead | No |
| removeTargets | Listed as removing products or variants, with the same limitation. Use Discounts | No |
| publishDiscount | Makes a discount live. This changes what shoppers are charged | Yes |
| unpublishDiscount | Takes a discount out of service, back to draft | Yes |
| archiveDiscount | Archives a discount so it stops applying at checkout. It still shows in Discounts, with an ARCHIVED status badge | Yes |
| deleteDiscount | Permanently deletes a discount and its targets | Yes |
| updateAppSettings | Listed, but currently refuses with “App settings are not configurable yet.” | No |
The four confirmation tools are flagged to your client as destructive, so clients that support approval prompts ask you before running them. That prompt comes from your client, not from xDiscount, and a client with no approval step will not produce one.
Note what is not on the list: nothing an assistant can call chooses the products a discount applies to. It can create the discount, set its value, schedule, priority and conditions. You pick the products yourself in Discounts.
Examples of what to ask:
- “What discounts do I have, and which ones are live?”
- “Create a 15% off discount running from 1 December to 24 December.”
- “Add a condition so it only applies when the cart has at least 3 items.”
- “Show me the last 30 days of performance.”
- “Unpublish the summer sale.”
The guardrails
Everything an assistant creates is a Draft
A discount your assistant creates arrives as a Draft, so it does nothing at checkout until you say so. Open it in Discounts, choose the products it applies to, check the value, schedule and conditions, then set Status to Active and click Save.
This is forced on the way in. Whatever status the assistant asks for, a discount it creates is written as a Draft. Making one live is a separate tool, publishDiscount, flagged to your client as destructive, so publishing is always a deliberate step of its own, and your client prompts you first if it supports approvals.
A live discount must be unpublished before an assistant may edit it
If you ask your assistant to change a discount that is currently ACTIVE, it is refused with:
This discount is live. Unpublish it first. Editing an active discount would change what shoppers are charged without anyone approving it.
This covers every editing tool: updateProductDiscount, setDiscountRules, addTargets and removeTargets. The fix is exactly what the message says. Unpublish it, make the change, publish it again, so nothing shoppers are charged changes without a deliberate step.
Your plan limits still apply
The AI route uses the same save path as the admin screens: the same validation, the same 10,000-byte payload guard, the same plan limit. Asking an assistant to publish one discount too many gets the same refusal you would get by clicking Save:
Your Free plan includes 3 active discounts, and you have 3. Pause or archive one, or upgrade your plan to add more.
Drafts are never blocked by the limit. Only what is live at checkout counts.
One store, always
No tool accepts a store name or ID. The store is resolved from your key and re-checked on every record that is read or written, so a tool call can only ever touch discounts belonging to the store whose key made it.
Messages you may see
| Message starts with | What happened | What to do |
|---|---|---|
PLAN_LIMIT | You are at your plan’s active-discount limit | Archive or unpublish one, or upgrade under Plans and billing in Settings |
MUST_UNPUBLISH | The discount is live | Unpublish it, edit it, publish it again |
NOT_FOUND | No such discount on this store | Ask for the discount list again, the ID may be stale |
INVALID | A required value was missing | Give the assistant the missing detail |
FAILED | Something else went wrong, and the real reason follows the code | Check Discounts to see whether the change landed |
| That credential is not valid. It may have been revoked. | The key was revoked or replaced | Generate a new key and update your client |
| Connect AI is available on … You’re on …. | Your subscription is on a plan the app does not recognise | Use Refresh plan under Plans and billing in Settings, and if it persists, tell us |
Check your work after an AI session
Open Discounts and check the Status and Sync columns. A discount your assistant created still has to reach Shopify. A FAILED or TOO_LARGE sync badge means it is not applying at checkout, whoever created it.