content-contracts-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@content-contracts-mcp-server Check if this post meets the SEO.md contract"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
content-contracts-mcp-server
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 |
| Páginas HTML contra un |
| Tagline/descripción/galería contra un |
| Copy de feed y/o artículo de newsletter contra un |
| Genera el |
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 stdioProbarlo
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 toolsexport_json_ldGenerar JSON-LD desde schema: de un SEO.mdARead-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.mdARead-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.mdARead-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.mdARead-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
Scored across 4 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Unified 15-tool SEO, SERP, clean Markdown & GEO (LLM citation Share-of-Voice) MCP server.
The OpenZeppelin Solidity Contracts MCP server integrates OpenZeppelin's security and style rules into AI-driven development workflows, enabling AI assistants to generate safe, correct, and production-ready smart contracts. It automatically validates generated code against OpenZeppelin standards (including imports, modifiers, naming conventions, and security checks) and supports various contract types including ERC-20, ERC-721, ERC-1155, Stablecoins, RWA, Governor, and Account contracts through prompt-driven workflows.
Related MCP Servers
AlicenseAqualityBmaintenanceLocal-first MCP server for AI content governance. 13 tools for model/content management, validation, normalization, and i18n across any framework.237MIT- AlicenseAqualityDmaintenanceMCP server that validates LLM-generated tool-call arguments, lints tool definitions, and produces retry messages for AI assistants.352 npm1MIT

JSON Contractsofficial
AlicenseAqualityDmaintenanceJSON Contracts is a local MCP server for transforming natural language into Git-controlled JSON contracts, JSON Schema validation, and structured LLM/agent outputs.852 npm1Apache 2.0- AlicenseNot gradedqualityDmaintenanceMCP server exposing Generative Engine Optimization tools to any AI agent, enabling checking of llms.txt, auditing robots.txt for AI crawlers, and validating JSON-LD schema.MIT