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)
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)
.gitignoredebe incluir obligatoriamente.envyclient_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
-
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.
- Se recibe la dirección del blog mediante la variable de entorno
-
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
- Las llamadas a la API siempre usan el ID de blog en caché (
-
Precauciones operativas/ de seguridad
- El archivo
.blog_id_cache.jsondebe 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.
- El archivo
🧪 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:
Campo Tipo Obligatorio Descripción title string ✅ Título de la publicación content string ✅ Contenido de la publicación (HTML) labels string[] — Lista de etiquetas isDraft boolean — Si 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:
Campo Tipo Descripción content array Mensaje (éxito/fracaso/información detallada) isError boolean Indicador 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:
Campo Tipo Obligatorio Descripción posts object[] ✅ Matriz de publicaciones └ title string ✅ Título de la publicación └ content string ✅ Contenido de la publicación (HTML) └ labels string[] — Lista de etiquetas └ isDraft boolean — Si 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:
Campo Tipo Descripción content array Mensaje (éxito/fracaso/información detallada) isError boolean Indicador 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 MCPenv: 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/infoy pruebas como tools/list.
🚦 Ejemplos de herramientas/endpoints del servidor MCP
- Consulta de información del servidor (server/info):
→ Ejemplo de respuesta:{ "method": "server/info" }{ "name": "blogspot-mcp-server", "version": "1.0.0" }