DePix App Gateway

Pasarela de pagos Pix no custodial en Liquid Network. Un agente de IA crea checkouts/productos, lee el estado de las transacciones y gestiona tickets de soporte — 22 herramientas. No custodial: sin fondos, sin claves retenidas.

Documentación

depix-mcp

smithery badge

El servidor MCP (Model Context Protocol) para DePix App — la interfaz orientada a agentes del gateway de pagos Pix↔DePix no custodial y de una billetera Liquid no custodial.

Un MCP, dos niveles de acceso. Mismo paquete, misma entrada de registro; lo que funciona depende solo de si la instancia en ejecución tiene una semilla:

Nivel 1 — alojadoNivel 2 — local
Cómohttps://mcp.depixapp.com/mcp (HTTP transmisible)npx -y @depixapp/mcp (stdio)
Se ejecuta enlos servidores de DePix Apptu propia máquina
Herramientas22 — recibir Pix, lecturas de estado, soporte49 — las 22 más 27 wallet_*
Semillaninguna, nuncala tuya, nunca sale de la máquina
Instalacióncero (claude.ai, ChatGPT)Node.js ≥ 22.4

La custodia la decide quién tiene la semilla, no el transporte. Cada gasto materializa un firmante en proceso, y no hay ruta de firma remota — por lo que DePix App no puede alojar herramientas de billetera funcionales sin volverse custodial, y no lo hace. Eso es física, no un nivel de producto.

Qué es (y qué no es)

