Blogger Posting

Automatize a postagem de blogs no Google Blogger usando a API do Blogger.

Documentação

Servidor MCP Blogger Posting (Servidor de Postagem de Blog MCP)

License: MIT

Servidor de automação de postagem de blog prático que combina a API Google Blogger com ferramentas MCP (Model Context Protocol)


🆕 Principais atualizações (2025-06-14)

  • Suporte ao endpoint server/info: No MCP Inspector/cliente, você pode consultar diretamente as informações de nome/versão do servidor por meio da solicitação server/info.
  • Política de registro reforçada: Todos os registros do servidor MCP devem usar apenas stderr (console.error) ou funções de registro exclusivas do protocolo MCP. A poluição do stdout pode causar erros de análise do protocolo.
  • Rastreamento de envio JSON em tempo real: Você pode rastrear mensagens JSON realmente enviadas em tempo real por meio de registros stderr no formato [DEBUG][STDIO_SEND] ....

✨ Principais recursos

  • Integração com a API Google Blogger: Automatize postagens/postagens em lote de blogs com ferramentas MCP
  • Suporte padrão a ferramentas MCP: Ferramentas blog-post e blog-batch-post podem ser chamadas em clientes LLM/MCP
  • Segurança/configuração baseada em variáveis de ambiente: Gerenciamento seguro de .env, arquivos client_secret e tokens de autenticação
  • Teste/operação/escalabilidade: Testes unitários/integrados, configuração por ambiente, guia de segurança
  • Estrutura leve: Remoção de recursos/prompts/códigos de exemplo desnecessários, servidor MCP puro focado em ferramentas
  • Configuração baseada em parâmetros: Configuração flexível por meio de variáveis de ambiente/parâmetros como credentialPath, blogUrl etc.
  • Endpoint de informações do servidor (server/info): No MCP Inspector/cliente, você pode consultar diretamente as informações de nome/versão do servidor por meio da solicitação server/info

🚀 Início rápido

1. Preparação dos arquivos necessários

  • Arquivo .env (variáveis de ambiente)
  • Arquivo JSON client_secret do Google OAuth2 (caminho definido por variável de ambiente)
  • .gitignore deve incluir .env e client_secret*.json obrigatoriamente

