
List activation targets (destinations segments are published to) with limit/offset paging. Returns each target's ID and platform type; pass the ID to getactivationtarget, updateactivationtarget, or create_activation.
Get one activation target's configuration by ID. Use listactivationtargets to find target IDs.
Create an activation target. External targets must reference an existing connection: use listconnections to find its ID. Returns the new target's ID for createactivation. The API defines no delete for activation targets (DELETE returns 405), so create them sparingly.
Update an activation target by ID (PATCH; only given keys change). Changes can affect downstream delivery. Use listactivationtargets to find the target ID; updating by name can fail.
List activations (segment-to-target publications) with limit/offset paging, optionally in one data space. Returns each activation's ID, segment, and target; pass the ID to getactivation, updateactivation, or delete_activation.
Get one activation's full definition by ID. Use list_activations to find activation IDs.
Create an activation that publishes a published segment's members to an activation target, by name (segmentApiName, activationTargetName). One activation per segment and target. Use listsegments and listactivationtargets. It starts PROCESSING. Remove it with deleteactivation.
Replace an activation's definition (PUT: full replace, so omitted fields are cleared). Call getactivation first and send the complete body. Refused while the activation is PROCESSING; wait for ACTIVE. Use listactivations to find the activation ID.
Permanently delete an activation so the segment stops publishing to its target. The segment and target are kept. Use list_activations to find the activation ID.
List calculated insights (CIs) with limit/offset paging, optionally in one data space. Returns each CI's apiName and calculatedInsightStatus; segments need ACTIVE CIs. Pass apiName to getcalculatedinsight. To read a CI's computed rows, use querycalculatedinsight.
Get one calculated insight's definition: SQL expression, status, schedule, and derived dimensions and measures. Use listcalculatedinsights to find the cio API name. For run status use getcalculatedinsightstatus; for result rows use querycalculated_insight.
Create a calculated insight from ANSI SQL over DMOs. apiname must end with cio, and COUNT(DISTINCT) is not supported. Call validatecalculatedinsight first, and use listdatamodelobjects for DMO and field names. Returns the CI in PROCESSING status. Remove it with deletecalculatedinsight.
Check a calculated insight's SQL expression without saving it. Call this before createcalculatedinsight or updatecalculatedinsight to catch SQL errors. COUNT(DISTINCT) is not supported. Some orgs return APIDISABLEDFOR_ORG; then validate by creating the CI instead.
Update a calculated insight's display name, description, SQL expression, or schedule (PATCH; only given fields change). Changing the expression triggers recompilation; run validatecalculatedinsight first. Use listcalculatedinsights to find the cio API name.
Permanently delete a calculated insight. Segments and activations that use it will break, so check listsegments first. Use listcalculatedinsights to find the _cio API name. A follow-up get may briefly show status DELETING.
Enable a calculated insight so it refreshes and can be used by segments and activations. Inverse of disablecalculatedinsight. Use listcalculatedinsights to find the cio API name.
Disable a calculated insight so it stops refreshing; dependent segments and activations may be affected. Inverse of enablecalculatedinsight. Use listcalculatedinsights to find the cio API name.
Start a calculation run of a calculated insight now, consuming compute and updating downstream results. Check progress with getcalculatedinsightstatus. Use listcalculatedinsights to find the _cio API name. The API defines no inverse; a started run cannot be cancelled.
Get the current run status of a calculated insight (POST refresh-status; changes nothing). Use after runcalculatedinsight to see whether the run finished. Use listcalculatedinsights to find the cio API name.
List the connector types in the org's Data 360 catalog (e.g. SalesforceDotCom, SNOWFLAKE). Call this first to get the connectortype that listconnections and getconnection require, or a name for getconnector.
Get one connector type's metadata, including the parameter and credential names its connections use. Use list_connectors to find connector names.
List configured connections of one connector type (required; use listconnectors), filterable by devname, label, organizationid and data space, with offset pagination. Connections are created and edited in Data 360 Setup; this connector only reads them. Returns IDs for getconnection.
Get one connection by ID. Requires its connectortype. Use listconnections to find connection IDs and list_connectors for connector types.
List database schemas available through a database connection (e.g. Snowflake), scoped by advancedattributes such as the database. Read-only. Use listconnections to find the connection ID, then listconnectionobjects to list tables in a schema.
List source objects (tables) available through a connection. Read-only. For database connectors scope with advancedattributes {database, schema} to avoid huge results. Use listconnections for the connection ID; pass an object name to getconnectionobject_fields.
Describe the fields (columns, types, keys) of one source object in a connection. Read-only. Use listconnections for the connection ID and listconnection_objects for the object name.
List data action targets (event destinations such as webhooks) with offset pagination. Returns each target's apiname: pass it to get/update/deletedataactiontarget and in createdataaction dataactiontarget_names (targets carry no id). These are not segment activation targets.
Get one data action target by ID, including its type, status and config. Use listdataaction_targets to find target IDs.
Create a data action target, the destination (e.g. a WebHook endpoint) that data actions send events to. Returns status PROCESSING, then ACTIVE. Use listdataspaces for the data space. Undo with deletedataaction_target.
Update a data action target's label and/or config. Only the fields you pass change: the tool reads the target and sends its full definition, as the API requires. Changing the endpoint affects every data action using it. Use listdataaction_targets to find the target API name.
Permanently delete a data action target. First call deletedataaction for every action using it. Confirm removal with listdataaction_targets (a follow-up GET may error instead of returning not found).
List data actions (event-triggered rules that send DMO changes to data action targets) with offset pagination. Returns each action's developerName for getdataaction.
Get one data action by developer name, including its sources, conditions and targets. Use listdataactions to find developer names.
Create a data action that sends events when source DMO records change. It must reference an existing target: use listdataactiontargets (or createdataactiontarget) for target API names, listdatamodelobjects for sources, listdataspaces for the data space. Undo with deletedata_action.
Permanently and irreversibly delete a data action by developer name. Delete a data action before the data action target it uses (deletedataactiontarget). Use listdata_actions to find developer names.
List data model objects (DMOs, API names ending dlm) with offset paging, filtered by category and data space and sortable by orderby. Items omit field lists unless includefields is true; use getdatamodelobject for one DMO's schema. Use listdata_spaces for dataspace names.
Get one DMO's full schema (fields, category, data space) by its dlm API name. Use listdatamodelobjects to find names. Use this before createdmo_mapping to get exact target field names.
Create a custom DMO. Pass name WITHOUT the dlm suffix (the platform appends it; the result's name ends dlm). Needs label, category and fields with at least one primary key; ENGAGEMENT needs eventdatetimefieldname. Use listdataspaces for dataspace. Inverse: deletedatamodel_object.
Update a DMO (PATCH, partial): label, description, or ADD fields (additive; fields cannot be removed this way). Changes can affect mappings, calculated insights and segments. Use listdatamodelobjects to find the _dlm name.
Permanently delete a DMO. Cascades to dependent objects, including its DMO mappings. Use listdatamodelobjects to find the _dlm name; check segments and calculated insights that use it first.
List data lake objects (DLOs, API names ending dll) with offset paging, filtered by category and data space. Items omit field lists unless includefields is true; use getdatalakeobject for one DLO's fields. Use listdataspaces for dataspace names.
Get one DLO's fields and metadata by its dll API name. Use listdatalakeobjects to find names. Use this before createdmo_mapping to get exact source field names.
Create a DLO directly (data streams usually create their DLO automatically; prefer createdatastream). Needs name (usually ending dll), label, category and fields; field names cannot start with 'KQ'. Use listdataspaces for dataspace. Inverse: deletedatalakeobject.
Add fields to a DLO (PATCH). The API does not support relabeling a DLO. Schema changes can affect data streams, mappings and search indexes. Use listdatalakeobjects to find the _dll name.
Permanently delete a DLO and its stored data. Use listdatalakeobjects to find the dll name. To remove a stream together with its DLO use deletedatastream with shoulddeletedatalake_object=true.
List the org's data spaces with limit/offset paging. Each item's name (e.g. 'default') is the value every other tool's dataspace parameter takes, so call this first when a task targets a non-default data space.
Get one data space's details by API name. Use listdataspaces to find names.
Create a data space (an isolated admin workspace) from a label; the platform derives its API name, returned as name (the dataspace value for other tools). Orgs cap data spaces (developer orgs: 1). Then use adddataspacemembers. Inverse: deletedata_space.
Update a data space's label or description (PATCH; only given fields change). Use listdataspaces to find the name. At least one of label or description is required.
List the data objects that belong to a data space, with their row filters. Use listdataspaces to find the data space name. Member names feed removedataspace_members.
Add data objects (DLO/DMO API names from listdatalakeobjects or listdatamodelobjects) to a data space, optionally with row filters. Additive: existing members are kept. Inverse: removedataspace_members.
Remove up to 10 members from a data space by name. Use listdataspacemembers to find member names. The objects themselves are not deleted. Inverse: adddataspacemembers.
Permanently delete a data space and its contents; this cannot be undone. Remove its members first (listdataspacemembers, then removedataspacemembers) and move or delete objects that other data spaces need. Use listdataspaces to find the name; never delete 'default'.
List data streams (ingestion pipelines into DLOs) with offset paging, filtered by category and data space. Each item's name feeds get/update/delete/rundatastream. Use listdataspaces for dataspace names.
Get a data stream's full configuration (connector, DLO, refresh settings) by name. Use listdatastreams to find names.
Create a data stream and its DLO. Sources: Salesforce CRM (datastreamtype SFDC, connectorType SalesforceDotCom), AWS S3, Snowflake, third-party (connectorType DataConnector), other connectors. Use listconnections for the connection name. Then createdmomapping. Inverse: deletedatastream.
Update a data stream (PATCH; only given fields are sent): label, refreshconfig, or other keys. Changes apply to future runs. Use listdatastreams to find the name; do not resend read-only fields from getdata_stream.
Delete a data stream. shoulddeletedatalakeobject chooses whether its DLO and data are deleted too. Use listdatastreams to find the name. Deletion is eventually consistent; a GET right after may still return it.
Manually trigger ingestion for a data stream. Works for S3, Snowflake, file upload and other non-CRM streams; Salesforce CRM streams cannot be run via the API. Use listdatastreams to find the name. The API defines no inverse (a started run cannot be cancelled).
List data transforms (batch or streaming DLO-to-DLO transforms) with offset pagination. Definitions are omitted to keep results small; use getdatatransform for one transform's full definition.
Get one data transform by ID or API name, including its full definition and status. Use listdatatransforms to find transforms.
Validate (and enrich) a data transform definition without creating it; reports issues such as TARGETDLONOTFOUND. Call this before createdatatransform or updatedatatransform. Use listdatalakeobjects to find source and target DLO names.
Create a data transform from a definition (STL graph or SQL) that writes to a target DLO. Validate first with validatedatatransform; target DLOs must exist (listdatalakeobjects). Use listdataspaces for the data space. Undo with deletedata_transform.
Replace a data transform (PUT: a full replace, so send the complete name, label, type and definition; omitted optional fields are cleared). Validate first with validatedatatransform. Use getdatatransform to read the current definition.
Permanently delete a data transform. Its output DLO is not deleted. Use listdatatransforms to find the transform ID.
Run a batch data transform now, rewriting its output DLO; consumes org resources. Use listdatatransforms to find the transform ID. The API defines no inverse; a started run cannot be cancelled here.
Get a data transform's run schedule (frequency, interval, time). Use listdatatransforms to find the transform ID; change it with setdatatransform_schedule.
Set (replace) a data transform's run schedule, e.g. frequency 'Daily', interval 1, 03:00 in a time zone. Pass frequency 'None' to clear it. Do not copy the time block from getdatatransformschedule back as-is. Use listdata_transforms to find the transform ID.
List identity resolution rulesets with limit/offset paging, optionally in one data space. Returns each ruleset's ID, label, and profile type; pass the ID to get, update, publish, run, or delete it.
Get one identity resolution ruleset with its match rules (priority order) and reconciliation rules. Use listidentityresolutions to find the ruleset ID.
Create an identity resolution ruleset that merges source profiles into unified profiles. Match rules run in priority order. The DMOs used must already be mapped; use listdatamodelobjects for DMO and field names. Apply it with publishidentityresolution; remove with deleteidentity_resolution.
Update an identity resolution ruleset (PATCH; only given fields change, but matchrules and reconciliationrules replace their whole lists). Changes apply to unified profiles only after publishidentityresolution. Use listidentityresolutions to find the ruleset ID.
Permanently delete an identity resolution ruleset; unified profiles it produced may be affected. Use listidentityresolutions to find the ruleset ID.
Retry publishing an identity resolution ruleset whose status is Error (rulesets publish automatically on create/update; the API refuses a retry in any other status). Check status with getidentityresolution. The API defines no inverse (unpublish).
Run an identity resolution ruleset now, consuming compute and updating unified profiles. Use listidentityresolutions to find the ruleset ID. The API defines no inverse; a started run cannot be cancelled.
List DLO-to-DMO object mappings. Requires at least one filter (an unfiltered list can fail): dmodevelopername (from listdatamodelobjects), dlodevelopername or sourceobjectname (from listdatalakeobjects). Each item's developer_name feeds get/delete and field-mapping tools.
Get one object mapping's configuration, including its field mappings and their developer names (for deletefieldmapping). Use listdmomappings to find the mapping name.
Map a DLO to a DMO with field pairs. Call getdatalakeobject and getdatamodelobject first for exact field API names. Returns the mapping; capture developername (auto-generated). The platform adds system field mappings. Inverse: deletedmo_mapping.
Add field pairs to an existing object mapping (PATCH). Call getdmomapping first and add only verified field names. If the new pairs are missing from the response, recreate the mapping with the full set. Inverse: deletefieldmapping.
Delete an object mapping. Use listdmomappings to find the name. Fails when the DMO is mapped to only one DLO (orphan protection); in that case deletedatamodel_object removes the mapping with the DMO.
Delete one field mapping from an object mapping. Use getdmomapping to find the field mapping's developer name. Do not delete platform system field mappings (DataSourcec, KQ_*).
Natural-language search over Data 360 metadata (DMOs, DLOs, calculated insights), optionally filtered by metadatatypes. Use for discovery when you don't know entity names. A backend index error (e.g. PRISMRUNTIMEERROR msrmetadataindexdlm) means search isn't indexed yet; fall back to listmetadataentities or getmetadata.
Describe one DMO, DLO, or calculated insight by API name: fields, primary keys, relationships. Use before querysql to verify field names. Use listmetadataentities or searchmetadata to find entity names, and listdataspaces for dataspace.
List metadata entities, optionally of one type (DataModelObject, DataLakeObject, CalculatedInsight), in one response. Returns lean name/label/category entries; pass a name to getmetadata for fields. Use searchmetadata instead for natural-language discovery.
List profile-enabled DMOs (e.g. ssotIndividualdlm) with their fields and relationships. Call this first to find the datamodelname, fields, and filter fields for query_profile.
Read records from a profile DMO (Individual, Account, or custom) with bracketed filters, a field projection, and limit/offset (orderby required when offset > 0). Use getprofilemetadata to find the datamodelname and field names. Use query_sql for joins or aggregates.
List the org's data graphs and their schema. Call this first to find the datagraphname for lookupdatagraph and getdatagraph_record.
Look up data graph records by natural key (lookupkeys), bounded by limit; set live=true for a real-time graph. Use getdatagraphmetadata to find datagraphname. Use getdatagraph_record instead when you already have the root record ID.
Get one data graph record by its root record ID, with related records (limit/offset); set live=true for real time. Use getdatagraphmetadata to find datagraphname, and lookupdatagraph or querysql to find record IDs.
List calculated insights with their dimensions and measures. Call this first to find the ciname for querycalculated_insight and which dimensions/measures its rows contain.
Read rows (dimensions and measures) of an existing calculated insight with limit/offset pagination. Use getinsightmetadata to find ciname (ends in cio). Use querysql for custom aggregates.
Run a Data 360 SQL SELECT query (not SOQL) and return up to rowlimit rows inline. For SELECT queries only. If done is false or hasmorerows is true, poll getquerystatus and page with getqueryrows using queryid. Verify table/field names with getmetadata or listmetadataentities; use listdata_spaces for dataspace.
Get the status of a query started by querysql: completionstatus, rowcount, and chunkcount. Poll until completionstatus is 'ResultsProduced', then read rows with getqueryrows. Use the queryid returned by query_sql.
Fetch a page of result rows (limit up to 1000, offset) from a query started by querysql. Use when querysql reported hasmorerows; check getquerystatus first for long-running queries. Use the queryid returned by querysql.
Cancel a running query started by querysql; its results are discarded. Use the queryid returned by querysql. The API defines no inverse: re-run querysql to start the query again.
List segments with limit/offset paging, optionally in one data space. Returns each segment's ID, developer name, and segmentStatus. Pass the ID to getsegment, updatesegment, or publishsegment, and the developer name to deletesegment or deactivate_segment.
Get one segment by record ID or API name, including its type, DMO, schedule, and segmentStatus (check for ACTIVE before publishing or activating). Use list_segments to find segment IDs and API names.
Create a segment on a segmentable DMO. Any calculated insights it uses must be ACTIVE: check with listcalculatedinsights and getinsightmetadata. Use listdatamodelobjects for the DMO name. Returns the segment in PROCESSING status; publish with publishsegment, remove with delete_segment.
Update a segment's display name, description, or publish schedule (PATCH). Pass the current segmenttype from getsegment; for Dbt segments the tool resends the current definition, as the API requires. Cannot change SQL. Use list_segments to find the segment.
Permanently delete a segment by its API (developer) name, not its record ID. Irreversible; activations using it stop. Use listsegments to find the developer name. To stop a segment without deleting it, use deactivatesegment.
Publish a segment, starting an asynchronous membership calculation. Wait for getsegment to show the segment is no longer PROCESSING first. Use listsegments to find the segment ID. Inverse: deactivate_segment.
Deactivate a segment by its API (developer) name, not its record ID, so it stops publishing. Inverse of publishsegment. Use listsegments to find the developer name. Fails while the segment is still PROCESSING.
Validate Salesforce Data 360 credentials by listing the org's data spaces. Returns success and a message. Use this to confirm the instance domain and app credentials are correct and that Data 360 is provisioned on the org.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now