Certificado AgentReady.md verificado
Emitido el sig: 05127d6423e28e58 Verificar →

URL analizada

https://carrero.es

Analizar otra URL

Puntuación AI-Ready

69 / C

Aceptable

de 100

Ahorro de tokens

Tokens HTML 35.005
Tokens Markdown 149
Ahorro 100%

Desglose de la puntuación

HTML semántico 72/100
Eficiencia del contenido 63/100
Visibilidad para IA 55/100
Datos estructurados 92/100
Accesibilidad 78/100

Protocolos emergentes

0 de 3 detectados

Endpoints well-known que los AI agents buscan. Detectados significa que un agente puede descubrir y conectar con tu servicio automáticamente.

  • OAuth Discovery RFC 8414
    /.well-known/oauth-authorization-server
  • MCP Server Card Anthropic
    /.well-known/mcp.json
  • A2A Agent Card Google
    /.well-known/agent.json

Tu página tiene un bajo ratio de contenido real respecto al HTML total. Gran parte del peso de la página es marcado, scripts o estilos en lugar de contenido.

Cómo implementarlo

Mueve el CSS a hojas de estilo externas, elimina los estilos en línea, minimiza el JavaScript y asegúrate de que el HTML se centre en la estructura del contenido.

Tu sitio no soporta Markdown for Agents. Este estándar de Cloudflare permite a los agentes IA solicitar contenido en formato markdown, reduciendo el uso de tokens en ~80%.

Cómo implementarlo

Implementa uno o más: (1) Responder a Accept: text/markdown con contenido markdown. (2) Servir URLs .md (ej: /pagina.md). (3) Añadir etiquetas <link rel="alternate" type="text/markdown">. (4) Añadir cabeceras HTTP Link para descubrimiento markdown.

{\n res.setHeader('Vary', 'Accept');\n res.setHeader('Link', '; rel=\"alternate\"; type=\"text/markdown\"');\n if ((req.headers.accept || '').includes('text/markdown')) {\n res.type('text/markdown; charset=utf-8');\n return res.send(renderMarkdown('page'));\n }\n res.render('page');\n});"},{"id":"fastify","label":"Fastify","language":"javascript","filename":"server.js","code":"// Mechanisms 1 + 4: content negotiation + Link header\nfastify.get('/page', async (req, reply) => {\n reply.header('Vary', 'Accept');\n reply.header('Link', '; rel=\"alternate\"; type=\"text/markdown\"');\n if ((req.headers.accept || '').includes('text/markdown')) {\n return reply.type('text/markdown; charset=utf-8').send(renderMarkdown('page'));\n }\n return reply.view('/page.ejs');\n});"},{"id":"nextjs","label":"Next.js","language":"typescript","filename":"app/page/route.ts","code":"// Next.js App Router — Route Handler returning Markdown\nimport { NextRequest } from 'next/server';\nimport { renderMarkdown } from '@/lib/md';\nexport async function GET(req: NextRequest) {\n const accept = req.headers.get('accept') || '';\n if (accept.includes('text/markdown')) {\n return new Response(await renderMarkdown('page'), {\n headers: {\n 'Content-Type': 'text/markdown; charset=utf-8',\n 'Vary': 'Accept',\n },\n });\n }\n // Fall through to the page component\n return new Response(null, { status: 404 });\n}"},{"id":"wordpress","label":"WordPress","language":"php","filename":"functions.php","code":"post_content));\n exit;\n});"},{"id":"static","label":"Hugo / Jekyll / Astro","language":"txt","filename":"static/page.md","code":"# Mechanism 2: serve .md alongside .html\n# Hugo: place page.md in /static/ — built unchanged\n# Jekyll: drop page.md in /assets/ — copied as-is\n# Astro: src/pages/page.md.ts that exports a GET returning markdown\n\n# Then advertise with mechanism 3 in :\n# "}] }'>

No se encontraron directivas Content-Signal. Estas indican a los agentes IA cómo pueden usar tu contenido (indexación, entrada IA, datos de entrenamiento). La ubicación recomendada es robots.txt.

Cómo implementarlo

Añade Content-Signal a tu robots.txt: User-agent: *\nContent-Signal: search=yes, ai-input=yes, ai-train=no. También puedes añadirlo como cabecera HTTP en respuestas markdown.

{\n res.setHeader('Content-Signal', 'search=yes, ai-input=yes, ai-train=no');\n next();\n});\n\n// Fastify\nfastify.addHook('onSend', (request, reply, payload, done) => {\n reply.header('Content-Signal', 'search=yes, ai-input=yes, ai-train=no');\n done();\n});"}] }'>

Tu página depende en gran medida de elementos <div>. Los elementos semánticos como <section>, <nav>, <header>, <footer> y <aside> proporcionan una estructura significativa para los AI agents.

Cómo implementarlo

Reemplaza los contenedores <div> genéricos con los elementos semánticos apropiados. Usa <section> para grupos temáticos, <nav> para navegación, <header>/<footer> para cabeceras y pies de página o sección.

El contenido principal aparece tarde en el documento HTML. Los AI agents pueden dar más peso al contenido que aparece antes.

Cómo implementarlo

Reestructura tu HTML para que el contenido <main> o <article> aparezca antes que las barras laterales y el contenido suplementario.

La estructura de encabezados tiene problemas (niveles saltados o múltiples etiquetas h1). Una jerarquía limpia ayuda a los AI agents a comprender la organización del contenido.

