pocketbase-mcp-bridge

Servidor MCP para PocketBase

Documentação

Servidor MCP PocketBase

npm version CI License: MIT Node

Um servidor completo do Model Context Protocol para PocketBase. Ele expõe toda a superfície de gerenciamento do PocketBase — coleções, registros, autenticação, arquivos, logs, configurações, backups e crons — como ferramentas MCP que um assistente de IA (Claude Desktop, Claude Code, Cursor, etc.) pode chamar diretamente.

Construído e validado contra o PocketBase v0.39.6 usando o pocketbase JS SDK oficial.


Recursos

55 ferramentas em todas as partes da API do PocketBase:

ÁreaFerramentas
Saúde e conexãohealth_check, auth_info
Coleções (esquema)list_collections, get_collection, get_collection_scaffolds, create_collection, update_collection, delete_collection, import_collections, truncate_collection
Registros (dados)list_records, get_full_record_list, get_record, get_first_record, create_record, update_record, delete_record, batch
Autenticaçãoauth_with_password, list_auth_methods, impersonate, request_verification, confirm_verification, request_password_reset, confirm_password_reset, request_otp, auth_with_otp, confirm_email_change, list_external_auths, unlink_external_auth
Superusuários (administradores)list_superusers, create_superuser, update_superuser, delete_superuser
Arquivosget_file_url, get_file_token, download_file (+ uploads via create_record/update_record)
Logslist_logs, get_log, get_logs_stats
Configuraçõesget_settings, update_settings, test_s3, test_email, generate_apple_client_secret
Backupslist_backups, create_backup, upload_backup, delete_backup, restore_backup, get_backup_download_url, download_backup
Cronslist_crons, run_cron
Válvula de escapesend_raw_request (chame qualquer endpoint, incluindo rotas de hook personalizadas)

Destaques:

  • Autenticação automática como superusuário a partir de variáveis de ambiente, com reautenticação transparente quando o token expira.
  • Uploads/downloads de arquivos de/para o sistema de arquivos local (multipart tratado para você).
  • Operações em lote transacionais (create/update/delete/upsert) em uma única requisição.
  • Autenticação de usuário não destrutiva — autenticar como usuário final nunca sobrescreve a sessão de superusuário do próprio MCP.
  • send_raw_request garante completude: qualquer coisa que as ferramentas dedicadas não cobrem (rotas personalizadas, novos recursos da API) ainda é acessível.

Configuração

O servidor lê suas configurações de conexão das variáveis de ambiente:

VariávelObrigatóriaDescrição
POCKETBASE_URL✅URL base, ex.: http://localhost:8090. Prefira 127.0.0.1 em vez de localhost para evitar problemas de resolução IPv6.
POCKETBASE_ADMIN_EMAIL✅*E-mail do superusuário.
POCKETBASE_ADMIN_PASSWORD✅*Senha do superusuário.
POCKETBASE_AUTH_COLLECTION–Coleção de autenticação para fazer login (padrão _superusers).
POCKETBASE_TOKEN–Use um token pré-emitido em vez de e-mail/senha.

* Obrigatória a menos que POCKETBASE_TOKEN seja fornecida.

Configuração do cliente MCP

Adicione o servidor ao seu cliente MCP (Claude Desktop claude_desktop_config.json, Claude Code, Cursor, …). A forma recomendada, sem instalação, usa npx:

{
  "mcpServers": {
    "pocketbase": {
      "command": "npx",
      "args": ["-y", "pocketbase-mcp-bridge"],
      "env": {
        "POCKETBASE_URL": "",
        "POCKETBASE_ADMIN_EMAIL": "",
        "POCKETBASE_ADMIN_PASSWORD": ""
      }
    }
  }
}

Preencha os três valores de env com a URL da sua instância e as credenciais de superusuário (mantenha segredos em env, nunca em args). A flag -y permite que os clientes iniciem o servidor de forma não interativa.

Alternativa: executar a partir de um build local (sem npm install)
{
  "mcpServers": {
    "pocketbase": {
      "command": "node",
      "args": ["/absolute/path/to/pocketbase-mcp/dist/index.js"],
      "env": {
        "POCKETBASE_URL": "",
        "POCKETBASE_ADMIN_EMAIL": "",
        "POCKETBASE_ADMIN_PASSWORD": ""
      }
    }
  }
}
Alternativa: executar via Docker
{
  "mcpServers": {
    "pocketbase": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "POCKETBASE_URL",
        "-e", "POCKETBASE_ADMIN_EMAIL",
        "-e", "POCKETBASE_ADMIN_PASSWORD",
        "pocketbase-mcp-bridge"
      ],
      "env": {
        "POCKETBASE_URL": "http://host.docker.internal:8090",
        "POCKETBASE_ADMIN_EMAIL": "",
        "POCKETBASE_ADMIN_PASSWORD": ""
      }
    }
  }
}

Instalação

O pacote publicado funciona prontamente com npx -y pocketbase-mcp-bridge (veja acima) — nenhuma instalação manual é necessária depois que estiver no npm.

Para compilar a partir do código-fonte:

