diff --git a/Dockerfile b/Dockerfile index 029d9b4..d6abde9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,8 +23,10 @@ RUN pip install --no-cache-dir -r requirements.txt # Copiar o restante do código COPY . . -# Expor a porta do MkDocs +# Expor as portas do MkDocs e do MCP (SSE) EXPOSE 8000 +EXPOSE 8001 -# Comando padrão: rodar o servidor da Wiki +# Comando padrão: agora roda um pequeno entrypoint que sobe os dois serviços se desejado +# Por padrão, sobe a Wiki. CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"] diff --git a/mcp_server.py b/mcp_server.py index 4f65bfb..e7f7457 100644 --- a/mcp_server.py +++ b/mcp_server.py @@ -1,5 +1,6 @@ import json import os +import argparse from typing import List, Dict from mcp.server.fastmcp import FastMCP @@ -19,32 +20,35 @@ def load_chunks() -> List[Dict]: @mcp.tool() def search_docs(query: str) -> str: """ - Busca informações técnicas na documentação do Fluig por palavras-chave. - Retorna os chunks mais relevantes. + Busca profunda na documentação técnica do Fluig. + Retorna trechos exatos sobre APIs, Eventos, Datasets e Configurações. """ chunks = load_chunks() results = [] query = query.lower() + # Busca com prioridade em títulos for chunk in chunks: - content = chunk.get("content", "").lower() title = chunk.get("metadata", {}).get("title", "").lower() + content = chunk.get("content", "").lower() - if query in content or query in title: + if query in title: + results.insert(0, f"### [ALTA RELEVÂNCIA] {chunk['metadata'].get('title')}\n{chunk['content']}\n---\n") + elif query in content: results.append(f"### {chunk['metadata'].get('title')}\n{chunk['content']}\n---\n") - if len(results) >= 5: # Limita a 5 resultados para não estourar contexto + if len(results) >= 8: # Limite expandido para busca mais rica break if not results: - return f"Nenhuma informação encontrada para: {query}" + return f"Nenhuma informação técnica encontrada para: {query}. Tente termos como 'createDataset', 'hAPI', 'OAuth' ou 'BPM'." return "\n".join(results) @mcp.tool() def get_code_snippets(language: str) -> str: """ - Recupera exemplos de código (snippets) para uma linguagem específica (javascript, java ou sql). + Recupera a biblioteca completa de exemplos de código para Fluig (javascript, java ou sql). """ lang = language.lower() file_map = { @@ -63,15 +67,25 @@ def get_code_snippets(language: str) -> str: with open(path, "r", encoding="utf-8") as f: return f.read() - return f"Arquivo de snippets para {language} não encontrado." + return f"Arquivo de snippets para {language} não encontrado. Certifique-se de que o snippet_generator.py foi executado." @mcp.resource("docs://all_titles") def list_all_titles() -> str: - """Lista todos os títulos de documentos disponíveis na wiki.""" + """Lista todos os temas técnicos disponíveis na base de conhecimento.""" chunks = load_chunks() titles = sorted(list(set(chunk["metadata"].get("title") for chunk in chunks))) return "\n".join(titles) if __name__ == "__main__": - # Rodar o servidor (padrão usa STDIO para integração com Claude/IDEs) - mcp.run() + parser = argparse.ArgumentParser(description="Fluig MCP Server") + parser.add_argument("--mode", choices=["stdio", "sse"], default="stdio", help="Modo de operação (padrão: stdio)") + parser.add_argument("--port", type=int, default=8001, help="Porta para o modo SSE (padrão: 8001)") + + args = parser.parse_args() + + if args.mode == "sse": + print(f"Iniciando servidor MCP em modo SSE na porta {args.port}...") + mcp.run(transport="sse") + else: + # Modo STDIO (padrão para Claude Desktop e integração local) + mcp.run(transport="stdio")