Cómo implementarlo

Asegúrate de tener exactamente un <h1> por página y que los encabezados sigan un orden secuencial: h1 > h2 > h3. No saltes niveles (por ejemplo, de h1 directamente a h3).

Faltan etiquetas Open Graph o están incompletas. Las etiquetas OG ayudan a los AI agents (y plataformas sociales) a comprender el título, la descripción y la imagen de tu página.

Cómo implementarlo

Añade las meta etiquetas og:title, og:description y og:image en el <head> de tu página.

post_content), 30);\n $image = get_the_post_thumbnail_url($post, 'large') ?: 'https://yoursite.com/og-image.jpg';\n $url = get_permalink($post);\n printf('' . \"\\n\", esc_attr($title));\n printf('' . \"\\n\", esc_attr($desc));\n printf('' . \"\\n\", esc_url($image));\n printf('' . \"\\n\", esc_url($url));\n echo '' . \"\\n\";\n}, 5);"},{"id":"nextjs","label":"Next.js","language":"typescript","filename":"app/page.tsx","code":"// Next.js App Router — Metadata API\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n title: \"Carrero.es es el sitio personal de David Carrero Fernández-Baillo\",\n description: \"Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.\",\n openGraph: {\n title: \"Carrero.es es el sitio personal de David Carrero Fernández-Baillo\",\n description: \"Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.\",\n url: \"https://carrero.es\",\n images: [\"https://yoursite.com/og-image.jpg\"],\n type: 'website',\n },\n};"}] }'>

Muchos elementos tienen atributos de estilo en línea. Estos añaden ruido para los AI agents al extraer contenido.

Cómo implementarlo

Mueve todos los estilos en línea a clases CSS en tu hoja de estilos. Usa frameworks de CSS utilitario como Tailwind si necesitas muchos estilos únicos.

Tokens Markdown: 149
Último Artículo

## [La soberanía digital europea es un espejismo mientras sigamos fragmentados](https://carrero.es/soberania-digital-europea-espejismo-mientras-sigamos-fragmentados/)

14 de abril de 2026

Hace más de un año, Benjamin Hermann, CEO de Zoi, publicó un artículo demoledor en LinkedIN titulado «Leave the Room». En él, sostenía que cualquiera que afirme tener una alternativa …

