Sendmux

Sendmux sirve a startups nativas de IA, equipos SaaS, agencias de automatización y constructores de plataformas que necesitan agentes de IA para enviar, recibir, enrutar y reaccionar a correos electrónicos en producción. Los compradores y usuarios principales incluyen fundadores técnicos, ingenieros fundadores, ingenieros de backend, ingenieros de plataforma, consultores de automatización de IA, líderes de automatización de soporte, equipos de operaciones y equipos de crecimiento que utilizan su propia configuración de envío de Gmail, Outlook, SMTP o Amazon SES administrado.

Documentación

SDKs de Sendmux

npm version PyPI version Go Reference crates.io version CI npm downloads Licence: MIT

Espacio de trabajo oficial de SDK, CLI y MCP para Sendmux.

Paquetes

EcosistemaPaqueteSuperficieAutenticación por clave API / alojadaInstalaciónFuente
npm@sendmux/coreHelpers compartidos de TypeScriptn/anpm install @sendmux/corepackages/ts/core
npm@sendmux/sendingAPI de envíosmx_mbx_* o smx_agent_* aprobado por el propietarionpm install @sendmux/sendingpackages/ts/sending
npm@sendmux/mailboxAPI de buzónsmx_mbx_* o smx_agent_*npm install @sendmux/mailboxpackages/ts/mailbox
npm@sendmux/managementAPI de gestiónsmx_root_*npm install @sendmux/managementpackages/ts/management
npm@sendmux/sdkPaquete general de TypeScriptespecífico de la superficienpm install @sendmux/sdkpackages/ts/sdk
npm@sendmux/cliCLI de sendmuxespecífico del comando/perfilnpm install -g @sendmux/clipackages/ts/cli
npm@sendmux/ai-sdkHerramientas del SDK de Vercel AI (buzón de agente + envío)envío y recepción smx_mbx_* o smx_agent_*npm install @sendmux/ai-sdkpackages/ts/ai-sdk
HomebrewsendmuxCLI de sendmuxespecífico del comando/perfilbrew install sendmux/tap/sendmuxSendmux/homebrew-tap
PyPIsendmux-coreHelpers compartidos de Pythonn/apip install sendmux-corepackages/python/core
PyPIsendmux-sendingAPI de envíosmx_mbx_* o smx_agent_* aprobado por el propietariopip install sendmux-sendingpackages/python/sending
PyPIsendmux-mailboxAPI de buzónsmx_mbx_* o smx_agent_*pip install sendmux-mailboxpackages/python/mailbox
PyPIsendmux-managementAPI de gestiónsmx_root_*pip install sendmux-managementpackages/python/management
PyPIsendmux-sdkPaquete general de Pythonespecífico de la superficiepip install sendmux-sdkpackages/python/sdk
PyPIsendmux-mcpMCP local más servidores MCP alojados y A2AOAuth para alojado; claves específicas de la superficie para localpip install sendmux-mcppackages/python/mcp
PyPIlangchain-sendmuxKit de herramientas de LangChain (buzón de agente + envío)OAuth REST o envío y recepción smx_mbx_* / smx_agent_*pip install langchain-sendmuxpackages/python/langchain
Gosendmux.ai/go/v3/coreHelpers compartidos de Gon/ago get sendmux.ai/go/v3@v3.0.0go/core
Gosendmux.ai/go/v3/sendingAPI de envíosmx_mbx_* o smx_agent_* aprobado por el propietariogo get sendmux.ai/go/v3@v3.0.0go/sending
Gosendmux.ai/go/v3/mailboxAPI de buzónsmx_mbx_* o smx_agent_*go get sendmux.ai/go/v3@v3.0.0go/mailbox
Gosendmux.ai/go/v3/managementAPI de gestiónsmx_root_*go get sendmux.ai/go/v3@v3.0.0go/management
Gosendmux.ai/go/v3/sdkPaquete general de Goespecífico de la superficiego get sendmux.ai/go/v3@v3.0.0go/sdk
crates.iosendmuxCaja general de Rustespecífico de la superficiecargo add sendmuxrust
Packagistsendmux/coreHelpers compartidos de PHPn/acomposer require sendmux/core:^2.1packages/php/core
Packagistsendmux/sendingAPI de envíosmx_mbx_* o smx_agent_* aprobado por el propietariocomposer require sendmux/sending:^2.1packages/php/sending
Packagistsendmux/mailboxAPI de buzónsmx_mbx_* o smx_agent_*composer require sendmux/mailbox:^2.1packages/php/mailbox
Packagistsendmux/managementAPI de gestiónsmx_root_*composer require sendmux/management:^2.1packages/php/management
Packagistsendmux/sdkPaquete general de PHPespecífico de la superficiecomposer require sendmux/sdk:^2.1packages/php/sdk
RubyGemssendmux-coreHelpers compartidos de Rubyn/agem install sendmux-corepackages/ruby/core
RubyGemssendmux-sendingAPI de envíosmx_mbx_* o smx_agent_* aprobado por el propietariogem install sendmux-sendingpackages/ruby/sending
RubyGemssendmux-mailboxAPI de buzónsmx_mbx_* o smx_agent_*gem install sendmux-mailboxpackages/ruby/mailbox
RubyGemssendmux-managementAPI de gestiónsmx_root_*gem install sendmux-managementpackages/ruby/management
RubyGemssendmux-sdkPaquete general de Rubyespecífico de la superficiegem install sendmux-sdkpackages/ruby/sdk

