MÓDULO 4.2

🗄️ Consultor de Banco de Dados

Crie um MCP Server que conecta ao SQLite — o modelo consulta e manipula dados em linguagem natural.

6
Tópicos
45
Minutos
Intermediário
Nível
Prático
Tipo
1

🗄️ SQLite e Python

O SQLite é um banco de dados relacional embutido — ele não precisa de um servidor separado rodando, nem de instalação ou configuração. O banco inteiro vive em um único arquivo .db. Python já vem com o módulo sqlite3 na biblioteca padrão, o que significa zero dependências externas. É a escolha perfeita para aprendizado e projetos locais.

💎 Conceito Principal

O SQLite é um banco de dados serverless — diferente do PostgreSQL ou MySQL, ele não roda como um serviço separado. Basta fazer import sqlite3 e usar sqlite3.connect("meu_banco.db") para criar ou abrir um banco. Todas as operações SQL funcionam normalmente: CREATE TABLE, INSERT, SELECT, UPDATE, DELETE. O arquivo .db é portátil — você pode copiar, versionar e compartilhar. Para nosso MCP Server, isso significa que não precisamos configurar nenhuma infraestrutura extra.

📊 Dados e Pesquisa

O SQLite é o banco de dados mais implantado do mundo — está presente em todos os smartphones (Android e iOS usam internamente), em todos os navegadores (Chrome, Firefox, Safari), e em bilhões de dispositivos IoT. Apesar de ser "lite", ele suporta bancos de até 281 terabytes e processa milhões de linhas sem problemas. Para projetos locais e protótipos, é mais que suficiente.

💡 Dica Prática

Para verificar se tudo está funcionando, abra o terminal Python e teste: import sqlite3; conn = sqlite3.connect(":memory:"); print("SQLite OK!"). O :memory: cria um banco temporário na memória — perfeito para testes rápidos. Se rodar sem erro, você já tem tudo que precisa para este módulo.

2

📊 Criando o Banco de Exemplo

Antes de construir as tools MCP, precisamos de um banco de dados com dados de exemplo para consultar. Vamos criar um script Python que inicializa uma tabela de produtos com campos práticos e insere dados realistas. Esse banco será o "playground" que o Claude vai explorar via linguagem natural.

💎 Conceito Principal

A tabela produtos terá 5 colunas: id (INTEGER PRIMARY KEY AUTOINCREMENT), nome (TEXT NOT NULL), preco (REAL NOT NULL), categoria (TEXT NOT NULL) e estoque (INTEGER DEFAULT 0). O SQL de criação: CREATE TABLE IF NOT EXISTS produtos (...). Use IF NOT EXISTS para que o script possa rodar múltiplas vezes sem erro. Insira pelo menos 10 produtos de exemplo com categorias variadas (Eletrônicos, Livros, Roupas, etc.) para que as consultas sejam interessantes.

📋 Passos para criar o banco
Passo 1: Criar o script

Crie um arquivo criar_banco.py que importa sqlite3 e define a função de inicialização do banco com a tabela produtos.

Passo 2: Inserir dados de exemplo

Use INSERT INTO com executemany() para inserir múltiplos produtos de uma vez. Inclua variedade de preços, categorias e quantidades de estoque.

Passo 3: Executar e verificar

Rode o script (python criar_banco.py), verifique que o arquivo .db foi criado e faça um SELECT de teste para confirmar os dados.

💡 Dica Prática

Sempre use conn.commit() após operações de escrita (INSERT, UPDATE, DELETE) e conn.close() ao finalizar. Use o gerenciador de contexto with sqlite3.connect("banco.db") as conn: para garantir que a conexão seja fechada automaticamente mesmo se ocorrer um erro. Isso previne corrupção de dados.

3

🔍 Tool: Consultar Dados

A tool de consulta é o coração do nosso Consultor de Banco de Dados. O usuário descreve o que quer saber em linguagem natural — "quais produtos custam mais de R$50?" — e o Claude traduz isso em uma chamada à tool. A tool recebe uma descrição da consulta, monta o SQL SELECT apropriado e retorna os resultados formatados.

💎 Conceito Principal

A tool consultar(query_descricao: str) recebe uma descrição em linguagem natural do que o usuário quer consultar. Uma abordagem segura é oferecer consultas predefinidas: listar todos os produtos, filtrar por categoria, buscar por faixa de preço, verificar estoque. Para cada tipo de consulta, a tool monta um SQL SELECT seguro com parâmetros. Os resultados são formatados como uma tabela legível com nome, preço, categoria e estoque de cada produto encontrado.

❌ NUNCA fazer
  • Concatenar input do usuário direto no SQL
  • f"SELECT * WHERE nome = '{input}'"
  • Executar SQL arbitrário sem validação
  • Confiar que o modelo sempre gera SQL seguro
✅ Sempre fazer
  • Usar queries parametrizadas com placeholders (?)
  • cursor.execute("SELECT * WHERE nome = ?", (input,))
  • Validar e sanitizar qualquer entrada antes de usar
  • Limitar operações a SELECT (somente leitura)
4

📝 Tool: Inserir e Atualizar

Além de consultar, nosso servidor também vai permitir que o Claude insira novos produtos e atualize dados existentes. Essas tools de escrita precisam de validação rigorosa dos dados antes de executar qualquer operação no banco, e devem sempre confirmar o resultado da operação.

💎 Conceito Principal

A tool inserir_produto(nome: str, preco: float, categoria: str, estoque: int = 0) valida que o preço é positivo e o nome não está vazio, depois executa um INSERT parametrizado. A tool atualizar_produto(id: int, nome: str = None, preco: float = None, categoria: str = None, estoque: int = None) busca o produto pelo ID, atualiza apenas os campos fornecidos e confirma a operação. Ambas usam conn.commit() para persistir as mudanças e retornam uma mensagem clara de sucesso ou erro.

