Nestling - Smart Baby Tracker

Sigue las tomas, el sueño, los pañales y los hitos de tu bebé desde tu asistente de IA.

Documentación

nestling-ts

Cliente TypeScript, CLI y servidor MCP para la aplicación de seguimiento de bebés Nestling. Lee y registra datos de sueño, alimentación, pañales y diario desde tu cuenta de Nestling — desde tu terminal, una biblioteca TypeScript/Bun, o mediante un servidor de Model Context Protocol para Claude, ChatGPT y otros asistentes de IA.

Escrituras de solo creación. La API puede registrar nuevas entradas que se sincronizan con tu aplicación. No puede actualizar ni eliminar entradas existentes — tus datos están siempre seguros.

Requisitos

  • Bun 1.3+ — el paquete incluye código fuente TypeScript sin paso de compilación, por lo que debe ejecutarse en Bun (no en Node).
  • Una cuenta de Nestling (iniciar sesión con Google o Apple)
  • Un token de API de Nestling (genera uno desde la aplicación: Configuración → Datos → Token de API)

Instalación

Desde npm:

bun add -g nestling-ts
# provides `nestling` and `nestling-mcp`

# or add it to a project as a library
bun add nestling-ts

Desde un checkout del código fuente:

cd nestling-ts
bun install
bun link          # makes `nestling` available globally

CLI

Inicio rápido

nestling login
# API Token: (from Nestling app → Settings → Data → API Token)
# Timezone: Europe/London
# ✓ Authenticated as you@example.com! Found 1 child(ren).

nestling babies
# • Eloise (id: abc-123)  8 months old

Si no has ejecutado bun link, usa el script del paquete en su lugar:

bun run --cwd /path/to/nestling-ts nestling -- login
bun run --cwd /path/to/nestling-ts nestling -- babies

Comandos

# Sleep
nestling sleep history --days 3
nestling sleep log --start "yesterday 8pm" --end "today 6:30am"
nestling sleep log --start 2026-05-07T20:00:00Z --end 2026-05-08T06:30:00Z

# Feed
nestling feed history --days 2
nestling feed log --at "now" --type Bottle --amount 180
nestling feed log --at "30m ago" --type Breastfeeding --side Left

# Nappy
nestling nappy history --days 2
nestling nappy log --at "5 minutes ago" --type Wet

# Diary
nestling diary history --days 7
nestling diary log --at "today 3pm" --text "First time clapping!" --tags milestone,funny

# Multiple babies
nestling --baby "Eloise" sleep history

Todos los comandos de history admiten --json para salida legible por máquina. La bandera --baby selecciona un niño específico por nombre o ID (por defecto, el primer bebé).

Formatos de hora

Todos los argumentos de tiempo aceptan formatos flexibles y amigables:

FormatoEjemplo
ISO 86012026-05-07T20:00:00Z
Fecha + hora2026-05-07 8pm, 2026-05-07 20:00
Día relativotoday 3pm, yesterday 8:30pm, tomorrow 7am
Solo hora (hoy)3pm, 3:30pm, 15:30
Relativonow, 5 minutes ago, 2 hours ago, 30m ago

Las horas se resuelven usando tu zona horaria configurada (variable de entorno NESTLING_TIMEZONE o timezone en ~/.config/nestling/config.json).

Autenticación

La configuración se almacena en ~/.config/nestling/config.json.

  • Inicio de sesión interactivo: nestling login
  • Variables de entorno (tienen prioridad sobre el archivo de configuración):
    • NESTLING_API_TOKEN
    • NESTLING_TIMEZONE (opcional)

Uso de la biblioteca

import { Nestling } from "nestling-ts";

const client = new Nestling({
  apiToken: process.env.NESTLING_API_TOKEN!,
});

// Authenticate
await client.signIn();

// Account & babies
const user = await client.getUser();
const babies = await client.babies.list();
const baby = await client.babies.get(babies[0].id);

// History (all take a DateRange)
const range = {
  start: new Date("2026-05-01T00:00:00Z"),
  end: new Date("2026-05-08T00:00:00Z"),
};
await client.sleep.list(baby.id, range);
await client.feed.list(baby.id, range);     // breast | bottle | solids | expressing
await client.nappies.list(baby.id, range);  // wet | dirty | both
await client.diary.list(baby.id, range);    // journal entries & milestones

