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

  1. 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).
  2. Este MCP publica cada variante con idempotencia, OAuth, reintentos de API y programación—aplicando automáticamente las restricciones de la plataforma.
  3. 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.

HerramientaPropósito
post_publishPublicación inmediata; idempotente en (content.id, channel)
post_schedulePoner en cola variantes para schedule_at, publicar el resto inmediatamente
post_drainDisparar todas las publicaciones programadas que vencen ahora — ejecutar desde cron
post_statusEstado por canal para una pieza de contenido o canal
post_unpublishEliminación de mejor esfuerzo (DEV.to establece no publicado; otros varían)
channel_hintsMetadatos por canal: límites de caracteres, soporte de Markdown, vocabulario de etiquetas
profile_listNombres de los perfiles de distribución configurados
subreddit_listCatá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 canalNivelAutenticación
devtoAutoDEV_TO_API_KEY
hashnodeAutoHASHNODE_TOKEN + HASHNODE_PUBLICATION_ID
github_discussionsAutoGITHUB_TOKEN + GITHUB_DISCUSSION_REPO
redditAuto-gatedREDDIT_CLIENT_ID/SECRET/USERNAME/PASSWORD
blueskyAutoBLUESKY_IDENTIFIER + BLUESKY_PASSWORD
linkedinRespaldo de navegadordevuelve needs_browser + URL de redacción
mediumRespaldo de navegadordevuelve needs_browser + URL de redacción
twitter / xRespaldo de navegadordevuelve 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

VariablePredeterminadoPropósito
DISTRIBUTION_BACKENDyamlBackend de estado (solo yaml en v1)
DISTRIBUTION_BACKEND_DIR~/.distribution-mcpDirectorio 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

Licencia

MIT