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.

llms.txt
$ 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.

bash
$ 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.

index.js
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.

index.js
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.

index.js
// 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.

bash
$ 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.