Changelog
Cambios relevantes en la API pública, en los payloads de webhook y en las tools de MCP, más recientes primero. Fechas en UTC.
2026-10-25
- Añadido — tool MCP
me(títuloGet current identity): devuelve la persona, la organización y el alcance del token de la conexión, con el mismo JSON deGET /v1/me. Cualquier token MCP válido puede llamarla — sin scope de recurso ni permiso — por esotools/listsiempre la lista. Aditivo.
2026-10-22
Servidor MCP, más el bucket de rate limit que comparte con la API REST.
- Añadido — cada tool del MCP trae un
titlelegible (List e-mails,Replay webhook delivery), en el descriptor detools/listy enannotations.title. El cliente muestra el título en lugar del identificador. Aditivo. - Modificado — el metadata del recurso protegido anuncia en
scopes_supportedsolo lo que el authorization server concede a un cliente registrado por el flujo OAuth: un scopeinbox/…por recurso, másread.inbox/allywritesalieron de la lista — el cliente que los pedía era rechazado en/oauth/authorize. - Cambiado — el límite de solicitudes del servidor MCP y de la API REST cuenta por persona dentro de la organización (
sub+org), en un único presupuesto compartido. Todo token de la misma persona consume de él — un token nuevo nunca lo reinicia — y la misma persona en otra organización pasa a tener su propio presupuesto (antes el bucket era solo elsub, atravesando organizaciones). Los límites no cambian. - Cambiado — una ruta desconocida en el host MCP (
https://mcp.inbox.kobana.com.br/cualquier-cosa) responde404con el cuerpo JSON{ "error": { "code": "not_found", "message": "not_found" } }en cualquier método, en lugar de una página HTML. Ver Endpoints. - Documentado — el servidor MCP lee el token solo de
Authorization: Bearer; un token en la query string (?access_token=) se ignora y la solicitud recibe el desafío401. Ese ya era el comportamiento; ahora está dicho en Autenticación y cubierto por tests. Del mismo modo,limit,cursorysortsolo se toman de sus argumentos nombrados — las claves no declaradas (per_page,page, un objetofilters) se descartan (Paginación). - Cambiado (incompatible) — las tools MCP destructivas solo se ejecutan después de que el servidor las confirme con el usuario. Un cliente que no puede confirmar — protocolo 2025, o
2026-07-28sin formularios de elicitation — recibe el error de toolconfirmation_requiredy no se ejecuta nada (antes, la tool se ejecutaba y la confirmación quedaba a cargo del manejo dedestructiveHintdel cliente). Si el servidor no puede registrar la confirmación, la respuesta esconfirmation_unavailable. - Cambiado (incompatible) —
emails_reprocess,webhooks_test,webhooks_deliveries_replayeinboxes_add_recipientpasan a ser destructivas (destructiveHint: true): las tres primeras envían algo hacia fuera o vuelven a ejecutar un agente que puede responder, la última cambia quién puede enviar a una inbox.emails_reprocess,webhooks_test,webhooks_deliveries_replayywebhooks_regenerate_secretahora informanidempotentHint: false. - Cambiado — una confirmación ejecuta la acción una sola vez: enviar de nuevo la misma llamada confirmada responde
confirmation_replayedsin ejecutar nada. Para volver a preguntar, llama a la tool sinrequestState. - Cambiado — el body de la solicitud MCP está limitado a 1 MB; por encima, la respuesta es
413con el error JSON-RPC-32600(Request body too large (limit 1048576 bytes)), comprobado en elContent-Lengthantes de la autenticación y garantizado en la lectura del propio stream. Ver Errores.
2026-10-21
Solo el servidor MCP — la API REST no cambia.
- Cambiado (breaking) — Autenticación MCP: el servidor MCP ahora exige un token emitido para él —
audes la URL del servidor MCP (https://mcp.inbox.kobana.com.br), no la audience de la API (inbox/prd). Un token emitido para la API REST se rechaza con401 invalid_token, y lo inverso también vale; un token que nombra más de una audience se rechaza. Conéctate por el flujo OAuth (el cliente solo necesita la URL) o con un token personal creado con el uso MCP. - Cambiado (breaking) — todo token MCP se trata como de una persona, sea cual sea el
srcque lleve: siempre se aplican los permisos de la persona en el dashboard, y una persona que no es miembro de la organización no alcanza nada (403,no_membership). Antes, un token consrc=systemosrc=apipasaba solo por el scope. - Añadido — revisión de protocolo
2026-07-28, junto a2025-06-18y2025-03-26, decidida por el body de la solicitud:server/discover, el envelope_meta,-32020para headers que no coinciden con el body y404para un método desconocido. Una versión no soportada ahora es400con el error JSON-RPC-32022y la lista de las soportadas, en lugar deunsupported_protocol_version. - Añadido — resources bajo
kobana://inbox/(correos, inboxes, agentes, ejecuciones, webhooks, eventos, el catálogo de modelos y el uso), cuatro prompts de solo lectura y completions para sus argumentos. Cada uno se alcanza con el mismo scope y permiso que la tool que tiene detrás. - Añadido — en
2026-07-28, una tool destructiva pide primero al usuario que confirme (resultType: "input_required"); rechazar respondeuser_declined. Los clientes sin elicitation, y las revisiones de 2025, se comportan como antes. - Añadido — el nivel de acceso del token (
read,write,all) se respeta junto ainbox/…+write: con scopes de recurso en el token, los recursos definen el alcance y el nivel actúa dentro de ellos. Ver Scopes. - Cambiado — que el authorization server no esté disponible es
503conRetry-After(antes500); los intentos con token inválido se limitan por IP y reciben429al superar el límite. Los metadatos del recurso protegido nombran al authorization server por su emisor (issuer).
2026-10-15
- Añadido —
Inbox.attachments_allow_rules: lista de adjuntos permitidos por extensión y/o expresión regular en el nombre del archivo, en create, update, upsert y en las tools MCP de inbox. Un adjunto fuera de la lista se ignora — el agente no lo ve, los límitesattachments_max_*no lo cuentan y un paso de workflow que lo referencia falla antes de cualquier solicitud. El correo lo registra enmetadata.ignoredAttachments. El valor por defectonullprocesa todos los adjuntos, como antes. Aditivo. - Cambiado (comportamiento) — un adjunto de texto, o uno enviado al agente en base64, de más de 256 KB ahora llega al agente solo con su encabezado y
(conteúdo não enviado: …), en lugar de su contenido. Los PDF y las imágenes no cambian. Antes, un adjunto ilegible grande (un.msgde Outlook, por ejemplo) podía superar el límite de entrada del modelo y hacer fallar la ejecución.
2026-10-07
- Agregado — todo webhook saliente ahora lleva
X-Idempotency-Key. En el envío original y en cada reintento automático es el id del evento (SystemEvent.id, el mismo valor queX-Kobana-Event-Id), para que un endpoint que respeta claves de idempotencia procese el evento una vez y responda a las repeticiones con la respuesta original. Un replay manual envía una clave nueva y aleatoria, para que el destino lo trate como una entrega nueva en lugar de deduplicarlo contra lo que ese evento ya resolvió. Ver Headers. Aditivo. - Cambiado (comportamiento) —
WebhookDelivery: un reintento programado ya no se envía cuando cualquier entrega del mismo evento al mismo webhook ya tuvo éxito, típicamente después de un replay manual. Antes, la cadena de reintentos de la entrega original seguía corriendo después de que el replay entregara el evento, y el destino podía recibir un intento más después de un2xx. Elnext_retry_atde las filasfailedanteriores ahora se limpia en ese momento. Ningún campo cambió de forma.
2026-09-30
- Cambiado (comportamiento) — los Workflows del agente ya no se detienen en el primer fallo. Todos los pasos se intentan; un paso que falla queda
failedpor sí solo y los siguientes siguen ejecutándose. Un paso que referencia a un paso que no tuvo éxito (falló o se saltó) quedaskippedy nunca se envía, conerrordepends on step N, which did not succeed. La ejecución sigue quedandofailedsi algún paso falló, y suerrorahora lista todos los fallos, uno por línea (step <posición>: <error>). Sin reintento, sigue siendo secuencial. - Añadido —
failed_stepsen los webhooks deworkflow.run.failed(failedStepsen el system event): las posiciones de todos los pasos que fallaron.failed_stepyerrorsiguen describiendo el primer fallo.
failed_steps es aditivo y ningún campo cambió de forma — pero el cambio de ejecución es un cambio de comportamiento: una ejecución que antes se detenía en el paso 1 ahora también ejecuta los pasos independientes posteriores.
2026-09-29
- Añadido — Steps y placeholders: un paso
requestpuede llevarformen lugar debody. Se envía comomultipart/form-data, una parte por campo; los dos son excluyentes. - Añadido — espacio de nombres de placeholder
${{email.attachments.N}}: el N-ésimo adjunto del correo detrás del run. Como valor entero de un campo deform, se sube como parte binaria de archivo (bytes, nombre y content type del correo); dentro de cualquier string, se convierte en el base64 del archivo..base64,.filename,.content_typey.sizetambién están disponibles. Los bytes nunca pasan por el modelo. - Cambiado — los pasos de
WorkflowRunahora exponenrequest.form(nullen un paso conbody). Un campo de archivo se registra como un descriptor{ attachment, filename, content_type, size }, y un adjunto referenciado como base64 dentro derequest.bodyse guarda como[attachment N: …]en lugar de sus bytes.
Todo aditivo — nada existente cambió de forma o comportamiento.
2026-09-24
- Cambiado (breaking) — Autenticación: el token Bearer ahora es un access token RS256 emitido por el Authorization Server de Kobana, verificado contra la clave pública que publica. Los tokens firmados con el secreto
HS512compartido anterior ya no se aceptan. No cambia cómo envías el token — solo qué tokens verifican.orgpasa a ser obligatoria, y es la que acota tus datos.subes la persona (users.public_id); el tenant esorg(accounts.public_id). Un token sinorgse rechaza en lugar de caer ensub— ese fallback no coincidiría con nada y respondería403a todo, sin nada que señale la causa.issahora es la URL del Authorization Server (https://account[.{env}].kobana.com.br);audes la URL de esta API (https://api.inbox[.{env}].kobana.com.br) y puede ser una lista, comparada por contiene.exppasa a ser obligatoria. Un token sin expiración se rechaza.- Nuevo modo de fallo
500 as_unavailable: no se pudo alcanzar nuestro Authorization Server. No es401a propósito — tu token puede ser perfectamente válido; reintenta en unos instantes.
2026-09-09
- Añadido — Workflows del agente: un agente ahora puede terminar su ejecución con un array
workflowjunto aresult, y la plataforma lo ejecuta como una cadena de peticiones HTTP contra sus sistemas. Secuencial, se detiene en el primer fallo, se ejecuta una sola vez. - Añadido — recurso
Secrety/v1/secrets(GET,POST,PUTupsert porkey,GET/PATCH/DELETEpor id). Son los valores que un paso de workflow referencia como${{secrets.KEY}}; el valor es de solo escritura y ningún endpoint lo devuelve. Scopeinbox/secrets(+write). - Añadido — recurso
WorkflowRuny/v1/workflow-runs(GETlista,GETpor id con todos los pasos). Solo lectura. Scopeinbox/workflow_runs. Los contadores se agrupan ensummary: { total, succeeded, error }, y la llamada HTTP de cada paso enrequest: {}/response: {}. - Añadido — herramientas MCP
secrets_list,secrets_get,secrets_create,secrets_upsert,secrets_update,secrets_delete,workflow_runs_list,workflow_runs_get, y los servidores stdio correspondientes. - Añadido — eventos de webhook
workflow.run.succeeded,workflow.run.failed,workflow_run.db.created,workflow_run.db.updated,workflow_run.status_changed. - Cambiado — los payloads de
email.agent.processedahora también llevanworkflow_run_id(nullcuando el agente no devolvió workflow). Aditivo: quienes ya lo consumen no se ven afectados.
Todo aditivo — nada existente cambió de forma o comportamiento.
2026-09-08
- Añadido — los payloads de webhook
email.*ahora traendata.email.download_url: un enlace listo para usar hacia el.emloriginal, válido por 30 minutos, que quien recibe el webhook puede seguir sin certificado mTLS ni JWT de la API. Ver Descargando el.emldesde un webhook. Cambio aditivo — quienes ya consumendata.emailno se ven afectados.