Rank by Ouroboros Apps
Rank by Ouroboros Apps: rankings de SEO e tráfego do Google Search Console, somente leitura
Servidor MCP hospedado
npx add-mcp 'https://rank.ouroborosapps.com/mcp'Instala no Claude Code, Codex, Cursor e outros
Documentação
Rank by Ouroboros
O Rank by Ouroboros responde perguntas de SEO a partir dos dados da conta do Google Search Console que você conectar. Ele é para donos de sites, blogueiros, pequenas empresas e freelancers de SEO que querem esses números dentro do ChatGPT, Claude, Gemini, Grok, Cursor ou qualquer outro cliente MCP que fale Streamable HTTP e OAuth.
O assistente pode listar propriedades verificadas, ler as principais consultas e páginas, acompanhar cliques, impressões, CTR e posição média ao longo do tempo, comparar dois períodos, encontrar consultas com muitas impressões e pouco CTR, ver páginas que caíram e verificar o status do URL Inspection. Cada métrica vem da resposta da API do Search Console. O Rank não estima tráfego nem preenche dias que a API deixou de fora. O CTR permanece a fração retornada pelo Search Console (0,02 é 2%).
Um teste de 14 dias começa quando você conecta o Google. Depois disso, o Pro é uma assinatura via Stripe. O valor é mostrado no Stripe Checkout, não neste README nem no produto.
Servidor hospedado
- URL do servidor MCP:
https://rank.ouroborosapps.com/mcp(Streamable HTTP, login OAuth) - Documentação: https://ouroborosapps.com/docs/rank
- Status: acesso antecipado. Cole a URL no modo de desenvolvedor do Claude, Cursor, Grok ou ChatGPT.
- Nome no registro:
io.github.LAHutchins91/rank
Conectar um assistente
O endereço MCP é https://YOUR_HOST/mcp após o deploy, ou http://127.0.0.1:44721/mcp quando você roda localmente. Escolha OAuth e deixe o client id e o secret vazios. O Rank suporta registro dinâmico de clientes e PKCE.
Cursor, em ~/.cursor/mcp.json:
{
"mcpServers": {
"rank": {
"url": "http://127.0.0.1:44721/mcp"
}
}
}
Claude Code:
claude mcp add --transport http rank http://127.0.0.1:44721/mcp
Use a mesma URL para ChatGPT, Claude, Gemini e Grok. A página de conexão no aplicativo repete esses passos para o host em APP_BASE_URL.
Ferramentas
list_properties— propriedades verificadas do Search Consoletop_queries— consultas para um intervalo de datastop_pages— páginas para um intervalo de datasperformance_trends— cliques, impressões, CTR e posição diárioscompare_periods— totais para dois intervalos, além de diferenças rotuladas como derivadas desses totaisquick_wins— consultas com impressões acima ou igual a um limite e CTR abaixo ou igual a um limitedropped_pages— páginas cuja posição piorou, cujos cliques caíram ou que desapareceram da resposta atualinspect_url— resultado da API URL Inspectionaccount_status— se o Google está conectado e se a assinatura de teste ou Pro está ativa
Se você omitir as datas, o Rank usa uma janela de 28 dias terminando três dias UTC atrás e informa isso no resultado. Passe startDate e endDate (YYYY-MM-DD) para escolher a janela.
Cliente OAuth do Google Cloud
Crie um cliente OAuth do tipo Aplicativo web. O Rank lê:
GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRET
URI de redirecionamento autorizado, exatamente, sem barra final na origem:
${APP_BASE_URL}/google/callback
Localmente, com o APP_BASE_URL padrão, isso é:
http://127.0.0.1:44721/google/callback
Adicione estes escopos na tela de consentimento OAuth:
openidhttps://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/webmasters.readonly
webmasters.readonly é o escopo somente leitura do Search Console. O Rank solicita acesso offline para que o Google retorne um refresh token. O refresh token é criptografado antes de ser armazenado. TOKEN_ENCRYPTION_KEY é a chave (uma string aleatória longa). Se a chave mudar, os tokens existentes não podem ser lidos e a conta precisa conectar o Google novamente.
Se o console do Google pedir uma origem JavaScript autorizada, use a origem de APP_BASE_URL (http://127.0.0.1:44721 localmente). O URI de redirecionamento acima é o valor que deve corresponder.
Armazenamento
O estado do teste, os IDs de cliente do Stripe, os clientes e tokens OAuth do MCP, o login pendente do Google e o refresh token criptografado do Google compartilham uma única interface de armazenamento. Defina STORAGE_BACKEND:
| Backend | Quando | O que usa |
|---|---|---|
memory | experimentos e testes locais | os dados desaparecem quando o processo para |
file | um único servidor de longa duração ou volume Docker | STORAGE_FILE (padrão ./data/rank-store.json) |
blob | Vercel | um Blob privado em STORAGE_BLOB_PATH (padrão rank/store.json) |
postgres | um banco de dados Postgres que você já roda | DATABASE_URL |
O Postgres usa uma tabela, criada no primeiro uso se estiver ausente:
CREATE TABLE IF NOT EXISTS rank_kv (
collection text NOT NULL,
id text NOT NULL,
document jsonb NOT NULL,
PRIMARY KEY (collection, id)
);
Não há um segundo esquema. O armazenamento em memória e em arquivo é redefinido no Vercel, então a produção usa o backend Blob. O documento Blob usa o mesmo layout do armazenamento de arquivos: coleções de registros JSON. Os códigos de autorização OAuth e o estado pendente de login do Google são registros nesse documento, para que um callback possa chegar a uma instância serverless diferente. Cada gravação remove códigos de autorização expirados, sessões de login pendentes, access tokens e refresh tokens. BLOB_READ_WRITE_TOKEN é injetado quando o armazenamento Blob do Vercel é conectado. Não o envie para o repositório.
Cobrança
Defina estes itens a partir da conta Stripe que o Lawrence já usa. Não crie produtos neste repositório. Os IDs de preço não são valores em dólar.
STRIPE_SECRET_KEYSTRIPE_PRICE_MONTHLYSTRIPE_PRICE_YEARLYSTRIPE_WEBHOOK_SECRET
O Checkout é POST /billing/checkout com { "plan": "monthly" } ou { "plan": "yearly" }. O webhook é POST /billing/webhook. GET /health inclui billingConfigured: true somente quando a chave secreta e os dois IDs de preço estão definidos.
O teste local é de 14 dias a partir da primeira conexão com o Google. O Checkout envia ao Stripe todos os dias restantes do teste, quando houver, para que a primeira cobrança espere até o teste terminar.
Rodar localmente
npm install
cp .env.example .env
# fill Google, encryption, and Stripe values in .env
npm run dev
O servidor escuta em PORT (padrão 44721).
npm test
npm run typecheck
npm start
npm start roda o servidor compilado. O Docker compila o mesmo comando (node dist/src/server.js) e espera logo.jpg na raiz da imagem.
Deploy
Vercel: defina APP_BASE_URL como https://rank.ouroborosapps.com, defina STORAGE_BACKEND=blob e conecte um armazenamento Blob para que o Vercel injete BLOB_READ_WRITE_TOKEN. vercel.json envia cada caminho para a função Node e agrupa logo.jpg nessa função. /logo.jpg e as rotas do aplicativo são servidas pela função. /package.json não é um arquivo estático. O remoto em server.json é https://rank.ouroborosapps.com/mcp.
O nome no registro é io.github.LAHutchins91/rank. O ícone é https://rank.ouroborosapps.com/logo.jpg.
Variáveis de ambiente
| Variável | Necessária para |
|---|---|
APP_BASE_URL | origem pública; determina o URI de redirecionamento do Google |
PORT | porta de escuta, padrão 44721 |
GOOGLE_CLIENT_ID | login do Google e Search Console |
GOOGLE_CLIENT_SECRET | troca de token do Google |
TOKEN_ENCRYPTION_KEY | criptografar refresh tokens e assinar a sessão do navegador |
STORAGE_BACKEND | memory, file, blob ou postgres |
STORAGE_FILE | caminho do backend de arquivos |
STORAGE_BLOB_PATH | caminho do blob, padrão rank/store.json |
BLOB_READ_WRITE_TOKEN | token de leitura e gravação do Blob do Vercel, injetado no Vercel |
DATABASE_URL | backend postgres |
STRIPE_SECRET_KEY | Checkout e portal de cobrança |
STRIPE_PRICE_MONTHLY | ID de preço do Checkout mensal |
STRIPE_PRICE_YEARLY | ID de preço do Checkout anual |
STRIPE_WEBHOOK_SECRET | assinaturas de webhook do Stripe |
RANK_TEST_HOOKS=1 permite que os testes concluam o login MCP sem o Google. O processo se recusa a iniciar quando isso está definido e NODE_ENV=production.
Licença
MIT. Copyright (c) 2026 Lawrence Hutchins.
Mais da Ouroboros: https://ouroborosapps.com