// Log new entries
await client.sleep.create(baby.id, {
  start: "2026-05-07T20:00:00Z",
  end: "2026-05-08T06:30:00Z",
});

await client.feed.create(baby.id, {
  timestamp: "2026-05-07T12:00:00Z",
  type: "Bottle",
  amountMl: 180,
});

await client.nappies.create(baby.id, {
  timestamp: "2026-05-07T14:00:00Z",
  type: "Wet",
});

await client.diary.create(baby.id, {
  timestamp: "2026-05-07T15:00:00Z",
  text: "First time clapping!",
  tags: ["milestone"],
});

await client.close();

Compatibilidad con la nube

nestling-ts mantiene los nombres orientados a la API ergonómicos mientras escribe el modelo de nube compatible con iOS. Por ejemplo, amountMl y durationSeconds son aceptados por client.feed.create(), y luego se almacenan en Supabase como claves de carga útil de alimentación amount y duration. Las cargas útiles de entradas se escriben como JSON en formato de cadena en entries.data para coincidir con la implementación de sincronización actual de iOS.

Al agregar nuevas herramientas o escritores directos de Supabase, sigue el formato de cable canónico de entradas del README raíz. En particular, usa valores de alimentación Breastfeeding, Bottle, Solids, Expressing; valores de pañal Wet, Dirty, Both; y valores de sueño source manual o timer.

Servidor MCP

nestling-ts incluye un servidor MCP como binario nestling-mcp. Envuelve la biblioteca como un conjunto de herramientas MCP que cualquier agente de IA puede llamar — incluidos Claude, ChatGPT y otras interfaces LLM que admiten MCP.

El servidor admite dos modos de transporte:

  • stdio (predeterminado) — para uso local con Claude Desktop, Claude Code, Cursor, etc.
  • HTTP (--http) — transporte remoto Streamable HTTP para conectores personalizados de Claude, conectores personalizados de ChatGPT o cualquier cliente compatible con MCP a través de la red.

Claude Desktop / Claude Code (stdio)

Apunta al checkout del código fuente:

{
  "mcpServers": {
    "nestling": {
      "command": "bun",
      "args": ["run", "nestling-mcp"],
      "cwd": "/absolute/path/to/nestling-ts",
      "env": {
        "NESTLING_API_TOKEN": "your-token-from-nestling-app",
        "NESTLING_TIMEZONE": "Europe/London"
      }
    }
  }
}

Nota: el comando debe ser bun/bunx — no node/npx. El paquete se publica como TypeScript sin procesar, que Bun ejecuta directamente.

Conector personalizado de Claude (MCP remoto / modo HTTP)

Alojado (lo más simple — sin configuración necesaria):

  1. En Claude, ve a Personalizar → Conectores → Agregar conector personalizado (Pro/Max) o pide al propietario de la organización que lo agregue (Team/Enterprise).
  2. Establece URL a https://mcp.nestling-app.com/mcp y haz clic en Agregar.
  3. Claude abre una página de inicio de sesión — pega tu token de API de Nestling → Configuración → Datos → Token de API.
  4. Listo. Claude ahora puede leer y registrar los datos de tu bebé.

Sin ngrok, sin puertos, sin autoalojamiento. Cada usuario se autentica con su propio token mediante OAuth.

Autoalojado:

Ejecuta el servidor MCP en modo HTTP tú mismo:

# Single-user (token from env)
export NESTLING_API_TOKEN="your-token"
bun run nestling-mcp -- --http
# Nestling MCP server (HTTP) listening on http://localhost:8787/mcp

# Multi-user (no env token; each request authenticates via Bearer header)
bun run nestling-mcp -- --http
# Users pass their own token as Authorization: Bearer <token>

Establece un puerto personalizado con PORT=3000 bun run nestling-mcp -- --http.

Para acceso público, coloca el servidor detrás de HTTPS (Cloudflare Tunnel, nginx, etc.) — Claude se conecta desde la nube de Anthropic, por lo que localhost no funcionará.

Conector personalizado de ChatGPT

