Skip to main content
Glama
scottehastings16

Adobe Target MCP

Adobe Target MCP

An (Unofficial) Model Context Protocol Agent Framework for Adobe Target, enabling your favorite MCP Clients to create and manage Adobe Target activities, HTML & JSON offers, audiences, response tokens and activity reporting all through natrual language

MCP Standard Compliance: This project follows the open Model Context Protocol standard and works with any MCP-compatible client (Claude Desktop, Cursor, or other MCP clients). Configuration examples below use Claude Desktop/Code, but the same mcpServers format applies to all MCP clients.

Adobe Target API Documentation: https://developer.adobe.com/target/administer/admin-api/


Table of Contents


Core Capabilities

  • Adobe Target Admin API Integration: Complete suite of 33 tools for managing A/B tests, Experience Targeting, offer creation (HTML/JSON), audiences, mboxes, properties, activity performance reports and response tokens

  • Activity Reporting: Query results for live and past activities

  • Response Token Managment: Create new resposne tokens and take inventory of existing ones

  • Intelligent Offer Creation: Generate HTML offers, or JSON offers for headless/SPA implementations with structured data templates

  • Audience Managment and Creation: List exisiting audiences in your AT property, or create new ones with natrual language

  • DataLayer Event Generation: Automated conversion in HTML offers tracking for GTM, Adobe Launch, Tealium, Segment


Related MCP server: AEM MCP Server

Quick Start

Prerequisites

Before installing, ensure you have:

  • Node.js 20+ - Required for ES modules support (Download)

  • Chrome Browser - Required for the agent to see your webpage, analyze DOM elements, and preview changes live

  • Adobe Target Account - With Admin API access

  • MCP Client - Claude Desktop, Claude Code, Cursor, Windsurf or any MCP-compatible client

1. Clone the Repository

git clone https://github.com/scottehastings16/adobe-target-mcp.git
cd adobe-target-mcp

2. Install Dependencies

npm install

Dependencies installed:

  • @modelcontextprotocol/sdk@^1.0.4 - MCP protocol implementation

  • dotenv@^17.2.3 - Environment variable management

3. Install Required MCP Servers

This agent requires two MCP servers working together:

a) Adobe Target MCP Agent (this project)

  • Already installed with npm install

b) Chrome DevTools MCP Server (REQUIRED)

  • Provides live browser DOM access and page analysis

  • Automatically installed via npx when adobe-target-mcp is configured

  • Requires Chrome or Chromium browser

4. Configure Environment

Copy .env.example to .env and configure:

# Required - Adobe Target API credentials
TARGET_TENANT_ID=your-tenant-id
TARGET_API_KEY=your-api-key
TARGET_ACCESS_TOKEN=your-access-token
TARGET_WORKSPACE_ID=your-workspace-id

# Optional - Default values for activities
TARGET_DEFAULT_MBOXES=target-global-mbox
TARGET_DEFAULT_PRIORITY=5

# Optional - Success metrics defaults
TARGET_DEFAULT_METRIC_TYPE=engagement
TARGET_DEFAULT_ENGAGEMENT_METRIC=page_count

5. Configure MCP Client

Copy .claude.json.example to your MCP client's configuration file and update the paths and credentials.

For Claude Desktop/Code:

Windows: %APPDATA%\Claude\claude_desktop_config.json Mac: ~/Library/Application Support/Claude/claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json

For other MCP clients: Refer to your client's documentation for the MCP server configuration file location.

{
  "mcpServers": {
    "adobe-target": {
      "command": "node",
      "args": ["C:\\Users\\YourUsername\\adobe-target-mcp\\src\\index.js"],
      "env": {}
    },
    "chrome-devtools": {
      "command": "npx",
      "args": ["-y", "chrome-devtools-mcp"],
      "env": {
        "CHROME_PATH": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
      }
    }
  }
}

Platform-specific Chrome paths:

  • Windows: "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"

  • Mac: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"

  • Linux: "/usr/bin/google-chrome" or "/usr/bin/chromium"

Platform-specific path formats:

  • Windows: Use backslashes with escaping: "C:\\Users\\YourUsername\\adobe-target-mcp\\..."

  • Mac/Linux: Use forward slashes: "/Users/yourname/adobe-target-mcp/..."

6. Start Using

Once configured, you can ask your AI assistant to:

  • "Show me the results from the Paid Media Personalization activity"

  • "Create a carousel under the hero image on my website www.example.com"

  • "Show me what response tokens are avilable in my targt propert"

  • "Generate a popup module for my page www.example.com, add a CTA and this image: example.com/image.png... add a CTA that links to the products page at this link example.com/products"

  • "Create a JSON offer for feature flags"

  • "List all active Target activities"

  • "List avilable mboxes in my property"

  • "Generate a conversion report for the Buy Now CTA Test"

  • "Help me create a new response token"

  • Update the "Buy Now" Offer with a new stlying using by configured brand colors

The agent will use its 33 tools to interact with Adobe Target on your behalf.


External MCP Servers

  1. chrome-devtools-mcp (auto-installed via npx)

    • Purpose: Live browser control, DOM analysis, screenshots

    • Installation: Automatic on first run via npx -y chrome-devtools-mcp

    • Requirements: Chrome/Chromium browser

System Requirements

  • Node.js: 20+ (ES modules support required)

  • Adobe Target: Account with Admin API access

  • Chrome Browser: Required for Chrome DevTools MCP integration

  • MCP Client: Claude Desktop, Claude Code, or any MCP-compatible client


Project Structure

adobe-target-mcp/
├── src/
│   ├── index.js                        # Main MCP server entry point
│   ├── .env.example                    # Environment variable template
│   │
│   ├── config/
│   │   ├── tag-managers.json           # Tag manager configurations (GTM, Adobe Launch, Tealium, Segment)
│   │   └── firing-conditions.json      # Event firing logic (session, throttle, debounce, etc.)
│   │
│   ├── helpers/
│   │   ├── makeTargetRequest.js        # Adobe Target API client wrapper
│   │   └── applyDefaults.js            # Auto-fill default configuration values
│   │
│   ├── templates/
│   │   ├── README.md                   # Template system documentation
│   │   ├── html/                       # HTML offer templates (10 templates)
│   │   │   ├── carousel.json
│   │   │   ├── hero-banner.json
│   │   │   ├── cta-button.json
│   │   │   ├── modal.json
│   │   │   ├── sticky-header.json
│   │   │   ├── countdown-timer.json
│   │   │   ├── form-field.json
│   │   │   ├── tabs.json
│   │   │   ├── accordion.json
│   │   │   └── notification-banner.json
│   │   └── json/                       # JSON offer templates (9 templates)
│   │       ├── product-recommendations.json
│   │       ├── feature-flags.json
│   │       ├── hero-config.json
│   │       ├── pricing-data.json
│   │       ├── personalization-content.json
│   │       ├── navigation-menu.json
│   │       ├── form-config.json
│   │       ├── testimonials.json
│   │       └── ab-test-variant.json
│   │
│   └── tools/
│       ├── index.js                    # Tool registration
│       ├── activities/                 # Activity management (5 tools)
│       │   ├── listActivities.js
│       │   ├── createABActivity.js
│       │   ├── getABActivity.js
│       │   ├── updateABActivity.js
│       │   └── updateActivityState.js
│       ├── offers/                     # Offer management (5 tools)
│       │   ├── listOffers.js
│       │   ├── createOffer.js          # PRIMARY TOOL - HTML offers
│       │   ├── createJsonOffer.js      # JSON offers (SPAs, server-side, mobile)
│       │   ├── getOffer.js
│       │   └── updateOffer.js
│       ├── audiences/                  # Audience management (2 tools)
│       │   ├── listAudiences.js
│       │   └── createAudience.js
│       ├── mboxes/                     # Mbox resources (3 tools)
│       │   ├── listMboxes.js
│       │   ├── getMbox.js
│       │   └── listMboxProfileAttributes.js
│       ├── properties/                 # Properties (1 tool)
│       │   └── listProperties.js
│       ├── reports/                    # Reporting (6 tools)
│       │   ├── getABPerformanceReport.js
│       │   ├── getABOrdersReport.js
│       │   ├── getXTPerformanceReport.js
│       │   ├── getXTOrdersReport.js
│       │   ├── getAPTPerformanceReport.js
│       │   └── getActivityInsights.js
│       ├── response-tokens/            # Response tokens (2 tools)
│       │   ├── listResponseTokens.js
│       │   └── createResponseToken.js
│       ├── atjs/                       # at.js settings (2 tools)
│       │   ├── getAtjsSettings.js
│       │   └── getAtjsVersions.js
│       ├── revisions/                  # Activity revisions (2 tools)
│       │   ├── getRevisions.js
│       │   └── getEntityRevisions.js
│       ├── templates/                  # Template management (1 tool)
│       │   └── listTemplates.js        # Browse available templates
│       └── custom/                     # DataLayer & preview tools (4 tools)
│           ├── generateDataLayerEvent.js
│           ├── createActivityFromModifications.js
│           ├── generatePreviewScript.js
│           └── getMockupAnalysisInstructions.js
│
├── package.json                        # Node.js dependencies
├── .env                                # Environment variables (create from .env.example)
└── README.md                           # This file


Available Tools

Activities (5 tools)

  • listActivities - List all Target activities with filtering

  • createABActivity - Create A/B test (API-only, advanced use)

  • getABActivity - Get activity details by ID

  • updateABActivity - Update activity configuration

  • updateActivityState - Activate, pause, or deactivate activities

Offers (5 tools)

  • listOffers - List all offers with filtering

  • createOffer - PRIMARY TOOL - Create HTML offer (use for 95% of cases)

  • createJsonOffer - Create JSON offer for SPAs, server-side, mobile apps, headless

  • getOffer - Get offer details by ID

  • updateOffer - Update offer content

Audiences (2 tools)

  • listAudiences - List all audiences

  • createAudience - Create new audience with rules

Mboxes (3 tools)

  • listMboxes - List all mboxes

  • getMbox - Get mbox details

  • listMboxProfileAttributes - List profile attributes for mbox

Properties (1 tool)

  • listProperties - List Target properties

Reports (6 tools)

  • getABPerformanceReport - A/B test performance metrics

  • getABOrdersReport - A/B test order/revenue data

  • getXTPerformanceReport - Experience Targeting performance

  • getXTOrdersReport - Experience Targeting orders

  • getAPTPerformanceReport - Automated Personalization performance

  • getActivityInsights - Activity insights and recommendations

Response Tokens (2 tools)

  • listResponseTokens - List all response tokens

  • createResponseToken - Create custom response token

at.js Configuration (2 tools)

  • getAtjsSettings - Get at.js settings

  • getAtjsVersions - List available at.js versions

Revisions (2 tools)

  • getRevisions - List all activity revisions

  • getEntityRevisions - Get revisions for specific entity

Templates (1 tool)

  • listTemplates - Browse all available HTML & JSON templates

Custom Tools (4 tools)

  • generateDataLayerEvent - Generate conversion tracking code with tag manager support

  • createActivityFromModifications - Create Target activity from JavaScript modifications (advanced use, API limitations apply)

  • generatePreviewScript - Generate preview script for Chrome DevTools MCP injection

  • getMockupAnalysisInstructions - Get instructions for mockup analysis and experience generation workflow


License

MIT License - See LICENSE file



Available Tools

32 tools
createABActivityA

CRITICAL WARNING: DO NOT USE THIS TOOL FOR NORMAL WORKFLOWS

Activities created via this API are PERMANENTLY LOCKED - they CANNOT be edited in Adobe Target UI.

DEFAULT WORKFLOW (USE THIS 99% OF THE TIME):

  1. Create offers using createOffer tool (HTML) or createJsonOffer tool (JSON)

  2. Provide user with offer IDs

  3. User manually builds A/B activity in Target UI with full editing flexibility

DO NOT USE THIS TOOL UNLESS:

  1. User is creating 10+ activities in bulk (programmatic bulk creation)

  2. This is part of an automated CI/CD workflow

  3. User has been EXPLICITLY WARNED that activities cannot be edited in Target UI

  4. User has confirmed they understand the limitation and still want to proceed

MANDATORY STEPS BEFORE USING THIS TOOL: You MUST complete ALL of these steps before calling this tool:

  1. Ask user: "Are you creating 10+ activities in bulk?"

    • If NO: Stop. Tell user to use createOffer workflow instead

    • If YES: Continue to step 2

  2. Warn user: "Activities created via API will be permanently locked and cannot be edited in Adobe Target UI. You will not be able to modify them later through the Target interface. Do you understand and want to proceed?"

    • If NO: Stop. Use createOffer workflow instead

    • If YES: Continue to step 3

  3. Confirm: "To confirm: You understand the activity will be locked in Target UI and you still want to create it programmatically?"

    • If NO: Stop. Use createOffer workflow

    • If YES: Proceed with this tool

If user does NOT confirm all three steps, DO NOT use this tool. Use createOffer instead.

RECOMMENDED ALTERNATIVE (99% of use cases): Use createOffer to create offers, then tell user: "I've created the offers. Here are the offer IDs: [list IDs] To create your A/B activity:

  1. Go to Adobe Target → Activities → Create Activity → A/B Test

  2. Choose Form-Based Experience Composer

  3. Add experiences and select these offer IDs

  4. Configure traffic split and metrics This gives you full editing flexibility in the Target UI."

AUTO-FILLED DEFAULTS:

  • priority: 5

  • workspace: TARGET_WORKSPACE_ID

  • locations.mboxes: target-global-mbox

  • metrics: Page views goal (engagement: "page_count")

  • analytics (A4T): Auto-configured if set in .env

ACTIVITY MUST INCLUDE:

  • name (string)

  • state: "saved" (always use saved, activate later with updateActivityState)

  • options: Array with offerIds from createOffer

  • experiences: Traffic split configuration

  • locations: Where activity runs (auto-filled if not provided)

  • metrics: Success goal (auto-filled page views if not provided)

