Rank by Ouroboros Apps
Rank by Ouroboros Apps: clasificaciones SEO y tráfico de Google Search Console, solo lectura
Servidor MCP alojado
npx add-mcp 'https://rank.ouroborosapps.com/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
Rank by Ouroboros
Rank by Ouroboros responde preguntas de SEO desde la cuenta de Google Search Console que conectes. Está pensado para propietarios de sitios web, bloggers, pequeñas empresas y freelancers de SEO que quieren esos números dentro de ChatGPT, Claude, Gemini, Grok, Cursor o cualquier otro cliente MCP que hable Streamable HTTP y OAuth.
El asistente puede listar propiedades verificadas, leer las principales consultas y páginas, seguir clics, impresiones, CTR y posición media a lo largo del tiempo, comparar dos períodos, encontrar consultas con muchas impresiones y poco CTR, ver páginas que cayeron y comprobar el estado de URL Inspection. Cada métrica proviene de la respuesta de la API de Search Console. Rank no estima tráfico ni rellena los días que la API omitió. El CTR se mantiene como la fracción que devolvió Search Console (0.02 es 2%).
Una prueba de 14 días comienza cuando conectas Google. Después, Pro es una suscripción de Stripe. El importe se muestra en Stripe Checkout, no en este README ni en el producto.
Servidor alojado
- URL del servidor MCP:
https://rank.ouroborosapps.com/mcp(Streamable HTTP, inicio de sesión con OAuth) - Documentación: https://ouroborosapps.com/docs/rank
- Estado: acceso anticipado. Pega la URL en Claude, Cursor, Grok o el modo desarrollador de ChatGPT.
- Nombre del registro:
io.github.LAHutchins91/rank
Conectar un asistente
La dirección MCP es https://YOUR_HOST/mcp después del despliegue, o http://127.0.0.1:44721/mcp cuando lo ejecutas localmente. Elige OAuth y deja el id de cliente y el secreto vacíos. Rank admite registro dinámico de clientes y PKCE.
Cursor, en ~/.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
Usa la misma URL para ChatGPT, Claude, Gemini y Grok. La página de conexión dentro de la aplicación repite estos pasos para el host en APP_BASE_URL.
Herramientas
list_properties— propiedades verificadas de Search Consoletop_queries— consultas para un rango de fechastop_pages— páginas para un rango de fechasperformance_trends— clics diarios, impresiones, CTR y posicióncompare_periods— totales para dos rangos, más diferencias marcadas como derivadas de esos totalesquick_wins— consultas con un umbral de impresiones mínimo y un umbral de CTR máximodropped_pages— páginas cuya posición empeoró, cuyos clics cayeron o que desaparecieron de la respuesta actualinspect_url— resultado de la API de URL Inspectionaccount_status— si Google está conectado y si la suscripción de prueba o Pro está activa
Si omites las fechas, Rank usa una ventana de 28 días que termina hace tres días UTC y lo indica en el resultado. Pasa startDate y endDate (YYYY-MM-DD) para elegir la ventana.
Cliente OAuth de Google Cloud
Crea un cliente OAuth de tipo Aplicación web. Rank lee:
GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRET
URI de redirección autorizada, exacta, sin barra final en el origen:
${APP_BASE_URL}/google/callback
Localmente, con el APP_BASE_URL predeterminado, es:
http://127.0.0.1:44721/google/callback
Añade estos ámbitos en la pantalla de consentimiento de OAuth:
openidhttps://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/webmasters.readonly
webmasters.readonly es el ámbito de solo lectura de Search Console. Rank solicita acceso sin conexión para que Google devuelva un token de actualización. El token de actualización se cifra antes de almacenarse. TOKEN_ENCRYPTION_KEY es la clave (una cadena aleatoria larga). Si la clave cambia, los tokens existentes no se pueden leer y la cuenta tiene que conectar Google de nuevo.
Si la consola de Google pide un origen de JavaScript autorizado, usa el origen de APP_BASE_URL (http://127.0.0.1:44721 localmente). La URI de redirección anterior es el valor que debe coincidir.
Almacenamiento
El estado de la prueba, los ids de cliente de Stripe, los clientes y tokens OAuth de MCP, el inicio de sesión pendiente de Google y el token de actualización cifrado de Google comparten una única interfaz de almacenamiento. Configura STORAGE_BACKEND:
| Backend | Cuándo | Qué usa |
|---|---|---|
memory | experimentos y pruebas locales | los datos desaparecen cuando el proceso se detiene |
file | un servidor de larga duración o un volumen de Docker | STORAGE_FILE (predeterminado ./data/rank-store.json) |
blob | Vercel | un Blob privado en STORAGE_BLOB_PATH (predeterminado rank/store.json) |
postgres | una base de datos Postgres que ya ejecutas | DATABASE_URL |
Postgres usa una tabla, creada en el primer uso si falta:
CREATE TABLE IF NOT EXISTS rank_kv (
collection text NOT NULL,
id text NOT NULL,
document jsonb NOT NULL,
PRIMARY KEY (collection, id)
);
No hay un segundo esquema. El almacenamiento en memoria y en archivo se reinicia en Vercel, por lo que la producción usa el backend Blob. El documento Blob usa el mismo diseño que el almacén de archivos: colecciones de registros JSON. Los códigos de autorización OAuth y el estado pendiente de inicio de sesión de Google son registros en ese documento, para que una devolución de llamada pueda llegar a una instancia serverless diferente. Cada escritura elimina los códigos de autorización caducados, las sesiones de inicio de sesión pendientes, los tokens de acceso y los tokens de actualización. BLOB_READ_WRITE_TOKEN se inyecta cuando se conecta el almacén Blob de Vercel. No lo confirmes en el repositorio.
Facturación
Configúralo desde la cuenta de Stripe que Lawrence ya usa. No crees productos en este repositorio. Los ids de precio no son importes en dólares.
STRIPE_SECRET_KEYSTRIPE_PRICE_MONTHLYSTRIPE_PRICE_YEARLYSTRIPE_WEBHOOK_SECRET
El checkout es POST /billing/checkout con { "plan": "monthly" } o { "plan": "yearly" }. El webhook es POST /billing/webhook. GET /health incluye billingConfigured: true solo cuando la clave secreta y ambos ids de precio están configurados.
La prueba local es de 14 días desde la primera conexión de Google. Checkout envía a Stripe los días completos que quedan de esa prueba, si quedan, para que el primer cargo espere hasta que termine la prueba.
Ejecutar localmente
npm install
cp .env.example .env
# fill Google, encryption, and Stripe values in .env
npm run dev
El servidor escucha en PORT (predeterminado 44721).
npm test
npm run typecheck
npm start
npm start ejecuta el servidor compilado. Docker compila el mismo comando (node dist/src/server.js) y espera logo.jpg en la raíz de la imagen.
Desplegar
Vercel: configura APP_BASE_URL a https://rank.ouroborosapps.com, configura STORAGE_BACKEND=blob y conecta un almacén Blob para que Vercel inyecte BLOB_READ_WRITE_TOKEN. vercel.json envía cada ruta a la función Node y agrupa logo.jpg en esa función. /logo.jpg y las rutas de la aplicación son servidas por la función. /package.json no es un archivo estático. El remoto en server.json es https://rank.ouroborosapps.com/mcp.
El nombre del registro es io.github.LAHutchins91/rank. El icono es https://rank.ouroborosapps.com/logo.jpg.
Variables de entorno
| Variable | Requerida para |
|---|---|
APP_BASE_URL | origen público; determina la URI de redirección de Google |
PORT | puerto de escucha, predeterminado 44721 |
GOOGLE_CLIENT_ID | inicio de sesión de Google y Search Console |
GOOGLE_CLIENT_SECRET | intercambio de tokens de Google |
TOKEN_ENCRYPTION_KEY | cifrado de tokens de actualización y firma de la sesión del navegador |
STORAGE_BACKEND | memory, file, blob o postgres |
STORAGE_FILE | ruta del backend de archivo |
STORAGE_BLOB_PATH | ruta del blob, predeterminado rank/store.json |
BLOB_READ_WRITE_TOKEN | token de lectura-escritura de Vercel Blob, inyectado en Vercel |
DATABASE_URL | backend de postgres |
STRIPE_SECRET_KEY | Checkout y el portal de facturación |
STRIPE_PRICE_MONTHLY | id de precio de Checkout mensual |
STRIPE_PRICE_YEARLY | id de precio de Checkout anual |
STRIPE_WEBHOOK_SECRET | firmas de webhook de Stripe |
RANK_TEST_HOOKS=1 permite que las pruebas completen el inicio de sesión de MCP sin Google. El proceso se niega a iniciar cuando eso está configurado y NODE_ENV=production.
Licencia
MIT. Copyright (c) 2026 Lawrence Hutchins.
Más de Ouroboros: https://ouroborosapps.com