Content Distribution MCP
Servidor MCP que distribuye un único contenido a través de 8+ canales (DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, Medium, Twitter) con adaptación automática específica de cada plataforma, publicación idempotente, reglas antispam por comunidad y gestión centralizada del estado.
Documentación
content-distribution-mcp
Publica tu contenido en todas partes—sin reescribirlo para cada plataforma.
Un servidor MCP que distribuye una única pieza de contenido a través de 8+ canales (DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, Medium, Twitter) con adaptación automática específica de la plataforma, publicación idempotente, reglas anti-spam por comunidad y gestión centralizada del estado.
El problema que resuelve
Crear y publicar contenido a escala está lleno de fricciones:
- Formatos diferentes: Reddit elimina el formato, Twitter tiene límites de caracteres, DEV.to admite incrustaciones y medios enriquecidos. Cada uno necesita una copia personalizada.
- Reglas de la plataforma: Los subreddits imponen tiempos de espera y requisitos de etiquetas. Las comunidades tienen patrones de publicación y puertas de automoderación. LinkedIn suprime los enlaces externos.
- Caos de estado: ¿Qué publicaciones se publicaron y dónde? ¿Qué pasa si una publicación falla a mitad de camino? ¿Esa publicación de Reddit fue eliminada automáticamente por los filtros de spam?
Este MCP maneja la complejidad de la distribución. Escribe tu mensaje principal una vez, genera variantes específicas de la plataforma y publica en todas partes de forma segura.
Cómo funciona
- Tu agente genera variantes de copia específicas del canal (títulos reescritos, texto recortado, etiquetas apropiadas para la plataforma, tono adaptado a la audiencia).
- Este MCP publica cada variante con idempotencia, OAuth, reintentos de API y programación—aplicando automáticamente las restricciones de la plataforma.
- Tú controlas qué plataformas reciben qué. El MCP devuelve sugerencias por canal (límites de caracteres, vocabularios de etiquetas, tiempos de espera) pero deja las decisiones creativas en tus manos.
No hay llamadas a LLM dentro. No hay agentes encerrados. Solo una API limpia para la distribución de contenido multiplataforma a escala.
Instalación
npx @automatelab/content-distribution-mcp
O agrégalo permanentemente a tu host MCP.
Conéctalo a tu host MCP
Claude Code — agrégalo a .claude/mcp.json:
{
"mcpServers": {
"content-distribution": {
"command": "npx",
"args": ["-y", "@automatelab/content-distribution-mcp"]
}
}
}
Claude Desktop — agrégalo a claude_desktop_config.json:
{
"mcpServers": {
"content-distribution": {
"command": "npx",
"args": ["-y", "@automatelab/content-distribution-mcp"]
}
}
}
n8n — usa el nodo MCP Client, apúntalo a npx @automatelab/content-distribution-mcp a través de stdio.
Cursor / Windsurf / cualquier host MCP — mismo patrón npx -y content-distribution-mcp.
Configura las credenciales
El servidor lee las credenciales de un Perfil de Distribución almacenado en ~/.distribution-mcp/profiles.yaml:
# ~/.distribution-mcp/profiles.yaml
default:
credentials:
DEV_TO_API_KEY: "your-devto-api-key"
HASHNODE_TOKEN: "your-hashnode-token"
HASHNODE_PUBLICATION_ID: "your-pub-id"
GITHUB_TOKEN: "ghp_..."
GITHUB_DISCUSSION_REPO: "owner/repo"
REDDIT_CLIENT_ID: "..."
REDDIT_CLIENT_SECRET: "..."
REDDIT_USERNAME: "..."
REDDIT_PASSWORD: "..."
BLUESKY_IDENTIFIER: "you.bsky.social"
BLUESKY_PASSWORD: "..."
subreddits:
- ClaudeAI
- LocalLLaMA
Solo establece credenciales para los canales que planeas usar. LinkedIn, Medium y Twitter/X devuelven needs_browser con una URL de redacción — no se necesitan credenciales.
Superficie de herramientas MCP
Ocho herramientas, nombres con notación de puntos forman un árbol navegable (post.*, channel.*, profile.*, subreddit.*). Cada herramienta declara un outputSchema (los llamadores pueden verificar tipos de respuestas) y MCP annotations (sugerencias de solo lectura / destructivas / idempotentes / mundo abierto). No hay llamadas a LLM dentro del servidor.
| Herramienta | Propósito |
|---|---|
post_publish | Publicación inmediata; idempotente en (content.id, channel) |
post_schedule | Poner en cola variantes para schedule_at, publicar el resto inmediatamente |
post_drain | Disparar todas las publicaciones programadas que vencen ahora — ejecutar desde cron |
post_status | Estado por canal para una pieza de contenido o canal |
post_unpublish | Eliminación de mejor esfuerzo (DEV.to establece no publicado; otros varían) |
channel_hints | Metadatos por canal: límites de caracteres, soporte de Markdown, vocabulario de etiquetas |
profile_list | Nombres de los perfiles de distribución configurados |
subreddit_list | Catálogo de subreddits: tiempos de espera, vocabulario de etiquetas, última publicación |
Cambio importante en v2.2.0. Las herramientas fueron renombradas de nombres planos (
publish,schedule, ...) a notación de puntos (post_publish,post_schedule, ...). Actualiza cualquier prompt, habilidad de agente o nodo n8n que haga referencia a los nombres antiguos.
Canales
| Clave de canal | Nivel | Autenticación |
|---|---|---|
devto | Auto | DEV_TO_API_KEY |
hashnode | Auto | HASHNODE_TOKEN + HASHNODE_PUBLICATION_ID |
github_discussions | Auto | GITHUB_TOKEN + GITHUB_DISCUSSION_REPO |
reddit | Auto-gated | REDDIT_CLIENT_ID/SECRET/USERNAME/PASSWORD |
bluesky | Auto | BLUESKY_IDENTIFIER + BLUESKY_PASSWORD |
linkedin | Respaldo de navegador | devuelve needs_browser + URL de redacción |
medium | Respaldo de navegador | devuelve needs_browser + URL de redacción |
twitter / x | Respaldo de navegador | devuelve needs_browser + URL de redacción |
Ejemplo de llamada de agente
// post_publish tool
{
"content": {
"id": "n8n-webhook-setup@2026-05-20",
"title": "How to set up an n8n webhook",
"body_md": "...",
"tags": ["automation", "n8n", "tutorial"],
"canonical_url": "https://yourblog.com/n8n-webhook-setup",
"author": "You"
},
"variants": [
{
"channel": "devto:main",
"title": "How to set up an n8n webhook",
"body": "...",
"tags": ["automation", "n8n", "tutorial", "devops"],
"canonical_url": "https://yourblog.com/n8n-webhook-setup",
"extras": {}
},
{
"channel": "reddit:ClaudeAI",
"title": "Built a webhook automation with n8n",
"body": "Here's how I set it up...",
"tags": [],
"extras": { "flair": "Project" }
}
],
"profile_name": "default"
}
Idempotencia
Volver a ejecutar post_publish con el mismo par content.id + channel devuelve el live_url existente inmediatamente sin hacer otra llamada a la API de la plataforma. Es seguro reintentar en caso de fallo.
Programación
Las variantes con schedule_at (ISO-8601 con zona horaria, p. ej. "2026-05-21T09:00:00+00:00") se almacenan en ~/.distribution-mcp/scheduled.yaml y se disparan en la siguiente llamada a post_drain. Ejecuta drain desde cron:
# fire due posts every 5 minutes
*/5 * * * * npx -y content-distribution-mcp drain
O llama directamente a la herramienta MCP post_drain desde un agente.
Variables de entorno
| Variable | Predeterminado | Propósito |
|---|---|---|
DISTRIBUTION_BACKEND | yaml | Backend de estado (solo yaml en v1) |
DISTRIBUTION_BACKEND_DIR | ~/.distribution-mcp | Directorio para archivos de estado YAML |
Requisitos
- Node.js 18 o posterior
Arquitectura
Agent (Claude Code / n8n / Cursor / any MCP host)
│ generates per-channel copy, calls MCP tools
▼
content-distribution-mcp (this package, stdio transport)
│ no LLM calls — pure I/O
├── adapters/ devto · hashnode · github-discussions · reddit · bluesky · browser
└── backends/ yaml (post log · profiles · schedule queue · subreddit catalog)
Funciona con cualquier cliente MCP
No hay código específico de Anthropic en ninguna parte. Verifica:
grep -ri "anthropic" node_modules/content-distribution-mcp/dist/ # returns nothing
Parte de la pila de AutomateLab
- agency-os — plano de control
- content-distribution-mcp — este paquete
- automatelab.tech — blog y tutoriales
Licencia
MIT