AdLens
Seus números do AdMob, sem o console do AdMob. Um servidor MCP rápido para que seu assistente de IA consulte os mesmos dados ao vivo.
Servidor MCP hospedado
npx add-mcp 'https://adlens.moreproductive.in/mcp'Instala no Claude Code, Codex, Cursor e outros
Documentação
AdLens
Seus números do AdMob, sem o console do AdMob.
Um painel de análise rápido do AdMob, além de um servidor MCP para que seu assistente de IA possa consultar os mesmos dados ao vivo.
App ao vivo · Configuração do MCP · Self-host · Problemas
Faça uma pergunta. O Claude chama o AdLens. Respostas ao vivo do AdMob.
O que é o AdLens?
O console do AdMob mostra totais. O AdLens mostra causas.
Conecte sua conta do AdMob uma vez (somente leitura) e você terá:
- Um painel web rápido para receita, impressões, eCPM, mediação e detalhamentos por país.
- Um servidor MCP para que Claude, Cursor, Codex e outros clientes de IA possam responder perguntas a partir dos mesmos dados ao vivo, como "Qual formato de anúncio tem o melhor eCPM este mês?"
É gratuito, somente leitura e não armazena nenhum dos seus dados de relatório. Você pode usar a versão hospedada ou executar a sua própria.
Recursos
Painel
- Ao vivo, não sincronizado: buscado da API do AdMob quando você abre uma página.
- Hoje em resumo: hoje, ontem, últimos 7 dias e este mês, com impressões e eCPM.
- Comparações de períodos: cada KPI mostra sua variação em relação ao período anterior.
- Detalhamentos classificáveis: por dia, app, unidade de anúncio, formato, fonte de mediação ou país.
- Análises aprofundadas por app com a mesma profundidade, além de temas claro e escuro.
O painel do AdLens (dados de exemplo).
Servidor MCP
Cinco ferramentas somente leitura que qualquer cliente MCP pode chamar:
| Ferramenta | O que faz |
|---|---|
account_overview | Lista suas conexões e apps (id, nome, plataforma, nome do pacote) |
revenue_summary | Totais mais séries diárias ou semanais, usando predefinições ou datas explícitas |
breakdown | Receita por app, unidade de anúncio, formato, país, fonte de anúncio (mediação) ou data |
top_movers | Movimentações período a período, com o período anterior escolhido automaticamente para predefinições |
list_ad_units | Seu inventário de unidades de anúncio |
Exemplos de prompts para experimentar:
- "Resumo de receita dos últimos 30 dias"
- "Principais movimentações por país, esta semana vs. semana passada"
- "Detalhe a receita de mediação do meu app principal"
- "Qual formato de anúncio tem o melhor eCPM este mês?"
Primeiros passos (hospedado)
A configuração leva cerca de um minuto.
- Entre em adlens.moreproductive.in com um código de uso único por e-mail ou Google. Uma senha é opcional.
- Conecte o AdMob. Você aprova uma tela de consentimento do Google OAuth com o escopo
admob.readonly. - Use do seu jeito. Abra o painel ou gere uma chave de API e conecte seu cliente de IA (abaixo).
Conecte seu assistente de IA (MCP)
Gere uma chave de API na página de Chaves de API do painel. As chaves têm o formato ak_live_... e são mostradas uma única vez, então copie a sua imediatamente. Depois, adicione o AdLens ao seu cliente.
O endpoint do MCP é:
https://adlens.moreproductive.in/mcp
Se você fizer self-host, substitua o domínio pelo seu próprio. O AdLens é um servidor MCP padrão Streamable HTTP autenticado com um token Bearer, então qualquer cliente que suporte uma URL remota com cabeçalhos personalizados funcionará.
Claude Code
claude mcp add --transport http adlens https://adlens.moreproductive.in/mcp \
--header "Authorization: Bearer ak_live_..."
Ou adicione ao .mcp.json:
{
"mcpServers": {
"adlens": {
"type": "http",
"url": "https://adlens.moreproductive.in/mcp",
"headers": { "Authorization": "Bearer ak_live_..." }
}
}
}
Claude Desktop
O arquivo de configuração do Claude Desktop não tem suporte nativo a URL + cabeçalho, então faça a ponte com o mcp-remote.
Edite claude_desktop_config.json:
- macOS:
~/Library/Application Support/Claude/ - Windows:
%APPDATA%\Claude\ - Linux:
~/.config/Claude/
{
"mcpServers": {
"adlens": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"https://adlens.moreproductive.in/mcp",
"--header", "Authorization: Bearer ak_live_..."
]
}
}
}
No Windows, use npx.cmd em vez de npx como comando:
{
"mcpServers": {
"adlens": {
"command": "npx.cmd",
"args": [
"-y", "mcp-remote",
"https://adlens.moreproductive.in/mcp",
"--header", "Authorization: Bearer ak_live_..."
]
}
}
}
Codex
Em ~/.codex/config.toml (Windows: %USERPROFILE%\.codex\config.toml):
[mcp_servers.adlens]
url = "https://adlens.moreproductive.in/mcp"
http_headers = { "Authorization" = "Bearer ak_live_..." }
Cursor, VS Code, Windsurf e outros clientes
Para o Cursor, edite ~/.cursor/mcp.json (Windows: %USERPROFILE%\.cursor\mcp.json):
{
"mcpServers": {
"adlens": {
"url": "https://adlens.moreproductive.in/mcp",
"headers": { "Authorization": "Bearer ak_live_..." }
}
}
}
Para clientes somente stdio, use a ponte mcp-remote mostrada na seção do Claude Desktop.
Antigravity
Em ~/.gemini/antigravity/mcp_config.json (Windows: %USERPROFILE%\.gemini\antigravity\mcp_config.json), ou pelo painel MCP Store → Gerenciar servidores MCP → Ver configuração bruta:
{
"mcpServers": {
"adlens": {
"serverUrl": "https://adlens.moreproductive.in/mcp",
"headers": { "Authorization": "Bearer ak_live_..." }
}
}
}
OpenCode
Em opencode.json (projeto) ou ~/.config/opencode/opencode.json. Este caminho é o mesmo no Windows (%USERPROFILE%\.config\opencode\opencode.json), não %APPDATA%. Definir oauth: false faz o OpenCode usar sua chave Bearer em vez de tentar o login OAuth primeiro.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"adlens": {
"type": "remote",
"url": "https://adlens.moreproductive.in/mcp",
"enabled": true,
"oauth": false,
"headers": { "Authorization": "Bearer ak_live_..." },
"timeout": 30000
}
}
}
Dica: para testar o endpoint sem um cliente de IA, execute o MCP Inspector:
npx @modelcontextprotocol/inspector
Self-hosting
O AdLens é multi-tenant por design e fácil de executar você mesmo. Você precisa de:
- Node.js (LTS) e pnpm, ou apenas Docker
- Um banco de dados Postgres (o arquivo Docker Compose incluído inicia um)
- Um projeto MojAuth para login (OTP por e-mail + Google). Você precisará da chave de API dele.
- Um cliente OAuth do Google Cloud com a API do AdMob habilitada e o escopo
admob.readonly
1. Clone e configure
git clone https://github.com/ys-pro-duction/AdLens.git
cd AdLens
cp .env.example .env # then fill in the values below
Gere os segredos aleatórios com:
openssl rand -hex 32
| Variável | Obrigatória | Descrição |
|---|---|---|
APP_URL | sim | URL pública da sua instância (use seu domínio https em produção) |
DATABASE_URL | sim | String de conexão do Postgres |
MOJOAUTH_API_KEY | sim | Chave do seu projeto MojAuth (OTP por e-mail + login Google) |
SESSION_SECRET | sim | Segredo aleatório usado para assinar cookies de sessão |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | sim | Cliente OAuth do Google para conectar o AdMob |
ENCRYPTION_KEY | sim | Chave hex de 32 bytes usada para criptografar tokens de atualização em repouso |
OAUTH_STATE_SECRET | não | Segredo separado para assinar o estado do OAuth |
TRUST_PROXY | não | Defina como 1 ao executar atrás do nginx para que os limites de taxa vejam os IPs reais dos clientes |
HOST | não | Endereço de bind. Use 127.0.0.1 atrás de um proxy reverso |
MOJOAUTH_AUDIENCE | não | Verificação opcional de audiência para tokens MojAuth |
MOJOAUTH_ISSUERS | não | Substitui os emissores de token MojAuth permitidos |
.env.example é mantido atualizado e tem a lista completa anotada.
No seu cliente OAuth do Google Cloud, registre <APP_URL>/api/admob/callback como um URI de redirecionamento autorizado. No seu painel MojAuth, registre a URL de callback que ele mostra.
2a. Execute com Docker (tudo)
docker compose up --build
2b. Execute localmente para desenvolvimento
pnpm install
docker compose up -d db # Postgres only
pnpm db:migrate
pnpm dev # API on :3000, web on :5173
3. Produção
Compile a partir da raiz do repositório (compilar um único pacote pode deixar um packages/db/dist desatualizado):
git pull && pnpm install && pnpm db:migrate && pnpm build
Em produção, a API serve o app web compilado (apps/web/dist), então há um único processo para executar. Execute-o sob um gerenciador de processos de sua escolha (a instância hospedada usa pm2, com Postgres em Docker).
Atrás do nginx (ou qualquer proxy reverso):
- Defina
APP_URLpara seu domíniohttps - Defina
TRUST_PROXY=1 - Vincule o app ao localhost com
HOST=127.0.0.1
Nota: os limites de taxa são mantidos em memória por processo, então o AdLens é projetado para executar como um único processo. Se for exposto diretamente (sem proxy), deixe
TRUST_PROXYnão definido, porqueX-Forwarded-Forpode ser falsificado.
Limites de uso justo
O AdLens é gratuito, sem planos e sem cobranças. Limites de taxa por IP protegem o serviço:
| Endpoint | Limite |
|---|---|
API do painel (/api) | 300 requisições / minuto |
Servidor MCP (/mcp) | 15 requisições / minuto |
Se você fizer self-host, esses limites são seus para ajustar no código-fonte.
Arquitetura
flowchart LR
A[Vue dashboard] --> B[Express API]
C[MCP clients] --> B
B --> D[Live AdMob layer<br/>60-min cache · single-flight]
D --> E[(Google AdMob API)]
B --> F[(Postgres<br/>identity · encrypted keys )]
Não há worker, nem warehouse, nem métricas armazenadas. Os relatórios são buscados do Google sob demanda e agregados em JS.
Pilha de tecnologia e estrutura
Monorepo TypeScript (pnpm workspaces):
apps/web Vue 3 + Vite SPA (ECharts): dashboard, reports, mediation, API keys, settings
apps/api Express API + stateless MCP server; serves web/dist in production
(live AdMob serving layer: apps/api/src/live)
packages/db Drizzle schema + migrations (multi-tenant: tenant_id everywhere)
packages/admob AdMob OAuth + reporting API client
packages/crypto AES-256-GCM secrets, API key generation/hashing, scrypt
packages/shared Shared TypeScript types and AdMob constants
Aviso legal
O AdLens é um projeto independente e não é afiliado, endossado ou patrocinado pelo Google. AdMob e Google são marcas registradas da Google LLC.