Crie um MCP Server que conecta ao SQLite — o modelo consulta e manipula dados em linguagem natural.
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.
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.
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.
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.
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.
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.
Crie um arquivo criar_banco.py que importa sqlite3 e define a função de inicialização do banco com a tabela produtos.
Use INSERT INTO com executemany() para inserir múltiplos produtos de uma vez. Inclua variedade de preços, categorias e quantidades de estoque.
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.
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.
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.
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.
f"SELECT * WHERE nome = '{input}'"cursor.execute("SELECT * WHERE nome = ?", (input,))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.
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.
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.
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.
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.
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 ?.
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.
f"SELECT * FROM produtos WHERE nome = '{nome}'""INSERT INTO produtos VALUES ('" + nome + "')"query = "DELETE WHERE id = " + str(id)cursor.execute("SELECT * WHERE nome = ?", (nome,))cursor.execute("INSERT INTO ... VALUES (?, ?)", (n, p))cursor.execute("DELETE WHERE id = ?", (id,))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.
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.
"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.
"Adicione um produto chamado 'Teclado Mecânico' na categoria Eletrônicos, custando R$299,90 com 15 unidades em estoque." — Deve chamar inserir_produto.
"Qual o estoque total por categoria?" — O Claude deve consultar os dados e apresentar um resumo agregado por categoria.
"Atualize o preço do produto ID 3 para R$89,90." — Deve chamar atualizar_produto com os parâmetros corretos.
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.
Próximo Módulo: 4.3 — Assistente de Arquivos