Ambos niveles:

  • Un cliente puro de la API pública de DePix (https://api.depixapp.com/api/*) para las 22 herramientas de gateway. No tiene credenciales críticas — sin token de Eulen, sin base de datos, sin HMAC de webhook. Tu clave sk_ se pasa tal cual a la API en cada llamada y vive solo en memoria para esa solicitud.
  • La misma puerta que todos. Sin ruta privilegiada: la misma autenticación, alcances y límites de tasa que cualquier agente externo.

Nivel 1 (mcp.depixapp.com) solamente: nunca firma, nunca tiene fondos, nunca almacena tu clave. No tiene código de billetera en absoluto — el motor de billetera no está simplemente deshabilitado allí, está estructuralmente ausente del grafo de importación de esa implementación, y una guardia de CI (npm run guard:hosted) hace fallar la compilación si eso alguna vez cambia.

Nivel 2 (npx) solamente: las 27 herramientas wallet_* tienen, envían, convierten y pagan — firmando localmente, dentro de tu propio proceso, bajo salvaguardas (topes de BRL por transacción y móviles de 24 horas, lista blanca opcional) que ninguna llamada a herramienta puede elevar. No hay herramienta que exporte la semilla, edite salvaguardas o pague un QR de checkout de comerciante.

Relacionado — @depixapp/sdk

El motor de billetera comenzó como el @depixapp/sdk independiente (aún publicado, aún compatible para uso programático en tu propio código Node). Si lo que quieres es un agente con una billetera, quieres este paquete: @depixapp/mcp ahora integra ese motor y lo expone a través de MCP, así que no hay que escribir nada.

Inicio rápido 1 — Conectar Claude Code (remoto, HTTP)

Pasa tu clave de API de DePix como encabezado Bearer. Comienza siempre con una clave de sandbox.

claude mcp add --transport http depix https://mcp.depixapp.com/mcp \
  --header "Authorization: Bearer sk_test_YOUR_KEY"

Luego prueba la conexión pidiendo a Claude que ejecute get_account. Debería devolver tu comerciante con is_live: false (sandbox).

Cursor — agrega a ~/.cursor/mcp.json (o a un .cursor/mcp.json de proyecto):

{
  "mcpServers": {
    "depix": {
      "url": "https://mcp.depixapp.com/mcp",
      "headers": { "Authorization": "Bearer sk_test_YOUR_KEY" }
    }
  }
}

O usa el enlace profundo de un clic. El marcador de posición de la clave vive DENTRO del valor base64 config=, así que recodifícalo con tu clave real primero:

node -e 'const cfg={url:"https://mcp.depixapp.com/mcp",headers:{Authorization:"Bearer sk_test_YOUR_KEY"}};console.log(Buffer.from(JSON.stringify(cfg)).toString("base64"))'
cursor://anysphere.cursor-deeplink/mcp/install?name=depix&config=<base64 from the command above>

La interfaz web de claude.ai solo admite OAuth en conectores personalizados (sin encabezado personalizado). Este servidor es un Servidor de Recursos OAuth 2.1 (WorkOS AuthKit): el conector web te inicia sesión, y la sesión reenvía tu inicio de sesión verificado a la API como portador. Para operar, primero debes vincular ese inicio de sesión a tu cuenta de DePix (panel → configuración del conector); hasta entonces las herramientas devuelven un mensaje tipado "aún no vinculado". Las sesiones OAuth son solo de lectura + comerciante y nunca pueden mover dinero (wallet_write) — usa una clave sk_ para retiros. Toda la superficie OAuth está controlada por una característica (AUTHKIT_DOMAIN): con ella sin configurar, solo las rutas de encabezado/stdio sk_ anteriores están activas. Los clientes de terminal siguen usando claves sk_.

Inicio rápido 2 — stdio local, 49 herramientas (Claude Desktop / Claude Code / Cursor)

Requiere Node.js ≥ 22.4. El único paquete npm oficial es @depixapp/mcp — el alcance @depixapp es propiedad de la organización; no instales ningún paquete sin alcance con nombre similar. Los secretos provienen del entorno, nunca de una bandera.

2a. Solo gateway (sin billetera)

Exactamente las 22 herramientas del nivel 1, ejecutándose localmente:

{
  "mcpServers": {
    "depix": {
      "command": "npx",
      "args": ["-y", "@depixapp/mcp"],
      "env": { "DEPIX_API_KEY": "sk_test_YOUR_KEY" }
    }
  }
}

Las 49 herramientas siguen listadas — las 27 wallet_* responden con un error tipado wallet_not_configured que le dice al agente que te pida ejecutar init. Eso es deliberado: los hosts de MCP capturan la lista de herramientas cuando se conectan, así que un catálogo que creciera después significaría "reinicia tu cliente".

2b. Primera ejecución — crear la billetera

init es una ceremonia humana en una terminal, nunca una herramienta MCP. Imprime tu respaldo de semilla de 12 palabras, por lo que se niega a ejecutarse cuando stdin/stdout no son una TTY real, y ningún agente puede invocarlo:

npx -y @depixapp/mcp init            # create a new wallet
npx -y @depixapp/mcp init --restore  # import an existing 12-word mnemonic

Pide (o genera) una frase de contraseña — nunca se muestra — te guía a través del ritual de respaldo, y termina imprimiendo el bloque exacto mcpServers para pegar, con la frase de contraseña dejada como marcador de posición para que la completes:

{
  "mcpServers": {
    "depix": {
      "command": "npx",
      "args": ["-y", "@depixapp/mcp"],
      "env": {
        "DEPIX_API_KEY": "sk_test_YOUR_KEY",
        "DEPIX_WALLET_PASSPHRASE": "<the passphrase you typed>",
        "DEPIX_WALLET_DIR": "/Users/you/.depix-wallet"
      }
    }
  }
}

Limpia el historial de tu terminal después. Reinicia tu cliente MCP y pídele que ejecute wallet_status.

Ejecuta el servidor directamente para verificar:

DEPIX_API_KEY=sk_test_YOUR_KEY npx -y @depixapp/mcp

El autoalojamiento sobre HTTP NO es trivialmente seguro. Las herramientas de billetera no tienen autenticación propia y la semilla se carga en todo el proceso. Sobre stdio local eso está bien. Expuesto sobre HTTP, cualquiera que alcance el puerto puede vaciar la billetera — vincula a localhost y agrega tu propio bearer/mTLS + aislamiento de red, o no lo hagas.

Inicio rápido 3 — Pruebas en sandbox (el bucle completo)

Siempre prueba con una clave sk_test_ antes de sk_live_. Los QR de sandbox son marcadores de posición no pagables (SANDBOX-…-DO-NOT-PAY).

  1. create_checkoutamount siempre es requerido; en la vía Pix predeterminada payer_tax_number también lo es (el CPF/CNPJ es requerido incluso en sandbox). Usa un CPF de prueba como 52998224725:

    { "amount": 1500, "payer_tax_number": "52998224725" }
    

    Devuelve un id chk_…, un payment_url, un pix.qr_code de sandbox y is_live: false.

  2. simulate_checkout_payment{ "checkout_id": "chk_…" } marca el checkout de sandbox como pagado (solo sandbox; los checkouts en vivo devuelven sandbox_only).

  3. wait_for_checkout{ "checkout_id": "chk_…" }. El servidor sondea internamente y transmite el progreso; haces una llamada y devuelve { "status": "completed", "terminal": true } — sin bucle de sondeo en el cliente.

También puedes leer un depósito sintético: get_deposit_status con un id sandbox_… devuelve depix_sent.

Cobro en la vía DePix en lugar de Pix

create_checkout toma payment_method. El "pix" predeterminado es el flujo anterior. Con "depix" el pagador envía DePix de billetera a billetera en Liquid a la dirección dedicada del comerciante — no hay QR de Pix ni documento del pagador:

{ "amount": 9990, "payment_method": "depix", "expected_discount_pct": 10 }

La respuesta lleva depix en lugar de pix: address, el exacto amount_cents a enviar (monto nominal menos el descuento del comerciante, menos un ajuste de sub-centavo que hace que el valor sea único — esa unicidad es cómo se empareja el pago), el decimal amount que firma una billetera, asset_id y un uri listo para escanear. Envía cualquier otro monto o cualquier otro activo y el pago no puede acreditarse automáticamente, y un pago en cadena es irreversible.

La liquidación se observa en cadena: approved en la primera confirmación (~1 min), completed en la segunda. expires_in acepta 300–3600 s aquí (predeterminado 1800) en lugar de los 300–1200 de la vía Pix. La vía debe ser habilitada por el comerciante — de lo contrario, la API responde depix_not_enabled. Los checkouts DePix de sandbox son deliberadamente no pagables (dirección de marcador de posición, uri: null); manéjalos con simulate_checkout_payment.

Herramientas

22 herramientas de gateway — disponibles en ambos niveles. Los montos están en centavos de BRL.

HerramientaAPIAlcance
create_checkoutPOST /api/checkoutsmerchant_write
get_checkoutGET /api/checkouts/:idmerchant_read
list_checkoutsGET /api/checkoutsmerchant_read
simulate_checkout_paymentPOST /api/checkouts/:id/simulate-paymentmerchant_write (solo sandbox)
wait_for_checkoutGET /api/checkouts/:id (bucle del servidor)merchant_read
create_productPOST /api/productsmerchant_write
list_productsGET /api/productsmerchant_read
get_productGET /api/products/:idmerchant_read
update_productPATCH /api/products/:idmerchant_write
activate_productPOST /api/products/:id/activatemerchant_write
deactivate_productPOST /api/products/:id/deactivatemerchant_write
set_featured_productsPOST /api/products/featuredmerchant_write
list_product_checkoutsGET /api/products/:id/checkoutsmerchant_read
get_accountGET /api/memerchant_read
get_deposit_statusGET /api/deposits/:idwallet_read (solo lectura)
get_withdrawal_statusGET /api/withdrawals/:idwallet_read (solo lectura)
open_support_ticketPOST /api/ticketscualquier clave (sin alcance)
get_support_ticketGET /api/tickets/:idcualquier clave (sin alcance)
list_support_ticketsGET /api/ticketscualquier clave (sin alcance)
reply_support_ticketPOST /api/tickets/:id/messagescualquier clave (sin alcance)
attach_support_ticket_filePOST /api/tickets/:id/attachmentscualquier clave (sin alcance)
close_support_ticketPOST /api/tickets/:id/closecualquier clave (sin alcance)

Cobros (cobranças). create_product con kind: "charge" crea un enlace de pago con una fecha de vencimiento y multa/interés opcionales por retraso — alquiler, matrícula, una cuota. Se sirve en pay.depixapp.com/c/{id}, nunca aparece en la tienda pública del comerciante, y el monto se recalcula en cada visita (base + multa + interés prorrateado para el ciclo actual). Con recurrence el mismo enlace sigue funcionando mes tras mes, liquidando primero el ciclo impago más antiguo. list_products no devuelve cobros a menos que pases kind: "charge" (o "all"); las filas de cobro entonces llevan charge_state — ciclo actual, días de retraso, total de hoy.

No lo confundas con create_checkout, que acuña un pago único que se paga una vez y es de corta duración. Un cobro es el permanente.

Los últimos seis son el canal de soporte: abre un ticket, sondea la respuesta humana, responde, adjunta una captura de pantalla o archivo de diagnóstico/registro (base64, ~3 MB), o ciérralo (hasta 5 abiertos por cuenta). Las respuestas no se envían — sondea get_support_ticket. Los montos están en centavos de BRL. Una llamada a herramienta cuya clave carece del alcance requerido devuelve un error de herramienta insufficient_scope que nombra el alcance faltante — esa es la única forma de descubrir un alcance faltante (la API nunca lista los alcances de una clave).

27 herramientas wallet_* — solo el nivel local (npx). Firman en proceso con tu semilla; sin una devuelven wallet_not_configured.

GrupoHerramientas
Estado y lecturaswallet_status, wallet_get_address, wallet_get_balances, wallet_list_transactions, wallet_get_guardrails, wallet_diagnostics
Mover dinerowallet_send, wallet_create_deposit, wallet_wait_deposit, wallet_create_withdrawal, wallet_wait_withdrawal
Convertirwallet_quote, wallet_convert, wallet_swap_quote, wallet_swap_execute, wallet_to_stablecoin, wallet_shift_usdt
Lightningwallet_pay_lightning_invoice, wallet_receive_lightning
Tarjetas de regalowallet_list_giftcards, wallet_list_giftcard_products, wallet_giftcard_price, wallet_buy_giftcard, wallet_list_giftcard_orders, wallet_get_giftcard_order_status
Recuperaciónwallet_recover, wallet_pending

wallet_convert es la superficie de conversión principal (wallet_quote enumera las rutas); las herramientas a nivel de proveedor son la vía de escape. wallet_shift_usdt es la única ruta custodial (SideShift) y lo dice. Los montos llevan su unidad en el nombre del campo: amount_cents es centavos de BRL, amount_sats son las unidades base del activo.

Deliberadamente no hay herramienta para exportar la semilla, cambiar salvaguardas, editar las direcciones de pago, o pagar un QR de checkout de comerciante — ni siquiera desde un modelo completamente inyectado.

Configuración (pública, sin secretos)

EnvSignificadoPredeterminado
DEPIX_API_BASEURL base de la API (solo orígenes en lista de permitidos)https://api.depixapp.com
MCP_MAX_WAIT_SECONDSPresupuesto máximo de wait_for_checkout; producción establece ~780 (Vercel Pro)290 (seguro para Hobby)
MCP_SERVER_VERSIONVersión reportada en el handshakeversión del paquete
MCP_ALLOWED_HOSTSLista de permitidos de Host separada por comas (protección contra DNS-rebinding). Coincidencia exacta — sin comodines. Los despliegues de vista previa de Vercel añaden sus propios nombres de host automáticamente, por lo que normalmente no se establecemcp.depixapp.com
DEPIX_API_KEYsolo modo stdio — tu clave de sk_

Solo nivel local (npx) — la mitad de la billetera:

EnvSignificadoPredeterminado
DEPIX_WALLET_PASSPHRASEDesbloquea la billetera local cifrada. Requerida para las 27 herramientas de wallet_*; sin ella devuelven wallet_not_configured
DEPIX_WALLET_DIRDónde reside la billetera cifrada~/.depix-wallet
DEPIX_GUARDRAIL_*Límites BRL por transacción / ventana móvil de 24 h y lista de permitidos. Inmutable en tiempo de ejecución: configúralo aquí + reiniciaR$100/tx, R$500/día
DEPIX_MCP_MAX_WAIT_SECONDSTope para las herramientas de espera de la billetera900

Deliberadamente no existe env para clave de API, token Eulen, HMAC o credencial de base de datos en el servidor remoto. En modo HTTP la clave llega por solicitud en el encabezado Authorization. La frase de contraseña y la semilla de la billetera existen solo en la máquina del operador — el despliegue alojado no lee ninguna y no tiene código que pudiera.

Endpoints

  • POST /mcp — el endpoint MCP Streamable HTTP (DELETE finaliza una sesión; GET devuelve 405 — este servidor sin estado no ofrece flujo SSE independiente).
  • GET /.well-known/mcp.json — documento de descubrimiento mínimo.
  • GET /api/health (también /) — estado del servicio.

Desarrollo

npm install
npm test           # vitest
npm run typecheck  # tsc --noEmit
npm run lint       # eslint
npm run build      # compile src (incl. the vendored engine) → dist
npm run guard:hosted   # the hosted deployment has no path to the wallet engine
npm run licenses:check # THIRD_PARTY_LICENSES matches the prod dep tree
npm run vendor:check   # src/vendor matches the pinned engine commit

Establece DEPIX_TEST_KEY=sk_test_… para ejecutar la prueba e2e de sandbox real (test/e2e/sandbox.test.ts), de lo contrario se omite.

El motor incluido (src/vendor/)

Las 27 herramientas de billetera provienen del motor de billetera DePix App, cuya fuente está incluida aquí desde un commit fijado en lugar de tomarse como dependencia npm.

  • vendor/engine.pin.json es la única fuente de verdad (repositorio + SHA completo de 40 caracteres).
  • npm run vendor:engine regenera src/vendor/** desde ese commit, estampando cada archivo con el encabezado Apache-2.0 y su procedencia. Nunca edites a mano nada bajo src/vendor/ — cámbialo upstream y actualiza la fijación.
  • El árbol está commiteado porque npm ci ejecuta preparebuild: las fuentes deben existir antes de que cualquier paso de instalación pudiera obtenerlas. La reproducibilidad proviene de npm run vendor:check, que CI ejecuta contra un checkout limpio del commit fijado y falla ante un solo byte de desviación.

Por qué el despliegue alojado no puede firmar

api/mcp.tssrc/http.tssrc/server.ts tiene cero ruta de importación a src/vendor/**. Ningún repositorio ejecuta un bundler de tree-shaking, por lo que ese grafo de importación es toda la garantía. scripts/check-hosted-isolation.mjs lo aplica dos veces — un recorrido estático de las fuentes TypeScript y un rastreo @vercel/nft de las entradas compiladas — y su --self-test demuestra que ambas verificaciones rechazan una entrada envenenada. Solo src/stdio.tssrc/unified.ts puede alcanzar el motor.

CI (.github/workflows/ci.yml) ejecuta typecheck + lint + test + build + las tres salvaguardas en cada push a main y cada PR, en Node 22 y 24 — esa es la puerta de corrección.

Publicación

La publicación está automatizada mediante GitHub Actions usando npm Trusted Publishing (OIDC) — sin token npm, sin solicitud de 2FA, y cada versión lleva procedencia de compilación. .github/workflows/publish-mcp.yml (en una etiqueta v*) publica el paquete npm y luego la entrada del MCP Registry (registry/server.json).

Para hacer una versión:

  1. Actualiza la versión en package.json, registry/server.json (tanto el version de nivel superior como packages[].version) y el respaldo resolveServerVersion en src/config.ts — deben coincidir, y CI falla la versión si la etiqueta, package.json y la entrada npm del registro no coinciden (una prueba unitaria fija el respaldo de configuración). El MCP Registry es inmutable por versión, por lo que cualquier cosa que publique desde el árbol etiquetado debe estar correcta antes de la etiqueta.
  2. Haz commit a main.
  3. Etiqueta y empuja:
    git tag v2.0.0 && git push origin v2.0.0
    

El flujo de trabajo verifica las versiones, re-verifica el motor incluido contra su commit fijado, publica en npm con procedencia, luego publica la entrada del registro (idempotente — re-ejecutar una etiqueta es un no-op seguro). Re-etiquetar una versión ya publicada omite ambas publicaciones.

Configuración única (ya hecha): el paquete está registrado como Trusted Publisher de npm para este repositorio con nombre de archivo de flujo de trabajo publish-mcp.yml (npmjs.com → paquete → Configuración → Trusted Publisher). No se almacenan secretos en el repositorio.

Prueba de humo de la versión

Después de un despliegue de vista previa/producción:

  1. claude mcp add --transport http depix <url>/mcp --header "Authorization: Bearer sk_test_…"
  2. Pide a Claude que ejecute get_account → devuelve el comerciante, is_live: false.
  3. create_checkout (sandbox) → simulate_checkout_paymentwait_for_checkoutcompleted.

Empujar a main despliega a producción (mcp.depixapp.com). Valida en un despliegue de vista previa de Vercel antes de fusionar. Las vistas previas son accesibles de inmediato: un despliegue no productivo añade su propio VERCEL_URL y VERCEL_BRANCH_URL a la lista de permitidos de DNS-rebinding (resolveAllowedHosts), y producción no amplía nada. Si alguna vez necesitas permitir otro host, establece MCP_ALLOWED_HOSTS al nombre de host exacto — la lista de permitidos es una coincidencia exacta, por lo que *.vercel.app coincide con nada y dejaría la vista previa inaccesible.