Skip to main content
Glama

CDP MCP Server

An MCP (Model Context Protocol) server that puts the Acquia Customer Data Platform at your LLM's fingertips. Point Claude, Copilot, or any MCP-aware client at this server and it can read your tenants, drive campaigns, poke at workflows, query reports, and generally do the boring admin work so you don't have to.

Built because clicking through CDP screens at 2 AM isn't anyone's idea of fun.


What you get

  • ~300 tools spanning permissions, the data warehouse, campaigns, config, connectors, reports, predictions, mailer, emailable pages, security, cache, and status APIs — see SUPPORTED_TOOLS.md for the full catalogue

  • 8 playbook resources that teach the LLM how to sequence real multi-step flows (campaign wizard, C360 profile render, workflow authoring, connector onboarding, UDMP schema edits, etc.) — these came from reverse-engineering the Vega and Config UIs so the model stops guessing

  • Two auth modes: OAuth2 password grant (auto-refreshed, 401-retried, lock-serialized) or a static bearer token if you already have one

  • Dev / QA / Prod switch via a single CDP_ENVIRONMENT variable

  • Stdio transport, so it drops straight into Claude Desktop, VS Code Copilot, Continue, mcphost, Open WebUI (via supergateway), or MCP Inspector

If the above sounds like alphabet soup, skim TUTORIAL.md — it walks through every piece with copy-pasteable commands. For the full list of tool names and what each one does, see SUPPORTED_TOOLS.md.


Related MCP server: sitecore-mcp-server

Quick start

# 1. Clone and install
git clone https://github.com/atharva-joshi77/cdp-mcp.git
cd cdp-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -e .

# 2. Configure
cp .env.example .env
# edit .env: CDP_ENVIRONMENT, CDP_TENANT_ID, and either
#   CDP_CLIENT_ID/SECRET + CDP_USERNAME/PASSWORD  (OAuth2)
# or CDP_AUTH_TOKEN                                (static token)

# 3. Run
cdp-mcp

cdp-mcp speaks JSON-RPC on stdio, so running it bare will look like it's hanging — that's correct. Wire it to an MCP client (see below) and it'll spring to life.

Wire it to Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "cdp": {
      "command": "/absolute/path/to/cdp-mcp/.venv/bin/cdp-mcp",
      "env": {
        "CDP_ENVIRONMENT": "dev",
        "CDP_TENANT_ID": "12345",
        "CDP_CLIENT_ID": "...",
        "CDP_CLIENT_SECRET": "...",
        "CDP_USERNAME": "...",
        "CDP_PASSWORD": "..."
      }
    }
  }
}

Restart Claude, and you should see ~300 cdp_* tools show up in the tool picker. For VS Code, Continue, Ollama/Open WebUI, and MCP Inspector setups, the full recipes are in TUTORIAL.md §5.


Requirements

Thing

Minimum

Python

3.11+

pip

23.0+

A CDP tenant with API credentials

yes, sorry

Dependencies (installed automatically):

  • mcp>=1.13.0 — FastMCP framework

  • httpx>=0.27.0 — async HTTP

  • pydantic + pydantic-settings — config + validation

  • python-dotenv — .env loading


Project layout

src/cdp_mcp/
├── __main__.py           # entry point: `cdp-mcp` / `python -m cdp_mcp`
├── server.py             # FastMCP server, registers tools + resources
├── config.py             # env/.env loader
├── auth/                 # OAuth2 + static-token provider
├── utils/                # shared httpx client, error helpers
├── resources/            # MCP resource URIs (tenant/*, docs/*)
├── docs/                 # the eight playbooks, shipped as resources
├── types/                # pydantic request/response models
└── tools/                # one subpackage per CDP service area
    ├── permissions/      users, roles, clients
    ├── dw/               data warehouse, A360, audiences, offers, trackers
    ├── campaign/         defs, audiences, messages, dispatches, runs, exports
    ├── config_api/       tenants, workflows, schedules, UDMP, DQE, clusters…
    ├── connectors/       input + output connectors, templates
    ├── reports/          dashboards, widgets, cubes, QL
    ├── predictions/      prediction defs + content templates
    ├── mailer/           accounts, subusers, identifiers, batches
    ├── emailable_pages/  emailable-pages CRUD
    ├── security/         token, auth, SSO, password reset
    ├── cache/            cache ops
    ├── spam/             spam score
    ├── status/           status + orchestration/purge status
    ├── provisions/       self-service provisioning
    ├── global_actions/   platform-wide actions
    └── alerts/           stub (real Alerts API lives in a different stack)

Every tool shares a single HttpClient with pooled httpx connections, a shared auth token cache, an asyncio.Lock around refreshes, one-shot 401 retry, URL-encoded tenant IDs, and logger.info request/response tracing. If something feels off, the logs usually tell the truth.


Playbooks (the secret sauce)

Tool lists alone aren't enough — a lot of CDP flows are "POST a def, then POST ?action=publish, then GET status, then maybe POST ?action=schedule with a separate schedule id." The LLM routinely gets this wrong if left to its own devices.

So the server ships eight Markdown playbooks as MCP resources:

Resource

What it covers

cdp://docs/campaign-playbook

Full Vega campaign-wizard lifecycle, folderId rules, batch vs triggered publish, datasetDef copy recovery, data-export save→run, async audience sizing

cdp://docs/orchestration-playbook

Schedule CRUD, connector/report/export/campaign runs, sQueryDef validate→save, provisioner, compaction, drain-before-delete

cdp://docs/customer360-playbook

Three-parallel-fetch profile load, layout deep-merge, realtime polling, fq search encoding, GDPR purge

cdp://docs/admin-ops-playbook

DQE batch writes, A360 three-phase saves, status-page job control, GDPR admin override

cdp://docs/reports-dashboards-playbook

Array-wrap POST, cube metadata walk, ad-hoc vs cached execute, dual freshness check

cdp://docs/workflow-authoring-playbook

symbolic workflowId vs numeric workflowDBId, graph load, step + edge batching, verb taxonomy

cdp://docs/connector-wizard-playbook

Input/output connector split, 4-or-5 step wizard, the referenceId vs entityId schedule trap

cdp://docs/udmp-metadata-playbook

Nested-read/flat-write shapes, cascade, publish ordering, custom-attribute whitelist

MCP clients auto-discover them on connect, and the server instructions block points the model at each one.


Authentication notes

  • OAuth2 (preferred): the provider hits POST {baseUrl}/token?action=create with credentials in headers, caches the token in memory, serializes concurrent refreshes behind an asyncio.Lock, and refreshes ~60s before expiry. Any 401 from a downstream call triggers a one-shot forced refresh + retry.

  • Static token: set CDP_AUTH_TOKEN and the OAuth2 path is skipped entirely. You're on the hook for rotation.

Never put real secrets in this repo. .env is gitignored.


Development

# smoke test: should print the server's capabilities + tool list
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' | cdp-mcp

# interactive tool browser
npx @modelcontextprotocol/inspector cdp-mcp

# verify tool count
python3 -c "from cdp_mcp.server import create_server; import asyncio; \
  print(len(asyncio.run(create_server().list_tools())))"

There's a fuller troubleshooting matrix (server-won't-start, 401s, client-can't-connect, etc.) in TUTORIAL.md §9.


Status

  • Tool count: 301 across 12 CDP services

  • Playbook resources: 8

  • Alerts tools are intentionally stubbed — the real Alerts API lives on a separate MuleSoft/Go stack that needs its own base URL and auth (PRs welcome)

  • Integration test harness is a work in progress (scaffolding present, full contract coverage tracked as follow-up)