REFERENCE - Complete Payload Structure: { "id": 0, // int64: Activity ID (optional for create, auto-generated) "thirdPartyId": "string", // string: Optional external ID reference "name": "string", // string: REQUIRED - Activity name "state": "saved", // string: REQUIRED - "approved" | "saved" | "deactivated" | "deleted" // ALWAYS use "saved" for new activities "priority": 5, // int32: REQUIRED - Default: 5, Range: 0-999 "startsAt": "2024-01-01T00:00:00Z", // string (ISO-8601): Required if state is "approved" "endsAt": "2024-12-31T23:59:59Z", // string (ISO-8601): Required if state is "approved" "modifiedAt": "2024-01-01T00:00:00Z", // string (ISO-8601): Auto-generated timestamp

// LOCATIONS - Define where activity runs "locations": { "mboxes": [ // array: For server-side/mbox-based activities { "locationLocalId": 0, // int32: Unique ID for this location "name": "target-global-mbox", // string: Mbox name "audienceIds": [] // array: Optional audience targeting for location } ], "selectors": [ // array: For SPA/VEC activities with CSS selectors { "locationLocalId": 0, // int32: Unique ID for this location "name": "Hero Selector", // string: Display name "selector": "#hero-section", // string: CSS selector "audienceIds": [], // array: Optional audience targeting "selectorVersion": 1, // int32: Selector version "viewLocalId": 0 // int32: Reference to view (for SPA) } ] },

// OPTIONS - Define what content variations to show "options": [ { "optionLocalId": 0, // int32: Unique ID for this option "name": "Option A", // string: Option display name "offerId": 123456, // int64: ID from createOffer or existing offer "offerTemplates": [ // array: Optional - For dynamic offer templates { "offerTemplateId": 0, // int64: Template ID "templateParameters": [ // array: Template parameters { "name": "paramName", // string: Parameter name "value": "paramValue" // string: Parameter value } ] } ] } ],

// EXPERIENCES - Map options to locations with traffic allocation "experiences": [ { "experienceLocalId": 0, // int32: Unique ID for this experience "name": "Experience A (Control)", // string: Experience display name "audienceIds": [], // array: Optional audience targeting "visitorPercentage": 50, // int32: Traffic allocation (must total 100%) "optionLocations": [ // array: Map options to locations { "locationLocalId": 0, // int32: Reference to location "optionLocalId": 0 // int32: Reference to option } ] }, { "experienceLocalId": 1, "name": "Experience B", "audienceIds": [], "visitorPercentage": 50, "optionLocations": [ { "locationLocalId": 0, "optionLocalId": 1 } ] } ],

// METRICS - Define success metrics (conversions, engagement) "metrics": [ { "metricLocalId": 0, // int32: Unique ID for this metric "name": "Primary Goal", // string: Metric display name "conversion": true, // boolean: true for conversion metric "engagement": "page_count", // string: "page_count" | "score" | "time_on_site" | "none"

  // Action configuration (how to count metric)
  "action": {
    "type": "count_once",          // string: How to count this metric
    // Valid types:
    // "count_once" - Count only once per visitor
    // "count_landings" - Count each landing
    // "always_convert" - Always count as conversion
    // "restart_same_experience" - Restart in same experience
    // "restart_random_experience" - Restart in random experience
    // "restart_new_experience" - Restart in new experience
    // "exclude_to_same_experience" - Exclude but keep in same experience
    // "ban_from_campaign" - Permanently exclude from activity

    "conditions": {                // object: When to count
      "maxVisitCount": 0,          // int32: Max visits before counting (0 = unlimited)
      "maxImpressionCount": 0,     // int32: Max impressions before counting
      "experiences": [             // Per-experience conditions
        {
          "experienceLocalId": 0,  // int32: Reference to experience
          "maxVisitCount": 0,      // int32: Max visits for this experience
          "maxImpressionCount": 0  // int32: Max impressions for this experience
        }
      ]
    },
    "onConditionsMetAction": "count_once"  // string: Same values as "type"
  },

  // Mbox-based success tracking
  "mboxes": [
    {
      "name": "orderConfirmPage",   // string: Mbox name
      "successEvent": "mbox_shown", // string: "mbox_shown" | "mbox_clicked"
      "audienceIds": []              // array<int64>: Optional audience segmentation
    }
  ],

  // Click tracking (alternative to mbox tracking)
  "clickTrackSelectors": [
    {
      "selector": "#buy-button",   // string: CSS selector to track
      "audienceIds": [],           // array<int64>: Optional audience segmentation
      "selectorVersion": 1,        // int32: Selector version
      "viewLocalId": 0             // int32: Reference to view (for SPA)
    }
  ],

  // View-based tracking (for SPA)
  "views": [
    {
      "viewLocalId": 0,            // int32: Reference to view
      "audienceIds": []            // array<int64>: Optional audience segmentation
    }
  ],

  // Per-metric A4T configuration (overrides activity-level)
  "analytics": {
    "dataCollectionHost": "company.sc.omtrdc.net",
    "reportSuites": [
      {
        "companyName": "Company",
        "reportSuites": ["prod-rsid"]
      }
    ]
  }
}

],

// OPTIONAL: Entry constraints (limit who can enter) "entryConstraint": { "mboxes": [ // Require specific mboxes to fire { "name": "target-global-mbox", "audienceIds": [] // Optional audience constraints } ], "visitorPercentage": 100 // Limit % of visitors (default: 100) },

// OPTIONAL: Reporting audiences (segment reports) "reportingAudiences": [ { "reportingAudienceLocalId": 0, // int32: Unique ID for this reporting audience "audienceId": 789, // int64: Reference to audience "metricLocalId": 0 // int32: Reference to metric } ],

// OPTIONAL: Analytics for Target (A4T) integration "analytics": { "dataCollectionHost": "company.sc.omtrdc.net", // string: Analytics tracking server "reportSuites": [ // array: Report suite configuration { "companyName": "Company", // string: Analytics company name "reportSuites": ["prod-rsid"] // array: Report suite IDs } ] },

// OPTIONAL: For premium customers "workspace": "1234567", // string: Workspace ID (max 250 chars) "propertyIds": [123], // array: Unique property IDs

// OPTIONAL: For SPA/single-page applications "views": [ { "viewLocalId": 0, // int32: Local ID for this view "viewId": 1001, // int64: Global view ID "audienceIds": [] // array: Optional audience targeting } ],

// OPTIONAL: Application context (mobile, channel) "applicationContext": { "channel": "web", // string: "web" | "mobile" "applicationVersions": ["1.0"], // array: App version numbers "mobilePlatformVersions": ["iOS 16"], // array: OS versions "deviceType": "phone", // string: "phone" | "tablet" | "desktop" "screenOrientation": "portrait" // string: "portrait" | "landscape" } }

See full API documentation for complete field reference.

REMINDER: For normal use cases, create offers with createOffer tool instead of using this advanced API.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesActivity name
activityYesFull A/B Test activity definition object with locations, experiences, metrics, and optional fields

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does this well by warning that created activities are permanently locked, cannot be edited in Target UI, and require later activation via updateActivityState. It also documents auto-filled defaults and the required state value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and well-sectioned with warnings, mandatory steps, and a structured payload reference. However, it is very long and repeats the same core guidance—'do not use for normal workflows, use createOffer instead'—in the critical warning, conditions list, mandatory steps, recommended alternative, and final reminder.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no annotations and no output schema, the description is complete enough for safe invocation: it covers prerequisites, required user confirmations, default values, required fields, and the full nested payload structure. An agent can construct a valid request and understand the irreversible consequences.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the input schema has 100% description coverage, its descriptions are shallow: 'activity' is simply 'Full A/B Test activity definition object'. The tool description compensates with a complete annotated payload reference covering field types, defaults, enums, required vs optional fields, and relationships among locations, options, experiences, and metrics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description makes clear that this tool creates A/B Test activities programmatically and positions it against the normal createOffer workflow. It also defines the tool's unique niche: bulk or CI/CD-driven activity creation where the normal UI-based flow is not appropriate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about when to use this tool, when not to use it, and which alternative to prefer. It mandates specific user-confirmation steps before invocation and names createOffer as the default workflow, leaving essentially no ambiguity about tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createActivityFromModificationsA

CRITICAL WARNING: DO NOT USE THIS TOOL FOR NORMAL WORKFLOWS

Activities created via this API are PERMANENTLY LOCKED - they CANNOT be edited in Adobe Target UI.

DEFAULT WORKFLOW (USE THIS 99% OF THE TIME):

  1. Create offers using createOffer tool (HTML) or createJsonOffer tool (JSON)

  2. Provide user with offer IDs

  3. User manually builds XT activity in Target UI with full editing flexibility

DO NOT USE THIS TOOL UNLESS:

  1. User is creating 10+ activities in bulk (programmatic bulk creation)

  2. This is part of an automated CI/CD workflow

  3. User has been EXPLICITLY WARNED that activities cannot be edited in Target UI

  4. User has confirmed they understand the limitation and still want to proceed

MANDATORY STEPS BEFORE USING THIS TOOL: You MUST complete ALL of these steps before calling this tool:

  1. Ask user: "Are you creating 10+ activities in bulk?"

    • If NO: Stop. Tell user to use createOffer workflow instead

    • If YES: Continue to step 2

  2. Warn user: "Activities created via API will be permanently locked and cannot be edited in Adobe Target UI. You will not be able to modify them later through the Target interface. Do you understand and want to proceed?"

    • If NO: Stop. Use createOffer workflow instead

    • If YES: Continue to step 3

  3. Confirm: "To confirm: You understand the activity will be locked in Target UI and you still want to create it programmatically?"

    • If NO: Stop. Use createOffer workflow

    • If YES: Proceed with this tool

If user does NOT confirm all three steps, DO NOT use this tool. Use createOffer instead.

RECOMMENDED ALTERNATIVE (99% of use cases): Use createOffer to create offers, then tell user: "I've created the offers. Here are the offer IDs: [list IDs] To create your XT activity:

  1. Go to Adobe Target → Activities → Create Activity → Experience Targeting

  2. Choose Form-Based Experience Composer

  3. Add experiences and select these offer IDs

  4. Configure audience targeting This gives you full editing flexibility in the Target UI."

CRITICAL WORKFLOW REQUIREMENTS FOR LLM (IF YOU MUST USE THIS TOOL):

  1. BEFORE generating code, ask user: "Do you have any links or image assets that need to be used in this experience?"

    • If user provides links/images: Use the exact URLs provided

    • If user says "no" or doesn't provide assets: Use placeholder links (e.g., "https://example.com/image.jpg" or "#" for links)

    • Document any placeholders clearly so user knows what to replace

  2. Generate the modification code following ALL Adobe Target coding rules CRITICAL: NEVER include emojis in generated code, HTML, text, or comments

  3. PREVIEW THE CODE FIRST - Use Chrome DevTools MCP to inject and test:

    • Use Chrome DevTools MCP to navigate to the target URL

    • Inject the generated JavaScript code into the live page (with optional preview indicator for visual confirmation)

    • User will see changes live in their Chrome browser

    • Ask: "Does this look correct? Should I create the activity?"

    • If user wants changes, modify code and preview again

    • ONLY proceed to create activity after user approves the preview

    IMPORTANT: The preview indicator is ONLY for preview - do NOT include it in the modifications parameter when creating the activity

    RESPONSIVE TESTING - Test the experience across viewports:

    • ALWAYS test experiences on both mobile and desktop viewports before creating activity

    • Use Chrome DevTools MCP resize_page tool to test different viewport sizes

    • Standard viewport sizes to test:

      • Mobile: 375x667 (iPhone SE) or 390x844 (iPhone 14)

      • Desktop: 1920x1080 or 1440x900

    • After injecting code, resize to mobile viewport and ask user to check

    • Then resize to desktop viewport and ask user to check

    • Ensure the experience works correctly on both viewports before proceeding

    • If experience has responsive issues, modify the code to fix them

    Example responsive testing flow:

    1. Navigate to URL

    2. Inject modification code

    3. Resize to 375x667 (mobile)

    4. Ask: "Check mobile view in Chrome. Does it look correct?"

    5. Resize to 1920x1080 (desktop)

    6. Ask: "Check desktop view in Chrome. Does it look correct?"

    7. Only proceed if both viewports are approved

  4. After user approves preview, create the activity:

    • Show the user a summary of what will be created

    • List any placeholder assets that need to be replaced

    • Call this tool to create the activity

    • NOTE: Audience targeting will be handled by the user manually in Target UI

  5. NEVER create an activity without previewing it first

  6. NEVER create an activity based on assumptions - always confirm via preview

Example workflow: LLM: "Do you have any links or images for this experience?" User: "No" LLM: [Generates clean, responsive modification code with media queries] LLM: "Let me preview this for you..." LLM: [Uses Chrome DevTools MCP to navigate and inject code - adds preview indicator] LLM: [Resizes viewport to 375x667 mobile] LLM: "Check your Chrome browser (mobile view). The button is now green with text 'Get Started Now'. Does this look correct?" User: "Yes" LLM: [Resizes viewport to 1920x1080 desktop] LLM: "Now check desktop view. Does it look correct?" User: "Yes, looks good" LLM: [Calls this tool with the clean modification code - NO preview indicator]

ADOBE TARGET CODE GENERATION RULES: You MUST follow these rules when generating JavaScript code for the modifications parameter:

DOM & Element Handling:

  • Do NOT use DOM ready functions (no $(document).ready, DOMContentLoaded, etc.) unless explicitly asked

  • Use specific selectors - NEVER use broad selectors like 'div', 'span', 'button' alone. Always use classes, IDs, or attribute selectors

  • Modify existing elements - Change text/styles/attributes rather than replacing entire DOM structures

  • Use hide/show patterns - Toggle visibility rather than remove/add elements

  • Insert content through Target - Do not directly modify HTML structure with new divs

Code Quality & Compatibility:

  • ES5 ONLY - Adobe Target cannot accept ES6 features:

    • NO backticks or template literals (use string concatenation with +)

    • NO arrow functions (use function() {} syntax)

    • NO const/let (use var only)

    • NO destructuring, spread operators, or other ES6+ features

  • No external dependencies - Don't load jQuery, libraries, or external scripts

  • Vanilla JavaScript only - Keep it simple and cross-browser compatible

  • Defensive coding - Always check if element exists: if (element) { ... }

  • Avoid global variable pollution - Wrap code in IIFE: (function() { ... })()

  • Idempotent code - Script might run multiple times; ensure it handles that gracefully

Styling:

  • Inline styles for specificity - Use element.style.property = value to override existing styles

  • Inject CSS in tags - If adding CSS rules, inject a block in

  • !important sparingly - Only use when absolutely necessary for specificity

  • Prefix new classes with "at-" - ALL new classes you create must start with "at-" (e.g., "at-hero-banner", "at-cta-button"). This identifies Target-inserted elements.

  • Never style existing page classes - Do NOT write CSS rules targeting existing page classes (too broad, causes conflicts)

  • Target existing elements by ID - Use IDs or specific attribute selectors to target existing elements, NOT broad class names

  • Example: Use '#main-cta' or '[data-testid="hero-button"]', NOT '.button' or '.cta'

Responsive Design:

  • ALWAYS write responsive code that works on both mobile and desktop

  • Use media queries when adding CSS via tags: @media (max-width: 768px) { ... }

  • Test viewport-specific styles: Mobile (375px-768px), Desktop (1024px+)

  • Avoid fixed pixel widths - Use percentages or max-width instead

  • Consider mobile-first: Default styles for mobile, enhance for desktop

  • Hide/show elements per viewport if needed: display: none on mobile, display: block on desktop

  • Font sizes should scale appropriately: Smaller on mobile, larger on desktop

  • Button/CTA sizes should be touch-friendly on mobile (min 44x44px tap target)

Performance & Safety:

  • Minimize DOM queries - Cache element references: var button = document.querySelector('.cta')

  • NO polling/setInterval/setTimeout - NEVER use timers for waiting. Bad for browser performance.

  • Target fires after DOM ready - Elements should already exist when code runs

  • Defensive coding - Always check if element exists: if (element) { modify it }

  • If element doesn't exist, fail gracefully (don't throw errors)

  • No document.write() - Breaks page after load

  • Preserve existing functionality - Don't remove event listeners or break page behavior

Documentation:

  • Add inline comments - Explain what each modification does (helps editing in Target UI later)

  • Include selector explanations - Comment why specific selector was chosen

