Skip to main content
Glama

Evolution API MCP Server

by PabloBispo
ROADMAP.md10.7 kB
# 🗺️ Roadmap - Evolution API MCP Server Plano de melhorias e funcionalidades futuras para o projeto. **Status:** 🟢 Ativo | **Última atualização:** 2025-10-23 --- ## 📊 Visão Geral ### Estado Atual - ✅ Integração HTTP direta funcionando - ✅ Envio de mensagens (texto, mídia) - ✅ Listagem de chats e contatos - ✅ Busca de mensagens - ✅ Cache de nomes em memória - ✅ Performance otimizada (bulk fetch) ### Problemas Conhecidos - 🔴 Duplicação de código (fetch_contacts vs find_contacts) - 🔴 Validações fracas (media_type, URLs) - 🔴 Cache nunca expira - 🟡 Type safety fraca (dict[str, Any]) - 🟡 Error handling genérico - 🟡 Nomenclatura confusa para LLM --- ## 🎯 FASE 1 - Correções Críticas > **Objetivo:** Eliminar problemas que afetam estabilidade e qualidade do código > **Prioridade:** 🔴 ALTA > **Prazo:** Curto prazo (1-2 dias) ### 1.1 Unificar Duplicações - [ ] **Mesclar fetch_contacts() e find_contacts()** - Criar método único: `fetch_contacts(contact_id: str | None = None)` - Remover método duplicado `find_contacts()` - Atualizar chamadas no server.py - [ ] **Simplificar tools de contatos** - Unificar `get_contacts()` e `find_contact()` em um único tool - Manter apenas `get_contacts(contact_id=None, limit=None)` - Atualizar docstrings para clareza **Impacto:** Reduz confusão do LLM, remove código redundante --- ### 1.2 Adicionar Validações Robustas - [ ] **Validar media_type em send_media()** ```python VALID_MEDIA_TYPES = {"image", "video", "document", "audio"} if media_type not in VALID_MEDIA_TYPES: raise ValueError(...) ``` - [ ] **Validar URLs antes de enviar** ```python if not url.startswith(("http://", "https://")): raise ValueError("URL deve começar com http:// ou https://") ``` - [ ] **Validar tamanho de texto** ```python MAX_TEXT_LENGTH = 65536 # 64KB (limite WhatsApp) if len(text) > MAX_TEXT_LENGTH: raise ValueError(f"Texto muito longo: {len(text)} chars") ``` - [ ] **Validar status de presença** - Já implementado em server.py:432 - ✅ Validação no server, falta no client **Impacto:** Evita erros antes de chamar API, melhores mensagens de erro --- ### 1.3 Implementar TTL no Cache - [ ] **Cache com expiração automática** ```python from datetime import datetime, timedelta class EvolutionClient: _cache_ttl = timedelta(minutes=5) _cache_timestamp: datetime | None = None ``` - [ ] **Método para limpar cache manualmente** ```python def clear_cache(self) -> None: """Limpa cache de nomes de contatos.""" self._contact_names_cache.clear() self._cache_timestamp = None ``` - [ ] **Verificação automática de expiração** - Em `_build_contacts_map()`: checar se expirou - Recarregar automaticamente se necessário **Impacto:** Cache atualizado, evita nomes desatualizados --- ## 🔧 FASE 2 - Melhorias de Qualidade > **Objetivo:** Melhorar robustez, type safety e experiência do desenvolvedor > **Prioridade:** 🟡 MÉDIA > **Prazo:** Médio prazo (1-2 semanas) ### 2.1 Type Safety com Pydantic - [ ] **Criar models para dados da API** ```python from pydantic import BaseModel class Contact(BaseModel): remote_jid: str push_name: str | None is_group: bool profile_pic_url: str | None class Chat(BaseModel): remote_jid: str push_name: str | None last_message: dict | None unread_count: int class Message(BaseModel): key: dict message_timestamp: int message: dict push_name: str | None ``` - [ ] **Retornar objetos tipados** ```python def find_chats(...) -> list[Chat]: # Em vez de dict[str, Any] def fetch_contacts(...) -> list[Contact]: ``` - [ ] **Validação automática de respostas** - Parse JSON → Pydantic models - Detecta mudanças na API automaticamente **Impacto:** Autocomplete no IDE, detecta erros em tempo de desenvolvimento --- ### 2.2 Retry Logic e Resilência - [ ] **Adicionar dependência tenacity** ```toml dependencies = [ "tenacity>=8.0.0", ] ``` - [ ] **Implementar retry com backoff** ```python from tenacity import retry, stop_after_attempt, wait_exponential @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10) ) def _make_request(self, ...): ... ``` - [ ] **Retry apenas em erros temporários** - 5xx: Retry (erro do servidor) - 429: Retry com backoff (rate limit) - 4xx: Não retry (erro do cliente) **Impacto:** Mais resiliente a falhas temporárias de rede --- ### 2.3 Segurança em Logs - [ ] **Sanitizar API keys em logs** ```python def _sanitize_error(self, text: str) -> str: """Remove informações sensíveis dos logs.""" sanitized = text.replace(self.api_key, "***APIKEY***") # Remove outros padrões sensíveis return sanitized ``` - [ ] **Níveis de log configuráveis** ```python LOG_LEVEL = os.getenv("EVOLUTION_LOG_LEVEL", "INFO") # DEBUG, INFO, WARNING, ERROR ``` - [ ] **Não logar payloads sensíveis** - Mensagens de usuários - Números de telefone - Conteúdo de mídias **Impacto:** Segurança, compliance com LGPD/GDPR --- ### 2.4 Melhorar Nomenclatura - [ ] **Renomear tools para clareza** ```python # Antes → Depois get_chat_messages() → get_messages_from_chat() find_messages() → search_messages_globally() ``` - [ ] **Docstrings mais explícitas** - Adicionar seção "When to use this vs X" - Exemplos de casos de uso específicos **Impacto:** LLM escolhe tool correto mais frequentemente --- ## 🚀 FASE 3 - Novas Funcionalidades > **Objetivo:** Expandir capacidades do servidor > **Prioridade:** 🟢 BAIXA > **Prazo:** Longo prazo (1+ mês) ### 3.1 Gerenciamento de Grupos - [ ] **Criar grupo** ```python def create_group(name: str, participants: list[str]) -> dict ``` - [ ] **Adicionar/remover participantes** ```python def add_participant(group_id: str, number: str) -> dict def remove_participant(group_id: str, number: str) -> dict ``` - [ ] **Atualizar informações do grupo** ```python def update_group_info(group_id: str, name: str, description: str) -> dict ``` - [ ] **Listar membros do grupo** ```python def get_group_members(group_id: str) -> list[Contact] ``` **Impacto:** Gerenciar grupos pelo MCP --- ### 3.2 Gestão Avançada de Mensagens - [ ] **Deletar mensagens** ```python def delete_message(message_id: str, for_everyone: bool = False) -> dict ``` - [ ] **Editar mensagens** ```python def edit_message(message_id: str, new_text: str) -> dict ``` - [ ] **Reagir com emoji** ```python def react_to_message(message_id: str, emoji: str) -> dict ``` - [ ] **Marcar como lida** ```python def mark_as_read(chat_id: str) -> dict ``` - [ ] **Encaminhar mensagem** ```python def forward_message(message_id: str, to_number: str) -> dict ``` **Impacto:** Funcionalidades completas de mensageria --- ### 3.3 Upload e Download de Mídias - [ ] **Upload de arquivo local** ```python def upload_media(file_path: str) -> dict: """Upload arquivo local e retorna URL.""" with open(file_path, 'rb') as f: # POST multipart/form-data ... ``` - [ ] **Download de mídia recebida** ```python def download_media(message_id: str, save_path: str) -> str: """Baixa mídia de mensagem recebida.""" ... ``` **Impacto:** Não depende de URLs públicas para enviar mídias --- ### 3.4 Status (Stories) - [ ] **Postar status** ```python def post_status(text: str | None, media_url: str | None) -> dict ``` - [ ] **Ver status de contatos** ```python def get_statuses() -> list[dict] ``` **Impacto:** Gerenciar status pelo MCP --- ## 🧪 FASE 4 - Qualidade e DevOps > **Objetivo:** Garantir qualidade e facilitar manutenção > **Prioridade:** 🟢 BAIXA > **Prazo:** Contínuo ### 4.1 Testes Automatizados - [ ] **Setup pytest** ```bash pip install pytest pytest-cov pytest-mock ``` - [ ] **Testes unitários** ``` tests/ ├── unit/ │ ├── test_client.py │ ├── test_validation.py │ ├── test_cache.py │ └── test_models.py ``` - [ ] **Testes de integração (com mocks)** ``` ├── integration/ │ ├── test_api_mock.py │ └── test_mcp_tools.py ``` - [ ] **Coverage > 80%** ```bash pytest --cov=src/evoapi_mcp --cov-report=html ``` **Impacto:** Confiança em mudanças, menos bugs --- ### 4.2 CI/CD - [ ] **GitHub Actions** ```yaml .github/workflows/test.yml: - Run pytest - Check coverage - Lint with ruff - Type check with mypy ``` - [ ] **Pre-commit hooks** ```yaml .pre-commit-config.yaml: - ruff (linting) - black (formatting) - mypy (type checking) ``` **Impacto:** Qualidade automática, menos erros em produção --- ### 4.3 Documentação Completa - [ ] **README.md detalhado** - Instalação - Configuração - Exemplos de uso - Troubleshooting - FAQ - [ ] **CHANGELOG.md** - Seguir [Keep a Changelog](https://keepachangelog.com/) - Versionamento semântico - [ ] **CONTRIBUTING.md** - Como contribuir - Code of Conduct - Processo de PR - [ ] **API Reference** - Documentação auto-gerada dos tools - Exemplos de cada endpoint **Impacto:** Onboarding mais fácil, menos suporte --- ## 📈 Métricas de Sucesso ### Objetivos Quantitativos - [ ] Cobertura de testes > 80% - [ ] Tempo de resposta < 2s (95th percentile) - [ ] Zero duplicação de código - [ ] 100% dos endpoints validados ### Objetivos Qualitativos - [ ] Type hints em 100% das funções públicas - [ ] Logs sanitizados (sem dados sensíveis) - [ ] Documentação completa - [ ] LLM escolhe tool correto em >95% dos casos --- ## 🤝 Como Contribuir Para implementar um item deste roadmap: 1. Crie uma issue referenciando o item 2. Faça um fork do projeto 3. Implemente a funcionalidade 4. Adicione testes 5. Atualize a documentação 6. Abra um Pull Request --- ## 📝 Notas ### Decisões Técnicas **Por que não usar a lib evolutionapi?** - Biblioteca incompleta (v0.1.2) - API incompatível com endpoints reais - HTTP direto dá mais controle **Por que cache em memória?** - Simples e eficaz para uso de desktop - Não precisa de dependências extras - Limpa automaticamente ao reiniciar **Por que Pydantic?** - Validação automática - Type safety - Boa integração com FastAPI (futuro) --- **Última revisão:** 2025-10-23 **Versão:** 1.0.0

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/PabloBispo/evoapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server