[
  {
    "name": "chatgpt_ads_get_ad_account",
    "title": "Get ChatGPT Ads Account",
    "description": "Get details of the ChatGPT Ads account: name, status, currency, timezone, website, and review status.\n\nEach ChatGPT Ads API key is scoped to exactly one ad account, so this returns the account behind the resolved connection. Use chatgpt_ads_list_ad_accounts to see every account you can reach, and pass connection_id to pick one.\n\nWorth calling before reporting: every spend figure is in this account's currency, and every insights date bucket is a day in this account's timezone.",
    "cli_command": "hopkin chatgpt ad-account get",
    "cli_flags": [
      {
        "flag": "--connection-id",
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.",
        "type": "string",
        "required": false
      }
    ],
    "category": "ad-account",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
        },
        "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": "connection_id",
        "type": "string",
        "required": false,
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "Account details",
        "mcp_params": {
          "reason": "Check account currency and timezone before reporting"
        },
        "cli_command": "hopkin chatgpt ad-account get",
        "natural_language": "Account details"
      },
      {
        "label": "Specific connection",
        "mcp_params": {
          "connection_id": "00000000-0000-0000-0000-000000000000",
          "reason": "Inspect a particular connected account"
        },
        "cli_command": "hopkin chatgpt ad-account get --connection-id 00000000-0000-0000-0000-000000000000",
        "natural_language": "Specific connection"
      }
    ],
    "response_format": "markdown",
    "related_tools": [],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_check_auth_status",
    "title": "Check ChatGPT Ads Auth Status",
    "description": "Check whether a ChatGPT Ads API key is connected and still accepted by the platform.\n\nDo NOT call this proactively — call the tool you actually need. Use this only after another tool fails with a permission or authentication error.",
    "cli_command": "hopkin chatgpt auth check",
    "cli_flags": [
      {
        "flag": "--connection-id",
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.",
        "type": "string",
        "required": false
      }
    ],
    "category": "auth",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
        },
        "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": "connection_id",
        "type": "string",
        "required": false,
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "Verify connection",
        "mcp_params": {
          "reason": "A tool call failed with a permission error"
        },
        "cli_command": "hopkin chatgpt auth check",
        "natural_language": "Verify connection"
      }
    ],
    "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_check_auth_status",
        "relationship": "cross-platform"
      },
      {
        "name": "chatgpt_ads_ping",
        "relationship": "sibling"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_list_ad_accounts",
    "title": "List ChatGPT Ads Accounts",
    "description": "List the ChatGPT Ads accounts you can reach.\n\nEach ChatGPT Ads API key is scoped to exactly one ad account, and the platform has no account-listing endpoint — so this lists your connected accounts, one per API key you have added. Use the returned connection_id to target a specific account in other tools, and chatgpt_ads_get_ad_account for live details (currency, timezone, review status).",
    "cli_command": "hopkin chatgpt ad-accounts list",
    "cli_flags": [],
    "category": "ad-accounts",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "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": "meta_ads_list_ad_accounts",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_list_ad_accounts",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_list_ad_accounts",
        "relationship": "cross-platform"
      },
      {
        "name": "chatgpt_ads_list_campaigns",
        "relationship": "hierarchy"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_list_connections",
    "title": "List ChatGPT Ads Connections",
    "description": "List the ChatGPT Ads connections available to you — both those you own and those shared with you by your organization. Shows each connection's display name, id, and whether it is your default.",
    "cli_command": "hopkin chatgpt connections list",
    "cli_flags": [],
    "category": "connections",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "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": "meta_ads_list_connections",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_list_connections",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_list_connections",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_list_connections",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_list_connections",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_set_default_connection",
    "title": "Set Default ChatGPT Ads Connection",
    "description": "Set which ChatGPT Ads connection other tools use when no connection_id is passed. Call chatgpt_ads_list_connections first to get a valid connection_id — do not guess one.",
    "cli_command": "hopkin chatgpt set-default-connection",
    "cli_flags": [
      {
        "flag": "--connection-id",
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection.",
        "type": "string",
        "required": true
      }
    ],
    "category": "set-default-connection",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "connection_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "connection_id",
        "type": "string",
        "required": true,
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
      },
      {
        "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_set_default_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_set_default_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_set_default_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_set_default_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_set_default_connection",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_rename_connection",
    "title": "Rename ChatGPT Ads Connection",
    "description": "Change a connection's display name. Owner-only.",
    "cli_command": "hopkin chatgpt rename-connection",
    "cli_flags": [
      {
        "flag": "--connection-id",
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection.",
        "type": "string",
        "required": true
      }
    ],
    "category": "rename-connection",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "connection_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "connection_id",
        "type": "string",
        "required": true,
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
      },
      {
        "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_rename_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_rename_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_rename_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_rename_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_rename_connection",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_share_connection",
    "title": "Share ChatGPT Ads Connection",
    "description": "Share an owned connection with your organization so teammates can report on that ad account. Owner-only. Note the ChatGPT Ads API has no reduced-scope keys, so sharing grants full read access to the whole ad account.",
    "cli_command": "hopkin chatgpt share-connection",
    "cli_flags": [
      {
        "flag": "--connection-id",
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection.",
        "type": "string",
        "required": true
      }
    ],
    "category": "share-connection",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "connection_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "connection_id",
        "type": "string",
        "required": true,
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
      },
      {
        "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_share_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_share_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_share_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_share_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_share_connection",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_unshare_connection",
    "title": "Unshare ChatGPT Ads Connection",
    "description": "Stop sharing an owned connection with your organization. Owner-only.",
    "cli_command": "hopkin chatgpt unshare-connection",
    "cli_flags": [
      {
        "flag": "--connection-id",
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection.",
        "type": "string",
        "required": true
      }
    ],
    "category": "unshare-connection",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "connection_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "connection_id",
        "type": "string",
        "required": true,
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
      },
      {
        "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_unshare_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_unshare_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_unshare_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_unshare_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_unshare_connection",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_revoke_connection",
    "title": "Revoke ChatGPT Ads Connection",
    "description": "Remove a stored ChatGPT Ads connection. Owner-only.\n\nThis deletes Hopkin's stored copy of the API key only. The key stays valid on the ChatGPT Ads platform — the API has no revocation endpoint — so tell the user to delete it in ChatGPT Ads Manager → Settings if they want it to stop working everywhere.",
    "cli_command": "hopkin chatgpt revoke-connection",
    "cli_flags": [
      {
        "flag": "--connection-id",
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection.",
        "type": "string",
        "required": true
      }
    ],
    "category": "revoke-connection",
    "annotations": {
      "readOnly": false,
      "destructive": true,
      "idempotent": true,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "connection_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "connection_id",
        "type": "string",
        "required": true,
        "description": "UUID of the connection to mark as the actor's default ChatGPT Ads connection."
      },
      {
        "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_revoke_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_revoke_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_revoke_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_revoke_connection",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_revoke_connection",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_developer_feedback",
    "title": "Submit Developer Feedback",
    "description": "Submit feedback about missing tools, improvements, bugs, or workflow gaps in the ChatGPT Ads MCP toolset. Not for user-facing issues (auth errors, API errors).\n\nArgs:\n  feedback_type: new_tool, improvement, bug, workflow_gap\n  title: Short description (5-200 chars)\n  description: What is needed and why (20-2000 chars)\n  current_workaround (optional): How you're working around the gap\n  priority (optional): low, medium (default), high\n\nReturns: confirmation that feedback was recorded.",
    "cli_command": "hopkin chatgpt 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": [
      {
        "label": "Missing tool",
        "mcp_params": {
          "feedback_type": "new_tool",
          "title": "Custom audience listing",
          "description": "Need a tool to list ChatGPT Ads custom audiences and their match rates",
          "priority": "medium",
          "reason": "User asked to audit audience targeting"
        },
        "cli_command": "hopkin chatgpt developer-feedback send --feedback-type new_tool --title Custom audience listing --description Need a tool to list ChatGPT Ads custom audiences and their match rates --priority medium",
        "natural_language": "Missing tool"
      },
      {
        "label": "Workflow gap",
        "mcp_params": {
          "feedback_type": "workflow_gap",
          "title": "Account-wide ad listing",
          "description": "Listing every ad in an account requires walking campaigns then ad groups then ads",
          "current_workaround": "Traverse the hierarchy tool by tool",
          "reason": "User asked for all ads at once"
        },
        "cli_command": "hopkin chatgpt developer-feedback send --feedback-type workflow_gap --title Account-wide ad listing --description Listing every ad in an account requires walking campaigns then ad groups then ads --current-workaround Traverse the hierarchy tool by tool",
        "natural_language": "Workflow gap"
      }
    ],
    "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_developer_feedback",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_list_campaigns",
    "title": "List ChatGPT Ads Campaigns",
    "description": "List campaigns in the ChatGPT Ads account, with optional status and name filtering.\n\nBudget and bid amounts are integer micros (1,000,000 micros = 1 unit of the account currency — see chatgpt_ads_get_ad_account).\n\nPass campaign_ids to resolve specific campaigns by ID instead of listing.\n\nCache-first: pass refresh: true to force a live fetch.",
    "cli_command": "hopkin chatgpt 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": "--campaign-ids",
        "description": "Fetch specific campaigns by ID instead of listing, e.g. [\"cmpn_abc123\"]. Other filters are ignored when set.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--status",
        "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--search",
        "description": "Filter by name (case-insensitive substring match).",
        "type": "string",
        "required": false
      },
      {
        "flag": "--connection-id",
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.",
        "type": "string",
        "required": false
      }
    ],
    "category": "campaigns",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "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."
        },
        "campaign_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "pattern": "^[A-Za-z0-9_-]+$"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific campaigns by ID instead of listing, e.g. [\"cmpn_abc123\"]. Other filters are ignored when set."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "minItems": 1,
          "maxItems": 20,
          "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter."
        },
        "search": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Filter by name (case-insensitive substring match)."
        },
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
        },
        "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": "campaign_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific campaigns by ID instead of listing, e.g. [\"cmpn_abc123\"]. Other filters are ignored when set."
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter."
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "description": "Filter by name (case-insensitive substring match).",
        "constraints": {
          "min_length": 1,
          "max_length": 200
        }
      },
      {
        "name": "connection_id",
        "type": "string",
        "required": false,
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "All campaigns",
        "mcp_params": {
          "reason": "Show the account structure"
        },
        "cli_command": "hopkin chatgpt campaigns list",
        "natural_language": "All campaigns"
      },
      {
        "label": "Active only",
        "mcp_params": {
          "status": [
            "active"
          ],
          "reason": "Review what is currently delivering"
        },
        "cli_command": "hopkin chatgpt campaigns list --status active",
        "natural_language": "Active only"
      },
      {
        "label": "By ID",
        "mcp_params": {
          "campaign_ids": [
            "cmpn_abc123"
          ],
          "reason": "Resolve a campaign id from an insights row"
        },
        "cli_command": "hopkin chatgpt campaigns list --campaign-ids cmpn_abc123",
        "natural_language": "By ID"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "chatgpt_ads_list_ad_accounts",
        "relationship": "hierarchy"
      },
      {
        "name": "chatgpt_ads_list_ad_groups",
        "relationship": "hierarchy"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_list_ad_groups",
    "title": "List ChatGPT Ads Ad Groups",
    "description": "List ad groups in a campaign. campaign_id is required — the ChatGPT Ads API has no account-wide ad group listing, so start from chatgpt_ads_list_campaigns and drill down.\n\nPass ad_group_ids to resolve specific ad groups by ID instead of listing.\n\nEach returned ad group carries the campaign_id you requested; the API itself does not return it on the ad group object.",
    "cli_command": "hopkin chatgpt 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": "--campaign",
        "description": "Campaign to list ad groups for (e.g. \"cmpn_abc123\"). Required — the API has no account-wide ad group listing. Get one from chatgpt_ads_list_campaigns.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--ad-group-ids",
        "description": "Fetch specific ad groups by ID instead of listing, e.g. [\"adgrp_abc123\"]. Other filters are ignored when set.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--status",
        "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--search",
        "description": "Filter by name (case-insensitive substring match).",
        "type": "string",
        "required": false
      },
      {
        "flag": "--connection-id",
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.",
        "type": "string",
        "required": false
      }
    ],
    "category": "ad-groups",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "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."
        },
        "campaign_id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64,
          "pattern": "^[A-Za-z0-9_-]+$",
          "description": "Campaign to list ad groups for (e.g. \"cmpn_abc123\"). Required — the API has no account-wide ad group listing. Get one from chatgpt_ads_list_campaigns."
        },
        "ad_group_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "pattern": "^[A-Za-z0-9_-]+$"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific ad groups by ID instead of listing, e.g. [\"adgrp_abc123\"]. Other filters are ignored when set."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "minItems": 1,
          "maxItems": 20,
          "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter."
        },
        "search": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Filter by name (case-insensitive substring match)."
        },
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "campaign_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": "campaign_id",
        "type": "string",
        "required": true,
        "description": "Campaign to list ad groups for (e.g. \"cmpn_abc123\"). Required — the API has no account-wide ad group listing. Get one from chatgpt_ads_list_campaigns.",
        "constraints": {
          "min_length": 1,
          "max_length": 64,
          "pattern": "^[A-Za-z0-9_-]+$"
        }
      },
      {
        "name": "ad_group_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific ad groups by ID instead of listing, e.g. [\"adgrp_abc123\"]. Other filters are ignored when set."
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter."
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "description": "Filter by name (case-insensitive substring match).",
        "constraints": {
          "min_length": 1,
          "max_length": 200
        }
      },
      {
        "name": "connection_id",
        "type": "string",
        "required": false,
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "For a campaign",
        "mcp_params": {
          "campaign_id": "cmpn_abc123",
          "reason": "Drill into a campaign"
        },
        "cli_command": "hopkin chatgpt ad-groups list --campaign cmpn_abc123",
        "natural_language": "For a campaign"
      },
      {
        "label": "By ID",
        "mcp_params": {
          "campaign_id": "cmpn_abc123",
          "ad_group_ids": [
            "adgrp_abc123"
          ],
          "reason": "Resolve a specific ad group"
        },
        "cli_command": "hopkin chatgpt ad-groups list --campaign cmpn_abc123 --ad-group-ids adgrp_abc123",
        "natural_language": "By ID"
      }
    ],
    "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_ad_groups",
        "relationship": "cross-platform"
      },
      {
        "name": "chatgpt_ads_list_campaigns",
        "relationship": "hierarchy"
      },
      {
        "name": "chatgpt_ads_list_ads",
        "relationship": "hierarchy"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_list_ads",
    "title": "List ChatGPT Ads Ads",
    "description": "List ads in an ad group, including creative and review status. Either ad_group_id or ad_ids is required — the API has no account-wide or campaign-wide ad listing, so drill down via chatgpt_ads_list_ad_groups.\n\nAn ad only delivers when it is approved AND its ad group and campaign are both active, so check review_status when an ad is not spending — filter on it with review_status: [\"rejected\"].\n\nPass ad_ids to resolve specific ads by ID without knowing their ad group. That is the way back from an insights row, which carries ad_id but no other context.\n\nEach returned ad carries the ad_group_id you requested; the API does not return it on the ad object.",
    "cli_command": "hopkin chatgpt 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": "--ad-group-id",
        "description": "Ad group to list ads for (e.g. \"adgrp_abc123\"). Required unless ad_ids is given — the API has no account-wide or campaign-wide ad listing. Get one from chatgpt_ads_list_ad_groups.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--ad-ids",
        "description": "Fetch specific ads by ID instead of listing, e.g. [\"ad_abc123\"]. Works without ad_group_id, and other filters are ignored when set.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--status",
        "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--review-status",
        "description": "Filter by review status: approved, in_review or rejected. Case-insensitive. An ad only delivers once approved. Applied client-side.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--search",
        "description": "Filter by name (case-insensitive substring match).",
        "type": "string",
        "required": false
      },
      {
        "flag": "--connection-id",
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.",
        "type": "string",
        "required": false
      }
    ],
    "category": "ads",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "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."
        },
        "ad_group_id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64,
          "pattern": "^[A-Za-z0-9_-]+$",
          "description": "Ad group to list ads for (e.g. \"adgrp_abc123\"). Required unless ad_ids is given — the API has no account-wide or campaign-wide ad listing. Get one from chatgpt_ads_list_ad_groups."
        },
        "ad_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "pattern": "^[A-Za-z0-9_-]+$"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific ads by ID instead of listing, e.g. [\"ad_abc123\"]. Works without ad_group_id, and other filters are ignored when set."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "minItems": 1,
          "maxItems": 20,
          "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter."
        },
        "review_status": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "minItems": 1,
          "maxItems": 10,
          "description": "Filter by review status: approved, in_review or rejected. Case-insensitive. An ad only delivers once approved. Applied client-side."
        },
        "search": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200,
          "description": "Filter by name (case-insensitive substring match)."
        },
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
        },
        "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": "ad_group_id",
        "type": "string",
        "required": false,
        "description": "Ad group to list ads for (e.g. \"adgrp_abc123\"). Required unless ad_ids is given — the API has no account-wide or campaign-wide ad listing. Get one from chatgpt_ads_list_ad_groups.",
        "constraints": {
          "min_length": 1,
          "max_length": 64,
          "pattern": "^[A-Za-z0-9_-]+$"
        }
      },
      {
        "name": "ad_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific ads by ID instead of listing, e.g. [\"ad_abc123\"]. Works without ad_group_id, and other filters are ignored when set."
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by status: active, paused or archived. Case-insensitive. Applied client-side — the API has no status filter."
      },
      {
        "name": "review_status",
        "type": "array",
        "required": false,
        "description": "Filter by review status: approved, in_review or rejected. Case-insensitive. An ad only delivers once approved. Applied client-side."
      },
      {
        "name": "search",
        "type": "string",
        "required": false,
        "description": "Filter by name (case-insensitive substring match).",
        "constraints": {
          "min_length": 1,
          "max_length": 200
        }
      },
      {
        "name": "connection_id",
        "type": "string",
        "required": false,
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "For an ad group",
        "mcp_params": {
          "ad_group_id": "adgrp_abc123",
          "reason": "Review creatives and review status"
        },
        "cli_command": "hopkin chatgpt ads list --ad-group-id adgrp_abc123",
        "natural_language": "For an ad group"
      },
      {
        "label": "By ID",
        "mcp_params": {
          "ad_ids": [
            "ad_abc123"
          ],
          "reason": "Resolve an ad id from an insights row"
        },
        "cli_command": "hopkin chatgpt ads list --ad-ids ad_abc123",
        "natural_language": "By ID"
      },
      {
        "label": "Not approved",
        "mcp_params": {
          "ad_group_id": "adgrp_abc123",
          "review_status": [
            "rejected",
            "in_review"
          ],
          "reason": "Find ads blocked from delivering"
        },
        "cli_command": "hopkin chatgpt ads list --ad-group-id adgrp_abc123 --review-status rejected,in_review",
        "natural_language": "Not approved"
      }
    ],
    "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_ads",
        "relationship": "cross-platform"
      },
      {
        "name": "chatgpt_ads_list_ad_groups",
        "relationship": "hierarchy"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_get_insights",
    "title": "Get ChatGPT Ads Insights",
    "description": "Delivery reporting for the ChatGPT Ads account: impressions, clicks, spend, ctr, cpc, cpm. These six are the only metrics the API exposes.\n\nThis is the performance report for ChatGPT Ads — there is no separate report tool on this server.\n\nScope vs rows: \\",
    "cli_command": "hopkin chatgpt insights get",
    "cli_flags": [
      {
        "flag": "--level",
        "description": "Scope of the report. \"ad_account\" covers the whole account; the others need entity_id.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--entity-id",
        "description": "Campaign, ad group, or ad ID to scope to. Required unless level is \"ad_account\".",
        "type": "string",
        "required": false
      },
      {
        "flag": "--aggregation-level",
        "description": "What each row represents. Must be at or below level. Defaults to level.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--time-granularity",
        "description": "Time bucket per row. \"none\" returns one row per entity for the whole window. Segmented requests do not support \"hourly\".",
        "type": "string",
        "required": false
      },
      {
        "flag": "--date-since",
        "description": "Start date (YYYY-MM-DD) in the ad account timezone. Defaults to 30 days before date_until.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--date-until",
        "description": "End date (YYYY-MM-DD) in the ad account timezone. Defaults to today.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--fields",
        "description": "Canonical dotted field names, e.g. [\"campaign.name\",\"campaign.spend\"]. Defaults to ids, name, and all six metrics for the aggregation level.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--filters",
        "description": "Filters, ANDed together. E.g. [{\"field\":\"campaign.id\",\"operator\":\"IN\",\"value\":[\"cmpn_1\"]}].",
        "type": "array",
        "required": false
      },
      {
        "flag": "--sort",
        "description": "Sort order, applied before pagination. E.g. [{\"field\":\"campaign.spend\",\"direction\":\"desc\"}].",
        "type": "array",
        "required": false
      },
      {
        "flag": "--segment",
        "description": "Extra breakdown dimension. Only available on enabled ad accounts; segmented requests cannot use hourly granularity.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--include-zero-impressions",
        "description": "Include entities with no impressions in the window.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--include-conversions",
        "description": "Also fetch attributed conversion totals per entity. Whole-window totals only, not per time bucket. Account-gated: if unavailable the delivery data is still returned.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--limit",
        "description": "Maximum rows to return (1–2000). Default: 100.",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "Opaque pagination cursor from a previous response.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--connection-id",
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.",
        "type": "string",
        "required": false
      }
    ],
    "category": "insights",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "level": {
          "type": "string",
          "enum": [
            "ad_account",
            "campaign",
            "ad_group",
            "ad"
          ],
          "default": "ad_account",
          "description": "Scope of the report. \"ad_account\" covers the whole account; the others need entity_id."
        },
        "entity_id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64,
          "pattern": "^[A-Za-z0-9_-]+$",
          "description": "Campaign, ad group, or ad ID to scope to. Required unless level is \"ad_account\"."
        },
        "aggregation_level": {
          "type": "string",
          "enum": [
            "ad_account",
            "campaign",
            "ad_group",
            "ad"
          ],
          "description": "What each row represents. Must be at or below level. Defaults to level."
        },
        "time_granularity": {
          "type": "string",
          "enum": [
            "hourly",
            "daily",
            "monthly",
            "none"
          ],
          "description": "Time bucket per row. \"none\" returns one row per entity for the whole window. Segmented requests do not support \"hourly\"."
        },
        "date_since": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "Start date (YYYY-MM-DD) in the ad account timezone. Defaults to 30 days before date_until."
        },
        "date_until": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "End date (YYYY-MM-DD) in the ad account timezone. Defaults to today."
        },
        "fields": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Canonical dotted field names, e.g. [\"campaign.name\",\"campaign.spend\"]. Defaults to ids, name, and all six metrics for the aggregation level."
        },
        "filters": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "field": {
                "type": "string"
              },
              "operator": {
                "type": "string",
                "enum": [
                  "IN",
                  "GREATER_THAN",
                  "LESS_THAN"
                ]
              },
              "value": {
                "anyOf": [
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  {
                    "type": "number"
                  }
                ]
              }
            },
            "required": [
              "field",
              "operator",
              "value"
            ],
            "additionalProperties": false
          },
          "minItems": 1,
          "maxItems": 20,
          "description": "Filters, ANDed together. E.g. [{\"field\":\"campaign.id\",\"operator\":\"IN\",\"value\":[\"cmpn_1\"]}]."
        },
        "sort": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "field": {
                "type": "string"
              },
              "direction": {
                "type": "string",
                "enum": [
                  "asc",
                  "desc"
                ]
              }
            },
            "required": [
              "field",
              "direction"
            ],
            "additionalProperties": false
          },
          "minItems": 1,
          "maxItems": 5,
          "description": "Sort order, applied before pagination. E.g. [{\"field\":\"campaign.spend\",\"direction\":\"desc\"}]."
        },
        "segment": {
          "type": "string",
          "enum": [
            "product",
            "country",
            "device"
          ],
          "description": "Extra breakdown dimension. Only available on enabled ad accounts; segmented requests cannot use hourly granularity."
        },
        "include_zero_impressions": {
          "type": "boolean",
          "default": false,
          "description": "Include entities with no impressions in the window."
        },
        "include_conversions": {
          "type": "boolean",
          "default": false,
          "description": "Also fetch attributed conversion totals per entity. Whole-window totals only, not per time bucket. Account-gated: if unavailable the delivery data is still returned."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 2000,
          "default": 100,
          "description": "Maximum rows to return (1–2000). Default: 100."
        },
        "cursor": {
          "type": "string",
          "description": "Opaque pagination cursor from a previous response."
        },
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
        },
        "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": "level",
        "type": "string",
        "required": false,
        "description": "Scope of the report. \"ad_account\" covers the whole account; the others need entity_id.",
        "enum_values": [
          "ad_account",
          "campaign",
          "ad_group",
          "ad"
        ],
        "default": "ad_account"
      },
      {
        "name": "entity_id",
        "type": "string",
        "required": false,
        "description": "Campaign, ad group, or ad ID to scope to. Required unless level is \"ad_account\".",
        "constraints": {
          "min_length": 1,
          "max_length": 64,
          "pattern": "^[A-Za-z0-9_-]+$"
        }
      },
      {
        "name": "aggregation_level",
        "type": "string",
        "required": false,
        "description": "What each row represents. Must be at or below level. Defaults to level.",
        "enum_values": [
          "ad_account",
          "campaign",
          "ad_group",
          "ad"
        ]
      },
      {
        "name": "time_granularity",
        "type": "string",
        "required": false,
        "description": "Time bucket per row. \"none\" returns one row per entity for the whole window. Segmented requests do not support \"hourly\".",
        "enum_values": [
          "hourly",
          "daily",
          "monthly",
          "none"
        ]
      },
      {
        "name": "date_since",
        "type": "string",
        "required": false,
        "description": "Start date (YYYY-MM-DD) in the ad account timezone. Defaults to 30 days before date_until.",
        "constraints": {
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        }
      },
      {
        "name": "date_until",
        "type": "string",
        "required": false,
        "description": "End date (YYYY-MM-DD) in the ad account timezone. Defaults to today.",
        "constraints": {
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        }
      },
      {
        "name": "fields",
        "type": "array",
        "required": false,
        "description": "Canonical dotted field names, e.g. [\"campaign.name\",\"campaign.spend\"]. Defaults to ids, name, and all six metrics for the aggregation level."
      },
      {
        "name": "filters",
        "type": "array",
        "required": false,
        "description": "Filters, ANDed together. E.g. [{\"field\":\"campaign.id\",\"operator\":\"IN\",\"value\":[\"cmpn_1\"]}]."
      },
      {
        "name": "sort",
        "type": "array",
        "required": false,
        "description": "Sort order, applied before pagination. E.g. [{\"field\":\"campaign.spend\",\"direction\":\"desc\"}]."
      },
      {
        "name": "segment",
        "type": "string",
        "required": false,
        "description": "Extra breakdown dimension. Only available on enabled ad accounts; segmented requests cannot use hourly granularity.",
        "enum_values": [
          "product",
          "country",
          "device"
        ]
      },
      {
        "name": "include_zero_impressions",
        "type": "boolean",
        "required": false,
        "description": "Include entities with no impressions in the window.",
        "default": false
      },
      {
        "name": "include_conversions",
        "type": "boolean",
        "required": false,
        "description": "Also fetch attributed conversion totals per entity. Whole-window totals only, not per time bucket. Account-gated: if unavailable the delivery data is still returned.",
        "default": false
      },
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "Maximum rows to return (1–2000). Default: 100.",
        "default": 100,
        "constraints": {
          "min": 1,
          "max": 2000
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": "Opaque pagination cursor from a previous response."
      },
      {
        "name": "connection_id",
        "type": "string",
        "required": false,
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "Last 30 days by campaign",
        "mcp_params": {
          "level": "ad_account",
          "aggregation_level": "campaign",
          "reason": "Monthly performance review"
        },
        "cli_command": "hopkin chatgpt insights get --level ad_account --aggregation-level campaign",
        "natural_language": "Last 30 days by campaign"
      },
      {
        "label": "Specific window",
        "mcp_params": {
          "level": "ad_account",
          "aggregation_level": "campaign",
          "date_since": "2026-07-01",
          "date_until": "2026-07-31",
          "reason": "July report"
        },
        "cli_command": "hopkin chatgpt insights get --level ad_account --aggregation-level campaign --date-since 2026-07-01 --date-until 2026-07-31",
        "natural_language": "Specific window"
      },
      {
        "label": "Top ads by clicks",
        "mcp_params": {
          "level": "ad_account",
          "aggregation_level": "ad",
          "sort": [
            {
              "field": "ad.clicks",
              "direction": "desc"
            }
          ],
          "limit": 10,
          "reason": "Find best performing creatives"
        },
        "cli_command": "hopkin chatgpt insights get --level ad_account --aggregation-level ad --sort [object Object] --limit 10",
        "natural_language": "Top ads by clicks"
      },
      {
        "label": "With conversions",
        "mcp_params": {
          "level": "ad_account",
          "aggregation_level": "campaign",
          "include_conversions": true,
          "reason": "Calculate cost per conversion"
        },
        "cli_command": "hopkin chatgpt insights get --level ad_account --aggregation-level campaign --include-conversions true",
        "natural_language": "With conversions"
      }
    ],
    "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_insights",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_list_conversion_event_settings",
    "title": "List ChatGPT Ads Conversion Event Settings",
    "description": "List the conversion events configured for the account — what each one counts, its attribution window, and which campaigns use it. Useful for interpreting the conversion totals returned by chatgpt_ads_get_insights.\n\nReturns a \"not enabled\" error on accounts without conversion tracking.",
    "cli_command": "hopkin chatgpt conversion-event-settings 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": "--connection-id",
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.",
        "type": "string",
        "required": false
      }
    ],
    "category": "conversion-event-settings",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "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."
        },
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
        },
        "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": "connection_id",
        "type": "string",
        "required": false,
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "List events",
        "mcp_params": {
          "reason": "Understand what conversions are being counted"
        },
        "cli_command": "hopkin chatgpt conversion-event-settings list",
        "natural_language": "List events"
      }
    ],
    "response_format": "markdown",
    "related_tools": [],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_list_custom_audiences",
    "title": "List ChatGPT Ads Custom Audiences",
    "description": "List the custom audiences on the account — name, status, and how many identifiers matched.\n\nIts main use is resolving identity: chatgpt_ads_list_campaigns returns targeting.custom_audiences.ids as bare IDs, so pass those to custom_audience_ids here to find out who a campaign actually targets.\n\nAudience sizes come back as privacy-bucketed ranges (e.g. \"5000-10000\"), never exact counts — report them as ranges.",
    "cli_command": "hopkin chatgpt custom-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": "--custom-audience-ids",
        "description": "Resolve specific audiences by ID instead of listing. Use this to turn the opaque IDs in a campaign's targeting.custom_audiences into names.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--connection-id",
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs.",
        "type": "string",
        "required": false
      }
    ],
    "category": "custom-audiences",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": false,
      "openWorld": false
    },
    "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."
        },
        "custom_audience_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "pattern": "^[A-Za-z0-9_-]+$"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Resolve specific audiences by ID instead of listing. Use this to turn the opaque IDs in a campaign's targeting.custom_audiences into names."
        },
        "connection_id": {
          "type": "string",
          "format": "uuid",
          "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
        },
        "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": "custom_audience_ids",
        "type": "array",
        "required": false,
        "description": "Resolve specific audiences by ID instead of listing. Use this to turn the opaque IDs in a campaign's targeting.custom_audiences into names."
      },
      {
        "name": "connection_id",
        "type": "string",
        "required": false,
        "description": "Optional ID of a specific connection to use for this call. Omit to use the actor's default connection for this network. Call <platform>_list_connections to discover available connection IDs."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "List audiences",
        "mcp_params": {
          "reason": "See what audiences exist"
        },
        "cli_command": "hopkin chatgpt custom-audiences list",
        "natural_language": "List audiences"
      },
      {
        "label": "Resolve targeting IDs",
        "mcp_params": {
          "custom_audience_ids": [
            "ca_abc123"
          ],
          "reason": "Name the audiences a campaign targets"
        },
        "cli_command": "hopkin chatgpt custom-audiences list --custom-audience-ids ca_abc123",
        "natural_language": "Resolve targeting IDs"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "reddit_ads_list_custom_audiences",
        "relationship": "cross-platform"
      }
    ],
    "tool_type": "standard"
  },
  {
    "name": "chatgpt_ads_ping",
    "title": "Ping ChatGPT Ads MCP Server",
    "description": "Health check. Returns server status, version, and timestamp. Does not contact the ChatGPT Ads API.",
    "cli_command": "hopkin chatgpt 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": [
      {
        "label": "Health check",
        "mcp_params": {
          "reason": "Verify server is running"
        },
        "cli_command": "hopkin chatgpt ping",
        "natural_language": "Health check"
      },
      {
        "label": "With message",
        "mcp_params": {
          "message": "hello",
          "reason": "Test connectivity"
        },
        "cli_command": "hopkin chatgpt ping --message hello",
        "natural_language": "With message"
      }
    ],
    "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_ping",
        "relationship": "cross-platform"
      },
      {
        "name": "chatgpt_ads_check_auth_status",
        "relationship": "sibling"
      }
    ],
    "tool_type": "standard"
  }
]