UNPKG

backend-mcp

Version:

Generador automático de backends con Node.js, Express, Prisma y módulos configurables. Servidor MCP compatible con npx para agentes IA. Soporta PostgreSQL, MySQL, MongoDB y SQLite.

1,375 lines 40.1 kB
{ "openapi": "3.0.0", "info": { "title": "Backend MCP API", "version": "1.0.0", "description": "API completa generada automáticamente por Backend MCP Framework", "contact": { "name": "Backend MCP Support", "email": "support@backend-mcp.com" }, "license": { "name": "MIT", "url": "https://opensource.org/licenses/MIT" } }, "servers": [ { "url": "http://localhost:3000/api/v1", "description": "Servidor de desarrollo" }, { "url": "https://api.example.com/v1", "description": "Servidor de producción" } ], "paths": { "/{entity}": { "get": { "tags": [ "crud" ], "summary": "Get all entities with pagination", "description": "Get all entities with pagination", "operationId": "getEntity", "parameters": [], "responses": { "200": { "description": "Operación exitosa", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SuccessResponse" } } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [] }, "post": { "tags": [ "crud" ], "summary": "Create new entity", "description": "Create new entity", "operationId": "postEntity", "parameters": [], "responses": { "200": { "description": "Operación exitosa", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SuccessResponse" } } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "403": { "$ref": "#/components/responses/Forbidden" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": {}, "example": {} } } } } } }, "/{entity}/{id}": { "get": { "tags": [ "crud" ], "summary": "Get entity by ID", "description": "Get entity by ID", "operationId": "getEntityId", "parameters": [], "responses": { "200": { "description": "Operación exitosa", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SuccessResponse" } } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [] }, "put": { "tags": [ "crud" ], "summary": "Update entity", "description": "Update entity", "operationId": "putEntityId", "parameters": [], "responses": { "200": { "description": "Operación exitosa", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SuccessResponse" } } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "403": { "$ref": "#/components/responses/Forbidden" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": {}, "example": {} } } } } }, "delete": { "tags": [ "crud" ], "summary": "Delete entity", "description": "Delete entity", "operationId": "deleteEntityId", "parameters": [], "responses": { "200": { "description": "Operación exitosa", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SuccessResponse" } } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "403": { "$ref": "#/components/responses/Forbidden" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [ { "bearerAuth": [] } ] } }, "/{entity}/bulk": { "post": { "tags": [ "crud" ], "summary": "Bulk operations", "description": "Bulk operations", "operationId": "postEntityBulk", "parameters": [], "responses": { "200": { "description": "Operación exitosa", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SuccessResponse" } } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "403": { "$ref": "#/components/responses/Forbidden" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": {}, "example": {} } } } } } }, "/auth/login": { "post": { "tags": [ "auth" ], "summary": "Iniciar sesión", "description": "Autentica un usuario con email y contraseña, retornando tokens JWT.\n\nEste endpoint valida las credenciales del usuario y genera tokens de acceso\ny actualización si la autenticación es exitosa.\n\n\n**Notas:**\n- Las contraseñas deben cumplir con la política de seguridad\n- Se aplica rate limiting para prevenir ataques de fuerza bruta\n- Los tokens tienen tiempo de expiración configurable\n\n\n**Casos de uso:**\n- Autenticación de usuarios en aplicaciones web\n- Login en aplicaciones móviles\n- Integración con sistemas de terceros\n\n**Límite de velocidad:** 5 solicitudes por 15 minutes", "operationId": "loginUser", "parameters": [], "responses": { "200": { "description": "Login exitoso", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean", "example": true }, "message": { "type": "string", "example": "Login exitoso" }, "data": { "type": "object", "properties": { "user": { "$ref": "#/components/schemas/User" }, "tokens": { "type": "object", "properties": { "accessToken": { "type": "string", "description": "Token JWT de acceso" }, "refreshToken": { "type": "string", "description": "Token para renovar el acceso" }, "expiresIn": { "type": "integer", "description": "Tiempo de expiración en segundos" } } } } } } }, "examples": { "loginSuccess": { "summary": "Respuesta exitosa de login", "value": { "success": true, "message": "Login exitoso", "data": { "user": { "id": "123e4567-e89b-12d3-a456-426614174000", "email": "juan.perez@ejemplo.com", "name": "Juan Pérez", "role": "employee" }, "tokens": { "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expiresIn": 900 } } } } } } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [], "requestBody": { "required": true, "description": "Credenciales de usuario", "content": { "application/json": { "schema": { "type": "object", "required": [ "email", "password" ], "properties": { "email": { "type": "string", "format": "email", "description": "Email del usuario", "example": "usuario@ejemplo.com" }, "password": { "type": "string", "minLength": 8, "description": "Contraseña del usuario", "example": "MiContraseña123!" }, "rememberMe": { "type": "boolean", "description": "Mantener sesión activa por más tiempo", "default": false } } }, "examples": { "loginRequest": { "summary": "Solicitud de login típica", "value": { "email": "juan.perez@ejemplo.com", "password": "MiContraseña123!", "rememberMe": true } } } } } } } }, "/auth/register": { "post": { "tags": [ "auth" ], "summary": "Registrar nuevo usuario", "description": "Registra un nuevo usuario en el sistema.\n\nCrea una nueva cuenta de usuario con validación de datos y envío\nde email de verificación si está habilitado.\n\n\n**Límite de velocidad:** 3 solicitudes por 10 minutes", "operationId": "registerUser", "parameters": [], "responses": { "200": { "description": "Usuario registrado exitosamente", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean" }, "message": { "type": "string" }, "data": { "type": "object", "properties": { "user": { "$ref": "#/components/schemas/User" }, "emailVerificationSent": { "type": "boolean" } } } } }, "examples": {} } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [], "requestBody": { "required": true, "description": "Datos del nuevo usuario", "content": { "application/json": { "schema": { "type": "object", "required": [ "email", "password", "name" ], "properties": { "email": { "type": "string", "format": "email", "description": "Email único del usuario" }, "password": { "type": "string", "minLength": 8, "description": "Contraseña que cumple políticas de seguridad" }, "name": { "type": "string", "minLength": 2, "maxLength": 100, "description": "Nombre completo del usuario" }, "role": { "type": "string", "enum": [ "employee", "manager" ], "default": "employee", "description": "Rol inicial del usuario" } } }, "examples": {} } } } } }, "/auth/refresh": { "post": { "tags": [ "auth" ], "summary": "Renovar tokens de acceso", "description": "Renueva el token de acceso usando el refresh token.\n\nPermite mantener la sesión activa sin requerir login nuevamente.\n", "operationId": "refreshTokens", "parameters": [], "responses": { "200": { "description": "Tokens renovados exitosamente", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean" }, "data": { "type": "object", "properties": { "accessToken": { "type": "string" }, "refreshToken": { "type": "string" }, "expiresIn": { "type": "integer" } } } } }, "examples": {} } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "403": { "$ref": "#/components/responses/Forbidden" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "refreshToken" ], "properties": { "refreshToken": { "type": "string", "description": "Token de actualización válido" } } }, "examples": {} } } } } }, "/auth/logout": { "post": { "tags": [ "auth" ], "summary": "Cerrar sesión", "description": "Invalida los tokens del usuario y cierra la sesión", "operationId": "logoutUser", "parameters": [], "responses": { "200": { "description": "Sesión cerrada exitosamente", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SuccessResponse" }, "examples": {} } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "403": { "$ref": "#/components/responses/Forbidden" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": {}, "example": {} } } } } } }, "/auth/profile": { "get": { "tags": [ "auth" ], "summary": "Obtener perfil del usuario", "description": "Retorna la información del perfil del usuario autenticado", "operationId": "getUserProfile", "parameters": [], "responses": { "200": { "description": "Perfil del usuario", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean" }, "data": { "$ref": "#/components/schemas/User" } } }, "examples": {} } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "403": { "$ref": "#/components/responses/Forbidden" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [ { "bearerAuth": [] } ] }, "put": { "tags": [ "auth" ], "summary": "Actualizar perfil del usuario", "description": "Actualiza la información del perfil del usuario autenticado", "operationId": "updateUserProfile", "parameters": [], "responses": { "200": { "description": "Perfil actualizado exitosamente", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean" }, "data": { "$ref": "#/components/schemas/User" } } }, "examples": {} } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "403": { "$ref": "#/components/responses/Forbidden" }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "$ref": "#/components/responses/InternalServerError" } }, "security": [ { "bearerAuth": [] } ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "minLength": 2, "maxLength": 100 }, "email": { "type": "string", "format": "email" } } }, "examples": {} } } } } } }, "components": { "schemas": { "Error": { "type": "object", "required": [ "error", "message" ], "properties": { "error": { "type": "string", "description": "Código de error" }, "message": { "type": "string", "description": "Mensaje descriptivo del error" }, "details": { "type": "object", "description": "Detalles adicionales del error" }, "timestamp": { "type": "string", "format": "date-time", "description": "Timestamp del error" }, "path": { "type": "string", "description": "Ruta donde ocurrió el error" } }, "example": { "error": "VALIDATION_ERROR", "message": "Los datos proporcionados no son válidos", "details": { "field": "email", "reason": "Formato de email inválido" }, "timestamp": "2024-01-15T10:30:00Z", "path": "/api/v1/users" } }, "PaginationMeta": { "type": "object", "properties": { "page": { "type": "integer", "minimum": 1, "description": "Página actual" }, "limit": { "type": "integer", "minimum": 1, "maximum": 100, "description": "Elementos por página" }, "total": { "type": "integer", "minimum": 0, "description": "Total de elementos" }, "totalPages": { "type": "integer", "minimum": 0, "description": "Total de páginas" }, "hasNext": { "type": "boolean", "description": "Indica si hay página siguiente" }, "hasPrev": { "type": "boolean", "description": "Indica si hay página anterior" } }, "example": { "page": 1, "limit": 20, "total": 150, "totalPages": 8, "hasNext": true, "hasPrev": false } }, "PaginatedResponse": { "type": "object", "properties": { "data": { "type": "array", "items": {}, "description": "Array de elementos" }, "meta": { "$ref": "#/components/schemas/PaginationMeta" } } }, "SuccessResponse": { "type": "object", "properties": { "success": { "type": "boolean", "example": true }, "message": { "type": "string", "description": "Mensaje de éxito" }, "data": { "type": "object", "description": "Datos de respuesta" } } }, "AuditFields": { "type": "object", "properties": { "createdAt": { "type": "string", "format": "date-time", "description": "Fecha de creación" }, "updatedAt": { "type": "string", "format": "date-time", "description": "Fecha de última actualización" }, "createdBy": { "type": "string", "description": "ID del usuario que creó el registro" }, "updatedBy": { "type": "string", "description": "ID del usuario que actualizó el registro" } } }, "User": { "type": "object", "properties": { "id": { "type": "string", "format": "uuid", "description": "ID único del usuario" }, "email": { "type": "string", "format": "email", "description": "Email del usuario" }, "name": { "type": "string", "description": "Nombre completo del usuario" }, "role": { "type": "string", "enum": [ "admin", "manager", "employee" ], "description": "Rol del usuario" }, "emailVerified": { "type": "boolean", "description": "Indica si el email está verificado" }, "lastLoginAt": { "type": "string", "format": "date-time", "description": "Fecha del último login" }, "createdAt": { "type": "string", "format": "date-time", "description": "Fecha de creación" }, "updatedAt": { "type": "string", "format": "date-time", "description": "Fecha de última actualización" } }, "required": [ "id", "email", "name", "role" ], "example": { "id": "123e4567-e89b-12d3-a456-426614174000", "email": "juan.perez@ejemplo.com", "name": "Juan Pérez", "role": "employee", "emailVerified": true, "lastLoginAt": "2024-01-15T10:30:00Z", "createdAt": "2024-01-10T08:00:00Z", "updatedAt": "2024-01-15T10:30:00Z" } } }, "responses": { "BadRequest": { "description": "Solicitud incorrecta", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" }, "examples": { "validationError": { "summary": "Error de validación", "value": { "error": "VALIDATION_ERROR", "message": "Los datos proporcionados no son válidos", "details": { "field": "email", "reason": "Formato de email inválido" } } } } } } }, "Unauthorized": { "description": "No autorizado", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" }, "example": { "error": "UNAUTHORIZED", "message": "Token de acceso requerido" } } } }, "Forbidden": { "description": "Acceso prohibido", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" }, "example": { "error": "FORBIDDEN", "message": "No tienes permisos para realizar esta acción" } } } }, "NotFound": { "description": "Recurso no encontrado", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" }, "example": { "error": "NOT_FOUND", "message": "El recurso solicitado no existe" } } } }, "InternalServerError": { "description": "Error interno del servidor", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" }, "example": { "error": "INTERNAL_SERVER_ERROR", "message": "Ha ocurrido un error interno del servidor" } } } }, "TooManyRequests": { "description": "Demasiadas solicitudes", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" }, "example": { "error": "RATE_LIMIT_EXCEEDED", "message": "Has excedido el límite de solicitudes por minuto" } } }, "headers": { "X-RateLimit-Limit": { "description": "Límite de solicitudes por ventana de tiempo", "schema": { "type": "integer" } }, "X-RateLimit-Remaining": { "description": "Solicitudes restantes en la ventana actual", "schema": { "type": "integer" } }, "X-RateLimit-Reset": { "description": "Timestamp cuando se reinicia la ventana", "schema": { "type": "integer" } } } } }, "parameters": { "PageParam": { "name": "page", "in": "query", "description": "Número de página (empezando desde 1)", "required": false, "schema": { "type": "integer", "minimum": 1, "default": 1 }, "example": 1 }, "LimitParam": { "name": "limit", "in": "query", "description": "Número de elementos por página", "required": false, "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 20 }, "example": 20 }, "SortParam": { "name": "sort", "in": "query", "description": "Campo por el cual ordenar (prefijo con - para orden descendente)", "required": false, "schema": { "type": "string" }, "examples": { "ascending": { "summary": "Orden ascendente", "value": "createdAt" }, "descending": { "summary": "Orden descendente", "value": "-createdAt" } } }, "SearchParam": { "name": "search", "in": "query", "description": "Término de búsqueda", "required": false, "schema": { "type": "string", "minLength": 1 }, "example": "término de búsqueda" }, "IdParam": { "name": "id", "in": "path", "description": "ID único del recurso", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" }, "example": "123e4567-e89b-12d3-a456-426614174000" } }, "examples": { "UserExample": { "summary": "Ejemplo de usuario", "value": { "id": "123e4567-e89b-12d3-a456-426614174000", "email": "usuario@ejemplo.com", "name": "Juan Pérez", "role": "user", "createdAt": "2024-01-15T10:30:00Z", "updatedAt": "2024-01-15T10:30:00Z" } }, "PaginatedUsersExample": { "summary": "Lista paginada de usuarios", "value": { "data": [ { "id": "123e4567-e89b-12d3-a456-426614174000", "email": "usuario1@ejemplo.com", "name": "Juan Pérez" }, { "id": "456e7890-e89b-12d3-a456-426614174001", "email": "usuario2@ejemplo.com", "name": "María García" } ], "meta": { "page": 1, "limit": 20, "total": 150, "totalPages": 8, "hasNext": true, "hasPrev": false } } } }, "requestBodies": {}, "headers": {}, "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT", "description": "Token JWT para autenticación" }, "apiKey": { "type": "apiKey", "in": "header", "name": "X-API-Key", "description": "API Key para autenticación de servicios" } } }, "tags": [ { "name": "database", "description": "Configuración y gestión de base de datos con Prisma ORM", "externalDocs": { "description": "Documentación del módulo database", "url": "https://docs.backend-mcp.com/modules/database" } }, { "name": "crud", "description": "Endpoints del módulo crud", "externalDocs": { "description": "Documentación del módulo crud", "url": "https://docs.backend-mcp.com/modules/crud" } }, { "name": "auth", "description": "Sistema completo de autenticación JWT con roles y permisos", "externalDocs": { "description": "Documentación del módulo auth", "url": "https://docs.backend-mcp.com/modules/auth" } }, { "name": "cache", "description": "Sistema de caché distribuido con Redis y estrategias avanzadas", "externalDocs": { "description": "Documentación del módulo cache", "url": "https://docs.backend-mcp.com/modules/cache" } }, { "name": "ci", "description": "Sistema completo de CI/CD con GitHub Actions, GitLab CI y pipelines automatizados", "externalDocs": { "description": "Documentación del módulo ci", "url": "https://docs.backend-mcp.com/modules/ci" } }, { "name": "docker", "description": "Containerización completa con Docker y Docker Compose para desarrollo y producción", "externalDocs": { "description": "Documentación del módulo docker", "url": "https://docs.backend-mcp.com/modules/docker" } }, { "name": "email", "description": "Sistema completo de emails con templates, colas y múltiples proveedores", "externalDocs": { "description": "Documentación del módulo email", "url": "https://docs.backend-mcp.com/modules/email" } }, { "name": "logging", "description": "Sistema completo de logging estructurado con Winston y auditoría", "externalDocs": { "description": "Documentación del módulo logging", "url": "https://docs.backend-mcp.com/modules/logging" } }, { "name": "monitoring", "description": "Endpoints del módulo monitoring", "externalDocs": { "description": "Documentación del módulo monitoring", "url": "https://docs.backend-mcp.com/modules/monitoring" } }, { "name": "notifications", "description": "Endpoints del módulo notifications", "externalDocs": { "description": "Documentación del módulo notifications", "url": "https://docs.backend-mcp.com/modules/notifications" } }, { "name": "testing", "description": "Sistema completo de testing con Jest, Supertest y configuraciones para unit, integration y e2e tests", "externalDocs": { "description": "Documentación del módulo testing", "url": "https://docs.backend-mcp.com/modules/testing" } }, { "name": "validation", "description": "Sistema completo de validación con class-validator y esquemas personalizados", "externalDocs": { "description": "Documentación del módulo validation", "url": "https://docs.backend-mcp.com/modules/validation" } }, { "name": "websockets", "description": "Sistema completo de WebSockets para comunicación en tiempo real", "externalDocs": { "description": "Documentación del módulo websockets", "url": "https://docs.backend-mcp.com/modules/websockets" } } ], "externalDocs": { "description": "Documentación completa del framework", "url": "https://docs.backend-mcp.com" } }