{"serverId":"mcp-registry/com.plainrouter/mcp","tools":[{"name":"actions.rules.create","fixed":{"name":"actions_rules_create","description":"Store a performance rule disabled. Enabling requires an explicit update; this never evaluates or proposes actions.","inputSchema":{"type":"object","required":["name","definition","platform_ad_account_id"],"properties":{"name":{"type":"string","maxLength":255},"limit":{"type":"integer","default":5,"maximum":25,"minimum":1,"description":"Maximum latest revisions; current_revision is always returned separately."},"cursor":{"type":"string","description":"Read older revisions using rule.next_cursor. Continue through actions.rules.show to avoid another write."},"definition":{"type":"object","required":["target_level","action","minimum_counted_arrivals","cost_comparison","cost_ratio"],"properties":{"action":{"enum":["pause","increase_budget","decrease_budget"],"type":"string"},"cost_ratio":{"type":"number","maximum":10,"minimum":0.1,"description":"Target cost per counted arrival divided by whole-account cost per counted arrival."},"target_level":{"enum":["ad","ad_set","campaign"],"type":"string"},"cost_comparison":{"enum":["at_least","at_most"],"type":"string"},"budget_change_percent":{"type":"integer","maximum":50,"minimum":1,"description":"Required for daily-budget changes on ad sets or campaigns; omit for pause. Pause targets only ads or ad sets."},"minimum_counted_arrivals":{"type":"integer","minimum":50,"description":"Counted arrivals on the target. At least 100 for a budget increase."}},"description":"Both arrivals and cost conditions must hold over the last 3 complete days in the account timezone. Supply the complete definition when editing.","additionalProperties":false},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."},"platform_ad_account_id":{"type":"integer","minimum":1}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":true},"title":"Create action rule"},"changes":[{"kind":"name","detail":"Renamed \"actions.rules.create\" → \"actions_rules_create\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":519,"tokensAfter":519},{"name":"actions.rules.list","fixed":{"name":"actions_rules_list","description":"List stored performance rules available to this workspace key. This does not evaluate them.","inputSchema":{"type":"object","properties":{"page":{"type":"integer","maximum":10000000000000000,"minimum":1},"cursor":{"type":"string","description":"Continue using rules.next_cursor; use actions.rules.show for detail."},"per_page":{"type":"integer","default":25,"maximum":100,"minimum":1},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"List action rules"},"changes":[{"kind":"name","detail":"Renamed \"actions.rules.list\" → \"actions_rules_list\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":165,"tokensAfter":165},{"name":"actions.rules.show","fixed":{"name":"actions_rules_show","description":"Read a stored performance rule and its immutable revisions, with author type only.","inputSchema":{"type":"object","required":["rule_id"],"properties":{"limit":{"type":"integer","default":5,"maximum":25,"minimum":1,"description":"Maximum latest revisions; current_revision is always returned separately."},"cursor":{"type":"string","description":"Read older revisions using rule.next_cursor. Continue through actions.rules.show to avoid another write."},"run_id":{"type":"string","description":"Read decisions for one run belonging to this rule."},"rule_id":{"type":"string","pattern":"^[0-7][0-9a-hjkmnp-tv-z]{25}$","description":"The action rule ID."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."},"decisions_cursor":{"type":"string","description":"Continue decisions using runs[].next_cursor; requires run_id."}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Show action rule"},"changes":[{"kind":"name","detail":"Renamed \"actions.rules.show\" → \"actions_rules_show\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":272,"tokensAfter":272},{"name":"actions.rules.update","fixed":{"name":"actions_rules_update","description":"Edit a stored performance rule by appending a revision, or explicitly enable or disable it. This never evaluates or proposes actions.","inputSchema":{"type":"object","required":["rule_id"],"properties":{"name":{"type":"string","maxLength":255},"limit":{"type":"integer","default":5,"maximum":25,"minimum":1,"description":"Maximum latest revisions; current_revision is always returned separately."},"cursor":{"type":"string","description":"Read older revisions using rule.next_cursor. Continue through actions.rules.show to avoid another write."},"enabled":{"type":"boolean","description":"Explicitly enable or disable the stored rule."},"rule_id":{"type":"string","pattern":"^[0-7][0-9a-hjkmnp-tv-z]{25}$","description":"The action rule ID."},"definition":{"type":"object","required":["target_level","action","minimum_counted_arrivals","cost_comparison","cost_ratio"],"properties":{"action":{"enum":["pause","increase_budget","decrease_budget"],"type":"string"},"cost_ratio":{"type":"number","maximum":10,"minimum":0.1,"description":"Target cost per counted arrival divided by whole-account cost per counted arrival."},"target_level":{"enum":["ad","ad_set","campaign"],"type":"string"},"cost_comparison":{"enum":["at_least","at_most"],"type":"string"},"budget_change_percent":{"type":"integer","maximum":50,"minimum":1,"description":"Required for daily-budget changes on ad sets or campaigns; omit for pause. Pause targets only ads or ad sets."},"minimum_counted_arrivals":{"type":"integer","minimum":50,"description":"Counted arrivals on the target. At least 100 for a budget increase."}},"description":"Both arrivals and cost conditions must hold over the last 3 complete days in the account timezone. Supply the complete definition when editing.","additionalProperties":false},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":true},"title":"Update action rule"},"changes":[{"kind":"name","detail":"Renamed \"actions.rules.update\" → \"actions_rules_update\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":554,"tokensAfter":554},{"name":"actions.tests.create","fixed":{"name":"actions_tests_create","description":"Create a judging-only Test from 2 to 4 ads in one mirrored Meta ad set. Omit the conversion choice to freeze the workspace default. It records a Plainrouter verdict and never creates a proposal or writes to Meta.","inputSchema":{"type":"object","required":["platform_ad_account_id","ad_set_id","member_ad_ids","axis"],"properties":{"axis":{"enum":["hook","angle","visual","offer","format","landing"],"type":"string"},"ad_set_id":{"type":"string","pattern":"^[0-9]+$","maxLength":128},"event_name":{"type":["string","null"],"maxLength":255,"minLength":1,"description":"Optional observed conversion choice. Omit for the workspace default."},"maximum_days":{"type":"integer","maximum":30,"minimum":3},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."},"member_ad_ids":{"type":"array","items":{"type":"string","pattern":"^[0-9]+$","maxLength":128},"maxItems":4,"minItems":2,"uniqueItems":true},"arrivals_floor":{"type":"integer","minimum":50},"conversion_mode":{"enum":["workspace_default","explicit"],"type":"string","description":"Omit to freeze the workspace default; an explicit event_name always preserves that choice."},"maximum_spend_minor":{"type":["string","null"],"pattern":"^[1-9][0-9]{0,17}$","description":"Optional positive whole number of Meta minor units in the selected account currency, using the same unit scale as Launch plan budget_amount_minor; the string form supports up to 18 digits."},"minimum_conversions":{"type":"integer","minimum":1},"platform_ad_account_id":{"type":"integer","minimum":1}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":true},"title":"Create ad test"},"changes":[{"kind":"name","detail":"Renamed \"actions.tests.create\" → \"actions_tests_create\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":466,"tokensAfter":466},{"name":"actions.tests.list","fixed":{"name":"actions_tests_list","description":"List judging Tests with their frozen conversion definitions, loser pause candidate status and reason, and observed conversion event choices for the authorized workspace and ad account. Results rank variants only within each Test.","inputSchema":{"type":"object","properties":{"page":{"type":"integer","maximum":10000000000000000,"minimum":1},"per_page":{"type":"integer","maximum":100,"minimum":1},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"List ad tests"},"changes":[{"kind":"name","detail":"Renamed \"actions.tests.list\" → \"actions_tests_list\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":169,"tokensAfter":169},{"name":"actions.tests.show","fixed":{"name":"actions_tests_show","description":"Read one Test, its frozen conversion definition, stored verdict facts, and loser pause candidate status and reason. Spend per recorded conversion compares variants only within this Test.","inputSchema":{"type":"object","required":["test_id"],"properties":{"test_id":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-z]{26}$","maxLength":26,"minLength":26,"description":"The Test ID."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Show ad test"},"changes":[{"kind":"name","detail":"Renamed \"actions.tests.show\" → \"actions_tests_show\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":164,"tokensAfter":164},{"name":"launch.creatives.index","fixed":{"name":"launch_creatives_index","description":"List creatives in the workspace bound to the authenticated execution token.","inputSchema":{"type":"object","properties":{"page":{"type":"integer","maximum":10000000000000000,"minimum":1},"cursor":{"type":"integer","minimum":0,"description":"Continue using creatives.next_cursor in the same workspace."},"per_page":{"type":"integer","maximum":100,"minimum":1,"description":"Number of creatives to return per page."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"List workspace creatives"},"changes":[{"kind":"name","detail":"Renamed \"launch.creatives.index\" → \"launch_creatives_index\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":175,"tokensAfter":175},{"name":"launch.creatives.show","fixed":{"name":"launch_creatives_show","description":"Show one creative in the workspace bound to the authenticated execution token.","inputSchema":{"type":"object","required":["creative_id"],"properties":{"creative_id":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-z]{26}$","description":"ULID of the creative to show."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Show creative"},"changes":[{"kind":"name","detail":"Renamed \"launch.creatives.show\" → \"launch_creatives_show\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":134,"tokensAfter":134},{"name":"launch.creatives.status","fixed":{"name":"launch_creatives_status","description":"Set the status of one creative in the workspace bound to the authenticated execution token.","inputSchema":{"type":"object","required":["creative_id","status"],"properties":{"status":{"enum":["draft","approved","retired"],"type":"string","description":"Target creative status."},"creative_id":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-z]{26}$","description":"ULID of the creative to update."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":true,"destructiveHint":true},"title":"Update creative status"},"changes":[{"kind":"name","detail":"Renamed \"launch.creatives.status\" → \"launch_creatives_status\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":170,"tokensAfter":170},{"name":"launch.creatives.store","fixed":{"name":"launch_creatives_store","description":"Store one JPEG, PNG, MP4, or QuickTime creative from strict base64 content in the token-bound workspace. When supplying output from an outside tool, set tags.generator, tags.generator_job and, for a variation, tags.parent_creative. Plainrouter’s render_ad and resume_render set these tags on every creative they make; images enter the library by upload or launch.creatives.store-from-url.","inputSchema":{"type":"object","required":["content_base64"],"properties":{"tags":{"type":"object","description":"Optional flat map of up to 32 string tags, including reserved provenance keys. For output from an outside tool set generator (lowercase slug, 1-64 letters, digits or hyphens), generator_job (1-255 printable characters), and parent_creative for a variation (the API id of an existing creative in this workspace). Invalid reserved values return creative_provenance_invalid. Valid values are stored unchanged."},"mime_type":{"type":["string","null"],"maxLength":255,"description":"Optional caller label accepted only for compatibility and ignored; creative type is derived from the bytes."},"source_ref":{"type":["string","null"],"maxLength":255,"description":"Optional caller-supplied source reference."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."},"content_base64":{"type":"string","description":"Strict standard base64 creative content, decoded to at most 5 MiB."}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":true,"destructiveHint":true},"title":"Store creative"},"changes":[{"kind":"name","detail":"Renamed \"launch.creatives.store\" → \"launch_creatives_store\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":428,"tokensAfter":428},{"name":"launch.creatives.store-from-url","fixed":{"name":"launch_creatives_store-from-url","description":"Fetch and store one creative from a vetted HTTPS URL in the token-bound workspace. When supplying output from an outside tool, set tags.generator, tags.generator_job and, for a variation, tags.parent_creative. Plainrouter’s render_ad and resume_render set these tags on every creative they make; images enter the library by upload or launch.creatives.store-from-url.","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","maxLength":2048,"description":"HTTPS URL of the creative to fetch."},"tags":{"type":"object","description":"Optional flat map of up to 32 string tags, including reserved provenance keys. For output from an outside tool set generator (lowercase slug, 1-64 letters, digits or hyphens), generator_job (1-255 printable characters), and parent_creative for a variation (the API id of an existing creative in this workspace). Invalid reserved values return creative_provenance_invalid. Valid values are stored unchanged."},"source_ref":{"type":["string","null"],"maxLength":255,"description":"Optional caller-supplied source reference."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":true},"title":"Store creative from URL"},"changes":[{"kind":"name","detail":"Renamed \"launch.creatives.store-from-url\" → \"launch_creatives_store-from-url\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":369,"tokensAfter":369},{"name":"launch.plans.copy","fixed":{"name":"launch_plans_copy","description":"Copy a failed plan to a new draft with the same content. Validate and submit the draft afresh; the failed plan and its history stay unchanged.","inputSchema":{"type":"object","required":["plan_id"],"properties":{"plan_id":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-z]{26}$","description":"The deployment plan ID."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":true},"title":"Copy deployment plan"},"changes":[{"kind":"name","detail":"Renamed \"launch.plans.copy\" → \"launch_plans_copy\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":146,"tokensAfter":146},{"name":"launch.plans.create","fixed":{"name":"launch_plans_create","description":"Create a deployment plan for the approved ad account.","inputSchema":{"type":"object","required":["platform_ad_account_id","platform","budget_type","budget_amount_minor","currency","copy","landing_page"],"properties":{"copy":{"type":"object","required":["primary_text","headline","description","cta"],"properties":{"cta":{"enum":["learn_more","shop_now","sign_up"],"type":"string"},"headline":{"type":"string"},"description":{"type":"string"},"primary_text":{"type":"string"}}},"name":{"type":["string","null"],"maxLength":255},"currency":{"type":"string","maxLength":3,"minLength":3},"platform":{"enum":["google","meta","microsoft"],"type":"string"},"ad_set_ref":{"type":["string","null"]},"ad_set_spec":{"type":["object","null"]},"budget_type":{"enum":["daily","lifetime"],"type":"string"},"campaign_ref":{"type":["string","null"]},"creative_ids":{"type":"array","items":{"type":"string"}},"landing_page":{"type":"string","format":"uri"},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."},"campaign_spec":{"type":["object","null"]},"utm_policy_name":{"type":["string","null"]},"creative_overrides":{"type":"array","items":{"type":"object","required":["creative_id"],"properties":{"copy":{"type":["object","null"],"required":["primary_text","headline","description","cta"],"properties":{"cta":{"enum":["learn_more","shop_now","sign_up"],"type":"string"},"headline":{"type":"string"},"description":{"type":"string"},"primary_text":{"type":"string"}}},"creative_id":{"type":"string","description":"The ULID of a creative included in this plan."},"landing_page":{"type":["string","null"],"format":"uri","maxLength":2048}}}},"naming_policy_name":{"type":["string","null"]},"budget_amount_minor":{"type":"integer","minimum":0},"platform_ad_account_id":{"type":"integer","minimum":1}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":true},"title":"Create deployment plan"},"changes":[{"kind":"name","detail":"Renamed \"launch.plans.create\" → \"launch_plans_create\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":539,"tokensAfter":539},{"name":"launch.plans.execute","fixed":{"name":"launch_plans_execute","description":"Execute one deployment plan in the workspace and ad account bound to the execution token; requires the review_version returned by the plan read you acted on. Changed plans are refused before any intent or staging; identical intent_key and review_version retries replay. All provider mutations are proposed through Actions.","inputSchema":{"type":"object","required":["plan_id","review_version"],"properties":{"plan_id":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-z]{26}$","description":"The deployment plan ID."},"intent_key":{"type":["string","null"],"maxLength":240,"description":"An optional idempotency key for this execution."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."},"review_version":{"type":"string","pattern":"^[a-f0-9]{64}$","description":"The review_version from the plan read you acted on. Reload and review if the plan changed."}}},"annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":true},"title":"Execute deployment plan"},"changes":[{"kind":"name","detail":"Renamed \"launch.plans.execute\" → \"launch_plans_execute\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":282,"tokensAfter":282},{"name":"launch.plans.list","fixed":{"name":"launch_plans_list","description":"List deployment plans for the approved ad account, including each current review_version to pass when executing the reviewed plan.","inputSchema":{"type":"object","properties":{"page":{"type":"integer","maximum":10000000000000000,"minimum":1},"cursor":{"type":"integer","minimum":0,"description":"Continue using plans.next_cursor with the same account."},"per_page":{"type":["integer","string"]},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"List deployment plans"},"changes":[{"kind":"name","detail":"Renamed \"launch.plans.list\" → \"launch_plans_list\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":168,"tokensAfter":168},{"name":"launch.plans.show","fixed":{"name":"launch_plans_show","description":"Read one deployment plan and its current review_version and latest launch-intent status in the workspace and ad account bound to the execution token.","inputSchema":{"type":"object","required":["plan_id"],"properties":{"limit":{"type":"integer","default":5,"maximum":100,"minimum":1},"cursor":{"type":"integer","minimum":0,"description":"Continue plan creatives using plan.next_cursor."},"plan_id":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-z]{26}$","description":"The deployment plan ID."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"title":"Show deployment plan"},"changes":[{"kind":"name","detail":"Renamed \"launch.plans.show\" → \"launch_plans_show\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"launch.plans.update","fixed":{"name":"launch_plans_update","description":"Update a deployment plan for the approved ad account.","inputSchema":{"type":"object","required":["plan_id"],"properties":{"copy":{"type":"object","required":["primary_text","headline","description","cta"],"properties":{"cta":{"enum":["learn_more","shop_now","sign_up"],"type":"string"},"headline":{"type":"string"},"description":{"type":"string"},"primary_text":{"type":"string"}}},"name":{"type":["string","null"],"maxLength":255},"plan_id":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-z]{26}$","description":"The deployment plan ID."},"currency":{"type":"string","maxLength":3,"minLength":3},"platform":{"enum":["google","meta","microsoft"],"type":"string"},"ad_set_ref":{"type":["string","null"]},"ad_set_spec":{"type":["object","null"]},"budget_type":{"enum":["daily","lifetime"],"type":"string"},"campaign_ref":{"type":["string","null"]},"creative_ids":{"type":"array","items":{"type":"string"}},"landing_page":{"type":"string","format":"uri"},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."},"campaign_spec":{"type":["object","null"]},"utm_policy_name":{"type":["string","null"]},"creative_overrides":{"type":"array","items":{"type":"object","required":["creative_id"],"properties":{"copy":{"type":["object","null"],"required":["primary_text","headline","description","cta"],"properties":{"cta":{"enum":["learn_more","shop_now","sign_up"],"type":"string"},"headline":{"type":"string"},"description":{"type":"string"},"primary_text":{"type":"string"}}},"creative_id":{"type":"string","description":"The ULID of a creative included in this plan."},"landing_page":{"type":["string","null"],"format":"uri","maxLength":2048}}}},"naming_policy_name":{"type":["string","null"]},"budget_amount_minor":{"type":"integer","minimum":0},"platform_ad_account_id":{"type":"integer","minimum":1}}},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":true},"title":"Update deployment plan"},"changes":[{"kind":"name","detail":"Renamed \"launch.plans.update\" → \"launch_plans_update\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":542,"tokensAfter":542},{"name":"launch.plans.validate","fixed":{"name":"launch_plans_validate","description":"Validate a deployment plan for the approved ad account.","inputSchema":{"type":"object","required":["plan_id"],"properties":{"plan_id":{"type":"string","pattern":"^[0-9a-hjkmnp-tv-z]{26}$","description":"The deployment plan ID."},"workspace_id":{"type":"integer","minimum":1,"description":"Workspace ID returned by list_workspaces. Required when this credential reaches multiple workspaces."}}},"annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":true},"title":"Validate deployment plan"},"changes":[{"kind":"name","detail":"Renamed \"launch.plans.validate\" → \"launch_plans_validate\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":123,"tokensAfter":123}],"toolsChanged":19,"tokensSaved":0,"todo":[{"tool":"actions_rules_create","params":["name","platform_ad_account_id"]},{"tool":"actions_rules_list","params":["page","per_page"]},{"tool":"actions_rules_update","params":["name"]},{"tool":"actions_tests_create","params":["axis","ad_set_id","maximum_days","member_ad_ids","arrivals_floor","minimum_conversions","platform_ad_account_id"]},{"tool":"actions_tests_list","params":["page","per_page"]},{"tool":"dry_run_actions","params":["actions","evidence","rationale","account_id","workspace_id","target_source","idempotency_key"]},{"tool":"get_action","params":["action_id"]},{"tool":"get_action_batch","params":["limit","batch_id"]},{"tool":"get_action_decision_receipt","params":["action_id"]},{"tool":"get_cookie_scan","params":["limit"]},{"tool":"get_render","params":["render_id"]},{"tool":"get_trial_proof","params":["level","lookback"]},{"tool":"launch_creatives_index","params":["page"]},{"tool":"launch_plans_create","params":["copy","name","currency","platform","ad_set_ref","ad_set_spec","budget_type","campaign_ref","creative_ids","landing_page","campaign_spec","utm_policy_name","creative_overrides","naming_policy_name","budget_amount_minor","platform_ad_account_id"]},{"tool":"launch_plans_list","params":["page","per_page"]},{"tool":"launch_plans_show","params":["limit"]},{"tool":"launch_plans_update","params":["copy","name","currency","platform","ad_set_ref","ad_set_spec","budget_type","campaign_ref","creative_ids","landing_page","campaign_spec","utm_policy_name","creative_overrides","naming_policy_name","budget_amount_minor","platform_ad_account_id"]},{"tool":"list_actions","params":["page","limit","status"]},{"tool":"list_creatives","params":["status"]},{"tool":"preview_creatives","params":["creative_ids"]},{"tool":"propose-actions","params":["actions","evidence","rationale","account_id","workspace_id","target_source","idempotency_key"]},{"tool":"render_ad","params":["copy","sizes","request_key","template_id","background_creative_id"]},{"tool":"resume_render","params":["render_id"]},{"tool":"submit_feedback","params":["kind","message"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}