2. Exemplo de variáveis de ambiente (.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. Instalação de dependências e build

npm install
npm run build

4. Execução do servidor

npm run dev

5. Exemplo de uso da ferramenta MCP

  • Verifique e chame as ferramentas blog-post e blog-batch-post no MCP Inspector/cliente
  • Exemplo de entrada:
{
  "title": "테스트 포스트",
  "content": "<h1>내용</h1>",
  "labels": ["테스트", "자동화"],
  "isDraft": false
}
  • Erro se não houver token de autenticação; postagem normal após autenticação

📂 Estrutura 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 inicialização do servidor e gerenciamento de ID do blog

  1. Na inicialização do servidor

    • O endereço do blog é recebido pela variável de ambiente BLOG_URL (obrigatória).
    • Verifica o token de autenticação do Google (autentica se ausente/expirado; interrompe a inicialização do servidor em caso de falha)
    • Consulta o ID do blog por meio da API Google Blogger usando o endereço do blog.
    • Em caso de sucesso, salva o ID do blog no arquivo .blog_id_cache.json.
    • Em caso de falha na consulta (rede, autenticação, erro de endereço etc.), a inicialização do servidor é interrompida com erro MCP.
  2. Ao chamar a API

    • Sempre usa o ID do blog em cache (.blog_id_cache.json) para chamar a API.
    • Se ocorrer erro relacionado ao ID do blog durante a chamada da API (404/403 etc.)
      • Reconsulta o ID do blog uma vez usando o endereço do blog (tentativa)
      • Em caso de sucesso na reconsulta, atualiza o ID e chama a API novamente
      • Em caso de falha na reconsulta, retorna erro
  3. Avisos operacionais/segurança

    • O arquivo .blog_id_cache.json deve ser adicionado ao .gitignore e nunca enviado ao git.
    • Exemplo de formato do arquivo de cache: { "blogUrl": "https://yourblog.blogspot.com", "blogId": "1234567890" }
    • Na reinicialização do servidor, usa o arquivo de cache se existir; caso contrário, consulta novamente
    • Se o ID do blog não puder ser consultado devido a erros de rede/autenticação/endereço, o servidor não inicia.

🧪 Testes

  • Execute testes unitários com npm test
  • Testes integrados exigem injeção de dados reais como .env/variáveis de ambiente/blogUrl real
  • Verificação automática do funcionamento normal das ferramentas MCP e dos casos de falha/sucesso de autenticação

📝 Referências adicionais

  • Recomenda-se testar a lista/chamada de ferramentas com MCP Inspector etc.
  • Consulte o guia oficial do Google OAuth2 para autenticação/emissão de tokens
  • Use a estrutura managers/services ao expandir ferramentas/serviços
  • Com a melhoria da estrutura BaseServer, é possível reduzir o peso sem recursos/prompts/códigos de exemplo desnecessários

🛠️ Formato e exemplos de entrada/saída das ferramentas MCP

Ferramenta blog-post

  • Descrição: Cria uma única postagem no Google Blogger.
  • Entrada (JSON):
{
  "title": "포스트 제목", // (필수)
  "content": "<h1>포스트 내용(HTML)</h1>", // (필수)
  "labels": ["라벨1", "라벨2"], // (선택)
  "isDraft": true, // (선택, 기본값: true)
}
  • Descrição dos campos de entrada:

    Nome do campoTipoObrigatórioDescrição
    titlestring✅Título da postagem
    contentstring✅Conteúdo da postagem (HTML)
    labelsstring[]—Lista de rótulos
    isDraftboolean—Se é rascunho (true/false, padrão: true)
  • Observação: O ID do blog é gerenciado pela variável de ambiente do servidor (BLOG_ID); o usuário não precisa informá-lo.

  • Saída (JSON):

{
  "content": [
    { "type": "text", "text": "포스트 작성 성공!\nURL: https://...\n제목: ..." }
  ],
  "isError": false
}
  • Descrição dos campos de saída:

    Nome do campoTipoDescrição
    contentarrayMensagens (sucesso/falha/detalhes)
    isErrorbooleanSe houve falha (true: erro, false: sucesso)
  • Exemplo de erro:

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

Ferramenta blog-batch-post

  • Descrição: Cria várias postagens de uma só vez.
  • Entrada (JSON):
{
  "posts": [
    // (필수)
    {
      "title": "제목1", // (필수)
      "content": "<h1>내용1</h1>", // (필수)
      "labels": ["라벨A"], // (선택)
      "isDraft": true, // (선택, 기본값: true)
    },
    {
      "title": "제목2", // (필수)
      "content": "<h1>내용2</h1>", // (필수)
    },
  ],
}
  • Descrição dos campos de entrada:

    Nome do campoTipoObrigatórioDescrição
    postsobject[]✅Matriz de postagens
    └ titlestring✅Título da postagem
    └ contentstring✅Conteúdo da postagem (HTML)
    └ labelsstring[]—Lista de rótulos
    └ isDraftboolean—Se é rascunho (true/false, padrão: true)
  • Observação: O ID do blog é gerenciado pela variável de ambiente do servidor (BLOG_ID); o usuário não precisa informá-lo.

  • Saída (JSON):

{
  "content": [
    { "type": "text", "text": "배치 포스팅 완료! 성공: 2, 실패: 0" },
    { "type": "text", "text": "[ {\"success\":true,\"postId\":\"...\",...} ]" }
  ],
  "isError": false
}
  • Descrição dos campos de saída:

    Nome do campoTipoDescrição
    contentarrayMensagens (sucesso/falha/detalhes)
    isErrorbooleanSe houve falha (true: erro, false: sucesso)
  • Exemplo de erro:

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

📄 Licença

Este projeto está sob a licença MIT.


⚙️ Exemplo de configuração do servidor MCP no cliente

Ao executar o servidor blogspot-posting em um cliente MCP (ex.: MCP Inspector, plataforma MCP integrada etc.), use a configuração mcpServers conforme abaixo.

{
  "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 e argumentos de execução do servidor MCP
  • env: variáveis de ambiente a serem injetadas no servidor (caminhos de segredos)
  • Se necessário, todas as variáveis de ambiente adicionais (valores do .env) podem ser especificadas em env

NOTA: Na versão atual, SESSION_SECRET não é necessário. (Necessário apenas se forem adicionados recursos de autenticação/login baseados em sessão)


⚠️ Política de caminho do arquivo de cache blogId (.blog_id_cache.json) e avisos

  • O arquivo de cache de ID do blog (.blog_id_cache.json) é sempre criado apenas na raiz do projeto (pasta de nível superior).
  • O problema de criação do arquivo de cache em outros locais, como a pasta de build (dist), foi corrigido em 2025-06-12; agora ele é criado apenas na raiz, independentemente do ambiente de execução.
  • Se houver arquivos de cache em locais incorretos, como dist/.blog_id_cache.json, exclua-os manualmente.
  • Certifique-se de incluir .blog_id_cache.json no .gitignore para que não seja enviado ao git.
  • Verifique nos ambientes de operação/teste se o arquivo de cache é criado apenas na raiz, independentemente do local de execução/build do servidor.

🧑‍💻 Guia de depuração/operação

  • Todos os registros do servidor MCP devem usar apenas stderr (console.error) ou funções de registro exclusivas do protocolo MCP. A poluição do stdout pode causar erros de análise do protocolo.
  • Por meio dos registros stderr [DEBUG][STDIO_SEND] ..., você pode rastrear em tempo real as mensagens JSON realmente enviadas, diagnosticando rapidamente erros de análise e problemas de protocolo.
  • No Inspector/cliente, verifique o funcionamento normal, como consulta de informações do servidor com server/info e tools/list.

🚦 Exemplos de endpoint de ferramentas/servidor MCP

  • Consulta de informações do servidor (server/info):
    { "method": "server/info" }
    
    → Exemplo de resposta:
    { "name": "blogspot-mcp-server", "version": "1.0.0" }