Blogger Posting

Automatizar la publicación de blogs en Google Blogger usando la API de Blogger.

Documentación

MCP Blogger Posting Server (Servidor de Publicación de Blogs MCP)

License: MIT

Servidor de automatización de publicación de blogs práctico que combina la API de Google Blogger con las herramientas MCP (Model Context Protocol)


🆕 Actualizaciones principales (2025-06-14)

  • Soporte del endpoint server/info: Puede consultar directamente el nombre/versión del servidor desde MCP Inspector/clientes mediante una solicitud server/info.
  • Política de registro reforzada: Todos los registros del servidor MCP deben usar exclusivamente stderr (console.error) o funciones de registro dedicadas del protocolo MCP; la contaminación de stdout puede provocar errores de análisis del protocolo.
  • Seguimiento de envío JSON en tiempo real: Puede rastrear en tiempo real los mensajes JSON realmente enviados mediante registros stderr con el formato [DEBUG][STDIO_SEND] ....

✨ Características principales

  • Integración con la API de Google Blogger: Automatización de publicación/ publicación por lotes de blogs mediante herramientas MCP
  • Soporte estándar de herramientas MCP: Invocación de las herramientas blog-post y blog-batch-post desde clientes LLM/MCP
  • Seguridad/configuración basada en variables de entorno: Gestión segura de .env, archivos client_secret y tokens de autenticación
  • Pruebas/operación/escalabilidad: Pruebas unitarias/de integración, configuración por entorno y guía de seguridad
  • Estructura ligera: Eliminación de recursos/prompts/códigos de ejemplo innecesarios; servidor MCP puro centrado en herramientas
  • Config basada en parámetros: Configuración flexible mediante variables de entorno/parámetros como credentialPath, blogUrl, etc.
  • Endpoint de información del servidor (server/info): Consulta directa del nombre/versión del servidor desde MCP Inspector/clientes mediante solicitud server/info

🚀 Inicio rápido

1. Preparación de archivos necesarios

  • Archivo .env (variables de entorno)
  • Archivo JSON client_secret de Google OAuth2 (la ruta se especifica mediante variable de entorno)
  • .gitignore debe incluir obligatoriamente .env y client_secret*.json

2. Ejemplo de variables de entorno (.env)

GOOGLE_CLIENT_SECRET_PATH=C:/dev/mcp-servers/mcp-blogspot-posting/client_secret_...json
SESSION_SECRET=your-session-secret
BLOG_ID=your-blog-id (선택)
PORT=3000

3. Instalación de dependencias y compilación

npm install
npm run build

4. Ejecución del servidor

npm run dev

5. Ejemplo de uso de herramientas MCP

  • Verificar e invocar las herramientas blog-post y blog-batch-post desde MCP Inspector/cliente
  • Ejemplo de entrada:
{
  "title": "테스트 포스트",
  "content": "<h1>내용</h1>",
  "labels": ["테스트", "자동화"],
  "isDraft": false
}
  • Si no hay token de autenticación, se produce un error; después de la autenticación, la publicación se realiza correctamente

📂 Estructura principal

mcp-blogspot-posting/
├── src/
│   ├── managers/       # Tool 핸들러
│   ├── services/       # BloggerService 등 비즈니스 로직
│   ├── types/          # 타입 정의 (bloggerTypes 등)
│   ├── lib/            # 인증/토큰 관리 등
├── test/               # 유닛/통합 테스트
├── .env                # 환경변수 (gitignore 필수)
├── client_secret_*.json # Google OAuth2 시크릿 (gitignore 필수)
├── .gitignore
├── package.json
└── README.md

