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.
985 lines (963 loc) • 29.3 kB
YAML
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.
Este endpoint valida las credenciales del usuario y genera tokens de
acceso
y actualización si la autenticación es exitosa.
**Notas:**
- Las contraseñas deben cumplir con la política de seguridad
- Se aplica rate limiting para prevenir ataques de fuerza bruta
- Los tokens tienen tiempo de expiración configurable
**Casos de uso:**
- Autenticación de usuarios en aplicaciones web
- Login en aplicaciones móviles
- Integración con sistemas de terceros
**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.
Crea una nueva cuenta de usuario con validación de datos y envío
de email de verificación si está habilitado.
**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.
Permite mantener la sesión activa sin requerir login nuevamente.
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