Inicio rápido

Instale solo el paquete para la superficie que necesite.

npm install @sendmux/sending
pip install sendmux-sending
go get sendmux.ai/go/v3@v3.0.0
cargo add sendmux
composer require sendmux/sending:^2.1
gem install sendmux-sending

Use claves smx_mbx_* capaces de enviar o tokens smx_agent_* de recursos de envío aprobados por el propietario para clientes de envío. Use claves smx_mbx_* o tokens smx_agent_* con ámbito para clientes de buzón. Use claves smx_root_* raíz para clientes de gestión. Los tokens de agente permanecen limitados por los ámbitos del lado del servidor; los tokens de agente auto-registrados previamente reclamados no incluyen email.send.

Autenticación OAuth

Los clientes de superficie de TypeScript, Python, Go, PHP, Ruby y Rust aceptan un token de acceso OAuth REST simple o un proveedor que lo resuelva antes de cada solicitud. Use la API de token explícita a continuación; la configuración de clave API continúa validando los prefijos de clave.

ClienteConfiguración del token de acceso
TypeScriptaccessToken: token o accessToken: () => token; se admiten proveedores asíncronos.
SDK de Vercel AIsendmux({ accessToken: token }) o un proveedor de token asíncrono; conceda mailbox.read y email.send para un buzón.
Pythonaccess_token=token o un invocable.
LangChainSendmuxToolkit(access_token=token) o un invocable; conceda mailbox.read y email.send para un buzón.
GoNewWithAccessToken(token) o NewWithTokenProvider(provider); los proveedores reciben el contexto de la solicitud.
PHPClientFactory::createMetaApiWithAccessToken($token) o un invocable; cada fábrica de API tiene una variante WithAccessToken.
Rubyaccess_token: token o un invocable.
Rustnew_with_access_token(token) o new_with_token_provider(provider); los proveedores devuelven un futuro.

Elija una única fuente de credenciales. Su aplicación es responsable del almacenamiento seguro y la coordinación de la renovación. Solicite resource=https://sendmux.ai/api; cada API aún verifica sus ámbitos requeridos y la superficie concedida. El CLI gestiona el inicio de sesión del navegador y la renovación del token con sendmux auth:login; use sendmux auth:logout para revocar su conexión.

Configuración y ciclo de vida de OAuth.

Acceso por línea de comandos

Para acceso por línea de comandos, instale el CLI:

brew install sendmux/tap/sendmux
npm install -g @sendmux/cli
sendmux agent:register my-agent --mailbox-local-part my-agent --default --json

El registro de agente no requiere una cuenta existente ni una clave API. Crea un perfil local con una credencial duradera y revocable para leer y recibir correo. Para enviar, invite al propietario con sendmux agent:invite-owner owner@example.com --profile my-agent; después de que el propietario acepte y apruebe el envío, los comandos de la API de envío intercambian y almacenan en caché automáticamente un token delegado de una hora.

Para clientes MCP, instale sendmux-mcp o conéctese al endpoint MCP alojado:

pip install sendmux-mcp
sendmux-mcp-mailbox --help