Contributing

  1. Fork, branch, hack.

  2. Run ./gradlew-equivalent — fine, just pip install -e . and the smoke test above.

  3. If you add a tool, wire it into the matching tools/<area>/__init__.py registrar.

  4. If you add a multi-step flow, write a playbook for it under src/cdp_mcp/docs/ and register the resource in resources/resource_providers.py.

  5. Open a PR. Be nice in the description.


License

Internal / proprietary — check with Acquia before using this outside your own tenant.


Built with equal parts httpx, pydantic, and spite for flaky CDP wizards.

Available Tools

293 tools
cdp_activate_scheduleC

Activate a schedule. This triggers the schedule's workflow action via the workflow controller.

Inputs: workflow_id (required), schedule_id (required), tenant_id. Returns: result

cdp_cache_delete_by_groupC

Delete a cache entry by group and ID. Returns 204 on success.

Inputs: cache_type (required), group (required), id (required), tenant_id. Returns: result

cdp_cache_delete_by_idC

Delete a cache entry by ID. Returns 204 on success.

Inputs: cache_type (required), id (required), tenant_id. Returns: result

cdp_cache_delete_by_keyC

Delete a cache entry by explicit key. Returns 204 on success.

Inputs: cache_type (required), cache_key (required), tenant_id. Returns: result

cdp_cache_get_by_groupC

Get a cached value by group and ID. Groups logically segregate cache keys by source or purpose.

Inputs: cache_type (required), group (required), id (required), tenant_id. Returns: result

cdp_cache_get_by_idB

Get a cached value by ID. The cache key is auto-generated using the ID and any query parameters.

Inputs: cache_type (required), id (required), tenant_id. Returns: result

cdp_cache_get_by_keyC

Get a cached value by explicit cache key. Returns the stored value string and metadata.

Inputs: cache_type (required), cache_key (required), tenant_id. Returns: result

cdp_cache_put_by_groupC

Set or update a cache entry by group and ID.

Inputs: cache_type (required), group (required), id (required), value (required), +2 more. Returns: result

cdp_cache_put_by_idC

Set or update a cache entry by ID. The cache key is auto-generated.

Inputs: cache_type (required), id (required), value (required), tenant_id, +1 more. Returns: result

cdp_cache_put_by_keyC

Set or update a cache entry by explicit key. Value is stored as a string. Optional expiryTime in seconds.

Inputs: cache_type (required), cache_key (required), value (required), tenant_id, +1 more. Returns: result

cdp_calculate_audienceA

Start an asynchronous audience count calculation. Returns a jobId to poll with cdp_get_calculated_count. Pass segment definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_check_sso_stateB

Check the SSO state for a given user. Returns whether SSO is required for the user, optionally scoped to a specific tenant.

Inputs: username (required), tenant. Returns: result

cdp_clone_campaignC

Clone/copy a campaign definition by ID. Creates a duplicate.

Inputs: campaign_id (required), tenant_id. Returns: result

cdp_clone_predictionC

Clone a prediction definition — creates a copy with a new ID (POST /v2/{tenantId}/campaign/predictionDefs/{id}?action=copy).

Inputs: prediction_def_id (required), tenant_id. Returns: result

cdp_clone_resourceA

Clone any CDP resource instance. Creates a copy with a new ID and returns the cloned object. Works on any resource that supports versioning (campaigns, workflows, connectors, predictions, reports, etc.). The resource_path must include the ID, e.g. 'campaigndefs/123'. Set path_style to 'none' for campaign/config/connector resources.

Inputs: resource_path (required), tenant_id, path_style. Returns: result

cdp_copy_cubic_set_defC

Copy a CubicSetDef by ID. Creates a duplicate of the OLAP query definition.

Inputs: cubic_set_def_id (required), tenant_id. Returns: result

cdp_copy_dashboardB

Copy a dashboard by ID. Creates a duplicate of the dashboard.

Inputs: dashboard_id (required), tenant_id. Returns: result

cdp_copy_data_exportC

Copy/duplicate a data export definition by ID.

Inputs: export_id (required), tenant_id. Returns: result

cdp_copy_datasetdefA

Copy an existing datasetDef (audience definition) to create a new, independent one. CDP rejects shared datasetDefs across campaigns with E400: 'The campaignDef being created refers to an existing datasetDef. Please correct this by calling /v2/{tenantId}/datasetDef/{id}?action=copy'. Use this tool to produce a detached copy, then embed the returned object inline in your new campaign's audience field.

Inputs: dataset_def_id (required), tenant_id. Returns: result

cdp_copy_report_defC

Copy a report definition by ID. Creates a duplicate of the report.

Inputs: report_def_id (required), tenant_id. Returns: result

cdp_copy_squery_defC

Copy a SQueryDef by ID. Creates a duplicate of the query definition.

Inputs: squery_def_id (required), tenant_id. Returns: result

cdp_copy_widgetB

Copy a widget by ID. Creates a duplicate of the widget.

Inputs: widget_id (required), tenant_id. Returns: result

cdp_create_a360_ruleC

Create a new A360 identity resolution rule. Pass rule as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_audience_defA

Create a new audience definition. WARNING: the underlying endpoint POST /campaign/audienceDefs is NOT supported on current CDP builds and will return E400 'Request method POST is not supported'. Instead, define the audience INLINE on a campaign via cdp_create_campaign + cdp_update_campaign. See resource cdp://docs/campaign-playbook.

Inputs: body (required), tenant_id. Returns: result

cdp_create_campaignA

Create a new campaign definition. Recommended workflow: call with name+description ONLY to get a resourceId, then call cdp_update_campaign with the full body containing INLINE 'audience' and INLINE 'messageDefs' objects. Do NOT reference an existing messageDef by resourceId — shared messageDefs are rejected with E0420. See resource cdp://docs/campaign-playbook for the full body template, operator enum, and time-window math.

Pass folder_id to place the campaign under a specific Campaign folder (the UI always does this). Omit it to let the backend default to the tenant's root folder.

Inputs: name (required), tenant_id, description, body, +1 more. Returns: result

cdp_create_campaign_templateC

Create a new campaign template. Pass template type and entityId along with tenant list as JSON body.

Inputs: template_type (required), entity_id (required), tenant_ids (required), tenant_id. Returns: result

cdp_create_clientC

Create a new OAuth client. Requires client_id_str, client_secret, grants, and token_validity.

Inputs: client_id_str (required), client_secret (required), grants (required), token_validity (required), +3 more. Returns: result

cdp_create_column_validatorC

Create a new column validator. Pass validator as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_compaction_requestC

Create a new compaction request. Pass request details as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_connectorB

Create a new connector. Provide name and connector_type for simple creation, or pass a full JSON body string for advanced configuration. Channel options: email, export, sms, ads, facebook, any.

Inputs: name (required), connector_type (required), channel, body, +1 more. Returns: result

cdp_create_connector_templateC

Create a new connector definition. Pass definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_cubic_set_defC

Create a new CubicSetDef. Pass definition as a JSON string. Requires name. The model field should be a serialized Saiku JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_dashboardC

Create a new dashboard. Pass dashboard definition as a JSON string. Should include name and optionally description, widgets array, and layout.

Inputs: body (required), tenant_id. Returns: result

cdp_create_data_exportB

Create a new data export definition. Body must be a JSON STRING containing at least name and exportDefItems. Pass folder_id to place the export in a specific folder (matches Vega UI which always sends ?folderId=). Controller expects an array, so the body you provide is wrapped in [...] automatically.

