{
  "id": "list_publishers_by_active_campaigns",
  "mcp_tool": "list_publishers_by_active_campaigns",
  "status": "approved",
  "source_system": "cake",
  "environment": ["staging", "prod"],
  "sharded": false,
  "connections": {
    "whale": "cake_whale_ro",
    "admin": "cake_admin_ro"
  },
  "objects": [
    "Admin.lucos_ro_campaign_directory",
    "whale.lucos_ro_advertiser_stats_daily",
    "whale.lucos_ro_publisher_earnings_daily"
  ],
  "parameters": {
    "date_from": { "type": "date", "required": false },
    "date_to": { "type": "date", "required": false },
    "limit": { "type": "int", "required": false, "default": 50 }
  },
  "constraints": {
    "max_window_days": 92,
    "default_window_days": 31,
    "max_rows": 50,
    "timeout_ms": 60000
  },
  "allow_fields": [
    "affiliate_id",
    "affiliate_name",
    "active_campaign_count",
    "clicks",
    "affiliate_earning"
  ],
  "deny_fields": ["rev_share", "net_cpc", "cpc", "click_table_id"],
  "post_processing": [
    "Admin Set of camp_id WHERE status = 'A', then whale GROUP BY (affiliate_id, camp_id) clicks in the window (show_oos=0), merged in TypeScript (OD-1). Not the Admin CPC view. camp_id IN is chunked at 400.",
    "status = 'A' is current Admin.campaign.status (same field as MNGT lucos_ro_campaign_budget.status). MNGT UI labels A as Active. Full char map is unconfirmed. Not historical 'was active during the window'.",
    "Optional affiliate_earning is merged from same-host whale.lucos_ro_publisher_earnings_daily keyed by affiliate_id. Row-capped at 50."
  ],
  "notes": "Answers 'publishers associated with most active campaigns'. Unscoped publisher dump is prevented by ranking + row cap. clicks_source is whale.advertiser_stats_report. rev_share stays denied."
}