Conversion Tracking:

  • ALWAYS add dataLayer tracking to conversion elements (buttons, CTAs, forms, etc.)

  • Add datalayer tracking to any negative user actions too like closing a popup or offer

  • Use the generateDataLayerEvent tool to generate tracking code

  • Ask the User for the name of the test to populate at_activity

  • Attach click/submit event listeners that fire: dataLayer.push({event: "target_conversion", at_activity: "...", at_experience: "..."})

  • Event structure must be: event="target_conversion", at_activity="...", at_experience="..."

  • NO template literals - use string concatenation only for ES5 compatibility

  • Example: element.addEventListener('click', function() { dataLayer.push({event: 'target_conversion', at_activity: 'Hero Test', at_experience: 'Variant A'}); });

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL where the activity should run
nameYesActivity name
priorityNoActivity priority (0-999), defaults to 5
audienceIdsNoOptional: Array of audience IDs to target. If not provided, activity targets All Visitors. Get audience IDs using the listAudiences tool.
modificationsYesJavaScript code for the modifications

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and it goes far beyond a generic 'create' statement: it discloses permanent UI lock, mandatory preview, responsive-testing expectations, code-generation constraints, and conversion-tracking requirements. This gives the agent a precise model of the tool's side effects and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The content is well-structured with headings, numbered confirmations, and examples, and the critical warning is front-loaded. However, it is extremely long and contains repetition (three nearly identical confirmation steps, responsive-testing flow described twice), so it is not a concise or tightly edited description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-stakes creation tool with no output schema and no annotations, this description is exceptionally complete: it covers preconditions, alternative workflows, code rules, preview procedures, viewport testing, and conversion tracking. An agent has everything needed to decide whether and how to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100% for the five parameters, so the baseline is 3; the description earns an extra point by deeply specifying the modifications parameter: no preview indicator, ES5 only, at- prefixed classes, dataLayer events, and responsive requirements. It adds little on name/url/priority/audienceIds, but those are adequately covered by schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description makes clear the tool creates Adobe Target activities from generated modification code, and it repeatedly positions it as the bulk/locked-activity creation path versus the createOffer workflow. However, it never crisply states 'creates an XT activity from modification JavaScript' up front and does not contrast itself with createABActivity, so differentiation from that sibling is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is explicit about when to use this tool: only for 10+ bulk activities or CI/CD, only after three user confirmations, and with createOffer as the 99% alternative. It also gives a recommended alternative workflow, so an agent has clear routing between this tool and its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createAudienceD

Create a new audience

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAudience name
targetRuleNoAudience targeting rules
descriptionNoAudience description

TDQS

D1.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'create', offering no information about persistence, idempotency, duplicate handling, validation of targetRule, permissions, or response behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words, but it is under-specified and duplicates the tool name. It does not earn its place because it contributes no information beyond what the name already conveys.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, no annotations, a nested targetRule object, and a long list of sibling tools. The description leaves the agent with no guidance on targetRule shape, return values, or invocation context, making it inadequate for a tool with this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 even though the description adds no parameter-level meaning. The description does not clarify how targetRule should be structured, but that is not its responsibility given complete schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Create a new audience' restates the tool name exactly and provides no additional detail about what creating an audience entails. It is not misleading, but it is tautological and does not help distinguish this operation from other create-type siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as listAudiences or createABActivity. No prerequisites, exclusions, or practical context are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createJsonOfferA

SPECIALIZED TOOL - FOR SPAs, SERVER-SIDE, MOBILE, AND HEADLESS

Create JSON offers for applications that consume structured data (not HTML/DOM changes).

DO NOT USE THIS AS THE DEFAULT - Use createOffer (HTML) for most use cases!

CRITICAL: THIS TOOL CREATES OFFERS, NOT ACTIVITIES When users mention activity types like "A/B test", "XT", "Experience Targeting", etc., they are describing HOW the offer will be used, NOT what to create via API. ALWAYS create an OFFER using this tool, then the user builds the activity in Target UI.

=============================================================================== COMPLETE END-TO-END WORKFLOW FOR JSON OFFERS

TYPICAL REQUEST: "Create A/B test for product recommendations data in my React app"

STEP 1: SHOW JSON TO USER IN MCP CLIENT Before creating the offer, display the JSON structure to the user in the MCP client output. Ask: "Here's the JSON I'll create. Does this look correct?"

Example: User: "Create JSON offer with product recommendations" LLM: "I'll create this JSON offer:

{
  "products": [
    {"id": "123", "name": "Widget", "price": 29.99},
    {"id": "456", "name": "Gadget", "price": 49.99}
  ],
  "layout": "grid"
}

Does this structure look correct for your needs?"

User reviews the JSON in the MCP client → Confirms → LLM proceeds to Step 2

STEP 2: CREATE JSON OFFERS (After User Approval) Create one JSON offer per variation/experience:

A/B Test Pattern (Most Common):

  • Control Offer: Original/baseline data configuration

  • Variant Offer: New data configuration being tested

  • Total: 2 JSON offers

Example A/B Test: User: "Test 2 different product recommendation algorithms" → Control Offer: {"algorithm": "collaborative", "maxItems": 4} → Variant Offer: {"algorithm": "content-based", "maxItems": 6} → User creates A/B activity in Target UI with these 2 JSON offers

Experience Targeting (XT) Pattern:

  • One JSON offer per audience segment

  • Each offer contains data tailored to specific audience

  • Total: 1+ JSON offers

Example XT: User: "Show different features to free vs premium users" → Free User Offer: {"features": ["basic", "limited"], "upsell": true} → Premium User Offer: {"features": ["advanced", "unlimited", "priority"], "upsell": false} → User creates XT activity in Target UI with these 2 JSON offers + audience rules

Feature Flags Pattern:

  • JSON offers control feature availability

  • A/B test feature enablement

Example Feature Flags: User: "Test new checkout flow with 50% of users" → Control Offer: {"newCheckout": false, "checkoutVersion": "v1"} → Variant Offer: {"newCheckout": true, "checkoutVersion": "v2"}

