Full-CRUD Adobe Experience Platform server: 46 tools for schemas, ingestion, profiles, audiences.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Adobe's MCP lets your agent read Experience Platform. This one lets it work.
46 tools across 12 categories with full read AND write operations β batch ingestion, schema composition, audience activation, data lifecycle, privacy jobs, and datastreams. Self-hosted, Apache 2.0, no invitation required.
Adobe now ships first-party Experience Platform tools through CX Coworker Gateway, its unified MCP endpoint for Adobe CX Enterprise. (Adobe does not brand any part of it "the AEP MCP" β the gateway is one endpoint that surfaces a tool set per product.) It is a genuinely good product, and if all you need is to ask questions about your Experience Platform instance, you should use it.
But its Experience Platform tool set
is 8 tools, all read-only β the names are literally search_* β covering schemas,
datasets, governance, Query Service, and audit discovery. It does not touch
profiles, identity resolution, privacy requests, datastreams, or ingestion. Access is
invitation-only, gated behind Adobe organization enablement, and the whole surface
is still Beta.
Audiences and destinations do appear, but in a separate Real-Time CDP tool set on the same gateway β and Adobe is explicit that creating, activating, updating, or deleting audiences, destinations, and dataflows is not supported there either. The read-only boundary holds across the whole gateway.
This server covers the other half: the write path, plus the surfaces Adobe's gateway skips entirely. Ingest a batch. Compose a schema from field groups. Create a destination connection and activate an audience to it. Submit a GDPR erasure. Route Edge Network events. Then run it in your own VPC, under Apache 2.0, with nothing to request from your account rep.
The two are complementary, not competing: pair Adobe's gateway for governed reads with this server for the write path.
This server is built to production standards: OAuth Server-to-Server auth with a
deduped token cache, structured pino logging with PII redaction, exponential-backoff
retries, automatic 401 re-auth, working pagination, structured AEP_{status}
error codes, and a graceful-shutdown lifecycle. It runs as a local stdio process
that any MCP-compliant client can drive.
| Feature | Adobe AEP tools (CX Coworker Gateway) | @focusgts/aep-mcp-server |
|---|---|---|
| Operations | Read-only (search_*) | Full CRUD (read + write) |
| AEP tool count | 8 | 46 |
| Access | Invitation-only + org enablement | npm install β any org with API credentials |
| Batch ingestion | Not available | 5 tools |
| Profiles / Identity | Not covered | 6 tools |
| Privacy Service | Not covered | 6 tools |
| Datastreams | Not covered | 5 tools |
| Data Lifecycle | Not covered | 5 tools |
| Transport | Adobe-hosted gateway | stdio (local, composes with other MCPs) |
| Data path | Queries traverse Adobe's gateway | Runs entirely in your own VPC |
| License | Proprietary | Apache 2.0 |
| Client compatibility | Claude, ChatGPT, Cursor, Claude Code, Codex, VS Code | Any MCP-compliant client |
| Error responses | β | Structured AEP_{status} codes |
Adobe's figures were read from their Experience Platform tools page (last updated 17 July 2026):
search_datasets,search_class_relations,search_data_access,search_data_lake,search_dule,search_query_service,search_audit,search_allowed_ip_ranges. It is a Beta surface and will change β check their docs for the current figure. The read/write split is the durable difference, not the count.
46 tools across 12 categories. All prefixed aep_ with verb_noun naming.
Tools marked π change state; π₯ are destructive. Most destructive tools require an
explicit confirmation phrase β see Safety model for exactly which,
and for the two deliberate exceptions.
| Category | Tools |
|---|---|
| Schemas (4) | list_schemas Β· get_schema Β· create_schema π Β· update_schema π |
| Datasets (3) | list_datasets Β· get_dataset Β· create_dataset π |
| Ingestion (5) | create_batch π Β· upload_batch_file π Β· complete_batch π Β· get_batch_status Β· list_batches |
| Identities (2) | list_identity_namespaces Β· get_identity_graph |
| Profiles (4) | get_profile Β· get_profile_by_identity Β· preview_profile Β· delete_profile π₯ (deprecated β see Data Hygiene) |
| Segments (4) | list_segments Β· get_segment Β· create_segment π Β· estimate_segment_size |
| Sources (2) | list_sources Β· list_dataflows |
| Destinations (3) | list_destinations Β· create_destination_connection π Β· activate_segment π |
| Query Service (3) | run_query π Β· get_query_status Β· list_queries |
| Privacy Service (6) | create_privacy_job π Β· get_privacy_job Β· list_privacy_jobs Β· cancel_privacy_job π Β· get_privacy_job_results Β· list_privacy_namespaces |
| Data Hygiene (5) | create_record_delete π₯ Β· get_work_order_status Β· list_work_orders Β· create_dataset_expiration π₯ Β· list_dataset_expirations |
| Datastreams (5) | list_datastreams Β· get_datastream Β· create_datastream π Β· update_datastream π Β· delete_datastream π₯ |
Ingest data end to end
create_schema (with field groups) β create_dataset β create_batch β upload_batch_file β complete_batch β get_batch_status
Build and activate an audience
create_segment β estimate_segment_size β list_destinations β create_destination_connection β activate_segment
Honour an erasure request
get_profile_by_identity β create_record_delete β get_work_order_status
AEP_MODE sets how much this server may mutate. Reads are never restricted
in any mode.
AEP_MODE | Writes permitted | Use it when |
|---|---|---|
read-only | Never, in any sandbox | Handing the server to someone to explore an environment you don't want touched |
safe (default) | Only where Adobe classifies the sandbox development | Evaluating, or letting an agent work without risking production |
production | Anywhere, including production | You run your own change control and don't want the server second-guessing you |
production is a supported posture, not a jailbreak. Plenty of teams have
review, staging, and rollback already handled and don't need another layer
telling them no. Set it and the guard steps out of the way β the per-tool
confirmation gates below still apply, because those are about irreversibility
rather than environment.
safe decidesprod might not be production. Only
Adobe's type field from the Sandbox Management API decides.AEP_MODE falls back to safe, so a typo can never grant
production writes.The guard is enforced in the HTTP client rather than per tool, so all 46 tools
inherit it and none can forget it. Blocked calls never reach Adobe; they return
a structured WRITE_BLOCKED error naming the sandbox, its type, and the fix.
Startup always states the active posture:
AEP_ALLOW_PRODUCTION_WRITES=true is deprecated but still honoured as an alias
for AEP_MODE=production. If both are set, AEP_MODE wins.
Every tool ships MCP annotations β readOnlyHint, destructiveHint,
idempotentHint, openWorldHint β derived from the same metadata that builds
its description, so the two cannot drift.
These are hints for the client, not enforcement; the guards above do the
enforcing. Their value is that an MCP client such as Claude Desktop uses
destructiveHint to decide when to interrupt and ask the human before running
a call. Without them every tool looks identical to the client and
aep_delete_profile gets the same treatment as aep_list_schemas.
| Count | |
|---|---|
readOnlyHint: true | 27 |
destructiveHint: true | 4 β delete_profile, delete_datastream, create_record_delete, create_dataset_expiration |
| Un-annotated | 0 |
A test asserts that destructive list exactly, so adding a fifth destructive tool is a deliberate act rather than an oversight.
Writes are not uniformly gated β uniform gating makes an agent useless. Gates sit where an action is irreversible and wide-reaching:
| Tool | Gate |
|---|---|
aep_delete_profile | Requires confirm: "I understand this is irreversible" |
aep_create_record_delete | Requires confirm: "I understand this is irreversible" |
aep_create_dataset_expiration | Requires confirm: "I understand this is irreversible" β unless dryRun: true |
aep_delete_datastream | No gate β deliberate, see ADR-0003 |
In every gated case the confirmation is checked before any network call, so a
rejected call never reaches Adobe. Rejections are logged at warn.
Dataset expiration is the one gate with a bypass: passing dryRun: true asks Adobe
to validate the request and report what would happen without scheduling anything,
so there is nothing to confirm. Any call that actually schedules deletion still
requires the phrase.
Datastream deletion is ungated on purpose: a datastream is configuration rather than data, recreating one is the same POST body that created it, and gating it would break the programmatic-cleanup use case the tool exists for.
Batch creation and file upload are ungated too. Those writes are additive and recoverable β an unwanted batch can be left uncompleted, and data that did land can be removed with the Data Hygiene tools.
Every tool validates inputs with Zod at the boundary and returns structured errors
rather than throwing. aep_upload_batch_file additionally rejects relative paths,
non-regular files, path-traversal file names, and oversized payloads before any
network call is made.
v0.2.0 added Privacy Service for GDPR/CCPA workflows. v0.3.0 added Datastreams for Edge Network event routing. v0.4.0 adds Batch Ingestion and Data Hygiene β the write surfaces Adobe's read-only first-party MCP does not reach β and fixes the pagination and sandbox-scoping defects described in the changelog.
Then for both options:
The server speaks MCP over stdio. Any MCP-compliant client can drive it.
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Any MCP-compliant client works the same way β point its MCP config at
npx -y @focusgts/aep-mcp-server with the four env vars above.
| Variable | Required | Description |
|---|---|---|
AEP_CLIENT_ID | Yes | Adobe I/O client ID |
AEP_CLIENT_SECRET | Yes | Adobe I/O client secret |
AEP_ORG_ID | Yes | IMS org ID (format: xxx@AdobeOrg) |
AEP_SANDBOX_NAME | No | AEP sandbox name (default: prod). Scopes every call, including Query Service. |
LOG_LEVEL | No | Pino log level (default: info) |
AEP_REQUEST_TIMEOUT_MS | No | Per-request timeout (default: 30000) |
AEP_MAX_RETRIES | No | Retry attempts on 429/5xx (default: 3) |
Sandbox scoping. Every tool sends
x-sandbox-name, and Query Service derives its database name as<AEP_SANDBOX_NAME>:all. Prior to v0.4.0 the Query Service database was hardcoded toprod:allregardless of this setting β see the changelog.
Not every Adobe org has every AEP product entitlement. Map tools to what your IMS org actually licenses:
| Tool category | Required Adobe entitlement |
|---|---|
| Schemas | AEP (base) |
| Datasets | AEP (base) |
| Identities | AEP (base) + Identity Service |
| Profiles | Real-Time CDP |
| Segments | Real-Time CDP |
| Sources | AEP (base) β connector availability varies by SKU |
| Destinations | Real-Time CDP (activation) |
| Query Service | AEP Query Service add-on |
| Privacy Service | Adobe Privacy Service (sold separately from RTCDP/Query Service) |
| Ingestion | AEP (base) β Batch Ingestion is part of the core platform |
| Data Hygiene | Data Distiller / Data Hygiene add-on (dataset expiration may require Data Distiller) |
| Datastreams | AEP (base) + Data Collection / Edge Network |
If a tool returns AEP_403 it usually means the entitlement is missing rather
than a credential problem.
The TypeScript config is strict mode end-to-end. All tool inputs are validated
with Zod at the boundary. All logs go to stderr (pino destination 2) β stdout is
reserved for the MCP JSON-RPC stream.
npm run test:live runs a smoke suite against a real Adobe IMS org and AEP
sandbox. It exercises the read paths across the schema registry, catalog,
identity, profile, segment, source, destination, query, and privacy endpoint
families to verify credentials, entitlements, and sandbox scoping end to end.
It is a connectivity and entitlement check rather than full per-tool coverage β the newer Ingestion and Data Hygiene categories are not yet included, and no destructive tool is invoked.
Requires a .env with valid credentials and AEP_SANDBOX_NAME pointing at a
non-production sandbox.
Apache 2.0. See LICENSE and NOTICE.
Built by Focus GTS, an Adobe Silver Solution Partner. Independently developed β not affiliated with or endorsed by Adobe Inc. or Anthropic, PBC.
Bug reports, feature requests, and pull requests are welcome. Open an issue at github.com/Focus-GTS/aep-mcp-server/issues or email dfox@focusgts.com.
Focus GTS is an Adobe Silver Solution Partner specializing in Adobe Experience Cloud talent and tooling. We build production-grade developer tools for AEP, AJO, CJA, and Real-Time CDP customers who need more than what ships in the box.
Learn more at https://focusgts.com.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/aep)<a href="https://allmcps.com/mcp/aep"><img src="https://allmcps.com/api/badge/aep?style=directory" alt="Aep on AllMCPs" /></a>