🚦 Política de inicio del servidor y gestión del ID de blog

  1. Al iniciar el servidor

    • Se recibe la dirección del blog mediante la variable de entorno BLOG_URL (obligatoria).
    • Se verifica el token de autenticación de Google (autenticación si no existe o está caducado; el inicio del servidor se detiene si falla)
    • Se consulta el ID del blog a través de la API de Google Blogger usando la dirección del blog.
    • Si la consulta tiene éxito, el ID del blog se guarda en el archivo .blog_id_cache.json.
    • Si la consulta falla (red, autenticación, error de dirección, etc.), el inicio del servidor se detiene con un error de MCP.
  2. Al realizar llamadas a la API

    • Las llamadas a la API siempre usan el ID de blog en caché (.blog_id_cache.json).
    • Si se produce un error relacionado con el ID de blog (404/403, etc.) durante la llamada a la API
      • Se vuelve a consultar (reintentar) el ID del blog una vez usando la dirección del blog
      • Si la reconsulta tiene éxito, se actualiza el ID y se vuelve a llamar a la API
      • Si la reconsulta falla, se devuelve un error
  3. Precauciones operativas/ de seguridad

    • El archivo .blog_id_cache.json debe agregarse obligatoriamente a .gitignore y no debe enviarse a git.
    • Ejemplo de formato del archivo de caché: { "blogUrl": "https://yourblog.blogspot.com", "blogId": "1234567890" }
    • Al reiniciar el servidor, si existe el archivo de caché se usa primero; si no, se consulta nuevamente
    • Si no se puede consultar el ID del blog debido a errores de red/autenticación/dirección, el servidor no se inicia.

🧪 Pruebas

  • Ejecutar pruebas unitarias con npm test
  • Las pruebas de integración requieren la inyección de datos reales como .env/variables de entorno/blogUrl real
  • Verificación automática del correcto funcionamiento de las herramientas MCP y de los casos de fallo/éxito de autenticación

📝 Notas adicionales

  • Se recomienda probar la lista/ invocación de herramientas con MCP Inspector
  • Para la autenticación/ emisión de tokens, consulte la guía oficial de Google OAuth2
  • Al ampliar herramientas/servicios, utilice la estructura managers/services
  • Gracias a la mejora de la estructura BaseServer, es posible la ligereza sin recursos/prompts/códigos de ejemplo innecesarios

🛠️ Formato de entrada/salida y ejemplos de herramientas MCP

Herramienta blog-post

  • Descripción: Escribe una publicación individual en Google Blogger.
  • Entrada (JSON):
{
  "title": "포스트 제목", // (필수)
  "content": "<h1>포스트 내용(HTML)</h1>", // (필수)
  "labels": ["라벨1", "라벨2"], // (선택)
  "isDraft": true, // (선택, 기본값: true)
}
  • Descripción de los campos de entrada:

    CampoTipoObligatorioDescripción
    titlestringTítulo de la publicación
    contentstringContenido de la publicación (HTML)
    labelsstring[]Lista de etiquetas
    isDraftbooleanSi es borrador (true/false, valor predeterminado: true)
  • Nota: El ID del blog se gestiona mediante la variable de entorno del servidor (BLOG_ID); el usuario no necesita ingresarlo.

  • Salida (JSON):

{
  "content": [
    { "type": "text", "text": "포스트 작성 성공!\nURL: https://...\n제목: ..." }
  ],
  "isError": false
}
  • Descripción de los campos de salida:

    CampoTipoDescripción
    contentarrayMensaje (éxito/fracaso/información detallada)
    isErrorbooleanIndicador de fracaso (true: error, false: éxito)
  • Ejemplo de error:

{
  "content": [
    { "type": "text", "text": "인증 토큰이 없습니다. 먼저 인증을 완료하세요." }
  ],
  "isError": true
}

