[
  {
    "name": "tiktok_ads_list_ad_groups",
    "title": "List TikTok Ad Groups",
    "description": "List TikTok ad groups for an advertiser. Shows name, status, targeting, and budget.",
    "cli_command": "hopkin tiktok ad-groups list",
    "cli_flags": [
      {
        "flag": "--limit",
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "Opaque pagination cursor from a previous response.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "Force a fresh fetch bypassing the cache.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--adgroup-id",
        "description": "Fetch a single ad group by ID.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--adgroup-ids",
        "description": "Fetch specific ad groups by IDs.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--campaign-ids",
        "description": "Filter by parent campaign IDs.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--status",
        "description": "Filter by primary status.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--search",
        "description": "Search ad groups by name (case-insensitive).",
        "type": "string",
        "required": false
      }
    ],
    "category": "ad-groups",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20,
          "description": "Maximum number of results to return (1–100). Default: 20."
        },
        "cursor": {
          "type": "string",
          "description": "Opaque pagination cursor from a previous response."
        },
        "refresh": {
          "type": "boolean",
          "default": false,
          "description": "Force a fresh fetch bypassing the cache."
        },
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "adgroup_id": {
          "type": "string",
          "description": "Fetch a single ad group by ID."
        },
        "adgroup_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific ad groups by IDs."
        },
        "campaign_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Filter by parent campaign IDs."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "STATUS_ALL",
              "STATUS_ON",
              "STATUS_OFF",
              "STATUS_BUDGET_EXCEED",
              "STATUS_DONE",
              "STATUS_DELETE"
            ]
          },
          "description": "Filter by primary status."
        },
        "search": {
          "type": "string",
          "description": "Search ad groups by name (case-insensitive)."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": "Opaque pagination cursor from a previous response."
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "Force a fresh fetch bypassing the cache.",
        "default": false
      },
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "adgroup_id",
        "type": "string",
        "required": false,
        "description": "Fetch a single ad group by ID."
      },
      {
        "name": "adgroup_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific ad groups by IDs."
      },
      {
        "name": "campaign_ids",
        "type": "array",
        "required": false,
        "description": "Filter by parent campaign IDs."
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by primary status."
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "description": "Search ad groups by name (case-insensitive)."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "google_ads_list_ad_groups",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_list_ad_groups",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_list_ads",
        "relationship": "hierarchy"
      },
      {
        "name": "tiktok_ads_list_campaigns",
        "relationship": "hierarchy"
      }
    ]
  },
  {
    "name": "tiktok_ads_get_ad_group",
    "title": "Get TikTok Ad Group",
    "description": "Get details for a single TikTok ad group by ID.",
    "cli_command": "hopkin tiktok ad-group get",
    "cli_flags": [
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--adgroup-id",
        "description": "Ad group ID.",
        "type": "string",
        "required": true
      }
    ],
    "category": "ad-group",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "adgroup_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad group ID."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "adgroup_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "adgroup_id",
        "type": "string",
        "required": true,
        "description": "Ad group ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "tiktok_ads_list_ads",
    "title": "List TikTok Ads",
    "description": "List TikTok ads for an advertiser. Shows name, status, creative, and ad group association.",
    "cli_command": "hopkin tiktok ads list",
    "cli_flags": [
      {
        "flag": "--limit",
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "Opaque pagination cursor from a previous response.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "Force a fresh fetch bypassing the cache.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--ad",
        "description": "Fetch a single ad by ID.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--ad-ids",
        "description": "Fetch specific ads by IDs.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--campaign-ids",
        "description": "Filter by parent campaign IDs.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--adgroup-ids",
        "description": "Filter by parent ad group IDs.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--status",
        "description": "Filter by primary status.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--search",
        "description": "Search ads by name (case-insensitive).",
        "type": "string",
        "required": false
      }
    ],
    "category": "ads",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20,
          "description": "Maximum number of results to return (1–100). Default: 20."
        },
        "cursor": {
          "type": "string",
          "description": "Opaque pagination cursor from a previous response."
        },
        "refresh": {
          "type": "boolean",
          "default": false,
          "description": "Force a fresh fetch bypassing the cache."
        },
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "ad_id": {
          "type": "string",
          "description": "Fetch a single ad by ID."
        },
        "ad_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific ads by IDs."
        },
        "campaign_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Filter by parent campaign IDs."
        },
        "adgroup_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Filter by parent ad group IDs."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "STATUS_ALL",
              "STATUS_ON",
              "STATUS_OFF",
              "STATUS_BUDGET_EXCEED",
              "STATUS_DONE",
              "STATUS_DELETE"
            ]
          },
          "description": "Filter by primary status."
        },
        "search": {
          "type": "string",
          "description": "Search ads by name (case-insensitive)."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": "Opaque pagination cursor from a previous response."
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "Force a fresh fetch bypassing the cache.",
        "default": false
      },
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "ad_id",
        "type": "string",
        "required": false,
        "description": "Fetch a single ad by ID."
      },
      {
        "name": "ad_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific ads by IDs."
      },
      {
        "name": "campaign_ids",
        "type": "array",
        "required": false,
        "description": "Filter by parent campaign IDs."
      },
      {
        "name": "adgroup_ids",
        "type": "array",
        "required": false,
        "description": "Filter by parent ad group IDs."
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by primary status."
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "description": "Search ads by name (case-insensitive)."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_list_ads",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_list_ads",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_list_ads",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_list_ad_groups",
        "relationship": "hierarchy"
      }
    ]
  },
  {
    "name": "tiktok_ads_get_ad",
    "title": "Get TikTok Ad",
    "description": "Get details for a single TikTok ad by ID.",
    "cli_command": "hopkin tiktok ad get",
    "cli_flags": [
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--ad",
        "description": "Ad ID.",
        "type": "string",
        "required": true
      }
    ],
    "category": "ad",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "ad_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad ID."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "ad_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "ad_id",
        "type": "string",
        "required": true,
        "description": "Ad ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "tiktok_ads_list_advertisers",
    "title": "List TikTok Advertisers",
    "description": "List TikTok advertiser accounts accessible to the authenticated user. Shows name, ID, status, currency, and timezone.",
    "cli_command": "hopkin tiktok advertisers list",
    "cli_flags": [
      {
        "flag": "--limit",
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "Opaque pagination cursor from a previous response.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "Force a fresh fetch bypassing the cache.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--advertiser-id",
        "description": "Fetch a single advertiser by ID.",
        "type": "string",
        "required": false
      }
    ],
    "category": "advertisers",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20,
          "description": "Maximum number of results to return (1–100). Default: 20."
        },
        "cursor": {
          "type": "string",
          "description": "Opaque pagination cursor from a previous response."
        },
        "refresh": {
          "type": "boolean",
          "default": false,
          "description": "Force a fresh fetch bypassing the cache."
        },
        "advertiser_id": {
          "type": "string",
          "description": "Fetch a single advertiser by ID."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": "Opaque pagination cursor from a previous response."
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "Force a fresh fetch bypassing the cache.",
        "default": false
      },
      {
        "name": "advertiser_id",
        "type": "string",
        "required": false,
        "description": "Fetch a single advertiser by ID."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "tiktok_ads_get_advertiser",
    "title": "Get TikTok Advertiser",
    "description": "Get details for a single TikTok advertiser by ID.",
    "cli_command": "hopkin tiktok advertiser get",
    "cli_flags": [
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      }
    ],
    "category": "advertiser",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "tiktok_ads_list_audiences",
    "title": "List TikTok Audiences",
    "description": "List custom and lookalike audiences for a TikTok advertiser.",
    "cli_command": "hopkin tiktok audiences list",
    "cli_flags": [
      {
        "flag": "--limit",
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "Opaque pagination cursor from a previous response.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "Force a fresh fetch bypassing the cache.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      }
    ],
    "category": "audiences",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20,
          "description": "Maximum number of results to return (1–100). Default: 20."
        },
        "cursor": {
          "type": "string",
          "description": "Opaque pagination cursor from a previous response."
        },
        "refresh": {
          "type": "boolean",
          "default": false,
          "description": "Force a fresh fetch bypassing the cache."
        },
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": "Opaque pagination cursor from a previous response."
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "Force a fresh fetch bypassing the cache.",
        "default": false
      },
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "tiktok_ads_check_auth_status",
    "title": "Check TikTok Ads Authentication Status",
    "description": "Check whether the user's TikTok Ads account is authenticated. Returns auth method and email. Use ONLY when the user asks about auth status or connectivity — to get advertiser accounts, use tiktok_ads_list_advertisers instead.",
    "cli_command": "hopkin tiktok auth check",
    "cli_flags": [],
    "category": "auth",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_check_auth_status",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_check_auth_status",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_check_auth_status",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_check_auth_status",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_ping",
        "relationship": "sibling"
      }
    ]
  },
  {
    "name": "tiktok_ads_get_login_url",
    "title": "Get TikTok Ads Login URL",
    "description": "Get the URL to connect a TikTok Ads account via OAuth.",
    "cli_command": "hopkin tiktok login-url get",
    "cli_flags": [],
    "category": "login-url",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "tiktok_ads_get_user_info",
    "title": "Get TikTok Ads User Info",
    "description": "Get detailed profile information about the authenticated TikTok Ads user (email, display name, role). Use this for user profile details — for checking auth status or listing advertiser IDs, use tiktok_ads_check_auth_status instead.",
    "cli_command": "hopkin tiktok user-info get",
    "cli_flags": [],
    "category": "user-info",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "tiktok_ads_list_campaigns",
    "title": "List TikTok Campaigns",
    "description": "List TikTok ad campaigns for an advertiser. Shows name, status, objective, and budget.",
    "cli_command": "hopkin tiktok campaigns list",
    "cli_flags": [
      {
        "flag": "--limit",
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "Opaque pagination cursor from a previous response.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "Force a fresh fetch bypassing the cache.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--campaign",
        "description": "Fetch a single campaign by ID.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--campaign-ids",
        "description": "Fetch specific campaigns by IDs.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--status",
        "description": "Filter by primary status.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--search",
        "description": "Search campaigns by name (case-insensitive).",
        "type": "string",
        "required": false
      }
    ],
    "category": "campaigns",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20,
          "description": "Maximum number of results to return (1–100). Default: 20."
        },
        "cursor": {
          "type": "string",
          "description": "Opaque pagination cursor from a previous response."
        },
        "refresh": {
          "type": "boolean",
          "default": false,
          "description": "Force a fresh fetch bypassing the cache."
        },
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "campaign_id": {
          "type": "string",
          "description": "Fetch a single campaign by ID."
        },
        "campaign_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific campaigns by IDs."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "STATUS_ALL",
              "STATUS_ON",
              "STATUS_OFF",
              "STATUS_BUDGET_EXCEED",
              "STATUS_DONE",
              "STATUS_DELETE"
            ]
          },
          "description": "Filter by primary status."
        },
        "search": {
          "type": "string",
          "description": "Search campaigns by name (case-insensitive)."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "Maximum number of results to return (1–100). Default: 20.",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": "Opaque pagination cursor from a previous response."
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "Force a fresh fetch bypassing the cache.",
        "default": false
      },
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "campaign_id",
        "type": "string",
        "required": false,
        "description": "Fetch a single campaign by ID."
      },
      {
        "name": "campaign_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific campaigns by IDs."
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by primary status."
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "description": "Search campaigns by name (case-insensitive)."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_list_ad_groups",
        "relationship": "hierarchy"
      }
    ]
  },
  {
    "name": "tiktok_ads_get_campaign",
    "title": "Get TikTok Campaign",
    "description": "Get details for a single TikTok campaign by ID.",
    "cli_command": "hopkin tiktok campaign get",
    "cli_flags": [
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--campaign",
        "description": "Campaign ID.",
        "type": "string",
        "required": true
      }
    ],
    "category": "campaign",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "campaign_id": {
          "type": "string",
          "minLength": 1,
          "description": "Campaign ID."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "campaign_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "campaign_id",
        "type": "string",
        "required": true,
        "description": "Campaign ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "tiktok_ads_developer_feedback",
    "title": "Submit Developer Feedback",
    "description": "Submit feedback about missing tools, improvements, bugs, or workflow gaps in the TikTok Ads MCP toolset. Not for user-facing issues like auth or API errors.",
    "cli_command": "hopkin tiktok developer-feedback send",
    "cli_flags": [
      {
        "flag": "--feedback-type",
        "description": "Feedback category: new_tool (request new capability), improvement (enhance existing tool), bug (report issue), workflow_gap (missing workflow)",
        "type": "string",
        "required": true
      },
      {
        "flag": "--title",
        "description": "Concise title summarizing the feedback",
        "type": "string",
        "required": true
      },
      {
        "flag": "--description",
        "description": "What is needed and why",
        "type": "string",
        "required": true
      },
      {
        "flag": "--current-workaround",
        "description": "Current workaround, if any",
        "type": "string",
        "required": false
      },
      {
        "flag": "--priority",
        "description": "Impact level: low (nice-to-have), medium (improves workflow), high (blocking issue)",
        "type": "string",
        "required": false
      },
      {
        "flag": "--interface",
        "description": "Interface the feedback originated from: MCP (default) or CLI",
        "type": "string",
        "required": false
      }
    ],
    "category": "feedback",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "feedback_type": {
          "type": "string",
          "enum": [
            "new_tool",
            "improvement",
            "bug",
            "workflow_gap"
          ],
          "description": "Feedback category: new_tool (request new capability), improvement (enhance existing tool), bug (report issue), workflow_gap (missing workflow)"
        },
        "title": {
          "type": "string",
          "minLength": 5,
          "maxLength": 200,
          "description": "Concise title summarizing the feedback"
        },
        "description": {
          "type": "string",
          "minLength": 20,
          "maxLength": 2000,
          "description": "What is needed and why"
        },
        "current_workaround": {
          "type": "string",
          "maxLength": 1000,
          "description": "Current workaround, if any"
        },
        "priority": {
          "type": "string",
          "enum": [
            "low",
            "medium",
            "high"
          ],
          "default": "medium",
          "description": "Impact level: low (nice-to-have), medium (improves workflow), high (blocking issue)"
        },
        "interface": {
          "type": "string",
          "enum": [
            "MCP",
            "CLI"
          ],
          "default": "MCP",
          "description": "Interface the feedback originated from: MCP (default) or CLI"
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "feedback_type",
        "title",
        "description",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "feedback_type",
        "type": "string",
        "required": true,
        "description": "Feedback category: new_tool (request new capability), improvement (enhance existing tool), bug (report issue), workflow_gap (missing workflow)",
        "enum_values": [
          "new_tool",
          "improvement",
          "bug",
          "workflow_gap"
        ]
      },
      {
        "name": "title",
        "type": "string",
        "required": true,
        "description": "Concise title summarizing the feedback",
        "constraints": {
          "min_length": 5,
          "max_length": 200
        }
      },
      {
        "name": "description",
        "type": "string",
        "required": true,
        "description": "What is needed and why",
        "constraints": {
          "min_length": 20,
          "max_length": 2000
        }
      },
      {
        "name": "current_workaround",
        "type": "string",
        "required": false,
        "description": "Current workaround, if any",
        "constraints": {
          "max_length": 1000
        }
      },
      {
        "name": "priority",
        "type": "string",
        "required": false,
        "description": "Impact level: low (nice-to-have), medium (improves workflow), high (blocking issue)",
        "enum_values": [
          "low",
          "medium",
          "high"
        ],
        "default": "medium"
      },
      {
        "name": "interface",
        "type": "string",
        "required": false,
        "description": "Interface the feedback originated from: MCP (default) or CLI",
        "enum_values": [
          "MCP",
          "CLI"
        ],
        "default": "MCP"
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_developer_feedback",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_developer_feedback",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_developer_feedback",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_developer_feedback",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "tiktok_ads_ping",
    "title": "Ping TikTok Ads MCP Server",
    "description": "Health check for the TikTok Ads MCP server.",
    "cli_command": "hopkin tiktok ping",
    "cli_flags": [
      {
        "flag": "--message",
        "description": "Optional message to echo back",
        "type": "string",
        "required": false
      }
    ],
    "category": "auth",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "message": {
          "type": "string",
          "maxLength": 100,
          "description": "Optional message to echo back"
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "message",
        "type": "string",
        "required": false,
        "description": "Optional message to echo back",
        "constraints": {
          "max_length": 100
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_ping",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_ping",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_ping",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_ping",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_check_auth_status",
        "relationship": "sibling"
      }
    ]
  },
  {
    "name": "tiktok_ads_get_performance_report",
    "title": "Get TikTok Ads Performance Report",
    "description": "Get a performance report for a TikTok advertiser over a date range, with optional breakdowns and entity filters.",
    "cli_command": "hopkin tiktok performance-report get",
    "cli_flags": [
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--level",
        "description": "Reporting level — mapped to data_level internally.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--date-preset",
        "description": "Shortcut date range. Overridden by explicit start_date/end_date.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--start-date",
        "description": "Start date in YYYY-MM-DD format.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--end-date",
        "description": "End date in YYYY-MM-DD format.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--campaign",
        "description": "Filter to a specific campaign.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--adgroup-id",
        "description": "Filter to a specific ad group.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--page",
        "description": "Page number (1-indexed). Default: 1.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--page-size",
        "description": "Results per page. Default: 20.",
        "type": "integer",
        "required": false
      }
    ],
    "category": "reporting",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "level": {
          "type": "string",
          "enum": [
            "campaign",
            "adgroup",
            "ad"
          ],
          "description": "Reporting level — mapped to data_level internally."
        },
        "date_preset": {
          "type": "string",
          "enum": [
            "last_7d",
            "last_14d",
            "last_30d"
          ],
          "description": "Shortcut date range. Overridden by explicit start_date/end_date."
        },
        "start_date": {
          "type": "string",
          "description": "Start date in YYYY-MM-DD format."
        },
        "end_date": {
          "type": "string",
          "description": "End date in YYYY-MM-DD format."
        },
        "campaign_id": {
          "type": "string",
          "description": "Filter to a specific campaign."
        },
        "adgroup_id": {
          "type": "string",
          "description": "Filter to a specific ad group."
        },
        "page": {
          "type": "integer",
          "minimum": 1,
          "default": 1,
          "description": "Page number (1-indexed). Default: 1."
        },
        "page_size": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "default": 20,
          "description": "Results per page. Default: 20."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "level",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "level",
        "type": "string",
        "required": true,
        "description": "Reporting level — mapped to data_level internally.",
        "enum_values": [
          "campaign",
          "adgroup",
          "ad"
        ]
      },
      {
        "name": "date_preset",
        "type": "string",
        "required": false,
        "description": "Shortcut date range. Overridden by explicit start_date/end_date.",
        "enum_values": [
          "last_7d",
          "last_14d",
          "last_30d"
        ]
      },
      {
        "name": "start_date",
        "type": "string",
        "required": false,
        "description": "Start date in YYYY-MM-DD format."
      },
      {
        "name": "end_date",
        "type": "string",
        "required": false,
        "description": "End date in YYYY-MM-DD format."
      },
      {
        "name": "campaign_id",
        "type": "string",
        "required": false,
        "description": "Filter to a specific campaign."
      },
      {
        "name": "adgroup_id",
        "type": "string",
        "required": false,
        "description": "Filter to a specific ad group."
      },
      {
        "name": "page",
        "type": "integer",
        "required": false,
        "description": "Page number (1-indexed). Default: 1.",
        "default": 1,
        "constraints": {
          "min": 1
        }
      },
      {
        "name": "page_size",
        "type": "integer",
        "required": false,
        "description": "Results per page. Default: 20.",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 1000
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "json",
    "related_tools": [
      {
        "name": "meta_ads_get_performance_report",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_get_performance_report",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_get_performance_report",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_get_performance_report",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "tiktok_ads_get_insights",
    "title": "Get TikTok Ads Insights",
    "description": "Get aggregated insights and analytics for TikTok ad entities with custom dimensions (age, gender, country, placement). Use this for audience demographic breakdowns and flexible dimension-based analysis — for video/creative metrics, use tiktok_ads_get_creative_report instead.",
    "cli_command": "hopkin tiktok insights get",
    "cli_flags": [
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--report-type",
        "description": "Type of report. AUDIENCE for demographic breakdowns (age, gender, country). Default: BASIC.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--data-level",
        "description": "Granularity level for the report.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--dimensions",
        "description": "Grouping dimensions, e.g. [\"campaign_id\", \"stat_time_day\"].",
        "type": "array",
        "required": true
      },
      {
        "flag": "--metrics",
        "description": "Metrics to retrieve. Defaults to standard funnel metrics if omitted.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--start-date",
        "description": "Start date in YYYY-MM-DD format.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--end-date",
        "description": "End date in YYYY-MM-DD format.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--lifetime",
        "description": "If true, return lifetime metrics instead of date-ranged.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--page",
        "description": "Page number (1-indexed). Default: 1.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--page-size",
        "description": "Results per page. Default: 20.",
        "type": "integer",
        "required": false
      }
    ],
    "category": "insights",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "report_type": {
          "type": "string",
          "enum": [
            "BASIC",
            "AUDIENCE"
          ],
          "default": "BASIC",
          "description": "Type of report. AUDIENCE for demographic breakdowns (age, gender, country). Default: BASIC."
        },
        "data_level": {
          "type": "string",
          "enum": [
            "AUCTION_ADVERTISER",
            "AUCTION_CAMPAIGN",
            "AUCTION_ADGROUP",
            "AUCTION_AD"
          ],
          "description": "Granularity level for the report."
        },
        "dimensions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Grouping dimensions, e.g. [\"campaign_id\", \"stat_time_day\"]."
        },
        "metrics": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Metrics to retrieve. Defaults to standard funnel metrics if omitted."
        },
        "start_date": {
          "type": "string",
          "description": "Start date in YYYY-MM-DD format."
        },
        "end_date": {
          "type": "string",
          "description": "End date in YYYY-MM-DD format."
        },
        "lifetime": {
          "type": "boolean",
          "description": "If true, return lifetime metrics instead of date-ranged."
        },
        "page": {
          "type": "integer",
          "minimum": 1,
          "default": 1,
          "description": "Page number (1-indexed). Default: 1."
        },
        "page_size": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "default": 20,
          "description": "Results per page. Default: 20."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "data_level",
        "dimensions",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "report_type",
        "type": "string",
        "required": false,
        "description": "Type of report. AUDIENCE for demographic breakdowns (age, gender, country). Default: BASIC.",
        "enum_values": [
          "BASIC",
          "AUDIENCE"
        ],
        "default": "BASIC"
      },
      {
        "name": "data_level",
        "type": "string",
        "required": true,
        "description": "Granularity level for the report.",
        "enum_values": [
          "AUCTION_ADVERTISER",
          "AUCTION_CAMPAIGN",
          "AUCTION_ADGROUP",
          "AUCTION_AD"
        ]
      },
      {
        "name": "dimensions",
        "type": "array",
        "required": true,
        "description": "Grouping dimensions, e.g. [\"campaign_id\", \"stat_time_day\"]."
      },
      {
        "name": "metrics",
        "type": "array",
        "required": false,
        "description": "Metrics to retrieve. Defaults to standard funnel metrics if omitted."
      },
      {
        "name": "start_date",
        "type": "string",
        "required": false,
        "description": "Start date in YYYY-MM-DD format."
      },
      {
        "name": "end_date",
        "type": "string",
        "required": false,
        "description": "End date in YYYY-MM-DD format."
      },
      {
        "name": "lifetime",
        "type": "boolean",
        "required": false,
        "description": "If true, return lifetime metrics instead of date-ranged."
      },
      {
        "name": "page",
        "type": "integer",
        "required": false,
        "description": "Page number (1-indexed). Default: 1.",
        "default": 1,
        "constraints": {
          "min": 1
        }
      },
      {
        "name": "page_size",
        "type": "integer",
        "required": false,
        "description": "Results per page. Default: 20.",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 1000
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "json",
    "related_tools": [
      {
        "name": "meta_ads_get_insights",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_get_insights",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_get_insights",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "tiktok_ads_get_creative_report",
    "title": "Get TikTok Ads Creative Report",
    "description": "Get video creative performance metrics for TikTok ads — video views, watch time, completion rates (p25/p50/p75/p100), engagement, and per-creative breakdowns. Supports filtering by campaign_id or adgroup_id to narrow results. Use this tool for video-specific metrics and creative-level analysis.",
    "cli_command": "hopkin tiktok creative-report get",
    "cli_flags": [
      {
        "flag": "--advertiser-id",
        "description": "TikTok advertiser ID.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--campaign",
        "description": "Filter to a specific campaign.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--adgroup-id",
        "description": "Filter to a specific ad group.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--start-date",
        "description": "Start date in YYYY-MM-DD format.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--end-date",
        "description": "End date in YYYY-MM-DD format.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--page",
        "description": "Page number (1-indexed). Default: 1.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--page-size",
        "description": "Results per page. Default: 20.",
        "type": "integer",
        "required": false
      }
    ],
    "category": "creative-report",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "advertiser_id": {
          "type": "string",
          "minLength": 1,
          "description": "TikTok advertiser ID."
        },
        "campaign_id": {
          "type": "string",
          "description": "Filter to a specific campaign."
        },
        "adgroup_id": {
          "type": "string",
          "description": "Filter to a specific ad group."
        },
        "start_date": {
          "type": "string",
          "description": "Start date in YYYY-MM-DD format."
        },
        "end_date": {
          "type": "string",
          "description": "End date in YYYY-MM-DD format."
        },
        "page": {
          "type": "integer",
          "minimum": 1,
          "default": 1,
          "description": "Page number (1-indexed). Default: 1."
        },
        "page_size": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000,
          "default": 20,
          "description": "Results per page. Default: 20."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "advertiser_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "advertiser_id",
        "type": "string",
        "required": true,
        "description": "TikTok advertiser ID.",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "campaign_id",
        "type": "string",
        "required": false,
        "description": "Filter to a specific campaign."
      },
      {
        "name": "adgroup_id",
        "type": "string",
        "required": false,
        "description": "Filter to a specific ad group."
      },
      {
        "name": "start_date",
        "type": "string",
        "required": false,
        "description": "Start date in YYYY-MM-DD format."
      },
      {
        "name": "end_date",
        "type": "string",
        "required": false,
        "description": "End date in YYYY-MM-DD format."
      },
      {
        "name": "page",
        "type": "integer",
        "required": false,
        "description": "Page number (1-indexed). Default: 1.",
        "default": 1,
        "constraints": {
          "min": 1
        }
      },
      {
        "name": "page_size",
        "type": "integer",
        "required": false,
        "description": "Results per page. Default: 20.",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 1000
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [],
    "response_format": "markdown",
    "related_tools": []
  }
]