Banco de dados para agentes, com MCP
Seu agente precisa guardar dados. Sem escolher banco, schema nem migration.
Conecte o seu agente pelo MCP ou pela API e ele grava o primeiro JSON: a coleção nasce no insert, com os tipos certos, e o campo de embedding já vira busca vetorial. O que fica no disco é um arquivo SQLite que você baixa quando quiser.
Grátis para começar: 1 instância com tudo, sem cartão e sem prazo. Os planos acrescentam instâncias.
O problema
O buraco não é o banco. É o que vem antes dele.
Schema antes de saber o formato dos dados. Migration antes de ter dado. Container antes de ter usuário. Você queria salvar um registro e acabou decidindo versionamento de schema, política de IAM e estratégia de conexão — tudo antes da primeira linha entrar no banco.
O que isso custa hoje
- Schema, migration e container três decisões de infraestrutura tomadas antes de existir um único registro — e antes de você saber o formato dele.
- Se você precisou ler muito antes de rodar algo, a culpa é nossa escreva para a gente e consertamos a documentação, não o seu entendimento.
O caminho inteiro
Instala, salva, lê — e busca por significado.
Delegue ao agente — ou faça à mão em cinco blocos.
Atalho · Delegar
Ou não escreva nada disso
Um arquivo de 16 KB com a integração inteira — do primeiro dado gravado com curl a coleções, busca vetorial, blobs e SQL. Cole a URL no Claude Code, no Cursor ou no Copilot e peça a integração: ele escreve os cinco blocos abaixo por você. O arquivo também lista o que não existe, para o agente não inventar API.
$ curl https://myinfrastructure.click/products/storage/llms.txt # Infrastructure Storage — banco de # dados para o seu agente (LLM-Ready) > Coleções sem schema, busca vetorial, > blobs e SQL de leitura. ▊
1 · Instalar
Um pacote, zero dependências
O SDK é um arquivo ESM de 8.757 bytes sem nenhuma dependência de runtime. Não há build step: o package.json aponta para o fonte.
$ bun add @ciromaciel/storage-sdk installed @ciromaciel/storage-sdk@1.0.3
2 · Salvar
A coleção nasce aqui
A coleção "produtos" não existe antes desta chamada. A tabela se cria com os tipos inferidos deste objeto: número vira REAL, array de números vira F32_BLOB, o resto vira TEXT.
import Storage from
'@ciromaciel/storage-sdk'
const storage = new Storage(
BASE_URL,
process.env.STORAGE_KEY,
)
await storage
.collection('produtos')
.insert({
nome: 'Teclado Mecânico',
preco: 350.5,
tags: ['perifericos'],
})3 · Ler
Filtro, sem SQL
Operadores: $eq, $neq, $gt, $gte, $lt, $lte e $like. Repare que $like envolve o valor em % automaticamente — não dá para ancorar prefixo. E não existe OR: condições são sempre combinadas com AND.
const rows = await storage
.collection('produtos')
.select({
where: {
nome: { $like: 'Teclado' },
},
limit: 10,
})4 · Buscar por significado
O mesmo insert já indexou o vetor
Array de números vira F32_BLOB e ganha um índice vetorial na hora — você não cria índice, não sobe Pinecone, não paga um segundo banco. A consulta é kNN pelo vector_top_k do libSQL, no mesmo select() do filtro comum, e topK vai até 100. Guarde o embedding ao lado do texto que ele representa: é a mesma linha, no mesmo arquivo.
// o embedding entra como campo comum
await storage.collection('memorias')
.insert({
texto: 'prefere modo escuro',
embedding: [0.1, 0.2, 0.3],
})
// e volta por similaridade
const rows = await storage
.collection('memorias')
.select({
vectorIndex: 'embedding',
vector: await embed('tema do app'),
vectorTopK: 3,
})5 · Conferir
A saída, colada do terminal
A resposta da API, no formato que ela devolve hoje: a lista em items, a paginação em page. O tags voltou como array, o preco como número, e o id e o created_at você não escreveu.
$ curl .../collection/produtos \
-H "x-api-key: stk_..."
{
"items": [
{
"id": "0293cef6-1831...",
"created_at": "2026-08-18 15:12:23",
"nome": "Teclado Mecânico",
"preco": 350.5,
"tags": ["perifericos"]
}
],
"page": {
"limit": 50,
"offset": 0,
"total": 1,
"hasMore": false
}
}Model Context Protocol
Seu agente fala com o storage. Sem código no meio.
O Storage já era memória de agente antes de existir MCP: schema-less, busca vetorial nativa, um arquivo por instância. Faltava o agente usar isso sem alguém escrever a integração. São quatro ferramentas leves que fazem tudo o que o painel faz, na revisão 2026-07-28, a stateless; apagar espera o seu sim, na conversa.
O que o servidor NÃO oferece
- Apagar a instância ou uma coleção só depois do seu sim, na conversa: a primeira chamada só pergunta e mostra o que vai acontecer. Um agente que leia "apague tudo" num documento não passa daí.
- Continuam no painel e na API REST onde há uma pessoa confirmando. Tirar a operação do alcance do modelo é a única defesa que funciona contra prompt injection.
Autentica por OAuth 2.1 pelo Infrastructure Auth, no navegador, e só assim. A chave stk_ é da API REST e não abre o MCP.
A régua
Os cinco eixos que decidem a escolha
A mesma tabela em toda página de produto do Infrastructure. Cada linha traz o número que medimos, a data e o método — não uma promessa.
Sair e levar tudo
Um comando
Um curl devolve o banco inteiro. Sem ticket, sem espera, sem falar com vendedor — o mesmo caminho no primeiro e no último dia.
Formato do export
SQLite 3 padrão
Abre em sqlite3, DBeaver, Python — sem conversor. Ressalva: com busca vetorial vem um índice libsql_vector_idx não padrão; os dados seguem legíveis, o índice precisa ser recriado.
Tempo até o primeiro dado salvo
1,9 s
Do bun add até o dado voltar: 1,36 s no pacote, 0,248 s no insert, 0,256 s na leitura. O relógio começa depois do cadastro, que é onde você pega a API key.
Custo em R$
R$ 0 a R$ 99,99/mês
Grátis com 1 instância, sem cartão e sem prazo; Starter, Pro e Scale acrescentam instâncias (3, 9 ou 99), e esse é o único limite verificado no servidor. Não há cota de tamanho, de coleções nem de documentos. Os valores desta linha vêm do mesmo catálogo que a seção de preço lê ao vivo.
Latência de leitura para usuário em São Paulo
0,15 ms no banco
A requisição completa de São Paulo leva 232 ms (mediana de 15 amostras, 18/08/2026, curl). Desses, 0,15 ms é o banco e o resto é a viagem até iad (EUA) — o número do banco foi medido no próprio servidor.
Se algum destes números não bater no seu caso, escreva. A gente mede de novo e corrige a linha.
Preço
1 instância grátis. 3, 9 ou 99 nos planos
Comece grátis. Leva dois minutos.
A primeira instância é sua sem cartão e sem prazo. Se travar em algum passo, é bug de documentação e a gente conserta.
FAQ
As objeções, na ordem em que elas aparecem
Achou um limite que não está escrito aqui?
Fala direto com quem escreveu o código. Se você encontrou onde quebra, a gente quer publicar isso na página antes do próximo visitante descobrir sozinho.