IMPORTANT JSON OFFER RULES:

  1. Create separate JSON offers for each variation (don't combine in one offer)

  2. Each JSON offer should have consistent schema (same keys, different values)

  3. Your application must handle consuming and applying the JSON data

  4. Name offers clearly: "[Test Name] - [Variation Name]"

STEP 3: PROVIDE OFFER IDs TO USER (Required) After creating JSON offers, tell the user:

"I've created [N] JSON offers for your [activity type]:

OFFER IDs:

  • [Offer Name]: ID [12345]

  • [Offer Name]: ID [67890]

NEXT STEPS - Create Activity in Adobe Target UI:

  1. Go to Adobe Target → Activities → Create Activity → [A/B Test | Experience Targeting | etc.]

  2. Choose Form-Based Experience Composer

  3. Set location to: target-global-mbox (or your preferred mbox)

  4. For Experience A:

    • Click 'Change Content' → JSON Offer

    • Search for offer ID: [12345]

    • Select the offer

  5. Click 'Add Experience' for Experience B

    • Select offer ID: [67890]

  6. Configure traffic allocation

  7. Set up success metrics

  8. Name your activity and save

APPLICATION INTEGRATION: Your application needs to retrieve and use the JSON offer:

Client-side (SPA with at.js): adobe.target.getOffer({ mbox: "target-global-mbox", success: function(offer) { var jsonData = offer[0].content; // Your JSON data // Use jsonData to configure your app } });

Server-side (Node.js, Java, .NET, Python): Use Adobe Target Delivery API or SDK to retrieve JSON offer Parse the JSON and use it to configure server-side rendering

Mobile (iOS, Android): Use Adobe Target Mobile SDK to retrieve JSON offer Parse and apply to mobile app UI/behavior"

CONTROL VS VARIANT GUIDANCE FOR JSON OFFERS:

What is a Control?

  • The baseline data configuration (current algorithm, current settings)

  • Used to compare performance against new configurations

What is a Variant?

  • The new data configuration being tested

  • Different values/settings you're testing for better performance

How many JSON offers to create:

A/B Test (2 JSON offers): → Control: Current configuration → Variant A: New configuration

A/B/n Test (3+ JSON offers): → Control: Current configuration → Variant A: First alternative configuration → Variant B: Second alternative configuration

Experience Targeting (1+ JSON offers): → One JSON offer per audience segment → Each with data tailored to that segment

Example conversation: User: "A/B test product recommendations" LLM: "I'll create 2 JSON offers for your A/B test:

  1. Control - current recommendation algorithm

  2. Variant - new recommendation algorithm What data should each offer contain?"

WHEN TO USE THIS TOOL (JSON OFFERS):

  • User explicitly asks for "JSON offer" or "JSON content"

  • User mentions "SPA", "React", "Vue", "Angular", "single-page application"

  • User mentions "server-side", "backend", "API", "SDK" (Node.js, Java, .NET, Python)

  • User mentions "mobile app" (iOS, Android)

  • User mentions "headless", "API-driven", "cross-channel"

  • User mentions "IoT", "kiosk", "connected TV", "email personalization"

  • User wants structured data that their application will consume

  • User is testing different data configurations (feature flags, product data, pricing, etc.)

WHEN NOT TO USE (Use createOffer instead):

  • User asks to create/modify page elements (carousel, button, banner, modal, etc.)

  • Traditional A/B tests with visual changes

  • DOM modifications

  • Adding HTML content to the page

  • Most standard Target use cases (95%+ of requests)

IF USER REQUEST IS AMBIGUOUS: Ask: "How will this content be used?"

  • "Will your application consume this as JSON data (SPA, server-side, mobile app)?"

  • "Or do you want to modify the page's HTML/DOM directly (change buttons, add banners, etc.)?"

Decision:

  • If user says "consume as JSON" or "server-side" or "mobile app" → Use this tool (createJsonOffer)

  • If user says "modify page" or "change HTML" or "add elements" → Use createOffer instead

  • Default to createOffer (HTML) if still unclear after asking

WHY USE THIS TOOL (when appropriate):

  • JSON offers created via API CAN be fully edited in Adobe Target UI

  • User maintains full control and flexibility in Target UI

  • User can build/modify activities in Target manually

  • No limitations or restrictions

JSON offers deliver structured data to your application, typically for:

  • Single Page Applications (SPAs) - React, Vue, Angular consuming JSON client-side

  • Server-side integrations - Node.js, Java, .NET, Python SDKs consuming JSON

  • Mobile apps - iOS, Android apps consuming JSON via Adobe Target Mobile SDKs

  • Headless/API-driven experiences - Decoupled frontend consuming Target decisioning

  • Cross-channel delivery - Email, IoT, kiosks, connected TVs

  • Feature flags and configuration data - Dynamic app behavior

  • Product/pricing data - E-commerce personalization

HOW JSON OFFERS WORK:

  • JSON offers are NOT automatically applied to the page (unlike HTML offers)

  • Your application must explicitly retrieve the JSON offer using:

    • Client-side: Target's at.js getOffer() method for SPAs

    • Server-side: Target Delivery API or SDKs (Node.js, Java, .NET, Python)

    • Mobile: Adobe Target Mobile SDKs

  • Your application consumes the JSON and renders/uses it however needed

  • Example: Target returns {"buttonColor": "green", "headline": "Sale!"}, your app reads and applies it

After creating the JSON offer, user builds the activity in Target UI (recommended workflow).

=============================================================================== TEMPLATE SEARCH WORKFLOW (Do This First):

Before creating JSON from scratch, search for existing templates that match the user's request:

  1. SEARCH FOR MATCHING TEMPLATES:

    • Use MCP Resources to access templates (URIs like template://json/feature-flags)

    • Look for templates matching user's request by:

      • Template name (e.g., "feature-flags" for "feature flags")

      • Keywords and descriptions

    • Common template matches:

      • "products", "recommendations", "ecommerce" → template://json/product-recommendations

      • "features", "flags", "toggle", "beta" → template://json/feature-flags

      • "hero", "banner", "config" → template://json/hero-config

      • "pricing", "plans", "tiers", "subscription" → template://json/pricing-data

      • "personalization", "targeting", "offers" → template://json/personalization-content

  2. IF TEMPLATE FOUND: a) Read the template using MCP Resource (e.g., template://json/feature-flags) b) Parse the template JSON to get name, description, content, and variables c) Show template to user: "I found a '{name}' template: {description}. Would you like to use it as a starting point, or would you prefer I create custom JSON?" d) If user chooses template:

    • Ask user for required variable values (marked as required: true in template)

    • Ask about optional variables (show defaults from template)

    • Replace all {{VARIABLE}} placeholders in content with user's values

    • Convert the content to proper JSON (replace string placeholders with actual values)

    • Show the populated JSON to user

    • Ask: "Does this look good? Should I create this offer in Target?"

    • If yes: Call createJsonOffer tool with the populated JSON content e) If user prefers custom JSON:

    • Continue to WORKFLOW section below

  3. IF NO TEMPLATE FOUND:

    • Continue to WORKFLOW section below

IMPORTANT NOTES ABOUT JSON TEMPLATES:

  • Templates provide structured, tested JSON schemas for common use cases

  • Templates ensure consistent data structure across offers

  • You can modify template JSON after populating variables if user requests changes

  • Templates are located in src/templates/json/

  • Each template has a variables array defining what needs to be replaced

  • Variable replacement in JSON templates:

    • String values: {{VARIABLE}} → "user value"

    • Number values: {{VARIABLE}} → 123 (no quotes)

    • Boolean values: {{VARIABLE}} → true/false (no quotes)

    • Arrays: Keep JSON array structure, replace individual items

===============================================================================

USAGE: JSON offers allow you to return structured data instead of HTML. The content should be a valid JSON object that your application can consume.

WORKFLOW (if not using templates):

  1. Define your JSON structure (e.g., product data, configuration, feature flags)

  2. Create the offer with this tool

  3. Use the returned offer ID in your Target activity

  4. Your application receives the JSON when the activity fires

CONTENT RULES:

  • NEVER include emojis in JSON content, property values, or any part of the offer

  • Keep all text values professional and emoji-free

  • Use plain text only for all content

IMPORTANT:

  • Content must be a valid JSON object

  • Offers created via API CAN be edited in Adobe Target UI

  • Use with Form-Based Experience Composer or server-side decisioning

  • Workspace parameter is optional (uses TARGET_WORKSPACE_ID from config if not provided)

EXAMPLES:

  1. Product Recommendations: { "products": [ {"id": "123", "name": "Widget", "price": 29.99}, {"id": "456", "name": "Gadget", "price": 49.99} ], "layout": "grid" }

  2. Feature Flags: { "features": { "newCheckout": true, "darkMode": false, "beta": true } }

  3. Hero Banner Configuration: { "heading": "Summer Sale", "subheading": "Save up to 50%", "ctaText": "Shop Now", "ctaUrl": "/sale", "imageUrl": "https://example.com/banner.jpg", "backgroundColor": "#FF5733" }

  4. A/B Test Variant Data: { "variant": "B", "buttonColor": "green", "buttonText": "Get Started Now", "headline": "Transform Your Business Today" }

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesOffer name (e.g., "Product Recommendations - Summer Sale")
contentYesJSON object containing the offer data. Must be a valid JSON object that your application will consume.
workspaceNoWorkspace ID (optional). If not provided, uses the default workspace from config (TARGET_WORKSPACE_ID) or the account default workspace.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden, and it delivers: it warns 'THIS TOOL CREATES OFFERS, NOT ACTIVITIES', explains JSON offers are not auto-applied to the page and must be retrieved by the application, requires showing JSON to the user for approval before creation, and includes content rules like 'NEVER include emojis'. It also discloses that API-created offers can be edited in the Target UI, giving agents a clear mental model of side effects and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely long and repetitive. Concepts like control vs. variant, the A/B workflow, and 'JSON offers are not auto-applied' appear multiple times across sections (e.g., 'CONTROL VS VARIANT GUIDANCE', 'WORKFLOW', 'HOW JSON OFFERS WORK'). While it uses clear headings, it is not appropriately sized and many sentences do not earn their place; an agent would have to wade through a massive prompt to extract the core information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is thorough about the end-to-end workflow, including showing JSON to the user, creating one offer per variation, providing offer IDs, and suggesting next steps in the Target UI. It covers application integration patterns. The main gap is that it never explicitly states the tool's return object shape (e.g., the JSON response containing the offer ID), only implying it via 'Use the returned offer ID'. Given no output schema exists, an explicit return format statement would make it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful extra semantics: naming convention '[Test Name] - [Variation Name]', the rule that content must be a valid JSON object, multiple worked examples of content, and clarification that workspace is optional and falls back to TARGET_WORKSPACE_ID. This goes beyond the schema's terse property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'SPECIALIZED TOOL - FOR SPAs, SERVER-SIDE, MOBILE, AND HEADLESS' and 'Create JSON offers for applications that consume structured data', clearly stating the verb, resource, and audience. It explicitly differentiates from the sibling createOffer by saying 'DO NOT USE THIS AS THE DEFAULT - Use createOffer (HTML) for most use cases!' and clarifies it creates offers, not activities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides extensive when-to-use and when-not-to-use guidance: 'WHEN TO USE THIS TOOL' lists specific triggers (SPA, React, server-side, mobile, etc.), while 'WHEN NOT TO USE' says to use createOffer for HTML/DOM changes. It even includes an ambiguity-resolution script asking whether the user's content will be consumed as JSON or modify the page, with a default fallback to createOffer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createOfferA

PRIMARY DEFAULT WORKFLOW - USE THIS FOR 95%+ OF ALL USE CASES

Create HTML/CSS/JavaScript offers for DOM modifications and visual changes.

THIS IS THE MAIN TOOL FOR ADOBE TARGET CONTENT DEVELOPMENT

CRITICAL: THIS TOOL CREATES OFFERS, NOT ACTIVITIES When users mention activity types like "A/B test", "XT", "Experience Targeting", "Automated Personalization", etc., they are describing HOW the offer will be used, NOT what to create via API.

ALWAYS create an OFFER using this tool, regardless of activity type mentioned:

  • "Create an A/B test banner" → Create OFFER with banner code

  • "Create an XT experience" → Create OFFER with experience code

  • "Create an Automated Personalization element" → Create OFFER with element code

The user will then use these offers in the Target UI to build their activity (A/B, XT, AP, etc.).

=============================================================================== COMPLETE END-TO-END WORKFLOW

TYPICAL REQUEST: "Create an A/B test for a new hero banner on example.com/products"

STEP 1: PAGE EXTRACTION (When Needed) Extract the page structure to understand what you're modifying:

When to extract:

  • User wants to modify existing elements (change button color, update text, hide section)

  • Need to understand page structure (find selectors, IDs, classes)

  • Need to know where to insert new elements (parent hierarchy, insertion points)

  • Unsure what elements exist on the page

When NOT to extract (skip to Step 2):

  • Creating standalone element with no page context needed (simple banner, modal)

  • User already provided selectors/IDs to target

  • Very simple modifications that don't need page analysis

How to extract:

  1. Call getPageStructureSnippets with extractionType: 'full-page'

  2. Use Chrome DevTools MCP to navigate to the page

  3. Execute the extraction script

  4. Call extractPageStructure to save data and get summary

  5. Use queryPageStructure to find specific elements as needed

Example:

  • Get extraction script → Navigate to page → Execute script → Save structure

  • Query for button: queryPageStructure(sessionId, 'find-by-id', 'cta-button')

  • Get hierarchy: queryPageStructure(sessionId, 'get-element-hierarchy', 'hero-section')

STEP 2: GENERATE PREVIEW (REQUIRED - ALWAYS DO THIS BEFORE CREATING OFFERS) Generate a preview of the modifications and show it to the user in Chrome BEFORE creating any offers:

CRITICAL: This step is MANDATORY and must ALWAYS be executed before calling createOffer. The preview runs client-side in Chrome and does NOT require Adobe auth, so it will work even if your auth token is expired.

How to generate preview:

  1. Generate the offer code following all Adobe Target rules (see ADOBE TARGET CODE GENERATION RULES section)

  2. Call generatePreviewScript with:

    • modifications: The JavaScript code that makes the DOM changes

    • description: Clear description of what changes will be made

    • url: The URL where preview should be shown

  3. Use Chrome DevTools MCP navigate_to to load the page (IMPORTANT: use timeout of 30000ms)

  4. Use Chrome DevTools MCP evaluate_script to inject the preview script

  5. The page will show a red "Target Preview Active" indicator

  6. Ask the user: "Please review the changes in your browser. Does this look good?"

  7. Wait for user approval before proceeding to Step 3

Example: User: "Create a green CTA button" LLM: Generates button code → Calls generatePreviewScript → Uses Chrome DevTools MCP to show preview → User sees green button in browser → User says "looks good" → LLM proceeds to Step 3

WHY THIS STEP IS REQUIRED:

  • User can see and approve changes BEFORE any offers are created

  • Preview works even if Adobe auth token is expired (client-side only)

  • Prevents wasted API calls for offers that user might reject

  • Better user experience - visual confirmation before commitment

  • If auth fails in Step 3, user has still seen the preview

STEP 3: CREATE OFFERS (Only After Preview Approval) Create one offer per variation/experience:

A/B Test Pattern (Most Common):

  • Control Offer: Original/baseline version (often minimal or no changes)

  • Variant Offer: New version being tested

  • Total: 2 offers

Example A/B Test: User: "Test a green button vs current blue button" → Control Offer: No changes (or minimal code to track existing button) → Variant Offer: Change button to green + tracking code → User creates A/B activity in Target UI with these 2 offers

Experience Targeting (XT) Pattern:

  • One offer per audience segment

  • Each offer tailored to specific audience

  • Total: 1+ offers (depends on number of segments)

Example XT: User: "Show different hero to mobile vs desktop users" → Mobile Offer: Mobile-optimized hero banner → Desktop Offer: Desktop-optimized hero banner → User creates XT activity in Target UI with these 2 offers + audience rules

Multivariate Test (MVT) Pattern:

  • One offer per element per variation

  • Test multiple elements simultaneously

  • Total: Many offers (elements × variations)

Example MVT: User: "Test headline (2 versions) and button (2 colors)" → Headline A Offer, Headline B Offer → Button Green Offer, Button Red Offer → Total: 4 offers → User creates MVT activity in Target UI testing all combinations

IMPORTANT OFFER CREATION RULES:

  1. Create separate offers for each variation (don't combine in one offer)

  2. Each offer should be self-contained and work independently

  3. Control offer can be empty/minimal if testing against current page

  4. Always include tracking code for conversion elements

  5. Name offers clearly: "[Test Name] - [Variation Name]" (e.g., "Hero Test - Variant A")

STEP 4: PROVIDE OFFER IDs TO USER (Required) After creating offers, tell the user:

"I've created [N] offers for your [activity type]:

OFFER IDs:

  • [Offer Name]: ID [12345]

  • [Offer Name]: ID [67890]

NEXT STEPS - Create Activity in Adobe Target UI:

  1. Go to Adobe Target → Activities → Create Activity → [A/B Test | Experience Targeting | etc.]

  2. Choose Form-Based Experience Composer

  3. Set location to: target-global-mbox (or your preferred mbox)

  4. For Experience A:

    • Click 'Change Content' → HTML Offer

    • Search for offer ID: [12345]

    • Select the offer

  5. Click 'Add Experience' for Experience B (repeat for each variation)

    • Select offer ID: [67890]

  6. Configure traffic allocation (e.g., 50/50 split for A/B test)

  7. Set up success metrics (conversions, engagement, revenue)

  8. Review audience targeting (if needed for XT)

  9. Name your activity and save

BENEFITS:

  • Full control in Target UI

  • Can edit offers anytime

  • Can edit activity settings

  • QA mode works normally

  • Reporting and analytics fully functional"

CONTROL VS VARIANT GUIDANCE:

What is a Control?

  • The baseline/original experience (what users see now)

  • Used to compare against new variations

  • Can be "no changes" or the existing page as-is

What is a Variant?

  • The new experience being tested

  • Contains your modifications/improvements

  • What you're testing to see if it performs better than control

How many offers to create:

A/B Test (2 offers): → Control: Existing experience (minimal code or tracking only) → Variant A: New experience with changes

A/B/n Test (3+ offers): → Control: Existing experience → Variant A: First alternative → Variant B: Second alternative → Variant C: Third alternative (etc.)

Experience Targeting (1+ offers): → One offer per audience segment → No "control" concept - each audience gets tailored experience

Example conversation: User: "Create an A/B test for a new banner" LLM: "I'll create 2 offers for your A/B test:

  1. Control - keeps existing page as-is (no banner)

  2. Variant - adds your new banner Should I proceed?"

User: "Test 3 different button colors" LLM: "I'll create 4 offers for your A/B/n test:

  1. Control - current button (blue)

  2. Variant A - green button

  3. Variant B - red button

  4. Variant C - purple button Should I proceed?"

WHEN TO USE THIS TOOL (HTML OFFERS):

  • User asks to create/modify page elements (carousel, button, banner, modal, form, etc.)

  • User mentions ANY activity type (A/B, XT, AP) - just create the offer

  • Traditional A/B tests with visual changes

  • Experience Targeting (XT) experiences

  • DOM modifications (change text, colors, layout, etc.)

  • Adding new page elements

  • Most standard Target use cases

  • When user doesn't specify "JSON" or "SPA"

WHEN NOT TO USE (Use createJsonOffer instead):

  • User explicitly asks for "JSON offer" or "JSON content"

  • User mentions "SPA", "React", "Vue", "Angular", "headless", "API-driven"

  • User wants structured data without DOM changes

  • User is building a single-page application that consumes JSON

IF UNCLEAR WHICH TO USE: Ask the user: "Are you working with a single-page application (SPA) that consumes JSON data, or do you want to modify the page's HTML/DOM directly?"

  • If "SPA/JSON": Use createJsonOffer

  • If "HTML/DOM": Use this tool (createOffer)

  • Default to this tool (HTML) if user is still unclear

WHY USE THIS TOOL AS DEFAULT:

  • Offers created via API CAN be fully edited in Adobe Target UI

  • User maintains full control and flexibility in Target UI

  • User can build/modify activities in Target with Visual Experience Composer

  • QA mode and previews work normally

  • No limitations or restrictions

DO NOT create activities programmatically unless:

  • User explicitly requests bulk creation (10+ activities)

  • User explicitly asks for programmatic activity creation after being warned about UI limitations

For 99% of use cases: CREATE OFFERS ONLY, let user build activity in Target UI.

=============================================================================== COMPLETE A/B TEST WORKFLOW (USE THIS APPROACH FOR ALL TARGET CONTENT CREATION & DEVELOPMENT)

When a user asks to create an A/B test, experience, or personalization:

TEMPLATE SEARCH (Do This First): Before generating code from scratch, search for existing templates that match the user's request:

  1. SEARCH FOR MATCHING TEMPLATES:

    • Use MCP Resources to access templates (URIs like template://html/carousel)

    • Look for templates matching user's request by:

      • Template name (e.g., "carousel" for "create a carousel")

      • Keywords and descriptions

    • Common template matches:

      • "carousel", "slider", "gallery" → template://html/carousel

      • "hero", "banner" → template://html/hero-banner

      • "button", "cta" → template://html/cta-button

      • "modal", "popup", "overlay" → template://html/modal

      • "sticky", "announcement", "notification" → template://html/sticky-header

      • "countdown", "timer", "urgency" → template://html/countdown-timer

  2. IF TEMPLATE FOUND: a) Read the template using MCP Resource (e.g., template://html/carousel) b) Parse the template JSON to get name, description, content, and variables c) Show template to user: "I found a '{name}' template: {description}. Would you like to use it as a starting point, or would you prefer I generate custom code?" d) If user chooses template:

    • Ask user for required variable values (marked as required: true in template)

    • Ask about optional variables (show defaults from template)

    • Replace all {{VARIABLE}} placeholders in content with user's values

    • Show the populated code to user

    • Ask: "Does this look good? Should I preview this in Chrome?"

    • If yes: Continue to STEP 2 (GENERATE PREVIEW), then STEP 3A.6 (CREATE OFFER) with the populated template code

    • If user wants changes: Modify the code and ask again e) If user prefers custom code:

    • Continue to STEP 1 (PAGE EXTRACTION) below

  3. IF NO TEMPLATE FOUND:

    • Continue to STEP 1 (PAGE EXTRACTION) below

IMPORTANT NOTES ABOUT TEMPLATES:

  • Templates already follow all Adobe Target rules (ES5, IIFE, responsive, defensive coding, no emojis)

  • Templates are tested and working - use them when available to save time

  • You can modify template code after populating variables if user requests changes

  • Templates are located in src/templates/html/

  • Each template has a variables array defining what needs to be replaced

STEP 1: ASK CLARIFYING QUESTIONS Before generating any code, ask the user: a) "Do you have any links or image assets that need to be used?"

  • If yes: Use their exact URLs

  • If no: Add placeholders and document them. b) "How many variations do you want to test?" (if not specified) c) "What page element are you targeting?" (if not clear from the initial request) d) "Would you like me to create the offers in Target, or just show you the code?"

  • If "create offers": Follow STEP 2 (GENERATE PREVIEW), then STEP 3A

  • If "just show code": Follow STEP 2 (GENERATE PREVIEW), then STEP 3B

STEP 3A: GENERATE AND CREATE OFFERS (Use This Tool) For each variation:

3A.1 IDENTIFY CONVERSION ELEMENTS

  • Determine if this variation creates or modifies conversion elements (buttons, CTAs, links, forms)

  • If YES: Continue to Step 3A.2

  • If NO (only visual changes): Skip to Step 3A.4

3A.2 ASK ABOUT TRACKING (REQUIRED FOR NEW ELEMENTS) Before generating code: a) TAG MANAGER SELECTION:

  • If full-page extraction was done earlier (getPageStructureSnippets with extractionType: 'full-page'), check context for tagManagers.summary.recommendedForTracking

  • If tag manager was auto-detected, use that and inform user: "I detected {name} on the page, I'll use that for tracking"

  • If NOT detected or no full-page extraction in context:

    • Read src/config/tag-managers.json to discover available tag managers

    • Ask the user: "Which tag manager are you using?" (default: adobeLaunch)

    • Present the available options from the config file b) Ask the user: "When should the conversion event fire?" (default: always) Present these options clearly:

  • Every time (no limit) - DEFAULT - Track every interaction

  • Once per session - Prevents duplicate tracking (use for conversions if needed)

  • Once per page - Track once per page load

  • Once ever - Track once, stored permanently

  • Throttle - Limit frequency (ask for interval)

  • Debounce - Wait for user to stop interacting (ask for delay)

3A.3 GENERATE TRACKING CODE

  • Call generateDataLayerEvent tool with:

    • selector: The CSS selector for the conversion element (e.g., ".at-cta-button", "#at-signup-btn")

    • activity_name: The activity name (ask user if not provided)

    • experience_name: The variation name (e.g., "Control", "Variant A", "Green Button")

    • tag_manager: From user's answer in 3A.2a

    • firing_condition: From user's answer in 3A.2b

  • Save the returned tracking code

