Skip to main content
Glama
content-contracts-mcp-server

content-contracts-mcp-server

content-contracts-mcp-server

Build and test

MCP server que expone como tools la validación de los protocolos de "content contracts" — SEO.md, PRODUCTHUNT.md, LINKEDIN.md — para que cualquier agente pueda verificar contenido generado por IA contra reglas duras concretas, sin tener que clonar/mantener los linters de referencia él mismo.

Mismo patrón que el protocolo del que viene: un techo/piso duro verificable + prosa, nunca piso duro por presencia literal — evita el keyword stuffing sin sacrificar la posibilidad de verificar el contenido de forma automática. Ver el repo del protocolo para el razonamiento completo de cada regla.

Por qué existe

El protocolo (SEO.md/PRODUCTHUNT.md/LINKEDIN.md + los linters de referencia en Node) es open source y gratis — pero un equipo que genera contenido con IA a escala no quiere clonar 3 repos y mantener su propia copia del linter actualizada. Este server es esa capa: los mismos 4 tools de validación, disponibles por MCP para que cualquier agente (Claude, u otro cliente MCP) los llame directo, sin filesystem compartido — el config y el contenido viajan como parámetros del tool call, no como rutas de archivo.

Related MCP server: agentvet-mcp

Tools

Tool

Qué valida

lint_web_content

Páginas HTML contra un SEO.md (título/descripción, keywords, links, JSON-LD)

lint_producthunt_post

Tagline/descripción/galería contra un PRODUCTHUNT.md

lint_linkedin_content

Copy de feed y/o artículo de newsletter contra un LINKEDIN.md

export_json_ld

Genera el <script type="application/ld+json"> desde schema: — templating puro, sin LLM

Cada tool recibe config como el YAML de frontmatter tal cual (el bloque entre los --- de tu .md), y el contenido a validar como parámetros estructurados — no rutas de archivo, para que funcione igual de local que remoto.

Instalar y correr

npm install
npm run build
npm start          # corre por stdio

Probarlo

npm test           # build + smoke test real: levanta el server como
                    # subproceso, se conecta como cliente MCP de verdad,
                    # llama a los 4 tools con fixtures que sabemos que
                    # pasan/fallan — no son mocks del server.

Usarlo como MCP server

Configuración típica (claude_desktop_config.json o equivalente):

{
  "mcpServers": {
    "content-contracts": {
      "command": "node",
      "args": ["/ruta/a/content-contracts-mcp-server/dist/index.js"]
    }
  }
}

Relación con seo-md