ChatGPT admite servidores de herramientas MCP como conectores personalizados en GPT Builder. Usa el endpoint alojado o ejecuta el tuyo propio:

  1. Usa la URL alojada o ejecuta bun run nestling-mcp -- --http en un servidor.
  2. En ChatGPT GPT Builder → Acciones → "Agregar acción".
  3. Establece la URL del servidor a tu endpoint /mcp.
  4. Establece la autenticación en Bearer y pega tu token de API de Nestling.
  5. ChatGPT descubrirá las herramientas automáticamente mediante el protocolo MCP.

Herramientas

HerramientaPropósito
get_capabilitiesDescubrimiento: qué fuentes de datos y herramientas están disponibles
get_userPerfil de cuenta (correo electrónico, ID de usuario)
list_babiesLista de bebés (id se pasa a todas las demás herramientas)
get_babyDetalles del bebé (apodo, fecha de nacimiento, etc.)
list_sleepSesiones de sueño para un bebé en un rango de fechas
list_feedsEntradas de alimentación (pecho, biberón, sólidos) en un rango de fechas
list_nappiesEntradas de pañal en un rango de fechas
list_diaryEntradas de diario en un rango de fechas
create_sleepRegistrar una nueva sesión de sueño (hora de inicio + fin)
create_feedRegistrar una nueva alimentación (pecho, biberón, sólidos, extracción)
create_nappyRegistrar un nuevo cambio de pañal
create_diaryRegistrar una nueva entrada de diario

Las herramientas de lectura devuelven datos; las herramientas de escritura crean nuevas entradas (sin actualización ni eliminación).

Envoltura de respuesta

{
  "data": [...],
  "totalResults": 12
}

Envoltura de error

{
  "error": "BabyNotFoundError",
  "message": "Baby not found: abc",
  "category": "not_found",
  "retryable": false,
  "recovery": "Use client.babies.list() (or the list_babies MCP tool) to get valid baby IDs."
}

Seguridad

  • Escrituras de solo creación — la API puede agregar nuevas entradas pero no puede actualizar ni eliminar existentes.
  • Alcance por usuario — se autentica como un usuario regular de Nestling mediante Supabase Auth. La seguridad a nivel de fila garantiza que solo puedas acceder a tus propios bebés y datos (además de los compartidos contigo).
  • Sin claves de servicio — usa la clave anon de Supabase, no una clave de rol de servicio. La clave anon es segura de distribuir; solo habilita acceso protegido por RLS.
  • Remoto local o autoalojado — en modo stdio, las credenciales permanecen en tu máquina. En modo HTTP, cada usuario se autentica por sesión con su propio token Bearer.
  • Aislamiento por usuario — el servidor HTTP crea una sesión autenticada separada por token. Los usuarios solo pueden acceder a sus propios datos mediante RLS de Supabase.
  • Sesiones de corta duración — los JWT de Supabase expiran después de 1 hora y se renuevan automáticamente. Tu token de API de larga duración solo se usa para iniciar la sesión.

Obtención de tu token de API

  1. Abre la aplicación Nestling en tu teléfono.
  2. Ve a Configuración → Datos → Token de API.
  3. Toca Copiar token.
  4. Pega el token en tu configuración de MCP o variables de entorno.

El token está vinculado a tu cuenta. Puedes revocarlo en cualquier momento tocando Token de API nuevamente — generar un nuevo token invalida el anterior.

Referencia de la API

new Nestling(options)

OpciónTipoNotas
apiTokenstringToken de API de la aplicación Nestling

Métodos de lectura

  • client.babies.list() → Baby[]
  • client.babies.get(babyId) → Baby
  • client.sleep.list(babyId, range) → SleepEntry[]
  • client.feed.list(babyId, range) → FeedEntry[]
  • client.nappies.list(babyId, range) → NappyEntry[]
  • client.diary.list(babyId, range) → DiaryEntry[]

Métodos de escritura

  • client.sleep.create(babyId, input) → string (ID de nueva entrada)
  • client.feed.create(babyId, input) → string
  • client.nappies.create(babyId, input) → string
  • client.diary.create(babyId, input) → string

Clases de error

  • NestlingError — clase base con category, retryable, recovery
  • AuthenticationError — credenciales incorrectas o sesión expirada
  • BabyNotFoundError — ID de bebé desconocido
  • InvalidDateRangeError — start >= end, o entrada que no es Date

