riligar-marketing-ads-meta — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited riligar-marketing-ads-meta (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Skill completa para gestao de Meta Ads via SDK oficial (facebook-business). Substitui o MCP fb-ads-mcp-server com mais poder: duplicacao de campanhas/ads, swap de url_tags, e acesso total a API.
Quando o usuario pedir para configurar, rodar setup, ou for a primeira vez usando a skill, o Claude deve guiar o setup interativo.
IMPORTANTE: Ler references/setup-meta-app.md ANTES de comecar o setup. Esse arquivo contem o passo a passo completo para criar o app no Meta Developer Dashboard, gerar o token e resolver problemas. Se o aluno mandar prints ou tiver duvidas sobre alguma tela do Facebook, consultar esse arquivo para orientar.
python3 ~/.claude/skills/riligar-marketing-ads-meta/scripts/setup.pyChecar se existe ~/.claude/skills/riligar-marketing-ads-meta/.env. Se NAO existir, criar com o template:
# RiLiGar Marketing Ads Meta — Configuracao
# Os scripts leem este arquivo automaticamente. NAO precisa adicionar ao ~/.zshrc.
# OBRIGATORIO: Token de acesso da Meta (gerar em developers.facebook.com > Graph API Explorer)
META_ADS_TOKEN=""
# OBRIGATORIO: App ID do app Meta que gerou o token (ver em developers.facebook.com > My Apps)
META_APP_ID=""
# OPCIONAL: Conta de anuncio padrao (evita ter que passar --account toda vez)
META_AD_ACCOUNT_ID=""Depois de criar, orientar o usuario a:
META_ADS_TOKEN (token de acesso)META_APP_ID (ID do app Meta — ex: 905545132380980)IMPORTANTE: Os scripts leem o .env automaticamente. NAO precisa fazer source no ~/.zshrc. O token fica isolado dentro da skill e nao vaza pra outras sessoes do terminal.
IMPORTANTE: O app Meta DEVE estar em modo Live (nao Development) para criar dark posts e criativos via API. Se der erro "app em modo de desenvolvimento", orientar o usuario a mudar o app para modo Live no painel developers.facebook.com. Alem disso, as paginas do Facebook que serao usadas nos anuncios devem estar vinculadas/autorizadas no app.
Depois que o .env estiver preenchido e o setup.py passar, o Claude DEVE proativamente guiar o cadastro de contas:
read.py accounts para listar todas as contas disponiveiscontas.yaml automaticamente com as respostasEsse fluxo conversacional e o jeito ideal de configurar — o usuario so responde as perguntas e o Claude preenche tudo.
Arquivo: ~/.claude/skills/riligar-marketing-ads-meta/contas.yaml
Antes de executar qualquer operacao, o Claude DEVE ler este arquivo para resolver nomes de clientes para IDs. Quando o usuario disser "cria campanha pra DobraLabs" ou "insights do Ronnau", consultar o contas.yaml para obter conta_anuncio, pagina_facebook e instagram_id do cliente.
Se o cliente nao estiver cadastrado, perguntar os dados e oferecer para adicionar ao arquivo.
Todos os scripts estao em ~/.claude/skills/riligar-marketing-ads-meta/scripts/. O padrao e:
python3 <script>.py <subcomando> [argumentos]O Claude deve interpretar o pedido do usuario e executar o script correto via Bash.
| Subcomando | O que faz | Exemplo |
|---|---|---|
accounts | Lista contas de anuncio | read.py accounts |
account-details | Detalhes de uma conta | read.py account-details --id act_123 |
campaigns | Lista campanhas | read.py campaigns --account act_123 --status ACTIVE |
campaign | Detalhes de uma campanha | read.py campaign --id 123 |
adsets | Lista ad sets de uma conta | read.py adsets --account act_123 |
adsets-by-campaign | Ad sets de uma campanha | read.py adsets-by-campaign --campaign 123 |
adset | Detalhes de um ad set | read.py adset --id 123 |
adsets-by-ids | Varios ad sets por IDs | read.py adsets-by-ids --ids 123,456 |
ads | Lista ads de uma conta | read.py ads --account act_123 --status ACTIVE |
ads-by-campaign | Ads de uma campanha | read.py ads-by-campaign --campaign 123 |
ads-by-adset | Ads de um ad set | read.py ads-by-adset --adset 123 |
ad | Detalhes de um ad | read.py ad --id 123 |
creative | Detalhes de um criativo | read.py creative --id 123 |
creatives-by-ad | Criativos de um ad | read.py creatives-by-ad --ad 123 |
preview | Preview HTML de criativo | read.py preview --creative 123 --format INSTAGRAM_STORY ou --format all |
images | Lista imagens da conta | read.py images --account act_123 |
videos | Lista videos da conta | read.py videos --account act_123 |
activities | Log de atividades da conta | read.py activities --account act_123 |
activities-by-adset | Atividades de um ad set | read.py activities-by-adset --adset 123 |
custom-audiences | Lista audiencias custom | read.py custom-audiences --account act_123 |
lookalike-audiences | Lista audiencias lookalike | read.py lookalike-audiences --account act_123 |
paginate | Busca URL de paginacao | read.py paginate --url "https://..." |
| Subcomando | Exemplo |
|---|---|
account | insights.py account --id act_123 --date-preset last_7d |
campaign | insights.py campaign --id 123 --date-preset last_30d --breakdowns age,gender |
adset | insights.py adset --id 123 --time-range '{"since":"2026-03-01","until":"2026-03-31"}' |
ad | insights.py ad --id 123 --date-preset yesterday |
async | insights.py async --id act_123 --date-preset maximum --level campaign |
Parametros de insights:
| Parametro | O que faz | Exemplo |
|---|---|---|
--date-preset | Periodo relativo | last_7d, last_30d, today, maximum |
--time-range | Periodo especifico (JSON) | '{"since":"2026-01-01","until":"2026-01-31"}' |
--time-ranges | Comparacao entre periodos (JSON) | '[{"since":"2026-01","until":"2026-01-31"},{"since":"2026-02-01","until":"2026-02-28"}]' |
--time-increment | Granularidade | 1, 7, monthly, all_days |
--breakdowns | Segmentar resultados | age,gender, country, publisher_platform |
--action-breakdowns | Segmentar acoes | action_type, action_device |
--action-report-time | Quando acoes contam | impression, conversion, mixed |
--action-attribution-windows | Janela de atribuicao | 1d_view,7d_click, 28d_click, dda |
--level | Nivel de agregacao | account, campaign, adset, ad |
--filtering | Filtrar resultados (JSON) | '[{"field":"spend","operator":"GREATER_THAN","value":50}]' |
--sort | Ordenar | spend_descending, impressions_ascending |
--default-summary | Incluir totais | (flag, sem valor) |
--locale | Idioma dos resultados | pt_BR, en_US |
--limit | Limite por pagina | 25 (default) |
--offset | Pular N resultados | 50 |
--since / --until | Paginacao temporal | 2026-01-01 |
--use-account-attribution | Usar atribuicao da conta | (flag) |
| Subcomando | Exemplo |
|---|---|
interests | targeting.py interests --q "design grafico" |
interest-suggestions | targeting.py interest-suggestions --ids 123,456 |
behaviors | targeting.py behaviors --locale pt_BR |
demographics | targeting.py demographics |
geolocations | targeting.py geolocations --q "Porto Alegre" --types city |
validate | targeting.py validate --account act_123 --spec '{...}' |
reach | targeting.py reach --account act_123 --spec '{...}' |
delivery | targeting.py delivery --account act_123 --spec '{...}' --daily-budget 5000 |
describe | targeting.py describe --account act_123 --spec '{...}' |
| Subcomando | Exemplo |
|---|---|
campaign | create.py campaign --account act_123 --name "LEADS-Teste" --objective OUTCOME_LEADS |
adset | create.py adset --account act_123 --name "Publico-Frio" --campaign 123 --optimization-goal LINK_CLICKS --targeting '{...}' --daily-budget 5000 |
ad | create.py ad --account act_123 --name "Carrossel-V1" --adset 123 --creative '{"creative_id":"456"}' --degrees-of-freedom-spec '{...}' |
creative | create.py creative --account act_123 --name "Criativo-V1" --instagram-user-id 123 --object-story-spec '{...}' --url-tags "utm_source=facebook&utm_medium=cpc" |
image | create.py image --account act_123 --url "https://exemplo.com/imagem.jpg" |
video | create.py video --account act_123 --url "https://exemplo.com/video.mp4" |
custom-audience | create.py custom-audience --account act_123 --name "Compradores-2026" |
lookalike | create.py lookalike --account act_123 --name "LAL-Compradores" --source 123 --spec '{"country":"BR","ratio":0.01}' |
IMPORTANTE: Todas as criacoes sao feitas com status PAUSED. Revisar antes de ativar.
| Subcomando | Exemplo |
|---|---|
campaign | update.py campaign --id 123 --status ACTIVE --daily-budget 10000 |
adset | update.py adset --id 123 --targeting '{...}' --daily-budget 5000 |
ad | update.py ad --id 123 --status PAUSED |
audience-users | update.py audience-users --id 123 --schema EMAIL --data '[["hash1"]]' --action add |
| Subcomando | Exemplo |
|---|---|
object | delete.py object --id 123 |
audience | delete.py audience --id 123 |
| Subcomando | O que faz | Exemplo |
|---|---|---|
swap-url-tags | Troca url_tags de um ad existente | advanced.py swap-url-tags --ad 123 --url-tags "utm_source=facebook&utm_medium=cpc&utm_campaign=leads" |
duplicate-ad | Duplica ad com novos url_tags | advanced.py duplicate-ad --id 123 --adset 456 --url-tags "utm_source=facebook" |
duplicate-adset | Duplica ad set | advanced.py duplicate-adset --id 123 --campaign 456 |
duplicate-campaign | Duplica campanha inteira | advanced.py duplicate-campaign --id 123 --deep |
O swap-url-tags resolve o problema de nao poder editar url_tags em criativos existentes: cria um criativo novo identico com os url_tags corretos e troca no ad.
O --deep no duplicate-campaign duplica tambem todos os ad sets e ads da campanha.
Arquivo: aprendizados.md (na raiz da skill, ~/.claude/skills/riligar-marketing-ads-meta/aprendizados.md)
O Claude DEVE:
"Quer que eu registre isso nos aprendizados pra não esquecer nas próximas vezes?"
### {DATA} — {título curto}
**Regra:** {o que fazer sempre/nunca}
**Contexto:** {o que aconteceu pra gerar esse aprendizado}Exemplo de aprendizados.md:
# Aprendizados — RiLiGar Marketing Ads Meta
### 2026-04-03 — Sempre incluir CTA no criativo
**Regra:** Ao criar criativos (create.py creative), SEMPRE incluir call_to_action_type. Padrão: LEARN_MORE pra tráfego, SIGN_UP pra leads, SHOP_NOW pra vendas.
**Contexto:** Criou carrossel sem botão de CTA. Usuário teve que corrigir manualmente.
### 2026-04-03 — Carrossel Instagram: multi_share_end_card=false
**Regra:** Em campanhas de visita ao perfil Instagram, SEMPRE usar multi_share_end_card=false e multi_share_optimized=false.
**Contexto:** Cartão "Ver mais" sem URL quebrou o anúncio em 10 posicionamentos.O Claude DEVE seguir estas regras ao executar operacoes:
Arquivo: references/padroes-campanha.md
O Claude DEVE ler este arquivo ANTES de criar qualquer campanha. Ele contem regras aprendidas por tipo de campanha que evitam erros comuns (ex: carrossel sem preview, ads bloqueados em posicionamentos, etc).
Se o tipo de campanha nao estiver documentado, o Claude DEVE primeiro buscar uma campanha similar ja existente na conta e usar como template (ver fluxo abaixo).
Passo 0 — Diagnostico (OBRIGATORIO antes de criar)
references/padroes-campanha.md para o tipo de campanha desejado read.py campaigns --account act_XXX --status ACTIVE
read.py ads-by-campaign --campaign XXX
read.py creative --id XXXinstagram_user_id, multi_share_end_card, degrees_of_freedom_spec, etc.
Passo 1-5 — Criacao
create.py campaign -- cria campanha PAUSEDcreate.py adset -- cria ad set PAUSED com targetingcreate.py image ou create.py video -- sobe midiacreate.py creative -- cria criativo com url_tags e instagram_user_idcreate.py ad -- cria ad PAUSED com degrees_of_freedom_specPasso 6 — Validacao (OBRIGATORIO apos criar)
read.py ad --id XXXread.py preview --creative XXX --format allPasso 7 — Ativacao Ativar TODOS os niveis (campanha + ad sets + ads):
update.py campaign --id XXX --status ACTIVEupdate.py adset --id XXX --status ACTIVEupdate.py ad --id XXX --status ACTIVEIMPORTANTE: Criativos na Meta sao imutaveis. Nao da pra editar url_tags, URL de destino, imagem ou texto de um criativo existente via API. Isso vale especialmente pra criativos baseados em posts organicos (effective_object_story_id) -- a URL vem do post original e nao pode ser alterada.
O fluxo correto e duplicar o ad com criativo novo:
read.py ads-by-campaign --campaign XXX -- listar adsread.py creatives-by-ad --ad XXX -- ver criativo atual e url_tagsobject_story_id do original + url_tags corretosPra criativos de post organico, usar a API direta:
# Criar criativo com url_tags corretos reusando o post original
POST act_XXX/adcreatives
name: "nome [url_tags_fix]"
object_story_id: "PAGE_ID_POST_ID" (do effective_object_story_id do criativo antigo)
url_tags: "utm_source=facebook&utm_medium=cpc&utm_campaign=NOME_CAMPANHA"
# Criar novo ad PAUSED
POST act_XXX/ads
name: "nome [url_tags_fix]"
adset_id: MESMO_ADSET
creative: {"creative_id": "NOVO_ID"}
status: PAUSED
tracking_specs: (copiar do ad original)
# Ativar novo, pausar antigo
POST novo_ad_id status=ACTIVE
POST antigo_ad_id status=PAUSEDadvanced.py duplicate-campaign --id XXX --deep -- copia tudoupdate.py adset --id NOVO_ADSET --targeting '{...}' -- alterar targetingupdate.py campaign --id NOVA_CAMPANHA --name "Teste B" -- renomearinsights.py campaign --id XXX --date-preset last_30d --breakdowns age,genderinsights.py async --id act_XXX --date-preset maximum --level ad~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.