git clone https://github.com/nestebe/pocketbase-mcp.git
cd pocketbase-mcp
npm install
npm run build      # compiles TypeScript to dist/

O ponto de entrada é dist/index.js (um servidor MCP stdio com um shebang #!/usr/bin/env node, também exposto como o binário pocketbase-mcp-bridge).

Imagem Docker

docker build -t pocketbase-mcp-bridge .
docker run -i --rm \
  -e POCKETBASE_URL=http://host.docker.internal:8090 \
  -e POCKETBASE_ADMIN_EMAIL=admin@example.com \
  -e POCKETBASE_ADMIN_PASSWORD=secret \
  pocketbase-mcp-bridge

A imagem é um servidor stdio — execute-a com -i (interativo) para que o cliente MCP possa se comunicar com ele via stdin/stdout.


Instância de teste local (docker-test/)

Um PocketBase pronto para execução é fornecido para desenvolvimento e validação:

docker compose -f docker-test/docker-compose.yml up -d

Parar / redefinir:

docker compose -f docker-test/docker-compose.yml down          # stop
docker compose -f docker-test/docker-compose.yml down -v       # stop + wipe data

A criptografia de configurações está intencionalmente desativada nesta configuração local. Para produção, ative-a com uma chave de 32 caracteres via --encryptionEnv (veja os comentários em docker-test/docker-compose.yml).

Executar os testes de fumaça

Com o contêiner em execução:

node scripts/smoke-test.mjs             # collections, records, batch, settings, logs, crons...
node scripts/smoke-test-files-auth.mjs  # users auth, file upload/download, impersonation, backups

Ambos iniciam o servidor compilado via stdio e exercitam as ferramentas contra a instância ativa.


Notas de uso e pegadinhas

  • O PocketBase 0.23+ removeu os campos implícitos created/updated. Novas coleções base não têm colunas de timestamp, a menos que você as adicione. Para ordenar por data de criação, adicione campos autodate ao criar a coleção:
    { "name": "created", "type": "autodate", "onCreate": true },
    { "name": "updated", "type": "autodate", "onCreate": true, "onUpdate": true }
    
    Dica: chame get_collection_scaffolds para obter um modelo que já os inclui.
  • A API em lote está desativada por padrão. A ferramenta batch retorna "Batch requests are not allowed" até que você a ative: update_settings { "data": { "batch": { "enabled": true } } }.
  • Administradores agora são "superusuários" — uma coleção de autenticação _superusers especial. As ferramentas *_superuser são wrappers de conveniência sobre operações de registro nela.
  • Fluxos dependentes de e-mail (verificação, redefinição de senha, OTP, e-mail de teste) exigem SMTP configurado nas configurações.
  • Filtragem e ordenação usam a sintaxe de expressão do PocketBase, ex.: filter: 'status = "active" && created > "2024-01-01"', sort: '-created,title'. Use expand para incorporar relações inline (ex.: expand: 'author,comments_via_post').

Desenvolvimento

src/
  index.ts          # stdio entry point + eager auth
  server.ts         # builds the McpServer and registers every tool group
  config.ts         # env parsing
  pocketbase.ts     # SDK client singleton, auth, withAuth() retry helper
  util.ts           # tool result / error helpers
  formdata.ts       # multipart body builder for file uploads
  tools/
    health.ts collections.ts records.ts auth.ts superusers.ts
    files.ts logs.ts settings.ts backups.ts crons.ts raw.ts
npm run build     # tsc -> dist/
npm run watch     # tsc --watch
npm run dev       # run from TS via tsx (no build step)

Publicação (mantenedores)

O pacote é distribuído no npm e listado no MCP Registry oficial. Ambos são automatizados por .github/workflows/release.yml, acionados quando você publica uma GitHub Release.

Configuração única

  • Crie um token de acesso Automation (ou granular, leitura+escrita) do npm e adicione-o como segredo do repositório NPM_TOKEN. (Mais tarde você pode migrar para Trusted Publishing / OIDC sem token e remover o segredo.)
  • A etapa do MCP Registry usa GitHub OIDC (id-token: write) — nenhum segredo necessário. Ela publica sob o namespace io.github.nestebe/*, verificado pelo campo mcpName em package.json correspondente ao name em server.json.

Fazer um release

npm version patch          # or minor / major — bumps package.json + creates a git tag
# keep server.json "version" in sync with package.json, then commit it
git push --follow-tags
gh release create v1.0.0 --generate-notes   # publishing the release fires the workflow

O fluxo de trabalho então: compila → npm publish --provenance --access public → publica os metadados server.json no registro.

Publicação manual (sem CI)

npm publish --access public            # npm (must include the mcpName field)
# then, from the repo root:
mcp-publisher login github             # interactive GitHub OAuth (owner of "nestebe")
mcp-publisher publish                  # pushes server.json to registry.modelcontextprotocol.io

Antes de publicar, verifique o tarball e a saúde do pacote:

npm publish --dry-run     # inspect exactly what ships
npx publint               # lint package.json/exports/bin for publish issues

Licença

MIT © Nicolas ESTEBE