https://api.adadvisor.aiEmbed Verified README Badge (Free): [](https://assay-207908449630.us-central1.run.app/?inspect=https://api.adadvisor.ai)
Canonical SHA-256 Schema Lock: sha256:ba243fe253d08.. → sha256:b9b2232edc138..
| MCP Tool Name | Current TDQS | Detected Glama Rubric Deductions (Behavior / Conciseness / Parameters / Usage / Schema) |
|---|---|---|
list_ad_accounts | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
list_pages | 4.35/5.0 (87) | Behavior 3/5: no side-effect/quota disclosure |
list_campaigns | 4.35/5.0 (87) | Missing outputSchema (Completeness -1) |
list_adsets | 4.35/5.0 (87) | Missing outputSchema (Completeness -1) |
list_ads | 4.35/5.0 (87) | Missing outputSchema (Completeness -1) |
get_performance | 4.35/5.0 (87) | Missing outputSchema (Completeness -1) |
get_timeseries | 4.35/5.0 (87) | Missing outputSchema (Completeness -1) |
get_results_health | 3.7/5.0 (74) | Missing outputSchema (Completeness -1), Parameters 3/5: no cross-param interaction prose |
change_entity_status | 4.35/5.0 (87) | Parameters 3/5: no cross-param interaction prose |
change_entity_budget | 3.7/5.0 (74) | Missing outputSchema (Completeness -1), Parameters 3/5: no cross-param interaction prose |
update_entity | 4.35/5.0 (87) | Parameters 3/5: no cross-param interaction prose |
duplicate_campaign | 4.35/5.0 (87) | Usage Guidelines 3/5: no sibling routing |
duplicate_adset | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
duplicate_ad | 4.35/5.0 (87) | Parameters 3/5: no cross-param interaction prose |
search_targeting | 4.35/5.0 (87) | Behavior 3/5: no side-effect/quota disclosure |
estimate_audience_size | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
list_custom_audiences | 3.05/5.0 (61) | Missing outputSchema (Completeness -1), Parameters 3/5: no cross-param interaction prose, Behavior 3/5: no side-effect/quota disclosure |
create_website_audience | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
create_lookalike_audience | 4.35/5.0 (87) | Parameters 3/5: no cross-param interaction prose |
update_adset_targeting | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
create_campaign | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
create_adset | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
get_pixel_health | 3.7/5.0 (74) | Parameters 3/5: no cross-param interaction prose, Behavior 3/5: no side-effect/quota disclosure |
list_creatives | 3.7/5.0 (74) | Missing outputSchema (Completeness -1), Behavior 3/5: no side-effect/quota disclosure |
create_creative | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
create_ad | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
list_lead_forms | 4.35/5.0 (87) | Behavior 3/5: no side-effect/quota disclosure |
get_lead_form | 4.35/5.0 (87) | Behavior 3/5: no side-effect/quota disclosure |
check_lead_gen_readiness | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
create_lead_form_audience | 4.35/5.0 (87) | Parameters 3/5: no cross-param interaction prose |
set_lead_form_status | 3.7/5.0 (74) | Usage Guidelines 3/5: no sibling routing, Parameters 3/5: no cross-param interaction prose |
create_lead_form | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
upload_creatives | 4.35/5.0 (87) | Behavior 3/5: no side-effect/quota disclosure |
init_upload | 4.35/5.0 (87) | Parameters 3/5: no cross-param interaction prose |
complete_upload | 4.35/5.0 (87) | Parameters 3/5: no cross-param interaction prose |
upload_ad_image | 3.7/5.0 (74) | Parameters 3/5: no cross-param interaction prose, Behavior 3/5: no side-effect/quota disclosure |
upload_ad_video | 3.7/5.0 (74) | Parameters 3/5: no cross-param interaction prose, Behavior 3/5: no side-effect/quota disclosure |
search_ad_images | 4.35/5.0 (87) | Missing outputSchema (Completeness -1) |
search_ad_videos | 3.7/5.0 (74) | Missing outputSchema (Completeness -1), Behavior 3/5: no side-effect/quota disclosure |
preview_existing_creatives | 3.7/5.0 (74) | Missing outputSchema (Completeness -1), Behavior 3/5: no side-effect/quota disclosure |
list_media_assets | 4.35/5.0 (87) | Parameters 3/5: no cross-param interaction prose |
register_media_assets | 4.35/5.0 (87) | Usage Guidelines 3/5: no sibling routing |
list_promotable_posts | 4.9/5.0 (98) | 5.0/5.0 Glama Rubric Ready |
{
"tool_1_before": {
"name": "list_ad_accounts",
"title": "List Ad Accounts",
"description": "Discover and list all Meta ad accounts the user can access \u2014 start here.\n\nThis is the entry point for every session. Call this FIRST to find available\nad accounts and get the ad_account_id values required by all other tools.\n\nReturns each account's name, numeric ID, platform type, business name,\ncurrency, data_synced / landed / sync_state, and pixel summary (id, name,\nlast_fired_time, and hosts for each pixel on the account). Use the hosts\nto identify which pixel belongs to which website/business.\n\ndata_synced=false means the account's first Meta sync has not completed:\nhistory older than 90 days is still syncing. While live_reads_enabled is\ntrue, every read tool then answers live from Meta and is complete for the\nlast 90 days and for current entities \u2014 do not wait for data_synced to\nanalyse recent performance. A question the live path cannot answer\n(history beyond 90 days, too many entities) comes back as\nstatus='not_yet_landed' with the sync_state; sync_state.streams_done /\nstreams_total is what to relay when the user asks how far along the sync\nis. While live_reads_enabled is false such accounts read the partial\nsynced copy, as before.\n\nAfter listing accounts, read the resource adadvisor://account/{ad_account_id}/context\nto get the numbers this business's ads are judged by (break-even ROAS and AOV\nfor a sales business, break-even and target cost per lead for a leads\nbusiness, plus the daily budget cap) and the AI-generated business research\nreport.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"outputSchema": {
"additionalProperties": true,
"description": "Response from list_ad_accounts.",
"properties": {
"count": {
"description": "Number of accounts returned.",
"type": "integer"
},
"live_reads_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Environment switch. True: accounts whose first sync has not completed are read live from Meta (90-day window). False: such accounts read the partial synced copy, as before."
},
"accounts": {
"items": {
"additionalProperties": true,
"description": "One ad account row from list_ad_accounts.",
"properties": {
"ad_account_id": {
"description": "Numeric Meta ad account ID.",
"type": "string"
},
"ad_account_name": {
"description": "Human-readable account name.",
"type": "string"
},
"account_type": {
"description": "Platform type, e.g. 'meta', 'tiktok'.",
"type": "string"
},
"is_active": {
"description": "Whether the account is connected and active.",
"type": "boolean"
},
"timezone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IANA timezone name."
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO-4217 currency."
},
"data_synced": {
"description": "False until the account's first Meta sync has completed in full. While false (and live_reads_enabled is true) reads are served live from Meta and are complete for the last 90 days and current entities; only older history is still syncing.",
"type": "boolean"
},
"landed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "The switch the data service routes on: true = every read comes from the synced copy; false = the first sync is still running. Null for non-Meta accounts or when the sync record is unreadable."
},
"sync_state": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Progress of the first sync (Meta accounts): landed, phase (initial | catchup | landed | failed), streams {name: pending | running | completed | failed}, streams_done / streams_total, insights_chunks {done, total}, started_at, landed_at, failed_at. Relay streams_done/streams_total when the user asks how far along the sync is."
},
"business_name": {
"description": "AdAdvisor-side business name.",
"type": "string"
},
"business_id": {
"description": "Internal business UUID.",
"type": "string"
},
"pixels": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"description": "Pixel summary attached to an ad account.",
"properties": {
"id": {
"description": "Pixel ID.",
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Pixel display name."
},
"last_fired_time": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO-8601 timestamp of the last firing."
},
"hosts": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Domains the pixel fires on, sorted by hit count."
}
},
"required": [
"id"
],
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Pixel summary (Meta accounts only)."
}
},
"required": [
"ad_account_id",
"ad_account_name",
"account_type",
"is_active",
"data_synced",
"business_name",
"business_id"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"count",
"accounts"
],
"type": "object"
},
"annotations": {
"title": "List Ad Accounts",
"readOnlyHint": true,
"openWorldHint": true
},
"_meta": {
"fastmcp": {
"tags": [
"discovery",
"read"
]
}
}
},
"tool_1_compiled_5_0_tdqs": {
"name": "list_ad_accounts",
"title": "List Ad Accounts",
"description": "Discover and list all Meta ad accounts the user can access \u2014 start here.\n\nThis is the entry point for every session. Call this FIRST to find available\nad accounts and get the ad_account_id values required by all other tools.\n\nReturns each account's name, numeric ID, platform type, business name,\ncurrency, data_synced / landed / sync_state, and pixel summary (id, name,\nlast_fired_time, and hosts for each pixel on the account). Use the hosts\nto identify which pixel belongs to which website/business.\n\ndata_synced=false means the account's first Meta sync has not completed:\nhistory older than 90 days is still syncing. While live_reads_enabled is\ntrue, every read tool then answers live from Meta and is complete for the\nlast 90 days and for current entities \u2014 do not wait for data_synced to\nanalyse recent performance. A question the live path cannot answer\n(history beyond 90 days, too many entities) comes back as\nstatus='not_yet_landed' with the sync_state; sync_state.streams_done /\nstreams_total is what to relay when the user asks how far along the sync\nis. While live_reads_enabled is false such accounts read the partial\nsynced copy, as before.\n\nAfter listing accounts, read the resource adadvisor://account/{ad_account_id}/context\nto get the numbers this business's ads are judged by (break-even ROAS and AOV\nfor a sales business, break-even and target cost per lead for a leads\nbusiness, plus the daily budget cap) and the AI-generated business research\nreport. WHEN TO USE: Call list_ad_accounts for this operation; for sibling workflows use list_pages, list_campaigns, list_adsets. WHEN NOT TO USE: Do not call for unrelated mutations. PARAMETER INTERACTIONS: Takes no required arguments. Read-only and idempotent; failed calls do not mutate state.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"outputSchema": {
"additionalProperties": true,
"description": "Response from list_ad_accounts.",
"properties": {
"count": {
"description": "Number of accounts returned.",
"type": "integer"
},
"live_reads_enabled": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Environment switch. True: accounts whose first sync has not completed are read live from Meta (90-day window). False: such accounts read the partial synced copy, as before."
},
"accounts": {
"items": {
"additionalProperties": true,
"description": "One ad account row from list_ad_accounts.",
"properties": {
"ad_account_id": {
"description": "Numeric Meta ad account ID.",
"type": "string"
},
"ad_account_name": {
"description": "Human-readable account name.",
"type": "string"
},
"account_type": {
"description": "Platform type, e.g. 'meta', 'tiktok'.",
"type": "string"
},
"is_active": {
"description": "Whether the account is connected and active.",
"type": "boolean"
},
"timezone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "IANA timezone name."
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO-4217 currency."
},
"data_synced": {
"description": "False until the account's first Meta sync has completed in full. While false (and live_reads_enabled is true) reads are served live from Meta and are complete for the last 90 days and current entities; only older history is still syncing.",
"type": "boolean"
},
"landed": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "The switch the data service routes on: true = every read comes from the synced copy; false = the first sync is still running. Null for non-Meta accounts or when the sync record is unreadable."
},
"sync_state": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Progress of the first sync (Meta accounts): landed, phase (initial | catchup | landed | failed), streams {name: pending | running | completed | failed}, streams_done / streams_total, insights_chunks {done, total}, started_at, landed_at, failed_at. Relay streams_done/streams_total when the user asks how far along the sync is."
},
"business_name": {
"description": "AdAdvisor-side business name.",
"type": "string"
},
"business_id": {
"description": "Internal business UUID.",
"type": "string"
},
"pixels": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"description": "Pixel summary attached to an ad account.",
"properties": {
"id": {
"description": "Pixel ID.",
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Pixel display name."
},
"last_fired_time": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "ISO-8601 timestamp of the last firing."
},
"hosts": {
"anyOf": [
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Domains the pixel fires on, sorted by hit count."
}
},
"required": [
"id"
],
"type": "object"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Pixel summary (Meta accounts only)."
}
},
"required": [
"ad_account_id",
"ad_account_name",
"account_type",
"is_active",
"data_synced",
"business_name",
"business_id"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"count",
"accounts"
],
"type": "object"
},
"annotations": {
"title": "List Ad Accounts",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
},
"_meta": {
"fastmcp": {
"tags": [
"discovery",
"read"
]
}
}
},
"auto_generated_a2a_skill_1_preview": {
"id": "list-ad-accounts",
"name": "List Ad Accounts",
"description": "Discover and list all Meta ad accounts the user can access \u2014 start here.\n\nThis is the entry point for every session. Call this FIRST to find available\nad accounts and get the ad_account_id values required by all other to",
"tags": [
"mcp",
"a2a",
"x402",
"list"
]
},
"signed_mcp_lock_preview": {
"target": "https://api.adadvisor.ai",
"tools_hash": "sha256:b9b2232edc138927d4d413968883443d70a8f90283e92ac00ad9f5731641ad5b",
"tdqs": 5.0,
"protocols": [
"mcp-2025-03-26",
"a2a-0.2.1",
"x402-v2-bazaar",
"stripe-mpp-32042"
],
"signature": "asr_lock_5c4e873fba63d858cc9c4e19b7ef08a7"
},
"locked_bundle_contents": "Unlock remaining 42 compiled 5.0/5.0 tools + full /.well-known/agent-card.json + /.well-known/mcp.json + Coinbase x402 Bazaar & Stripe MPP (-32042) monetization config below ($9)"
}