Adobe Target MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Adobe Target MCPCreate a new A/B test activity for the homepage"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-mcp2. Install Dependencies
npm installDependencies installed:
@modelcontextprotocol/sdk@^1.0.4- MCP protocol implementationdotenv@^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
npxwhen adobe-target-mcp is configuredRequires 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_count5. 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
chrome-devtools-mcp (auto-installed via npx)
Purpose: Live browser control, DOM analysis, screenshots
Installation: Automatic on first run via
npx -y chrome-devtools-mcpRequirements: 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 fileAvailable Tools
Activities (5 tools)
listActivities- List all Target activities with filteringcreateABActivity- Create A/B test (API-only, advanced use)getABActivity- Get activity details by IDupdateABActivity- Update activity configurationupdateActivityState- Activate, pause, or deactivate activities
Offers (5 tools)
listOffers- List all offers with filteringcreateOffer- PRIMARY TOOL - Create HTML offer (use for 95% of cases)createJsonOffer- Create JSON offer for SPAs, server-side, mobile apps, headlessgetOffer- Get offer details by IDupdateOffer- Update offer content
Audiences (2 tools)
listAudiences- List all audiencescreateAudience- Create new audience with rules
Mboxes (3 tools)
listMboxes- List all mboxesgetMbox- Get mbox detailslistMboxProfileAttributes- List profile attributes for mbox
Properties (1 tool)
listProperties- List Target properties
Reports (6 tools)
getABPerformanceReport- A/B test performance metricsgetABOrdersReport- A/B test order/revenue datagetXTPerformanceReport- Experience Targeting performancegetXTOrdersReport- Experience Targeting ordersgetAPTPerformanceReport- Automated Personalization performancegetActivityInsights- Activity insights and recommendations
Response Tokens (2 tools)
listResponseTokens- List all response tokenscreateResponseToken- Create custom response token
at.js Configuration (2 tools)
getAtjsSettings- Get at.js settingsgetAtjsVersions- List available at.js versions
Revisions (2 tools)
getRevisions- List all activity revisionsgetEntityRevisions- 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 supportcreateActivityFromModifications- Create Target activity from JavaScript modifications (advanced use, API limitations apply)generatePreviewScript- Generate preview script for Chrome DevTools MCP injectiongetMockupAnalysisInstructions- Get instructions for mockup analysis and experience generation workflow
License
MIT License - See LICENSE file
Links
Available Tools
32 toolscreateABActivityA
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):
Create offers using createOffer tool (HTML) or createJsonOffer tool (JSON)
Provide user with offer IDs
User manually builds A/B activity in Target UI with full editing flexibility
DO NOT USE THIS TOOL UNLESS:
User is creating 10+ activities in bulk (programmatic bulk creation)
This is part of an automated CI/CD workflow
User has been EXPLICITLY WARNED that activities cannot be edited in Target UI
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:
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
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
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:
Go to Adobe Target → Activities → Create Activity → A/B Test
Choose Form-Based Experience Composer
Add experiences and select these offer IDs
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Activity name | |
| activity | Yes | Full A/B Test activity definition object with locations, experiences, metrics, and optional fields |
TDQS
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.
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.
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.
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.
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.
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):
Create offers using createOffer tool (HTML) or createJsonOffer tool (JSON)
Provide user with offer IDs
User manually builds XT activity in Target UI with full editing flexibility
DO NOT USE THIS TOOL UNLESS:
User is creating 10+ activities in bulk (programmatic bulk creation)
This is part of an automated CI/CD workflow
User has been EXPLICITLY WARNED that activities cannot be edited in Target UI
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:
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
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
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:
Go to Adobe Target → Activities → Create Activity → Experience Targeting
Choose Form-Based Experience Composer
Add experiences and select these offer IDs
Configure audience targeting This gives you full editing flexibility in the Target UI."
CRITICAL WORKFLOW REQUIREMENTS FOR LLM (IF YOU MUST USE THIS TOOL):
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
Generate the modification code following ALL Adobe Target coding rules CRITICAL: NEVER include emojis in generated code, HTML, text, or comments
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:
Navigate to URL
Inject modification code
Resize to 375x667 (mobile)
Ask: "Check mobile view in Chrome. Does it look correct?"
Resize to 1920x1080 (desktop)
Ask: "Check desktop view in Chrome. Does it look correct?"
Only proceed if both viewports are approved
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
NEVER create an activity without previewing it first
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'}); });
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL where the activity should run | |
| name | Yes | Activity name | |
| priority | No | Activity priority (0-999), defaults to 5 | |
| audienceIds | No | Optional: Array of audience IDs to target. If not provided, activity targets All Visitors. Get audience IDs using the listAudiences tool. | |
| modifications | Yes | JavaScript code for the modifications |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Audience name | |
| targetRule | No | Audience targeting rules | |
| description | No | Audience description |
TDQS
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.
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.
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.
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.
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.
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:
Create separate JSON offers for each variation (don't combine in one offer)
Each JSON offer should have consistent schema (same keys, different values)
Your application must handle consuming and applying the JSON data
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:
Go to Adobe Target → Activities → Create Activity → [A/B Test | Experience Targeting | etc.]
Choose Form-Based Experience Composer
Set location to: target-global-mbox (or your preferred mbox)
For Experience A:
Click 'Change Content' → JSON Offer
Search for offer ID: [12345]
Select the offer
Click 'Add Experience' for Experience B
Select offer ID: [67890]
Configure traffic allocation
Set up success metrics
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:
Control - current recommendation algorithm
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:
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
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
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):
Define your JSON structure (e.g., product data, configuration, feature flags)
Create the offer with this tool
Use the returned offer ID in your Target activity
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:
Product Recommendations: { "products": [ {"id": "123", "name": "Widget", "price": 29.99}, {"id": "456", "name": "Gadget", "price": 49.99} ], "layout": "grid" }
Feature Flags: { "features": { "newCheckout": true, "darkMode": false, "beta": true } }
Hero Banner Configuration: { "heading": "Summer Sale", "subheading": "Save up to 50%", "ctaText": "Shop Now", "ctaUrl": "/sale", "imageUrl": "https://example.com/banner.jpg", "backgroundColor": "#FF5733" }
A/B Test Variant Data: { "variant": "B", "buttonColor": "green", "buttonText": "Get Started Now", "headline": "Transform Your Business Today" }
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Offer name (e.g., "Product Recommendations - Summer Sale") | |
| content | Yes | JSON object containing the offer data. Must be a valid JSON object that your application will consume. | |
| workspace | No | Workspace ID (optional). If not provided, uses the default workspace from config (TARGET_WORKSPACE_ID) or the account default workspace. |
TDQS
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.
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.
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.
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.
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.
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:
Call getPageStructureSnippets with extractionType: 'full-page'
Use Chrome DevTools MCP to navigate to the page
Execute the extraction script
Call extractPageStructure to save data and get summary
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:
Generate the offer code following all Adobe Target rules (see ADOBE TARGET CODE GENERATION RULES section)
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
Use Chrome DevTools MCP navigate_to to load the page (IMPORTANT: use timeout of 30000ms)
Use Chrome DevTools MCP evaluate_script to inject the preview script
The page will show a red "Target Preview Active" indicator
Ask the user: "Please review the changes in your browser. Does this look good?"
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:
Create separate offers for each variation (don't combine in one offer)
Each offer should be self-contained and work independently
Control offer can be empty/minimal if testing against current page
Always include tracking code for conversion elements
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:
Go to Adobe Target → Activities → Create Activity → [A/B Test | Experience Targeting | etc.]
Choose Form-Based Experience Composer
Set location to: target-global-mbox (or your preferred mbox)
For Experience A:
Click 'Change Content' → HTML Offer
Search for offer ID: [12345]
Select the offer
Click 'Add Experience' for Experience B (repeat for each variation)
Select offer ID: [67890]
Configure traffic allocation (e.g., 50/50 split for A/B test)
Set up success metrics (conversions, engagement, revenue)
Review audience targeting (if needed for XT)
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:
Control - keeps existing page as-is (no banner)
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:
Control - current button (blue)
Variant A - green button
Variant B - red button
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:
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
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
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:
Go to Adobe Target → Activities → Create Activity → A/B Test
Choose Form-Based Experience Composer
Set location to: {mbox_name} (default: target-global-mbox)
For Experience A (Control):
Click 'Change Content' → HTML Offer
Search for offer ID: {control_offer_id}
Select the offer
Click 'Add Experience' to create Experience B (Variant)
Click 'Change Content' → HTML Offer
Search for offer ID: {variant_offer_id}
Select the offer
Set traffic allocation (default: 50/50 split)
Configure goal/metric (default: Page Views - Engagement)
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:
Go to Adobe Target → Activities → Create Activity → A/B Test
Choose Form-Based Experience Composer
For each experience:
Click 'Change Content' → Create HTML Offer
Paste the code above
Name the offer
Set traffic allocation (default: 50/50 split)
Configure goal/metric (default: Page Views)
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:
Ask user about tag manager preference if not detected automatically (Step 3A.2a or 3B.2a)
Ask user about firing condition (Step 3A.2b or 3B.2b)
Call generateDataLayerEvent tool to get tracking code (Step 3A.3 or 3B.3)
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:
Generate button modification code
Call generateDataLayerEvent(selector: '.at-cta-button', activity_name: 'Hero Test', experience_name: 'Variant A', tag_manager: 'adobeLaunch', firing_condition: 'always')
Include returned tracking code in offer after button code
Show complete offer code to user
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Offer name | |
| content | Yes | Offer content (HTML/CSS/JavaScript). Wrap JavaScript in <script> tags. CSS must be injected via JavaScript, NOT standalone <style> tags. | |
| workspace | No | Workspace ID (optional). If not provided, uses the default workspace from config (TARGET_WORKSPACE_ID) or the account default workspace. |
TDQS
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.
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.
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.
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.
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.
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):
BUILT_IN - System-level tokens (e.g., experience.id, activity.name) Example: { token: "experience.id", type: "BUILT_IN" }
ACTIVITY - Activity-based attributes (e.g., activity.name, campaign.id) Example: { token: "activity.name", type: "ACTIVITY" }
GEO - Geographic data (e.g., geo.city, geo.country) Example: { token: "geo.city", type: "GEO" }
CRS - Customer Record Service attributes Example: { token: "crs.customAttribute", type: "CRS" }
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
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:
Run listResponseTokens to check if the token already exists
If it exists with deletable: false, activate it in Target UI instead
If it doesn't exist, create it with this tool
WORKFLOW FOR SCRIPT TOKENS:
Create profile script in Target UI (Audiences > Profile Scripts)
Use this tool to create response token referencing that script
Response token becomes available in Target responses
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Response token ID (optional) | |
| type | Yes | Token type - see description for details and limitations | |
| token | Yes | Token identifier (e.g., "experience.id", "profile.scriptName", "geo.city") |
TDQS
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.
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.
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.
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.
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.
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:
User creates an experience with a button/link/conversion element
LLM identifies the conversion element selector
LLM asks: "What should I name this activity?" (if not already provided)
LLM asks: "What experience name should I use?" (e.g., "Experience A", "Control", "Variant B")
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)
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.
LLM calls this tool with selector, activity_name, experience_name, tag_manager (auto-detected or selected), and firing_condition
Tool returns ES5-compatible click event listener code with firing condition logic
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
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | CSS selector for the conversion element (button, link, etc.) - e.g., "#cta-button", ".at-signup-btn" | |
| event_name | No | Custom event name (optional). If not provided, uses tag manager default (e.g., "target_conversion" for GTM, "target-conversion" for Adobe Launch) | |
| event_type | No | Type of DOM event to track (default: "click"). Can be "click", "submit", "change", etc. | |
| tag_manager | No | Tag manager to use: "adobeLaunch" (Adobe Launch), "gtm" (Google Tag Manager), "tealium" (Tealium iQ), "segment" (Segment), or "customDataLayer" (Custom implementation). Default: "adobeLaunch" | |
| activity_name | Yes | The name of the Adobe Target activity (should match activity name in Target) | |
| firing_params | No | Parameters for throttle/debounce conditions. For throttle: { interval: 1000 }. For debounce: { delay: 500 }. Values in milliseconds. | |
| experience_name | Yes | The experience name/variant (e.g., "Experience A", "Control", "Variant B", "Green Button") | |
| firing_condition | No | When 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_comments | No | Include explanatory comments in the generated code (default: true) |
TDQS
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.
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.
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.
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.
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.
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:
Before calling this tool, explain to the user what modifications you're about to preview
Show them the specific selectors and changes (e.g., "I'll change the button .cta-primary to have a blue background")
Call this tool to get the preview script
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
Use Chrome DevTools MCP 'evaluate_script' with the provided script to inject the modifications
Ask the user to review the changes visually in their browser
Wait for user approval before creating the activity
This approach uses Chrome DevTools MCP and execute_script for live preview
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL where the preview should be shown | |
| description | Yes | Description of what the modifications do | |
| modifications | Yes | JavaScript code that makes the modifications (CSS changes, text updates, etc.) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Activity ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Activity ID | |
| reportInterval | No | Optional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Activity ID | |
| reportInterval | No | Optional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00") |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| qaUrl | No | Optional URL for generating QA preview links (e.g., "https://www.example.com"). If not provided, QA links will not be generated. | |
| activityName | Yes | Name of the activity (can be partial match) | |
| reportInterval | No | Optional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Activity ID | |
| reportInterval | No | Optional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID (for authorizedHosts, use client ID) | |
| revisionResourceType | Yes | Entity type to fetch revisions for |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| mboxName | Yes | The name of the mbox (e.g., "target-global-mbox", "hero-mbox") |
TDQS
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.
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.
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.
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.
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.
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:
User provides: mockup screenshot + target URL
LLM calls THIS TOOL with the URL to get current page structure
LLM analyzes mockup image (using vision) vs current page data
LLM identifies differences (layout, colors, text, positioning, etc.)
LLM generates ES5 modification code following ALL Adobe Target coding rules
LLM shows user the proposed changes for approval
LLM calls createActivityFromModifications to deploy
IMPORTANT INSTRUCTIONS FOR LLM: When user provides a mockup/screenshot:
Ask user: "What's the URL of the page this mockup is for?"
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 "#")
Call THIS TOOL with the URL
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)
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
Show user the generated code and explain the changes
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
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL of the page to analyze | |
| focusArea | No | Optional: Specific section to focus on (e.g., "hero section", "navigation", "footer"). If not provided, analyzes entire page. |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer ID |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| modifiedAt | No | Optional modified-after timestamp in ISO-8601 format (e.g., "2024-01-01T00:00:00Z"). Defaults to last 1 day if not provided. | |
| modifiedBy | Yes | Author's name to filter revisions | |
| revisionResourceType | Yes | Entity type to fetch revisions for |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Activity ID | |
| reportInterval | No | Optional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Activity ID | |
| reportInterval | No | Optional date range in ISO 8601 format (e.g., "2024-01-01T00:00-07:00/2024-02-01T00:00-07:00") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of activities to return | |
| offset | No | Number of activities to skip | |
| sortBy | No | Field to sort by (e.g., "id", "name", "state") |
TDQS
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.
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.
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.
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.
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.
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:
Call this tool to get list of audiences
Present audiences to user in a clear format (e.g., "1) Mobile Users (ID: 12345), 2) Desktop Users (ID: 67890)")
User selects audience by name or number
Extract the audience ID from the selected audience
Pass the ID(s) to createActivityFromModifications via the audienceIds parameter
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of audiences to return | |
| offset | No | Number of audiences to skip |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of offers to return | |
| offset | No | Number of offers to skip |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Activity ID | |
| activity | Yes | Complete updated activity definition object (PUT request - replaces existing definition) |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Activity ID | |
| state | Yes | New state - "approved" (Live), "deactivated" (Inactive), or "saved" |
TDQS
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.
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.
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.
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.
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.
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:
To update content only: Provide id, current name, and new content
To update name only: Provide id, new name, and current content
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Offer ID to update | |
| name | Yes | Offer name (REQUIRED - must provide current name even if not changing it) | |
| content | No | Updated offer content (HTML/CSS/JavaScript) |
TDQS
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.
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.
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.
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.
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.
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.
32 tool updates
v2.0.0- First observed
createABActivity - First observed
createActivityFromModifications - First observed
createAudience - First observed
createJsonOffer - First observed
createOffer - First observed
createResponseToken - First observed
generateDataLayerEvent - First observed
generatePreviewScript - First observed
getABActivity - First observed
getABOrdersReport - First observed
getABPerformanceReport - First observed
getActivityInsights - First observed
getAPTPerformanceReport - First observed
getAtjsSettings - First observed
getAtjsVersions - First observed
getEntityRevisions - First observed
getMbox - First observed
getMockupAnalysisInstructions - First observed
getOffer - First observed
getRevisions - First observed
getXTOrdersReport - First observed
getXTPerformanceReport - First observed
listActivities - First observed
listAudiences - First observed
listMboxes - First observed
listMboxProfileAttributes - First observed
listOffers - First observed
listProperties - First observed
listResponseTokens - First observed
updateABActivity - First observed
updateActivityState - First observed
updateOffer
TDQS
Scored across 32 tools
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.
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.
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.
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
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that exposes Adobe Marketo REST API operations as tools for AI assistants and MCP clients. It enables comprehensive management of Marketo assets including leads, activities, emails, smart campaigns, and programs.4-
- AlicenseNot gradedqualityDmaintenanceA 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 npm4AGPL 3.0
- AlicenseNot gradedqualityAmaintenanceThe 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 npmApache 2.0
- FlicenseNot gradedqualityBmaintenanceTwo MCP servers that give Claude and any MCP-compatible client natural-language access to Adobe Experience Platform, Adobe Journey Optimizer, and Real-Time CDP.2-