3A.4 GENERATE COMPLETE OFFER CODE

  • Generate optimized HTML/CSS/JS code following all Adobe Target rules below

  • NEVER include emojis in the generated code or content (text, comments, HTML, etc.)

  • If conversion element exists (from 3A.1):

    • Include the DOM modifications (create/modify button, styling, etc.)

    • Include the tracking code from 3A.3 AFTER the DOM modifications

    • Wrap everything in an IIFE: (function() { /* code */ })()

  • Ensure all code is ES5-compatible (no backticks, arrow functions, const/let)

3A.5 SHOW CODE TO USER

  • Display the complete offer code (including tracking if applicable)

  • Explain what the code does

  • If tracking was included, note: "This includes conversion tracking for [tag manager] that fires [firing condition]"

3A.6 CREATE OFFER

  • Ask: "Should I create this offer in Adobe Target?"

  • If yes: Create offer via createOffer tool and save the returned offer ID

  • If no: Just provide the code for manual use

Example: Control Offer ID: 2299231 Variant Offer ID: 2299232

STEP 3B: GENERATE CODE ONLY (No Tool Call) For each variation:

3B.1 IDENTIFY CONVERSION ELEMENTS

  • Determine if this variation creates or modifies conversion elements (buttons, CTAs, links, forms)

  • If YES: Continue to Step 3B.2

  • IF NO (only visual changes): Skip to Step 3B.4

3B.2 ASK ABOUT TRACKING (REQUIRED FOR NEW ELEMENTS) Before generating code: a) TAG MANAGER SELECTION (same as STEP 3A.2a):

  • If full-page extraction was done earlier, check context for tagManagers.summary.recommendedForTracking

  • If tag manager was auto-detected, use that and inform user: "I detected {name} on the page, I'll use that for tracking"

  • If NOT detected or no full-page extraction in context:

    • Read src/config/tag-managers.json to discover available tag managers

    • Ask the user: "Which tag manager are you using?" (default: adobeLaunch)

    • Present the available options from the config file b) Ask the user: "When should the conversion event fire?" (default: always) Present the same options as STEP 3A.2b

3B.3 GENERATE TRACKING CODE

  • Call generateDataLayerEvent tool with appropriate parameters

  • Save the returned tracking code

3B.4 GENERATE COMPLETE CODE

  • Generate optimized HTML/CSS/JS code following all Adobe Target rules below

  • If conversion element exists: Include tracking code AFTER DOM modifications

  • Wrap in IIFE

3B.5 SHOW CODE TO USER

  • Show the code with explanation

  • If tracking included, note: "This includes conversion tracking for [tag manager] that fires [firing condition]"

  • Provide manual instructions: "You can copy this code and paste it into Target UI when creating your offer manually"

STEP 4: PROVIDE NEXT STEPS TO USER After creating offers, provide these EXACT instructions:

"I've created {N} offers for your A/B test. Here's how to set up the activity:

OFFER IDs CREATED:

  • Control: {offer_name} (ID: {offer_id})

  • Variant: {offer_name} (ID: {offer_id})

NEXT STEPS IN ADOBE TARGET UI:

  1. Go to Adobe Target → Activities → Create Activity → A/B Test

  2. Choose Form-Based Experience Composer

  3. Set location to: {mbox_name} (default: target-global-mbox)

  4. For Experience A (Control):

    • Click 'Change Content' → HTML Offer

    • Search for offer ID: {control_offer_id}

    • Select the offer

  5. Click 'Add Experience' to create Experience B (Variant)

    • Click 'Change Content' → HTML Offer

    • Search for offer ID: {variant_offer_id}

    • Select the offer

  6. Set traffic allocation (default: 50/50 split)

  7. Configure goal/metric (default: Page Views - Engagement)

  8. Review, name your activity, and save

BENEFITS OF THIS APPROACH:

  • You can edit the activity in Target UI

  • You can edit the offers in Target UI

  • Full flexibility with Visual Experience Composer

  • QA mode and previews work normally"

If only code was generated (no offers created), provide these instructions:

"I've generated {N} code variations for your A/B test:

VARIATION {N}: {variation_name} [Show the HTML/CSS/JS code here]

TO USE THIS CODE MANUALLY:

  1. Go to Adobe Target → Activities → Create Activity → A/B Test

  2. Choose Form-Based Experience Composer

  3. For each experience:

    • Click 'Change Content' → Create HTML Offer

    • Paste the code above

    • Name the offer

  4. Set traffic allocation (default: 50/50 split)

  5. Configure goal/metric (default: Page Views)

  6. Save and activate

TIP: If you want me to create these as offers in Target for you (so you can reuse them), just let me know and I'll call the createOffer tool."

===============================================================================

HTML OFFER STRUCTURE (CRITICAL - MUST FOLLOW): When creating HTML offers, the content parameter MUST be properly structured:

REQUIRED STRUCTURE:

  • All JavaScript code MUST be wrapped in tags

  • CSS CANNOT be added via tags directly - it must be injected via JavaScript

  • HTML can be included directly (no wrapper needed)

CSS HANDLING (CRITICAL): Adobe Target HTML offers do NOT support standalone tags. You have TWO options for styling:

OPTION 1: Inject tag into via JavaScript (RECOMMENDED for multiple styles)

OPTION 2: Apply inline styles directly via JavaScript (RECOMMENDED for few styles)

WRONG - Do NOT use standalone tags:

CORRECT - Complete offer example with injected CSS:

CORRECT - Offer with HTML and JavaScript:

===============================================================================

ADOBE TARGET CODE GENERATION RULES (CRITICAL - MUST FOLLOW): When generating code for the content parameter, you MUST follow these rules:

CONTENT RULES:

  • NEVER use emojis in generated code, HTML content, text, comments, or anywhere in the offer

  • Keep all text, button labels, and content professional and emoji-free

  • Use plain text only for all user-facing content

DOM & Element Handling:

  • Do NOT use DOM ready functions (no $(document).ready, DOMContentLoaded, etc.) unless explicitly asked

  • Use specific selectors - NEVER use broad selectors like 'div', 'span', 'button' alone. Always use classes, IDs, or attribute selectors

  • Modify existing elements - Change text/styles/attributes rather than replacing entire DOM structures

  • Use hide/show patterns - Toggle visibility rather than remove/add elements

  • Insert content through Target - Do not directly modify HTML structure with new divs

Code Quality & Compatibility:

  • ES5 ONLY - Adobe Target cannot accept ES6 features:

    • NO backticks or template literals (use string concatenation with +)

    • NO arrow functions (use function() {} syntax)

    • NO const/let (use var only)

    • NO destructuring, spread operators, or other ES6+ features

PREVENTING VARIABLE COLLISIONS (CRITICAL):

  • ALWAYS wrap code in IIFE to avoid polluting global scope: (function() { ... })()

  • Use local 'var' variables inside IIFE (they won't conflict with page variables)

  • IF you absolutely need a global variable (rare - only for cross-offer state):

    • Use window.at_variableName = value; (explicit global with 'at_' prefix)

    • Check if it exists first: if (!window.at_myVar) { window.at_myVar = ...; }

    • NEVER use bare 'var' at top level (creates implicit globals that can overwrite page vars)

Examples: CORRECT - Local variables in IIFE (recommended):

CORRECT - Explicit global when needed (rare):

WRONG - Bare var at top level (can overwrite page variables):

  • No external dependencies - Don't load jQuery, libraries, or external scripts

  • Vanilla JavaScript only - Keep it simple and cross-browser compatible

  • Defensive coding - Always check if element exists: if (element) { ... }

  • Idempotent code - Script might run multiple times; ensure it handles that gracefully

Styling:

  • Inline styles for specificity - Use element.style.property = value to override existing styles

  • Inject CSS in tags - If adding CSS rules, inject a block in

  • !important sparingly - Only use when absolutely necessary for specificity

  • Prefix new classes with "at-" - ALL new classes you create must start with "at-" (e.g., "at-hero-banner", "at-cta-button"). This identifies Target-inserted elements.

  • Never style existing page classes - Do NOT write CSS rules targeting existing page classes (too broad, causes conflicts)

  • Target existing elements by ID - Use IDs or specific attribute selectors to target existing elements, NOT broad class names

  • Example: Use '#main-cta' or '[data-testid="hero-button"]', NOT '.button' or '.cta'

Responsive Design:

  • ALWAYS write responsive code that works on both mobile and desktop

  • Use media queries when adding CSS via tags: @media (max-width: 768px) { ... }

  • Test viewport-specific styles: Mobile (375px-768px), Desktop (1024px+)

  • Avoid fixed pixel widths - Use percentages or max-width instead

  • Consider mobile-first: Default styles for mobile, enhance for desktop

  • Hide/show elements per viewport if needed: display: none on mobile, display: block on desktop

  • Font sizes should scale appropriately: Smaller on mobile, larger on desktop

  • Button/CTA sizes should be touch-friendly on mobile (min 44x44px tap target)

Performance & Safety:

  • Minimize DOM queries - Cache element references: var button = document.querySelector('.cta')

  • NO polling/setInterval/setTimeout - NEVER use timers for waiting. Bad for browser performance.

  • Target fires after DOM ready - Elements should already exist when code runs

  • Defensive coding - Always check if element exists: if (element) { modify it }

  • If element doesn't exist, fail gracefully (don't throw errors)

  • No document.write() - Breaks page after load

  • Preserve existing functionality - Don't remove event listeners or break page behavior

Documentation:

  • Add inline comments - Explain what each modification does (helps editing in Target UI later)

  • Include selector explanations - Comment why specific selector was chosen

Conversion Tracking (CRITICAL - FOLLOW STEP 2A.2 AND 2A.3):

  • ALWAYS add dataLayer tracking to conversion elements (buttons, CTAs, forms, etc.)

  • BEFORE generating the offer code:

    1. Ask user about tag manager preference if not detected automatically (Step 3A.2a or 3B.2a)

    2. Ask user about firing condition (Step 3A.2b or 3B.2b)

    3. Call generateDataLayerEvent tool to get tracking code (Step 3A.3 or 3B.3)

    4. Include the tracking code in the offer AFTER DOM modifications (Step 3A.4 or 3B.4)

  • Use the generateDataLayerEvent tool - it generates ES5-compatible code with proper firing conditions

  • Place tracking code AFTER DOM modifications in the offer

  • Attach click/submit event listeners that fire: dataLayer.push({event: "target_conversion", at_activity: "...", at_experience: "..."})

  • Default event structure should be be: event="target_conversion", at_activity="...", at_experience="..." unless specified differently by the user

  • NO template literals - use string concatenation only for ES5 compatibility

  • Example workflow:

    1. Generate button modification code

    2. Call generateDataLayerEvent(selector: '.at-cta-button', activity_name: 'Hero Test', experience_name: 'Variant A', tag_manager: 'adobeLaunch', firing_condition: 'always')

    3. Include returned tracking code in offer after button code

    4. Show complete offer code to user

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesOffer name
contentYesOffer content (HTML/CSS/JavaScript). Wrap JavaScript in <script> tags. CSS must be injected via JavaScript, NOT standalone <style> tags.
workspaceNoWorkspace ID (optional). If not provided, uses the default workspace from config (TARGET_WORKSPACE_ID) or the account default workspace.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it does a lot: it warns that CSS cannot be in standalone <style> tags, mandates ES5 compatibility, requires IIFE wrapping to avoid variable collisions, and instructs preview-before-create flow. It also discloses that offers created via API can be edited in Target UI. Minor deduction because the description is exceptionally long and speculative (includes fictional example output IDs), but the behavioral guidance itself is substantive and not contradicted by any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely repetitive and over-sized for an MCP tool definition. The same workflow steps are presented multiple times (Steps 1-4 appear twice with different numbering; Control vs Variant guidance repeats the A/B and XT patterns; the 'NEXT STEPS IN ADOBE TARGET UI' instructions appear twice almost verbatim; code generation rules cover the same points in several places). While front-loaded with the primary purpose, the massive duplication and example-heavy length actively reduce scannability. This is not conciseness; it is redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter tool with no output schema and no annotations, the description covers the full lifecycle: when to extract the page, how to generate a preview, how to create offers per variation, what to tell the user afterward, and code quality constraints. It even handles edge cases like expired auth tokens, unclear SPA vs HTML requests, and template search. An agent can call this tool correctly and complete the surrounding workflow without external knowledge.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (name, content, workspace are each described). The description adds significant meaning for the 'content' parameter: full HTML offer structure rules, CSS injection instructions, ES5 constraints, IIFE requirement, at- prefix rules, and code examples. This goes well beyond the schema's short parameter descriptions. Workspace behavior is also clarified in the schema itself. A 4 is appropriate since the description genuinely complements the schema without being able to add much to 'name'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'PRIMARY DEFAULT WORKFLOW - USE THIS FOR 95%+ OF ALL USE CASES' and explicitly states this tool creates HTML/CSS/JavaScript offers for DOM modifications and visual changes. It clearly names createJsonOffer as the alternative for JSON/SPA cases, and consistently distinguishes 'creates offers, not activities' by explaining activity types map to offer creation. This is a specific verb + resource + scope, sharply differentiated from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description contains an extensive 'WHEN TO USE THIS TOOL' and 'WHEN NOT TO USE (Use createJsonOffer instead)' section with explicit conditions, including an 'IF UNCLEAR WHICH TO USE' fallback question and default-to-this-tool guidance. It also explains when NOT to create activities programmatically and when to skip page extraction. This is explicit when/when-not/alternative coverage beyond any typical description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

createResponseTokenA

Create a NEW CUSTOM response token to include data in Adobe Target activity responses.

IMPORTANT: This tool creates NEW custom tokens only. Many common tokens already exist in your account:

  • System tokens (experience.id, activity.name, geo.city, etc.) already exist with deletable: false

  • These existing tokens can only be ACTIVATED/DEACTIVATED in the Target UI (Administration > Response Tokens)

  • Use this tool to create NEW custom tokens that don't already exist

To check existing tokens, use listResponseTokens first.

Response tokens make additional data available in Target's response payload (mbox.js, at.js).

TOKEN TYPES (for creating NEW tokens):

  1. BUILT_IN - System-level tokens (e.g., experience.id, activity.name) Example: { token: "experience.id", type: "BUILT_IN" }

  2. ACTIVITY - Activity-based attributes (e.g., activity.name, campaign.id) Example: { token: "activity.name", type: "ACTIVITY" }

  3. GEO - Geographic data (e.g., geo.city, geo.country) Example: { token: "geo.city", type: "GEO" }

  4. CRS - Customer Record Service attributes Example: { token: "crs.customAttribute", type: "CRS" }

  5. MBOX - Custom mbox parameters passed in requests (MOST COMMON FOR NEW TOKENS) Example: { token: "profile.userType", type: "MBOX" } Example: { token: "profile.productId", type: "MBOX" } Note: Mbox parameters must be passed by your implementation (at.js/mobile SDK) This is the most common type for creating custom response tokens

  6. SCRIPT - Profile script outputs (e.g., profile.scriptName) Example: { token: "profile.userSegment", type: "SCRIPT" }

    IMPORTANT LIMITATION: Profile scripts CANNOT be created via the Admin API. You must create profile scripts in the Target UI first:

    • Navigate to Audiences > Profile Scripts

    • Create your script (e.g., "userSegment")

    • Then create the response token: { token: "profile.userSegment", type: "SCRIPT" }

