CDP MCP Server
Supports configuration via .env files for environment variables including CDP environment selection, tenant IDs, and authentication credentials (OAuth2 or static tokens).
Mentions that the real Alerts API resides on a separate MuleSoft/Go stack that would require its own MCP server implementation for full integration.
Compatible with Ollama/Open WebUI MCP clients via supergateway, allowing AI models to access Acquia CDP tools and resources through the MCP protocol.
Utilizes Pydantic models for request/response validation and configuration management across all CDP API interactions, ensuring type-safe data handling.
Built as a Python-based MCP server that provides comprehensive integration with Acquia's Customer Data Platform APIs, requiring Python 3.11+ for execution.
Integrates with Acquia CDP's Vega campaign-wizard interface, providing playbooks that reverse-engineer Vega UI flows for campaign lifecycle management, folder rules, publishing, and audience sizing.
Click on "Deploy 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., "@CDP MCP Server show me the status of my active campaigns"
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.
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.mdfor the full catalogue8 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_ENVIRONMENTvariableStdio 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-mcpcdp-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 frameworkhttpx>=0.27.0— async HTTPpydantic+pydantic-settings— config + validationpython-dotenv—.envloading
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 |
| Full Vega campaign-wizard lifecycle, folderId rules, batch vs triggered publish, datasetDef copy recovery, data-export save→run, async audience sizing |
| Schedule CRUD, connector/report/export/campaign runs, sQueryDef validate→save, provisioner, compaction, drain-before-delete |
| Three-parallel-fetch profile load, layout deep-merge, realtime polling, |
| DQE batch writes, A360 three-phase saves, status-page job control, GDPR admin override |
| Array-wrap POST, cube metadata walk, ad-hoc vs cached execute, dual freshness check |
| symbolic workflowId vs numeric workflowDBId, graph load, step + edge batching, verb taxonomy |
| Input/output connector split, 4-or-5 step wizard, the |
| 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=createwith credentials in headers, caches the token in memory, serializes concurrent refreshes behind anasyncio.Lock, and refreshes ~60s before expiry. Any401from a downstream call triggers a one-shot forced refresh + retry.Static token: set
CDP_AUTH_TOKENand 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
Fork, branch, hack.
Run
./gradlew-equivalent— fine, justpip install -e .and the smoke test above.If you add a tool, wire it into the matching
tools/<area>/__init__.pyregistrar.If you add a multi-step flow, write a playbook for it under
src/cdp_mcp/docs/and register the resource inresources/resource_providers.py.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 toolscdp_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.
bodyis 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_connector_linksC
Fetch all connector links (GET /provisions/links).
Inputs: tenant_id. Returns: result
cdp_list_connector_links_by_classC
Fetch connector links filtered by connector class (GET /provisions/links/connector-class?connectorClass=...).
Inputs: connector_class (required), 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
Scored across 293 tools
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.
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.
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).
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
Related MCP Connectors
Unified MCP Server is a remote MCP connector for AI agents and vertical AI products that provides access to 22,000+ authorized SaaS tools across 400+ integrations and 24 categories directly inside LLMs (Claude, GPT, Gemini, Cohere). Tools operate only on explicitly authorized customer connections, enabling agents to safely read and write against live third-party systems.
335 MCP tools, 75 playbooks. AI-native CRM, email/SMS, events, OAuth.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceThe 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 npmApache 2.0
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides AI agents with direct read/write access to Sitecore CMS through 100+ tools across Item Service, GraphQL, and PowerShell APIs.153 npmApache 2.0
- FlicenseNot gradedqualityDmaintenanceA single MCP server that exposes safe, permission-checked tools for AI assistants to reach file systems, databases, APIs, Git, cloud services, and business applications.-
- AlicenseCqualityBmaintenanceA 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.500115 npm1MIT