El endpoint MCP alojado es https://mcp.sendmux.ai/mcp. Los comandos MCP locales admiten transportes stdio y HTTP; el MCP alojado usa OAuth y no requiere claves API manuales ni endpoints OAuth personalizados.

Para clientes A2A 1.0, descubra el servicio HTTP+JSON alojado desde https://a2a.sendmux.ai/.well-known/agent-card.json. Expone las mismas operaciones seleccionadas de buzón, gestión y envío con una concesión OAuth vinculada específicamente a https://a2a.sendmux.ai/a2a/v1.

Para marcos de agentes de IA, hay disponibles envoltorios de herramientas de primera parte:

npm install @sendmux/ai-sdk ai zod   # Vercel AI SDK: sendmux({ apiKey }) returns a ToolSet
pip install langchain-sendmux        # LangChain: SendmuxToolkit(api_key=...).get_tools()

Ambos envuelven los clientes generados de envío y buzón, por lo que la especificación OpenAPI sigue siendo la única fuente de verdad.

Comprobaciones de conexión

Las comprobaciones de conexión autenticadas para las tres superficies de API devuelven el equipo actual, la identidad de la credencial, la etiqueta de conexión, los permisos y los buzones autorizados. Las comprobaciones de buzón no necesitan selector de buzón ni almacenamiento aprovisionado; las comprobaciones de envío requieren email.send sin enviar un correo ni verificar la preparación de entrega. El comportamiento existente de mailboxGetMe no cambia.

Use TypeScript Sending 1.4.0, Mailbox 1.5.0 y Management 1.3.0 (o SDK general 1.4.2), CLI 1.5.0, MCP 1.7.0, Ruby SDK 1.2.0, Rust 0.3.0, Go 1.5.0, PHP 2.0.0, o Python Sending 1.4.0, Mailbox 1.4.0 y Management 1.3.0 (o SDK general 1.1.1).

SuperficieOperación de TypeScriptComando CLIHerramienta MCP
GestiónmanagementGetConnectionmanagement:get-connectionmanagement_get_connection
BuzónmailboxGetConnectionmailbox:get-connectionmailbox_get_connection
EnvíosendingGetConnectionsending:get-connectionsending_get_connection

Use la fábrica de clientes y la credencial correspondientes. Por ejemplo, con SENDMUX_API_KEY configurado con una clave de gestión:

import { createManagementClient, managementGetConnection } from "@sendmux/sdk";

const client = createManagementClient({ apiKey: process.env.SENDMUX_API_KEY! });
const response = await managementGetConnection({ client });
console.log(response.data?.data.label);
sendmux management:get-connection --json

Cada cliente de Rust expone get_connection(), que devuelve Response<Connection>. Las referencias generadas de Go, Python, PHP y Ruby incluyen la operación GetConnection correspondiente para cada superficie. Use las versiones de paquetes publicadas listadas anteriormente; el código fuente de versiones pendientes aún no está disponible a través de los registros de paquetes.

Archivos adjuntos y eventos de buzón en vivo

Los metadatos de archivos adjuntos del buzón ahora incluyen un download_url de corta duración. Obtenga esa URL rápidamente con un cliente HTTP simple; no requiere un encabezado Authorization, pero caduca después de un TTL corto. Si una URL de descarga caduca, vuelva a obtener los metadatos del mensaje o del archivo adjunto para recibir una URL nueva.

Para archivos salientes, evite colocar manualmente base64 en indicaciones o cadenas de origen. Use la ruta de contexto cero para su carril:

  • CLI: sendmux mailbox:send-message --attach ./report.pdf o sendmux sending:send --attach ./report.pdf.
  • TypeScript: use @sendmux/mailbox/node sendMailboxMessageWithFiles(...) o @sendmux/sending/node sendEmailWithFiles(...).
  • Python: use sendmux_mailbox.send_mailbox_message_with_files(...) o sendmux_sending.send_email_with_files(...).
  • MCP: los agentes pueden generar una URL de carga prefirmada, PUT bytes sin clave API y luego enviar con el blob_id devuelto.

Las cargas directas al buzón, las cargas prefirmadas, el --attach del CLI y los helpers de archivos del SDK de buzón comparten el límite de archivos adjuntos del buzón: actualmente 7,500,000 bytes por archivo adjunto. Los helpers de archivos adjuntos de la API de envío cargan bytes de archivo y envían referencias de archivos adjuntos; el límite generado de la API de envío es de máximo 10 archivos adjuntos y un cuerpo de solicitud de 25 MB.

