El endpoint remoto de MCP
El servidor MCP es una herramienta de desarrollo: se ejecuta en tu máquina y
guarda una clave de servicio o una clave de API. Un backend desplegado también puede servir
MCP por sí mismo, en /mcp, para las personas que usan tu aplicación. Un asistente que una
de ellas conecta lee y escribe el proyecto como esa persona, y cada llamada se ejecuta
bajo su propia seguridad a nivel de fila.
Está desactivado a menos que lo actives, y ambas variables son obligatorias:
REBASE_MCP_ENABLED=trueREBASE_PUBLIC_URL=https://app.example.com # this deployment's real originSin REBASE_PUBLIC_URL, un secreto JWT o un driver de datos capaz de acotar una consulta
a un solo usuario, el endpoint se niega a montarse y explica por qué en el log de arranque.
Ningún REBASE_ROLE lo activa.
- OAuth, con pantalla de consentimiento. Un cliente encuentra el servidor de autorización
a través de
/.well-known/oauth-protected-resource, se registra a sí mismo (el registro dinámico está activado por defecto;REBASE_MCP_OPEN_REGISTRATION=falselo limita a los clientes que tú registres) y envía a la persona a una pantalla de consentimiento que la autentica mediante tu/auth/loginexistente. A una cuenta con un segundo factor se le pide entonces su código del autenticador o un código de recuperación, a través de las rutas/auth/mfa/challengeexistentes. La pantalla inicia sesión solo con contraseña: quien solo ha usado Google, GitHub o un enlace por correo establece una primero con/auth/forgot-password(el “Olvidé mi contraseña” de tu aplicación), y la pantalla se lo indica. También nombra el host al que se envía el código de autorización, y avisa de que ese host no está verificado: cualquiera puede registrar un cliente con cualquier nombre, así que el host es la parte que una persona puede comprobar. - Ocho herramientas, tres alcances. Los mismos alcances
que usa toda credencial.
data:readofrecelist_collections,describe_collection,query_collection,count_documentsyget_document;data:writeañadecreate_documentyupdate_document;data:deleteañadedelete_document. Un cliente que no pide nada obtienedata:read. Cada uno se acota a una colección:data:read:postslista, describe y leepostsy nada más. Un alcance decide qué herramientas se ofrecen y a qué colecciones llegan, no qué filas: una lista vacía puede ser RLS funcionando, ydata:writesigue sin poder escribir una fila que la persona no podría. - Las concesiones hechas antes de 0.24 conservan su alcance.
mcp:readse lee comodata:read, ymcp:writecomodata:write data:delete, tanto en las concesiones almacenadas como en los tokens ya emitidos. - Una clave de API también sirve.
/mcptambién aceptaAuthorization: Bearer rk_…, para un cliente configurado con una cabecera en lugar de un flujo OAuth. La clave llega a las herramientas que cubren sus alcancesdata:*, actuando como quien corresponda: una clave personal como su propietario, una clave de servicio comoapi-key:<id>. - El vocabulario del SDK, las respuestas de REST. Las herramientas aceptan lo que acepta el SDK —
where({"status": ["==", "paid"]}),orderBy(["created_at", "desc"]o"created_at:desc"),limit,offset,searchStringydatapara una escritura — y leen por la ruta deGET /api/data/<collection>, de modo que una fila vuelve tal como la sirve REST (fechas ISO, unbelongsTocomo su clave foránea, p. ej.authorId) y puede reenviarse en una actualización sin cambios.query_collectionresponde{ data, meta }conmeta.totalymeta.hasMore, ycount_documents{ count }. Como en REST, se rechazan unlimitsuperior a 1000, un argumento no declarado y la edición o eliminación de una fila que está en la papelera (404); poner el campo de soft-delete anullla restaura.deleted: "only"(o"include") enquery_collectionycount_documentslee la papelera, como hace?deleted=en REST, de modo que una fila quedelete_documentenvió a la papelera puede volver a encontrarse para restaurarla. Su descripción le dice al modelo que la eliminación es permanente solo donde la colección no tiene un campo de soft-delete. - El listado nombra las colecciones;
describe_collectionda el esquema de una.list_collectionsresponde elname, eltitley ladescriptionde cada colección, ydescribe_collection { collection }los esquemas OpenAPIrowycreatede esa colección, mássoftDeleteFielddonde las filas van a una papelera. Las descripciones de las herramientas le dicen al modelo que describa una colección antes de escribir en ella. El listado de un proyecto de 200 colecciones ronda los 5k tokens, y cada descripción queda por debajo de 1k; con todos los esquemas en el listado eran unos 150k. - Un token solo para este endpoint. Un token de acceso de MCP es rechazado por
/api/data,/api/adminy el WebSocket, así que conectar un asistente no le entrega una sesión.
Cada petición a /mcp vuelve a leer la cuenta de la persona. Una cuenta eliminada o desactivada,
o un “cerrar sesión en todas partes” o un cambio de contraseña posterior a la emisión del
token, detiene de inmediato a un cliente conectado con un 401. Una degradación de rol se aplica en
su siguiente llamada a una herramienta. Cada renovación hace las mismas comprobaciones y rechaza
una concesión así para siempre. Una sesión de invitado no puede dar su consentimiento en absoluto.
Un límite. Desconectar un cliente (DELETE /api/oauth/grants/:clientId, con la
propia sesión de la persona) revoca sus tokens de actualización al instante, pero un token de acceso
ya emitido sigue funcionando hasta que caduca, dentro de la hora.
Las rutas están en Endpoints y las variables en Configuración.