Herramienta blog-batch-post

  • Descripción: Escribe varias publicaciones a la vez.
  • Entrada (JSON):
{
  "posts": [
    // (필수)
    {
      "title": "제목1", // (필수)
      "content": "<h1>내용1</h1>", // (필수)
      "labels": ["라벨A"], // (선택)
      "isDraft": true, // (선택, 기본값: true)
    },
    {
      "title": "제목2", // (필수)
      "content": "<h1>내용2</h1>", // (필수)
    },
  ],
}
  • Descripción de los campos de entrada:

    CampoTipoObligatorioDescripción
    postsobject[]Matriz de publicaciones
    └ titlestringTítulo de la publicación
    └ contentstringContenido de la publicación (HTML)
    └ labelsstring[]Lista de etiquetas
    └ isDraftbooleanSi es borrador (true/false, valor predeterminado: true)
  • Nota: El ID del blog se gestiona mediante la variable de entorno del servidor (BLOG_ID); el usuario no necesita ingresarlo.

  • Salida (JSON):

{
  "content": [
    { "type": "text", "text": "배치 포스팅 완료! 성공: 2, 실패: 0" },
    { "type": "text", "text": "[ {\"success\":true,\"postId\":\"...\",...} ]" }
  ],
  "isError": false
}
  • Descripción de los campos de salida:

    CampoTipoDescripción
    contentarrayMensaje (éxito/fracaso/información detallada)
    isErrorbooleanIndicador de fracaso (true: error, false: éxito)
  • Ejemplo de error:

{
  "content": [
    { "type": "text", "text": "인증 토큰이 없습니다. 먼저 인증을 완료하세요." }
  ],
  "isError": true
}

📄 Licencia

Este proyecto está bajo la Licencia MIT.


⚙️ Ejemplo de configuración del servidor MCP en el cliente

Al ejecutar el servidor blogspot-posting en un cliente MCP (por ejemplo, MCP Inspector, plataforma MCP integrada, etc.), utilice la configuración mcpServers como se muestra a continuación.

{
  "mcpServers": {
    "blogspot-posting": {
      "command": "npx",
      "args": ["-y", "server-blogspot-posting"],
      "env": {
        "GOOGLE_CLIENT_SECRET_PATH": "/path/to/client_secret_xxx.json",
        "BLOG_ID": "your-blog-id",
      },
    },
  },
}
  • command, args: comando y argumentos de ejecución del servidor MCP
  • env: variables de entorno a inyectar en el servidor (rutas de secretos)
  • Si es necesario, se pueden especificar todas las variables de entorno adicionales (valores de .env) en env

NOTA: En la versión actual, SESSION_SECRET no es necesario. (Solo se necesita si se agregan funciones de autenticación/inicio de sesión basadas en sesión)


⚠️ Política de ruta y precauciones del archivo de caché blogId (.blog_id_cache.json)

  • El archivo de caché del ID de blog (.blog_id_cache.json) siempre se crea solo en la raíz del proyecto (carpeta de nivel superior).
  • El problema de que el archivo de caché se creara en otras ubicaciones, como la carpeta de compilación (dist), se corrigió el 2025-06-12; ahora, sin importar el entorno de ejecución, solo se crea en la raíz.
  • Si existe un archivo de caché en una ubicación incorrecta, como dist/.blog_id_cache.json, elimínelo manualmente.
  • Asegúrese de incluir .blog_id_cache.json en .gitignore para que no se envíe a git.
  • Verifique en el entorno de operación/pruebas que el archivo de caché solo se cree en la raíz, independientemente de la ubicación de ejecución/compilación del servidor.

🧑‍💻 Guía de depuración/operación

  • Todos los registros del servidor MCP deben usar exclusivamente stderr (console.error) o funciones de registro dedicadas del protocolo MCP; la contaminación de stdout puede provocar errores de análisis del protocolo.
  • Mediante los registros stderr [DEBUG][STDIO_SEND] ... puede rastrear en tiempo real los mensajes JSON realmente enviados, diagnosticando rápidamente errores de análisis y problemas de protocolo.
  • En Inspector/cliente, verifique el funcionamiento correcto consultando la información del servidor con server/info y pruebas como tools/list.

🚦 Ejemplos de herramientas/endpoints del servidor MCP

  • Consulta de información del servidor (server/info):
    { "method": "server/info" }
    
    → Ejemplo de respuesta:
    { "name": "blogspot-mcp-server", "version": "1.0.0" }