Los archivos adjuntos generados pequeños aún pueden usar base64 en línea donde el esquema de la API lo admita. El base64 en línea de MCP está limitado a 32 KiB decodificado; use carga prefirmada, --attach del CLI o helpers de archivos del SDK para archivos reales.

Los eventos de buzón en vivo están disponibles a través de carriles idiomáticos:

  • TypeScript: streamMailboxEvents(...) devuelve un iterador asíncrono sobre eventos de buzón en tiempo real tipados.
  • Python: iter_mailbox_events(...) produce modelos MailboxRealtimeEvent tipados del cliente de buzón generado.
  • CLI: sendmux mailbox:stream-events --follow imprime un evento JSON por línea hasta que el flujo se cierre o el proceso se interrumpa.
  • MCP: use mailbox_wait_for_message para esperas limitadas dentro de llamadas de herramientas de agente, luego mailbox_get_attachment para renovar los metadatos de archivos adjuntos y obtener download_url.

Estructura del repositorio

Mantenedores: use la matriz E2E en vivo protegida para planificación sin credenciales, puertas explícitas de identidad/envío, evidencia de limpieza y reglas de auditoría de ejecución reciente. La cobertura estática y los negativos esperados de la API no son certificación de capacidad en vivo. Los escenarios de bytes de archivos adjuntos requieren verificación de retención confiable antes de la ejecución en vivo.

RutaPropósito
packages/tsPaquetes del SDK de TypeScript y la CLI de sendmux.
packages/pythonPaquetes del SDK de Python y el paquete sendmux-mcp.
goMódulo de Go sendmux.ai/go/v3 y subpaquetes.
rustCrate de Rust publicado como sendmux en crates.io.
packages/phpFuentes de paquetes de PHP utilizadas para paquetes de Packagist y repositorios divididos públicos.
packages/rubyFuentes de paquetes de RubyGem.
codegenConfiguración y plantillas del generador.
scriptsScripts auxiliares de generación, verificación, publicación y lanzamiento.
docsArtefactos de auditoría de cobertura superficial y E2E en vivo.
.github/workflowsFlujos de trabajo de CI, canary, E2E en vivo y lanzamiento.

Versionado y soporte

Mantener los contratos de paquetes

En un checkout de fuentes, los mantenedores pueden inspeccionar el contrato de paquete MCP generado para el catálogo real de herramientas, esquemas, flujos de trabajo de carga, recurso alojado y revisiones de protocolo congeladas. Describe este checkout, no la versión ya disponible en un registro de paquetes. Los hashes de fuentes y los metadatos de distribución nativa vinculan el artefacto a sus entradas; los transportes locales y los orígenes de API ascendentes son independientes del recurso OAuth alojado.

Con las dependencias del espacio de trabajo instaladas y Python 3.10 o más reciente disponible, ejecute estos comandos desde la raíz del repositorio:

pnpm generate:mcp
pnpm test:release-state
pnpm build:mcp

La generación actualiza los metadatos editables de Python antes de descubrir herramientas sin solicitudes ascendentes. La compilación verifica el contenido de la rueda y la distribución de fuentes, un consumidor de rueda instalada fuera del checkout y los requisitos de conformidad congelados. pnpm drift:check rechaza cambios generados que no se hayan preparado o confirmado. Regenera y revisa el contrato cuando un PR de lanzamiento cambie la versión nativa de MCP; no reutilices un contrato de la versión anterior.

La validación de lanzamiento nativo cubre TypeScript, Python, Rust, Ruby y la convención de componente/etiqueta de Go. Go no tiene campo de versión en el módulo. Las versiones de PHP pertenecen a etiquetas de repositorios divididos, no a composer.version ni a release-please; las identidades y dependencias de Composer se verifican sin tratar una versión de repositorio de ruta local como evidencia de publicación. Las etiquetas y versiones publicadas exactas siguen siendo puertas de lanzamiento.