Inputs: body (required), tenant_id, folder_id. Returns: result

cdp_create_dispatchC

Create a dispatch definition for a campaign. Pass dispatch definition as a JSON string.

Inputs: campaign_id (required), body (required), tenant_id. Returns: result

cdp_create_emailable_pageC

Create an emailable page (POST /v2/{tenantId}/emailablepages). Pass the page definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_entityC

Create a new entity in a DW resource. Pass entity data as a JSON string.

Inputs: resource_name (required), body (required), tenant_id. Returns: result

cdp_create_execution_bucketC

Create a new execution bucket. Pass configuration as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_execution_summary_groupC

Create a new execution summary group. Pass configuration as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_mailer_accountC

Create a mailer account (POST /v2/{tenantId}/mailer/accounts). Pass the definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_mailer_batchC

Create a mailer batch (POST /v2/{tenantId}/mailer/batches). Pass the definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_mailer_identifierC

Create a mailer identifier (POST /v2/{tenantId}/mailer/identifiers). Pass the definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_mailer_subuserC

Create a mailer subuser (POST /v2/{tenantId}/mailer/subusers). Pass the definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_mapping_templateC

Create a new mapping template. Pass template as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_message_defA

Create standalone message definitions. Pass as a JSON string list. WARNING: standalone messageDefs created here CANNOT be referenced from a campaign by resourceId — the server rejects shared references with E0420. For campaign-bound emails, instead put the messageDef object INLINE in the campaign's 'messageDefs' array via cdp_update_campaign. Only use this tool for message templates that are independently managed.

Inputs: body (required), tenant_id. Returns: result

cdp_create_output_connectorC

Create a new output connector. Pass configuration as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_output_connector_defC

Create a new output connector definition. Pass definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_predictionC

Create a new prediction definition (POST /v2/{tenantId}/campaign/predictionDefs). Pass the full definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_provision_instanceC

Provision a new instance (POST /provisions/instances). Pass request body as JSON string with serviceId, provisionName, etc.

Inputs: body (required), tenant_id. Returns: result

cdp_create_report_defC

Create a new report definition. Pass definition as a JSON string. Requires name and reportType ('CUBE' or 'RELATIONAL'). CUBE type uses cubicSetDef, RELATIONAL uses datasetOperation.

Inputs: body (required), tenant_id. Returns: result

cdp_create_roleC

Create a new role with whitelist/blacklist permissions. Pass whitelist/blacklist as JSON arrays of Permission objects.

Inputs: name (required), tenant_id, whitelist, blacklist, +1 more. Returns: result

cdp_create_scheduleA

