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)
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)
.gitignoredeve incluir.enveclient_secret*.jsonobrigatoriamente
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
-
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.
- O endereço do blog é recebido pela variável de ambiente
-
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
- Sempre usa o ID do blog em cache (
-
Avisos operacionais/segurança
- O arquivo
.blog_id_cache.jsondeve 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.
- O arquivo
🧪 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 campo Tipo Obrigatório Descrição title string ✅ Título da postagem content string ✅ Conteúdo da postagem (HTML) labels string[] — Lista de rótulos isDraft boolean — 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 campo Tipo Descrição content array Mensagens (sucesso/falha/detalhes) isError boolean Se 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 campo Tipo Obrigatório Descrição posts object[] ✅ Matriz de postagens └ title string ✅ Título da postagem └ content string ✅ Conteúdo da postagem (HTML) └ labels string[] — Lista de rótulos └ isDraft boolean — 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 campo Tipo Descrição content array Mensagens (sucesso/falha/detalhes) isError boolean Se 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 MCPenv: 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/infoe tools/list.
🚦 Exemplos de endpoint de ferramentas/servidor MCP
- Consulta de informações do servidor (server/info):
→ Exemplo de resposta:{ "method": "server/info" }{ "name": "blogspot-mcp-server", "version": "1.0.0" }