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 Console
  • top_queries — consultas para um intervalo de datas
  • top_pages — páginas para um intervalo de datas
  • performance_trends — cliques, impressões, CTR e posição diários
  • compare_periods — totais para dois intervalos, além de diferenças rotuladas como derivadas desses totais
  • quick_wins — consultas com impressões acima ou igual a um limite e CTR abaixo ou igual a um limite
  • dropped_pages — páginas cuja posição piorou, cujos cliques caíram ou que desapareceram da resposta atual
  • inspect_url — resultado da API URL Inspection
  • account_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_ID
  • GOOGLE_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:

  • openid
  • https://www.googleapis.com/auth/userinfo.email
  • https://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:

BackendQuandoO que usa
memoryexperimentos e testes locaisos dados desaparecem quando o processo para
fileum único servidor de longa duração ou volume DockerSTORAGE_FILE (padrão ./data/rank-store.json)
blobVercelum Blob privado em STORAGE_BLOB_PATH (padrão rank/store.json)
postgresum banco de dados Postgres que você já rodaDATABASE_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_KEY
  • STRIPE_PRICE_MONTHLY
  • STRIPE_PRICE_YEARLY
  • STRIPE_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ávelNecessária para
APP_BASE_URLorigem pública; determina o URI de redirecionamento do Google
PORTporta de escuta, padrão 44721
GOOGLE_CLIENT_IDlogin do Google e Search Console
GOOGLE_CLIENT_SECRETtroca de token do Google
TOKEN_ENCRYPTION_KEYcriptografar refresh tokens e assinar a sessão do navegador
STORAGE_BACKENDmemory, file, blob ou postgres
STORAGE_FILEcaminho do backend de arquivos
STORAGE_BLOB_PATHcaminho do blob, padrão rank/store.json
BLOB_READ_WRITE_TOKENtoken de leitura e gravação do Blob do Vercel, injetado no Vercel
DATABASE_URLbackend postgres
STRIPE_SECRET_KEYCheckout e portal de cobrança
STRIPE_PRICE_MONTHLYID de preço do Checkout mensal
STRIPE_PRICE_YEARLYID de preço do Checkout anual
STRIPE_WEBHOOK_SECRETassinaturas 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