Create a new schedule row in config/schedules. body is a JSON string of the schedule body. Canonical shape (from ui-core ScheduleService.save): { "type": "WORKFLOW", "referenceId": <numeric workflow.id from GET config/workflows/{name}>, "entityType": "connector" | "campaign" | "report" | "exportDef" | ..., "entityId": , "scheduleName": "Schedule-", "active": true, "period": "HOURS" | "DAYS" | "WEEKS" | "MONTHS" | "MINUTES", "frequency": 1, "startTime": "00:00", "startTimestamp": "YYYY-MM-DDTHH:mm", "timeZone": "America/New_York", "jobData": {"campaignProperties": "{}"} // optional, workflow-specific } After creating the row, call cdp_invoke_workflow_action with action='schedule' and the returned scheduleId to arm it.

Inputs: body (required), tenant_id. Returns: result

cdp_create_selfservice_userC

Create a new self-service user. Pass user details as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_create_squery_defC

Create a new SQueryDef. Pass definition as a JSON string. Requires name and expression (SQL query).

Inputs: body (required), tenant_id. Returns: result

cdp_create_tokenB

Create an access token using Basic authentication. Credentials are sent via the standard Authorization header. Returns access_token, token_type, expires_in.

Inputs: username (required), password (required), scheme. Returns: result

cdp_create_userC

Create a new CDP user. Requires userName and password.

Inputs: user_name (required), password (required), tenant_id, first_name, +1 more. Returns: result

cdp_create_widgetC

Create a new widget. Pass widget definition as a JSON string. Requires name and visualizationType at minimum.

Inputs: body (required), tenant_id. Returns: result

cdp_data_erasure_status_overrideC

Admin-only: override the status of a data erasure request (POST /dw/dataerasure/admin?action=statusoverride). Pass override payload as JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_deactivate_provision_instanceC

Deactivate a provisioned instance (DELETE /provisions/instances/{id}).

Inputs: instance_id (required), tenant_id. Returns: result

cdp_deactivate_scheduleC

Deactivate a schedule. This triggers the schedule's workflow action via the workflow controller.

Inputs: workflow_id (required), schedule_id (required), tenant_id. Returns: result

cdp_delete_a360_ruleC

Delete an A360 rule

Inputs: rule_id (required), tenant_id. Returns: result

cdp_delete_audience_defC

Delete an audience definition

Inputs: audience_def_id (required), tenant_id. Returns: result

cdp_delete_campaignC

Delete a campaign definition by ID

Inputs: campaign_id (required), tenant_id. Returns: result

cdp_delete_clientC

Delete an OAuth client by numeric ID

Inputs: client_id (required), tenant_id. Returns: result

cdp_delete_column_validatorD

Delete a column validator

Inputs: validator_id (required), tenant_id. Returns: result

cdp_delete_connectorC

Delete a connector

Inputs: connector_id (required), tenant_id. Returns: result

cdp_delete_connector_templateC

Delete a connector definition

Inputs: connector_def_id (required), tenant_id. Returns: result

cdp_delete_cubic_set_defC

Delete a CubicSetDef by ID

Inputs: cubic_set_def_id (required), tenant_id. Returns: result

cdp_delete_dashboardC

Delete a dashboard by ID

Inputs: dashboard_id (required), tenant_id. Returns: result

cdp_delete_data_erasure_requestC

Cancel/delete a pending data erasure request

Inputs: body (required), tenant_id. Returns: result

cdp_delete_data_exportB

Delete a data export definition by ID.

Inputs: export_id (required), tenant_id. Returns: result

cdp_delete_dispatchC

Delete a dispatch definition

Inputs: dispatch_id (required), tenant_id. Returns: result

cdp_delete_emailable_pageC

Soft-delete an emailable page (DELETE /v2/{tenantId}/emailablepages/{id}).

Inputs: page_id (required), tenant_id. Returns: result

cdp_delete_execution_bucketC

Delete an execution bucket

Inputs: bucket_id (required), tenant_id. Returns: result

cdp_delete_execution_summary_groupC

Delete an execution summary group

Inputs: group_id (required), tenant_id. Returns: result

cdp_delete_mailer_accountB

Soft-delete a mailer account (DELETE /v2/{tenantId}/mailer/accounts/{id}).

Inputs: id (required), tenant_id. Returns: result

cdp_delete_mailer_subuserC

Soft-delete a mailer subuser (DELETE /v2/{tenantId}/mailer/subusers/{id}).

Inputs: id (required), tenant_id. Returns: result

cdp_delete_mapping_templateC

Delete a mapping template

Inputs: template_id (required), tenant_id. Returns: result

cdp_delete_message_defB

Delete a message definition by ID

Inputs: message_def_id (required), tenant_id. Returns: result

cdp_delete_output_connectorC

Delete an output connector

Inputs: connector_id (required), tenant_id. Returns: result

cdp_delete_output_connector_defC

Delete an output connector definition

Inputs: connector_def_id (required), tenant_id. Returns: result

cdp_delete_predictionC

Delete a prediction definition (DELETE /v2/{tenantId}/campaign/predictionDefs/{id}).

Inputs: prediction_def_id (required), tenant_id. Returns: result

cdp_delete_report_defC

Delete a report definition by ID

Inputs: report_def_id (required), tenant_id. Returns: result

cdp_delete_roleD

Delete a role by ID

Inputs: role_id (required), tenant_id. Returns: result

cdp_delete_scheduleA

Delete a schedule (DELETE config/schedules/{id}). IMPORTANT: the UI fires cdp_invoke_workflow_action(action='unschedule', scheduleId=...) FIRST to detach the schedule from its runner workflow; doing only the DELETE leaves a dangling trigger registration in some workflows (AIF_RUNNER, REPORT_RUNNNER_DEFAULT). See the orchestration playbook.

Inputs: schedule_id (required), tenant_id. Returns: result

cdp_delete_selfservice_userC

Delete a self-service user by ID

Inputs: user_id (required), tenant_id. Returns: result

cdp_delete_squery_defC

Delete a SQueryDef by ID.

Inputs: squery_def_id (required), tenant_id. Returns: result

cdp_delete_userC

Delete a CDP user by ID

Inputs: user_id (required), tenant_id. Returns: result

cdp_delete_widgetC

Delete a widget by ID

Inputs: widget_id (required), tenant_id. Returns: result

cdp_deploy_workflowC

Deploy a workflow (make it active)

Inputs: workflow_id (required), version, tenant_id. Returns: result

cdp_deprovision_instanceC

Deprovision a provisioned instance (DELETE /provisions/instances/deprovision/{id}).

Inputs: instance_id (required), tenant_id. Returns: result

cdp_describe_resourceA

Get the JSON Schema description of any CDP resource. Works on collections (e.g., 'report/widgets') or instances (e.g., 'report/widgets/123'). Returns field names, types, editability, and default page size for collections. Set path_style to 'none' for campaign/config/connector resources.

Inputs: resource_path (required), tenant_id, path_style. Returns: result

cdp_execute_audience_defC

Execute/calculate an audience definition. Triggers the audience calculation workflow.

Inputs: audience_def_id (required), tenant_id. Returns: result

cdp_export_report_excelC

Export a report as an Excel pivot file. Requires cubeId and password. The export is generated from the cube data on the collection endpoint.

Inputs: cube_id (required), password (required), tenant_id, filename. Returns: result

cdp_extend_tokenC

Extend the expiry of an existing bearer token. The token is sent via the Authorization header.

Inputs: token (required), scheme. Returns: result

cdp_generate_password_resetA

Generate a password reset link for a user. Sends a reset email to the user's registered address. Requires the username and source (VEGA or CONFIG).

Inputs: username (required), source. Returns: result

cdp_generate_queryB

Generate a SQL query from a dataset definition. Pass the dataset definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_generate_squery_defC

Generate input/output arguments for a SQueryDef from its expression. Pass a SQueryDef JSON with an expression field. Returns the def with arguments and outputAttributes filled in.

Inputs: body (required), tenant_id. Returns: result

cdp_get_a360_ruleC

Get a specific A360 rule by ID

Inputs: rule_id (required), tenant_id. Returns: result

cdp_get_audience_countC

Get audience count based on a segment definition (synchronous). Pass segment definition as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_get_audience_defB

Get a specific audience definition by ID

Inputs: audience_def_id (required), tenant_id. Returns: result

cdp_get_calculated_countB

Get the result of an async audience calculation (poll after cdp_calculate_audience)

Inputs: tenant_id, job_id. Returns: result

cdp_get_campaignB

Get a specific campaign definition by ID

Inputs: campaign_id (required), tenant_id. Returns: result

cdp_get_campaign_runC

Get details of a specific campaign execution (dataset description) by ID

Inputs: run_id (required), tenant_id. Returns: result

cdp_get_clientB

Get a specific OAuth client by numeric ID

Inputs: client_id (required), tenant_id. Returns: result

cdp_get_column_validatorC

Get a specific column validator by ID

Inputs: validator_id (required), tenant_id. Returns: result

cdp_get_connectorC

Get a specific connector by ID

Inputs: connector_id (required), tenant_id. Returns: result

cdp_get_connector_templateC

Get a specific connector definition by ID

Inputs: connector_def_id (required), tenant_id. Returns: result

cdp_get_connector_versionsC

Get connector history / past batch runs for a connector

Inputs: connector_id (required), tenant_id, offset, limit. Returns: result

cdp_get_cube_statusC

Get the processing status of all OLAP cubes for a tenant. Returns the status of each cube including whether it is ready.

Inputs: tenant_id. Returns: result

cdp_get_cube_status_by_namesC

Get the processing status of specific OLAP cubes by name. Pass a JSON array of cube unique names as a string.

Inputs: cube_names (required), tenant_id. Returns: result

cdp_get_cubic_set_defB

Get a CubicSetDef by ID. Returns the full definition including the model (Saiku query JSON).

Inputs: cubic_set_def_id (required), tenant_id. Returns: result

cdp_get_customer_360C

Get Customer 360 summary view for a resource type (e.g., list of customer profiles)

Inputs: resource_name (required), tenant_id, offset, limit, +1 more. Returns: result

cdp_get_customer_360_detailC

Get detailed Customer 360 profile for a specific customer

Inputs: resource_name (required), resource_id (required), tenant_id. Returns: result

cdp_get_customer_360_realtimeC

Get real-time Customer 360 data (includes latest streaming events)

Inputs: resource_name (required), resource_id (required), tenant_id. Returns: result

cdp_get_customer_identitiesC

Get all identities associated with given customer IDs. Pass customer IDs as a JSON string body.

Inputs: resource_name (required), body (required), tenant_id. Returns: result

cdp_get_dashboardC

Get a dashboard by ID. Returns full definition including widgets and layout structure.

Inputs: dashboard_id (required), tenant_id. Returns: result

cdp_get_data_erasure_statusC

List all data erasure request statuses for a tenant

Inputs: tenant_id, offset, limit. Returns: result

cdp_get_data_erasure_status_by_idC

Get the status of a specific data erasure request by resource ID

Inputs: resource_id (required), tenant_id. Returns: result

cdp_get_data_exportC

Get a specific data export definition by ID.

Inputs: export_id (required), tenant_id. Returns: result

cdp_get_dataset_defC

Get a specific datasetDef by ID.

Inputs: dataset_def_id (required), tenant_id. Returns: result

cdp_get_dimension_valuesA

Get the values for a specific dimension level within an OLAP cube hierarchy. Requires cube_id, dimension_id, hierarchy_id, and level_name. Use cdp_get_cube_metadata first to discover these identifiers.

Inputs: cube_id (required), dimension_id (required), hierarchy_id (required), level_name (required), +3 more. Returns: result

cdp_get_dispatchC

Get a specific dispatch definition by ID

Inputs: dispatch_id (required), tenant_id. Returns: result

cdp_get_dqe1_ruleB

Get a specific DQE Phase 1 rule by ID

Inputs: rule_id (required), tenant_id. Returns: result

cdp_get_dqe2_ruleB

Get a specific DQE Phase 2 rule by ID

Inputs: rule_id (required), tenant_id. Returns: result

cdp_get_emailable_pageC

Get an emailable page by id (GET /v2/{tenantId}/emailablepages/{id}).

Inputs: page_id (required), tenant_id. Returns: result

cdp_get_entityC

Get a single entity by its resource name and ID

Inputs: resource_name (required), resource_id (required), tenant_id, include. Returns: result

cdp_get_execution_summary_groupC

Get a specific execution summary group by ID

Inputs: group_id (required), tenant_id. Returns: result

cdp_get_mailer_accountC

Get a mailer account by id (GET /v2/{tenantId}/mailer/accounts/{id}).

Inputs: id (required), tenant_id. Returns: result

cdp_get_mailer_batchC

Get a mailer batch by id (GET /v2/{tenantId}/mailer/batches/{id}).

Inputs: id (required), tenant_id. Returns: result

cdp_get_mailer_identifierC

Get a mailer identifier by id (GET /v2/{tenantId}/mailer/identifiers/{id}).

Inputs: id (required), tenant_id. Returns: result

cdp_get_mailer_identifier_by_campaign_dispatchC

Look up a mailer identifier by campaign + dispatch (GET /v2/{tenantId}/mailer/identifiers/campaign/{campaignId}/dispatch/{dispatchId}).

Inputs: campaign_id (required), dispatch_id (required), tenant_id. Returns: result

cdp_get_mailer_subuserC

Get a mailer subuser by id (GET /v2/{tenantId}/mailer/subusers/{id}).

Inputs: id (required), tenant_id. Returns: result

cdp_get_mapped_provision_instanceC

Get a mapped provisioned resource by instance ID (GET /provisions/instances/mapped/{instanceId}).

Inputs: instance_id (required), tenant_id. Returns: result

cdp_get_mapping_templateC

Get a specific mapping template by ID

Inputs: template_id (required), tenant_id. Returns: result

cdp_get_message_defC

Get a specific message definition by ID

Inputs: message_def_id (required), tenant_id. Returns: result

cdp_get_orchestration_statusC

Get a single orchestration status record by id (GET /v2/{tenantId}/orchstatus/{id}).

Inputs: status_id (required), tenant_id. Returns: result

cdp_get_orchestration_status_for_connectorC

Get orchestration status for a specific connector (GET /v2/{tenantId}/orchstatus/connector/{connectorId}).

Inputs: connector_id (required), tenant_id. Returns: result

cdp_get_orchestration_status_logC

Fetch the log for an orchestration status record (GET /v2/{tenantId}/orchstatus/{id}/log).

Inputs: status_id (required), tenant_id. Returns: result

cdp_get_output_connectorC

Get a specific output connector by ID

Inputs: connector_id (required), tenant_id. Returns: result

cdp_get_output_connector_defC

Get a specific output connector definition by ID

Inputs: connector_def_id (required), tenant_id. Returns: result

cdp_get_predictionC

Get a specific prediction definition by ID (GET /v2/{tenantId}/campaign/predictionDefs/{id}).

Inputs: prediction_def_id (required), tenant_id. Returns: result

cdp_get_prediction_containerC

Get a prediction result by container code. Optionally pass pid (person ID) and other query params.

Inputs: container_code (required), tenant_id, pid. Returns: result

cdp_get_provision_instanceB

Get a specific provisioned instance by ID.

Inputs: instance_id (required), tenant_id. Returns: result

cdp_get_provision_limitC

Get provisioning limit for a specific service (GET /provisions/limits/{serviceId}). Set validate=true to include a 'provisioningAllowed' flag.

Inputs: service_id (required), tenant_id, validate. Returns: result

cdp_get_provision_serviceC

Get a specific provision service by ID or name (GET /provisions/services/{serviceId|serviceName}).

Inputs: service_id_or_name (required), tenant_id. Returns: result

cdp_get_purge_statusB

Get data-purge status (GET /v2/{tenantId}/purgestatus). If event_id is supplied, returns status for that specific purge event.

Inputs: tenant_id, event_id. Returns: result

cdp_get_report_defC

Get a report definition by ID. Returns full definition including reportType, datasetOperation or cubicSetDef.

Inputs: report_def_id (required), tenant_id. Returns: result

cdp_get_roleC

Get a specific role by ID

Inputs: role_id (required), tenant_id. Returns: result

cdp_get_run_dispatchesB

Get the latest execution status for a campaign definition. Requires defId and defType. Optionally include step details.

Inputs: def_id (required), def_type, steps, tenant_id. Returns: result

cdp_get_scheduleC

Get a specific schedule by ID

Inputs: schedule_id (required), tenant_id. Returns: result

cdp_get_schema_checkpointsC

Get schema checkpoints for a tenant

Inputs: tenant_id. Returns: result

cdp_get_selfservice_userB

Get a specific self-service user by ID

Inputs: user_id (required), tenant_id. Returns: result

cdp_get_session_infoB

Get session and permissions info for the current bearer token. Optionally specify a tenant_name to scope the response.

Inputs: token (required), tenant_name. Returns: result

cdp_get_squery_defC

Get a SQueryDef by ID. Returns the full definition including expression and arguments.

Inputs: squery_def_id (required), tenant_id. Returns: result

cdp_get_status_messageB

Get status messages for a workflow/entity event (GET /v2/{tenantId}/status/{resourceType}). resource_type defaults to 'statusmessage' (the only documented resource today) but the controller is generic — pass a different value if the platform exposes more resource types. Filters: event_type, entity_type, entity_id, workflow_id.

Inputs: tenant_id, resource_type, event_type, entity_type, +2 more. Returns: result

cdp_get_summary_customizationC

Get a specific summary customization by ID

Inputs: customization_id (required), tenant_id. Returns: result

cdp_get_tenantB

Get details of a specific tenant by ID. Tenant IDs are strings — may be numeric, a GUID, or a slug.

Inputs: target_tenant_id (required). Returns: result

cdp_get_tokenB

Get token information. Pass a bearer token to fetch info about that specific token, or username/password (Basic auth) to fetch the user's token.

Inputs: token, username, password, scheme. Returns: result

cdp_get_udmp_tableC

Get a specific UDMP table by ID

Inputs: table_id (required), tenant_id. Returns: result

cdp_get_userB

Get a specific CDP user by ID

Inputs: user_id (required), tenant_id. Returns: result

cdp_get_user_liteB

Get a specific user in lightweight format by ID

Inputs: user_id (required), tenant_id. Returns: result

cdp_get_web_templatesC

Get web personalization templates for a tenant

Inputs: tenant_id, payload. Returns: result

cdp_get_widgetB

Get a widget by ID. Returns full definition including reportDef and visualization settings.

Inputs: widget_id (required), tenant_id. Returns: result

cdp_get_workflowC

Get a specific workflow by ID. Optionally specify a version.

Inputs: workflow_id (required), version, tenant_id. Returns: result

cdp_get_workflow_jobB

Get details of a specific workflow job execution. Requires the workflow_id and job_id.

Inputs: workflow_id (required), job_id (required), tenant_id. Returns: result

cdp_get_workflow_stepC

Get a specific step in a workflow

Inputs: workflow_id (required), step_id (required), version, tenant_id. Returns: result

cdp_invoke_workflow_actionA

Invoke an arbitrary action on a workflow. This is the generic escape hatch for action verbs that cdp_run_workflow does not support (it only sends action=run). Common verbs observed in the Vega/Config UI:

  • 'schedule' / 'unschedule' — arm/disarm a schedule on AIF_RUNNER, REPORT_RUNNNER_DEFAULT, DATA_EXPORT_DEFAULT, etc. Requires schedule_id.

  • 'activate_schedule' / 'deactivate_schedule' — toggle an existing schedule without deleting the row (also exposed via cdp_activate_schedule / cdp_deactivate_schedule).

  • 'publish' / 'unpublish' — connector lifecycle via CONNECTOR_OPS_DEFAULT. Requires entity_type='connector' + entity_id.

  • 'run' — alias of cdp_run_workflow, kept for completeness. body is an optional JSON string for workflows that need a payload.

Inputs: workflow_id (required), action (required), entity_type, entity_id, +4 more. Returns: result

cdp_kill_jobC

Kill a running workflow job

Inputs: workflow_id (required), job_id (required), tenant_id. Returns: result

cdp_list_a360_rulesC

List A360 identity resolution rules

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_audience_defsB

List audience definitions for a tenant. Returns paged results.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_campaign_runsB

List execution history (dataset descriptions) for a campaign definition. Requires defId and defType (e.g. DATASET_DEF). Returns paged results.

Inputs: def_id (required), def_type, tenant_id, offset, +1 more. Returns: result

cdp_list_campaignsC

List all campaign definitions for a tenant. Returns paged results.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_campaign_templatesB

List available campaign templates. Requires type parameter (e.g. PLAYBOOK, MESSAGE, AUDIENCE).

Inputs: template_type, tenant_id. Returns: result

cdp_list_clientsC

List all OAuth clients for a tenant

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_clustersB

List available compute clusters

Inputs: tenant_id. Returns: result

cdp_list_column_validatorsC

List column validators for a tenant

Inputs: tenant_id. Returns: result

cdp_list_compaction_requestsB

List compaction requests for a tenant

Inputs: tenant_id. Returns: result

cdp_list_connectorsC

List all configured connectors for a tenant

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_connector_templatesC

List available connector definitions (templates)

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_cube_metadataC

List all available OLAP cubes for a tenant. Returns cube unique names and captions.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_cubic_set_defsB

List all CubicSetDefs (OLAP query definitions) for a tenant. These define Saiku-based cube queries used by CUBE-type reports.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_dashboardsC

List all accessible dashboards for a tenant

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_data_exportsC

List all data export definitions for a tenant.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_dataset_defsB

List datasetDefs (raw audience definitions) for a tenant. Useful for discovering shared definitions before calling cdp_copy_datasetdef.

Inputs: tenant_id, offset, limit, lookup. Returns: result

cdp_list_dispatchesC

List dispatch definitions for a campaign

Inputs: campaign_id (required), tenant_id. Returns: result

cdp_list_dqe1_rulesC

List DQE Phase 1 data quality rules

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_dqe2_rulesC

List DQE Phase 2 data quality rules

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_emailable_pagesD

List emailable pages (GET /v2/{tenantId}/emailablepages).

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_entitiesC

Query entities from a CDP data warehouse resource (e.g., customer, organization, transaction). Supports filtering via fq parameter.

Inputs: resource_name (required), tenant_id, offset, limit, +3 more. Returns: result

cdp_list_execution_bucketsC

List execution buckets for a tenant

Inputs: tenant_id. Returns: result

cdp_list_execution_summary_groupsC

List execution summary groups for a tenant

Inputs: tenant_id. Returns: result

cdp_list_mailer_accountsC

List mailer accounts (GET /v2/{tenantId}/mailer/accounts).

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_mailer_batchesD

List mailer batches (GET /v2/{tenantId}/mailer/batches).

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_mailer_identifiersD

List mailer identifiers (GET /v2/{tenantId}/mailer/identifiers).

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_mailer_subusersC

List mailer subusers (GET /v2/{tenantId}/mailer/subusers).

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_mapping_templatesC

List mapping templates for a tenant

Inputs: tenant_id. Returns: result

cdp_list_message_defsC

List message definitions for a tenant. Returns paged results.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_orchestration_statusC

List orchestration statuses (GET /v2/{tenantId}/orchstatus). Returns workflow/connector orchestration runs and their state.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_output_connector_defsC

List available output connector definitions

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_output_connectorsC

List all configured output connectors for a tenant

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_predictionsB

List prediction definitions for a tenant (GET /v2/{tenantId}/campaign/predictionDefs). Pass q (e.g. 'isPublished:true') for server-side filtering.

Inputs: tenant_id, offset, limit, q. Returns: result

cdp_list_provisioning_packagesB

List available provisioning packages for a tenant

Inputs: tenant_id. Returns: result

cdp_list_provision_instancesC

List provisioned instances with optional filters: active, status, provision_name, requested_by.

Inputs: tenant_id, offset, limit, active, +3 more. Returns: result

cdp_list_provision_limitsB

Fetch provisioning limits for all services of a tenant.

Inputs: tenant_id. Returns: result

cdp_list_provision_servicesC

List available provision services for a tenant (paged).

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_report_defsC

List all report definitions for a tenant

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_role_actionsB

List all available permission actions that can be assigned to roles

Inputs: tenant_id. Returns: result

cdp_list_rolesB

List all roles for a CDP tenant. Supports optional search and tenantIds (comma-separated string, e.g. '0,425,802') for multi-tenant queries.

Inputs: tenant_id, offset, limit, search, +1 more. Returns: result

cdp_list_schedulesC

List schedules for a tenant. Requires a schedule type (e.g. 'workflow'). Optionally filter by entityType and entityId.

Inputs: schedule_type (required), entity_type, entity_id, tenant_id, +2 more. Returns: result

cdp_list_selfservice_rolesB

List available self-service roles for a tenant

Inputs: tenant_id. Returns: result

cdp_list_selfservice_usersB

List all self-service users for a tenant

Inputs: tenant_id. Returns: result

cdp_list_squery_defsC

List all SQueryDefs (SQL query definitions) for a tenant.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_summary_customizationsC

List summary customizations for a tenant

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_tenant_clustersB

List clusters assigned to the current tenant

Inputs: tenant_id. Returns: result

cdp_list_tenantsC

List all tenants accessible to the current user

Inputs: offset, limit. Returns: result

cdp_list_udmp_resourcesC

List UDMP resources (available data resources in the platform)

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_udmp_tablesC

List UDMP (Unified Data Model Platform) tables

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_unlinked_provision_instancesC

List unlinked provisioned instances for a connector class and type (GET /provisions/instances/unlinked?connectorClassName=&connectorType=).

Inputs: connector_class_name (required), connector_type (required), tenant_id. Returns: result

cdp_list_usersB

List all CDP users for a tenant with pagination; optional search filter

Inputs: tenant_id, offset, limit, search. Returns: result

cdp_list_users_liteC

List all users in lightweight format (fewer fields, faster response)

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_widgetsC

List all accessible widgets for a tenant. Returns id, name, editedby, editeddate by default.

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_workflow_edgesC

List all edges (connections) in a workflow DAG

Inputs: workflow_id (required), version, tenant_id. Returns: result

cdp_list_workflowsC

List workflows for a tenant

Inputs: tenant_id, offset, limit. Returns: result

cdp_list_workflow_stepsC

List all steps (nodes) in a workflow DAG

Inputs: workflow_id (required), version, tenant_id. Returns: result

cdp_list_workflow_step_typesB

List available workflow step types (node types for workflow DAGs)

Inputs: tenant_id. Returns: result

cdp_loginA

Authenticate a user via Basic auth and generate a bearer token. Optionally specify a tenant_name to scope the login. Returns access_token, token_type, expires_in.

Inputs: username (required), password (required), tenant_name. Returns: result

cdp_logoutA

Logout and revoke the current bearer token. Pass a bearer token to revoke it, or username/password to revoke all tokens for that user.

Inputs: token, username, password. Returns: result

cdp_lookup_audience_defsC

Lookup audiences by name. Returns matching audience definitions with optional offset/limit.

Inputs: lookup (required), tenant_id, offset, limit. Returns: result

cdp_lookup_valuesC

Lookup distinct values for a field in a DW entity resource. Requires the field name to look up. Pass lookup request as JSON string.

Inputs: resource_name (required), field (required), body (required), tenant_id. Returns: result

cdp_post_tracking_eventA

Post a real-time tracking event to the CDP (POST /{apiVersion}/{tenantId}/dw/tracker). api_version is a routable path segment — defaults to 'v2' but the controller accepts any version clients want to pin. Pass event data as a JSON string with eventType, identityHash, properties.

Inputs: body (required), tenant_id, api_version. Returns: result

cdp_process_mailer_batchC

Trigger processing of a mailer batch by id (POST /v2/{tenantId}/mailer/batches/{id}). Optional JSON body is forwarded as-is.

Inputs: batch_id (required), tenant_id, body. Returns: result

cdp_provision_instance_actionB

Perform an action on a provision instance (POST /provisions/instances/{id}?action=...). Actions: regenerate_credentials, apply_policy_change. Pass optional body as JSON string (required for apply_policy_change).

Inputs: instance_id (required), action (required), body, tenant_id. Returns: result

cdp_publish_web_campaignA

Publish a triggered/web campaign via the CAMPAIGN_FLOW_DEFAULT workflow. This is the correct action for real-time/triggered campaigns (web, API, journey) — cdp_start_campaign only works for batch 'send now' runs. Mirrors what the Vega UI does when you click 'Publish' on a web campaign.

Inputs: entity_id (required), tenant_id, web_action. Returns: result

cdp_query_sqlA

Execute a read-only SQL query against the CDP data warehouse (Impala SQL) using GET with query in URL. Suitable for short queries. For long queries, use cdp_query_sql_post instead. Only SELECT statements are supported.

Inputs: query (required), tenant_id. Returns: result

cdp_query_sql_postA

Execute a read-only SQL query via POST body. Use this for long queries that may exceed URL length limits. Only SELECT statements are supported.

Inputs: query (required), tenant_id. Returns: result

cdp_reactivate_provision_instanceC

Reactivate a deactivated instance (POST /provisions/instances/reactivate/{id}).

Inputs: instance_id (required), tenant_id. Returns: result

cdp_request_data_erasureC

Request GDPR/CCPA data erasure for a customer (by identityHash or email). Pass erasure request as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_rerun_jobC

Re-run a completed or failed workflow job

Inputs: workflow_id (required), job_id (required), tenant_id. Returns: result

cdp_restore_emailable_pageC

Restore a soft-deleted emailable page (POST /v2/{tenantId}/emailablepages/{id}).

Inputs: page_id (required), tenant_id. Returns: result

cdp_restore_mailer_accountC

Restore a soft-deleted mailer account (POST /v2/{tenantId}/mailer/accounts/{id}).

Inputs: id (required), tenant_id. Returns: result

cdp_restore_mailer_subuserC

Restore a soft-deleted mailer subuser (POST /v2/{tenantId}/mailer/subusers/{id}).

Inputs: id (required), tenant_id. Returns: result

cdp_resume_jobC

Resume a suspended workflow job

Inputs: workflow_id (required), job_id (required), tenant_id. Returns: result

cdp_retry_provision_instanceB

Retry provisioning a failed instance (POST /provisions/instances/retry-provision/{id}). Pass same body as initial provisioning as JSON string.

Inputs: instance_id (required), body (required), tenant_id. Returns: result

cdp_revoke_tokenB

Revoke an access token. Pass either a bearer token to revoke that specific token, or username/password (Basic auth) to revoke all tokens for that user.

Inputs: token, username, password, scheme. Returns: result

cdp_run_data_exportB

Execute a data export immediately via the DATA_EXPORT_DEFAULT workflow. Equivalent to clicking 'Send Now' in the Vega Data Export UI. Sends body {"dataExportProperties":"{}"} to match the UI contract.

Inputs: export_id (required), tenant_id. Returns: result

cdp_run_workflowA

Trigger a workflow execution. Optionally provide entityType/entityId for scoped runs, or scheduleId for scheduled runs. body is an optional JSON string — many workflows require a properties map, e.g. CAMPAIGN_FLOW_DEFAULT needs {"campaignProperties":"{}"}, DATA_EXPORT_DEFAULT needs {"dataExportProperties":"{}"}. When omitted, no body is sent.

Inputs: workflow_id (required), version, entity_type, entity_id, +3 more. Returns: result

cdp_score_spamB

Score email/message content for spam likelihood (POST /v2/{tenantId}/spam/score). The request body MUST be a JSON ARRAY: [{"subject": "...", "body": "...", "fromAddress": "...", "fromName": "..."}]. Passing a single object returns E400 'Cannot deserialize from Object value'. Pass the array as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_send_emailC

Send an email of a specific type. email_type examples: support, alert, notification. Pass email details as a JSON string.

Inputs: email_type (required), body (required), tenant_id. Returns: result

cdp_set_current_versionA

Roll back any CDP resource to a specific version. Equivalent to GET version N then PUT as current. Returns the new version number. Works on any versioned resource. The resource_path must include the ID, e.g. 'workflows/456'. Set path_style to 'none' for campaign/config/connector resources.

Inputs: resource_path (required), version (required), tenant_id, path_style. Returns: result

cdp_start_campaignA

Execute/run a campaign immediately ('send now'). Requires entity_id (the campaign def resourceId). Set cohort=True for cohort campaigns. An empty {"campaignProperties":"{}"} body is sent automatically to match the Vega UI contract — omitting it causes the backend to 400 on some builds. For triggered/web campaigns use cdp_publish_web_campaign instead.

Inputs: entity_id (required), tenant_id, version, cohort. Returns: result

cdp_stop_campaignC

Stop/kill a running campaign by ID. Sends a workflow kill signal.

Inputs: campaign_id (required), tenant_id. Returns: result

cdp_suspend_jobC

Suspend a running workflow job

Inputs: workflow_id (required), job_id (required), tenant_id. Returns: result

cdp_unschedule_compaction_requestC

Unschedule a compaction request by ID

Inputs: request_id (required), tenant_id. Returns: result

cdp_update_a360_ruleC

Update an existing A360 rule. Pass updated fields as a JSON string.

Inputs: rule_id (required), body (required), tenant_id. Returns: result

cdp_update_audience_defC

Update an existing audience definition. Pass updated fields as a JSON string.

Inputs: audience_def_id (required), body (required), tenant_id. Returns: result

cdp_update_campaignB

Update an existing campaign definition. Pass updated fields as a JSON string. Pass folder_id to move the campaign into a specific folder (matches UI save behaviour, which always sends ?folderId=...).

Inputs: campaign_id (required), body (required), tenant_id, folder_id. Returns: result

cdp_update_clientC

Update an existing OAuth client

Inputs: client_numeric_id (required), tenant_id, client_id_str, client_secret, +4 more. Returns: result

cdp_update_column_validatorC

Update a column validator. Pass updated fields as a JSON string.

Inputs: validator_id (required), body (required), tenant_id. Returns: result

cdp_update_connectorC

Update an existing connector. Pass updated fields as a JSON string.

Inputs: connector_id (required), body (required), tenant_id. Returns: result

cdp_update_cubic_set_defC

Update an existing CubicSetDef by ID. Pass updated fields as a JSON string.

Inputs: cubic_set_def_id (required), body (required), tenant_id. Returns: result

cdp_update_customer_profileC

Update customer profile attributes in real-time (POST /v2/{tenantId}/dw/profile). Pass profile update data as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_update_dashboardC

Update an existing dashboard by ID. Pass updated fields as a JSON string.

Inputs: dashboard_id (required), body (required), tenant_id. Returns: result

cdp_update_data_erasure_requestC

Update an existing data erasure request (PUT /dw/dataerasure). Pass the updated erasure request body as a JSON string.

Inputs: body (required), tenant_id. Returns: result

cdp_update_data_exportC

Update an existing data export definition. Pass updated fields as a JSON string. folder_id moves the export between folders.

Inputs: export_id (required), body (required), tenant_id, folder_id. Returns: result

cdp_update_dispatchC

Update a dispatch definition. Pass updated fields as a JSON string.

Inputs: dispatch_id (required), body (required), tenant_id. Returns: result

cdp_update_emailable_pageC

Update an emailable page (PUT /v2/{tenantId}/emailablepages/{id}). Pass the updated definition as a JSON string.

Inputs: page_id (required), body (required), tenant_id. Returns: result

cdp_update_entityC

Update an existing entity in a DW resource. Pass updated fields as a JSON string.

Inputs: resource_name (required), resource_id (required), body (required), tenant_id. Returns: result

cdp_update_execution_bucketC

Update an execution bucket. Pass updated fields as a JSON string.

Inputs: bucket_id (required), body (required), tenant_id. Returns: result

cdp_update_execution_summary_groupC

Update an execution summary group. Pass updated fields as a JSON string.

Inputs: group_id (required), body (required), tenant_id. Returns: result

cdp_update_mailer_accountC

Update a mailer account (PUT /v2/{tenantId}/mailer/accounts/{id}). Pass the updated definition as a JSON string.

Inputs: id (required), body (required), tenant_id. Returns: result

cdp_update_mailer_batchC

Update a mailer batch (PUT /v2/{tenantId}/mailer/batches/{id}). Pass the updated definition as a JSON string.

Inputs: id (required), body (required), tenant_id. Returns: result

cdp_update_mailer_identifierC

Update a mailer identifier (PUT /v2/{tenantId}/mailer/identifiers/{id}). Pass the updated definition as a JSON string.

Inputs: id (required), body (required), tenant_id. Returns: result

cdp_update_mailer_subuserC

Update a mailer subuser (PUT /v2/{tenantId}/mailer/subusers/{id}). Pass the updated definition as a JSON string.

Inputs: id (required), body (required), tenant_id. Returns: result

cdp_update_mapping_templateB

Update an existing mapping template. Pass updated fields as a JSON string.

Inputs: template_id (required), body (required), tenant_id. Returns: result

cdp_update_message_defC

Update a message definition by ID. Pass updated fields as a JSON string.

Inputs: message_def_id (required), body (required), tenant_id. Returns: result

cdp_update_output_connectorC

Update an existing output connector. Pass updated fields as a JSON string.

Inputs: connector_id (required), body (required), tenant_id. Returns: result

cdp_update_output_connector_defC

Update an output connector definition. Pass updated fields as a JSON string.

Inputs: connector_def_id (required), body (required), tenant_id. Returns: result

cdp_update_passwordB

Update a user's password using a valid reset code. Requires the username, reset code, and new password.

Inputs: username (required), reset_code (required), new_password (required). Returns: result

cdp_update_predictionC

Update an existing prediction definition (PUT /v2/{tenantId}/campaign/predictionDefs/{id}). Pass updated fields as a JSON string.

Inputs: prediction_def_id (required), body (required), tenant_id. Returns: result

cdp_update_provision_instanceC

Modify a provisioned instance (PUT /provisions/instances/{id}). Pass update body as JSON string.

Inputs: instance_id (required), body (required), tenant_id. Returns: result

cdp_update_report_defC

Update an existing report definition by ID. Pass updated fields as a JSON string.

Inputs: report_def_id (required), body (required), tenant_id. Returns: result

cdp_update_roleC

Update an existing role. Pass whitelist/blacklist/included as JSON strings.

Inputs: role_id (required), tenant_id, name, whitelist, +2 more. Returns: result

cdp_update_scheduleB

Update an existing schedule row (PUT config/schedules/{id}). body is a JSON string of the full schedule body — see cdp_create_schedule for the canonical shape. Pass the same referenceId, entityType, entityId as the original, or the CDP backend will detach the schedule from its workflow.

Inputs: schedule_id (required), body (required), tenant_id. Returns: result

cdp_update_selfservice_userC

Update a self-service user. Pass updated fields as a JSON string.

Inputs: user_id (required), body (required), tenant_id. Returns: result

cdp_update_selfservice_user_statusC

Update a self-service user's status (e.g., activate/deactivate). Pass action and body as JSON string.

Inputs: user_id (required), action (required), body (required), tenant_id. Returns: result

cdp_update_squery_defC

Update an existing SQueryDef by ID. Pass updated fields as a JSON string.

Inputs: squery_def_id (required), body (required), tenant_id. Returns: result

cdp_update_userC

Update an existing CDP user's details

Inputs: user_id (required), tenant_id, user_name, first_name, +2 more. Returns: result

cdp_update_widgetC

Update an existing widget by ID. Pass updated fields as a JSON string.

Inputs: widget_id (required), body (required), tenant_id. Returns: result

cdp_validate_password_resetC

Validate a password reset code. Checks whether the reset code is still valid for the given user.

Inputs: username (required), reset_code (required). Returns: result

cdp_validate_squery_defC

Validate a SQueryDef's expression, arguments, and output attributes. Checks that parameter names, data types, and counts match the expression.

Inputs: body (required), tenant_id. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.9/5.0

    Scored across 293 tools

    Disambiguation4/5

    The tools are well-differentiated by resource type and action, with clear naming like 'cdp_create_campaign' and 'cdp_get_campaign'. However, some overlap exists in cache operations (e.g., 'cdp_cache_get_by_id' vs 'cdp_cache_get_by_key') and workflow actions (e.g., 'cdp_run_workflow' vs 'cdp_invoke_workflow_action'), which could cause minor confusion. Overall, the descriptions help clarify distinctions, but the sheer volume of tools increases the risk of misselection.

    Naming Consistency5/5

    Tool names follow a highly consistent pattern throughout: all start with 'cdp_' prefix, use snake_case, and follow a verb_noun structure (e.g., 'create_campaign', 'list_connectors', 'update_user'). There are no deviations in style or convention, making the naming predictable and easy to parse.

    Tool Count2/5

    With 293 tools, the count is extremely high and feels overwhelming for a single server. While CDP is a complex platform, this many tools suggests poor scoping and could lead to agent confusion. A more modular approach with multiple focused servers would be more appropriate, as this exceeds typical reasonable bounds (e.g., 3-15 tools for well-scoped servers).

    Completeness5/5

    The tool set provides comprehensive coverage of the CDP domain, including full CRUD operations for resources like campaigns, connectors, reports, and users, along with specialized actions (e.g., workflow execution, data export, audience calculation). There are no obvious gaps; the tools support the entire lifecycle and advanced functionalities, ensuring agents can handle complex workflows without dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      The first full-featured MCP server for Adobe Experience Platform: 29 tools across schemas, datasets, profiles, segments, query service, and GDPR/CCPA privacy operations. Extends Adobe's read-only beta with production-grade write operations.
      80 npm
      Apache 2.0
    • A
      license
      C
      quality
      B
      maintenance
      A comprehensive MCP server covering the full GoHighLevel API surface with 651 tools, enabling management of contacts, opportunities, calendars, invoices, and more through natural language, with multi-tenant support and read-only safety defaults.
      500
      115 npm
      1
      MIT