Skip to main content
Glama
tasks.md11.3 kB
# Tarefas de Implementação do Servidor MCP Este ficheiro detalha as tarefas passo-a-passo para a implementação do servidor MCP, destinado a ser seguido por uma IA. Assume-se o uso de Python e FastAPI conforme definido no `planning.md`. ## Fase 1: Configuração do Projeto e API Básica 1. **[ ] Criar Estrutura do Projeto:** * Criar diretório raiz do projeto. * Inicializar ambiente virtual Python: `python -m venv venv` * Ativar ambiente virtual: `source venv/bin/activate` (Linux/macOS) ou `venv\Scripts\activate` (Windows). 2. **[ ] Instalar Dependências Iniciais:** * `pip install fastapi uvicorn[standard] python-dotenv` * Criar `requirements.txt`: `pip freeze > requirements.txt` 3. **[ ] Criar Ficheiro Principal da API (`main.py`):** * Importar `FastAPI`. * Instanciar a app: `app = FastAPI()` * Criar um endpoint de health check `/health`: ```python @app.get("/health") async def health_check(): return {"status": "ok"} ``` 4. **[ ] Definir Endpoint Principal (`/generate_mcp`):** * Criar um endpoint `GET /generate_mcp`: ```python from fastapi import Query, HTTPException @app.get("/generate_mcp") async def generate_mcp_endpoint(topic: str = Query(..., min_length=3)): # Placeholder: Retornar dados estáticos por agora print(f"Received request for topic: {topic}") # TODO: Implementar lógica de geração # Temporariamente, retornar uma resposta simples ou o JSON exemplo (hardcoded) return {"message": "MCP generation in progress for topic", "topic": topic} ``` 5. **[ ] Configurar Uvicorn para Execução Local:** * Executar o servidor localmente: `uvicorn main:app --reload` * Testar os endpoints `/health` e `/generate_mcp?topic=teste` no browser ou com `curl`. 6. **[ ] Definir Modelos Pydantic (Schema JSON):** * Criar um ficheiro `schemas.py`. * Definir modelos Pydantic que espelhem **exatamente** a estrutura JSON fornecida no pedido inicial (incluindo `MCP`, `Node`, `Resource`, `Metadata`, `Quiz`, `Question`, etc.). Aninhar os modelos conforme necessário. * Atualizar o endpoint `/generate_mcp` para usar o modelo `MCP` como `response_model`. ## Fase 2: Implementação do Content Sourcing Module 1. **[ ] Criar Módulo `content_sourcing.py`:** * Criar um ficheiro `content_sourcing.py`. * Definir uma função principal, e.g., `find_resources(topic: str) -> list[schemas.Resource]`. 2. **[ ] Integrar API de Busca (Exemplo: DuckDuckGo):** * Instalar biblioteca: `pip install -U duckduckgo_search` * Implementar função para buscar diferentes tipos de conteúdo usando `ddg` ou similar. Exemplo: ```python from duckduckgo_search import DDGS def search_web(query: str, max_results: int = 5): results = [] with DDGS() as ddgs: for r in ddgs.text(query, max_results=max_results): results.append({"title": r.get('title'), "url": r.get('href')}) # Simplificado return results ``` * Na função `find_resources`, chamar `search_web` com queries variadas (e.g., "`{topic}` tutorial", "`{topic}` documentation", "`{topic}` exercises", "`{topic}` video"). * Mapear os resultados para o modelo `schemas.Resource`, definindo o `type` com base na query ou análise simples da URL/título (e.g., se 'youtube.com' na URL, type='video'). Definir valores default para campos como `duration`, `readTime`, `difficulty`. 3. **[ ] Implementar Web Scraping Básico (Opcional, mas Recomendado):** * Instalar bibliotecas: `pip install requests beautifulsoup4 lxml` * Identificar 1-2 sites *confiáveis* e *estáveis* relevantes para muitos tópicos de programação (e.g., `flutter.dev/docs`, `developer.mozilla.org`). * Criar funções específicas de scraping para esses sites (e.g., `scrape_flutter_docs(topic)`). * Usar `requests` para obter o HTML e `BeautifulSoup` para extrair títulos, links e talvez descrições de secções relevantes. * **Importante:** Incluir `User-Agent` nos headers do `requests`. Respeitar `robots.txt` (requer biblioteca adicional ou verificação manual). Implementar tratamento de erros (timeouts, erros HTTP). * Adicionar os resultados do scraping à lista de recursos encontrados. 4. **[ ] Unificar e Limpar Recursos:** * Na função `find_resources`, agregar resultados de todas as fontes (busca, scraping). * Remover duplicados (baseado na URL). * Limitar o número total de recursos para evitar sobrecarga. * Retornar a lista final de `schemas.Resource`. 5. **[ ] Integrar com API Principal:** * No `main.py`, importar e chamar `content_sourcing.find_resources(topic)` dentro do endpoint `/generate_mcp`. * Por agora, retornar a lista de recursos encontrados como parte da resposta JSON para teste. ## Fase 3: Implementação do Path Generation Module 1. **[ ] Criar Módulo `path_generator.py`:** * Criar um ficheiro `path_generator.py`. * Definir uma função principal, e.g., `generate_learning_path(topic: str, resources: list[schemas.Resource]) -> schemas.MCP`. 2. **[ ] Implementar Lógica de Estruturação (Heurística Simples V1):** * Dentro de `generate_learning_path`: * **Criar Metadados Globais:** Gerar `id` (e.g., `topic.lower().replace(' ', '_')`), `title` (e.g., `f"Fundamentos de {topic.title()}"`), `description`, `metadata` (com valores default/estimados para `difficulty`, `estimatedHours`, `tags`). * **Agrupar Recursos:** Tentar agrupar recursos por palavras-chave no título/descrição (e.g., "introdução", "básico", "widgets", "avançado", "projeto", "exercício", "quiz"). Criar categorias simples. * **Criar Nós (`nodes`):** Para cada categoria/grupo, criar um `schemas.Node`. * Gerar `id` único para cada nó (e.g., `intro_{topic_id}`). * Definir `title` e `description` para o nó. * Atribuir os `resources` correspondentes a este nó. * Definir o `type` do nó (e.g., 'lesson', 'exercise_set', 'project_idea'). Se encontrar recursos tipo 'exercise', pode criar um nó 'lesson' com esses exercícios, ou um nó 'quiz' placeholder. * Definir `state` como 'available' por default. * Definir `visualPosition` com valores placeholder (e.g., `{"x": 0, "y": level, "level": level}`). * **Definir Pré-requisitos (`prerequisites`):** Estabelecer uma sequência linear simples. O nó 2 requer o nó 1, o nó 3 requer o nó 2, etc. O primeiro nó (root) tem `prerequisites` vazio. Atribuir o `id` do primeiro nó ao `rootNodeId` do MCP. * **Gerar Quizzes Placeholder:** Se a lógica identificar um ponto adequado (e.g., após um conjunto de lições), criar um nó do tipo `quiz` com título, descrição, mas sem `questions` detalhadas (lista vazia ou com 1-2 perguntas placeholder). Definir `passingScore` default. * **Gerar Projeto Placeholder:** Adicionar um nó final do tipo `project` se apropriado, com descrição do que se espera. 3. **[ ] Construir Objeto MCP:** * Montar o objeto `schemas.MCP` completo com todos os metadados, `rootNodeId`, e o dicionário `nodes`. * Retornar o objeto `MCP`. 4. **[ ] Integrar com API Principal:** * No `main.py`, após obter os `resources`, chamar `path_generator.generate_learning_path(topic, resources)`. * Retornar o objeto `MCP` resultante como resposta do endpoint `/generate_mcp`. Utilizar `response_model=schemas.MCP` para garantir a formatação correta. ## Fase 4: Refinamento, Tratamento de Erros e Logging 1. **[ ] Implementar Tratamento de Erros:** * No `content_sourcing`: Adicionar `try...except` blocos para falhas de rede, erros de parsing, limites de API. Retornar lista vazia ou levantar exceções customizadas. * No `path_generator`: Lidar com o caso de não haver recursos suficientes para gerar um caminho significativo. * No `main.py`: Usar `try...except` para capturar exceções dos módulos e retornar `HTTPException` do FastAPI com status codes apropriados (e.g., 404 se nenhum recurso encontrado, 500 para erros internos). 2. **[ ] Adicionar Logging Básico:** * Instalar `loguru` (opcional, mas bom): `pip install loguru` * Configurar logging básico no `main.py` para registar pedidos recebidos, tópicos, número de recursos encontrados, e quaisquer erros. 3. **[ ] Limpeza e Comentários:** * Rever todo o código. Adicionar type hints em todas as funções. * Adicionar comentários explicando a lógica complexa, especialmente nas heurísticas de sourcing e path generation. * Garantir que os nomes das variáveis e funções são claros. 4. **[ ] Testar Exaustivamente:** * Testar com vários tópicos (comuns, específicos, obscuros). * Verificar se o JSON de saída é sempre válido e corresponde ao schema. * Testar casos de erro (e.g., tópico muito curto, falha na busca). ## Fase 5: Preparação para Deployment 1. **[ ] Atualizar `requirements.txt`:** * `pip freeze > requirements.txt` 2. **[ ] Configurar Variáveis de Ambiente:** * Se usar API keys, movê-las para um ficheiro `.env`. Usar `python-dotenv` para carregá-las localmente. `pip install python-dotenv`. * No código, aceder às keys via `os.getenv("API_KEY_NAME")`. * **NUNCA** commitar o ficheiro `.env` ou as keys diretamente no código. Adicionar `.env` ao `.gitignore`. 3. **[ ] (Opcional, Recomendado para Fly.io) Criar `Dockerfile`:** * Criar um `Dockerfile` básico para a aplicação Python/FastAPI. Exemplo: ```dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # PORT é geralmente fornecido pelo ambiente de alojamento ENV PORT=8080 EXPOSE 8080 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"] ``` 4. **[ ] Adicionar `Procfile` (Para Heroku/Render sem Docker):** * Criar ficheiro `Procfile` (sem extensão) na raiz: ``` web: uvicorn main:app --host 0.0.0.0 --port $PORT ``` ## Fase 6: Deployment no Provedor Gratuito 1. **[ ] Escolher Provedor:** Selecionar Render.com, Fly.io, ou outro. 2. **[ ] Criar Conta e Configurar Aplicação:** * Seguir a documentação do provedor escolhido para criar um novo "Web Service" (Render) ou "App" (Fly.io). * Ligar ao repositório Git. * Configurar o ambiente (Python, ou Docker se usar Dockerfile). * Definir comandos de build e start (ver Fase 5). * Configurar variáveis de ambiente necessárias (e.g., API keys) na interface do provedor. 3. **[ ] Realizar o Deploy:** Iniciar o processo de build e deploy. 4. **[ ] Testar Endpoint Público:** Aceder à URL fornecida pelo provedor (e.g., `https://<app-name>.onrender.com/generate_mcp?topic=flutter`) e verificar a resposta. 5. **[ ] Monitorizar:** Observar logs e métricas de uso para garantir que se mantém dentro dos limites do free tier.

Latest Blog Posts

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/cabrit0/mcp_server_reuneMacacada'

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