{"name":"me.denik/denik","slug":"denik","title":"Denik","description":"Book appointments, check availability, list services and create payment links for a Denik business.","url":"https://mcp.market/server/denik","rating":null,"grade":"C","score":58,"certified":false,"status":"active","category":"finance","tags":["finance"],"presence":{"score":11,"stars":null,"forks":null,"downloads_week":34,"last_push_at":null,"license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":null,"website":"https://denik.me","version":"0.1.0","remotes":[],"packages":[{"registryType":"npm","identifier":"@denik.me/mcp","version":"0.15.2","transport":{"type":"stdio"},"environmentVariables":[{"description":"Denik API key. Admin keys (dk_...) expose the full org toolset; public keys (dnk_pub_...) expose the booking subset for customer-facing chatbots.","isRequired":true,"format":"string","isSecret":true,"name":"DENIK_API_KEY"},{"description":"Denik API origin. Defaults to https://www.denik.me.","format":"string","default":"https://www.denik.me","name":"DENIK_BASE_URL"},{"description":"Per-request timeout in milliseconds. Defaults to 20000.","format":"number","default":"20000","name":"DENIK_TIMEOUT_MS"}]}],"tools":[{"name":"add_agenda_block","description":"Aparta un rato de la agenda para que nadie pueda reservarlo: comida, junta, vacaciones.","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_service_image","description":"Agrega una imagen a la galería de un servicio desde una URL https (por ejemplo una ilustración que acabas de generar). Denik la descarga y la guarda como propia, así que sigue viva aunque el link original caduque. Con `first: true` queda de portada.","write_action":false,"price_micros":0,"input_schema":null},{"name":"adjust_loyalty_points","description":"Suma o RESTA puntos manualmente (positivo suma, negativo resta). Requiere un motivo, que queda en el historial del cliente. Requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null},{"name":"archive_package","description":"Archiva un paquete: deja de venderse, pero los bonos ya comprados siguen siendo válidos. Requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null},{"name":"archive_service","description":"Archiva un servicio (soft delete). Deja de aparecer en listados y landing.","write_action":true,"price_micros":0,"input_schema":null},{"name":"audit_landing_contrast","description":"Mide el contraste real (WCAG) de todos los textos de la landing y devuelve los que no se leen, con el `dataId` para arreglarlos y la clase de color sugerida. Úsalo cuando el usuario diga que algo 'no se ve', 'está en negro sobre negro' o 'no se lee' — y también DESPUÉS de editar, para comprobar tu propio trabajo. Nota: los elementos sobre una imagen o gradiente no se pueden medir sin ver la página","write_action":false,"price_micros":0,"input_schema":null},{"name":"award_loyalty_points","description":"Otorga los puntos de una cita al cliente. Por defecto usa los puntos que el dueño configuró en el servicio — no inventes la cifra salvo que te la digan. Es idempotente por cita: llamarlo dos veces no duplica.","write_action":false,"price_micros":0,"input_schema":null},{"name":"cancel_event","description":"Cancela una cita (borra Meet/Zoom, jobs, marca CANCELLED).","write_action":true,"price_micros":0,"input_schema":null},{"name":"consume_package_session","description":"Descuenta una sesión del bono de un cliente. Requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_booking","description":"Agenda una cita para el visitante. Servicio gratuito → crea reserva tentativa y envía email de confirmación al cliente (status: 'pending_confirmation'). Servicio de pago → NO agenda, devuelve `checkoutUrl` para que el visitante pague en la landing (status: 'paid_service'). Si el slot ya está ocupado devuelve error 'slot already taken'.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_branch","description":"Crea una sucursal. Hereda automáticamente todo el catálogo de servicios.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_customer","description":"Da de alta un cliente nuevo en la org. Si ya existe uno con ese email, devuelve el existente.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_event","description":"Agenda una cita manual. Requiere serviceId, customerId, start ISO.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_loyalty_level","description":"Crea un nivel del programa (a partir de X puntos, Y% de descuento).","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_loyalty_reward","description":"Crea una recompensa canjeable. `type`: discount_percent (value = %), discount_fixed (value = pesos) o free_service.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_package","description":"Crea un paquete (bono) para vender. `items` es la lista de servicios incluidos con su cantidad de sesiones. La respuesta trae los items EFECTIVAMENTE guardados y `requestedItems` con cuántos se pidieron: si no coinciden, algún servicio no era de este negocio o estaba archivado — dilo en vez de dar por hecho que se guardaron todos.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_payment_link","description":"Genera el LINK DE PAGO real (MercadoPago) para un servicio de pago en un horario concreto, y devuelve `checkoutUrl` para mandárselo al visitante en el chat. Úsalo en vez de create_booking cuando el servicio cobra en línea: create_booking sólo devuelve el link de la landing y obliga al visitante a repetir ahí la elección de fecha. Devuelve `amount` (lo que se cobra ahora: total o anticipo) y `balan","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_service","description":"Crea un servicio nuevo. Solo `name` es requerido; el resto usa defaults sensatos (MXN, 30min, INPLACE, videoProvider auto, isActive false). Genera slug único automáticamente.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_branch","description":"Elimina una sucursal definitivamente. La sede principal no se puede eliminar. Antes de proponerlo, considera apagarla con toggle_branch_active: casi siempre es lo que el dueño quiere. Requiere aprobación.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_loyalty_level","description":"Elimina un nivel del programa. Los clientes que estaban en él pasan al inmediato inferior. Requiere aprobación.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_loyalty_reward","description":"Elimina una recompensa. Si ya tiene canjes no se puede eliminar: en ese caso desactívala con update_loyalty_reward (isActive: false). Requiere aprobación.","write_action":true,"price_micros":0,"input_schema":null},{"name":"discover_tools","description":"Busca entre TODAS las herramientas de Denik, incluidas las que no están en tu lista.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_customer","description":"Busca clientes por nombre, email o teléfono. Hasta 20 resultados.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_availability","description":"Devuelve los slots libres (formato 'HH:MM' en la zona horaria del negocio) para un servicio en una fecha dada. Filtra slots ocupados y pasados. Úsalo para proponer horarios concretos al visitante.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_customer","description":"Devuelve el detalle completo de un cliente por ID (displayName, email, tel, notes).","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_customer_appointments","description":"Historial de citas de un cliente (últimas 50, más recientes primero).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_customer_loyalty","description":"Puntos, nivel actual e historial de un cliente. Úsalo antes de canjear: si no le alcanza, el canje falla.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_customer_packages","description":"Bonos que compró un cliente, con el saldo de sesiones que le queda de cada servicio y cuándo vencen. Úsalo antes de descontar una sesión.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_customer_points","description":"Puntos de lealtad acumulados de un cliente (cálculo en vivo sobre citas asistidas).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_event","description":"Devuelve el detalle de una cita por ID (incluye customer, service, meetingLink).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_landing","description":"Devuelve las secciones actuales de la landing de la org (id, label, tipo, preview). Útil antes de editar.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_landing_outline","description":"Devuelve el ÁRBOL de elementos de una sección: cada uno con su `dataId`, tag, clases de color/tipografía y su texto. Es el mapa que necesitas para editar con `update_landing_node`. PÍDELO SIEMPRE antes de un ajuste puntual, y vuelve a pedirlo si una edición falla con 'not_found' o 'section_changed'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_loyalty_overview","description":"Resumen del programa de lealtad: si está activo, cuántos puntos circulan y cuántos canjes hay. Empieza por aquí antes de operar puntos — si `loyaltyEnabled` es false, dar puntos no hace nada.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_org","description":"Devuelve datos básicos de la org del agente (name, slug, description, email, tel, address, timezone, logo, weekDays, landingPublished).","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_org_stats","description":"Estadísticas de la org en un rango custom (from/to ISO).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_sales","description":"Cuánto DINERO entró en un rango: total, desglose por servicio, por método de pago y saldos pendientes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_sales_detail","description":"Los cobros uno por uno de un rango (quién, cuánto, cómo pagó, qué día). Para cuando el dueño pregunta de dónde salió un total.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_service_branches","description":"En qué sucursales se ofrece un servicio, con los precios especiales por sede (null = hereda el precio del servicio). Léelo SIEMPRE antes de set_service_branches, que reemplaza la lista completa.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_service_notifications","description":"Qué avisos manda un servicio y por qué canal: comprobante al agendar, petición de confirmación, recordatorio, cancelación y encuesta, cada uno por correo y/o WhatsApp.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_service_public_url","description":"Devuelve el link público de booking de un servicio para compartir.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_today_summary","description":"Resumen del día: total de citas, confirmadas, canceladas, no-shows, ingresos. La tool 'estrella' del grupo.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_branches","description":"Sucursales del negocio: nombre, dirección, horario, si está activa y cuál es la sede principal.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_customers","description":"Lista los clientes de la org paginado (primeros 20 por default, orden alfabético). Útil para dar overview cuando el usuario pregunta '¿qué clientes tengo?' sin especificar. Retorna {total, hasMore, customers}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_events","description":"Lista citas del negocio. Útil para '¿qué tengo hoy?', '¿qué hay mañana?'. Acepta rango de fechas ISO y filtros.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_loyalty_levels","description":"Niveles del programa (nombre, puntos mínimos, % de descuento).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_loyalty_rewards","description":"Recompensas canjeables: nombre, cuántos puntos cuesta cada una y si está activa.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_packages","description":"Paquetes (bonos) que vende el negocio: nombre, precio, qué servicios incluye y cuántas sesiones de cada uno.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_services","description":"Lista los servicios activos del negocio: nombre, slug, descripción, precio, duración en minutos, modalidad y `bookingUrl` (link público para reservar). Úsalo para entender qué ofrece el negocio y para compartir links cuando el visitante prefiera completar la reserva en la página.","write_action":false,"price_micros":0,"input_schema":null},{"name":"manage_own_booking","description":"Permite al visitante gestionar SUS PROPIAS citas (reagendar o cancelar). Pide su email y este tool le ENVÍA POR CORREO el enlace de gestión de cada cita próxima. NO devuelve los enlaces en el chat ni revela si el correo tiene citas (respuesta genérica) — la verificación de propiedad es el correo mismo. Úsalo cuando el visitante quiera cambiar o cancelar una cita; dile que revise su correo.","write_action":false,"price_micros":0,"input_schema":null},{"name":"mark_attendance","description":"Marca si el cliente asistió a la cita (true/false) o limpia (null).","write_action":false,"price_micros":0,"input_schema":null},{"name":"redeem_loyalty_reward","description":"Canjea una recompensa: descuenta los puntos y genera un código para el cliente. Requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_agenda_block","description":"Libera un bloqueo de agenda. Sólo alcanza bloqueos: un id de cita no hace nada aquí (las citas se cancelan con cancel_event).","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_service_image","description":"Quita una imagen de la galería del servicio por su `key` (ej. 'services/abc123/169...-foto.jpg'). No borra el archivo físico de Tigris.","write_action":true,"price_micros":0,"input_schema":null},{"name":"reorder_service_gallery","description":"Reordena la galería. Debe contener exactamente las mismas keys que la galería actual (solo reorden, no agrega ni quita). El índice [0] es la imagen principal.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reschedule_event","description":"Mueve una cita a un nuevo horario. Si no se pasa `end`, mantiene la duración original.","write_action":false,"price_micros":0,"input_schema":null},{"name":"restore_package_session","description":"Devuelve una sesión al bono (por ejemplo si se canceló la cita que la consumió).","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_tool","description":"Ejecuta cualquier herramienta de Denik por su nombre, esté o no en tu lista.","write_action":true,"price_micros":0,"input_schema":null},{"name":"sell_package","description":"Registra la VENTA de un bono cobrado en el establecimiento (efectivo, transferencia o terminal). No cobra nada: sólo deja constancia de que ya se pagó y acredita las sesiones al cliente. El monto por defecto es el de catálogo; indica `amountPaid` sólo si se cobró distinto. Requiere aprobación del dueño. Si ya se registró hoy esa misma venta, se bloquea — vuelve a intentarlo con `allowDuplicate` só","write_action":false,"price_micros":0,"input_schema":null},{"name":"send_appointment_reminder","description":"Envía email de recordatorio manual al cliente de una cita.","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_service_branches","description":"Define en qué sucursales se ofrece un servicio. REEMPLAZA la lista completa: las sedes que no incluyas dejarán de ofrecerlo. Lee get_service_branches primero. Requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null},{"name":"settle_event_balance","description":"Registra el cobro del SALDO pendiente de una cita que se reservó con anticipo. Sólo métodos de mostrador (cash|transfer|card): no genera un link de pago. El monto que falta ya está en la cita (`balanceDue` de get_event), no se especifica aquí. Entra al corte de caja del día de HOY, no al día de la reserva. Requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null},{"name":"toggle_branch_active","description":"Prende o apaga una sucursal (alterna el estado actual). Apagada deja de aparecer en la página de reservas. La sede principal no se puede apagar. Requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null},{"name":"toggle_loyalty_program","description":"Prende o apaga el programa de lealtad completo. Apagarlo esconde los puntos que los clientes ya acumularon (no los borra) y requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null},{"name":"toggle_service_active","description":"Activa/desactiva un servicio. Si se pasa `isActive` lo fuerza; sin arg hace flip.","write_action":false,"price_micros":0,"input_schema":null},{"name":"unarchive_service","description":"Restaura un servicio archivado.","write_action":false,"price_micros":0,"input_schema":null},{"name":"unpublish_landing","description":"Despublica la landing (la quita del sitio público). Úsalo solo si algo salió mal; los cambios normales preservan el estado.","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_branch","description":"Edita los datos de una sucursal.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_customer","description":"Actualiza datos de un cliente existente. Pasa solo los campos a cambiar. Si se cambia el email y colisiona con otro cliente de la org devuelve 409.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_event","description":"Actualiza campos seguros de una cita (notas, pagado, método de pago, título, status). Para cambiar horario usa reschedule_event; para cancelar usa cancel_event.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_landing_node","description":"Edita UN elemento concreto de la landing (un título, un párrafo, un botón) dejando TODO lo demás intacto. Ésta es la forma correcta de hacer cualquier ajuste puntual: color, texto, tamaño, espaciado. Flujo: `get_landing_outline` para obtener el `dataId` → `update_landing_node` → LEE la respuesta. La respuesta trae `remainingIssues` (problemas de contraste que quedan) y `autoFixed`; repórtale al us","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_landing_section","description":"REESCRIBE UNA SECCIÓN COMPLETA con una instrucción en lenguaje natural (ej: 'añade testimonios', 'hazla más formal'). ⚠️ Regenera toda la sección, así que puede revertir ajustes que hiciste antes. Para cambiar un color, un texto o un espaciado usa `update_landing_node`, que sólo toca ese elemento. Preserva el estado de publicación actual.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_loyalty_level","description":"Edita un nivel del programa de lealtad.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_loyalty_reward","description":"Edita una recompensa (nombre, costo en puntos, si está activa).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_org","description":"Actualiza información del negocio. Whitelist: name, description, email, tel, address, timezone, logo, weekDays. weekDays usa keys en INGLÉS (monday..sunday).","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_package","description":"Edita un paquete. Tocar el precio o los servicios incluidos requiere aprobación del dueño (cambia lo que se le cobra a quien lo compre). También DESARCHIVA: manda `archived: false`. Cambiar la vigencia aquí sólo afecta a las compras futuras — para mover la de un bono ya vendido usa extend_package_expiry.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_service","description":"Actualiza campos de un servicio existente. Pasa solo los campos a cambiar. Cambiar el nombre NO regenera el slug: para cambiar la dirección web hay que mandar `slug` explícito, y eso requiere aprobación del dueño porque rompe los links ya compartidos.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_service_hours","description":"Actualiza horarios (weekDays) de un servicio. Keys en INGLÉS: monday..sunday. Cada día es un arreglo de RANGOS, y cada rango es una TUPLA [\"HH:MM\",\"HH:MM\"] en 24 horas (no un objeto). Un día ausente o en null = cerrado. Opcionalmente `duration` en minutos.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_service_notifications","description":"Prende o apaga avisos de un servicio. Sólo cambia lo que mandes: lo que omitas se queda como está.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_service_payment","description":"Define en qué momento paga el cliente. Opciones: `on_booking` (paga todo para poder reservar),","write_action":true,"price_micros":0,"input_schema":null},{"name":"use_loyalty_code","description":"Marca un código de canje como usado (cuando el cliente lo presenta en el mostrador). Requiere aprobación del dueño.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":58,"grade":"C","scanned_at":"2026-09-19T20:14:53.694Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T20:14:53.665Z","components":{"code":{"score":25,"max":25,"notes":["17 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"packages":[{"registryType":"npm","identifier":"@denik.me/mcp","version":"0.15.2","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-09-19T16:57:15.065Z","weeklyDownloads":34}],"repo":{"found":false},"icon":{"url":"https://www.denik.me/icons/512x512.png","source":"registry","width":512,"height":512},"presence":{"stars":null,"forks":null,"downloadsWeek":34,"license":"MIT","lastPushAt":null,"score":11}}}},"grade_history":[],"reviews":[]}