COMMON USE CASES FOR CUSTOM TOKENS:

Custom tracking: Create tokens for your specific mbox parameters (profile.userType, profile.campaignId, etc.) Business data: Return custom business attributes in responses Integration: Pass custom data to analytics or tag management systems

BEFORE CREATING:

  1. Run listResponseTokens to check if the token already exists

  2. If it exists with deletable: false, activate it in Target UI instead

  3. If it doesn't exist, create it with this tool

WORKFLOW FOR SCRIPT TOKENS:

  1. Create profile script in Target UI (Audiences > Profile Scripts)

  2. Use this tool to create response token referencing that script

  3. Response token becomes available in Target responses

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoResponse token ID (optional)
typeYesToken type - see description for details and limitations
tokenYesToken identifier (e.g., "experience.id", "profile.scriptName", "geo.city")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It does substantial work: it states the tool only creates new custom tokens, documents token types and examples, and calls out the important limitation that profile scripts cannot be created via the Admin API. It does not mention failure modes, permissions, or response behavior, which prevents a higher score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with headings, numbered workflows, and bullet lists, and the key purpose is front-loaded in the first sentence. It earns most of its length through token-type examples and limitations, though some redundancy exists between the 'IMPORTANT LIMITATION' and 'WORKFLOW FOR SCRIPT TOKENS' sections.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity creation tool with no output schema and no annotations, the description is largely complete: it supplies required examples, preconditions, alternative workflows, and UI fallbacks. The main gaps are the meaning of the optional id field and any expectation about what the API returns after creation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description goes further by explaining each BUILT_IN/ACTIVITY/GEO/CRS/MBOX/SCRIPT type with concrete token examples and the mbox/profile-script implementation caveats. The optional 'id' parameter is not explained beyond the schema's 'Response token ID (optional)', so the description does not fully clarify every parameter's role.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Create a NEW CUSTOM response token' and states the purpose: 'to include data in Adobe Target activity responses.' It clearly separates this tool from listResponseTokens and from the Target UI by emphasizing it creates new custom tokens only, so an agent can distinguish it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: run listResponseTokens first, activate existing deletable:false tokens in the Target UI, and only use this tool for tokens that do not yet exist. It also explains the profile-script case where the script must first be created in the UI, providing clear routing between API and UI workflows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generateDataLayerEventA

Generate ES5-compatible event tracking code for Adobe Target activity conversions. Supports multiple tag managers with configurable event structures and firing conditions.

SUPPORTED TAG MANAGERS:

  • gtm: Google Tag Manager (dataLayer.push)

  • adobeLaunch: Adobe Experience Platform Tags (_satellite.track)

  • tealium: Tealium iQ (utag.link)

  • segment: Segment Analytics (analytics.track)

  • customDataLayer: Custom dataLayer implementation

USAGE: When creating or modifying Target experiences with conversion elements (buttons, links, forms), use this tool to generate click tracking code.

WORKFLOW:

  1. User creates an experience with a button/link/conversion element

  2. LLM identifies the conversion element selector

  3. LLM asks: "What should I name this activity?" (if not already provided)

  4. LLM asks: "What experience name should I use?" (e.g., "Experience A", "Control", "Variant B")

  5. TAG MANAGER SELECTION:

    • If full-page extraction was done earlier, check context for tagManagers.summary.recommendedForTracking

    • If tag manager was auto-detected, use that (inform user: "I detected {name} on the page")

    • If NOT detected or no full-page extraction in context, ask: "Which tag manager are you using?" (default: adobeLaunch)

  6. LLM MUST ASK: "When should this conversion event fire?" and present these options:

    1. Every time (no limit) - DEFAULT - Track every interaction 2. Once per session - Track only once per session (prevents duplicate conversions) 3. Once per page - Track only once per page load 4. Once ever - Track only once, stored permanently 5. Throttle - Limit frequency (e.g., max once per second) 6. Debounce - Wait for user to stop interacting

    Default is "always" (every time). User can override if needed.

  7. LLM calls this tool with selector, activity_name, experience_name, tag_manager (auto-detected or selected), and firing_condition

  8. Tool returns ES5-compatible click event listener code with firing condition logic

  9. LLM includes this code in the activity modifications

FIRING CONDITIONS:

  • always: No limit, fires every time - DEFAULT

  • once_per_session: Fires once per session (uses sessionStorage) - For preventing duplicate conversions

  • once_per_page: Fires once per page load (uses flag)

  • once_ever: Fires once ever (uses localStorage)

  • throttle: Limits frequency (requires interval parameter in ms)

  • debounce: Waits for user to stop (requires delay parameter in ms)

IMPORTANT:

  • ALWAYS ask about firing conditions - don't assume

  • Default is "always" (fires every time) - user can override if needed

  • Attach to ALL conversion elements (buttons, CTAs, forms, etc.)

  • Attach to the most specific selector possible

  • Attach to negative user actions aswell, like ignoring a popup or closing a modal

  • activity_name should match the Target activity name

  • experience_name should be descriptive (e.g., "Control", "Variant A", "Green Button Test")

  • Generated code is ES5-compatible (no template literals, arrow functions, const/let)

  • Code includes defensive check for element and tag manager object existence

  • NO polling/setInterval - Target fires after DOM ready, so elements should already exist

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYesCSS selector for the conversion element (button, link, etc.) - e.g., "#cta-button", ".at-signup-btn"
event_nameNoCustom event name (optional). If not provided, uses tag manager default (e.g., "target_conversion" for GTM, "target-conversion" for Adobe Launch)
event_typeNoType of DOM event to track (default: "click"). Can be "click", "submit", "change", etc.
tag_managerNoTag manager to use: "adobeLaunch" (Adobe Launch), "gtm" (Google Tag Manager), "tealium" (Tealium iQ), "segment" (Segment), or "customDataLayer" (Custom implementation). Default: "adobeLaunch"
activity_nameYesThe name of the Adobe Target activity (should match activity name in Target)
firing_paramsNoParameters for throttle/debounce conditions. For throttle: { interval: 1000 }. For debounce: { delay: 500 }. Values in milliseconds.
experience_nameYesThe experience name/variant (e.g., "Experience A", "Control", "Variant B", "Green Button")
firing_conditionNoWhen should the event fire? Options: "always" (every time - DEFAULT), "once_per_session" (prevents duplicate conversions), "once_per_page", "once_ever", "throttle", "debounce". Default: "always"
include_commentsNoInclude explanatory comments in the generated code (default: true)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses important behavioral traits: output is ES5-compatible, code includes defensive checks, no polling/setInterval is used, firing conditions are configurable, and defaults are specified. This gives the agent a realistic expectation of the generated behavior and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear headings, but it is quite verbose and contains redundancy. Firing condition options are repeated in multiple sections, and the default 'always' is emphasized repeatedly. A more condensed version would retain clarity while removing repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex code-generation tool with 9 parameters and no output schema, the description is remarkably complete. It covers supported tag managers, workflow steps, firing condition options, required parameters, code constraints, and important edge-case guidance. An agent has enough context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema: how tag manager is selected, which parameters to pass in the workflow, firing condition semantics, and guidance like 'Attach to the most specific selector possible.' This enriches parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Generate ES5-compatible event tracking code for Adobe Target activity conversions.' It clearly distinguishes this tool from siblings like generatePreviewScript by focusing on conversion event tracking across multiple tag managers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage context: 'When creating or modifying Target experiences with conversion elements (buttons, links, forms), use this tool to generate click tracking code.' It also gives a detailed workflow for when to invoke the tool and what questions to ask. However, it does not explicitly mention alternatives or when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generatePreviewScriptA

Generate a preview script for Chrome DevTools MCP to inject modifications into a live page.

WORKFLOW REQUIREMENTS FOR LLM:

  1. Before calling this tool, explain to the user what modifications you're about to preview

  2. Show them the specific selectors and changes (e.g., "I'll change the button .cta-primary to have a blue background")

  3. Call this tool to get the preview script

  4. Use Chrome DevTools MCP 'navigate_to' to load the page (if not already open) IMPORTANT: use a timeout of 30000 ms to ensure the page fully loads

  5. Use Chrome DevTools MCP 'evaluate_script' with the provided script to inject the modifications

  6. Ask the user to review the changes visually in their browser

  7. Wait for user approval before creating the activity

This approach uses Chrome DevTools MCP and execute_script for live preview

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL where the preview should be shown
descriptionYesDescription of what the modifications do
modificationsYesJavaScript code that makes the modifications (CSS changes, text updates, etc.)

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. It discloses that the tool produces a script rather than directly modifying the page, and that the injection is done via Chrome DevTools MCP evaluate_script. However, it doesn't mention return format, potential errors, or any edge-case behavior, leaving some uncertainty.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, and the numbered workflow is well organized for a multi-step tool. It is longer than minimal but every step serves a practical role. Some redundancy exists at the end ('This approach uses Chrome DevTools MCP and execute_script'), but it doesn't detract significantly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema and no annotations, the description is unusually complete: it provides the full interaction flow, explicit timeout guidance, page-loading instructions, and an approval gate. An agent would know exactly how to invoke and sequence this tool end-to-end.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters. The description adds value by contextualizing them: url is tied to navigate_to loading, modifications are tied to user-visible selector changes and later injection, and description is tied to the preview explanation. This goes beyond the schema's basic field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Generate') and resource ('preview script for Chrome DevTools MCP') and clearly states the purpose: inject modifications into a live page. The workflow line 'Wait for user approval before creating the activity' distinguishes it from the sibling createActivityFromModifications, even though that sibling isn't named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

A numbered 7-step workflow gives explicit context for when to call the tool, what to do before, and how to follow up with navigate_to and evaluate_script. It does not explicitly name alternative tools or state when not to use it, but the sequencing is clear enough to guide tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getABActivityA

Get details of a specific A/B Test activity

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesActivity ID

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. 'Get details' implies a read-only lookup, but the description does not disclose response shape, error behavior, permissions, or any side-effect absence beyond the verb itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single clear sentence with no redundancy. It is appropriately sized for a simple get-by-id tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool, this is minimally adequate, but the description is vague about what 'details' will be returned and there is no output schema or annotations to fill that gap. Failure behavior and response format are also unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter and the schema already describes it as 'Activity ID' with 100% coverage. The description adds no additional meaning beyond emphasizing that the activity is specific, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get details') and the resource ('A/B Test activity'), with 'specific' indicating singular retrieval by ID. It is distinguishable from list/create/update siblings, though it does not explicitly name an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The wording 'specific A/B Test activity' implies use when a known activity ID exists rather than listing all activities. However, there is no explicit guidance about when not to use it or which sibling tool might be more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getABOrdersReportB

Get orders report data for an A/B Test activity, including conversion metrics and order information

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesActivity ID
reportIntervalNoOptional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00")

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says the tool 'gets' report data and includes metrics, but it does not mention authentication needs, read-only safety, default date-range behavior, pagination, errors, or whether the report is generated synchronously.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence with no wasted words. The core action and resource are front-loaded, and the additional content detail is relevant and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple two-parameter schema, the description is mostly adequate for basic invocation, but it lacks output-schema details and does not clarify what happens when reportInterval is omitted or how the returned report data is structured. The absence of annotations and output schema makes this a minimum-viable but not fully complete definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters clearly: id is the Activity ID and reportInterval is an optional ISO 8601 date range. The description adds no additional parameter semantics, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Get'), a specific resource ('orders report data'), and the target type ('A/B Test activity'). It also names high-level contents ('conversion metrics and order information'), which helps distinguish it from sibling report tools like getXTOrdersReport or getABPerformanceReport.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus the many sibling report tools, nor are there any exclusions or alternative suggestions. The agent is left to infer usage solely from the name and description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getABPerformanceReportA

Get performance report for an A/B Test activity with metrics, conversions, and visitor data

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesActivity ID
reportIntervalNoOptional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00")

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. 'Get' strongly implies a read-only operation, and the mention of metrics, conversions, and visitor data gives some sense of the response content. However, it does not disclose output format, pagination, report generation behavior, or other operational details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb and resource, then adds useful high-level content expectations. Every word contributes value, with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is relatively simple with only two parameters, and schema coverage is complete, but there is no output schema and no annotation context. The description gives a high-level idea of the report contents but does not fully specify the return structure or how reportInterval influences the response, leaving moderate gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so id and reportInterval are already well documented in the input schema. The description does not add parameter-level meaning beyond what the schema provides; the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get'), a specific resource ('performance report for an A/B Test activity'), and explicitly lists content areas (metrics, conversions, visitor data). This clearly distinguishes it from sibling report tools like getXTPerformanceReport and getABOrdersReport.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to choose this tool over sibling alternatives such as getABOrdersReport, getActivityInsights, or the XT/APT report tools. The description implies use for A/B performance reporting, but it does not state exclusions or specific selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getActivityInsightsA

Search for an activity by name and get a detailed performance comparison of all experiences with insights and recommendations. No activity ID needed - just provide the activity name.

ParametersJSON Schema
NameRequiredDescriptionDefault
qaUrlNoOptional URL for generating QA preview links (e.g., "https://www.example.com"). If not provided, QA links will not be generated.
activityNameYesName of the activity (can be partial match)
reportIntervalNoOptional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00")

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the behavioral promise (search, compare all experiences, return insights/recommendations) and the partial-match name lookup behavior. But it does not state whether the operation is read-only, what the response structure contains, or constraints like data freshness or rate limits — notable gaps since no annotations backstop the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler. The core function is front-loaded first, and the key access requirement ('No activity ID needed') follows immediately. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param tool with no output schema and no annotations, the description conveys the core function and the single required input adequately. However, it does not position itself against the five sibling report tools (getABPerformanceReport, getXTPerformanceReport, getAPTPerformanceReport, etc.) or indicate which report types it spans, and the absence of any return-shape hints leaves an agent without an output schema to guess what 'insights and recommendations' look like.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds mild value by framing activityName as a search key supporting partial matches ('Search for an activity by name') and by clarifying that no ID parameter is needed. It adds nothing beyond the schema for reportInterval or qaUrl, which are already well documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Search for an activity by name') plus a concrete output ('performance comparison of all experiences with insights and recommendations'). The phrase 'No activity ID needed - just provide the activity name' partially distinguishes it from ID-keyed report siblings like getABPerformanceReport, but it never explicitly names or contrasts a sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'No activity ID needed - just provide the activity name' implies the tool is for name-based lookup, which indirectly signals that alternative ID-required report tools exist among the siblings. However, it never explicitly states when not to use this tool or names the alternatives (e.g., getABPerformanceReport, getXTPerformanceReport), leaving that inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getAPTPerformanceReportA

Get performance report for an Automated Personalization Test (APT) activity with metrics, conversions, and visitor data

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesActivity ID
reportIntervalNoOptional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00")

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. 'Get' implies a read-only report operation, and the listed data categories indicate what the report contains. However, it does not disclose any caveats such as permissions, report generation constraints, or behavior of the optional date range beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every phrase adds useful information: the action, the report type, the activity type, and the report contents.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple retrieval tool with two documented parameters, the description covers the core purpose and high-level report contents. Still, the absence of an output schema and annotations means it would benefit from noting that this is a read-only operation or from pointing to sibling tools for other report types.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the descriptions for id and reportInterval already explain their purpose and format. The tool description adds no additional parameter meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the specific resource 'performance report for an Automated Personalization Test (APT) activity'. Specifying APT distinguishes it from sibling report tools such as getABPerformanceReport and getXTPerformanceReport, and the data categories (metrics, conversions, visitor data) further clarify scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The qualified activity type implies this tool is for APT performance reports, but it does not explicitly say when to use it instead of related report tools or when not to use it. No alternatives are named, leaving the agent to infer selection criteria from the activity type.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getAtjsSettingsB

