Saltar al contenido
01Integración

La superficie primaria es la API REST y el servidor MCP.

No hay panel como camino principal. Envía, consulta, sella y verifica por HTTP o desde un agente que habla MCP. El panel llega después.

POST /v1/messages · MCP · mailack-verify

02Ingesta

POST /v1/messages con Idempotency-Key.

Fija Message-ID y Date, hashea el byte-stream exacto que saldrá por el cable y no reintenta el mismo envío si repites la clave. El cuerpo acepta from, to, subject y html.

POST /v1/messages
curl -X POST https://api.mailack.com/v1/messages \
  -H "Authorization: Bearer $MAILACK_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "noreply@acme.mx",
    "to": "cliente@ejemplo.com",
    "subject": "Estado de cuenta",
    "html": "<p>Tu estado de cuenta está listo.</p>"
  }'
03Consulta y evidencia

Estado, proof bundle y sellado bajo demanda.

Consulta el mensaje, descarga el paquete de prueba (hash, ruta Merkle, constancia) o solicita sellado individual cuando lo necesites.

GET /v1/messages/{id}
curl -s https://api.mailack.com/v1/messages/$MESSAGE_ID \
  -H "Authorization: Bearer $MAILACK_API_KEY"
GET /v1/messages/{id}/proof-bundle
curl -s https://api.mailack.com/v1/messages/$MESSAGE_ID/proof-bundle \
  -H "Authorization: Bearer $MAILACK_API_KEY" \
  -o bundle.json
POST /v1/messages/{id}/seal
curl -X POST https://api.mailack.com/v1/messages/$MESSAGE_ID/seal \
  -H "Authorization: Bearer $MAILACK_API_KEY"
04Verificación offline

Comprueba el bundle sin red.

mailack-verify lee el proof bundle y, opcionalmente, el .eml original. No consulta nuestros servidores.

./bin/mailack-verify
./bin/mailack-verify bundle.json -eml mensaje.eml

Hash canónico

Recalcula el hash del byte-stream del mensaje y lo compara con el del bundle.

Prueba de inclusión Merkle

Recorre la ruta de inclusión (RFC 6962, prefijos 0x00 hoja / 0x01 nodo) hasta la raíz del lote.

Raíz contra la constancia

Contrasta la raíz del árbol con la constancia de conservación NOM-151 emitida por el PSC.
05Servidor MCP

Agentes que envían, consultan, verifican y operan.

mailack-mcp expone tools MCP sobre la misma API: enviar mensajes, leer estado, obtener proof bundles, verificar y aplicar operaciones permitidas (supresión, consulta de eventos).

Añade el servidor al cliente MCP que uses (Claude Desktop, Cursor u otro con soporte stdio). La autenticación va por API key en el entorno del proceso.

mcpServers.mailack
{
  "mcpServers": {
    "mailack": {
      "command": "./bin/mailack-mcp",
      "env": {
        "MAILACK_API_KEY": "mlk_...",
        "MAILACK_API_URL": "https://api.mailack.com"
      }
    }
  }
}
06Servicios

Siete procesos, un contrato de evidencia.

Cada servicio tiene un rol acotado. La entrega no depende del LLM; el sellado no re-serializa el MIME.

mailack-apiREST de ingesta y consulta. Multi-tenant, idempotente.
mailack-sealerVentanas Merkle de 1 h o 10 000 hojas. Sella la raíz con NOM-151.
mailack-opsGovernor determinista por par IP/ISP. Tasas, pausas, failover.
mailack-mcpServidor MCP para agentes de IA.
mailack-dispatcherEntrega SMTP con transcript literal, rate gate y split determinista.
mailack-collectorRecibe DSN y ARF: archiva crudo, parsea, correlaciona VERP.
mailack-verifyCLI de verificación offline del proof bundle.
07Multi-tenant

RLS, supresión y correlación VERP.

PostgreSQL con Row Level Security. Cada tenant solo ve sus filas. Las tablas de trabajo son messages, batches, events, suppressions y access_log.

Supresión global y por tenant

Una dirección puede bloquearse en todo el sistema o solo en tu tenant. El dispatcher respeta ambas capas antes de poner el mensaje en cola.

Correlación VERP

Return-path bounce+<message-uuid>@mailack.com. Cada DSN o ARF se liga al mensaje original sin depender del Message-ID del destino.

Aislamiento por política

RLS en la base; la API key identifica tenant y scope. No hay lecturas cruzadas entre inquilinos en consulta ni en access_log.