[
  {
    "name": "linkedin_ads_get_account_summary",
    "title": "Get LinkedIn Account Summary",
    "description": "Get a high-level performance summary for a LinkedIn Ads account including spend, impressions, clicks, conversions, leads, and conversion breakdown. Conversion data may be delayed 24-72 hours.",
    "cli_command": "hopkin linkedin account-summary get",
    "cli_flags": [
      {
        "flag": "--account",
        "description": "Ad account ID (numeric, without URN prefix).",
        "type": "string",
        "required": true
      },
      {
        "flag": "--date-preset",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--start-date",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--end-date",
        "description": "",
        "type": "string",
        "required": false
      }
    ],
    "category": "account-summary",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad account ID (numeric, without URN prefix)."
        },
        "date_preset": {
          "type": "string",
          "enum": [
            "LAST_7_DAYS",
            "LAST_14_DAYS",
            "LAST_30_DAYS",
            "THIS_MONTH",
            "LAST_MONTH",
            "LAST_90_DAYS"
          ],
          "default": "LAST_30_DAYS"
        },
        "start_date": {
          "type": "string"
        },
        "end_date": {
          "type": "string"
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "account_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "account_id",
        "type": "string",
        "required": true,
        "description": "Ad account ID (numeric, without URN prefix).",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "date_preset",
        "type": "string",
        "required": false,
        "description": "",
        "enum_values": [
          "LAST_7_DAYS",
          "LAST_14_DAYS",
          "LAST_30_DAYS",
          "THIS_MONTH",
          "LAST_MONTH",
          "LAST_90_DAYS"
        ],
        "default": "LAST_30_DAYS"
      },
      {
        "name": "start_date",
        "type": "string",
        "required": false,
        "description": ""
      },
      {
        "name": "end_date",
        "type": "string",
        "required": false,
        "description": ""
      },
      {
        "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",
        "mcp_params": {
          "account_id": "123456789",
          "date_preset": "LAST_30_DAYS",
          "reason": "User wants an account overview"
        },
        "cli_command": "hopkin linkedin account-summary get --account 123456789 --date-preset LAST_30_DAYS",
        "natural_language": "Last 30 days"
      },
      {
        "label": "This month",
        "mcp_params": {
          "account_id": "123456789",
          "date_preset": "THIS_MONTH",
          "reason": "Monthly performance summary"
        },
        "cli_command": "hopkin linkedin account-summary get --account 123456789 --date-preset THIS_MONTH",
        "natural_language": "This month"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_get_account_summary",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_get_account_summary",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_get_account_summary",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_list_ad_accounts",
    "title": "List LinkedIn Ad Accounts",
    "description": "List LinkedIn Sponsored Ad Accounts accessible to the authenticated user.",
    "cli_command": "hopkin linkedin ad-accounts list",
    "cli_flags": [
      {
        "flag": "--status",
        "description": "Filter by account status. Defaults to [ACTIVE].",
        "type": "array",
        "required": false
      },
      {
        "flag": "--type",
        "description": "Filter by account type.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--include-test-accounts",
        "description": "Include test accounts. Defaults to false.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--limit",
        "description": "",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "Opaque pagination cursor.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "",
        "type": "boolean",
        "required": false
      }
    ],
    "category": "ad-accounts",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "DRAFT",
              "CANCELED",
              "PENDING_DELETION",
              "REMOVED"
            ]
          },
          "description": "Filter by account status. Defaults to [ACTIVE]."
        },
        "type": {
          "type": "string",
          "enum": [
            "BUSINESS",
            "ENTERPRISE"
          ],
          "description": "Filter by account type."
        },
        "include_test_accounts": {
          "type": "boolean",
          "default": false,
          "description": "Include test accounts. Defaults to false."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20
        },
        "cursor": {
          "type": "string",
          "description": "Opaque pagination cursor."
        },
        "refresh": {
          "type": "boolean",
          "default": false
        },
        "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": "status",
        "type": "array",
        "required": false,
        "description": "Filter by account status. Defaults to [ACTIVE]."
      },
      {
        "name": "type",
        "type": "string",
        "required": false,
        "description": "Filter by account type.",
        "enum_values": [
          "BUSINESS",
          "ENTERPRISE"
        ]
      },
      {
        "name": "include_test_accounts",
        "type": "boolean",
        "required": false,
        "description": "Include test accounts. Defaults to false.",
        "default": false
      },
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": "Opaque pagination cursor."
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "",
        "default": false
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "List active accounts",
        "mcp_params": {
          "reason": "User wants to see their LinkedIn ad accounts"
        },
        "cli_command": "hopkin linkedin ad-accounts list",
        "natural_language": "List active accounts"
      },
      {
        "label": "Include test accounts",
        "mcp_params": {
          "include_test_accounts": true,
          "reason": "User wants to see test accounts"
        },
        "cli_command": "hopkin linkedin ad-accounts list --include-test-accounts true",
        "natural_language": "Include test accounts"
      },
      {
        "label": "By type",
        "mcp_params": {
          "type": "BUSINESS",
          "reason": "Filter to business accounts only"
        },
        "cli_command": "hopkin linkedin ad-accounts list --type BUSINESS",
        "natural_language": "By type"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_list_ad_accounts",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_list_campaign_groups",
        "relationship": "hierarchy"
      },
      {
        "name": "linkedin_ads_list_campaigns",
        "relationship": "hierarchy"
      },
      {
        "name": "reddit_ads_list_ad_accounts",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_check_auth_status",
    "title": "Check LinkedIn Ads Authentication Status",
    "description": "Troubleshoot authentication issues and get user profile info. Only use when another tool fails with a permission or authentication error — do NOT call proactively.",
    "cli_command": "hopkin linkedin auth check",
    "cli_flags": [],
    "category": "auth",
    "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": [
      {
        "label": "Check auth",
        "mcp_params": {
          "reason": "Another tool returned an auth error, checking LinkedIn account connection status"
        },
        "cli_command": "hopkin linkedin auth check",
        "natural_language": "Check auth"
      }
    ],
    "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_ping",
        "relationship": "sibling"
      },
      {
        "name": "reddit_ads_check_auth_status",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_check_auth_status",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_get_budget_pricing",
    "title": "Get LinkedIn Budget & Pricing",
    "description": "Get bid ranges and daily budget limits for a LinkedIn campaign type and audience. Call this before creating a campaign to understand recommended bids. DYNAMIC campaign type is not supported by this endpoint.",
    "cli_command": "hopkin linkedin budget-pricing get",
    "cli_flags": [
      {
        "flag": "--account",
        "description": "Ad account ID (numeric, without URN prefix).",
        "type": "string",
        "required": true
      },
      {
        "flag": "--campaign-type",
        "description": "Campaign type. DYNAMIC is not supported by this endpoint.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--bid-type",
        "description": "Bid type. CPV is only valid for SPONSORED_UPDATES video campaigns.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--match-type",
        "description": "",
        "type": "string",
        "required": true
      },
      {
        "flag": "--currency",
        "description": "ISO-4217 currency code (e.g. USD, GBP).",
        "type": "string",
        "required": true
      },
      {
        "flag": "--location-urns",
        "description": "Target location URNs (e.g. urn:li:geo:103644278 for USA).",
        "type": "array",
        "required": true
      },
      {
        "flag": "--seniority-urns",
        "description": "Target seniority URNs (e.g. urn:li:seniority:4 for Senior).",
        "type": "array",
        "required": false
      },
      {
        "flag": "--job-function-urns",
        "description": "Target job function URNs.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--industry-urns",
        "description": "Target industry URNs.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--company-size-urns",
        "description": "Target company size range URNs (e.g. urn:li:staffCountRange:(51,200)).",
        "type": "array",
        "required": false
      },
      {
        "flag": "--objective-type",
        "description": "Affects suggested bid.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--daily-budget-amount",
        "description": "Current or target daily budget (influences suggested bid calculation).",
        "type": "number",
        "required": false
      }
    ],
    "category": "budget-pricing",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": false,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad account ID (numeric, without URN prefix)."
        },
        "campaign_type": {
          "type": "string",
          "enum": [
            "TEXT_AD",
            "SPONSORED_UPDATES",
            "SPONSORED_INMAILS"
          ],
          "description": "Campaign type. DYNAMIC is not supported by this endpoint."
        },
        "bid_type": {
          "type": "string",
          "enum": [
            "CPM",
            "CPC",
            "CPV"
          ],
          "description": "Bid type. CPV is only valid for SPONSORED_UPDATES video campaigns."
        },
        "match_type": {
          "type": "string",
          "enum": [
            "EXACT",
            "AUDIENCE_EXPANDED"
          ]
        },
        "currency": {
          "type": "string",
          "minLength": 3,
          "maxLength": 3,
          "description": "ISO-4217 currency code (e.g. USD, GBP)."
        },
        "location_urns": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "description": "Target location URNs (e.g. urn:li:geo:103644278 for USA)."
        },
        "seniority_urns": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Target seniority URNs (e.g. urn:li:seniority:4 for Senior)."
        },
        "job_function_urns": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Target job function URNs."
        },
        "industry_urns": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Target industry URNs."
        },
        "company_size_urns": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Target company size range URNs (e.g. urn:li:staffCountRange:(51,200))."
        },
        "objective_type": {
          "type": "string",
          "description": "Affects suggested bid."
        },
        "daily_budget_amount": {
          "type": "number",
          "description": "Current or target daily budget (influences suggested bid calculation)."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "account_id",
        "campaign_type",
        "bid_type",
        "match_type",
        "currency",
        "location_urns",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "account_id",
        "type": "string",
        "required": true,
        "description": "Ad account ID (numeric, without URN prefix).",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "campaign_type",
        "type": "string",
        "required": true,
        "description": "Campaign type. DYNAMIC is not supported by this endpoint.",
        "enum_values": [
          "TEXT_AD",
          "SPONSORED_UPDATES",
          "SPONSORED_INMAILS"
        ]
      },
      {
        "name": "bid_type",
        "type": "string",
        "required": true,
        "description": "Bid type. CPV is only valid for SPONSORED_UPDATES video campaigns.",
        "enum_values": [
          "CPM",
          "CPC",
          "CPV"
        ]
      },
      {
        "name": "match_type",
        "type": "string",
        "required": true,
        "description": "",
        "enum_values": [
          "EXACT",
          "AUDIENCE_EXPANDED"
        ]
      },
      {
        "name": "currency",
        "type": "string",
        "required": true,
        "description": "ISO-4217 currency code (e.g. USD, GBP).",
        "constraints": {
          "min_length": 3,
          "max_length": 3
        }
      },
      {
        "name": "location_urns",
        "type": "array",
        "required": true,
        "description": "Target location URNs (e.g. urn:li:geo:103644278 for USA)."
      },
      {
        "name": "seniority_urns",
        "type": "array",
        "required": false,
        "description": "Target seniority URNs (e.g. urn:li:seniority:4 for Senior)."
      },
      {
        "name": "job_function_urns",
        "type": "array",
        "required": false,
        "description": "Target job function URNs."
      },
      {
        "name": "industry_urns",
        "type": "array",
        "required": false,
        "description": "Target industry URNs."
      },
      {
        "name": "company_size_urns",
        "type": "array",
        "required": false,
        "description": "Target company size range URNs (e.g. urn:li:staffCountRange:(51,200))."
      },
      {
        "name": "objective_type",
        "type": "string",
        "required": false,
        "description": "Affects suggested bid."
      },
      {
        "name": "daily_budget_amount",
        "type": "number",
        "required": false,
        "description": "Current or target daily budget (influences suggested bid calculation)."
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "Sponsored Content CPM",
        "mcp_params": {
          "account_id": "123456789",
          "campaign_type": "SPONSORED_UPDATES",
          "bid_type": "CPM",
          "match_type": "EXACT",
          "currency": "USD",
          "location_urns": [
            "urn:li:geo:103644278"
          ],
          "reason": "User wants to know bid ranges before creating a campaign"
        },
        "cli_command": "hopkin linkedin budget-pricing get --account 123456789 --campaign-type SPONSORED_UPDATES --bid-type CPM --match-type EXACT --currency USD --location-urns urn:li:geo:103644278",
        "natural_language": "Sponsored Content CPM"
      },
      {
        "label": "Text Ad CPC",
        "mcp_params": {
          "account_id": "123456789",
          "campaign_type": "TEXT_AD",
          "bid_type": "CPC",
          "match_type": "BROAD",
          "currency": "USD",
          "location_urns": [
            "urn:li:geo:103644278"
          ],
          "reason": "Get text ad pricing for US audience"
        },
        "cli_command": "hopkin linkedin budget-pricing get --account 123456789 --campaign-type TEXT_AD --bid-type CPC --match-type BROAD --currency USD --location-urns urn:li:geo:103644278",
        "natural_language": "Text Ad CPC"
      }
    ],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "linkedin_ads_list_campaign_groups",
    "title": "List LinkedIn Campaign Groups",
    "description": "List LinkedIn Campaign Groups for an ad account. Campaign groups are the top-level organizational unit containing campaigns.",
    "cli_command": "hopkin linkedin campaign-groups list",
    "cli_flags": [
      {
        "flag": "--account",
        "description": "Ad account ID (numeric, without URN prefix).",
        "type": "string",
        "required": true
      },
      {
        "flag": "--status",
        "description": "Filter by status. Defaults to [ACTIVE, PAUSED].",
        "type": "array",
        "required": false
      },
      {
        "flag": "--campaign-group-id",
        "description": "Fetch a single campaign group by numeric ID.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--campaign-group-ids",
        "description": "Fetch specific campaign groups by numeric IDs (batch GET).",
        "type": "array",
        "required": false
      },
      {
        "flag": "--limit",
        "description": "",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "",
        "type": "boolean",
        "required": false
      }
    ],
    "category": "campaign-groups",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad account ID (numeric, without URN prefix)."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "PAUSED",
              "DRAFT",
              "ARCHIVED",
              "CANCELED",
              "PENDING_DELETION",
              "REMOVED"
            ]
          },
          "description": "Filter by status. Defaults to [ACTIVE, PAUSED]."
        },
        "campaign_group_id": {
          "type": "string",
          "description": "Fetch a single campaign group by numeric ID."
        },
        "campaign_group_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific campaign groups by numeric IDs (batch GET)."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20
        },
        "cursor": {
          "type": "string"
        },
        "refresh": {
          "type": "boolean",
          "default": false
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "account_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "account_id",
        "type": "string",
        "required": true,
        "description": "Ad account ID (numeric, without URN prefix).",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by status. Defaults to [ACTIVE, PAUSED]."
      },
      {
        "name": "campaign_group_id",
        "type": "string",
        "required": false,
        "description": "Fetch a single campaign group by numeric ID."
      },
      {
        "name": "campaign_group_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific campaign groups by numeric IDs (batch GET)."
      },
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": ""
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "",
        "default": false
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "List active groups",
        "mcp_params": {
          "account_id": "123456789",
          "reason": "User wants to see campaign groups"
        },
        "cli_command": "hopkin linkedin campaign-groups list --account 123456789",
        "natural_language": "List active groups"
      },
      {
        "label": "Filter by status",
        "mcp_params": {
          "account_id": "123456789",
          "status": [
            "ACTIVE",
            "PAUSED"
          ],
          "reason": "Show active and paused campaign groups"
        },
        "cli_command": "hopkin linkedin campaign-groups list --account 123456789 --status ACTIVE,PAUSED",
        "natural_language": "Filter by status"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "linkedin_ads_list_ad_accounts",
        "relationship": "hierarchy"
      },
      {
        "name": "linkedin_ads_list_campaigns",
        "relationship": "hierarchy"
      }
    ]
  },
  {
    "name": "linkedin_ads_list_campaigns",
    "title": "List LinkedIn Campaigns",
    "description": "List LinkedIn Campaigns for an ad account. Campaigns define targeting, bidding, and budget within a campaign group.",
    "cli_command": "hopkin linkedin campaigns list",
    "cli_flags": [
      {
        "flag": "--account",
        "description": "Ad account ID (numeric, without URN prefix).",
        "type": "string",
        "required": true
      },
      {
        "flag": "--status",
        "description": "Filter by status. Defaults to [ACTIVE, PAUSED].",
        "type": "array",
        "required": false
      },
      {
        "flag": "--campaign-group-id",
        "description": "Filter by campaign group (numeric ID).",
        "type": "string",
        "required": false
      },
      {
        "flag": "--type",
        "description": "Filter by campaign type.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--campaign",
        "description": "Fetch a single campaign by numeric ID.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--campaign-ids",
        "description": "Fetch specific campaigns by numeric IDs (batch filter).",
        "type": "array",
        "required": false
      },
      {
        "flag": "--limit",
        "description": "",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "",
        "type": "boolean",
        "required": false
      }
    ],
    "category": "campaigns",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad account ID (numeric, without URN prefix)."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "PAUSED",
              "DRAFT",
              "ARCHIVED",
              "COMPLETED",
              "CANCELED",
              "PENDING_DELETION",
              "REMOVED"
            ]
          },
          "description": "Filter by status. Defaults to [ACTIVE, PAUSED]."
        },
        "campaign_group_id": {
          "type": "string",
          "description": "Filter by campaign group (numeric ID)."
        },
        "type": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "TEXT_AD",
              "SPONSORED_UPDATES",
              "SPONSORED_INMAILS",
              "DYNAMIC",
              "EVENT_AD"
            ]
          },
          "description": "Filter by campaign type."
        },
        "campaign_id": {
          "type": "string",
          "description": "Fetch a single campaign by numeric ID."
        },
        "campaign_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific campaigns by numeric IDs (batch filter)."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20
        },
        "cursor": {
          "type": "string"
        },
        "refresh": {
          "type": "boolean",
          "default": false
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "account_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "account_id",
        "type": "string",
        "required": true,
        "description": "Ad account ID (numeric, without URN prefix).",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by status. Defaults to [ACTIVE, PAUSED]."
      },
      {
        "name": "campaign_group_id",
        "type": "string",
        "required": false,
        "description": "Filter by campaign group (numeric ID)."
      },
      {
        "name": "type",
        "type": "array",
        "required": false,
        "description": "Filter by campaign type."
      },
      {
        "name": "campaign_id",
        "type": "string",
        "required": false,
        "description": "Fetch a single campaign by numeric ID."
      },
      {
        "name": "campaign_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific campaigns by numeric IDs (batch filter)."
      },
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": ""
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "",
        "default": false
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "List active campaigns",
        "mcp_params": {
          "account_id": "123456789",
          "reason": "User wants to see campaigns"
        },
        "cli_command": "hopkin linkedin campaigns list --account 123456789",
        "natural_language": "List active campaigns"
      },
      {
        "label": "By campaign group",
        "mcp_params": {
          "account_id": "123456789",
          "campaign_group_id": "987654",
          "reason": "List campaigns under a specific campaign group"
        },
        "cli_command": "hopkin linkedin campaigns list --account 123456789 --campaign-group-id 987654",
        "natural_language": "By campaign group"
      },
      {
        "label": "By type",
        "mcp_params": {
          "account_id": "123456789",
          "type": [
            "SPONSORED_UPDATES"
          ],
          "reason": "Filter to sponsored content campaigns"
        },
        "cli_command": "hopkin linkedin campaigns list --account 123456789 --type SPONSORED_UPDATES",
        "natural_language": "By type"
      }
    ],
    "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_ad_accounts",
        "relationship": "hierarchy"
      },
      {
        "name": "linkedin_ads_list_campaign_groups",
        "relationship": "hierarchy"
      },
      {
        "name": "linkedin_ads_list_creatives",
        "relationship": "hierarchy"
      },
      {
        "name": "reddit_ads_list_campaigns",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_list_campaigns",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_list_creatives",
    "title": "List LinkedIn Creatives",
    "description": "List LinkedIn Creatives (ads) for an ad account. IMPORTANT: Always explicitly pass resolve_content=true when the user asks about ad copy, headlines, body text, URLs, or creative details — do not omit it and rely on the default. Only set resolve_content=false when the user needs metadata-only and has NOT asked about content.",
    "cli_command": "hopkin linkedin creatives list",
    "cli_flags": [
      {
        "flag": "--account",
        "description": "Ad account ID (numeric, without URN prefix).",
        "type": "string",
        "required": true
      },
      {
        "flag": "--campaign-ids",
        "description": "Filter by campaign IDs (numeric).",
        "type": "array",
        "required": false
      },
      {
        "flag": "--status",
        "description": "Filter by intended status. Defaults to [ACTIVE, PAUSED, DRAFT].",
        "type": "array",
        "required": false
      },
      {
        "flag": "--resolve-content",
        "description": "Resolve ad copy (headline, body text, destination URL) from linked posts/shares. Default: true. Set to false only when you need metadata-only (IDs, status, content type) and explicitly do NOT need ad copy.",
        "type": "boolean",
        "required": false
      },
      {
        "flag": "--creative-id",
        "description": "Fetch a single creative by URN or numeric ID.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--creative-ids",
        "description": "Fetch specific creatives by numeric IDs (batch filter).",
        "type": "array",
        "required": false
      },
      {
        "flag": "--limit",
        "description": "",
        "type": "integer",
        "required": false
      },
      {
        "flag": "--cursor",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--refresh",
        "description": "",
        "type": "boolean",
        "required": false
      }
    ],
    "category": "creatives",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad account ID (numeric, without URN prefix)."
        },
        "campaign_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 20,
          "description": "Filter by campaign IDs (numeric)."
        },
        "status": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "ACTIVE",
              "PAUSED",
              "DRAFT",
              "ARCHIVED",
              "CANCELED",
              "PENDING_DELETION",
              "REMOVED"
            ]
          },
          "description": "Filter by intended status. Defaults to [ACTIVE, PAUSED, DRAFT]."
        },
        "resolve_content": {
          "type": "boolean",
          "default": true,
          "description": "Resolve ad copy (headline, body text, destination URL) from linked posts/shares. Default: true. Set to false only when you need metadata-only (IDs, status, content type) and explicitly do NOT need ad copy."
        },
        "creative_id": {
          "type": "string",
          "description": "Fetch a single creative by URN or numeric ID."
        },
        "creative_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Fetch specific creatives by numeric IDs (batch filter)."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 20
        },
        "cursor": {
          "type": "string"
        },
        "refresh": {
          "type": "boolean",
          "default": false
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "account_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "account_id",
        "type": "string",
        "required": true,
        "description": "Ad account ID (numeric, without URN prefix).",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "campaign_ids",
        "type": "array",
        "required": false,
        "description": "Filter by campaign IDs (numeric)."
      },
      {
        "name": "status",
        "type": "array",
        "required": false,
        "description": "Filter by intended status. Defaults to [ACTIVE, PAUSED, DRAFT]."
      },
      {
        "name": "resolve_content",
        "type": "boolean",
        "required": false,
        "description": "Resolve ad copy (headline, body text, destination URL) from linked posts/shares. Default: true. Set to false only when you need metadata-only (IDs, status, content type) and explicitly do NOT need ad copy.",
        "default": true
      },
      {
        "name": "creative_id",
        "type": "string",
        "required": false,
        "description": "Fetch a single creative by URN or numeric ID."
      },
      {
        "name": "creative_ids",
        "type": "array",
        "required": false,
        "description": "Fetch specific creatives by numeric IDs (batch filter)."
      },
      {
        "name": "limit",
        "type": "integer",
        "required": false,
        "description": "",
        "default": 20,
        "constraints": {
          "min": 1,
          "max": 100
        }
      },
      {
        "name": "cursor",
        "type": "string",
        "required": false,
        "description": ""
      },
      {
        "name": "refresh",
        "type": "boolean",
        "required": false,
        "description": "",
        "default": false
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "List active creatives",
        "mcp_params": {
          "account_id": "123456789",
          "reason": "User wants to see ads"
        },
        "cli_command": "hopkin linkedin creatives list --account 123456789",
        "natural_language": "List active creatives"
      },
      {
        "label": "By campaign",
        "mcp_params": {
          "account_id": "123456789",
          "campaign_ids": [
            "654321"
          ],
          "reason": "Show creatives for a specific campaign"
        },
        "cli_command": "hopkin linkedin creatives list --account 123456789 --campaign-ids 654321",
        "natural_language": "By campaign"
      },
      {
        "label": "With content resolved",
        "mcp_params": {
          "account_id": "123456789",
          "resolve_content": true,
          "reason": "Show ad copy and headline text"
        },
        "cli_command": "hopkin linkedin creatives list --account 123456789 --resolve-content true",
        "natural_language": "With content resolved"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "linkedin_ads_list_campaigns",
        "relationship": "hierarchy"
      }
    ]
  },
  {
    "name": "linkedin_ads_developer_feedback",
    "title": "Submit Developer Feedback",
    "description": "Submit feedback about missing tools, improvements, or workflow gaps in the LinkedIn Ads MCP toolset. Not for user-facing issues like auth or API errors.",
    "cli_command": "hopkin linkedin 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": "Bulk campaign status toggle",
          "description": "Need to pause/enable multiple LinkedIn campaigns at once rather than one by one",
          "priority": "high",
          "reason": "User asked to pause 8 campaigns individually"
        },
        "cli_command": "hopkin linkedin developer-feedback send --feedback-type new_tool --title Bulk campaign status toggle --description Need to pause/enable multiple LinkedIn campaigns at once rather than one by one --priority high",
        "natural_language": "Missing tool"
      },
      {
        "label": "Workflow gap",
        "mcp_params": {
          "feedback_type": "workflow_gap",
          "title": "Campaign group hierarchy cloning",
          "description": "No way to duplicate a campaign group including all campaigns and creatives",
          "current_workaround": "Read and recreate each level one by one",
          "reason": "User wanted to duplicate campaign structure for A/B test"
        },
        "cli_command": "hopkin linkedin developer-feedback send --feedback-type workflow_gap --title Campaign group hierarchy cloning --description No way to duplicate a campaign group including all campaigns and creatives --current-workaround Read and recreate each level one by one",
        "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": "reddit_ads_developer_feedback",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_developer_feedback",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_get_insights",
    "title": "Get LinkedIn Ads Insights",
    "description": "Get LinkedIn Ads analytics with a single pivot dimension. For standard analysis, prefer linkedin_ads_get_performance_report; use this only for MEMBER_* demographic pivots (unique to LinkedIn) or custom metric queries not available in the performance report. MEMBER_* pivots have a 3-event minimum threshold and 12-24 hour data delay, so totals may not match account-level numbers. Max 18 metrics per query.",
    "cli_command": "hopkin linkedin insights get",
    "cli_flags": [
      {
        "flag": "--account",
        "description": "Ad account ID (numeric, without URN prefix).",
        "type": "string",
        "required": true
      },
      {
        "flag": "--pivot",
        "description": "Analytics pivot dimension. MEMBER_* pivots provide demographic breakdowns unique to LinkedIn.",
        "type": "string",
        "required": true
      },
      {
        "flag": "--date-preset",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--start-date",
        "description": "ISO date YYYY-MM-DD. Use with end_date to override date_preset.",
        "type": "string",
        "required": false
      },
      {
        "flag": "--end-date",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--time-granularity",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--campaign-ids",
        "description": "Filter to specific campaigns (numeric IDs).",
        "type": "array",
        "required": false
      },
      {
        "flag": "--campaign-group-ids",
        "description": "Filter to specific campaign groups (numeric IDs).",
        "type": "array",
        "required": false
      },
      {
        "flag": "--metrics",
        "description": "LinkedIn adAnalytics metric field names (camelCase, exact names required). Core: impressions, clicks, costInLocalCurrency, costInUsd. Conversions: externalWebsiteConversions, externalWebsitePostClickConversions, externalWebsitePostViewConversions, conversionValueInLocalCurrency. Leads: oneClickLeads, oneClickLeadFormOpens, qualifiedLeads. Video: videoViews, videoCompletions. Engagement: totalEngagements, shares, follows, reactions, comments, landingPageClicks, textUrlClicks, companyPageClicks. Card: cardImpressions, cardClicks, viralCardImpressions, viralCardClicks. Reach: approximateMemberReach (only with ACCOUNT/CAMPAIGN_GROUP/CAMPAIGN pivot, ≤92 day range). IMPORTANT: Do NOT use aliases like \"conversions\", \"leads\", \"spend\", or \"reach\" — use the exact camelCase field names listed above. Max 18 (pivotValues + dateRange count toward the 20-field API limit). Defaults to: impressions, clicks, costInLocalCurrency, costInUsd, externalWebsiteConversions, oneClickLeads, videoViews, totalEngagements.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--include-conversion-breakdown",
        "description": "When true (and pivot is not CONVERSION), runs a second query to break down conversions per action with names.",
        "type": "boolean",
        "required": false
      }
    ],
    "category": "insights",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad account ID (numeric, without URN prefix)."
        },
        "pivot": {
          "type": "string",
          "enum": [
            "ACCOUNT",
            "CAMPAIGN_GROUP",
            "CAMPAIGN",
            "CREATIVE",
            "SHARE",
            "COMPANY",
            "CONVERSION",
            "CONVERSATION_NODE",
            "SERVING_LOCATION",
            "PLACEMENT_NAME",
            "IMPRESSION_DEVICE_TYPE",
            "CARD_INDEX",
            "MEMBER_COMPANY_SIZE",
            "MEMBER_INDUSTRY",
            "MEMBER_SENIORITY",
            "MEMBER_JOB_TITLE",
            "MEMBER_JOB_FUNCTION",
            "MEMBER_COUNTRY_V2",
            "MEMBER_REGION_V2",
            "MEMBER_COUNTY",
            "MEMBER_COMPANY"
          ],
          "description": "Analytics pivot dimension. MEMBER_* pivots provide demographic breakdowns unique to LinkedIn."
        },
        "date_preset": {
          "type": "string",
          "enum": [
            "LAST_7_DAYS",
            "LAST_14_DAYS",
            "LAST_30_DAYS",
            "THIS_MONTH",
            "LAST_MONTH",
            "LAST_90_DAYS"
          ],
          "default": "LAST_30_DAYS"
        },
        "start_date": {
          "type": "string",
          "description": "ISO date YYYY-MM-DD. Use with end_date to override date_preset."
        },
        "end_date": {
          "type": "string"
        },
        "time_granularity": {
          "type": "string",
          "enum": [
            "ALL",
            "DAILY",
            "MONTHLY"
          ],
          "default": "ALL"
        },
        "campaign_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50,
          "description": "Filter to specific campaigns (numeric IDs)."
        },
        "campaign_group_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 20,
          "description": "Filter to specific campaign groups (numeric IDs)."
        },
        "metrics": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 18,
          "description": "LinkedIn adAnalytics metric field names (camelCase, exact names required). Core: impressions, clicks, costInLocalCurrency, costInUsd. Conversions: externalWebsiteConversions, externalWebsitePostClickConversions, externalWebsitePostViewConversions, conversionValueInLocalCurrency. Leads: oneClickLeads, oneClickLeadFormOpens, qualifiedLeads. Video: videoViews, videoCompletions. Engagement: totalEngagements, shares, follows, reactions, comments, landingPageClicks, textUrlClicks, companyPageClicks. Card: cardImpressions, cardClicks, viralCardImpressions, viralCardClicks. Reach: approximateMemberReach (only with ACCOUNT/CAMPAIGN_GROUP/CAMPAIGN pivot, ≤92 day range). IMPORTANT: Do NOT use aliases like \"conversions\", \"leads\", \"spend\", or \"reach\" — use the exact camelCase field names listed above. Max 18 (pivotValues + dateRange count toward the 20-field API limit). Defaults to: impressions, clicks, costInLocalCurrency, costInUsd, externalWebsiteConversions, oneClickLeads, videoViews, totalEngagements."
        },
        "include_conversion_breakdown": {
          "type": "boolean",
          "default": false,
          "description": "When true (and pivot is not CONVERSION), runs a second query to break down conversions per action with names."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "account_id",
        "pivot",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "account_id",
        "type": "string",
        "required": true,
        "description": "Ad account ID (numeric, without URN prefix).",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "pivot",
        "type": "string",
        "required": true,
        "description": "Analytics pivot dimension. MEMBER_* pivots provide demographic breakdowns unique to LinkedIn.",
        "enum_values": [
          "ACCOUNT",
          "CAMPAIGN_GROUP",
          "CAMPAIGN",
          "CREATIVE",
          "SHARE",
          "COMPANY",
          "CONVERSION",
          "CONVERSATION_NODE",
          "SERVING_LOCATION",
          "PLACEMENT_NAME",
          "IMPRESSION_DEVICE_TYPE",
          "CARD_INDEX",
          "MEMBER_COMPANY_SIZE",
          "MEMBER_INDUSTRY",
          "MEMBER_SENIORITY",
          "MEMBER_JOB_TITLE",
          "MEMBER_JOB_FUNCTION",
          "MEMBER_COUNTRY_V2",
          "MEMBER_REGION_V2",
          "MEMBER_COUNTY",
          "MEMBER_COMPANY"
        ]
      },
      {
        "name": "date_preset",
        "type": "string",
        "required": false,
        "description": "",
        "enum_values": [
          "LAST_7_DAYS",
          "LAST_14_DAYS",
          "LAST_30_DAYS",
          "THIS_MONTH",
          "LAST_MONTH",
          "LAST_90_DAYS"
        ],
        "default": "LAST_30_DAYS"
      },
      {
        "name": "start_date",
        "type": "string",
        "required": false,
        "description": "ISO date YYYY-MM-DD. Use with end_date to override date_preset."
      },
      {
        "name": "end_date",
        "type": "string",
        "required": false,
        "description": ""
      },
      {
        "name": "time_granularity",
        "type": "string",
        "required": false,
        "description": "",
        "enum_values": [
          "ALL",
          "DAILY",
          "MONTHLY"
        ],
        "default": "ALL"
      },
      {
        "name": "campaign_ids",
        "type": "array",
        "required": false,
        "description": "Filter to specific campaigns (numeric IDs)."
      },
      {
        "name": "campaign_group_ids",
        "type": "array",
        "required": false,
        "description": "Filter to specific campaign groups (numeric IDs)."
      },
      {
        "name": "metrics",
        "type": "array",
        "required": false,
        "description": "LinkedIn adAnalytics metric field names (camelCase, exact names required). Core: impressions, clicks, costInLocalCurrency, costInUsd. Conversions: externalWebsiteConversions, externalWebsitePostClickConversions, externalWebsitePostViewConversions, conversionValueInLocalCurrency. Leads: oneClickLeads, oneClickLeadFormOpens, qualifiedLeads. Video: videoViews, videoCompletions. Engagement: totalEngagements, shares, follows, reactions, comments, landingPageClicks, textUrlClicks, companyPageClicks. Card: cardImpressions, cardClicks, viralCardImpressions, viralCardClicks. Reach: approximateMemberReach (only with ACCOUNT/CAMPAIGN_GROUP/CAMPAIGN pivot, ≤92 day range). IMPORTANT: Do NOT use aliases like \"conversions\", \"leads\", \"spend\", or \"reach\" — use the exact camelCase field names listed above. Max 18 (pivotValues + dateRange count toward the 20-field API limit). Defaults to: impressions, clicks, costInLocalCurrency, costInUsd, externalWebsiteConversions, oneClickLeads, videoViews, totalEngagements."
      },
      {
        "name": "include_conversion_breakdown",
        "type": "boolean",
        "required": false,
        "description": "When true (and pivot is not CONVERSION), runs a second query to break down conversions per action with names.",
        "default": false
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "Job function breakdown",
        "mcp_params": {
          "account_id": "123456789",
          "pivot": "MEMBER_JOB_FUNCTION",
          "date_preset": "LAST_30_DAYS",
          "reason": "Demographic breakdown by job function"
        },
        "cli_command": "hopkin linkedin insights get --account 123456789 --pivot MEMBER_JOB_FUNCTION --date-preset LAST_30_DAYS",
        "natural_language": "Job function breakdown"
      },
      {
        "label": "Seniority breakdown",
        "mcp_params": {
          "account_id": "123456789",
          "pivot": "MEMBER_SENIORITY",
          "date_preset": "LAST_30_DAYS",
          "reason": "Performance by member seniority level"
        },
        "cli_command": "hopkin linkedin insights get --account 123456789 --pivot MEMBER_SENIORITY --date-preset LAST_30_DAYS",
        "natural_language": "Seniority breakdown"
      },
      {
        "label": "Industry breakdown",
        "mcp_params": {
          "account_id": "123456789",
          "pivot": "MEMBER_INDUSTRY",
          "date_preset": "LAST_30_DAYS",
          "reason": "Reach and engagement by industry"
        },
        "cli_command": "hopkin linkedin insights get --account 123456789 --pivot MEMBER_INDUSTRY --date-preset LAST_30_DAYS",
        "natural_language": "Industry breakdown"
      },
      {
        "label": "Device type breakdown",
        "mcp_params": {
          "account_id": "123456789",
          "pivot": "IMPRESSION_DEVICE_TYPE",
          "date_preset": "LAST_30_DAYS",
          "reason": "Performance split by device type"
        },
        "cli_command": "hopkin linkedin insights get --account 123456789 --pivot IMPRESSION_DEVICE_TYPE --date-preset LAST_30_DAYS",
        "natural_language": "Device type breakdown"
      }
    ],
    "response_format": "json",
    "related_tools": [
      {
        "name": "meta_ads_get_insights",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_get_insights",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_get_insights",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_get_partner_conversions",
    "title": "Get LinkedIn Partner Conversions",
    "description": "List partner conversions (conversion actions) configured for a LinkedIn Ads account. Use this to understand what conversion tracking is set up before analyzing performance data.",
    "cli_command": "hopkin linkedin partner-conversions get",
    "cli_flags": [
      {
        "flag": "--account",
        "description": "Ad account ID (numeric, without URN prefix).",
        "type": "string",
        "required": true
      }
    ],
    "category": "partner-conversions",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad account ID (numeric, without URN prefix)."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "account_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "account_id",
        "type": "string",
        "required": true,
        "description": "Ad account ID (numeric, without URN prefix).",
        "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": [
      {
        "label": "List all partner conversions",
        "mcp_params": {
          "account_id": "123456789",
          "reason": "User wants to see what partner conversions are configured"
        },
        "cli_command": "hopkin linkedin partner-conversions get --account 123456789",
        "natural_language": "List all partner conversions"
      }
    ],
    "response_format": "markdown",
    "related_tools": []
  },
  {
    "name": "linkedin_ads_get_performance_report",
    "title": "Get LinkedIn Ads Performance Report",
    "description": "Get a full-funnel performance report with up to 3 pivot dimensions and optional per-conversion-action breakdown. MEMBER_* demographic pivots are not supported here — use linkedin_ads_get_insights instead.",
    "cli_command": "hopkin linkedin performance-report get",
    "cli_flags": [
      {
        "flag": "--account",
        "description": "Ad account ID (numeric, without URN prefix).",
        "type": "string",
        "required": true
      },
      {
        "flag": "--pivots",
        "description": "Up to 3 pivot dimensions. OBJECTIVE_TYPE is only available in q=statistics.",
        "type": "array",
        "required": false
      },
      {
        "flag": "--date-preset",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--start-date",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--end-date",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--time-granularity",
        "description": "",
        "type": "string",
        "required": false
      },
      {
        "flag": "--campaign-ids",
        "description": "",
        "type": "array",
        "required": false
      },
      {
        "flag": "--campaign-group-ids",
        "description": "",
        "type": "array",
        "required": false
      },
      {
        "flag": "--include-conversion-breakdown",
        "description": "Run a second query for per-conversion-action breakdown. Adds one extra API call.",
        "type": "boolean",
        "required": false
      }
    ],
    "category": "reporting",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": true
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "account_id": {
          "type": "string",
          "minLength": 1,
          "description": "Ad account ID (numeric, without URN prefix)."
        },
        "pivots": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "ACCOUNT",
              "CAMPAIGN_GROUP",
              "CAMPAIGN",
              "CREATIVE",
              "SHARE",
              "COMPANY",
              "CONVERSION",
              "SERVING_LOCATION",
              "PLACEMENT_NAME",
              "IMPRESSION_DEVICE_TYPE",
              "CARD_INDEX",
              "OBJECTIVE_TYPE"
            ]
          },
          "minItems": 1,
          "maxItems": 3,
          "default": [
            "CAMPAIGN"
          ],
          "description": "Up to 3 pivot dimensions. OBJECTIVE_TYPE is only available in q=statistics."
        },
        "date_preset": {
          "type": "string",
          "enum": [
            "LAST_7_DAYS",
            "LAST_14_DAYS",
            "LAST_30_DAYS",
            "THIS_MONTH",
            "LAST_MONTH",
            "LAST_90_DAYS"
          ],
          "default": "LAST_30_DAYS"
        },
        "start_date": {
          "type": "string"
        },
        "end_date": {
          "type": "string"
        },
        "time_granularity": {
          "type": "string",
          "enum": [
            "ALL",
            "DAILY",
            "MONTHLY"
          ],
          "default": "ALL"
        },
        "campaign_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 50
        },
        "campaign_group_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 20
        },
        "include_conversion_breakdown": {
          "type": "boolean",
          "default": true,
          "description": "Run a second query for per-conversion-action breakdown. Adds one extra API call."
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "account_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "account_id",
        "type": "string",
        "required": true,
        "description": "Ad account ID (numeric, without URN prefix).",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "pivots",
        "type": "array",
        "required": false,
        "description": "Up to 3 pivot dimensions. OBJECTIVE_TYPE is only available in q=statistics.",
        "default": [
          "CAMPAIGN"
        ]
      },
      {
        "name": "date_preset",
        "type": "string",
        "required": false,
        "description": "",
        "enum_values": [
          "LAST_7_DAYS",
          "LAST_14_DAYS",
          "LAST_30_DAYS",
          "THIS_MONTH",
          "LAST_MONTH",
          "LAST_90_DAYS"
        ],
        "default": "LAST_30_DAYS"
      },
      {
        "name": "start_date",
        "type": "string",
        "required": false,
        "description": ""
      },
      {
        "name": "end_date",
        "type": "string",
        "required": false,
        "description": ""
      },
      {
        "name": "time_granularity",
        "type": "string",
        "required": false,
        "description": "",
        "enum_values": [
          "ALL",
          "DAILY",
          "MONTHLY"
        ],
        "default": "ALL"
      },
      {
        "name": "campaign_ids",
        "type": "array",
        "required": false,
        "description": ""
      },
      {
        "name": "campaign_group_ids",
        "type": "array",
        "required": false,
        "description": ""
      },
      {
        "name": "include_conversion_breakdown",
        "type": "boolean",
        "required": false,
        "description": "Run a second query for per-conversion-action breakdown. Adds one extra API call.",
        "default": true
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "Campaign report",
        "mcp_params": {
          "account_id": "123456789",
          "pivots": [
            "CAMPAIGN"
          ],
          "date_preset": "LAST_30_DAYS",
          "reason": "User wants full campaign performance report"
        },
        "cli_command": "hopkin linkedin performance-report get --account 123456789 --pivots CAMPAIGN --date-preset LAST_30_DAYS",
        "natural_language": "Campaign report"
      },
      {
        "label": "With conversion breakdown",
        "mcp_params": {
          "account_id": "123456789",
          "pivots": [
            "CAMPAIGN"
          ],
          "date_preset": "LAST_30_DAYS",
          "include_conversion_breakdown": true,
          "reason": "Show conversion breakdown by campaign"
        },
        "cli_command": "hopkin linkedin performance-report get --account 123456789 --pivots CAMPAIGN --date-preset LAST_30_DAYS --include-conversion-breakdown true",
        "natural_language": "With conversion breakdown"
      },
      {
        "label": "Daily campaign group",
        "mcp_params": {
          "account_id": "123456789",
          "pivots": [
            "CAMPAIGN_GROUP"
          ],
          "time_granularity": "DAILY",
          "date_preset": "LAST_7_DAYS",
          "reason": "Daily trend by campaign group"
        },
        "cli_command": "hopkin linkedin performance-report get --account 123456789 --pivots CAMPAIGN_GROUP --time-granularity DAILY --date-preset LAST_7_DAYS",
        "natural_language": "Daily campaign group"
      }
    ],
    "response_format": "json",
    "related_tools": [
      {
        "name": "meta_ads_get_performance_report",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_get_performance_report",
        "relationship": "cross-platform"
      },
      {
        "name": "reddit_ads_get_performance_report",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_get_performance_report",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_ping",
    "title": "Ping LinkedIn Ads MCP Server",
    "description": "Health check for the LinkedIn Ads MCP server. Does not call the LinkedIn API.",
    "cli_command": "hopkin linkedin 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 linkedin ping",
        "natural_language": "Health check"
      },
      {
        "label": "With message",
        "mcp_params": {
          "message": "hello",
          "reason": "Test connectivity"
        },
        "cli_command": "hopkin linkedin 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_check_auth_status",
        "relationship": "sibling"
      },
      {
        "name": "reddit_ads_ping",
        "relationship": "cross-platform"
      },
      {
        "name": "tiktok_ads_ping",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_store_preference",
    "title": "Store LinkedIn Ads Preference",
    "description": "Store a persistent preference for a LinkedIn ad entity. Use when you infer a recurring preference about analysis, reporting, or management. Updates existing keys. Entity type \"ad_set\" maps to LinkedIn campaigns; \"ad\" maps to creatives.",
    "cli_command": "hopkin linkedin preferences store",
    "cli_flags": [
      {
        "flag": "--entity-type",
        "description": "Type of ad entity: ad_account, campaign, ad_set (Meta ad sets / Google ad groups), or ad",
        "type": "string",
        "required": true
      },
      {
        "flag": "--entity-id",
        "description": "The platform entity ID (e.g. act_123456, 23842453456789)",
        "type": "string",
        "required": true
      },
      {
        "flag": "--key",
        "description": "Preference key (e.g. preferred_conversion_metric, budget_alert_threshold)",
        "type": "string",
        "required": true
      },
      {
        "flag": "--value",
        "description": "Preference value — string, number, boolean, or JSON object",
        "type": "unknown",
        "required": false
      },
      {
        "flag": "--source",
        "description": "Who set this preference: agent (default), user, or system",
        "type": "string",
        "required": false
      },
      {
        "flag": "--note",
        "description": "Optional context about why this preference was set",
        "type": "string",
        "required": false
      }
    ],
    "category": "preferences",
    "annotations": {
      "readOnly": false,
      "destructive": false,
      "idempotent": true,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "entity_type": {
          "type": "string",
          "enum": [
            "ad_account",
            "campaign",
            "ad_set",
            "ad"
          ],
          "description": "Type of ad entity: ad_account, campaign, ad_set (Meta ad sets / Google ad groups), or ad"
        },
        "entity_id": {
          "type": "string",
          "minLength": 1,
          "description": "The platform entity ID (e.g. act_123456, 23842453456789)"
        },
        "key": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100,
          "description": "Preference key (e.g. preferred_conversion_metric, budget_alert_threshold)"
        },
        "value": {
          "description": "Preference value — string, number, boolean, or JSON object"
        },
        "source": {
          "type": "string",
          "enum": [
            "agent",
            "user",
            "system"
          ],
          "default": "agent",
          "description": "Who set this preference: agent (default), user, or system"
        },
        "note": {
          "type": "string",
          "maxLength": 500,
          "description": "Optional context about why this preference was set"
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "entity_type",
        "entity_id",
        "key",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "entity_type",
        "type": "string",
        "required": true,
        "description": "Type of ad entity: ad_account, campaign, ad_set (Meta ad sets / Google ad groups), or ad",
        "enum_values": [
          "ad_account",
          "campaign",
          "ad_set",
          "ad"
        ]
      },
      {
        "name": "entity_id",
        "type": "string",
        "required": true,
        "description": "The platform entity ID (e.g. act_123456, 23842453456789)",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "key",
        "type": "string",
        "required": true,
        "description": "Preference key (e.g. preferred_conversion_metric, budget_alert_threshold)",
        "constraints": {
          "min_length": 1,
          "max_length": 100
        }
      },
      {
        "name": "value",
        "type": "unknown",
        "required": false,
        "description": "Preference value — string, number, boolean, or JSON object"
      },
      {
        "name": "source",
        "type": "string",
        "required": false,
        "description": "Who set this preference: agent (default), user, or system",
        "enum_values": [
          "agent",
          "user",
          "system"
        ],
        "default": "agent"
      },
      {
        "name": "note",
        "type": "string",
        "required": false,
        "description": "Optional context about why this preference was set",
        "constraints": {
          "max_length": 500
        }
      },
      {
        "name": "reason",
        "type": "string",
        "required": true,
        "description": "Why this tool call is needed",
        "constraints": {
          "min_length": 1,
          "max_length": 500
        }
      }
    ],
    "examples": [
      {
        "label": "Set metric",
        "mcp_params": {
          "entity_type": "ad_account",
          "entity_id": "123456789",
          "key": "preferred_conversion_metric",
          "value": "oneClickLeads",
          "reason": "User wants lead conversions as default metric"
        },
        "cli_command": "hopkin linkedin preferences store --entity-type ad_account --entity-id 123456789 --key preferred_conversion_metric --value oneClickLeads",
        "natural_language": "Set metric"
      },
      {
        "label": "Set threshold",
        "mcp_params": {
          "entity_type": "campaign",
          "entity_id": "987654321",
          "key": "budget_alert_threshold",
          "value": 0.8,
          "reason": "Alert at 80% of campaign budget"
        },
        "cli_command": "hopkin linkedin preferences store --entity-type campaign --entity-id 987654321 --key budget_alert_threshold --value 0.8",
        "natural_language": "Set threshold"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_store_preference",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_store_preference",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_get_preferences",
        "relationship": "sibling"
      },
      {
        "name": "linkedin_ads_delete_preference",
        "relationship": "sibling"
      },
      {
        "name": "reddit_ads_store_preference",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_get_preferences",
    "title": "Get LinkedIn Ads Preferences",
    "description": "Get all stored preferences for a LinkedIn Ads entity. Preferences are also automatically attached to entity-listing responses, so you often don't need to call this explicitly.",
    "cli_command": "hopkin linkedin preferences get",
    "cli_flags": [
      {
        "flag": "--entity-type",
        "description": "Type of ad entity: ad_account, campaign, ad_set, or ad",
        "type": "string",
        "required": true
      },
      {
        "flag": "--entity-id",
        "description": "The platform entity ID",
        "type": "string",
        "required": true
      }
    ],
    "category": "preferences",
    "annotations": {
      "readOnly": true,
      "destructive": false,
      "idempotent": true,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "entity_type": {
          "type": "string",
          "enum": [
            "ad_account",
            "campaign",
            "ad_set",
            "ad"
          ],
          "description": "Type of ad entity: ad_account, campaign, ad_set, or ad"
        },
        "entity_id": {
          "type": "string",
          "minLength": 1,
          "description": "The platform entity ID"
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "entity_type",
        "entity_id",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "entity_type",
        "type": "string",
        "required": true,
        "description": "Type of ad entity: ad_account, campaign, ad_set, or ad",
        "enum_values": [
          "ad_account",
          "campaign",
          "ad_set",
          "ad"
        ]
      },
      {
        "name": "entity_id",
        "type": "string",
        "required": true,
        "description": "The platform entity 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": [
      {
        "label": "Get prefs",
        "mcp_params": {
          "entity_type": "ad_account",
          "entity_id": "123456789",
          "reason": "Check stored preferences before running report"
        },
        "cli_command": "hopkin linkedin preferences get --entity-type ad_account --entity-id 123456789",
        "natural_language": "Get prefs"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_get_preferences",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_get_preferences",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_store_preference",
        "relationship": "sibling"
      },
      {
        "name": "linkedin_ads_delete_preference",
        "relationship": "sibling"
      },
      {
        "name": "reddit_ads_get_preferences",
        "relationship": "cross-platform"
      }
    ]
  },
  {
    "name": "linkedin_ads_delete_preference",
    "title": "Delete LinkedIn Ads Preference",
    "description": "Delete a stored preference for a LinkedIn Ads entity by key. No-op if the preference doesn't exist.",
    "cli_command": "hopkin linkedin preference delete",
    "cli_flags": [
      {
        "flag": "--entity-type",
        "description": "Type of ad entity: ad_account, campaign, ad_set, or ad",
        "type": "string",
        "required": true
      },
      {
        "flag": "--entity-id",
        "description": "The platform entity ID",
        "type": "string",
        "required": true
      },
      {
        "flag": "--key",
        "description": "The preference key to delete",
        "type": "string",
        "required": true
      }
    ],
    "category": "preferences",
    "annotations": {
      "readOnly": false,
      "destructive": true,
      "idempotent": true,
      "openWorld": false
    },
    "inputSchema": {
      "type": "object",
      "properties": {
        "entity_type": {
          "type": "string",
          "enum": [
            "ad_account",
            "campaign",
            "ad_set",
            "ad"
          ],
          "description": "Type of ad entity: ad_account, campaign, ad_set, or ad"
        },
        "entity_id": {
          "type": "string",
          "minLength": 1,
          "description": "The platform entity ID"
        },
        "key": {
          "type": "string",
          "minLength": 1,
          "description": "The preference key to delete"
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "Why this tool call is needed"
        }
      },
      "required": [
        "entity_type",
        "entity_id",
        "key",
        "reason"
      ],
      "additionalProperties": false,
      "$schema": "http://json-schema.org/draft-07/schema#"
    },
    "parameters": [
      {
        "name": "entity_type",
        "type": "string",
        "required": true,
        "description": "Type of ad entity: ad_account, campaign, ad_set, or ad",
        "enum_values": [
          "ad_account",
          "campaign",
          "ad_set",
          "ad"
        ]
      },
      {
        "name": "entity_id",
        "type": "string",
        "required": true,
        "description": "The platform entity ID",
        "constraints": {
          "min_length": 1
        }
      },
      {
        "name": "key",
        "type": "string",
        "required": true,
        "description": "The preference key to delete",
        "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": [
      {
        "label": "Delete pref",
        "mcp_params": {
          "entity_type": "campaign",
          "entity_id": "987654321",
          "key": "budget_alert_threshold",
          "reason": "User no longer wants budget alerts for this campaign"
        },
        "cli_command": "hopkin linkedin preference delete --entity-type campaign --entity-id 987654321 --key budget_alert_threshold",
        "natural_language": "Delete pref"
      }
    ],
    "response_format": "markdown",
    "related_tools": [
      {
        "name": "meta_ads_delete_preference",
        "relationship": "cross-platform"
      },
      {
        "name": "google_ads_delete_preference",
        "relationship": "cross-platform"
      },
      {
        "name": "linkedin_ads_store_preference",
        "relationship": "sibling"
      },
      {
        "name": "linkedin_ads_get_preferences",
        "relationship": "sibling"
      },
      {
        "name": "reddit_ads_delete_preference",
        "relationship": "cross-platform"
      }
    ]
  }
]