Retrieve AT.js settings including client code, decisioning method, timeout, global mbox configuration, and other AT.js library settings

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral transparency burden. It does disclose that this is a read operation via 'Retrieve' and gives a sense of the returned content categories. However, it does not mention side effects, permissions, error behavior, or whether the response is complete or partial. For a simple parameterless getter, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core action and resource, then lists useful specifics. Every part contributes meaning; even the trailing 'and other AT.js library settings' usefully signals that the list is non-exhaustive. It is compact without sacrificing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read tool, the description provides a reasonable overview of what is returned, but it stops short of being fully complete. There is no output schema, so the description carries the burden of explaining the return value; it names several settings but remains vague about the full shape or behavior. Additionally, the broad sibling context offers no guidance to reduce ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there are no parameter semantics to document. The baseline for no parameters is 4, and the description correctly focuses on the output content rather than inputs. No additional parameter-related explanation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Retrieve' with a concrete resource, 'AT.js settings', and enumerates key included fields (client code, decisioning method, timeout, global mbox configuration). This clearly separates it from the similarly named sibling getAtjsVersions, but it does not explicitly call out that distinction. Overall purpose is clear and actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus alternatives such as getAtjsVersions or getMbox. The context signals include many sibling tools that could overlap in the AT.js domain, but the description does not provide any 'use this when...' or 'for versions use getAtjsVersions' direction. Usage is only implied by the tool's name and the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getAtjsVersionsA

Retrieve list of available AT.js versions

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description frames the operation as read-only by using 'Retrieve list', which is useful given that no annotations are provided. However, it does not disclose details such as ordering, whether deprecated or all versions are included, or response shape, which would be more transparent for a tool with no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that starts with the verb and states the resource directly. Every word earns its place, and there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only list tool, the description is mostly complete: it states what is returned and the target resource. It could be slightly stronger by noting the relationship to AT.js settings or the expected return format, but nothing essential blocks correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is empty, so there is no parameter meaning for the description to add. The baseline for zero-parameter tools is 4, and the description appropriately needs no additional parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('Retrieve list') and a distinct resource ('available AT.js versions'). This uniquely identifies the tool among siblings, especially against the similar getAtjsSettings, by naming a different resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives, and no alternative is mentioned. However, the resource name and description make the usage reasonably implied: an agent should use this when it needs to list available AT.js versions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getEntityRevisionsA

Get all revisions (audit history) of a specific entity by ID, in descending order by time.

NOTE:

  • Only the latest 100 revisions are retained per entity (including CREATE and DELETE actions)

  • For admin page entities, only concrete updates are recorded

  • For authorizedHosts, use client ID as entity ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID (for authorizedHosts, use client ID)
revisionResourceTypeYesEntity type to fetch revisions for

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden of behavioral disclosure. It adds meaningful context: results are in descending order by time, only latest 100 revisions are retained (including CREATE and DELETE), admin page entities record only concrete updates, and authorizedHosts requires using client ID as entity ID. This goes well beyond a basic read operation description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the primary action, followed by a compact bulleted NOTE section. Every sentence carries necessary information, and the structure is easy to scan for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read operation with no output schema, the description covers purpose, ordering, data retention, special entity behaviors, and ID mapping. It lacks mention of return format or error cases, but these are not critical given the simplicity of the tool and its clear audit-history intent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, with both parameters having descriptions that capture the same meaning (entity type and entity ID). The description reinforces the authorizedHosts client-ID rule already present in the schema but does not add substantial new parameter-level details beyond that. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Get'), resource ('all revisions/audit history'), and scope ('of a specific entity by ID, in descending order by time'). It is easy to understand what the tool does, but it does not explicitly differentiate itself from the sibling tool getRevisions, leaving some ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like getRevisions or other list/fetch tools. The NOTE section gives useful caveats and parameter hints, but it does not state any selection criteria, exclusions, or preferred scenarios for using this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getMboxA

Get details of a specific mbox by name, including location ID, name, and associated audience IDs

ParametersJSON Schema
NameRequiredDescriptionDefault
mboxNameYesThe name of the mbox (e.g., "target-global-mbox", "hero-mbox")

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It conveys the read-only nature through 'Get' and lists the main returned fields, which is helpful. However, it does not mention error behavior, authorization needs, or the exact response structure, leaving some gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that leads with the action and resource, then lists the relevant data points. Every word earns its place, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description adequately covers the input and the key returned fields. The word 'including' implies there may be additional unspecified fields, and the exact JSON shape is not given, but this is a minor gap for such a simple operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with mboxName already documented as the mbox name with concrete examples. The description's 'by name' adds no new parameter-level meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get details'), a precise resource ('a specific mbox by name'), and enumerates the returned content (location ID, name, associated audience IDs). This clearly distinguishes it from siblings like listProperties, getABActivity, and listActivities, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the usage context clear: call this tool when you need details of a single named mbox. It does not explicitly name alternatives or exclusion conditions, but among the sibling tools, none other targets a specific mbox, so the context is sufficient for an agent to select it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getMockupAnalysisInstructionsA

Extract detailed page structure to prepare for mockup comparison and experience generation.

MOCKUP-TO-EXPERIENCE WORKFLOW: This tool is the FIRST STEP when a user provides a mockup/screenshot and wants to create an experience.

Workflow:

  1. User provides: mockup screenshot + target URL

  2. LLM calls THIS TOOL with the URL to get current page structure

  3. LLM analyzes mockup image (using vision) vs current page data

  4. LLM identifies differences (layout, colors, text, positioning, etc.)

  5. LLM generates ES5 modification code following ALL Adobe Target coding rules

  6. LLM shows user the proposed changes for approval

  7. LLM calls createActivityFromModifications to deploy

IMPORTANT INSTRUCTIONS FOR LLM: When user provides a mockup/screenshot:

  1. Ask user: "What's the URL of the page this mockup is for?"

  2. Ask user: "Do you have any links or image assets that need to be used in this experience?"

    • If user provides links/images: Use the exact URLs provided

    • If user says "no" or doesn't provide assets: Use placeholder links (e.g., "https://example.com/image.jpg" or "#")

  3. Call THIS TOOL with the URL

  4. Analyze the mockup screenshot carefully:

    • Identify visual differences from current page

    • Note layout changes, color changes, text changes, new elements

    • Look for CSS properties: colors, fonts, spacing, positioning

    • Identify which elements need modification (use specific selectors)

  5. Generate modification code that:

    • Follows ALL Adobe Target code generation rules (ES5 only, at- prefix, etc.)

    • Uses specific selectors (IDs, data attributes, NOT broad classes)

    • Waits for elements to exist before modifying

    • Is well-commented explaining each change

  6. Show user the generated code and explain the changes

  7. After approval, call createActivityFromModifications

KEY ANALYSIS POINTS:

  • Compare mockup colors vs current page colors

  • Compare mockup text vs current page text

  • Compare mockup layout/positioning vs current page

  • Identify new elements in mockup that need to be created

  • Identify hidden elements that need to be shown/hidden

  • Note font changes, size changes, spacing changes

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL of the page to analyze
focusAreaNoOptional: Specific section to focus on (e.g., "hero section", "navigation", "footer"). If not provided, analyzes entire page.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full behavioral disclosure burden. It does say the tool 'get[s] current page structure' and is the 'FIRST STEP', implying a read-only extraction operation. However, it never explicitly states that the tool has no side effects, nor does it mention auth needs, rate limits, failure behavior, or the response format, leaving notable gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is excessively long and mixes tool semantics with a full LLM workflow guide. It repeats similar instructions in the workflow, the 'IMPORTANT INSTRUCTIONS FOR LLM' section, and the 'KEY ANALYSIS POINTS' section, and the numbered list even has two separate '4.' items. It is front-loaded with purpose but far from concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should clarify what the tool returns, yet it only says 'current page structure' without describing the actual shape or fields. While the workflow context is extensive, the description does not fully prepare an agent to interpret the tool's response, especially since focusArea behavior and error cases are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage with descriptions for both 'url' and 'focusArea', so the baseline is 3. The description only mentions calling the tool 'with the URL' and adds no extra meaning for either parameter; in particular, focusArea is never discussed in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb and object: 'Extract detailed page structure to prepare for mockup comparison and experience generation.' It also explicitly labels the tool as 'the FIRST STEP' in the mockup-to-experience workflow and distinguishes it from the deployment tool createActivityFromModifications, so an agent can tell what it is and is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states when to use the tool: when a user provides a mockup/screenshot and wants to create an experience. It gives a concrete workflow sequence, including asking for a URL before invoking the tool and only calling createActivityFromModifications after user approval. It lacks explicit 'do not use when...' alternatives, which prevents a 5, but the context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getOfferB

Get details of a specific offer

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesOffer ID

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the behavioral burden. It implies a read-only operation from 'Get,' but it does not disclose response structure, error behavior, authentication needs, or whether any side effects occur.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear, front-loaded sentence with no filler. Every word contributes to conveying the tool's core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter getter, the description provides the essential purpose, and the schema covers the parameter. However, with no output schema and no usage context versus sibling list tools, it leaves minor but real gaps about what 'details' are returned and when to choose this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the 'id' parameter described as 'Offer ID.' The description adds little beyond the schema, but since the schema already fully documents the parameter, the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description says 'Get details of a specific offer,' which is a clear verb plus resource. It distinguishes from siblings like listOffers or createOffer by implying single-item retrieval by ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus listOffers, createOffer, or updateOffer. The description only states what it does, not when it should be preferred over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getRevisionsA

Get all revisions (audit log) for a specific resource type, filtered by author's name and optionally by modified-after timestamp (defaults to last 1 day)

ParametersJSON Schema
NameRequiredDescriptionDefault
modifiedAtNoOptional modified-after timestamp in ISO-8601 format (e.g., "2024-01-01T00:00:00Z"). Defaults to last 1 day if not provided.
modifiedByYesAuthor's name to filter revisions
revisionResourceTypeYesEntity type to fetch revisions for

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It does this reasonably well by indicating a read-only audit retrieval, the default one-day window, and the optional timestamp filter. It does not disclose pagination or ordering, but these are not critical for this simple getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the core action and then efficiently adds the filtering dimensions and default behavior. There is no redundant wording or unnecessary background.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The core purpose and parameters are covered well, and the schema fills in the remaining parameter details. However, there is no output schema and no distinction from getEntityRevisions, leaving the agent without information about return shape and sibling selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are fully documented in the input schema, so the schema already provides most of the semantics. The description adds only minor context about 'resource type' and 'author's name' filtering, which mostly restates the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation: getting all revisions/audit log entries for a resource type, filtered by author and optionally by timestamp. It is specific enough to understand the tool's main purpose, though it does not explicitly differentiate it from the similarly named sibling getEntityRevisions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: call this when you need revision/audit history for a resource type, filtered by author and optionally by modified-after time. However, the description gives no explicit guidance about when not to use it or when to prefer the similar getEntityRevisions sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getXTOrdersReportA

Get orders report data for an Experience Targeting (XT) activity, including conversion metrics and order information

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesActivity ID
reportIntervalNoOptional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00")

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. 'Get' implies a non-mutating read operation, but the description does not disclose access requirements, refresh behavior, or potential side effects. It adds only return-content hints beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence with the action and resource front-loaded, and no significant fluff. The minor redundancy between 'report data' and 'order information' is negligible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter report tool with no output schema, the description gives the essential purpose and a hint of return content, but it omits useful context such as the default behavior when reportInterval is omitted and how this report differs from sibling report tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add parameter-level detail beyond the schema, though it does clarify that the report includes conversion metrics and order information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') and resource ('orders report data for an Experience Targeting (XT) activity'), and specifies content ('conversion metrics and order information'), making its purpose clear and distinguishable from generic report or activity tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly identifies the target scenario (XT activity orders report), but does not explicitly state when to prefer it over sibling tools like getABOrdersReport or getXTPerformanceReport, nor any exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

getXTPerformanceReportA

Get performance report for an Experience Targeting (XT) activity with metrics, conversions, and visitor data

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesActivity ID
reportIntervalNoOptional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00")

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It does convey that this is a read-style report operation and lists the categories of data returned, which is useful. Still, it does not explain whether the report is computed live or cached, how the optional date range impacts the report, or what happens when no data exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One clean, front-loaded sentence with no filler. The verb, resource, activity type, and report contents are all present, and every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool this is reasonably complete: it explains the purpose, resource, and high-level return contents. However, with no output schema and no annotations, the description could have added more precision about report fields or date-range behavior, which is a small but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters clearly. The description adds no additional parameter-specific meaning beyond what is already in the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific operation (get), the exact resource (performance report), and the target activity type (Experience Targeting/XT). The mention of metrics, conversions, and visitor data further distinguishes it from sibling report tools such as getABPerformanceReport, getAPTPerformanceReport, and getXTOrdersReport.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for an Experience Targeting (XT) activity' provides a clear condition for when to use this tool, and sibling names make alternatives apparent. However, it does not explicitly call out when not to use it or name alternative tools, so it falls just short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listActivitiesA

List all Target activities with optional filtering and sorting

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of activities to return
offsetNoNumber of activities to skip
sortByNoField to sort by (e.g., "id", "name", "state")

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It correctly implies a read-only list operation and mentions optional filtering/sorting, but it leaves out behavioral details such as pagination defaults, whether archived/inactive activities are included, or how filtering is actually expressed given the schema only exposes limit, offset, and sortBy. This is a moderate transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence with no redundant content. It front-loads the core purpose and immediately conveys the optional capabilities, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation with three optional and well-documented parameters, this description plus the schema is enough for correct invocation. It does not describe the return shape or pagination behavior, but no output schema exists and the operation is low-risk, so these omissions are not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: limit, offset, and sortBy each have clear descriptions. The tool description adds no parameter-level detail and only vaguely references 'filtering/sorting', which could even be slightly misleading since there are no explicit filter parameters. With full schema coverage, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'List' and resource 'Target activities', and notes optional filtering/sorting. This clearly distinguishes it from sibling tools like listProperties (different resource) and getABActivity (singular fetch). It is not a tautology and gives the agent an exact sense of scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what the tool does but gives no guidance on when to choose it over alternatives. It does not mention getABActivity for retrieving a single activity or listProperties for properties, nor does it provide any when-not-to-use conditions. The only signal is the inherent 'list' framing, so usage context is effectively undirected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listAudiencesA

List all audiences available in Adobe Target.

USAGE: Use this tool to retrieve available audiences when creating activities with audience targeting. Each audience object contains an 'id' (number) and 'name' (string) that you can display to the user.