Este repo porta la lógica de validación de seo-md (src/validators/*.ts es una traducción a TypeScript de lint/*.js, sin I/O de archivos — recibe contenido en memoria, no rutas), en vez de depender de él en runtime. Es duplicación deliberada: seo-md es la implementación de referencia mínima para uso local/CLI; este repo es la capa de servicio, pensada para invocación remota. Un cambio de regla en el protocolo general debe reflejarse en los dos lugares — están, a propósito, desacoplados en release.

Licencia

MIT.

Available Tools

4 tools
export_json_ldGenerar JSON-LD desde schema: de un SEO.mdA
Read-onlyIdempotent

Genera el bloque JSON-LD () a partir del bloque schema: de un SEO.md — templating puro sobre el YAML, sin LLM de por medio, cero ambigüedad posible (SEO.md, regla 6).

Requiere que schema: tenga default_type, name y description — sin esos dos últimos no hay JSON-LD válido que generar, y el tool falla con un mensaje claro en vez de generar algo incompleto. applicationCategory/operating_system son opcionales.

Args:

  • config (string): frontmatter YAML de tu SEO.md.

  • url (string, opcional): URL de la página específica, se agrega como campo "url" del JSON-LD.

Returns: el objeto JSON-LD y el string del completo, listo para pegar en el .

Inputs: config (required), url. Returns: jsonLd, scriptTag

lint_linkedin_contentLint de contenido de LinkedIn contra LINKEDIN.mdA
Read-onlyIdempotent

Valida un copy de feed y/o un artículo de newsletter de LinkedIn contra los techos duros de un LINKEDIN.md. Los dos formatos son schemas separados (feed_copy / newsletter_article) porque casi no comparten restricciones reales — mandá al menos uno de los dos, podés mandar ambos.

El contenido del artículo es estructurado (title, seoDescription, hook, contextParagraph, sections: [{heading, body}], closing), no texto libre a re-parsear con regex de headings — contar secciones es leer la longitud del array.

forbidden_structure en LinkedIn SÍ chequea "table", "raw_html" y "literal_markdown" (a diferencia de lint_web_content, donde el medio ya es HTML y solo "table" aplica) — el editor de LinkedIn no renderiza ninguno de los tres.

Args:

  • config (string): frontmatter YAML de tu LINKEDIN.md.

  • feedCopy (opcional): { text, hashtags? }.

  • newsletter (opcional): { title, seoDescription, hook?, contextParagraph?, sections: [{heading, body}], closing? }.

Returns: texto "PASS"/"FAIL" con el detalle de cada pieza enviada, más structuredContent.

Inputs: config (required), feedCopy, newsletter. Returns: pass, feedCopy, newsletter

lint_producthunt_postLint de post de Product Hunt contra PRODUCTHUNT.mdA
Read-onlyIdempotent

Valida un tagline + descripción de lanzamiento de Product Hunt contra los techos duros declarados en un PRODUCTHUNT.md.

A diferencia de lint_web_content, los términos prohibidos (negative.terms) se bloquean en TODO el post, no solo en una superficie corta — no existe un uso legítimo de "votá por nosotros" en tu propio tagline o descripción (Product Hunt lo prohíbe sin matices y remueve el post).

Args:

  • config (string): frontmatter YAML de tu PRODUCTHUNT.md.

  • tagline (string), description (string): el contenido a validar.

  • imageCount (number, opcional): cantidad de imágenes en la galería, para chequear contra gallery.min_images.

Returns: texto "PASS"/"FAIL" con el detalle, más structuredContent.

Inputs: config (required), tagline (required), description (required), imageCount. Returns: pass, duros, blandos

lint_web_contentLint de contenido web contra SEO.mdA
Read-onlyIdempotent

Valida una o más páginas HTML contra los techos/pisos duros declarados en un SEO.md (protocolo: github.com/MauricioPerera/seo-md).

No escribe contenido — solo verifica lo que ya se escribió. Chequea: / dentro de sus presupuestos de caracteres (max_chars, y min_chars si está declarado), contra locale, que cada página no-pilar linkee a una pillar_page, títulos duplicados entre páginas, términos prohibidos bloqueados en / (informados, no bloqueados, si aparecen en el body — evita falsos positivos en frases comparativas), techo de densidad de keywords (nunca exige presencia), forbidden_structure (solo "table" tiene sentido en HTML), y validez del JSON-LD si está presente.

Args:

  • config (string): el bloque YAML de frontmatter de tu SEO.md, tal cual (sin los ---).

  • pages (array): páginas a validar, cada una { ruta, html }.

Returns: texto "PASS"/"FAIL" seguido del detalle por página (✗ = gate duro que bloquea, · = señal blanda informativa que nunca bloquea), más structuredContent con el resultado crudo.

Errores: si config no es YAML válido, o si a una página le falta /, se reporta como violación de gate duro, no como excepción — sigue devolviendo PASS/FAIL sobre el resto.

Inputs: pages (required), config (required). Returns: pass, pages

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.6/5.0

    Scored across 4 tools

    Disambiguation5/5

    Each tool targets a distinct platform or purpose: web content, Product Hunt posts, LinkedIn content, and JSON-LD export. There is no overlap in what they validate or generate, making selection unambiguous.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern: lint_* for validation across three different content types, and export_json_ld for generation. The naming is predictable and clearly denotes the action and target.

    Tool Count5/5

    With exactly 4 tools, the set is well-scoped and avoids redundancy. Each tool covers a necessary function for content contract validation and schema export without excess.

    Completeness5/5

    The tool surface fully covers the stated domain: validating against SEO.md, PRODUCTHUNT.md, and LINKEDIN.md, plus generating JSON-LD. There are no obvious missing operations that would cause agent failures or dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers