UNPKG

@tiflux/mcp

Version:

TiFlux MCP Server - Model Context Protocol integration for Claude Code and other AI clients

429 lines (321 loc) 10.6 kB
# TiFlux MCP Server - AWS Lambda Deployment Guia completo para deploy do TiFlux MCP Server em AWS Lambda com Function URL. ## Arquitetura - **Transport:** Implementação MCP otimizada para Lambda - **Deployment:** AWS Lambda com Function URL - **Multi-tenancy:** Cada cliente passa sua API key via header `x-tiflux-api-key` - **Stateless:** Cada request cria nova instancia do servidor MCP - **Endpoint:** `/mcp` (POST) e `/health` (GET) ### Protocol Implementation O servidor implementa o protocolo MCP (Model Context Protocol) usando o SDK oficial `@modelcontextprotocol/sdk` com uma arquitetura otimizada para AWS Lambda: -**MCP Server SDK**: Usa `@modelcontextprotocol/sdk/server` para handlers MCP -**JSON-RPC 2.0**: Implementação manual otimizada para Lambda stateless -**Protocol Compliance**: Suporte completo a initialize, tools/list, tools/call -**Session Management**: Headers customizados para tracking de sessões ### Por que não usar StreamableHTTPServerTransport? O `StreamableHTTPServerTransport` do SDK MCP é projetado para servidores HTTP stateful de longa duração (long-running servers). Em ambientes serverless como AWS Lambda: -**Stateful sessions**: Transport mantém sessões em memória (incompatível com Lambda) -**SSE (Server-Sent Events)**: Requer conexões persistentes (Lambda timeout 30s) -**Overhead**: Inicialização adicional desnecessária por request Nossa implementação direta é: -**Stateless**: Nova instância por request (ideal para Lambda) -**Eficiente**: Sem overhead de gerenciamento de sessão -**Simple**: Código mais direto e fácil de debugar -**Cost-effective**: Menor tempo de execução = menor custo ### Fluxo de Requisição 1. **Lambda Function URL** recebe requisição HTTP POST 2. **EventParser** extrai e valida API key do header `x-tiflux-api-key` 3. **ServerFactory** cria servidor MCP isolado por request com API key do cliente 4. **MCPHandler** invoca handlers do servidor diretamente (tools/list, tools/call, initialize) 5. Servidor MCP processa requisição usando SDK oficial 6. **ResponseBuilder** formata resposta JSON-RPC 2.0 para Lambda ### Multi-tenancy Cada requisição cria uma instância isolada do servidor MCP configurada com a API key específica do cliente, garantindo: - 🔒 Total isolamento de dados entre organizações - 🔑 Autenticação via API key do TiFlux - 📊 Tracking por session ID - ⚡ Zero compartilhamento de estado entre requests ## Teste Local Antes de fazer deploy, teste localmente! Veja guia completo em [.docs/lambda-local-testing.md](.docs/lambda-local-testing.md) **Quick start:** ```bash # Metodo 1: SAM Local (requer Docker) sam build sam local start-api curl http://localhost:3000/health # Metodo 2: Node.js puro (sem Docker) node test-lambda-local.js ``` ## Pre-requisitos ### 1. Instalar AWS CLI ```bash # macOS brew install awscli # Linux curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install # Verificar instalacao aws --version ``` ### 2. Configurar credenciais AWS ```bash aws configure ``` Fornecer: - AWS Access Key ID - AWS Secret Access Key - Region (ex: us-east-1) - Output format (json) ### 3. Instalar AWS SAM CLI ```bash # macOS brew install aws-sam-cli # Linux wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip unzip aws-sam-cli-linux-x86_64.zip -d sam-installation sudo ./sam-installation/install # Verificar instalacao sam --version ``` ## Deploy ### Passo 1: Build ```bash # Instalar dependencias de producao apenas npm run build:lambda ``` ### Passo 2: Deploy (primeira vez) ```bash # Deploy guiado (primeira vez) sam build sam deploy --guided ``` Responder as perguntas: - **Stack Name:** tiflux-mcp-stack - **AWS Region:** us-east-1 (ou sua preferencia) - **Confirm changes:** Y - **Allow SAM CLI IAM role creation:** Y - **Disable rollback:** N - **Save arguments to configuration file:** Y - **SAM configuration file:** samconfig.toml - **SAM configuration environment:** default ### Passo 3: Deploy (subsequentes) ```bash # Deploy rapido (usa configuracao salva) sam build && sam deploy ``` ### Passo 4: Obter URL do endpoint ```bash # Listar outputs do CloudFormation aws cloudformation describe-stacks \ --stack-name tiflux-mcp-stack \ --query 'Stacks[0].Outputs' ``` Ou no final do deploy, SAM mostra: ``` Outputs: TiFluxMCPFunctionUrl: https://abc123xyz.lambda-url.us-east-1.on.aws/ ``` ## Testes ### 1. Health Check ```bash curl https://[LAMBDA_URL]/health ``` Resposta esperada: ```json { "status": "healthy", "service": "tiflux-mcp", "version": "2.0.0", "timestamp": "2025-10-09T...", "transport": "streamable-http", "deployment": "aws-lambda" } ``` ### 2. List Tools ```bash curl -X POST https://[LAMBDA_URL]/mcp \ -H "Content-Type: application/json" \ -H "x-tiflux-api-key: SUA_API_KEY_TIFLUX" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }' ``` ### 3. Get Ticket ```bash curl -X POST https://[LAMBDA_URL]/mcp \ -H "Content-Type: application/json" \ -H "x-tiflux-api-key: SUA_API_KEY_TIFLUX" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "get_ticket", "arguments": { "ticket_number": "123" } } }' ``` ### 4. Create Ticket ```bash curl -X POST https://[LAMBDA_URL]/mcp \ -H "Content-Type: application/json" \ -H "x-tiflux-api-key: SUA_API_KEY_TIFLUX" \ -d '{ "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "create_ticket", "arguments": { "title": "Teste Lambda", "description": "Ticket criado via Lambda MCP" } } }' ``` ## Configuracao Claude Desktop Editar `claude_desktop_config.json`: ```json { "mcpServers": { "tiflux-lambda": { "command": "npx", "args": [ "-y", "mcp-remote", "https://[LAMBDA_URL]/mcp", "--header", "x-tiflux-api-key:${TIFLUX_API_KEY}" ], "env": { "TIFLUX_API_KEY": "sua_chave_tiflux_aqui" } } } } ``` **Substituir:** - `[LAMBDA_URL]` pela URL real do Lambda - `sua_chave_tiflux_aqui` pela sua API key do TiFlux **Reiniciar Claude Desktop** para aplicar configuracao. ## Monitoramento ### CloudWatch Logs ```bash # Ver logs recentes sam logs -n TiFluxMCPFunction --tail # Ver logs de um periodo especifico sam logs -n TiFluxMCPFunction \ --start-time '10 minutes ago' \ --end-time 'now' ``` ### CloudWatch Console 1. Acessar: https://console.aws.amazon.com/cloudwatch/ 2. Navegar para: Logs > Log groups 3. Buscar: `/aws/lambda/tiflux-mcp-server` ### Metricas Lambda ```bash # Listar metricas disponiveis aws cloudwatch list-metrics \ --namespace AWS/Lambda \ --dimensions Name=FunctionName,Value=tiflux-mcp-server ``` ## Atualizacao ### Atualizar codigo ```bash # 1. Fazer mudancas no codigo # 2. Build e deploy sam build && sam deploy # Sem perguntas (usa config salva) ``` ### Atualizar configuracao ```bash # 1. Editar template.yaml # 2. Deploy com --guided para revisar mudancas sam build && sam deploy --guided ``` ## Troubleshooting ### Erro: "x-tiflux-api-key obrigatorio" **Causa:** Header API key nao enviado ou invalido **Solucao:** Adicionar header `-H "x-tiflux-api-key: SUA_KEY"` nos requests ### Erro: "Token de API invalido ou expirado" **Causa:** API key do TiFlux invalida **Solucao:** Verificar API key em https://app.tiflux.com.br/settings/api ### Lambda timeout **Causa:** Requisicao demora mais de 30s **Solucao:** Aumentar timeout no template.yaml: ```yaml Globals: Function: Timeout: 60 # Aumentar para 60s ``` ### Erro CORS **Causa:** Headers CORS nao configurados **Solucao:** Ja configurado no template.yaml. Verificar browser console. ## Custos Estimados ### AWS Lambda - **Free Tier:** 1M requests + 400,000 GB-s compute/mes - **Apos Free Tier:** ~$0.20 por 1M requests (512MB, 1s media) ### CloudWatch Logs - **Free Tier:** 5GB ingest/mes - **Apos Free Tier:** ~$0.50 por GB ingerido ### Data Transfer - **Estimado:** ~$0.09 por GB transferido **Total estimado (apos free tier):** < $5/mes para uso moderado ## Remover Deployment ```bash # Deletar stack completo sam delete # Confirmar delecao # Isso remove: # - Lambda Function # - Function URL # - IAM Roles # - CloudWatch Log Groups ``` ## Suporte - **Issues:** https://github.com/tiflux/tiflux-mcp/issues - **Email:** dev@tiflux.com - **Documentacao MCP:** https://modelcontextprotocol.io/ ## Arquitetura de Componentes ### Componentes Principais - **[handler.js](src/lambda/handler.js)** - Controlador principal HTTP para Lambda - Roteamento de endpoints (/mcp, /health) - Validação de métodos HTTP - Orquestração de processamento MCP - **[EventParser.js](src/lambda/EventParser.js)** - Parse e validação de eventos Lambda - Extração de API key do header `x-tiflux-api-key` - Normalização de headers (case-insensitive) - Geração de session IDs - Validação de estrutura JSON-RPC - **[ServerFactory.js](src/lambda/ServerFactory.js)** - Factory de servidores MCP - Criação de instâncias isoladas do MCP Server - Injeção de API key nos handlers - Registro de tools do TiFlux - Configuração de handlers (tools/list, tools/call) - **[ResponseBuilder.js](src/lambda/ResponseBuilder.js)** - Formatação de respostas HTTP - Respostas JSON-RPC 2.0 - Headers CORS - Códigos de status HTTP apropriados - Session tracking headers ### Decisões Arquiteturais **Por que implementação manual em vez de StreamableHTTPServerTransport?** 1. **Stateless by design**: Lambda é efêmero, não mantém estado entre requests 2. **Performance**: Sem overhead de inicialização de transport 3. **Simplicidade**: Código direto, fácil de debugar e manter 4. **Custo**: Menor tempo de execução = menor custo AWS 5. **Controle**: Flexibilidade total sobre formato de requisição/resposta Esta abordagem usa o `@modelcontextprotocol/sdk` para os handlers MCP (garantindo compliance com o protocolo), mas implementa a camada HTTP/JSON-RPC diretamente, otimizada para Lambda. ## Proximos Passos 1. ✅ Deploy funcional com arquitetura otimizada para Lambda 2. ⬜ Adicionar autenticacao custom (opcional) 3. ⬜ Configurar custom domain (opcional) 4. ⬜ Implementar rate limiting (opcional) 5. ⬜ Adicionar metricas customizadas (opcional) --- **Versao:** 2.0.0 **Ultima atualizacao:** 2025-10-13