WORKFLOW:

  1. Call this tool to get list of audiences

  2. Present audiences to user in a clear format (e.g., "1) Mobile Users (ID: 12345), 2) Desktop Users (ID: 67890)")

  3. User selects audience by name or number

  4. Extract the audience ID from the selected audience

  5. Pass the ID(s) to createActivityFromModifications via the audienceIds parameter

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of audiences to return
offsetNoNumber of audiences to skip

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It states that returned objects contain 'id' and 'name' and implies a read-only list operation, but it does not explain pagination behavior, default limit/offset semantics, or any side effects. This is a meaningful gap for a tool that has limit/offset parameters yet says 'all audiences.'

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with USAGE and WORKFLOW sections, front-loading the purpose and then giving action-able steps. Some redundancy exists (step 1 restates the first sentence), but the overall organization is effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although there is no output schema, the description explains the key return fields (id, name) and provides a full integration workflow ending with createActivityFromModifications. It could be more complete by addressing pagination/defaults, but it covers the core usage scenario sufficiently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit and offset are already documented. The description does not add default values or clarify how the parameters interact with 'all audiences,' providing only baseline value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence, 'List all audiences available in Adobe Target,' states a specific verb and resource. This clearly distinguishes it from sibling list tools like listProperties and listMboxes, and the follow-up workflow reinforces the resource and purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it: 'when creating activities with audience targeting.' It does not mention exclusions or alternatives (e.g., when to use createAudience instead), but the intended context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listMboxesA

List all mboxes

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral disclosure burden. 'List all mboxes' does communicate a read-only, unfiltered retrieval action, but it does not mention output shape, pagination, potential size, or any other operational behavior. Adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no filler. It states the essential action and scope immediately and wastes no tokens.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-annotation list tool, the description is largely complete: it says what is listed and that it is all items. It could be slightly more complete by mentioning that there is no filtering or by noting the return behavior, but the simplicity of the tool lowers the burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to document. The schema coverage is 100%, and the description does not need to add parameter meaning beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('List') and a specific resource ('all mboxes'), making the tool's purpose unambiguous. The word 'all' also distinguishes it from the sibling tool getMbox, which targets a single mbox.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool should be used when an agent needs the full set of mboxes, but it provides no explicit guidance about alternatives such as getMbox for a single mbox or listMboxProfileAttributes for attributes. Usage is inferred rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listMboxProfileAttributesA

List all profile attributes associated with mboxes in Adobe Target

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. 'List all' conveys a read-only enumeration with no side effects, which is adequate for a zero-parameter tool. However, it adds no context such as pagination, ordering, or the meaning of 'associated with mboxes', leaving minor behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that states the verb and resource with no filler. Every word earns its place; nothing is redundant or missing in terms of brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only enumeration tool, the short description is nearly complete. The only gap is the absence of an output schema and any hint about the return shape, but for a list-all tool the expected return is inferable. Sibling names provide enough context to disambiguate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is an empty object with zero parameters, so there is nothing for the description to explain. Per the rubric, zero-parameter tools receive a baseline of 4, and the description fully suffices since no parameter documentation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource structure: 'List all profile attributes associated with mboxes in Adobe Target'. This clearly distinguishes it from siblings like listMboxes (lists mboxes themselves) and listProperties/listAudiences, so an agent can select it correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use guidance, exclusions, or named alternatives are provided. The usage context is only implied by the resource being described ('profile attributes associated with mboxes'), which requires the agent to infer when this is the right tool versus listMboxes or listProperties.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listOffersC

List all offers

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of offers to return
offsetNoNumber of offers to skip

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden of behavioral disclosure. It communicates a read/list operation but does not mention pagination defaults, ordering, whether 'all' is actually bounded by limit/offset, or the response shape. This is minimal and leaves important behavior implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with no filler, and the verb-resource pair is front-loaded. It is appropriately terse for a simple enumeration tool, though it sacrifices informative content for brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two optional parameters fully covered by the schema, this is minimally sufficient to make a basic call. However, with no output schema and no annotations, the agent must infer return format and pagination behavior, so the description is not fully complete on its own.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters, limit and offset, are fully described in the input schema, giving 100% schema description coverage. The tool description adds no parameter-level detail beyond that, so it earns the baseline score for relying on the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('List') and resource ('offers'), so an agent can identify this as the enumeration endpoint for offers. It doesn't differentiate from sibling list tools like listProperties or listAudiences, and 'all' is slightly inconsistent with the pagination parameters, but the core purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus alternatives such as getOffer, listProperties, or listAudiences. No exclusions, prerequisites, or recommended conditions are provided, leaving the agent to infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listPropertiesC

List all properties

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. 'List all properties' implies a read-only operation but does not disclose pagination, response format, authorization requirements, or whether there are any limits. Minimal behavioral context is provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short and front-loaded, but it is under-specified. Every word earns its place, yet the brevity comes at the cost of meaningful context, making it merely adequate rather than well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description should provide more context about what properties are and what the response looks like. For a simple zero-parameter list tool it is minimally callable, but an agent would have no idea what to expect from the result or how it fits into the larger API.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to explain. The baseline of 4 applies because schema coverage is effectively complete and no parameter semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action and resource ('List all properties'), so it is not a complete tautology. However, 'properties' is undefined and the description adds almost no detail beyond the tool name, making the purpose somewhat vague despite being grammatically clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance about when to use this tool versus sibling list tools like listActivities, listOffers, or listMboxes. An agent is left to infer that 'properties' is a distinct resource, but no explicit context or exclusions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

listResponseTokensB

Retrieve list of response tokens, including built-in and custom tokens with their active status

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose the return contents (built-in and custom tokens with active status) and 'Retrieve' implies a read-only operation, but it omits details like whether only active tokens are returned, pagination, auth requirements, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler: the verb and resource come first, followed by the inclusion criteria. Every word adds meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool, the description conveys the core purpose and the contents of the result. However, with no output schema and no annotations, an agent is left without any expectation of the response shape, fields, or pagination behavior, so a bit more detail would make it fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so there are no parameter semantics the description must clarify. Per the baseline for 0-param tools, this dimension is adequately served.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Retrieve list') and names the resource ('response tokens'), adding useful scope: built-in and custom tokens and their active status. It differentiates from sibling list tools like listProperties, listAudiences, and listOffers by naming the exact resource, though it doesn't explicitly contrast with the likely single-token sibling getResponseTokens.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is provided. The description never mentions alternatives such as getResponseTokens for fetching a single token, nor any exclusions or conditions that would route an agent to this tool over the many siblings in the same family.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

updateABActivityA

Update an existing A/B Test activity definition. This can change the state, behavior, and configuration of an existing activity.

DEFAULT VALUES: This tool automatically applies default values from your configuration for any missing fields:

  • priority: Defaults to 5

  • workspace: Uses TARGET_WORKSPACE_ID if configured

  • analytics (A4T): Auto-fills dataCollectionHost and reportSuites if configured

  • metrics defaults: action type, success mboxes, etc.

You can override any default by explicitly providing the value.

USE CASES:

  • Modify activity name, priority, or configuration

  • Update experiences, locations, or metrics

  • Change activity state (saved, approved, deactivated)

  • Update dates (startsAt, endsAt)

  • Modify audience targeting or reporting audiences

NOTE: For ONLY changing activity state (saved/approved/deactivated), use updateActivityState tool instead. This tool is for full activity definition updates.

ACTIVITY STATES:

  • saved: Inactive state (for draft activities)

  • approved: Activity is live (requires startsAt and endsAt dates)

  • deactivated: Archived

  • deleted: Removed from UI

STATE BEHAVIOR WITH DATES (when state is "approved"):

  • startsAt in past + endsAt in future = Live

  • startsAt in past + endsAt in past = Ended

  • startsAt in future + endsAt in future = Scheduled

IMPORTANT NOTES:

  • 15-minute latency between API and UI

  • Activity stays in API-set state even if UI status changes (e.g., if you set to "approved" and end date passes, UI shows "Ended" but state remains "approved")

  • Workspace ID required for premium customers (must have "approver" privilege)

  • Provide complete activity object - this is a PUT request that replaces the existing definition

TYPICAL UPDATE STRUCTURE: { "id": 123456, "name": "Updated Activity Name", "state": "saved" | "approved", "priority": 5, "startsAt": "2024-01-01T00:00:00Z", // required if state is "approved" "endsAt": "2024-12-31T23:59:59Z", // required if state is "approved" "locations": { "mboxes": [ { "name": "target-global-mbox", "experiences": [...] } ] }, "experiences": [...], "metrics": [...], "workspace": "workspaceId" // for premium customers }

OPTIONAL FIELDS:

  • entryConstraint (visitor percentage, mbox constraints)

  • reportingAudiences

  • analytics (A4T integration)

  • propertyIds

  • views (for SPA)

  • applicationContext (channel, device type, etc.)

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesActivity ID
activityYesComplete updated activity definition object (PUT request - replaces existing definition)

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it exceeds it. It discloses that this is a PUT request that replaces the existing definition, explains default value application, notes 15-minute API-to-UI latency, and warns that the activity state in the API may diverge from UI status. It also flags workspace privilege requirements for premium customers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but extremely well-structured with clear headers for defaults, use cases, states, behavioral notes, and a typical structure. Every section adds necessary information for correctly calling the tool, and the most critical facts (PUT semantics, defaults, state behavior) are front-loaded. Nothing feels redundant or irrelevant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complex tool with nested objects and no output schema or annotations, yet the description covers defaults, required fields per state, state transitions, latency, permissions, and optional configuration fields. An agent has enough context to construct a valid request and anticipate system behavior. The only missing piece is return value details, but that is acceptable given the complexity and lack of output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already describes both parameters at 100% coverage, the description adds substantial meaning: it clarifies that 'activity' contains a complete definition object, provides a typical update structure, lists optional fields, and explains required dates for approved state. This goes well beyond the schema's minimal 'Activity ID' and 'Complete updated activity definition object' descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it updates an existing A/B Test activity definition, with a specific verb and resource, and lists concrete use cases. It explicitly distinguishes itself from updateActivityState, saying that tool is for state-only changes whereas this one is for full definition updates. This removes ambiguity about which sibling tool to use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance via a USE CASES section and names the alternative tool for state-only changes. It also gives activity state definitions and state-with-dates behavior, so an agent knows exactly when to invoke this tool versus updateActivityState. This is strong, actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

updateActivityStateC

Update the state of an activity (approved, deactivated, saved)

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesActivity ID
stateYesNew state - "approved" (Live), "deactivated" (Inactive), or "saved"

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden of behavioral disclosure. It only states that the state is updated and lists the possible values; it does not explain whether transitions are restricted, whether the operation is reversible, what effects each state has on visibility, or what happens side-effect-wise.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler, and the primary action is front-loaded. It includes the essential state values without unnecessary elaboration, making it appropriately concise for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter mutation, the description is minimally adequate, but there are clear gaps. It omits usage guidance relative to the many sibling tools, transition constraints, side effects, and any indication of the response or error behavior, which matters more because no output schema or annotations are provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters already have meaningful descriptions: 'Activity ID' and the state enum with its values. The description adds no new parameter semantics beyond naming the state values, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action: 'Update the state of an activity' and lists the three supported states, making the tool's purpose immediately understandable. It is distinguishable from the sibling updateABActivity by narrowing the scope to state changes, though it doesn't explicitly name or contrast the sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus updateABActivity or other activity tools. There is also no mention of prerequisites, transition rules, or scenarios where this tool should or shouldn't be used, so the agent must infer usage from the name and schema alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

updateOfferA

Update an existing offer. This is a PUT request that updates the offer's name and/or content.

IMPORTANT: The 'name' parameter is REQUIRED by the Adobe Target API. Even if you're only updating the content, you must provide the current or new name.

WORKFLOW:

  1. To update content only: Provide id, current name, and new content

  2. To update name only: Provide id, new name, and current content

  3. To update both: Provide id, new name, and new content

TIP: If you don't know the current name, use getOffer first to retrieve it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesOffer ID to update
nameYesOffer name (REQUIRED - must provide current name even if not changing it)
contentNoUpdated offer content (HTML/CSS/JavaScript)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It discloses that this is a PUT request, that name is unconditionally required by the Adobe Target API, and shows how to preserve current content when updating only the name. Minor omissions such as response shape and permissions are secondary to the key API constraint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured: a one-sentence purpose, an IMPORTANT constraint, numbered workflow steps, and a concise tip. No sentences are filler, and the critical requirement is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter update tool with no output schema or annotations, the description gives enough input semantics and workflow context for an agent to invoke it successfully. It could mention the consequence of omitting content on a name-only update more explicitly, but the workflow strongly implies current content must be supplied to preserve it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining how id, name, and content combine in three distinct update scenarios and by providing a fallback to getOffer for retrieving the current name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Update an existing offer' and details scope as 'name and/or content'. This is a specific verb+resource statement, and 'existing' distinguishes the tool from createOffer/listOffers siblings without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context for when to use the tool and gives concrete workflow scenarios for content-only, name-only, and both. It names getOffer as a prerequisite lookup tool when the current name is unknown, though it does not explicitly contrast with createOffer when the offer is new.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 32 tool updatesv2.0.0
    • First observedcreateABActivity
    • First observedcreateActivityFromModifications
    • First observedcreateAudience
    • First observedcreateJsonOffer
    • First observedcreateOffer
    • First observedcreateResponseToken
    • First observedgenerateDataLayerEvent
    • First observedgeneratePreviewScript
    • First observedgetABActivity
    • First observedgetABOrdersReport
    • First observedgetABPerformanceReport
    • First observedgetActivityInsights
    • First observedgetAPTPerformanceReport
    • First observedgetAtjsSettings
    • First observedgetAtjsVersions
    • First observedgetEntityRevisions
    • First observedgetMbox
    • First observedgetMockupAnalysisInstructions
    • First observedgetOffer
    • First observedgetRevisions
    • First observedgetXTOrdersReport
    • First observedgetXTPerformanceReport
    • First observedlistActivities
    • First observedlistAudiences
    • First observedlistMboxes
    • First observedlistMboxProfileAttributes
    • First observedlistOffers
    • First observedlistProperties
    • First observedlistResponseTokens
    • First observedupdateABActivity
    • First observedupdateActivityState
    • First observedupdateOffer

TDQS

B3/5.0

Scored across 32 tools

Disambiguation3/5

Several tools occupy overlapping conceptual space: createABActivity and createActivityFromModifications are both permanently-locked activity creation paths with similar warnings, and the many performance/orders report tools plus getEntityRevisions/getRevisions can be confused. The extensive descriptions help, but an agent must read a lot of text to safely choose among them.

Naming Consistency4/5

Names follow a consistent verb-first camelCase pattern (list*, get*, create*, update*), which is predictable and easy to scan. Minor deviations like createActivityFromModifications instead of createXTActivity, getAtjsSettings capitalization, and getMockupAnalysisInstructions break strict symmetry but are not chaotic.

Tool Count2/5

32 tools is heavy for a single MCP server, especially with separate per-activity-type report tools, two locked activity-creation tools, and two revision tools. It is not an extreme 50+ surface, but it clearly exceeds the range where each tool's role remains immediately obvious.

Completeness3/5

Core workflows are covered: offers support create/get/list/update, A/B activities support create/get/list/update/state, and reporting spans A/B, XT, and APT. However, lifecycle coverage has notable gaps—no delete for offers/audiences/response tokens, no update for audiences, and XT activities lack dedicated get/update tooling beyond the discouraged createActivityFromModifications.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A full-featured MCP server for Adobe Experience Manager that enables non-technical users to manage AEM content, components, assets, and workflows via natural language through any MCP-compatible client.
    181 npm
    4
    AGPL 3.0
  • A
    license
    Not graded
    quality
    A
    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.
    102 npm
    Apache 2.0