marketing: migra superfície SEO para OpenSEO (motor único)

As skills de SEO assentavam em quatro dependências, nenhuma operacional:
SEO Tools API (localhost:3000, pasta inexistente em disco), Ahrefs MCP
(nunca esteve em config), gsc e lighthouse (em disabledServers). Os seis
passos da /seo-audit e o workflow inteiro da /seo-report apontavam para
tooling morto — não eram executáveis.

- seo-audit v3.0: ordem por custo (grátis → lote pago → unitário pago),
  gate de mercado (PT = 2620/pt) e gate de maxPages
- seo-report v3.0: cobertura de crawl obrigatória no entregável
- ferramentas-api.md: inventário das 24 ferramentas OpenSEO + tabela de
  migração endpoint a endpoint
- implementacao-tecnica.md: striking distance, desperdício e filtro de
  ruído do GSC em código
- seo-specialist v3.0: primary_mcps [openseo], bloco de MCPs desligados,
  FID → INP nos Core Web Vitals

maxPages tem default 50: descomplicar.pt auditado com o default deu 25
URLs e 92 issues sem críticos; com maxPages 600 deu 1337 issues e 9
críticos. Documentado como gate — a fase Search Console dimensiona o crawl.

Limitações declaradas nas skills: get_audit_issues devolve contagens sem
URLs pela bridge MCP (structuredContent.issues não é entregue) e o whoami
não expõe saldo de créditos em self-hosted.
This commit is contained in:
2026-07-30 22:39:40 +01:00
parent f90ba6ec76
commit 2d05873642
9 changed files with 545 additions and 497 deletions
+55 -55
View File
@@ -5,22 +5,21 @@ description: >
Use for SEO strategy, keyword research, technical SEO audits, on-page optimization, Core Web Vitals, rankings monitoring, link building, SERP analysis, Use for SEO strategy, keyword research, technical SEO audits, on-page optimization, Core Web Vitals, rankings monitoring, link building, SERP analysis,
or when user mentions "SEO", "keywords", "rankings", "tráfego orgânico", "SERP", "technical SEO", "link building", "Google", "optimização", "indexação". or when user mentions "SEO", "keywords", "rankings", "tráfego orgânico", "SERP", "technical SEO", "link building", "Google", "optimização", "indexação".
author: Descomplicar® Crescimento Digital author: Descomplicar® Crescimento Digital
version: 2.0.0 version: 3.0.0
category: business category: business
model: sonnet model: sonnet
tools: Read, Glob, Grep, ToolSearch tools: Read, Glob, Grep, ToolSearch
# Dependencies # Dependencies
# Nota: MCPs como desk-crm-v3, moloni, easypanel, lighthouse, authentik, spaceship e youtube # OpenSEO é o motor único de SEO. O stack antigo (gsc, lighthouse, Ahrefs,
# estão desligados por omissão — pedir activação via /mcp (regra 57) antes de os usar. # SEO Tools API) está desligado ou não existe — não o invocar.
primary_mcps: primary_mcps:
- gsc - openseo
- google-analytics
- desk-crm-v3
recommended_mcps: recommended_mcps:
- lighthouse - chrome-devtools
- google-workspace
- context7 - context7
allowed-mcps: ssh-unified, google-workspace, gsc, lighthouse, google-analytics, tavily allowed-mcps: openseo, chrome-devtools, google-workspace, context7
skills: skills:
- _core - _core
- seo-audit - seo-audit
@@ -31,18 +30,18 @@ desk_task: 1516
# SEO Specialist Descomplicar # SEO Specialist Descomplicar
Especialista em optimizacao para motores de busca, focado em crescimento de trafego organico atraves de SEO tecnico, optimizacao de conteudo e estrategias de link building. Especialista em optimização para motores de busca, focado em crescimento de tráfego orgânico através de SEO técnico, optimização de conteúdo e estratégias de link building.
## Responsabilidades ## Responsabilidades
- Conduzir pesquisa de keywords e analise competitiva - Conduzir pesquisa de keywords e análise competitiva
- Optimizar elementos on-page (titulos, meta descriptions, headers) - Optimizar elementos on-page (títulos, meta descriptions, headers)
- Melhorar SEO tecnico (velocidade, crawlability, indexacao, Core Web Vitals) - Melhorar SEO técnico (velocidade, crawlability, indexação, Core Web Vitals)
- Desenvolver estrategias de link building e autoridade de dominio - Desenvolver estratégias de link building e autoridade de domínio
- Monitorizar rankings e reportar metricas de trafego organico - Monitorizar rankings e reportar métricas de tráfego orgânico
## Knowledge Sources (Consultar SEMPRE) ## Knowledge Sources (Consultar SEMPRE)
### NotebookLM (Primario - usar PRIMEIRO) ### NotebookLM (Primário — usar PRIMEIRO)
``` ```
mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"keywords rankings optimizacao SERP" mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf5655" query:"keywords rankings optimizacao SERP"
@@ -51,13 +50,13 @@ mcp__notebooklm__notebook_query notebook_id:"76647e0f-3ae2-4c00-a0a8-f457aebf565
## System Prompt ## System Prompt
### Papel ### Papel
Especialista SEO responsavel por aumentar trafego organico atraves de optimizacao tecnica, keyword research e estrategias de link building alinhadas com algoritmos 2026. Especialista SEO responsável por aumentar tráfego orgânico através de optimização técnica, keyword research e estratégias de link building alinhadas com algoritmos 2026.
### Regras Obrigatorias ### Regras Obrigatórias
1. SEMPRE priorizar Core Web Vitals (LCP, FID, CLS) 1. SEMPRE priorizar Core Web Vitals (LCP < 2,5s, INP < 200ms, CLS < 0,1 — o INP substituiu o FID)
2. NUNCA usar black-hat SEO (keyword stuffing, PBNs, cloaking) 2. NUNCA usar black-hat SEO (keyword stuffing, PBNs, cloaking)
3. Keyword research baseado em search intent, nao volume 3. Keyword research baseado em search intent, não volume
4. E-E-A-T obrigatorio (Experience, Expertise, Authority, Trust) 4. E-E-A-T obrigatório (Experience, Expertise, Authority, Trust)
5. Mobile-first indexing (testar sempre em mobile) 5. Mobile-first indexing (testar sempre em mobile)
6. Structured data (Schema.org) para rich snippets 6. Structured data (Schema.org) para rich snippets
@@ -69,73 +68,74 @@ Especialista SEO responsavel por aumentar trafego organico atraves de optimizaca
## Workflows ## Workflows
### Workflow 1: Keyword Research ### Workflow 1: Keyword Research
1. Seed keywords: Brainstorm com cliente, analise concorrentes 1. **Search Console primeiro** (grátis): `get_search_console_performance` — o que já posiciona
2. Expansion: Google Keyword Planner, Ahrefs, SEMrush 2. Striking distance: filtrar pos 4-20 com impressões ≥ 25 (o GSC não filtra por posição)
3. Intent mapping: Informacional, navegacional, transaccional 3. Hidratar: `get_keyword_metrics` — até 700 keywords/chamada, volume + KD + intenção
4. Difficulty: Avaliar competicao (DA de top 10) 4. Expandir (só se necessário): `research_keywords`, 1-5 seeds
5. Priorization: Quick wins (low difficulty, medium volume) 5. Priorizar: quick wins (KD baixo, volume médio, intenção comercial)
6. Mapping: Atribuir keywords a paginas/conteudos 6. Mapear keywords a páginas; guardar com `save_keywords`
### Workflow 2: Technical SEO Audit ### Workflow 2: Technical SEO Audit
1. Crawl: Screaming Frog, Google Search Console 1. GSC por página: conta quantas páginas têm procura real
2. Core Web Vitals: PageSpeed Insights, Lighthouse 2. `run_site_audit` com **maxPages ≥ páginas do GSC + 25%** (o default 50 cega a auditoria)
3. Indexation: Sitemap, robots.txt, canonicals, redirects 3. `get_audit_status` em poll até "completed"; depois `get_audit_issues` por severidade
4. Structure: URL structure, internal linking, breadcrumbs 4. Priorizar issues pelas páginas com impressões — nunca por contagem bruta
5. Mobile: Responsive design, tap targets, viewport 5. Core Web Vitals das páginas que importam: `chrome-devtools → performance_start_trace`
6. Schema: Structured data validation (Google Rich Results Test) 6. Indexação: `inspect_urls` (até 10 URLs)
### Workflow 3: On-Page Optimization ### Workflow 3: On-Page Optimization
1. Title tag: Keyword + brand, <60 chars 1. Title tag: Keyword + brand, <60 chars
2. Meta description: CTR-focused, <160 chars 2. Meta description: CTR-focused, <160 chars
3. Headers: H1 (1x), H2/H3 hierarchy com keywords 3. Headers: H1 (1x), H2/H3 hierarchy com keywords
4. Content: E-E-A-T, >1000 words para pillar content 4. Content: E-E-A-T, >1000 words para pillar content
5. Images: Alt text descritivo, compressao, lazy loading 5. Images: Alt text descritivo, compressão, lazy loading
6. Internal links: Link para conteudo relacionado 6. Internal links: Link para conteúdo relacionado
## MCPs Relevantes ## MCPs Relevantes
- ssh-unified: Optimizacoes tecnicas em servidores WP - **openseo**: motor único — crawl, Search Console, keywords, SERP, backlinks
- google-workspace: GSC data, relatorios em Sheets - **chrome-devtools**: Core Web Vitals e Lighthouse por página
- **google-workspace**: exportar relatórios para Docs/Sheets
## Metricas Chave ## Métricas Chave
- **Organic Traffic**: Visitantes de search engines - **Organic Traffic**: Visitantes de search engines
- **Rankings**: Posicoes keywords alvo (top 3 = sucesso) - **Rankings**: Posições das keywords alvo (top 3 = sucesso)
- **CTR**: Click-through rate em SERPs - **CTR**: Click-through rate em SERPs
- **Core Web Vitals**: LCP <2.5s, FID <100ms, CLS <0.1 - **Core Web Vitals**: LCP < 2,5s, INP < 200ms, CLS < 0,1
- **Backlinks**: Numero e qualidade (DA dos sites) - **Backlinks**: Número e qualidade (DA dos sites)
## Colaboracao ## Colaboração
- Reports to: Digital Marketing Manager - Reports to: Digital Marketing Manager
- Colabora com: Content Manager, Copywriter, Web Designer, WordPress Developer - Colabora com: Content Manager, Copywriter, Web Designer, WordPress Developer
## Your Available MCPs ## Your Available MCPs
### Primary MCPs (Your Domain) ### Primary MCPs (Your Domain)
✓ **ssh-unified** (infra) ✓ **openseo** (motor SEO)
- SSH, SFTP, servidor management - Crawl e issues, Search Console, keywords, SERP, backlinks, rank tracking
- Usage: `mcp__ssh-unified__*` - Ferramentas grátis primeiro; pagas só depois de esgotar as grátis
- Mercado PT obrigatório: `locationCode: 2620`, `languageCode: "pt"`
✓ **google-workspace** (integration) ✓ **chrome-devtools** (performance)
- Email, calendário, docs, drive - `lighthouse_audit`, `performance_start_trace` — CWV reais por página
- Usage: `mcp__google-workspace__*`
### Recommended for seo ### Recommended for seo
- **gsc** - Google Search Console - **google-workspace** — Exportar relatórios (Docs, Sheets)
- **lighthouse** - Performance audits - **context7** — Documentação de bibliotecas e frameworks
- **google-analytics** - Google Analytics 4
- **tavily** - AI-powered search API - web search optimizado para LLMs
### All Available (32 total) ### Desligados — NÃO invocar
desk-crm-v3, moloni, context7, gitea, n8n, cwp, filesystem, imap, outline-api, youtube-research, youtube-uploader, mcp-time, mem0, puppeteer, mcp-mermaid, mcp-echarts, powerpoint, penpot, pixabay, pexels, elevenlabs, magic, vimeo, design-systems, replicate `gsc`, `lighthouse`, `google-analytics` estão em disabledServers. `Ahrefs` e a
`SEO Tools API` (localhost:3000) não existem. Se precisares de um deles, pedir
activação via `/mcp` — nunca contornar com bash/curl.
**Discovery:** Use ToolSearch to find specific tools. **Discovery:** Use ToolSearch to find specific tools.
**Example:** `ToolSearch("ssh upload")` finds SSH upload tools. **Example:** `ToolSearch("ssh upload")` finds SSH upload tools.
## Your Available Skills ## Your Available Skills
### Primary Skills (Your Domain) ### Primary Skills (Your Domain)
✓ **/seo-audit** - Auditoria SEO completa usando todas as ferramentas instaladas - Lighthouse, SEO ✓ **/seo-audit** - Auditoria SEO completa com dados reais via OpenSEO (crawl, GSC, SERP, backlinks)
- Invoke: `/seo-audit` - Invoke: `/seo-audit`
✓ **/seo-report** - Relatório SEO completo com dados de múltiplas fontes (Lighthouse, GSC, SEO Tools ✓ **/seo-report** - Relatório SEO para cliente com OpenSEO, exportado para Google Docs
- Invoke: `/seo-report` - Invoke: `/seo-report`
### Recommended for seo ### Recommended for seo
+141 -135
View File
@@ -1,202 +1,208 @@
--- ---
name: seo-audit name: seo-audit
description: Auditoria SEO completa com recomendacoes de optimizacao. Analisa SEO tecnico, conteudo, backlinks e desempenho. description: Auditoria SEO completa com dados reais via OpenSEO (crawl, Search Console, SERP, backlinks, keywords). Analisa SEO técnico, conteúdo, autoridade e desempenho, e prioriza por retorno. Usar quando "auditoria SEO", "audit", "analisar site", "Core Web Vitals", "Search Console", "striking distance", "porque não tenho tráfego".
--- ---
# SEO Audit - Auditoria Completa # SEO Audit — Auditoria Completa (OpenSEO)
Skill para realizar auditorias SEO completas usando o stack de ferramentas instalado. Best practices 2026. Auditoria SEO com dados reais. **Motor único: OpenSEO** (`seo.descomplicar.pt`), que substituiu o stack antigo (SEO Tools API + Ahrefs + GSC MCP + Lighthouse MCP) — ver `references/ferramentas-api.md` para a tabela de migração.
--- ---
## Contexto NotebookLM ## Regra zero — a ordem é económica, não estética
ANTES de executar, consultar notebook para contexto especializado: O OpenSEO tem ferramentas **grátis** e ferramentas **que gastam créditos**. Executar pela ordem errada gasta dinheiro a produzir conclusões que as ferramentas grátis já davam.
| Notebook | ID | Consultar quando | | Fase | Ferramentas | Custo | Porquê nesta ordem |
|----------|-----|-----------------| |---|---|---|---|
| Marketing Digital PT | `4c595973` | Sempre | | 1 | `get_search_console_performance`, `inspect_urls` | **grátis** | Dados de primeira mão. Diz o que já posiciona e quais páginas importam |
| 2 | `run_site_audit`, `get_audit_issues`, `get_audit_pages` | **grátis** | Estado técnico. O dimensionamento do crawl depende da fase 1 |
| 3 | `get_keyword_metrics` | pago (lote) | Hidrata até 700 keywords conhecidas de uma vez — a melhor relação valor/crédito |
| 4 | `get_ranked_keywords`, `get_domain_overview`, `get_backlinks_overview` | pago | Contexto competitivo |
| 5 | `get_serp_results`, `find_serp_competitors` | pago (~30-60/keyword) | Só nas keywords que sobreviveram à filtragem |
``` **Nunca começar pela fase 3 ou acima.** As fases 1-2 resolvem a maioria das auditorias sem gastar um crédito.
mcp__notebooklm__notebook_query({
notebook_id: "4c595973-ba10-420a-a3bf-e4389e424ad3",
query: "<adaptar ao contexto — ex: auditoria SEO tecnico, Core Web Vitals, backlinks, E-E-A-T>"
})
```
**Procedimento relacionado:** `PROC-DMARC-Email-Entregabilidade.md` -- consultar quando a auditoria envolve email deliverability.
--- ---
## Quando Usar ## Pré-voo obrigatório (3 verificações, 30 segundos)
- Auditar um site completo (tecnico + conteudo + performance) ```
- Verificar Core Web Vitals e ranking factors 1. openseo → whoami → confirma ligação, org, modo
- Analisar backlinks e autoridade de dominio 2. openseo → list_projects → obtém projectId E o mercado do projecto
- Obter dados reais do Google Search Console 3. confirmar mercado → PT = locationCode 2620, languageCode "pt"
- Identificar oportunidades de optimizacao ```
- Comparar com concorrencia
**GATE — mercado.** Se o projecto estiver em `2840/en` (EUA/inglês, que é o default) e o cliente for português, **todas** as chamadas pagas devolvem dados do mercado errado. Ou se corrige o mercado do projecto, ou se passa `locationCode`/`languageCode` explicitamente em **cada** chamada. Um esquecimento = créditos gastos em lixo.
> `locationCode: 2620` = Portugal — confirmado empiricamente (SERP devolve domínios `.pt`). Não inventar códigos: se houver dúvida, correr uma query de teste e validar pelos resultados.
--- ---
## Google Updates 2026 ## Fase 1 — Search Console primeiro (grátis, é o mapa)
### Core Algorithm Updates ```
openseo → get_search_console_performance
dimensions: ["query"] dateRange: "last_3_months" rowLimit: 1000
openseo → get_search_console_performance
dimensions: ["page"] dateRange: "last_3_months" rowLimit: 1000
```
| Update | Data | Impacto | Paginar com `startRow` enquanto o cabeçalho disser `more available`.
|--------|------|---------|
| **Helpful Content Q1** | Jan 2026 | Penaliza conteudo AI de baixa qualidade |
| **Core Web Vitals 3.0** | Mar 2026 | INP substitui FID, thresholds mais rigorosos |
| **E-E-A-T Focus** | Q1-Q2 | Experiencia pratica obrigatoria |
| **Mobile-First Index** | Universal | 100% dos sites |
### Novos Ranking Factors 2026 ### As três armadilhas do GSC
1. **INP (Interaction to Next Paint)** -- Bom: < 200ms | Medio: 200-500ms | Mau: > 500ms **1. Vista por query ≠ vista por página.** O GSC anonimiza queries raras, por isso os totais por query são sempre **muito menores** que os totais por página. A vista por **página** é a real; usar essa para números globais.
2. **E-E-A-T** -- Autor identificado com bio, credenciais verificaveis, experiencia real
3. **Page Experience Signals** -- HTTPS obrigatorio, intrusive interstitials penalizados **2. O GSC não filtra por posição.** `striking distance` tem de ser filtrado do lado do cliente, depois de puxar as linhas.
**3. Há lixo nas queries.** Colagens de relatórios do Google Ads, operadores `site:`, strings com mojibake. Filtrar antes de contar, ou as métricas mentem.
```python
def is_noise(k):
return ('ativado' in k and 'correspond' in k) or k.startswith('-site:') \
or k.startswith('=') or len(k) > 90 or '0,00' in k
```
### O que extrair
| Métrica | Cálculo | Leitura |
|---|---|---|
| CTR global | cliques ÷ impressões (vista por página) | < 1% = problema de captação, não de ranking |
| Distribuição por posição | buckets 1-3 / 4-10 / 11-20 / 21-50 / 51+ | Impressões concentradas em 21+ = visibilidade inútil |
| Branded vs não-branded | queries com o nome da marca vs resto | Se só a marca converte, o SEO não está a trabalhar |
| **Striking distance** | pos 4-20 **e** impressões ≥ 25 | **É aqui que está o retorno** |
| Desperdício | pos > 40 **e** impressões ≥ 300 | Páginas com procura real enterradas |
### O sinal mais accionável de todos
**Posição 4-10 com CTR perto de 0%.** Não é problema de ranking — o site está na primeira página. É o **título e a meta description** a não convencerem. Cruzar esta lista com os issues `missing-meta-description` e `title-too-long` da fase 2: a intersecção é a lista de trabalho, por ordem.
--- ---
## Workflow de Auditoria Completa ## Fase 2 — Auditoria técnica (grátis)
### Passo 1: Analise Tecnica Basica (3 min)
``` ```
1. SEO Tools API -> /seo-audit -> Meta tags, headings, estrutura HTML openseo → run_site_audit
2. SEO Tools API -> /page-speed-analyzer -> Velocidade, sugestoes url: "<url>" maxPages: <N> runLighthouse: true
3. Lighthouse -> run_audit -> Performance, SEO, Accessibility scores openseo → get_audit_status (poll até "completed")
openseo → get_audit_issues (severity: critical → warning → info)
``` ```
**Checklist Critico:** ### GATE — `maxPages` (o erro que cega a auditoria)
- [ ] Meta title (50-60 chars)
- [ ] Meta description (150-160 chars)
- [ ] H1 unico com keyword
- [ ] Canonical URL definido
- [ ] Robots.txt acessivel
- [ ] Sitemap.xml presente
- [ ] HTTPS activo
- [ ] Mobile-friendly
### Passo 2: Core Web Vitals (2 min) **`maxPages` tem default 50.** Um site de 600 páginas auditado com o default devolve um relatório limpo e falso: descreve 8% do site e omite exactamente o hub de conteúdo que gera o tráfego.
**Regra:** `maxPages` ≥ número de páginas com impressões no GSC (fase 1), com folga de ~25%. Por isso é que a fase 1 vem primeiro — é ela que dimensiona o crawl.
> Caso real (descomplicar.pt, 07-2026): auditoria com default 50 → 25 URLs únicos, 92 issues, **zero críticos**, nenhuma das 119 páginas `/guia-*`. Relançada com `maxPages: 600` → **1337 issues, 9 críticos**. O relatório "limpo" descrevia 4% do site.
### Prioridade dos issues
| Severidade | Tipos | Acção |
|---|---|---|
| **critical** | `broken-internal-link`, `blocked-page`, `server-error`, `broken-page` | Corrigir já — sangram autoridade e crawl budget |
| **warning** | `missing-h1`, `missing-meta-description`, `duplicate-content`, `multiple-h1`, `duplicate-title` | Priorizar pelas páginas com impressões (fase 1) |
| **info** | `title-too-long`, `noindex-page`, `slow-response`, `heading-order-skip` | Lote; só vale a pena onde há procura |
**Nunca tratar a lista de issues por ordem de contagem.** 300 metas em falta em páginas sem impressões valem menos que 6 em páginas na posição 8. A fase 1 é que ordena a fase 2.
### Limitação conhecida — issues sem URL
`get_audit_issues` e `get_audit_pages` devolvem **apenas contagens agregadas** através da bridge MCP. As linhas por URL vivem em `structuredContent.issues`, que a bridge não entrega; `get_audit_pages` trunca a listagem em ~25 linhas independentemente do `limit`.
**Contorno:** o campo `details.mcpMeta.url` da resposta traz o link do relatório na UI. Entregar esse link ao humano para os URLs concretos:
```
https://seo.descomplicar.pt/p/<projectId>/audit?auditId=<auditId>
```
Declarar esta limitação no relatório — não fingir que se verificaram URLs que não se viram.
### Core Web Vitals por página
`run_site_audit` com `runLighthouse: true` corre Lighthouse numa amostra (até 20 páginas). Para uma página específica, usar `chrome-devtools`:
``` ```
1. Lighthouse -> get_core_web_vitals -> LCP, INP, CLS (mobile + desktop) chrome-devtools → lighthouse_audit (SEO, acessibilidade, best practices)
2. Lighthouse -> compare_mobile_desktop -> Identificar gaps chrome-devtools → performance_start_trace (LCP, INP, CLS reais)
3. Lighthouse -> get_lcp_opportunities -> Sugestoes optimizacao
``` ```
**Thresholds 2026:** **Thresholds 2026:** LCP < 2,5s · **INP** < 200ms · CLS < 0,1
(INP substituiu o FID — se algum documento ainda disser FID, está desactualizado.)
| Metrica | Bom | Necessita Melhoria | Mau | ---
|---------|-----|-------------------|-----|
| **LCP** | < 2.5s | 2.5-4s | > 4s |
| **INP** | < 200ms | 200-500ms | > 500ms |
| **CLS** | < 0.1 | 0.1-0.25 | > 0.25 |
### Passo 3: Analise de Conteudo (3 min) ## Fase 3 — Hidratar keywords (pago, lote)
``` ```
1. SEO Tools API -> /content-optimization -> On-page SEO, keyword density openseo → get_keyword_metrics
2. SEO Tools API -> /internal-linking -> Estrutura links internos keywords: [<as keywords em striking distance da fase 1>]
3. SEO Ahrefs -> keyword_generator -> Keywords relacionadas, volume, KD locationCode: 2620 languageCode: "pt"
``` ```
**Checklist E-E-A-T:** Até **700 keywords numa só chamada** — volume, dificuldade (KD), intenção, CPC, tendência. É a forma barata de priorizar. Só depois disto se decide onde vale a pena competir.
- [ ] Autor identificado com bio
- [ ] Credenciais verificaveis
- [ ] Data publicacao/actualizacao
- [ ] Fontes citadas (links externos autoritativos)
- [ ] Experiencia real demonstrada
### Passo 4: Backlinks e Autoridade (2 min) Guardar o que sobreviver: `openseo → save_keywords` (grátis, idempotente).
---
## Fase 4 — Contexto competitivo (pago)
``` ```
1. SEO Tools API -> /backlink-checker -> Backlinks basicos, DR/UR openseo → get_domain_overview (tráfego orgânico estimado, nº keywords, backlinks)
2. SEO Ahrefs -> get_backlinks_list -> Lista detalhada (DR, anchor text) openseo → get_ranked_keywords (onde o domínio posiciona, por mercado)
3. SEO Ahrefs -> get_traffic -> Trafego estimado mensal openseo → get_backlinks_overview (~50 créditos por domínio)
``` openseo → get_backlinks_profile (linhas detalhadas: anchors, dofollow, spam)
**Metricas Autoridade:**
- **DR (Domain Rating)**: 0-100 (forca backlink profile)
- **UR (URL Rating)**: 0-100 (forca pagina especifica)
- **Backlinks**: Quantidade + qualidade (DR > 30)
- **Referring Domains**: Numero de dominios unicos
### Passo 5: Dados Reais GSC (3 min)
```
1. GSC -> get_search_analytics -> Queries, impressoes, CTR real (ultimos 90 dias)
2. GSC -> check_indexing_issues -> Problemas de indexacao
3. GSC -> get_sitemaps -> Status sitemaps submetidos
```
**Metricas GSC a Analisar:**
- **Impressoes vs Cliques**: CTR medio > 2%
- **Posicao media**: Top 3 para keywords principais
- **Cobertura**: % paginas indexadas vs submetidas
- **Mobile Usability**: Erros especificos mobile
### Passo 6: Concorrencia (opcional, 2 min)
```
SEO Tools API -> /competitor-analysis -> Comparar com 2-3 concorrentes
- Keywords gap
- Backlinks gap
- Content gap
``` ```
--- ---
## Propriedades GSC Disponiveis ## Fase 5 — SERP (pago, por último)
``` ```
sc-domain:descomplicar.pt openseo → get_serp_results (1-10 keywords por chamada, ~30-60 créditos cada)
https://emanuelalmeida.pt/ openseo → find_serp_competitors (quem compete num conjunto de keywords)
https://carstuff.pt/
https://solarfvengenharia.com/
https://aquisevende.pt/
https://alojadamaria.com/
https://e-commerce.descomplicar.pt/
``` ```
--- Ler a SERP como **estrutura**, não como lista: se o top-10 estiver cheio de directórios e artigos "melhores X", a intenção é comparativa e uma homepage não entra — é preciso uma página de comparação. Se estiver cheio de homepages de concorrentes, é disputa de marca.
## Notas Importantes Local/Maps: `get_local_serp_results`, `search_local_businesses`, `get_google_business_questions`.
### Requisitos
- **SEO Tools API** deve estar a correr: `~/mcp-servers/seo-tools-api/start.sh`
- **GSC** requer autenticacao OAuth na primeira utilizacao
- **GA** requer ADC credentials configuradas
### Limitacoes
- Ahrefs API tem rate limiting (100 req/day free tier)
- GSC data maximo: 16 meses historico
- Lighthouse scores variam +/- 5 pontos entre execucoes
--- ---
## References (conteudo detalhado) ## Custos — o que sabemos e o que não sabemos
| Ficheiro | Conteudo | `whoami` **não expõe saldo de créditos** em modo self-hosted (verificado antes e depois de uma chamada paga: output idêntico). Os `~30-60 créditos/keyword` são a **estimativa do schema**, não uma medição.
|----------|----------|
| `references/template-relatorio-auditoria.md` | Template completo do relatorio com todas as seccoes e tabelas | **Consequência prática:** não há medidor no OpenSEO. O contador real vive na conta DataForSEO. Para lotes grandes, confirmar saldo aí primeiro. Nunca reportar custo consumido como facto — reportar como estimativa.
| `references/ferramentas-api.md` | Endpoints SEO Tools API, Lighthouse MCP, Ahrefs, GSC, GA |
--- ---
## Anti-Patterns ## Anti-patterns
- Auditar sem dados reais (nunca simular metricas) - **Correr `run_site_audit` com o `maxPages` por omissão.** Produz relatórios limpos e falsos.
- Ignorar gap mobile vs desktop - **Começar por ferramentas pagas.** O GSC é grátis e responde a metade das perguntas.
- Nao verificar se site esta no GSC antes de recolher dados - Usar totais por query como totais do site (o GSC anonimiza — usar a vista por página).
- Recomendacoes sem priorizacao (critico/importante/melhoria) - Priorizar issues por contagem em vez de por impressões da página afectada.
- Esquecer E-E-A-T na analise de conteudo - Correr chamadas pagas sem confirmar o mercado do projecto.
- Apresentar contagens de issues como se fossem URLs verificados.
- Auditar sem dados reais ou simular métricas.
- Recomendações sem prioridade (crítico/importante/melhoria) e sem esforço estimado.
--- ---
**Versao:** 2.1.0 | **Autor:** Descomplicar ## References
| Ficheiro | Conteúdo |
|---|---|
| `references/ferramentas-api.md` | Inventário OpenSEO completo + tabela de migração do stack antigo |
| `references/template-relatorio-auditoria.md` | Template do relatório com todas as secções e tabelas |
---
**Versão:** 3.0.0 | **Autor:** Descomplicar® | **Motor:** OpenSEO
## Healing Log ## Healing Log
<!-- Registo automático de erros e correcções nesta skill --> <!-- Registo automático de erros e correcções nesta skill -->
```jsonl
{"date":"2026-07-30","issue":"Skill dependia de SEO Tools API (localhost:3000), Ahrefs MCP, GSC MCP e Lighthouse MCP — todos inexistentes ou desligados. Nenhum dos 6 passos era executável.","fix":"Reescrita completa sobre OpenSEO, com ordem por custo, gates de mercado e maxPages.","source":"auto"}
```
@@ -1,75 +1,113 @@
# Ferramentas e APIs - SEO Audit # Ferramentas SEO — OpenSEO
## 1. SEO Tools API (http://localhost:3000) Motor único do SEO Descomplicar®. Substituiu integralmente o stack anterior.
UI: `https://seo.descomplicar.pt` · Projecto default: `1e5ad4d6-a285-4fd3-9633-339abef4b6af`
```bash ---
# Auditoria basica
curl "http://localhost:3000/seo-audit?url=URL"
# Velocidade PageSpeed Insights style ## 1. Migração — o que morreu e o que o substitui
curl "http://localhost:3000/page-speed-analyzer?url=URL"
# Backlinks + DR/UR O stack antigo desta skill (v2.1.0) apontava para quatro dependências. **Nenhuma está operacional** (verificado 30-07-2026):
curl "http://localhost:3000/backlink-checker?url=URL"
# Rankings para keywords | Dependência antiga | Estado real | Substituto OpenSEO |
curl "http://localhost:3000/rank-checker?url=URL&keywords=keyword1,keyword2" |---|---|---|
| **SEO Tools API** `localhost:3000` | `~/mcp-servers/seo-tools-api/` **não existe em disco** | ver tabela abaixo |
| **Ahrefs MCP** | nunca esteve em nenhuma config MCP | `get_backlinks_*`, `get_domain_overview`, `get_keyword_metrics` |
| **GSC MCP** | em `disabledServers` | `get_search_console_performance`, `inspect_urls` |
| **Lighthouse MCP** | em `disabledServers` | `run_site_audit` (`runLighthouse`) ou `chrome-devtools` |
# Optimizacao conteudo on-page ### Endpoint a endpoint
curl "http://localhost:3000/content-optimization?url=URL"
# Internal linking structure | Antigo | Novo | Nota |
curl "http://localhost:3000/internal-linking?url=URL" |---|---|---|
| `/seo-audit` | `run_site_audit` + `get_audit_issues` | Atenção ao `maxPages` |
| `/page-speed-analyzer` | `run_site_audit` com `runLighthouse: true` | Amostra até 20 páginas |
| `/content-optimization` | `get_audit_issues` (`thin-content`, `title-*`, `meta-description-*`) | |
| `/internal-linking` | `get_audit_issues` (`orphan-page`, `broken-internal-link`, `no-outgoing-links`) | |
| `/backlink-checker` | `get_backlinks_overview` | |
| `/rank-checker` | `get_rank_tracker` (grátis) ou `get_ranked_keywords` (pago) | |
| `/competitor-analysis` | `find_serp_competitors` + `get_domain_overview` | |
| `/sitemap-generator` | **sem equivalente** | Usar plugin WP ou gerar à mão |
| Ahrefs `keyword_generator` | `research_keywords` (novas) / `get_keyword_metrics` (conhecidas) | |
| Ahrefs `get_backlinks_list` | `get_backlinks_profile` | |
| Ahrefs `get_traffic` | `get_domain_overview` | Estimado |
| Lighthouse `run_audit` | `chrome-devtools → lighthouse_audit` | Por página |
| Lighthouse `get_core_web_vitals` | `chrome-devtools → performance_start_trace` | LCP/INP/CLS reais |
| GSC `get_search_analytics` | `get_search_console_performance` | |
| GSC `check_indexing_issues` | `inspect_urls` | Até 10 URLs por chamada |
| GSC `get_sitemaps` | **sem equivalente** | Ver na UI do Search Console |
# Sitemap XML generator ---
curl "http://localhost:3000/sitemap-generator?url=URL"
# Analise concorrencia ## 2. Inventário OpenSEO (24 ferramentas)
curl "http://localhost:3000/competitor-analysis?url=URL&competitors=site1.com,site2.com"
```
## 2. Lighthouse MCP ### Grátis — não tocam no DataForSEO
| Tool | Funcao | Output | | Ferramenta | Função |
|------|--------|--------| |---|---|
| `run_audit(url)` | Auditoria completa | Performance, SEO, A11y, Best Practices | | `whoami` | Utilizador, org, modo, scopes. **Não mostra saldo em self-hosted** |
| `get_performance_score(url)` | Score performance | 0-100 | | `list_projects` | Projectos + `projectId` + mercado default |
| `get_core_web_vitals(url)` | LCP, INP, CLS | Mobile + Desktop | | `create_project` | Novo projecto (nome, domínio, mercado) |
| `get_accessibility_score(url)` | Acessibilidade | 0-100 + issues | | `run_site_audit` | Crawl same-origin, robots-aware. `maxPages` **default 50** |
| `get_seo_analysis(url)` | Analise SEO tecnico | Meta, headings, indexabilidade | | `get_audit_status` | Progresso (fase, páginas, Lighthouse) |
| `get_security_audit(url)` | Seguranca | HTTPS, mixed content, headers | | `get_audit_issues` | Relatório priorizado. Filtros `severity`/`issueType` |
| `compare_mobile_desktop(url)` | Comparacao | Diferencas performance | | `get_audit_pages` | Páginas crawladas com dados SEO por página |
| `get_lcp_opportunities(url)` | Optimizacoes LCP | Preload, lazy load | | `get_search_console_performance` | Search Analytics: cliques, impressões, CTR, posição |
| `find_unused_javascript(url)` | JS nao usado | Tamanhos, % savings | | `inspect_urls` | URL Inspection do GSC (até 10 URLs): indexação, canónico |
| `get_rank_tracker` | Configs de rank tracking + último snapshot |
| `save_keywords` | Guardar keywords no projecto (idempotente) |
| `list_saved_keywords` | Keywords guardadas + métricas em cache |
## 3. SEO Ahrefs MCP (via API) ### Pagas — consomem créditos
| Tool | Funcao | Dados | | Ferramenta | Custo aprox. | Função |
|------|--------|-------| |---|---|---|
| `get_backlinks_list(domain)` | Lista backlinks | DR, UR, anchor text | | `get_keyword_metrics` | lote | **Até 700 keywords/chamada**: volume, KD, intenção, CPC, tendência |
| `keyword_generator(keyword, country)` | Ideias keywords | Volume, KD, CPC | | `research_keywords` | ~30-100/seed | 1-5 seeds → ideias novas + métricas |
| `get_traffic(domain)` | Trafego estimado | Visitas mensais, keywords | | `get_serp_results` | ~30-60/keyword | Google orgânico ao vivo, 1-10 keywords |
| `keyword_difficulty(keyword)` | Dificuldade keyword | 0-100 (KD score) | | `find_serp_competitors` | pago | Domínios que competem num conjunto de keywords |
| `get_ranked_keywords` | pago | Keywords onde um domínio posiciona, por mercado |
| `get_domain_overview` | pago | Tráfego orgânico, nº keywords, backlinks, ref. domains |
| `get_domain_keyword_suggestions` | pago | Lista detalhada de keywords de um domínio |
| `get_backlinks_overview` | ~50/domínio, ~25/página | Resumo do perfil de backlinks |
| `get_backlinks_profile` | pago | Linhas detalhadas: anchors, dofollow, spam, lost/broken |
| `get_local_serp_results` | pago | Google Maps / Local Finder junto a coordenadas |
| `search_local_businesses` | pago | Negócios locais perto de coordenadas |
| `get_google_business_questions` | pago | Q&A de Google Business Profile |
## 4. Google Search Console MCP ---
| Tool | Funcao | Dados Reais | ## 3. Mercados
|------|--------|-------------|
| `list_properties` | Listar sites verificados | URLs properties |
| `get_search_analytics(site, period)` | Queries, cliques, CTR | Ultimos 16 meses |
| `inspect_url_enhanced(site, url)` | Inspeccionar URL | Indexacao, mobile usability |
| `check_indexing_issues(site, urls)` | Problemas indexacao | Erros, avisos |
| `get_sitemaps(site)` | Listar sitemaps | Status, URLs submetidos |
## 5. Google Analytics MCP | Mercado | `locationCode` | `languageCode` |
|---|---|---|
| **Portugal** | `2620` | `pt` |
| EUA (default do projecto) | `2840` | `en` |
| Tool | Funcao | Metricas | `2620` = Portugal, confirmado empiricamente (SERP devolve domínios `.pt`). **Não inventar códigos** — validar sempre por uma query de teste. Referência oficial: `dataforseo.com/help-center/locations`.
|------|--------|----------|
| `get_account_summaries` | Listar contas | Properties disponiveis |
| `run_report(property, metrics, dimensions)` | Relatorio custom | Sessions, users, bounce rate |
| `run_realtime_report(property)` | Tempo real | Utilizadores activos now |
## Propriedades GSC Disponiveis **Aviso:** alguns países são servidos por dados do Google Ads — volume/CPC funcionam, mas KD, intenção e analytics de domínio não estão disponíveis.
---
## 4. Limitações conhecidas (verificadas, não presumidas)
1. **Issues sem URL.** `get_audit_issues` e `get_audit_pages` devolvem só contagens agregadas via bridge MCP. As linhas por URL vivem em `structuredContent.issues`, que a bridge não entrega. `get_audit_pages` trunca em ~25 linhas mesmo com `limit: 1000`.
→ Contorno: `details.mcpMeta.url` traz o link do relatório na UI.
2. **Sem medidor de créditos.** `whoami` em self-hosted devolve o mesmo output antes e depois de chamadas pagas. Os custos documentados são estimativas do schema. O contador real está na conta DataForSEO.
3. **`maxPages` default 50.** A causa mais comum de auditorias falsamente limpas.
4. **GSC anonimiza queries.** Totais por query são sempre inferiores aos totais por página. Usar a vista por página para números globais.
5. **GSC não filtra por posição.** Striking distance filtra-se do lado do cliente.
6. **Lag do GSC:** os últimos ~3 dias podem estar incompletos. Datas em Pacific Time. Máximo 16 meses de histórico.
---
## 5. Propriedades Search Console disponíveis
``` ```
sc-domain:descomplicar.pt sc-domain:descomplicar.pt
@@ -81,14 +119,6 @@ https://alojadamaria.com/
https://e-commerce.descomplicar.pt/ https://e-commerce.descomplicar.pt/
``` ```
## Requisitos ---
- **SEO Tools API** deve estar a correr: `~/mcp-servers/seo-tools-api/start.sh` **Actualizado:** 30-07-2026 | Substitui a versão baseada em SEO Tools API + Ahrefs + GSC/Lighthouse MCP
- **GSC** requer autenticacao OAuth na primeira utilizacao
- **GA** requer ADC credentials configuradas (`gcloud auth application-default login`)
## Limitacoes
- Ahrefs API tem rate limiting (100 req/day free tier)
- GSC data maximo: 16 meses historico
- Lighthouse scores variam +/- 5 pontos entre execucoes (network dependent)
@@ -183,11 +183,14 @@ H1: [Texto] OK
--- ---
## Ferramentas Utilizadas ## Ferramentas Utilizadas
- SEO Tools API (localhost:3000) - OpenSEO — crawl e issues (`run_site_audit`, `get_audit_issues`)
- Lighthouse MCP - OpenSEO — Search Console (`get_search_console_performance`)
- SEO Ahrefs MCP - OpenSEO — keywords e SERP (`get_keyword_metrics`, `get_serp_results`)
- Google Search Console MCP - OpenSEO — autoridade (`get_backlinks_overview`, `get_domain_overview`)
- Google Analytics MCP (opcional) - chrome-devtools — Core Web Vitals por página (opcional)
**Cobertura do crawl**: [N páginas crawladas] de [M páginas com impressões no GSC]
**Chamadas pagas**: [listar] — custo estimado, não medido (OpenSEO não expõe saldo)
--- ---
@@ -161,20 +161,26 @@ mcp__notebooklm__notebook_query({
## Ferramentas Recomendadas ## Ferramentas Recomendadas
### Validacao ### No stack (usar primeiro — são estes que temos)
- **Google Search Console** - Monitorizacao, indexacao | Necessidade | Ferramenta OpenSEO | Custo |
- **PageSpeed Insights** - Core Web Vitals |---|---|---|
- **Schema Validator** - Testar structured data (schema.org/validator) | Monitorização, indexação | `get_search_console_performance`, `inspect_urls` | grátis |
- **Mobile-Friendly Test** - Google mobile test | Auditoria técnica completa | `run_site_audit` → `get_audit_issues` | grátis |
- **Rich Results Test** - Google rich results | Conteúdo fino, títulos, metas | `get_audit_issues` (`thin-content`, `title-*`, `meta-description-*`) | grátis |
| Keyword research | `get_keyword_metrics` (conhecidas) / `research_keywords` (novas) | pago |
| Backlinks | `get_backlinks_overview`, `get_backlinks_profile` | pago |
| Core Web Vitals | `chrome-devtools → performance_start_trace` | grátis |
### Analise Inventário e tabela de migração: `../seo-audit/references/ferramentas-api.md`
- **Screaming Frog** - Auditoria tecnica completa ### Externas (validação manual)
- **Ahrefs/Semrush** - Keyword research, backlinks
- **AnswerThePublic** - Long-tail questions - **Schema Validator** — testar structured data (schema.org/validator)
- **Google Trends** - Sazonalidade keywords - **Rich Results Test** — Google rich results
- **Mobile-Friendly Test** — Google mobile test
- **AnswerThePublic** — long-tail questions
- **Google Trends** — sazonalidade de keywords
### Optimizacao ### Optimizacao
@@ -249,13 +249,16 @@ https://site.pt/este-url-e-muito-longo-com-muitas-palavras-desnecessarias/
### Ferramentas ### Ferramentas
| Ferramenta | Uso | Métricas | | Ferramenta | Uso | Métricas | Custo |
|------------|-----|----------| |------------|-----|----------|-------|
| Google Keyword Planner | Volume, CPC | Volume mensal, competição | | **OpenSEO** `get_keyword_metrics` | Hidratar até 700 keywords conhecidas | Volume, KD, intenção, CPC, tendência | pago (lote) |
| Ahrefs | KD, SERP analysis | Keyword Difficulty, DR necessário | | **OpenSEO** `research_keywords` | Descobrir keywords novas (1-5 seeds) | Volume, KD, ideias relacionadas | pago (~30-100/seed — estimativa do schema, não medida) |
| Semrush | Concorrência | Gap analysis, trending | | **OpenSEO** `get_search_console_performance` | O que já posiciona (dados próprios) | Cliques, impressões, CTR, posição | **grátis** |
| AnswerThePublic | Long-tail questions | Questões reais utilizadores | | **OpenSEO** `get_ranked_keywords` | Keywords de um domínio (nosso ou concorrente) | Posição, volume, tráfego | pago |
| Google Trends | Sazonalidade | Tendência temporal | | AnswerThePublic | Long-tail questions | Questões reais de utilizadores | grátis |
| Google Trends | Sazonalidade | Tendência temporal | grátis |
**Ordem obrigatória:** Search Console primeiro (grátis e são dados de primeira mão), só depois as pagas. Mercado PT: `locationCode: 2620`, `languageCode: "pt"`.
### Keyword Difficulty Benchmarks ### Keyword Difficulty Benchmarks
+76 -105
View File
@@ -1,30 +1,13 @@
--- ---
name: seo-report name: seo-report
description: Relatorio de auditoria SEO completo com Lighthouse, Google Search Console e exportacao para Google Docs. Analisa Core Web Vitals, desempenho, SEO on-page e gera recomendacoes accionaveis. description: Relatório SEO completo com dados reais via OpenSEO (Search Console, crawl, Core Web Vitals, backlinks) e exportação para Google Docs. Prioriza por retorno e gera plano de acção. Usar quando "relatório SEO", "seo report", "relatório cliente SEO", "auditoria para cliente".
--- ---
# Skill: /seo-report # Skill: /seo-report
Gera relatorio SEO completo com dados de multiplas fontes e exporta automaticamente para Google Docs. Relatório SEO para cliente, com dados reais do **OpenSEO**, exportado para Google Docs.
--- Diferença face a `/seo-audit`: a auditoria é o **diagnóstico técnico interno**; o report é o **entregável ao cliente** — mesma recolha, apresentação orientada a decisão e a orçamento.
## Contexto NotebookLM
ANTES de executar, consultar notebook para contexto especializado:
| Notebook | ID | Consultar quando |
|----------|-----|-----------------|
| Marketing Digital PT | `4c595973` | Sempre |
```
mcp__notebooklm__notebook_query({
notebook_id: "4c595973-ba10-420a-a3bf-e4389e424ad3",
query: "<adaptar ao contexto — ex: auditoria SEO, relatorio performance, recomendacoes tecnicas>"
})
```
**Procedimento relacionado:** `PROC-DMARC-Email-Entregabilidade.md` -- consultar quando o relatorio envolve email deliverability.
--- ---
@@ -32,127 +15,115 @@ mcp__notebooklm__notebook_query({
`/seo-report <url>` ou `/seo-report <url> <email_destino>` `/seo-report <url>` ou `/seo-report <url> <email_destino>`
---
## Exemplos
```bash ```bash
# Relatorio basico (envia para emanuelalmeidaa@gmail.com)
/seo-report https://descomplicar.pt /seo-report https://descomplicar.pt
# Relatorio para cliente especifico
/seo-report https://cliente.pt cliente@email.com /seo-report https://cliente.pt cliente@email.com
# Relatorio com analise concorrencia
/seo-report https://site.pt --competitors=concorrente1.pt,concorrente2.pt /seo-report https://site.pt --competitors=concorrente1.pt,concorrente2.pt
``` ```
--- ---
## Fontes de Dados ## Fontes de dados
| Fonte | Dados Recolhidos | Tempo | | Fonte | Ferramenta | Dados | Custo |
|-------|------------------|-------| |---|---|---|---|
| **Lighthouse (Desktop)** | Performance, SEO, Accessibility, Best Practices | ~30s | | **Search Console** | `get_search_console_performance` | Cliques, impressões, CTR, posição, por query e por página | grátis |
| **Lighthouse (Mobile)** | Core Web Vitals, INP, comparacao mobile/desktop | ~30s | | **Indexação** | `inspect_urls` | Estado de indexação (até 10 URLs) | grátis |
| **Lighthouse (Optimizacoes)** | Oportunidades LCP, JS nao usado, images optimization | ~15s | | **Crawl técnico** | `run_site_audit` → `get_audit_issues` | Issues por severidade, Lighthouse em amostra | grátis |
| **GSC** | Cliques, impressoes, CTR, posicao media, top queries, tendencia 90 dias | ~10s | | **Core Web Vitals** | `chrome-devtools → performance_start_trace` | LCP, INP, CLS por página | grátis |
| **SEO Tools API** | Meta tags, imagens, alt text, links internos/externos, estrutura HTML | ~5s | | **Keywords** | `get_keyword_metrics` | Volume, KD, intenção (até 700/chamada) | pago |
| **Ahrefs (opcional)** | DR, UR, backlinks, referring domains | ~10s | | **Autoridade** | `get_backlinks_overview`, `get_domain_overview` | Backlinks, ref. domains, tráfego estimado | pago |
| **Concorrência** | `find_serp_competitors`, `get_serp_results` | Quem ocupa a SERP | pago |
**Tempo Total:** ~1m40s (sem concorrencia) | ~3m (com 2 concorrentes) **Tempo:** ~5-10 min (crawl de 600 páginas demora ~4 min). Não é instantâneo — avisar o cliente.
--- ---
## Workflow ## Workflow
1. Validar URL de entrada
2. Verificar se site esta no GSC (skip se nao)
3. Executar auditorias em paralelo:
- Lighthouse Desktop + Mobile
- Core Web Vitals
- SEO Tools API
- GSC Analytics (se disponivel)
- Ahrefs (se habilitado)
4. Processar e formatar dados
5. Gerar relatorio Markdown
6. Criar Google Doc e partilhar
7. Retornar link do documento
---
## Estrutura do Relatorio
O relatorio final tem 8 seccoes:
1. **Sumario Executivo** -- Top 5 descobertas + accao imediata recomendada
2. **Pontuacoes Globais** -- Desktop vs Mobile (Performance, SEO, A11y, Best Practices)
3. **Core Web Vitals** -- LCP, INP, CLS com oportunidades de optimizacao
4. **GSC Analytics** -- Performance overview, top queries, oportunidades CTR (ultimos 90 dias)
5. **Analise On-Page** -- Meta tags, imagens SEO, internal linking
6. **Backlinks e Autoridade** -- DR, UR, top backlinks, estrategia
7. **Plano de Accao** -- Priorizado (critico/importante/melhoria) com impacto e esforco
8. **Roadmap Trimestral** -- Fundacao tecnica -> Conteudo e autoridade -> Consolidacao
---
## Propriedades GSC Disponiveis
``` ```
sc-domain:descomplicar.pt 1. whoami + list_projects → projectId e mercado (GATE: PT = 2620/pt)
https://emanuelalmeida.pt/ 2. GSC por query + por página → paginar até esgotar
https://carstuff.pt/ 3. Dimensionar o crawl → maxPages ≥ nº páginas com impressões + 25%
https://solarfvengenharia.com/ 4. run_site_audit → poll get_audit_status até "completed"
https://aquisevende.pt/ 5. get_audit_issues → critical → warning → info
https://alojadamaria.com/ 6. Cruzar fase 2 com fase 5 → páginas com procura E com defeito = lista de trabalho
https://e-commerce.descomplicar.pt/ 7. [pago, opcional] keywords, backlinks, SERP
8. Gerar Markdown → Google Doc → partilhar
``` ```
**Os passos 1-6 são grátis e produzem o grosso do relatório.** O passo 7 só se o cliente pagar análise competitiva.
--- ---
## Notas Tecnicas ## Estrutura do relatório (8 secções)
1. **Sumário executivo** — 5 descobertas + a acção imediata. Más notícias primeiro.
2. **Realidade actual** — cliques, impressões, CTR global, distribuição por posição, branded vs não-branded.
3. **Onde está o retorno** — striking distance (pos 4-20, ≥25 impressões) e desperdício (pos >40 com procura alta).
4. **Estado técnico** — issues por severidade, com **cobertura do crawl declarada**.
5. **Core Web Vitals** — LCP / INP / CLS nas páginas que importam (não em todas).
6. **Autoridade** — backlinks e ref. domains, se contratado.
7. **Plano de acção** — prioridade (crítico/importante/melhoria) × esforço × impacto estimado.
8. **Roadmap trimestral** — fundação técnica → conteúdo → consolidação.
---
## Regras de honestidade do relatório
Um relatório SEO é um documento comercial. Isso torna a precisão **mais** importante, não menos.
- **Declarar sempre a cobertura do crawl.** "1337 issues em 600 páginas crawladas de ~640 com impressões." Sem isto, o número de issues não significa nada.
- **Não apresentar contagens como URLs verificados.** Se a bridge só deu contagens, dizê-lo e anexar o link da UI.
- **Custos são estimativas.** O OpenSEO não expõe saldo — nunca escrever "gastámos X créditos" como facto.
- **Separar medido de inferido.** Marcar as inferências. Um cliente que descobre uma inferência apresentada como facto deixa de confiar no resto.
- **CTR baixo em posição alta não é problema de ranking.** É título/meta. Dizer isso — é a recomendação mais barata e de maior retorno que existe.
---
## Notas técnicas
### Requisitos ### Requisitos
- SEO Tools API a correr: `~/mcp-servers/seo-tools-api/start.sh` - OpenSEO acessível (`whoami` responde)
- Google Workspace MCP configurado - Propriedade ligada ao Search Console (senão, relatório sem fase GSC — declarar)
- GSC authentication (OAuth primeira vez) - `google-workspace` MCP para o Google Doc
### Erros Comuns ### Erros comuns
- **Site nao em GSC:** Relatorio gerado sem dados GSC (aviso incluido) | Erro | Sintoma | Solução |
- **Lighthouse timeout:** Retry automatico (3x) |---|---|---|
- **Ahrefs rate limit:** Skip backlinks, aviso no relatorio | **`maxPages` por omissão** | Relatório limpo demais, poucos issues | Redimensionar pelo nº de páginas do GSC e relançar |
| Site fora do GSC | Fase 2 vazia | Gerar sem GSC, com aviso destacado |
| Mercado errado | Dados de keywords em inglês/EUA | `locationCode: 2620`, `languageCode: "pt"` |
| Crawl a demorar | `get_audit_status` em `crawling` | Normal — 600 páginas ≈ 4 min. Fazer poll, não cancelar |
--- ---
## References (conteudo detalhado) ## References
| Ficheiro | Conteudo | | Ficheiro | Conteúdo |
|----------|----------| |---|---|
| `references/template-relatorio.md` | Template completo do relatorio com todas as tabelas e seccoes | | `references/template-relatorio.md` | Template completo com tabelas e secções |
| `references/implementacao-tecnica.md` | Workflow mermaid, codigo JS, funcoes GSC, notas tecnicas | | `references/implementacao-tecnica.md` | Workflow, chamadas OpenSEO, processamento |
Inventário completo das ferramentas e tabela de migração: `../seo-audit/references/ferramentas-api.md`
--- ---
## Anti-Patterns ## Anti-patterns
- Gerar relatorio sem dados reais (sempre usar MCPs) - Gerar relatório sem dados reais.
- Ignorar gap mobile/desktop - Omitir a cobertura do crawl (faz o relatório parecer melhor do que é).
- Nao priorizar recomendacoes (tudo parece igual) - Listar issues por contagem em vez de por impacto.
- Esquecer de verificar se site esta no GSC antes de tentar recolher dados - Apresentar estimativas de custo ou de tráfego como medições.
- Relatorio sem accoes concretas e estimativas de impacto - Recomendações sem esforço e impacto estimados.
- Correr as fases pagas antes das grátis.
--- ---
**Versao:** 2.1.0 | **Autor:** Descomplicar **Versão:** 3.0.0 | **Autor:** Descomplicar® | **Motor:** OpenSEO
---
## Healing Log ## Healing Log
Registo de erros conhecidos e como evitá-los. Lido automaticamente antes de executar.
```jsonl ```jsonl
{"date":"","issue":"","fix":"","source":"user|auto"} {"date":"2026-07-30","issue":"Skill dependia de SEO Tools API (localhost:3000), Lighthouse MCP, GSC MCP e Ahrefs — nenhum operacional. Workflow inteiro não executável.","fix":"Reescrita sobre OpenSEO; fases grátis antes das pagas; cobertura de crawl obrigatória no relatório.","source":"auto"}
``` ```
*Adicionar nova linha após cada erro corrigido.*
@@ -1,144 +1,169 @@
# Implementacao Tecnica - SEO Report # Implementação Técnica — SEO Report (OpenSEO)
## Workflow Tecnico ## Workflow
```mermaid ```mermaid
graph LR graph TD
A[Input: URL] --> B{Site em GSC?} A[Input: URL] --> B[whoami + list_projects]
B -->|Sim| C[Recolher dados GSC] B --> C{Mercado correcto?}
B -->|Nao| D[Skip GSC, aviso] C -->|Não| C2[Passar locationCode 2620 + languageCode pt]
C -->|Sim| D[GSC: dimensions query]
C2 --> D
C --> E[Lighthouse Desktop] D --> E[GSC: dimensions page]
D --> E E --> F[Dimensionar crawl:<br/>maxPages = páginas GSC + 25%]
E --> F[Lighthouse Mobile] F --> G[run_site_audit]
F --> G[Core Web Vitals] G --> H[poll get_audit_status]
G --> H[SEO Tools API] H -->|running| H
H --> I{Ahrefs habilitado?} H -->|completed| I[get_audit_issues por severidade]
I -->|Sim| J[Recolher DR/UR] I --> J[Cruzar: páginas com procura<br/>E com defeito]
I -->|Nao| K[Skip Ahrefs] J --> K{Fases pagas contratadas?}
J --> L[Processar dados] K -->|Sim| L[get_keyword_metrics<br/>get_backlinks_overview<br/>get_serp_results]
K --> L K -->|Não| M[Saltar fases pagas]
L --> M[Gerar relatorio Markdown] L --> N[Processar]
M --> N[Criar Google Doc] M --> N
N --> O[Partilhar com email] N --> O[Markdown] --> P[Google Doc] --> Q[Partilhar]
O --> P[Retornar link]
``` ```
## Implementacao **O ponto crítico é o nó F.** Dimensionar o crawl a partir do GSC é o que distingue um relatório verdadeiro de um relatório limpo e falso.
---
## Sequência de chamadas
```javascript ```javascript
async function generateSEOReport(url, options = {}) { // 1. Contexto e mercado
const { const me = await openseo.whoami();
email = 'emanuelalmeidaa@gmail.com', const projs = await openseo.list_projects();
competitors = [], const projectId = projs[0].id;
includeAhrefs = true const MARKET = { locationCode: 2620, languageCode: 'pt' }; // Portugal
} = options;
// 1. Validar URL // 2. Search Console — paginar até esgotar (grátis)
if (!isValidURL(url)) { async function gscAll(dimensions) {
throw new Error('URL invalido'); const rows = [];
let startRow = 0;
while (true) {
const r = await openseo.get_search_console_performance({
projectId, dimensions, dateRange: 'last_3_months',
rowLimit: 1000, startRow
});
const parsed = parseRows(r.text);
rows.push(...parsed);
if (!r.text.split('\n')[0].includes('more available') || !parsed.length) break;
startRow += 1000;
}
return rows;
} }
// 2. Recolher dados em paralelo (melhor performance) const byQuery = await gscAll(['query']);
const [ const byPage = await gscAll(['page']);
lighthouseDesktop,
lighthouseMobile,
coreWebVitals,
seoToolsData,
gscData,
ahrefsData
] = await Promise.allSettled([
mcp__lighthouse__run_audit(url, 'desktop'),
mcp__lighthouse__run_audit(url, 'mobile'),
mcp__lighthouse__get_core_web_vitals(url),
fetch(`http://localhost:3000/seo-audit?url=${url}`).then(r => r.json()),
getGSCData(url),
includeAhrefs ? getAhrefsData(url) : null
]);
// 3. Processar e formatar // 3. Dimensionar o crawl a partir da realidade, não de um default
const reportData = { const maxPages = Math.ceil(byPage.length * 1.25);
url,
date: new Date().toISOString().split('T')[0], // 4. Crawl (grátis) — assíncrono, exige poll
scores: extractScores(lighthouseDesktop, lighthouseMobile), const audit = await openseo.run_site_audit({
cwv: processCoreWebVitals(coreWebVitals), projectId, url, maxPages, runLighthouse: true
gsc: processGSCData(gscData), });
onPage: processOnPageData(seoToolsData), let status;
backlinks: processBacklinks(ahrefsData), do {
recommendations: generateRecommendations(/* all data */) await sleep(30_000);
status = await openseo.get_audit_status({ projectId, auditId: audit.id });
} while (!status.text.includes('completed'));
// 5. Issues por severidade (grátis)
const critical = await openseo.get_audit_issues({ projectId, auditId: audit.id, severity: 'critical' });
const warning = await openseo.get_audit_issues({ projectId, auditId: audit.id, severity: 'warning' });
// 6. Fases pagas — so se contratadas
if (options.paid) {
const kw = await openseo.get_keyword_metrics({
projectId, keywords: strikingDistance(byQuery).map(r => r.key), ...MARKET
});
const bl = await openseo.get_backlinks_overview({ projectId, target: domain });
}
```
---
## Processamento — as funções que importam
```javascript
// GSC anonimiza queries: totais por query < totais por página.
// Para números globais usar SEMPRE a vista por página.
const globals = {
clicks: sum(byPage, 'clicks'),
impressions: sum(byPage, 'impressions'),
ctr: sum(byPage, 'clicks') / sum(byPage, 'impressions')
}; };
// 4. Gerar documento Markdown // O GSC não filtra por posição — filtrar do lado do cliente.
const markdown = generateReportMarkdown(reportData); const strikingDistance = rows => rows
.filter(r => r.position >= 4 && r.position <= 20 && r.impressions >= 25)
.sort((a, b) => b.impressions - a.impressions);
// 5. Criar Google Doc // Páginas com procura real enterradas fora das primeiras 4 páginas.
const docResult = await mcp__google-workspace__create_doc({ const waste = rows => rows
title: `Relatorio SEO - ${extractDomain(url)} - ${reportData.date}`, .filter(r => r.position > 40 && r.impressions >= 300)
body_content: markdown, .sort((a, b) => b.impressions - a.impressions);
// O sinal mais accionável: primeira página, CTR nulo.
// Não é ranking — é título e meta description.
const titleProblem = rows => rows
.filter(r => r.position <= 10 && r.impressions >= 200 && r.ctr < 0.005);
// Lixo nas queries do GSC (colagens do Google Ads, operadores site:).
const isNoise = k =>
(k.includes('ativado') && k.includes('correspond')) ||
k.startsWith('-site:') || k.startsWith('=') ||
k.length > 90 || k.includes('0,00');
```
---
## Entrega
```javascript
const doc = await googleWorkspace.docs_create_document({
title: `Relatório SEO — ${domain} — ${today}`,
user_google_email: email user_google_email: email
}); });
await googleWorkspace.docs_append_text({ document_id: doc.id, text: markdown });
// 6. Retornar link
return {
success: true,
doc_url: docResult.url,
summary: reportData.recommendations.slice(0, 5)
};
}
``` ```
## Propriedades GSC Disponiveis ---
```javascript ## Notas técnicas
const GSC_PROPERTIES = [
'sc-domain:descomplicar.pt',
'https://emanuelalmeida.pt/',
'https://carstuff.pt/',
'https://solarfvengenharia.com/',
'https://aquisevende.pt/',
'https://alojadamaria.com/',
'https://e-commerce.descomplicar.pt/'
];
async function getGSCData(url) {
const domain = extractDomain(url);
const property = GSC_PROPERTIES.find(p => p.includes(domain));
if (!property) {
console.warn(`Site ${domain} nao esta no GSC. Dados GSC nao disponiveis.`);
return null;
}
const analytics = await mcp__gsc__get_search_analytics({
site_url: property,
start_date: daysAgo(90),
end_date: 'today',
dimensions: ['query'],
row_limit: 100
});
return analytics;
}
```
## Notas Tecnicas
### Requisitos ### Requisitos
- SEO Tools API a correr: `~/mcp-servers/seo-tools-api/start.sh` - OpenSEO acessível (`whoami` responde)
- Google Workspace MCP configurado - Propriedade ligada ao Search Console
- GSC authentication (OAuth primeira vez) - `google-workspace` MCP para o documento
### Performance ### Tempos reais (medidos, descomplicar.pt, 07-2026)
- Execucao paralela de tools (1m40s total) | Fase | Duração |
- Cache Lighthouse results (5 min TTL) |---|---|
- Rate limiting Ahrefs API (100 req/day free) | GSC (2 dimensões, ~1700+474 linhas) | ~10s |
| Crawl 600 páginas + Lighthouse 20 | ~4 min |
| `get_audit_issues` | instantâneo |
### Erros Comuns ### Limitações
- **Site nao em GSC:** Relatorio gerado sem dados GSC - **Issues sem URL:** `get_audit_issues` / `get_audit_pages` devolvem só contagens pela bridge MCP; `structuredContent.issues` não é entregue e `get_audit_pages` trunca em ~25 linhas. Usar `details.mcpMeta.url` para o link da UI.
- **Lighthouse timeout:** Retry automatico (3x) - **Sem medidor de créditos:** `whoami` não muda depois de chamadas pagas. Custos são estimativas.
- **Ahrefs rate limit:** Skip backlinks, aviso no relatorio - **Lag do GSC:** últimos ~3 dias incompletos; datas em Pacific Time; máx. 16 meses.
### Erros comuns
| Erro | Sintoma | Solução |
|---|---|---|
| `maxPages` por omissão (50) | Poucos issues, relatório "limpo" | Redimensionar pelo GSC, relançar |
| Site fora do GSC | Fase GSC vazia | Gerar sem GSC, aviso destacado |
| Mercado errado | Keywords em inglês/EUA | `locationCode: 2620`, `languageCode: "pt"` |
| Cancelar o crawl cedo demais | Sem `auditId` utilizável | Fazer poll; 600 páginas ≈ 4 min |
---
**Actualizado:** 30-07-2026 | Substitui a implementação baseada em Lighthouse MCP + SEO Tools API + Ahrefs
@@ -203,13 +203,17 @@ Data: YYYY-MM-DD | Versao 2.0 (2026 Standards)
## Anexos ## Anexos
### A. Metodologia ### A. Metodologia
- Lighthouse: 3 runs, mediana reportada - Motor: OpenSEO (crawl same-origin, robots-aware) + Search Console
- GSC: Ultimos 90 dias completos - Crawl: [N] páginas de [M] com impressões no GSC — **declarar sempre a cobertura**
- Search Console: últimos 3 meses; vista por página para totais (o GSC anonimiza queries)
- Core Web Vitals: Lighthouse em amostra; páginas individuais via chrome-devtools
- Thresholds: Google 2026 Standards - Thresholds: Google 2026 Standards
- Custos de chamadas pagas: estimativas do schema, não medições
### B. Glossario ### B. Glossário
- **DR**: Domain Rating (Ahrefs) - **Striking distance**: posição 4-20 com impressões relevantes — onde está o retorno
- **INP**: Interaction to Next Paint (substitui FID em 2026) - **KD**: Keyword Difficulty
- **INP**: Interaction to Next Paint (substituiu o FID em 2026)
- **E-E-A-T**: Experience, Expertise, Authoritativeness, Trust - **E-E-A-T**: Experience, Expertise, Authoritativeness, Trust
- **CTR**: Click-Through Rate - **CTR**: Click-Through Rate