# Soporte de UTILIA OS por MCP

La herramienta utilia_support: escribir al soporte de UTILIA OS, seguir sus respuestas y enviarle un ticket interno, desde cualquier servidor de tu empresa.

`utilia_support` es el canal de una empresa con el soporte de UTILIA OS, el equipo que hace la aplicación. Con ella, un asistente escribe un fallo, una duda o una sugerencia, sigue las respuestas y envía a UTILIA un ticket interno que resultó ser un fallo del producto. Es la misma conversación que la pestaña **A UTILIA OS** de [Mis tickets](https://os.utilia.ai/docs/guides/support-tickets/utilia-support): lo que se abre por aquí se ve allí, y al revés.

Está en todos los servidores de las empresas con el mismo contrato, no depende del plan contratado y sigue funcionando con la cuenta en pausa, que es justo cuando más falta hace escribir al soporte.

## Qué herramienta usar

**Soporte de UTILIA OS o bandeja interna**

### utilia_support (Lo lee UTILIA)

Fallos, dudas y sugerencias sobre UTILIA OS. Cualquier empresa puede escribir, tenga el plan que tenga.

### my_tickets y tickets (Lo lee tu equipo)

La bandeja interna de tu empresa, que UTILIA no lee. Necesita los tickets internos en el plan.

Si un ticket interno resulta ser un fallo de UTILIA OS, no lo vuelvas a escribir: envíalo con `escalate`. Las herramientas de la bandeja interna están en [Herramientas MCP de tickets](https://os.utilia.ai/docs/developers/mcp/tickets).

## Requisitos

- **Conexión.** Un token OAuth o una clave personal de cualquier servidor de tu empresa: CRM, Gestión de proyectos, Finanzas, Marketing, Chat o RRHH. No está en el servidor de desarrolladores, que tiene su propio soporte en la consola, ni en los conectores de los directorios de Claude y ChatGPT.
- **Scope.** Uno de la familia `org:support:*` para cada operación, como explica [Scopes de la conexión](#scopes-de-la-conexión).
- **Permiso.** Los de tickets de la persona, con su alcance. Los de fábrica de todos los roles bastan para escribir y seguir lo propio.
- **Plan.** Ninguno. `utilia_support` nunca responde `MODULE_NOT_ENABLED`, `CAPABILITY_NOT_ENABLED`, `FEATURE_COMING_SOON` ni `TENANT_SUSPENDED`.

Desde una empresa de prueba de la consola, la herramienta se anuncia pero responde `PLATFORM_SUPPORT_NOT_IN_SANDBOX`: el soporte se pide con la cuenta de desarrollador, desde la consola.

## Operaciones

| Operación | Qué hace | Permiso | Scope |
| - | - | - | - |
| `report` | Abre de 1 a 10 tickets en una llamada, cada uno independiente. | `SUPPORT_TICKETS_CREATE` | `org:support:request` |
| `list` | Los tuyos (`owner: "mine"`, por defecto) o los de tu equipo (`owner: "team"`). | `SUPPORT_TICKETS_VIEW_OWN` o `SUPPORT_TICKETS_VIEW_ALL` | `org:support:view` |
| `get` | Un ticket y sus 20 últimos mensajes públicos. Si es tuyo, deja leídas las respuestas de UTILIA. | `SUPPORT_TICKETS_VIEW_OWN` o `SUPPORT_TICKETS_VIEW_ALL` | `org:support:view` |
| `reply` | Contesta, con texto, archivos o las dos cosas. En uno resuelto o cerrado, lo reabre si puedes reabrirlo. | El tuyo, `SUPPORT_TICKETS_VIEW_OWN`; el de otra persona, `SUPPORT_TICKETS_COMMENT` | `org:support:request` |
| `close` | Cierra hasta 20 tickets, con el resultado de cada uno. | El tuyo, `SUPPORT_TICKETS_CLOSE_OWN`; el de otra persona, `SUPPORT_TICKETS_CLOSE` | `org:support:request` |
| `reopen` | Reabre un ticket resuelto o cerrado. | El tuyo, `SUPPORT_TICKETS_VIEW_OWN`; el de otra persona, `SUPPORT_TICKETS_REOPEN` | `org:support:request` |
| `escalate` | Envía a UTILIA hasta 10 tickets internos. Sin `confirm: true` es un ensayo que no envía nada. | El tuyo, `SUPPORT_TICKETS_CREATE`; el de otra persona, `SUPPORT_TICKETS_MANAGE` | `org:support:request` |
| `upload` | Reserva la subida de hasta 5 adjuntos de 10 MB o, con el `id` de un ticket, da un enlace para que la persona los suba. No exige el Gestor de archivos. | `SUPPORT_TICKETS_CREATE`, `SUPPORT_TICKETS_VIEW_OWN` o `SUPPORT_TICKETS_COMMENT` | `org:support:request` |

`list` y `get` aceptan también `org:support:request` y `org:support:manage`. El identificador de un ticket es siempre su clave visible (`TKT-<ORGANIZACIÓN>-<número>`) o su identificador interno. La herramienta recibe siempre `operation` y, después, los parámetros de cada operación.

### Lo de otras personas

Ver los tickets de tu equipo (`owner: "team"`) o contestar, cerrar, reabrir o enviar a UTILIA el ticket de otra persona exige dos cosas a la vez: el permiso de esa acción con un alcance que cubra el ticket, y el scope `org:support:manage` en la conexión. El equipo se ve con `SUPPORT_TICKETS_VIEW_ALL` con alcance de toda la empresa o de departamento; con el de departamento, los de las personas de tus departamentos y los tuyos. Sin el permiso, `UTILIA_SUPPORT_TEAM_VIEW_NOT_ALLOWED` o `UTILIA_SUPPORT_ACTION_NOT_ALLOWED`; sin el scope, `INSUFFICIENT_SCOPE` con el enlace para concederlo.

Por esta herramienta nunca viajan las notas internas, ni las de tu equipo ni las de UTILIA.

## Escribir al soporte

`report` recibe `items`, una lista de 1 a 10 asuntos. Cada uno se abre o no por su cuenta, y la respuesta lo dice elemento a elemento.

| Nombre | Tipo | Obligatorio | Descripción |
| - | - | - | - |
| `title` | `string` | Sí | De 5 a 500 caracteres. |
| `description` | `string` | Sí | De 10 a 10.000 caracteres. Qué pasa y cómo reproducirlo, sin datos de tus clientes. |
| `category` | `string` | Sí | BUG (un fallo), CONSULTA (una duda) o SUGERENCIA (una mejora). |
| `priority` | `string` | No | BAJA, MEDIA (por defecto), ALTA o CRITICA. |
| `currentUrl` | `string` | No | Pantalla de UTILIA OS donde pasó, hasta 2048 caracteres. |
| `attachmentIds` | `string[]` | No | Hasta 5 fileId de archivos que la persona ha subido, por ejemplo con upload. A UTILIA no se adjunta nada que no haya subido ella. |
| `relatedError` | `object` | No | La llamada de este servidor que falló: tool, y si los conoces, operation y errorCode. Lo que no exista en el servidor se descarta y se dice en context.ignored. |
| `allowDuplicate` | `boolean` | No | true para abrirlo aunque haya otro abierto parecido que la persona puede ver. |

A nivel de llamada, `attachRecentErrors` adjunta los últimos fallos de la persona en esta conexión: hasta 5 de los últimos 60 minutos, cada uno solo con el servidor, la herramienta, la operación, el código y la hora, nunca los argumentos ni los mensajes. Por defecto se adjuntan en los `BUG`; con `true`, en todos; con `false`, en ninguno.

El servidor añade solo, sin que el asistente lo escriba, el servidor MCP de la conexión y el nombre de la IA que la usa, y oculta en el título y la descripción los números de tarjeta, los IBAN y las claves o contraseñas.

```json
{
  "name": "utilia_support",
  "arguments": {
    "operation": "report",
    "items": [
      {
        "title": "El PDF del presupuesto sale en blanco",
        "description": "Al descargar el PDF de cualquier presupuesto, el archivo sale sin las líneas ni los importes.",
        "category": "BUG",
        "priority": "ALTA"
      },
      {
        "title": "¿Se puede cambiar la serie de una factura emitida?",
        "description": "Queremos saber si una factura ya emitida admite otra serie o hay que rectificarla.",
        "category": "CONSULTA"
      }
    ]
  }
}
```

La respuesta:

```json
{
  "results": [
    { "index": 0, "status": "created", "ticketKey": "TKT-AURORA-ASESORES-41", "id": "ckxyz0041example", "title": "El PDF del presupuesto sale en blanco", "priority": "ALTA", "attachments": 0 },
    { "index": 1, "status": "duplicate_suspected", "existing": { "ticketKey": "TKT-AURORA-ASESORES-37", "id": "ckxyz0037example", "title": "Cambiar la serie de una factura", "status": "OPEN", "isYours": true } }
  ],
  "created": 1,
  "notCreated": 1,
  "context": { "server": "utilia-crm", "aiClient": "Claude", "recentErrorsAttached": 0 },
  "nextSteps": [ … ]
}
```

Cada elemento vuelve con su `status`:

- **`created`**: abierto, con su clave.
- **`duplicate_suspected`**: ya hay un ticket abierto muy parecido que la persona puede ver, y no se ha abierto otro. Contesta en él con `reply` o repite ese elemento con `allowDuplicate: true` si es otro asunto. Si el parecido es con uno que la persona no puede ver, el ticket se abre igual.
- **`error`**: no se ha abierto, con su `errorCode` y su `hint`. Los demás elementos no se ven afectados.

Cada ticket abierto cuenta para el tope de 10 altas por hora y persona, que suma todas las vías (la aplicación, el móvil y el MCP), y para el de 50 tickets abiertos con UTILIA por empresa.

## Seguir las respuestas

`list` filtra con `owner`, `status`, `search` (en la clave, el título y la descripción), `limit` (20 por defecto, 50 como mucho) y `cursor`, el `nextCursor` de la página anterior.

| `status` | Qué trae |
| - | - |
| `open` | Por defecto: abiertos, en revisión y en el trabajo de UTILIA. |
| `waiting_you` | Los abiertos en los que UTILIA ha contestado lo último y espera tu respuesta. |
| `new_replies` | Los tuyos con respuestas de UTILIA sin leer. |
| `closed` | Resueltos y cerrados. |
| `all` | Todos. |

Cada fila trae `ticketKey`, `id`, `title`, `status`, `waitingFor` (`utilia`, `you` o `null`), `isYours`, `origin` (`direct`, o `escalated` si llegó desde un ticket interno) y `lastActivityAt`; en los tuyos, `newReplies`, y con `owner: "team"`, `reporterName`. La respuesta suma en `unreadReplies` las respuestas sin leer de los tuyos.

`get` trae el ticket, `waitingFor` y `waitingSince`, el contexto con el que llegó y los 20 últimos mensajes públicos, cada uno con `from` (`utilia`, `you` o `team`), `authorName`, texto, hora y adjuntos. Las respuestas de UTILIA van firmadas como «Soporte de UTILIA OS» con el nombre de pila de quien contesta. Si `hasMore`, los anteriores se piden con `before`, el `nextBefore` de la respuesta.

`reply` admite hasta 5000 caracteres en `content` y hasta 10 `attachmentIds` (solo archivos que la persona ha subido); puede ir sin texto si lleva archivos. Responde con `reopened: true` si ha reabierto el ticket.

## Enviar un ticket interno

`escalate` pasa a UTILIA tickets internos de tu empresa. Vale para uno abierto o cerrado (el cerrado se reabre), pero no para uno que abrió un cliente desde el portal o una aplicación externa (`ESCALATION_NOT_INTERNAL`) ni para uno que ya es un elemento de trabajo de tu equipo (`ESCALATION_ALREADY_WORK`). No se puede deshacer: el ticket pasa a ser de UTILIA y sale de la bandeja interna.

Por eso va en dos pasos, y el segundo solo se acepta atado al primero:

**Enviar un ticket interno a UTILIA**

Participantes: Tu asistente, UTILIA OS y La persona.

1. Tu asistente → UTILIA OS: escalate sin confirm. Con los ids y, si quieres, una nota para UTILIA.
2. UTILIA OS → Tu asistente (respuesta): Qué verá UTILIA y confirmationToken. No envía nada. El testigo vale 10 minutos.
3. Tu asistente → La persona: Le enseña el ensayo. Lo que se oculta, lo que no y lo que viaja.
4. La persona → Tu asistente (respuesta): Da su conformidad
5. Tu asistente → UTILIA OS: escalate con confirm: true. Los mismos ids y note, y el confirmationToken.
6. UTILIA OS (por su cuenta): El ticket pasa a ser de UTILIA y sale de la bandeja interna.
7. UTILIA OS → Tu asistente (respuesta): sent o already_sent por ticket

_Sin el confirmationToken del ensayo, o si el ticket ha cambiado desde entonces, no se envía nada._

El ensayo dice, ticket a ticket, si se puede enviar y qué verá UTILIA:

- **Lo que llega**: el título y la descripción, cuántos mensajes de la conversación viajan y cuántas personas de tu empresa aparecen en ellos con su nombre y su foto. Las notas internas no se envían.
- **Lo que se oculta** (`redactions`): cuántas tarjetas, IBAN y claves o contraseñas se ocultarán en el título, la descripción, los mensajes y la nota.
- **Lo que no se oculta** (`notRedactedNotice`): correos, teléfonos, DNI o NIF, datos de salud y nombres de clientes. Hay que revisarlo antes de enviar.
- **Los adjuntos** se comparten tal cual: su contenido no se revisa.
- **Lo que cambia** (`removed`): se quita a las personas asignadas y se desvincula el proyecto.

`note` (hasta 2000 caracteres) se añade como primer mensaje público, con el nombre de quien lo envía. La persona que abrió el ticket sigue siendo su autora; si lo envía otra, recibe un aviso.

Con `confirm: true`, cada ticket vuelve como `sent`, `already_sent` (otra persona lo envió antes: no es un fallo) o `error`. Si el ticket ha cambiado desde el ensayo, `ESCALATION_PREVIEW_STALE`: repite el ensayo y enséñaselo otra vez a la persona.

## Adjuntar archivos

`upload` recibe `files`, de 1 a 5, cada uno con `fileName`, `fileSize` (el tamaño exacto en bytes) y, si lo sabes, `mimeType`. Cada archivo puede ocupar hasta 10 MB.

Por cada archivo devuelve `fileId`, `uploadUrl`, `relayUploadUrl`, `method`, `headers` y `expiresAt`. Haz un `PUT` del archivo a su `uploadUrl` con esas cabeceras antes de que caduque y pasa su `fileId` en `attachmentIds` de `report` o de `reply`. Si el `PUT` a `uploadUrl` falla por la red, repítelo a `relayUploadUrl`, que hace lo mismo a través de os.utilia.ai. Una reserva sin subir no sirve: `UPLOAD_NOT_RECEIVED`.

Si tu entorno no puede hacer peticiones, llama a `upload` con el `id` de un ticket que ya exista y sin `files`: devuelve `uploadLink`, un enlace de 24 horas para que la persona suba hasta 10 archivos desde su navegador, que quedan adjuntos al ticket. Si el ticket aún no existe, ábrelo antes con `report`. Las dos salidas se explican en [Subir un archivo cuando el PUT no llega](https://os.utilia.ai/docs/developers/mcp/reference#subir-un-archivo-cuando-el-put-no-llega).

El archivo nunca viaja dentro de la llamada. Los adjuntos de un ticket admiten 5 archivos en el alta y 10 en cada respuesta, igual por la aplicación, el móvil y el MCP.

## Cuándo se cierra solo

Un ticket abierto en el que UTILIA ha contestado lo último y espera tu respuesta avisa a quien lo abrió a los 7 días, con la fecha de cierre, y se cierra a los 14 si nadie contesta. Contestar en él lo reabre. Nunca se cierran solos los que esperan a UTILIA, los que UTILIA tiene en revisión ni los que ya están en su trabajo, y un cierre por falta de respuesta no cuenta como resuelto. En la respuesta de `list` y `get`, `waitingFor: "you"` marca los que están en esa cuenta atrás.

## Límites

**Límites del soporte de UTILIA OS**

- Tickets nuevos por hora y persona: 10. Por todas las vías. Enviar un interno no cuenta.
- Tickets abiertos con UTILIA por empresa: 50. Enviar un interno sí cuenta.
- Respuestas por hora y persona: 60
- Tamaño de cada adjunto: 10 MB

En una sola llamada caben 10 asuntos en `report`, 20 tickets en `close` y 10 en `escalate`. Al pasarse de un tope por hora, la respuesta trae `retryAfterSeconds`; al de 50, `openCount` y `limit`.

## Scopes de la conexión

| Scope | Qué permite | Lo dan |
| - | - | - |
| `org:support:view` | Ver tus tickets al soporte de UTILIA OS y sus respuestas | Los conjuntos `:read` y `:full` de cada área |
| `org:support:request` | Escribir al soporte: abrir, contestar, cerrar o reabrir los tuyos y enviarle tus tickets internos | Los conjuntos `:write` y `:full` |
| `org:support:manage` | Ver y atender los tickets al soporte de tu equipo, si tu permiso lo deja | Solo los conjuntos `:full` |

No dependen del plan ni de ningún permiso para concederse, viajan en el token de cualquier servidor de tu empresa y abren su puerta por sí solos. Los conjuntos `support:*` no los incluyen. El catálogo completo está en [Scopes y recursos de OAuth](https://os.utilia.ai/docs/developers/oauth/scopes-and-resources#transversales-de-la-organización-org).

Si a la conexión le falta uno, la respuesta es `INSUFFICIENT_SCOPE` con `requiredScopes` y, en una conexión OAuth, `grantUrl`: el enlace para que la persona lo conceda sin desconectar. Para preguntarlo antes de intentarlo, usa [`org_plan` `connection_access`](https://os.utilia.ai/docs/developers/mcp/plan-and-calls#permisos-de-esta-conexión).

### Conexiones que ya existían

Las conexiones autorizadas antes de que existieran estos scopes los reciben por compatibilidad hasta el 30 de abril de 2027, según lo que ya podían hacer:

- **Ver lo propio**, si llevan `org:plan:view`, `org:plan:request`, `org:notifications:view` o `support:tickets:view`.
- **Escribir lo propio**, si llevan `org:plan:request`, `support:tickets:create` o `support:tickets:update`. Para enviar un ticket interno, solo con los dos de tickets.
- **Lo de otras personas**, si llevan `support:tickets:view` para verlo o `support:tickets:update` para actuar.

La persona lo ve en la conexión, en Mi perfil y en Conecta tu IA, como «Soporte de UTILIA OS · concedido por compatibilidad hasta el 30 de abril de 2027». No se aplica a una conexión hecha desde un directorio, ni si al autorizar se desmarcó ese bloque. Pasada la fecha, la conexión que no lo tenga recibe `INSUFFICIENT_SCOPE` con su enlace.

## Errores

Todos llegan con `isError: true`, el código en `details.errorCode` y una pista para el asistente en `hint`. En las operaciones en lote (`report`, `close` y `escalate`), un elemento que falla no tumba la llamada: vuelve con `status: "error"`, su `errorCode` y su `hint`.

| `errorCode` | Cuándo | Qué hacer |
| - | - | - |
| `PLATFORM_SUPPORT_NOT_IN_SANDBOX` | Llamada desde una empresa de prueba. | Escribe desde la consola, con la cuenta de desarrollador. |
| `SUPPORT_TICKET_RATE_LIMITED` | Más de 10 altas en una hora. Trae `retryAfterSeconds`. | Junta lo que quede en un solo ticket o espera. |
| `SUPPORT_TICKET_REPLY_RATE_LIMITED` | Más de 60 respuestas en una hora. Trae `retryAfterSeconds`. | Junta lo que quede en una sola respuesta o espera. |
| `PLATFORM_TICKET_LIMIT_REACHED` | La empresa tiene 50 tickets abiertos con UTILIA. Trae `openCount` y `limit`. | Cierra los resueltos con `close` o contesta en uno abierto. |
| `SUPPORT_TICKET_NOT_FOUND` | No existe o la persona no lo ve. | Mira los tuyos con `list`; con `owner: "team"`, los de tu equipo. |
| `UTILIA_SUPPORT_NOT_A_UTILIA_TICKET` | Es un ticket interno. | Síguelo con `my_tickets` o envíalo con `escalate`. |
| `UTILIA_SUPPORT_TEAM_VIEW_NOT_ALLOWED` | `owner: "team"` sin ver los de toda la empresa o los de tu departamento. | Usa `owner: "mine"`. |
| `UTILIA_SUPPORT_ACTION_NOT_ALLOWED` | Contestar, cerrar o reabrir el de otra persona sin el permiso o el alcance. | Que lo haga quien lo abrió o quien gestiona los tickets del equipo. |
| `SUPPORT_TICKET_REOPEN_NOT_ALLOWED` | Contestar en uno cerrado sin poder reabrirlo. | Que lo reabra quien lo abrió, o abre uno nuevo con `report`. |
| `ESCALATION_NOT_INTERNAL` | El ticket viene del portal del cliente o de una aplicación externa. | Abre uno nuevo con `report`, sin datos de tu cliente. |
| `ESCALATION_ALREADY_WORK` | El ticket ya es un elemento de trabajo de tu equipo. | Abre uno nuevo con `report` y menciona su clave. |
| `ESCALATION_NOT_ALLOWED` | No lo abriste tú y no tienes `SUPPORT_TICKETS_MANAGE` con alcance. | Que lo envíe quien lo abrió o quien gestiona los tickets del equipo. |
| `ESCALATION_PREVIEW_STALE` | Falta el `confirmationToken`, ha caducado o el ticket ha cambiado desde el ensayo. | Repite el ensayo y enséñaselo a la persona. |
| `SUPPORT_TICKET_ATTACHMENT_NOT_ALLOWED` | Un adjunto es de otra persona, está en la papelera o en cuarentena. | Súbelo con `upload` y usa su `fileId`. |
| `SUPPORT_TICKET_TOO_MANY_ATTACHMENTS` | Más de 5 adjuntos en el alta o de 10 en una respuesta. | Repártelos entre el alta y una respuesta. |
| `SUPPORT_TICKET_ATTACHMENT_TOO_LARGE` | Un archivo pasa de 10 MB. | Para algo mayor, pega un enlace en el texto. |
| `UPLOAD_NOT_RECEIVED` | La reserva no ha recibido el archivo. | Haz el `PUT` antes de usar el `fileId`. |
| `INSUFFICIENT_SCOPE` | A la conexión le falta el scope. Trae `requiredScopes` y, en OAuth, `grantUrl`. | Dale el enlace a la persona; si es una clave personal, crea una nueva. |
| `VALIDATION` | Un parámetro falta o está mal formado. Trae `field`. | Corrige ese campo. |

Una asesoría solo puede escribir al soporte de UTILIA OS: si intenta abrir un ticket interno por la API o por `my_tickets`, recibe `SUPPORT_INTERNAL_NOT_FOR_ADVISOR`.

## Desde los SDK

Desde la 5.0.0 de los SDK, sin publicar todavía, `sdk.mcp.utiliaSupport` (`sdk.mcp.utilia_support` en Python) envuelve la herramienta, con `escalatePreview` y `escalate` como dos métodos separados. Necesitan una sesión OAuth autorizada para el servidor al que llamas, como se explica en [Primeros pasos con MCP](https://os.utilia.ai/docs/developers/mcp/quickstart#llamar-a-las-herramientas-desde-tu-código).

### JavaScript / TypeScript

```typescript
const { data } = await sdk.mcp.utiliaSupport.report({
  items: [
    {
      title: 'El PDF del presupuesto sale en blanco',
      description: 'Al descargar el PDF de cualquier presupuesto, el archivo sale en blanco.',
      category: 'BUG',
    },
  ],
});

for (const item of data.results) {
  if (item.status === 'duplicate_suspected') {
    console.log('Ya existe:', item.existing.ticketKey);
  }
}

// Enviar a UTILIA un ticket interno, en dos pasos.
const preview = await sdk.mcp.utiliaSupport.escalatePreview(['TKT-AURORA-ASESORES-12']);
// Enseña preview.data.items a la persona y, solo con su conformidad:
if (preview.data.confirmationToken) {
  await sdk.mcp.utiliaSupport.escalate(['TKT-AURORA-ASESORES-12'], {
    confirmationToken: preview.data.confirmationToken,
  });
}
```

### Python

```python
from utilia_sdk.mcp.utilia_support_types import (
    UtiliaSupportReportInput,
    UtiliaSupportReportItemInput,
)

result = await sdk.mcp.utilia_support.report(
    UtiliaSupportReportInput(
        items=[
            UtiliaSupportReportItemInput(
                title="El PDF del presupuesto sale en blanco",
                description="Al descargar el PDF de cualquier presupuesto, el archivo sale en blanco.",
                category="BUG",
            )
        ]
    )
)

for item in result.results:
    if item.status == "duplicate_suspected" and item.existing:
        print("Ya existe:", item.existing.ticket_key)

# Enviar a UTILIA un ticket interno, en dos pasos.
preview = await sdk.mcp.utilia_support.escalate_preview(["TKT-AURORA-ASESORES-12"])
# Enseña preview.items a la persona y, solo con su conformidad:
if preview.confirmation_token:
    await sdk.mcp.utilia_support.escalate(
        ["TKT-AURORA-ASESORES-12"], confirmation_token=preview.confirmation_token
    )
```

La guía de uso, con lo que ve la persona en la aplicación, está en [Escribir al soporte de UTILIA OS](https://os.utilia.ai/docs/guides/support-tickets/utilia-support).