[Leer más](https://carrero.es/soberania-digital-europea-espejismo-mientras-sigamos-fragmentados/)
Carrero.es es el sitio personal de David Carrero Fernández-Baillo                                               [Saltar al contenido](https://carrero.es/#content "Saltar al contenido")

Último Artículo

## [La soberanía digital europea es un espejismo mientras sigamos fragmentados](https://carrero.es/soberania-digital-europea-espejismo-mientras-sigamos-fragmentados/)

14 de abril de 2026

Hace más de un año, Benjamin Hermann, CEO de Zoi, publicó un artículo demoledor en LinkedIN titulado «Leave the Room». En él, sostenía que cualquiera que afirme tener una alternativa …

[Leer más](https://carrero.es/soberania-digital-europea-espejismo-mientras-sigamos-fragmentados/)

### [¿Hay que rediseñar las CLI para agentes de IA? Una reflexión a partir de Justin Poehnelt](https://carrero.es/redisenar-cli-para-agentes-ia/)

18 de abril de 2026

[Ver artículo](https://carrero.es/redisenar-cli-para-agentes-ia/)

### [Ha llegado la hora de pensar a lo grande con la Inteligencia Artificial](https://carrero.es/ha-llegado-la-hora-de-pensar-a-lo-grande-con-la-inteligencia-artificial/)

18 de abril de 2026

[Ver artículo](https://carrero.es/ha-llegado-la-hora-de-pensar-a-lo-grande-con-la-inteligencia-artificial/)

### [Volver a programar después de décadas: cómo Claude Code y la Inteligencia Artificial han cambiado mi forma de construir](https://carrero.es/volver-a-programar-despues-decadas-claude-code/)

18 de abril de 2026

[Ver artículo](https://carrero.es/volver-a-programar-despues-decadas-claude-code/)

### [Cómo modernicé Bitadir.com: de PHP 4/5 a PHP 8.4 sin reescribirlo desde cero (y por qué merecía la pena)](https://carrero.es/como-modernice-bitadir-com-php-4-a-php-8-sin-reescribirlo-desde-cero/)

18 de abril de 2026

[Ver artículo](https://carrero.es/como-modernice-bitadir-com-php-4-a-php-8-sin-reescribirlo-desde-cero/)

### [Cuando la bandeja de entrada reescribe tu email: la Inteligencia Artificial y la nueva era de la “entregabilidad editorial”](https://carrero.es/cuando-bandeja-entrada-reescribe-tu-email/)

18 de abril de 2026

[Ver artículo](https://carrero.es/cuando-bandeja-entrada-reescribe-tu-email/)

### [Tim Cook y las últimas lecciones de Steve Jobs: foco, equipos pequeños y el arte de cambiar a tiempo](https://carrero.es/tim-cook-y-ultimas-lecciones-steve-jobs/)

18 de abril de 2026

[Ver artículo](https://carrero.es/tim-cook-y-ultimas-lecciones-steve-jobs/)

1[2](https://carrero.es/?query-22506824-page=2)[3](https://carrero.es/?query-22506824-page=3)…[519](https://carrero.es/?query-22506824-page=519) [Siguente](https://carrero.es/?query-22506824-page=2)

Buscar:

Sube este archivo como /index.md en tu servidor para que los AI agents puedan acceder a una versión limpia de tu página. También puedes configurar la negociación de contenido Accept: text/markdown para servirlo automáticamente.

Nuestra recomendación

Descargar llms.txt
# Carrero.es

> Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.

## Main
- [Carrero.es es el sitio personal de David Carrero Fernández-Baillo](https://carrero.es): Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emp…
- [Carrero](https://carrero.es/)
- [Mis inversiones BA](https://carrero.es/inversiones/)
- [Newsletter](https://carrero.es/boletin/)
- [Suscribete al RSS](https://carrero.es/feed)
- [Contacto](https://carrero.es/contactar/)

El llms.txt completo requiere un análisis de todo el dominio (próximamente)

Sube este archivo a https://carrero.es/llms.txt en la raíz de tu dominio. Los AI agents como ChatGPT, Claude y Perplexity consultan este archivo para comprender la estructura de tu sitio.

Este sitio ya tiene un archivo llms.txt.

Formato válido
# Carrero.es

> Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.

## Main
- [Carrero.es es el sitio personal de David Carrero Fernández-Baillo](https://carrero.es/): Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emp…
- [Mis inversiones BA](https://carrero.es/inversiones/)
- [Newsletter](https://carrero.es/boletin/)
- [Suscribete al RSS](https://carrero.es/feed)
- [Contacto](https://carrero.es/contactar/)

HTML semántico

Usa elementos article o main (100/100)

Has both <article> and <main>

Jerarquía de encabezados correcta (70/100)

no <h1>

Usa elementos HTML semánticos (40/100)

11 semantic elements, 81 divs (ratio: 12%)

Textos alternativos descriptivos en imágenes (100/100)

No images found

Poca profundidad de anidamiento de divs (59/100)

Avg div depth: 9.1, max: 14

Eficiencia del contenido

Buen ratio de reducción de tokens (100/100)

100% token reduction (HTML→Markdown)

Buen ratio de contenido frente a ruido (0/100)

Content ratio: 0.3% (323 content chars / 93049 HTML bytes)

Estilos en línea mínimos (50/100)

7/278 elements with inline styles (2.5%)

Peso de página razonable (100/100)

HTML size: 91KB

Visibilidad para IA

Tiene archivo llms.txt (100/100)

llms.txt exists and is valid

Tiene archivo robots.txt (100/100)

robots.txt exists

robots.txt permite bots de IA (100/100)

All major AI bots allowed

Tiene sitemap.xml (100/100)

Sitemap found

Soporte de Markdown for Agents (0/100)
&#10007; Accept: text/markdown &#10007; .md URL &#10007; <link> tag &#10007; Link header
Tiene Content-Signal (robots.txt o cabeceras HTTP) (0/100)
&#10003; robots.txt &#10003; HTTP header &#10007; Policy

Datos estructurados

Tiene Schema.org / JSON-LD (100/100)

JSON-LD found: Person,Organization, WebSite, WebPage, Person, Article

Tiene etiquetas Open Graph (67/100)

2/3 OG tags present

Tiene meta description (100/100)

Meta description: 155 chars

Tiene URL canónica (100/100)

Canonical URL present

Tiene atributo lang (100/100)

lang="es"

Accesibilidad

Contenido disponible sin JavaScript (100/100)

Content available without JavaScript

Tamaño de página razonable (100/100)

Page size: 91KB

El contenido aparece temprano en el HTML (25/100)

Main content starts at 76% of HTML

{
  "url": "https://carrero.es",
  "timestamp": 1776939227033,
  "fetch": {
    "mode": "simple",
    "timeMs": 141,
    "htmlSizeBytes": 93049,
    "supportsMarkdown": false,
    "markdownAgents": {
      "contentNegotiation": false,
      "mdUrl": {
        "found": false,
        "url": null
      },
      "linkTag": {
        "found": false,
        "url": null
      },
      "linkHeader": {
        "found": false,
        "url": null
      },
      "responseHeaders": {
        "contentSignal": null,
        "xMarkdownTokens": null,
        "vary": null
      },
      "frontmatter": {
        "present": false,
        "fields": [],
        "level": "none"
      },
      "level": "none"
    },
    "statusCode": 200
  },
  "extraction": {
    "title": "Carrero.es es el sitio personal de David Carrero Fernández-Baillo",
    "excerpt": "Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.",
    "byline": null,
    "siteName": "Carrero.es",
    "lang": "es",
    "contentLength": 323,
    "metadata": {
      "description": "Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.",
      "ogTitle": "Carrero.es es el sitio personal de David Carrero Fernández-Baillo",
      "ogDescription": "Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.",
      "ogImage": null,
      "ogType": "website",
      "canonical": "https://carrero.es/",
      "lang": "es",
      "schemas": [
        {
          "@type": [
            "Person",
            "Organization"
          ],
          "@id": "https://carrero.es/#person",
          "name": "David Carrero Fdez-Baillo",
          "sameAs": [
            "https://www.facebook.com/davidcarrero",
            "https://twitter.com/carrero"
          ]
        },
        {
          "@type": "WebSite",
          "@id": "https://carrero.es/#website",
          "url": "https://carrero.es",
          "name": "Carrero.es",
          "alternateName": "David Carrero",
          "publisher": {
            "@id": "https://carrero.es/#person"
          },
          "inLanguage": "es",
          "potentialAction": {
            "@type": "SearchAction",
            "target": "https://carrero.es/?s={search_term_string}",
            "query-input": "required name=search_term_string"
          }
        },
        {
          "@type": "WebPage",
          "@id": "https://carrero.es/#webpage",
          "url": "https://carrero.es/",
          "name": "Carrero.es es el sitio personal de David Carrero Fernández-Baillo",
          "datePublished": "2019-11-18T11:53:13+01:00",
          "dateModified": "2024-01-25T22:37:40+01:00",
          "about": {
            "@id": "https://carrero.es/#person"
          },
          "isPartOf": {
            "@id": "https://carrero.es/#website"
          },
          "inLanguage": "es"
        },
        {
          "@type": "Person",
          "@id": "https://carrero.es/author/admin/",
          "name": "David Carrero Fdez-Baillo",
          "url": "https://carrero.es/author/admin/",
          "image": {
            "@type": "ImageObject",
            "@id": "https://secure.gravatar.com/avatar/bfdfaf65290a2ec03899e508f3d59765f61efaa84e7b7a4b3c06aaaa06aa0582?s=96&amp;d=mm&amp;r=g",
            "url": "https://secure.gravatar.com/avatar/bfdfaf65290a2ec03899e508f3d59765f61efaa84e7b7a4b3c06aaaa06aa0582?s=96&amp;d=mm&amp;r=g",
            "caption": "David Carrero Fdez-Baillo",
            "inLanguage": "es"
          },
          "sameAs": [
            "http://davidcarrero.com",
            "http://www.facebook.com/davidcarrero",
            "https://twitter.com/carrero"
          ]
        },
        {
          "@type": "Article",
          "headline": "Carrero.es es el sitio personal de David Carrero Fernández-Baillo",
          "keywords": "Carrero",
          "datePublished": "2019-11-18T11:53:13+01:00",
          "dateModified": "2024-01-25T22:37:40+01:00",
          "author": {
            "@id": "https://carrero.es/author/admin/",
            "name": "David Carrero Fdez-Baillo"
          },
          "publisher": {
            "@id": "https://carrero.es/#person"
          },
          "description": "Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.",
          "name": "Carrero.es es el sitio personal de David Carrero Fernández-Baillo",
          "@id": "https://carrero.es/#richSnippet",
          "isPartOf": {
            "@id": "https://carrero.es/#webpage"
          },
          "inLanguage": "es",
          "mainEntityOfPage": {
            "@id": "https://carrero.es/#webpage"
          }
        }
      ],
      "robotsMeta": "follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large",
      "author": null,
      "generator": null,
      "markdownAlternateHref": null
    }
  },
  "markdown": "Último Artículo\n\n## [La soberanía digital europea es un espejismo mientras sigamos fragmentados](https://carrero.es/soberania-digital-europea-espejismo-mientras-sigamos-fragmentados/)\n\n14 de abril de 2026\n\nHace más de un año, Benjamin Hermann, CEO de Zoi, publicó un artículo demoledor en LinkedIN titulado «Leave the Room». En él, sostenía que cualquiera que afirme tener una alternativa …\n\n[Leer más](https://carrero.es/soberania-digital-europea-espejismo-mientras-sigamos-fragmentados/)\n",
  "fullPageMarkdown": "Carrero.es es el sitio personal de David Carrero Fernández-Baillo                                               [Saltar al contenido](https://carrero.es/#content \"Saltar al contenido\")\n\nÚltimo Artículo\n\n## [La soberanía digital europea es un espejismo mientras sigamos fragmentados](https://carrero.es/soberania-digital-europea-espejismo-mientras-sigamos-fragmentados/)\n\n14 de abril de 2026\n\nHace más de un año, Benjamin Hermann, CEO de Zoi, publicó un artículo demoledor en LinkedIN titulado «Leave the Room». En él, sostenía que cualquiera que afirme tener una alternativa …\n\n[Leer más](https://carrero.es/soberania-digital-europea-espejismo-mientras-sigamos-fragmentados/)\n\n### [¿Hay que rediseñar las CLI para agentes de IA? Una reflexión a partir de Justin Poehnelt](https://carrero.es/redisenar-cli-para-agentes-ia/)\n\n18 de abril de 2026\n\n[Ver artículo](https://carrero.es/redisenar-cli-para-agentes-ia/)\n\n### [Ha llegado la hora de pensar a lo grande con la Inteligencia Artificial](https://carrero.es/ha-llegado-la-hora-de-pensar-a-lo-grande-con-la-inteligencia-artificial/)\n\n18 de abril de 2026\n\n[Ver artículo](https://carrero.es/ha-llegado-la-hora-de-pensar-a-lo-grande-con-la-inteligencia-artificial/)\n\n### [Volver a programar después de décadas: cómo Claude Code y la Inteligencia Artificial han cambiado mi forma de construir](https://carrero.es/volver-a-programar-despues-decadas-claude-code/)\n\n18 de abril de 2026\n\n[Ver artículo](https://carrero.es/volver-a-programar-despues-decadas-claude-code/)\n\n### [Cómo modernicé Bitadir.com: de PHP 4/5 a PHP 8.4 sin reescribirlo desde cero (y por qué merecía la pena)](https://carrero.es/como-modernice-bitadir-com-php-4-a-php-8-sin-reescribirlo-desde-cero/)\n\n18 de abril de 2026\n\n[Ver artículo](https://carrero.es/como-modernice-bitadir-com-php-4-a-php-8-sin-reescribirlo-desde-cero/)\n\n### [Cuando la bandeja de entrada reescribe tu email: la Inteligencia Artificial y la nueva era de la “entregabilidad editorial”](https://carrero.es/cuando-bandeja-entrada-reescribe-tu-email/)\n\n18 de abril de 2026\n\n[Ver artículo](https://carrero.es/cuando-bandeja-entrada-reescribe-tu-email/)\n\n### [Tim Cook y las últimas lecciones de Steve Jobs: foco, equipos pequeños y el arte de cambiar a tiempo](https://carrero.es/tim-cook-y-ultimas-lecciones-steve-jobs/)\n\n18 de abril de 2026\n\n[Ver artículo](https://carrero.es/tim-cook-y-ultimas-lecciones-steve-jobs/)\n\n1[2](https://carrero.es/?query-22506824-page=2)[3](https://carrero.es/?query-22506824-page=3)…[519](https://carrero.es/?query-22506824-page=519) [Siguente](https://carrero.es/?query-22506824-page=2)\n\nBuscar:\n",
  "markdownStats": {
    "images": 0,
    "links": 2,
    "tables": 0,
    "codeBlocks": 0,
    "headings": 1
  },
  "tokens": {
    "htmlTokens": 35005,
    "markdownTokens": 149,
    "reduction": 34856,
    "reductionPercent": 100
  },
  "score": {
    "score": 69,
    "grade": "C",
    "dimensions": {
      "semanticHtml": {
        "score": 72,
        "weight": 20,
        "grade": "C",
        "checks": {
          "uses_article_or_main": {
            "score": 100,
            "weight": 20,
            "details": "Has both <article> and <main>"
          },
          "proper_heading_hierarchy": {
            "score": 70,
            "weight": 25,
            "details": "no <h1>"
          },
          "semantic_elements": {
            "score": 40,
            "weight": 20,
            "details": "11 semantic elements, 81 divs (ratio: 12%)"
          },
          "meaningful_alt_texts": {
            "score": 100,
            "weight": 15,
            "details": "No images found"
          },
          "low_div_nesting": {
            "score": 59,
            "weight": 20,
            "details": "Avg div depth: 9.1, max: 14"
          }
        }
      },
      "contentEfficiency": {
        "score": 63,
        "weight": 25,
        "grade": "C",
        "checks": {
          "token_reduction_ratio": {
            "score": 100,
            "weight": 40,
            "details": "100% token reduction (HTML→Markdown)"
          },
          "content_to_noise_ratio": {
            "score": 0,
            "weight": 30,
            "details": "Content ratio: 0.3% (323 content chars / 93049 HTML bytes)"
          },
          "minimal_inline_styles": {
            "score": 50,
            "weight": 15,
            "details": "7/278 elements with inline styles (2.5%)"
          },
          "reasonable_page_weight": {
            "score": 100,
            "weight": 15,
            "details": "HTML size: 91KB"
          }
        }
      },
      "aiDiscoverability": {
        "score": 55,
        "weight": 25,
        "grade": "D",
        "checks": {
          "has_llms_txt": {
            "score": 100,
            "weight": 20,
            "details": "llms.txt exists and is valid"
          },
          "has_robots_txt": {
            "score": 100,
            "weight": 10,
            "details": "robots.txt exists"
          },
          "robots_allows_ai_bots": {
            "score": 100,
            "weight": 15,
            "details": "All major AI bots allowed"
          },
          "has_sitemap": {
            "score": 100,
            "weight": 10,
            "details": "Sitemap found"
          },
          "supports_markdown_negotiation": {
            "score": 0,
            "weight": 25,
            "details": "No Markdown for Agents support detected"
          },
          "has_content_signals": {
            "score": 0,
            "weight": 20,
            "details": "No Content-Signal found (robots.txt or HTTP headers)"
          }
        }
      },
      "structuredData": {
        "score": 92,
        "weight": 15,
        "grade": "A",
        "checks": {
          "has_schema_org": {
            "score": 100,
            "weight": 30,
            "details": "JSON-LD found: Person,Organization, WebSite, WebPage, Person, Article"
          },
          "has_open_graph": {
            "score": 67,
            "weight": 25,
            "details": "2/3 OG tags present"
          },
          "has_meta_description": {
            "score": 100,
            "weight": 20,
            "details": "Meta description: 155 chars"
          },
          "has_canonical_url": {
            "score": 100,
            "weight": 15,
            "details": "Canonical URL present"
          },
          "has_lang_attribute": {
            "score": 100,
            "weight": 10,
            "details": "lang=\"es\""
          }
        }
      },
      "accessibility": {
        "score": 78,
        "weight": 15,
        "grade": "B",
        "checks": {
          "content_without_js": {
            "score": 100,
            "weight": 40,
            "details": "Content available without JavaScript"
          },
          "reasonable_page_size": {
            "score": 100,
            "weight": 30,
            "details": "Page size: 91KB"
          },
          "fast_content_position": {
            "score": 25,
            "weight": 30,
            "details": "Main content starts at 76% of HTML"
          }
        }
      }
    }
  },
  "recommendations": [
    {
      "id": "improve_content_ratio",
      "priority": "critical",
      "category": "contentEfficiency",
      "titleKey": "rec.improve_content_ratio.title",
      "descriptionKey": "rec.improve_content_ratio.description",
      "howToKey": "rec.improve_content_ratio.howto",
      "effort": "moderate",
      "estimatedImpact": 6,
      "checkScore": 0,
      "checkDetails": "Content ratio: 0.3% (323 content chars / 93049 HTML bytes)"
    },
    {
      "id": "add_markdown_negotiation",
      "priority": "critical",
      "category": "aiDiscoverability",
      "titleKey": "rec.add_markdown_negotiation.title",
      "descriptionKey": "rec.add_markdown_negotiation.description",
      "howToKey": "rec.add_markdown_negotiation.howto",
      "effort": "significant",
      "estimatedImpact": 6,
      "checkScore": 0,
      "checkDetails": "No Markdown for Agents support detected"
    },
    {
      "id": "add_content_signals",
      "priority": "critical",
      "category": "aiDiscoverability",
      "titleKey": "rec.add_content_signals.title",
      "descriptionKey": "rec.add_content_signals.description",
      "howToKey": "rec.add_content_signals.howto",
      "effort": "quick-win",
      "estimatedImpact": 5,
      "checkScore": 0,
      "checkDetails": "No Content-Signal found (robots.txt or HTTP headers)"
    },
    {
      "id": "add_semantic_elements",
      "priority": "high",
      "category": "semanticHtml",
      "titleKey": "rec.add_semantic_elements.title",
      "descriptionKey": "rec.add_semantic_elements.description",
      "howToKey": "rec.add_semantic_elements.howto",
      "effort": "moderate",
      "estimatedImpact": 5,
      "checkScore": 40,
      "checkDetails": "11 semantic elements, 81 divs (ratio: 12%)"
    },
    {
      "id": "move_content_earlier",
      "priority": "high",
      "category": "accessibility",
      "titleKey": "rec.move_content_earlier.title",
      "descriptionKey": "rec.move_content_earlier.description",
      "howToKey": "rec.move_content_earlier.howto",
      "effort": "moderate",
      "estimatedImpact": 4,
      "checkScore": 25,
      "checkDetails": "Main content starts at 76% of HTML"
    },
    {
      "id": "fix_heading_hierarchy",
      "priority": "medium",
      "category": "semanticHtml",
      "titleKey": "rec.fix_heading_hierarchy.title",
      "descriptionKey": "rec.fix_heading_hierarchy.description",
      "howToKey": "rec.fix_heading_hierarchy.howto",
      "effort": "quick-win",
      "estimatedImpact": 6,
      "checkScore": 70,
      "checkDetails": "no <h1>"
    },
    {
      "id": "add_open_graph",
      "priority": "medium",
      "category": "structuredData",
      "titleKey": "rec.add_open_graph.title",
      "descriptionKey": "rec.add_open_graph.description",
      "howToKey": "rec.add_open_graph.howto",
      "effort": "quick-win",
      "estimatedImpact": 4,
      "checkScore": 67,
      "checkDetails": "2/3 OG tags present"
    },
    {
      "id": "remove_inline_styles",
      "priority": "medium",
      "category": "contentEfficiency",
      "titleKey": "rec.remove_inline_styles.title",
      "descriptionKey": "rec.remove_inline_styles.description",
      "howToKey": "rec.remove_inline_styles.howto",
      "effort": "moderate",
      "estimatedImpact": 3,
      "checkScore": 50,
      "checkDetails": "7/278 elements with inline styles (2.5%)"
    }
  ],
  "llmsTxtPreview": "# Carrero.es\n\n> Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.\n\n## Main\n- [Carrero.es es el sitio personal de David Carrero Fernández-Baillo](https://carrero.es): Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emp…\n- [Carrero](https://carrero.es/)\n- [Mis inversiones BA](https://carrero.es/inversiones/)\n- [Newsletter](https://carrero.es/boletin/)\n- [Suscribete al RSS](https://carrero.es/feed)\n- [Contacto](https://carrero.es/contactar/)\n\n",
  "llmsTxtExisting": "# Carrero.es\n\n> Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.\n\n## Main\n- [Carrero.es es el sitio personal de David Carrero Fernández-Baillo](https://carrero.es/): Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emp…\n- [Mis inversiones BA](https://carrero.es/inversiones/)\n- [Newsletter](https://carrero.es/boletin/)\n- [Suscribete al RSS](https://carrero.es/feed)\n- [Contacto](https://carrero.es/contactar/)",
  "emergingProtocols": {
    "oauthDiscovery": {
      "exists": false,
      "url": "https://carrero.es/.well-known/oauth-authorization-server"
    },
    "mcpServerCard": {
      "exists": false,
      "url": "https://carrero.es/.well-known/mcp.json"
    },
    "a2aAgentCard": {
      "exists": false,
      "url": "https://carrero.es/.well-known/agent.json"
    },
    "count": 0
  },
  "snippets": [
    {
      "id": "fix_heading_hierarchy",
      "title": "Fix heading hierarchy",
      "description": "Your page has no <h1>. Every page needs exactly one <h1> as the main heading. Add it inside your <main> or <article>.",
      "language": "html",
      "code": "<h1>Carrero.es es el sitio personal de David Carrero Fernández-Baillo</h1>",
      "filename": "<main> or <article>"
    },
    {
      "id": "add_open_graph",
      "title": "Add missing Open Graph tags",
      "description": "Open Graph tags control how your page looks when shared on social media and how AI platforms preview your URL in answers.",
      "language": "html",
      "code": "<meta property=\"og:image\" content=\"https://yoursite.com/og-image.jpg\">\n<meta property=\"og:url\" content=\"https://carrero.es\">\n<meta property=\"og:type\" content=\"website\">",
      "filename": "<head>",
      "stacks": [
        {
          "id": "html",
          "label": "HTML <head>",
          "language": "html",
          "filename": "<head>",
          "code": "<meta property=\"og:image\" content=\"https://yoursite.com/og-image.jpg\">\n<meta property=\"og:url\" content=\"https://carrero.es\">\n<meta property=\"og:type\" content=\"website\">"
        },
        {
          "id": "wordpress",
          "label": "WordPress",
          "language": "php",
          "filename": "functions.php",
          "code": "<?php\n// Quick Open Graph tags without a plugin (skip if Yoast / Rank Math is active)\nadd_action('wp_head', function () {\n    if (!is_singular()) return;\n    $post = get_queried_object();\n    $title = get_the_title($post);\n    $desc  = get_the_excerpt($post) ?: wp_trim_words(strip_tags($post->post_content), 30);\n    $image = get_the_post_thumbnail_url($post, 'large') ?: 'https://yoursite.com/og-image.jpg';\n    $url   = get_permalink($post);\n    printf('<meta property=\"og:title\" content=\"%s\">' . \"\\n\", esc_attr($title));\n    printf('<meta property=\"og:description\" content=\"%s\">' . \"\\n\", esc_attr($desc));\n    printf('<meta property=\"og:image\" content=\"%s\">' . \"\\n\", esc_url($image));\n    printf('<meta property=\"og:url\" content=\"%s\">' . \"\\n\", esc_url($url));\n    echo '<meta property=\"og:type\" content=\"article\">' . \"\\n\";\n}, 5);"
        },
        {
          "id": "nextjs",
          "label": "Next.js",
          "language": "typescript",
          "filename": "app/page.tsx",
          "code": "// Next.js App Router — Metadata API\nimport type { Metadata } from 'next';\n\nexport const metadata: Metadata = {\n  title: \"Carrero.es es el sitio personal de David Carrero Fernández-Baillo\",\n  description: \"Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.\",\n  openGraph: {\n    title: \"Carrero.es es el sitio personal de David Carrero Fernández-Baillo\",\n    description: \"Carrero.es en un blog iniciado por David Carrero Fernández-Baillo. Todo sobre Internet, Tecnología y Negocios. BA y emprendediendo otra vez con Stackscale.\",\n    url: \"https://carrero.es\",\n    images: [\"https://yoursite.com/og-image.jpg\"],\n    type: 'website',\n  },\n};"
        }
      ]
    },
    {
      "id": "add_content_signals",
      "title": "Add Content-Signal directives",
      "description": "Content-Signal tells AI agents how they may use your content. The canonical location is robots.txt, but you can also expose it as an HTTP header from any stack.",
      "language": "txt",
      "code": "User-agent: *\nContent-Signal: search=yes, ai-input=yes, ai-train=no",
      "filename": "/robots.txt",
      "stacks": [
        {
          "id": "robots",
          "label": "robots.txt",
          "language": "txt",
          "filename": "/robots.txt",
          "code": "User-agent: *\nContent-Signal: search=yes, ai-input=yes, ai-train=no"
        },
        {
          "id": "nginx",
          "label": "Nginx",
          "language": "nginx",
          "filename": "server block",
          "code": "# Inside your server { } block:\nadd_header Content-Signal \"search=yes, ai-input=yes, ai-train=no\" always;"
        },
        {
          "id": "apache",
          "label": "Apache",
          "language": "apache",
          "filename": ".htaccess",
          "code": "# In .htaccess (or VirtualHost):\nHeader set Content-Signal \"search=yes, ai-input=yes, ai-train=no\""
        },
        {
          "id": "wordpress",
          "label": "WordPress",
          "language": "php",
          "filename": "functions.php",
          "code": "<?php\n// In your theme's functions.php or a small mu-plugin\nadd_action('send_headers', function () {\n    header('Content-Signal: search=yes, ai-input=yes, ai-train=no');\n});\n\n// Optional: also append the directive to the dynamic robots.txt\nadd_filter('robots_txt', function ($output) {\n    return $output . \"\\nContent-Signal: search=yes, ai-input=yes, ai-train=no\\n\";\n}, 10, 1);"
        },
        {
          "id": "nextjs",
          "label": "Next.js",
          "language": "typescript",
          "filename": "middleware.ts",
          "code": "// middleware.ts (Next.js 13+ App Router or Pages Router)\nimport { NextResponse } from 'next/server';\nexport function middleware() {\n  const res = NextResponse.next();\n  res.headers.set(\n    'Content-Signal',\n    'search=yes, ai-input=yes, ai-train=no'\n  );\n  return res;\n}\nexport const config = { matcher: '/:path*' };"
        },
        {
          "id": "cloudflare",
          "label": "Cloudflare Workers",
          "language": "javascript",
          "filename": "worker.js",
          "code": "// Cloudflare Worker that proxies your origin and adds the header\nexport default {\n  async fetch(request, env, ctx) {\n    const res = await fetch(request);\n    const newRes = new Response(res.body, res);\n    newRes.headers.set(\n      'Content-Signal',\n      'search=yes, ai-input=yes, ai-train=no'\n    );\n    return newRes;\n  },\n};"
        },
        {
          "id": "express",
          "label": "Express / Fastify",
          "language": "javascript",
          "filename": "server.js",
          "code": "// Express\napp.use((req, res, next) => {\n  res.setHeader('Content-Signal', 'search=yes, ai-input=yes, ai-train=no');\n  next();\n});\n\n// Fastify\nfastify.addHook('onSend', (request, reply, payload, done) => {\n  reply.header('Content-Signal', 'search=yes, ai-input=yes, ai-train=no');\n  done();\n});"
        }
      ]
    },
    {
      "id": "add_markdown_negotiation",
      "title": "Support Markdown for Agents",
      "description": "Let AI agents request a clean Markdown version of any page via content negotiation, .md alternate URLs, link tags or Link headers.",
      "language": "html",
      "code": "<!-- Mechanism 3: link tag advertising the .md alternate -->\n<link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">",
      "filename": "<head>",
      "stacks": [
        {
          "id": "html",
          "label": "HTML <head>",
          "language": "html",
          "filename": "<head>",
          "code": "<!-- Mechanism 3: link tag advertising the .md alternate -->\n<link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">"
        },
        {
          "id": "express",
          "label": "Express",
          "language": "javascript",
          "filename": "server.js",
          "code": "// Mechanisms 1 + 4: content negotiation + Link header\napp.get('/page', (req, res) => {\n  res.setHeader('Vary', 'Accept');\n  res.setHeader('Link', '</page.md>; rel=\"alternate\"; type=\"text/markdown\"');\n  if ((req.headers.accept || '').includes('text/markdown')) {\n    res.type('text/markdown; charset=utf-8');\n    return res.send(renderMarkdown('page'));\n  }\n  res.render('page');\n});"
        },
        {
          "id": "fastify",
          "label": "Fastify",
          "language": "javascript",
          "filename": "server.js",
          "code": "// Mechanisms 1 + 4: content negotiation + Link header\nfastify.get('/page', async (req, reply) => {\n  reply.header('Vary', 'Accept');\n  reply.header('Link', '</page.md>; rel=\"alternate\"; type=\"text/markdown\"');\n  if ((req.headers.accept || '').includes('text/markdown')) {\n    return reply.type('text/markdown; charset=utf-8').send(renderMarkdown('page'));\n  }\n  return reply.view('/page.ejs');\n});"
        },
        {
          "id": "nextjs",
          "label": "Next.js",
          "language": "typescript",
          "filename": "app/page/route.ts",
          "code": "// Next.js App Router — Route Handler returning Markdown\nimport { NextRequest } from 'next/server';\nimport { renderMarkdown } from '@/lib/md';\nexport async function GET(req: NextRequest) {\n  const accept = req.headers.get('accept') || '';\n  if (accept.includes('text/markdown')) {\n    return new Response(await renderMarkdown('page'), {\n      headers: {\n        'Content-Type': 'text/markdown; charset=utf-8',\n        'Vary': 'Accept',\n      },\n    });\n  }\n  // Fall through to the page component\n  return new Response(null, { status: 404 });\n}"
        },
        {
          "id": "wordpress",
          "label": "WordPress",
          "language": "php",
          "filename": "functions.php",
          "code": "<?php\n// Mechanism 1: respond to Accept: text/markdown on the same URL\nadd_action('template_redirect', function () {\n    if (!is_singular()) return;\n    $accept = $_SERVER['HTTP_ACCEPT'] ?? '';\n    if (strpos($accept, 'text/markdown') === false) return;\n    header('Content-Type: text/markdown; charset=utf-8');\n    header('Vary: Accept');\n    $post = get_queried_object();\n    echo \"# \" . get_the_title($post) . \"\\n\\n\";\n    echo wp_strip_all_tags(apply_filters('the_content', $post->post_content));\n    exit;\n});"
        },
        {
          "id": "static",
          "label": "Hugo / Jekyll / Astro",
          "language": "txt",
          "filename": "static/page.md",
          "code": "# Mechanism 2: serve .md alongside .html\n# Hugo: place page.md in /static/ — built unchanged\n# Jekyll: drop page.md in /assets/ — copied as-is\n# Astro: src/pages/page.md.ts that exports a GET returning markdown\n\n# Then advertise with mechanism 3 in <head>:\n#   <link rel=\"alternate\" type=\"text/markdown\" href=\"/page.md\">"
        }
      ]
    }
  ]
}

Usa nuestra API para obtener esto de forma programática (próximamente)

Este JSON es para uso interno — a diferencia del Markdown y llms.txt, no está pensado para subirse a tu web. Guárdalo como referencia para seguir la evolución de tu puntuación, compártelo con tu equipo de desarrollo o intégralo en tu pipeline CI/CD.

Comparte tus resultados

Twitter LinkedIn

Incrusta tu badge

Añade este badge a tu sitio. Se actualiza automáticamente cuando cambie tu puntuación.

AgentReady.md score for carrero.es
Script Recomendado
<script src="https://agentready.md/badge.js" data-id="38a7ff42-a572-40d9-b76c-18d183fd29f4" data-domain="carrero.es"></script>
Markdown
[![AgentReady.md score for carrero.es](https://agentready.md/badge/carrero.es.svg)](https://agentready.md/es/r/38a7ff42-a572-40d9-b76c-18d183fd29f4)

Próximamente: Análisis de dominio completo

Rastrea todo tu dominio, genera llms.txt y monitoriza tu puntuación de preparación para IA a lo largo del tiempo. Únete a la lista de espera para recibir notificaciones.

¡Estás en la lista! Te avisaremos cuando se lance.