ExD Accelerator MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ExD Accelerator MCP ServerCreate a new offer from my CSV data for premium users"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ExD Accelerator — MCP Server
AI-native Experience Decisioning lifecycle automation for Adobe Journey Optimizer. End-to-end ExD setup from a single chat conversation: CSV → schema fields → offers → collections → eligibility rules → ranking → selection strategy → placements.
21 MCP tools wrapping AEP Schema Registry and Decisioning APIs. Every write
operation previews what it will do and requires explicit confirmed: true before
executing.
Live endpoint: https://exd-mcp-server-without-auth.vercel.app/api/mcp
Health: https://exd-mcp-server-without-auth.vercel.app/api/health
What's new in 2.0
Was in 1.x | Now in 2.0 |
Manual ACCESS_TOKEN paste, expires every 24h | Auto-mints via |
Express + SSE local server, ngrok tunnel for sharing | Streamable HTTP serverless route — deploy to Vercel in one click |
Single hardcoded sandbox in | Per-request config via HTTP headers — every coworker uses their own sandbox |
README claimed 13 tools, code had 21 | 21 tools, documented |
Bulk offers defaulted to | Defaults to today + 1 year |
| Reads from |
| Plain |
Related MCP server: IBM Decision Intelligence MCP Server
Two ways to run this
A. Local stdio (Claude Desktop)
npm install
cp .env.example .env # fill in CLIENT_ID, CLIENT_SECRET, sandbox, schema, catalog
npm start # runs src/stdio.jsThen point Claude Desktop at it (%APPDATA%\Claude\claude_desktop_config.json on
Windows, ~/Library/Application Support/Claude/claude_desktop_config.json on
macOS):
{
"mcpServers": {
"exd-accelerator": {
"command": "node",
"args": ["/absolute/path/to/exd-mcp-server/src/stdio.js"],
"env": {
"CLIENT_ID": "…",
"CLIENT_SECRET": "…",
"ORG_ID": "…@AdobeOrg",
"SANDBOX_NAME": "…",
"TENANT_ID": "…",
"DECISIONING_SCHEMA_URI": "https://ns.adobe.com/…/schemas/…",
"DECISIONING_SCHEMA_ALT_ID": "_….schemas.…",
"ITEM_CATALOG_ID": "xcore:decision-catalog:…"
}
}
}
}Restart Claude Desktop. You'll see the 🔧 tool icon — ExD Accelerator is live.
B. Vercel deployment (for sharing with Adobe coworkers)
Push this repo to GitHub.
Import it in vercel.com/new. Framework preset: Other.
Deploy — Vercel auto-detects
api/mcp.jsas the serverless route.Do not add Adobe credentials to Vercel environment variables. Each coworker supplies their own credentials via HTTP headers when they connect.
Adobe coworker setup
Once deployed at https://your-app.vercel.app, each coworker adds this in their
MCP client config (Claude Desktop, Adobe AO Chat, Claude.ai, etc.):
Setting | Value |
Server URL |
|
Transport | Streamable HTTP |
Auth | None at the transport level — credentials go in headers |
Custom headers (one-time, in the MCP client config — NOT in chat messages):
x-adobe-client-id: <Adobe Dev Console: Client ID>
x-adobe-client-secret: <Adobe Dev Console: Client Secret>
x-adobe-org-id: <IMS Org ID>@AdobeOrg
x-adobe-sandbox: <sandbox name>
x-adobe-tenant-id: <tenant id, e.g. acssandboxgdcthree>
x-adobe-schema-uri: https://ns.adobe.com/<tenant>/schemas/<id>
x-adobe-schema-alt-id: _<tenant>.schemas.<id>
x-adobe-catalog-id: xcore:decision-catalog:<id>The server uses client_credentials to mint a token automatically, caches it per
client_id, and refreshes on expiry. The marketer never sees the token.
Is Vercel a good fit for a production MCP endpoint?
Yes, for this workload. Each MCP tool call is a single short HTTP roundtrip to Adobe Platform APIs — no long-running state, no streaming required, no WebSocket. Vercel's serverless model maps cleanly:
Concern | Verdict |
Stateless requests | ✅ Each MCP call is independent. No session state. |
Cold-start latency | ⚠️ ~300–500ms on first call after idle. Subsequent calls reuse the warm container. |
60s function timeout (Pro tier) | ⚠️ |
10s timeout (Hobby tier) | ⚠️ |
Auto-scaling | ✅ Each coworker's request gets its own invocation. |
HTTPS, custom domain, env-per-deploy | ✅ Built in. |
SSE / long-polling | ❌ Not used here — we run Streamable HTTP with |
When Vercel isn't right: if you need server-initiated notifications, very large bulk operations (hundreds of writes), or stateful sessions across many calls, deploy to a long-lived host (Railway, Render, Fly, ECS) and run the same codebase. The transport layer is the only difference.
All 21 tools
Read-only (no confirmation needed)
# | Tool | What it does |
1 |
| Parses CSV, infers XDM types per column, suggests eligibility rules and ranking formulas. Always call first. No API calls. |
9 |
| Fetches a single offer item by DPS ID |
10 |
| Lists all offers in catalog with pagination |
16 |
| Full inventory: offers, collections, rules, formulas, strategies, placements |
17 |
| Full resolved schema with OOB + tenant fields; accepts |
18 |
| Lists all tenant fieldgroups for the offer item class |
19 |
| Full field definitions inside a specific fieldgroup |
20 |
| Chronological change history for the decisioning schema |
21 |
| Identity, deprecation, display name, relationship descriptors |
Write (require confirmed: true)
# | Tool | What it does |
2 |
| Creates XDM fieldgroup from CSV columns, attaches to decisioning schema. Checks for duplicates first. |
3 |
| Creates offer items from CSV rows. Supports |
4 |
| Creates offer collection with filter constraint |
5 |
| Creates PQL eligibility rule |
6 |
| Creates ranking formula (static, custom field, recency-hybrid, custom PQL) |
7 |
| Wires collection + rule + formula into a selection strategy |
8 |
| Creates channel placement via |
11 |
| JSON Patch update on any offer field |
12 |
| Adds a single field to an existing tenant fieldgroup |
13 |
| Sets |
14 |
| Creates |
15 |
| Removes fieldgroup from schema |
Confirmation pattern
Every write tool shows a preview and blocks with:
⚠️ CONFIRMATION REQUIRED — no changes made yet
[preview of what will happen]
✅ To proceed, call this tool again with confirmed: trueCall the same tool again with confirmed: true to execute.
Recommended workflow from a fresh CSV
1. parse_csv_and_suggest → analyse CSV, no writes
2. list_schema_fieldgroups → check if fieldgroup already exists
3. create_offer_metadata_fieldgroup → push schema fields (confirmed: true)
4. lookup_decisioning_schema → verify fields attached
5. bulk_create_offers (dry_run) → preview offer payloads
6. bulk_create_offers (confirmed) → create offers
7. list_offer_items → verify
8. create_collection → group offers (confirmed: true)
9. create_eligibility_rule → targeting (confirmed: true)
10. create_ranking_formula → ranking logic (confirmed: true)
11. create_selection_strategy → wire it all together (confirmed: true)
12. create_placement → define channel (confirmed: true)
13. get_setup_summary → verify full setupSample CSV for testing
name,description,category,brand,discount_percent,price,region,priority,start_date,end_date
Summer Glow Kit,Complete summer skincare set,Skincare,GlowCo,20,49.99,US,1,2024-06-01,2024-08-31
SPF Starter Bundle,SPF 30 and 50 combo,Skincare,GlowCo,15,29.99,US,2,2024-06-01,2024-09-30
Loyalty 20% Off,Exclusive 20% for gold members,Discount,GlowCo,20,0,Global,1,2024-01-01,2024-12-31Column mapping:
name→itemName(OOB),description→itemDescription,priority→itemPriority,start_date/end_date→itemCalendarConstraintseverything else →
_<tenant>.<column>(custom fieldgroup)
File layout
exd-mcp-server-without-auth/
├── src/
│ ├── server.js ← buildMcpServer(config) + 21 tool definitions
│ ├── stdio.js ← stdio entry (npm start) — for Claude Desktop
│ └── http-local.js ← local HTTP server for testing the Vercel route
├── api/
│ └── mcp.js ← Vercel serverless route (Streamable HTTP)
├── scripts/
│ └── smoke.js ← smoke test for stdio + HTTP transports
├── vercel.json
├── package.json
├── .env.example
└── .gitignoreSmoke testing
npm install
cp .env.example .env # fill in
npm run smoke # runs stdio + HTTP transport tests, calls real Adobe APIsExpected output ends with All smoke checks passed.
Troubleshooting
Symptom | Likely cause | Fix |
| CLIENT_ID/CLIENT_SECRET not set | Add to |
| Credentials invalid or revoked | Regenerate the OAuth Server-to-Server credential in Adobe Developer Console |
| Credential lacks AEP access | The OAuth credential's product profile needs |
| Wrong org/sandbox | Check |
List offers returns 0 | Wrong | Each sandbox has its own catalog ID |
Tool call exceeds 10s on Vercel Hobby | Bulk operation too large | Upgrade to Pro (60s) or chunk the CSV |
| Resolved by 2.0 — file an issue if you still see this | — |
What this MCP does NOT do (future scope)
Decisioning policy / campaign creation — creates components but not the final AJO policy that ties strategy + placement.
Delete operations — AEP recommends archive over delete.
Audience creation — eligibility rules reference profile attributes but don't create AEP segments.
Cross-channel coherence scoring — would require AEP Query Service integration.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/khushi-nayal/Decisioning-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server