El backend/IA y agentes

40 MCP tools · scoped keys · enforced by Postgres

El permiso de una clave no es una política.

Dale a un agente herramientas reales sobre tus datos — leer, escribir, migrar, desplegar — a través de un servidor MCP al que se conecta con un bloque de configuración.

Y luego quítale la seguridad basada en la confianza. Lo que el agente puede tocar es una clave con alcance, y lo que la base de datos devolverá es seguridad a nivel de fila. Dos puertas, y ninguna es un prompt.

Model Context Protocol

Tu proyecto, como herramientas que un asistente puede llamar

@rebasepro/mcp habla el Model Context Protocol, así que cualquier cosa que hable MCP puede manejar tu backend: consultar y editar datos, empujar cambios de esquema, abrir una rama de base de datos, disparar un cron, seguir el servidor de desarrollo.

Tus definiciones de colección y el esquema de Drizzle generado también se exponen como recursos MCP, así que el asistente lee tu modelo de datos real en vez de deducirlo del código que tenga abierto.

No hay nada que construir ni ningún adaptador que escribir. Es un bloque en un archivo de configuración.

.cursor/mcp.json
// .cursor/mcp.json — or Claude Desktop, Windsurf, Copilot…
{
  "mcpServers": {
    "rebase": {
      "command": "npx",
      "args": ["@rebasepro/mcp"],
      "env": {
        "REBASE_BASE_URL": "https://api.example.com",
        "REBASE_API_TOKEN": "rk_live_…"
      }
    }
  }
}

La superficie de herramientas

40 tools, and these are their real names

No es un diagrama de categorías: es la lista real que registra el servidor. Un agente capaz de llamarlas puede construir y operar una aplicación sin una persona en la ruta de la petición.

Data5
  • list_documents
  • get_document
  • create_document
  • update_document
  • delete_document
Users & roles6
  • list_users
  • create_user
  • update_user
  • delete_user
  • list_roles
  • rebase_auth_reset_password
Schema & database7
  • rebase_schema_generate
  • rebase_schema_introspect
  • rebase_db_push
  • rebase_db_generate
  • rebase_db_migrate
  • rebase_generate_sdk
  • rebase_doctor
Branching4
  • rebase_db_branch_create
  • rebase_db_branch_list
  • rebase_db_branch_info
  • rebase_db_branch_delete
Storage3
  • storage_list_objects
  • storage_get_metadata
  • storage_delete_object
Cron5
  • cron_list_jobs
  • cron_get_job
  • cron_trigger_job
  • cron_get_job_logs
  • cron_toggle_job
Functions1
  • invoke_function
Dev server3
  • rebase_dev_start
  • rebase_dev_logs
  • rebase_dev_stop
Projects6
  • rebase_project_list
  • rebase_project_current
  • rebase_project_switch
  • rebase_project_add
  • rebase_project_remove
  • rebase_project_status

Agentes con privilegio mínimo

Autorización que el agente no puede olvidar

Todo el mundo en esta categoría te dirá que su integración de agentes es segura. La pregunta que merece la pena es qué la aplica — porque si la respuesta es la capa de herramientas, un fallo en esa capa es una brecha. Aquí la capa de herramientas es la primera de dos puertas, y la segunda es la base de datos.

Revoca un scope abajo y mira cómo las mismas cuatro llamadas vuelven rechazadas.

support-agent

The key you hand the agent. Revoke something and watch the session below.

scopes

RLS roles

Scopes decide which calls the key may make; roles decide which rows those calls see. As service alone, Postgres grants it nothing unless a policy names it.

MCP session2 of 4 refused
query_collection{ "collection": "products", "limit": 20 }
API key scopePostgres RLS

200 20 rows · id, title, price, stock

update_document{ "collection": "orders", "id": "8f21", "data": { "status": "refunded" } }
API key scopePostgres RLS

200 1 row updated · orders/8f21

delete_document{ "collection": "orders", "id": "8f21" }
API key scopePostgres RLS

403 SCOPE_MISSING · data:delete:orders

Refused twice: the key has no such scope, and no delete policy on orders names "service", so 0 rows match.

get_document{ "collection": "customers", "id": "c7" }
API key scopePostgres RLS

404 NOT_FOUND · customers/c7

The key holds the scope. Postgres does not agree — customers lets each customer read their own row, and "service" is nobody's.

The two gates are independent, which is the part worth sitting with: grant data:delete:orders above and the call still deletes nothing, because a scope is not a policy — and it comes back 403 rather than reporting a delete that never happened. No prompt, jailbreak or bug in the tool layer widens what the database will return.

Una clave, no una credencial con poderes divinos

Una clave tiene scopes, uno por colección y operación — data:read:orders, data:write:orders — y delete es un scope propio, separado de write: justo el que quieres negarle a un agente.

Qué filas ve es otro ajuste: sus roles. Sin más rol que service, Postgres no le concede absolutamente nada salvo que una de tus políticas nombre ese rol.

La clave se muestra una sola vez. Lo que el servidor guarda es un hash SHA-256, así que un volcado de la tabla de claves no le entrega a nadie una clave funcional — y una clave filtrada se revoca borrando la fila, no rotando un secreto compartido. Cada una lleva su propio límite de tasa y su propia caducidad.

Cómo se generan las policies
POST /api/admin/api-keys
// The key behind that token. Scopes say which calls it may make —
// delete is its own scope — and roles say which rows those calls see.
{
  "name": "support-agent",
  "scopes": [
    "data:read:products",
    "data:read:orders",
    "data:write:orders"
  ],
  "roles": [],
  "expires_at": "2026-12-31"
}

Infraestructura para agentes

Todo lo que un agente necesita para operar

Búsqueda vectorial, claves con alcance, funciones en streaming, realtime y tareas programadas — la superficie operativa sobre la que construyen los agentes, en una ventana en vez de un muro de tarjetas.

agent · what it can reach

A surface an agent can hold

No controllers, no serializers, no migrations to hand-write, and nothing for a model to invent between the schema and the route. The whole contract fits in one context window, and the compiler checks whatever it writes back.

config/collections/orders.ts
export const orders: PostgresCollectionConfig = {
table: "orders",
properties: { total, status, customer },
securityRules: [{ operation: "select", … }],
};
→ REST · typed SDK · RLS policies · admin views
no controllers to reviewfits in one context windowcompiler-checked

MCP es un estándar, así que la lista de cosas que pueden manejar tu backend no la controlamos nosotros: es todo lo que lo hable.

Claude CodeClaude DesktopCursorWindsurfGitHub CopilotCodexGemini CLIZed

Apunta un agente hacia él

Genera un proyecto, añade el bloque de configuración y dale a tu asistente una clave que pueda leer una colección. Es una forma más rápida de averiguar si algo de esto es cierto que leer el resto de esta página.

>pnpm dlx @rebasepro/cli init