Desarrollo

bun install
bun link               # register `nestling` and `nestling-mcp` on your PATH
bun test               # run the test suite
bun run lint           # tsc --noEmit
bun run nestling       # run the CLI (e.g. bun run nestling -- babies)
bun run mcp            # start the MCP server locally

Asistentes de voz

Siri

Integrado en la aplicación iOS — no se necesita configuración. Di cosas como:

  • "Registrar pañal en Nestling"
  • "Iniciar sueño en Nestling"
  • "Registrar lactancia en Nestling"
  • "Registrar biberón en Nestling"

Funciona mediante la aplicación Atajos en iOS 16+.

Alexa

El directorio alexa/ contiene una skill de Alexa autoalojada que registra alimentaciones, sueño y pañales por voz. Se ejecuta en tu propia cuenta de AWS como una función Lambda.

Comandos de voz

Lo que quieres hacerDi
Iniciar sueño"Alexa, dile a Nestling que inicie el sueño"
Detener sueño"Alexa, dile a Nestling que detenga el sueño"
Pausar / reanudar sueño"Alexa, dile a Nestling que pause el sueño"
Registrar pañal mojado"Alexa, dile a Nestling que registre un pañal mojado"
Registrar pañal sucio"Alexa, dile a Nestling que registre un pañal sucio"
Registrar pañal mojado y sucio"Alexa, dile a Nestling que registre un pañal mojado y sucio"
Iniciar lactancia"Alexa, dile a Nestling que inicie la lactancia"
Cambiar de lado"Alexa, dile a Nestling que cambie de lado"
Detener lactancia"Alexa, dile a Nestling que detenga la lactancia"
Registrar biberón"Alexa, dile a Nestling que registre un biberón de 120 ml"
Registrar sólidos"Alexa, dile a Nestling que registre batata"
Último sueño"Alexa, pregúntale a Nestling por el último sueño"
Última alimentación"Alexa, pregúntale a Nestling por la última alimentación"
Último pañal"Alexa, pregúntale a Nestling por el último pañal"

Se aceptan tanto pañal como mojado/orina.

Requisitos previos

  • Cuenta de AWS con permisos para implementar pilas de CloudFormation y funciones Lambda
  • Cuenta de desarrollador de Alexa (gratuita)
  • Cuenta de Nestling con al menos un bebé agregado
  • Tu token de API de la aplicación Nestling (Configuración → Datos → Token de API para acceso de IA)
  • Node.js 20+ y npm
  • SAM CLI

Implementación

cd alexa
npm install
npm run build
sam build
sam deploy --guided

SAM solicitará:

ParámetroDescripciónEjemplo
NestlingApiTokenToken de API de la aplicación(cadena base64)
TimezoneZona horaria IANA para horas habladasEurope/London

Después de que la pila se implemente, copia el ARN de Lambda de las salidas.

Conexión a Alexa

  1. Abre la Consola de desarrollador de Alexa
  2. Crea una nueva skill Personalizada (elige alojamiento "Aprovisiona el tuyo propio")
  3. Ve a Crear → Modelo de interacción → Editor JSON
  4. Pega el contenido de alexa/skill/interactionModel.json
  5. En Endpoint, selecciona ARN de AWS Lambda y pega tu ARN de Lambda
  6. Haz clic en Guardar modelo, luego en Crear modelo
  7. Prueba en el simulador de Alexa o en tu dispositivo

Actualización

Después de cambios de código o un nuevo token de API:

cd alexa && npm run build && sam build && sam deploy

Seguridad

  • Tu token de API se almacena como una variable de entorno de Lambda cifrada (NoEcho)
  • Nunca se registra ni se incluye en las respuestas de Alexa
  • Todas las consultas de Supabase pasan por la seguridad a nivel de fila — el token solo puede acceder a tus propios datos

Limitaciones

  • Solo creación. Sin actualización ni eliminación. Las nuevas entradas se sincronizan con la aplicación automáticamente.
  • Solo Bun. El CLI y la biblioteca requieren Bun. La skill de Alexa usa Node.js (implementada como Lambda).

Licencia

MIT