💡 Dica Prática

Sempre valide os dados antes de executar o SQL. Verifique: preço é maior que zero? Nome não está vazio? ID existe no banco? Estoque não é negativo? Essas validações simples evitam dados inconsistentes e retornam mensagens de erro úteis para o Claude apresentar ao usuário, em vez de exceções crípticas do banco de dados.

🚨 Alerta

Operações de escrita no banco (INSERT, UPDATE, DELETE) são irreversíveis após o commit. Diferente do JSON onde você pode facilmente restaurar uma versão anterior, alterações no SQLite são permanentes. Considere implementar um mecanismo de confirmação: a tool primeiro mostra o que vai fazer e só executa quando o usuário confirma. Para projetos de aprendizado isso não é crítico, mas é uma boa prática.

5

🛡️ Segurança: SQL Injection

SQL Injection é uma das vulnerabilidades mais perigosas em aplicações que usam bancos de dados — e em servidores MCP o risco é ainda maior porque o modelo de IA pode inadvertidamente gerar inputs que exploram essa falha. Este tópico é absolutamente crítico: entender e prevenir SQL Injection é obrigatório para qualquer desenvolvedor que trabalhe com bancos de dados.

💎 Conceito Principal

SQL Injection ocorre quando dados fornecidos pelo usuário (ou pelo modelo) são inseridos diretamente em uma string SQL, permitindo que comandos SQL maliciosos sejam executados. Em um MCP Server, o modelo de IA recebe input do usuário e o repassa para as tools — se o modelo enviar algo como "; DROP TABLE produtos; -- como nome de produto, e a tool concatenar isso diretamente no SQL, o resultado é a destruição da tabela inteira. A defesa é simples e absoluta: SEMPRE usar queries parametrizadas com placeholders ?.

🚨 CRÍTICO — Leia com Atenção

NUNCA, em nenhuma circunstância, concatene strings diretamente em queries SQL. Não importa se "parece seguro" ou se "o modelo não enviaria isso" — modelos de IA são imprevisíveis e podem gerar qualquer texto, incluindo payloads de SQL Injection. Um MCP Server com SQL Injection é uma porta aberta para destruição de dados. Sempre use cursor.execute("SELECT * FROM produtos WHERE nome = ?", (nome,)) — o placeholder ? garante que o valor é tratado como dado, nunca como código SQL.

❌ VULNERÁVEL — Nunca faça isso
  • f"SELECT * FROM produtos WHERE nome = '{nome}'"
  • "INSERT INTO produtos VALUES ('" + nome + "')"
  • query = "DELETE WHERE id = " + str(id)
  • Qualquer forma de concatenação de strings com SQL
✅ SEGURO — Sempre faça assim
  • cursor.execute("SELECT * WHERE nome = ?", (nome,))
  • cursor.execute("INSERT INTO ... VALUES (?, ?)", (n, p))
  • cursor.execute("DELETE WHERE id = ?", (id,))
  • Sempre placeholders (?) + tupla de valores
6

🧪 Consultas via Claude

Agora vem a parte mais satisfatória: testar o Consultor de Banco de Dados com perguntas em linguagem natural. O Claude vai traduzir automaticamente os pedidos do usuário em chamadas às tools corretas, e apresentar os resultados de forma clara e amigável. É onde a mágica do MCP realmente brilha.

💎 Conceito Principal

Configure o servidor no Claude Desktop e comece a conversar naturalmente. O Claude analisará cada pedido, decidirá qual tool chamar e com quais parâmetros, executará a consulta no banco e apresentará os resultados em linguagem natural. Você não precisa saber SQL — o modelo faz a tradução para você. Tudo graças ao MCP que conecta a capacidade linguística do modelo à potência do banco de dados.

📋 Cenários de teste sugeridos
Consulta simples

"Quais produtos custam mais de R$50?" — O Claude deve chamar a tool de consulta e formatar a lista de produtos com preço acima de 50.

Inserção de produto

"Adicione um produto chamado 'Teclado Mecânico' na categoria Eletrônicos, custando R$299,90 com 15 unidades em estoque." — Deve chamar inserir_produto.

Consulta agregada

"Qual o estoque total por categoria?" — O Claude deve consultar os dados e apresentar um resumo agregado por categoria.

Atualização

"Atualize o preço do produto ID 3 para R$89,90." — Deve chamar atualizar_produto com os parâmetros corretos.

💡 Dica Prática

Experimente perguntas cada vez mais complexas para testar os limites do seu servidor: "Qual a média de preço dos produtos da categoria Eletrônicos?", "Quais produtos têm menos de 5 unidades em estoque?", "Compare o preço médio entre categorias". Cada pergunta revelará se suas tools são expressivas o suficiente ou se precisam de mais funcionalidades. Isso é desenvolvimento iterativo na prática.

📝 Resumo do Módulo

  • SQLite é um banco de dados embutido, sem servidor, já incluído no Python — perfeito para projetos MCP locais.
  • Criamos um banco de exemplo com tabela de produtos contendo dados variados para consultas interessantes.
  • Implementamos tools de consulta que traduzem linguagem natural em queries SQL seguras.
  • Adicionamos tools de inserção e atualização com validação de dados antes da escrita.
  • Aprendemos sobre SQL Injection e a importância absoluta de usar queries parametrizadas com placeholders (?).
  • Testamos o servidor completo com consultas em linguagem natural via Claude Desktop.

Próximo Módulo: 4.3 — Assistente de Arquivos