Bluesky MCP
Um servidor MCP remoto para a plataforma de mídia social Bluesky.
Documentação
Servidor Bluesky MCP
Um servidor Model Context Protocol (MCP) que fornece acesso abrangente ao Bluesky/AT Protocol para assistentes de IA. Construído em TypeScript, implantado na Vercel e totalmente compatível com o transporte MCP Streamable HTTP (versão do protocolo 2025-03-26).
Recursos
- Operações de Postagem — Criar posts, obter posts, visualizar curtidas e reposts
- Gerenciamento de Feed — Timeline, feeds personalizados, feeds de autores
- Mecanismo de Busca — Buscar posts e usuários/atores
- Acesso a Perfis — Visualizar perfis, contagem de seguidores, bios (individual e em lote)
- Visualização de Threads — Explorar threads de posts e conversas
- Favoritos — Criar, excluir e listar favoritos privados
- Verificação de Idade — Iniciar fluxo, obter configuração e estado
- Gerenciamento Seguro de Credenciais — Credenciais injetadas por requisição via cabeçalhos, nunca armazenadas
- Streamable HTTP — Suporte completo ao transporte MCP (POST + GET + OPTIONS)
- Autenticação Multi-cliente — Três métodos de credenciais para diferentes clientes MCP
- Pronto para Vercel — Implantação serverless sem estado
Início Rápido
1. Implantar na Vercel
Clique no botão acima, ou clone e implante manualmente:
git clone https://github.com/Ravishka17/Bluesky-MCP.git
cd Bluesky-MCP
vercel
2. Criar uma Senha de Aplicativo do Bluesky
- Faça login no Bluesky
- Vá para Configurações → Senhas de Aplicativo
- Crie uma nova senha de aplicativo
- Anote seu handle (ex.:
yourname.bsky.social) e a senha gerada
3. Conectar Seu Cliente de IA
Endpoint MCP: https://your-app.vercel.app/mcp
Autenticação
As credenciais nunca são armazenadas no servidor. Elas são enviadas por requisição via cabeçalhos HTTP e mantidas em memória apenas durante a duração dessa requisição.
Três métodos de credenciais são suportados, com a seguinte ordem de prioridade:
Método 1 — Dois Cabeçalhos Separados
Melhor para: HuggingChat, curl, qualquer cliente que suporte cabeçalhos personalizados.
| Cabeçalho | Valor |
|---|---|
X-BLUESKY-IDENTIFIER | Seu handle ou e-mail |
X-BLUESKY-PASSWORD | Sua senha de aplicativo |
curl -X POST https://your-app.vercel.app/mcp \
-H "Content-Type: application/json" \
-H "X-BLUESKY-IDENTIFIER: yourname.bsky.social" \
-H "X-BLUESKY-PASSWORD: your-app-password" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Método 2 — Cabeçalho Único Combinado
Melhor para: Mistral Vibe CLI, clientes com um único campo api_key_header.
Formato: handle:app-password (divide apenas no primeiro dois-pontos, então senhas contendo dois-pontos são seguras)
X-BLUESKY-CREDENTIALS: yourname.bsky.social:your-app-password
Método 3 — Authorization Bearer
Melhor para: MCP Playground, clientes compatíveis com OpenAI, qualquer ferramenta que use o cabeçalho Authorization.
Authorization: Bearer yourname.bsky.social:your-app-password
Configuração do Cliente
HuggingChat
No diálogo Adicionar Servidor MCP, expanda HTTP Headers e adicione:
| Nome do cabeçalho | Valor |
|---|---|
X-BLUESKY-IDENTIFIER | yourname.bsky.social |
X-BLUESKY-PASSWORD | your-app-password |
Claude Desktop
{
"mcpServers": {
"bluesky": {
"type": "http",
"url": "https://your-app.vercel.app/mcp",
"headers": {
"X-BLUESKY-IDENTIFIER": "yourname.bsky.social",
"X-BLUESKY-PASSWORD": "your-app-password"
}
}
}
}
Claude Code / CLI
claude mcp add bluesky --transport http https://your-app.vercel.app/mcp
Mistral Vibe (~/.vibe/config.toml)
[[mcp_servers]]
name = "bluesky"
transport = "streamable-http"
url = "https://your-app.vercel.app/mcp"
api_key_env = "BLUESKY_CREDENTIALS"
api_key_header = "X-BLUESKY-CREDENTIALS"
api_key_format = "{}"
Depois defina em ~/.vibe/.env:
BLUESKY_CREDENTIALS=yourname.bsky.social:your-app-password
Clientes baseados em YAML (config.yaml)
Para ferramentas como Hermes Agent (Nous Research) e outros clientes MCP configurados via YAML:
mcp_servers:
bluesky:
url: https://your-app.vercel.app/mcp
headers:
X-BLUESKY-CREDENTIALS: "${BLUESKY_CREDENTIALS}"
Defina no seu shell ou arquivo .env:
BLUESKY_CREDENTIALS=yourname.bsky.social:your-app-password
Exemplo do Hermes Agent (config.yaml):
mcp_servers:
bluesky:
url: https://your-app.vercel.app/mcp
headers:
X-BLUESKY-CREDENTIALS: "${BLUESKY_CREDENTIALS}"
MCP Playground
- URL do Servidor Remoto:
https://your-app.vercel.app/mcp - Cabeçalho de Autenticação:
Bearer yourname.bsky.social:your-app-password
Cliente MCP Genérico
Configure o tipo de transporte streamable-http com a URL do endpoint e qualquer um dos três métodos de autenticação acima.
Ferramentas MCP
Operações de Postagem
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
create_post | Criar um novo post (máx. 300 caracteres, resposta/idioma opcionais) | ✅ |
get_posts | Buscar posts específicos por URI (até 25) | ❌ |
get_likes | Obter usuários que curtiram um post | ❌ |
get_reposted_by | Obter usuários que repostaram um post | ❌ |
like_post | Curtir um post | ✅ |
repost_post | Repostar um post | ✅ |
Operações de Feed
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
get_timeline | Obter timeline inicial (contas seguidas) | ✅ |
get_feed | Obter posts de um gerador de feed (URI at://) | ❌ |
get_author_feed | Obter posts de um usuário específico | ❌ |
get_thread | Obter thread de post com respostas e pais | ❌ |
Operações de Perfil
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
get_profile | Obter perfil detalhado de um único usuário | ❌ |
get_profiles | Obter perfis de vários usuários (em lote, até 25) | ❌ |
get_suggestions | Obter usuários sugeridos para seguir | ✅ |
Operações de Busca
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
search_posts | Buscar posts por palavra-chave, autor, idioma, menções | ❌ |
search_actors | Buscar usuários por nome ou handle | ❌ |
search_actors_typeahead | Autocompletar busca de usuários | ❌ |
Operações de Conta
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
get_preferences | Obter preferências da conta e filtros de conteúdo | ✅ |
update_email | Atualizar o endereço de e-mail associado à conta | ✅ |
Operações de Servidor / Gerenciamento de Conta
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
admin_send_email | Enviar um e-mail como administrador do PDS | ✅ |
confirm_email | Confirmar um endereço de e-mail usando um token de verificação | ✅ |
create_account | Criar uma nova conta Bluesky/AT Protocol | ❌ |
create_app_password | Criar uma nova senha de aplicativo para a conta | ✅ |
create_invite_code | Criar um único código de convite | ✅ |
create_invite_codes | Criar vários códigos de convite de uma vez | ✅ |
create_session | Criar uma sessão de autenticação (login) | ❌ |
deactivate_account | Desativar a conta autenticada | ✅ |
delete_account | Excluir permanentemente a conta autenticada | ✅ |
delete_session | Invalidar a sessão atual | ✅ |
describe_server | Obter informações do servidor PDS | ❌ |
get_account_invite_codes | Obter códigos de convite da conta | ✅ |
get_service_auth | Obter um JWT assinado para autenticação de serviço | ✅ |
get_session | Obter detalhes da sessão atual | ✅ |
list_app_passwords | Listar todas as senhas de aplicativo | ✅ |
refresh_session | Atualizar tokens de sessão | ✅ |
Operações de Favoritos
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
create_bookmark | Salvar um post como favorito privado | ✅ |
delete_bookmark | Remover um favorito por URI | ✅ |
get_bookmarks | Listar todos os favoritos privados | ✅ |
Operações de Verificação de Idade
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
begin_age_assurance | Iniciar o fluxo de verificação de idade | ✅ |
get_age_assurance_config | Obter configuração do provedor de verificação de idade | ✅ |
get_age_assurance_state | Obter status atual da verificação de idade | ✅ |
Utilitário
| Ferramenta | Descrição | Autenticação Necessária |
|---|---|---|
test_connectivity | Testar conexão e verificar status de autenticação | ❌ |
Prompts MCP
| Prompt | Descrição |
|---|---|
bluesky_usage_guide | Guia abrangente para tarefas do Bluesky |
search_posts_template | Modelo para buscar posts |
compose_post | Modelo para compor posts |
Verificar Implantação
# Health check
curl https://your-app.vercel.app/health
# Check available auth methods
curl https://your-app.vercel.app/mcp
# Test MCP initialize
curl -X POST https://your-app.vercel.app/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
Segurança
- Credenciais nunca armazenadas — nem em variáveis de ambiente da Vercel, nem no git, nem em disco
- Injeção por requisição — as credenciais são passadas nos cabeçalhos e mantidas em memória apenas para aquela requisição
- Três métodos de autenticação — flexível para qualquer cliente sem comprometer a segurança
- Sanitização de entrada — todas as entradas são validadas e sanitizadas antes de atingir a API do Bluesky
- Limitação de taxa — limites em camadas para operações de leitura vs. escrita
- Cabeçalhos de segurança — X-Frame-Options, X-Content-Type-Options, etc.
Desenvolvimento
# Install dependencies
pnpm install
# Run in development mode
pnpm dev
# Build for production
pnpm build
Para desenvolvimento local, as credenciais podem ser passadas via cabeçalhos em cada requisição. Nenhuma variável de ambiente é necessária.
Arquitetura
Bluesky-MCP/
├── app/
│ ├── mcp/route.ts # MCP endpoint — credential extraction + transport
│ ├── health/route.ts # Health check
│ ├── layout.tsx
│ └── page.tsx
├── src/
│ ├── mcp-server.ts # MCP server — tool routing, credential injection
│ ├── bluesky-client.ts # Bluesky API client (all methods)
│ ├── handlers.ts # Tool handlers
│ ├── toolDefinitions.ts # Tool schemas
│ ├── sanitize.ts # Input sanitization
│ ├── middleware.ts # Rate limiting, security headers
│ ├── types.ts # TypeScript types
│ └── utils.ts # Utilities
├── vercel.json
└── package.json
Licença
Este projeto é liberado em domínio público sob The Unlicense.
Este é um software livre e sem restrições. Qualquer pessoa é livre para copiar, modificar, publicar, usar, compilar, vender ou distribuir este software, para qualquer finalidade, comercial ou não comercial, e por qualquer meio, sem quaisquer condições ou restrições.