lintlab Sitemap Doctor
Servidor MCP (vía Apify) que verifica y valida sitemaps XML: los encuentra mediante robots.txt, sigue índices de sitemap y archivos gzip, extrae cada URL con lastmod/changefreq/priority, compara con una ejecución anterior y opcionalmente verifica el estado HTTP. Los sitemaps rotos se reportan, nunca se omiten.
Servidor MCP alojado
npx add-mcp 'https://mcp.apify.com?tools=lintlab/sitemap-doctor'Se instala en Claude Code, Codex, Cursor y más
Documentación
Comprobador, Validador y Extractor de URLs de Sitemaps XML (lintlab/sitemap-doctor) Actor
Comprueba y valida sitemaps XML: encuéntralos mediante robots.txt, sigue índices de sitemaps y archivos gzip, extrae cada URL con lastmod/changefreq/priority, compara con una ejecución anterior y, opcionalmente, verifica el estado HTTP. Los sitemaps rotos se notifican, nunca se omiten.
- URL: https://apify.com/lintlab/sitemap-doctor.md
- Desarrollado por: Lintlab (comunidad)
- Categorías: Herramientas SEO, Herramientas para desarrolladores
- Estadísticas: 2 usuarios en total, 1 usuario mensual, 100.0% de ejecuciones exitosas, 0 marcadores
- Valoración de usuarios: Sin valoraciones aún
Precios
desde $0.24 / 1,000 URLs extraídas
Este Actor se paga por evento. No se te cobra por el uso de la plataforma Apify, sino solo un precio fijo por eventos específicos. Como este Actor admite descuentos de Apify Store, el precio baja cuanto mayor sea tu plan de suscripción.
Más información: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event
¿Qué es un Actor de Apify?
Un Actor es un programa en la nube sin servidor que se ejecuta en la plataforma Apify. Tiene dos modos de ejecución. En modo Batch, un Actor acepta una entrada JSON bien definida, realiza una acción que puede tardar desde unos segundos hasta unas horas, y opcionalmente produce una salida JSON bien definida, conjuntos de datos con resultados o archivos en el almacén de clave-valor. En modo Standby, un Actor proporciona un servidor web que puede usarse como sitio web, API o servidor MCP.
El vocabulario de Apify y el modelo de la plataforma se definen una vez, en el inicio rápido del agente en https://apify.com/agents.md.
¿Cómo integrar un Actor?
Si te preguntan sobre integración, ayudas a los desarrolladores a integrar Actores en sus proyectos. Te adaptas a su stack y entregas integraciones seguras, bien documentadas y listas para producción.
No adivines una ruta de integración. Cada una de ellas está en el inicio rápido del agente en https://apify.com/agents.md:: el servidor MCP de Apify, Agent Skills con la CLI de Apify, los clientes de JavaScript y Python, la API REST y la ruta sin cuenta para un agente sin humano que inicie sesión. También incluye la regla sobre indicar el costo antes de la primera ejecución de pago.
Para ejemplos ya conectados al esquema de entrada de este Actor, consulta la sección API a continuación.
Cada biblioteca de cliente tiene documentación de referencia que el inicio rápido no repite: JavaScript/TypeScript (npm install apify-client) y Python (pip install apify-client).
README
Comprobador, Validador y Extractor de URLs de Sitemaps XML
Comprueba un sitemap XML público y extrae todas sus URLs en una sola ejecución. Funciona como rastreador y extractor de sitemaps: introduce un dominio o una URL de sitemap, y el Actor encuentra archivos de sitemap mediante robots.txt, sigue índices de sitemaps y archivos gzip, informa errores de validación y devuelve las URLs del sitemap como un registro por URL con sus metadatos de sitemap. Las comprobaciones opcionales de estado HTTP marcan las URLs que no se resuelven, y un modo de comparación contrasta una ejecución con una anterior. Los errores de análisis y HTTP permanecen visibles en el registro SUMMARY en lugar de que un sitemap se descarte silenciosamente.
Creado por lintlab: herramientas de datos pequeñas y fiables. Probadas antes de su lanzamiento.
Prueba un ejemplo listo para usar: Extraer URLs de un sitemap. Ábrelo, haz clic en Iniciar, luego cópialo y cambia tu propio dominio.
Salida real de una ejecución en sitemaps.org (2026-10-01): 8 de los 84 registros de URL, con lastmod, validez de fecha, estado HTTP y problemas.
Qué hace
- Acepta raíces de sitios, URLs de sitemap
.xmly URLs de sitemap.xml.gz. - Para una raíz de sitio, lee las líneas
Sitemap:de/robots.txt; si no existen, intenta/sitemap.xmly/sitemap_index.xml. - Sigue recursivamente índices de sitemaps y maneja archivos gzip y XML con prefijos de espacio de nombres.
- Conserva
lastmod,changefreqypriority, incluidos valores no válidos para diagnóstico. - Informa XML malformado, respuestas de sitemap no 2xx, entradas hijas no válidas y límites del protocolo de sitemaps en
SUMMARY. - Emite ocurrencias duplicadas con
duplicateOfestablecido en el primer sitemap donde apareció la URL. Las ocurrencias duplicadas no se cobran como URLs extraídas. - Puede verificar el estado de las URLs con HEAD y un respaldo GET para 405/501. Las comprobaciones respetan robots.txt y se ejecutan con un máximo de cinco solicitudes concurrentes por host.
- Puede marcar URLs como
added,unchangedoremoveden relación con un conjunto de datos anterior del Actor. Los registros eliminados no se cobran. - Rechaza rangos IP privados, de bucle local, link-local y otros rangos no públicos antes de cada solicitud y salto de redirección.
Entrada
Solo se leen archivos públicos de sitemap y robots.txt. Las comprobaciones de estado respetan robots.txt, y las direcciones de red privadas o internas siempre se rechazan.
{
"startUrls": [
{ "url": "https://www.sitemaps.org/sitemap.xml" }
],
"maxUrls": 10000,
"maxSitemapFiles": 200,
"checkStatus": false,
"statusSampleSize": 0,
"sameHostOnly": true
}
statusSampleSize: 0 significa todas las URLs únicas cuando checkStatus está habilitado. Con sameHostOnly: true, los archivos de sitemap entre hosts referenciados por un índice no se siguen. Las URLs de páginas entre hosts aún se emiten y se marcan para que puedan corregirse.
previousDatasetId es opcional. En la plataforma Apify se abre desde el almacenamiento en la nube. Sus valores url no eliminados forman la línea base de comparación.
Salida del conjunto de datos
Cada ocurrencia de sitemap produce un registro. Este es un elemento real de la ejecución local de extremo a extremo contra https://www.sitemaps.org/sitemap.xml el 2026-09-25:
{
"url": "https://www.sitemaps.org/",
"sitemap": "https://www.sitemaps.org/sitemap.xml",
"lastmod": "2016-11-21",
"changefreq": null,
"priority": null,
"lastmodValid": true,
"hostMatches": true,
"duplicateOf": null,
"status": null,
"finalUrl": null,
"redirects": null,
"skippedByRobots": false,
"diff": null,
"issues": []
}
Los IDs de problemas estables son:
DUPLICATE_URL, MULTIPLE_LOC, INVALID_LASTMOD, FUTURE_LASTMOD, CROSS_HOST, NON_200, REDIRECTED, ROBOTS_DISALLOWED, INVALID_PRIORITY, INVALID_CHANGEFREQ y URL_TOO_LONG. MULTIPLE_LOC usa la primera ubicación y se cuenta bajo structuralIssues en la entrada SUMMARY de un sitemap de índice.
El registro SUMMARY del almacén de clave-valor contiene cada archivo de sitemap intentado con método de descubrimiento, tipo, indicador gzip, recuento de bytes sin comprimir, recuento de URLs, estado HTTP, error de análisis y violaciones de límites del protocolo. También incluye recuentos agregados, recuentos de facturación, estado de truncamiento y los problemas más frecuentes.
La misma ejecución de extremo a extremo analizó un archivo de sitemap y emitió 84 registros de URL únicos en 1.81 segundos:
{
"totals": {
"sitemapFilesAttempted": 1,
"sitemapFilesParsed": 1,
"urlRecords": 84,
"uniqueUrls": 84,
"removedUrls": 0,
"duplicates": 0,
"invalidLastmod": 0,
"non200": 0,
"crossHost": 0,
"statusChecksRequested": 0,
"statusResponses": 0
},
"topIssues": [],
"truncated": false,
"eventChargeLimitReached": false,
"billing": {
"sitemapFileParsed": 1,
"urlExtracted": 84,
"urlStatusChecked": 0
}
}
Precios
Precio por evento (solo pagas por el trabajo que tuvo éxito):
$0.001 per sitemap fileporsitemap-file-parsed, cobrado una vez después de que un archivo se obtenga y analice correctamente.$0.0003 per URLporurl-extracted, cobrado después de que el primer registro actual para una URL única se envíe. Las ocurrencias duplicadas y los registros de comparación eliminados no se cobran.$0.0005 per status checkporurl-status-checked, cobrado después de que el registro de URL se envíe solo cuando la comprobación se completó con una respuesta HTTP. Los fallos de red y las omisiones por robots no se cobran.
El Actor deja de agregar trabajo cuando se informa un límite de cargo de evento de Apify.
Límites y comportamiento
maxUrls: predeterminado 10,000; máximo 200,000 registros totales del conjunto de datos, incluidos los registros de comparación eliminados.maxSitemapFiles: predeterminado 200.- Las violaciones del protocolo de sitemaps se informan por encima de 50,000 entradas o 50 MB sin comprimir.
- Un límite estricto de 55 MB de respuesta/descompresión, tiempo de espera de solicitud de 20 segundos, límite de 10 redirecciones y comprobaciones SSRF acotan el trabajo de red.
- Las comprobaciones de estado se limitan a cinco solicitudes simultáneas por origen.
- No se usan proxies, autenticación, flujos de inicio de sesión ni manejo de CAPTCHA.
Desarrollo local
Requiere Node.js 20 o más reciente.
npm install
npm test
npm start
Para una ejecución local del Actor, coloca INPUT.json en el almacén de clave-valor local predeterminado y establece APIFY_LOCAL_STORAGE_DIR. Las versiones más recientes de Crawlee también reconocen CRAWLEE_STORAGE_DIR para la misma ubicación.
Más herramientas de lintlab
- Comprobador de Enlaces Rotos y Auditoría Técnica SEO: hallazgos SEO a nivel de página y enlaces internos rotos
- Captura de Pantalla de Sitio Web y Comparación de Regresión Visual: capturas de pantalla de página completa con diferencias de píxeles
- PDF a Markdown y Extractor de Texto: Markdown consciente de páginas para RAG y agentes de IA
Soporte: abre un problema en la pestaña Issues de este Actor aquí en Apify.
Esquema de entrada del Actor
startUrls (tipo: array):
Lista obligatoria de raíces de sitios HTTP(S) o URLs de sitemap. Las raíces de sitios se inspeccionan, luego se usan las directivas Sitemap de robots.txt; /sitemap.xml y /sitemap_index.xml son respaldos. Cada archivo de sitemap analizado correctamente incurre en el precio de evento de archivo de sitemap.
maxUrls (tipo: integer):
Número máximo de registros de URL del conjunto de datos para toda la ejecución, incluidas ocurrencias duplicadas y registros de comparación eliminados. Predeterminado 10000; rango 1–200000. Las URLs actuales únicas incurren en el precio de evento de extracción de URLs después de enviarse.
maxSitemapFiles (tipo: integer):
Número máximo de archivos de sitemap obtenidos en toda la ejecución. Predeterminado 200; cada archivo que se obtiene y analiza correctamente incurre en un cargo de evento de archivo de sitemap.
checkStatus (tipo: boolean):
Cuando es verdadero, envía solicitudes HEAD (respaldo GET para HTTP 405/501), como máximo 5 concurrentes por host, respetando robots.txt. Cada comprobación de URL completada con una respuesta HTTP incurre en un cargo de evento de comprobación de estado. Predeterminado falso.
statusSampleSize (tipo: integer):
Número de URLs únicas extraídas para comprobar el estado. Usa 0 para comprobar todas cuando checkStatus es verdadero. Predeterminado 0; la unidad es URLs.
previousDatasetId (tipo: string):
ID opcional de conjunto de datos de Apify de una ejecución anterior de Sitemap Doctor. Las URLs actuales se marcan como agregadas o sin cambios, y las URLs que faltan ahora se emiten como registros eliminados. Los registros eliminados no se cobran.
sameHostOnly (tipo: boolean):
Cuando es verdadero (predeterminado), los índices de sitemaps no conducen a archivos de sitemap en otro nombre de host. Las URLs de páginas entre hosts aún se emiten y se marcan para que un agente pueda diagnosticarlas.
Ejemplo de objeto de entrada del Actor
{
"startUrls": [
{
"url": "https://www.sitemaps.org/"
}
],
"maxUrls": 10000,
"maxSitemapFiles": 200,
"checkStatus": false,
"statusSampleSize": 0,
"sameHostOnly": true
}
Esquema de salida del Actor
items (tipo: string):
Sin descripción
summary (tipo: string):
Sin descripción
API
Puedes ejecutar este Actor programáticamente usando nuestra API. A continuación hay ejemplos de código en JavaScript, Python y CLI, así como la especificación OpenAPI y la configuración del servidor MCP.
Ejemplo en JavaScript
import { ApifyClient } from 'apify-client';
// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
token: '<YOUR_API_TOKEN>',
});
// Prepare Actor input
const input = {
"startUrls": [
{
"url": "https://www.sitemaps.org/"
}
]
};
// Run the Actor and wait for it to finish
const run = await client.actor("lintlab/sitemap-doctor").call(input);
// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
console.dir(item);
});
// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs
Ejemplo en Python
from apify_client import ApifyClient
# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")
# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://www.sitemaps.org/" }] }
# Run the Actor and wait for it to finish
run = client.actor("lintlab/sitemap-doctor").call(run_input=run_input)
# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)
# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start
Ejemplo en CLI
echo '{
"startUrls": [
{
"url": "https://www.sitemaps.org/"
}
]
}' |
apify call lintlab/sitemap-doctor --silent --output-dataset
Configuración del servidor MCP
{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com/?tools=fetch-actor-details,lintlab/sitemap-doctor"
}
}
}
El servidor alojado te inicia sesión con OAuth en la primera conexión, por lo que no se necesita ningún token de API en esta configuración. Los clientes sin soporte de OAuth pueden enviar un encabezado Authorization: Bearer <APIFY_API_TOKEN> en su lugar, usando un token de API e Integraciones en Apify Console (https://console.apify.com/settings/integrations).
Especificación OpenAPI
Descarga la definición de OpenAPI: https://api.apify.com/v2/actors/not7lGNg3TYpOYv0g/builds/qqZxbExqy6lzyFDw2/openapi.json