Mantenedores: puertas de publicación nativa vinculan las entradas de flujo de trabajo de lanzamiento compatibles y el comando de división de PHP a candidatos inmutables y requieren paridad estricta de esquema en vivo antes de su primera escritura. Los ayudantes de bajo nivel de Ruby, npm y Homebrew no son procedimientos de lanzamiento independientes protegidos; la promoción manual de Snap sigue siendo una política aprobada por el propietario.

Verificar la compatibilidad del tiempo de ejecución desde las fuentes

Mantenedores: el flujo de trabajo de CI separa la generación/compilación estática de las verificaciones del tiempo de ejecución del lenguaje. Una celda configurada es una verificación requerida, no una afirmación de que un checkout no lanzado haya pasado de forma remota. Los pisos de compatibilidad no son recomendaciones para implementar tiempos de ejecución EOL ascendentes.

Tiempo de ejecuciónCeldas de CI requeridasLímite del paquete candidato
Node22, 24, 26 en Ubuntu, macOS, WindowsSeis tarballs instalados explícitamente y CLI
Python3.10–3.14 en UbuntuSiete ruedas con pruebas de tiempo de ejecución; siete sdists con instalación aislada
Go1.23.4, 1.26, 1.27 en UbuntuMódulo externo con un reemplazo candidato explícito; sin actualización automática de toolchain
PHP8.2–8.5 en UbuntuCinco divisiones individuales y un consumidor general todo local
Ruby3.1, 3.2, 3.3, 3.4.1, 4.0 en UbuntuCinco gemas instaladas localmente; herramientas de desarrollo solo en 3.4.1
Rust1.82.0 y estable/última en UbuntuBloqueos de fuentes independientes, crate verificado, consumidor de piso bloqueado por separado

Después de la compilación de fuentes correspondiente, ejecute node scripts/ci-consumers.mjs node, python, go o ruby desde la raíz del repositorio para verificar las importaciones instaladas fuera del checkout. Las pruebas de contrato/empaquetado de MCP solo de repositorio de Python permanecen en verificaciones de fuentes; el consumidor de rueda ejecuta pruebas de tiempo de ejecución y load_contract() instalado sin inyección de ruta de fuentes. PHP usa node scripts/check-php-splits.mjs para la verificación de composición todo local; las divisiones individuales pueden resolver dependencias hermanas publicadas y no son esa prueba.

Las celdas de Node en Linux también ejecutan node scripts/ci-consumers.mjs ai para los 12 pares exactos de AI/Zod registrados en ese ayudante. El envoltorio candidato de AI requiere Zod 3.25.76 o más reciente y conserva la cobertura de AI 5/6/7, incluida la intersección histórica de AI 5.0.0/Zod 4.0.0. El envoltorio 0.4.0 publicado aún anuncia el piso de Zod más antiguo; esta corrección requiere un lanzamiento posterior.

Para Rust, ejecute las pruebas bloqueadas de todos los objetivos/todas las características y de documentación con cargo +1.82.0, luego node scripts/ci-consumers.mjs rust con estable y 1.82.0 instalados (estable necesita Clippy). Ese ayudante resuelve las dependencias más recientes en una copia temporal, prueba y verifica cargo +stable package --locked, y verifica el crate desempaquetado usando rust/ci/floor-consumer/Cargo.lock. Nunca sustituye el bloqueo integrado de la biblioteca por el bloqueo del consumidor. Cobertura superficial y decisiones de operación de Rust distinguen métodos nombrados de operaciones parciales/brutas/no compatibles.

Límites de lanzamiento de paquetes

Los paquetes de SDK siguen los contratos de API pública de Sendmux. Las versiones de parche pueden diferir entre paquetes cuando una corrección solo afecta a un ecosistema o tiempo de ejecución.

Los clientes generados se compilan a partir de instantáneas de OpenAPI confirmadas. Cualquier cambio en el contrato de API debe actualizar las instantáneas y la salida generada en el mismo cambio.

Para obtener ayuda, abra un problema de GitHub con el nombre del paquete, la versión, el comando o la ruta de importación, y el ID de solicitud de cualquier respuesta de error de API.

Contribución

Abra solicitudes de extracción contra este repositorio. Mantenga la salida generada, las instantáneas de fuentes y los artefactos de verificación juntos en el mismo cambio.

Los problemas de seguridad deben informarse a través de Avisos de seguridad de GitHub.

Licencia

Este repositorio está disponible bajo la licencia MIT.