# Referencia de campos MCP (/es/docs/developer/mcp-reference)

Usa esta referencia para construir una solicitud MCP. Los campos obligatorios están marcados como **Obligatorio**. Los campos opcionales se pueden omitir a menos que una fuente agregue una condición.

## De un vistazo [#de-un-vistazo]

| Contrato | Dónde leerlo |
| --- | --- |
| Entradas de herramientas | Tablas a continuación y la lista de herramientas conectadas |
| Entradas y salidas exactas de operaciones | `execute` → `sift.spec(id)` |
| Campos específicos de la organización | Operaciones de descubrimiento de campos y guías de tareas |
| Resultados de búsqueda | `items`, `nextCursor`; `total` en la primera página de un agente, o con `includeTotal` |
| Resultados de analítica | `rows`, `meta`, `comparison` opcional |
| Resultados de la app integrada | `structuredContent`, texto y enlace de Sift |
| Campos de conexión personal | Guía de conexiones MCP |

## Qué estás viendo [#qué-estás-viendo]

La herramienta `execute` ejecuta un programa. `sift.call(id, input)` recibe directamente la entrada de la operación.
Por ejemplo, `sift.call("query.analytics.<source>", query)` recibe la consulta.
No agregues campos de paginación REST a una operación MCP.

## Campos principales de herramientas [#campos-principales-de-herramientas]

| Herramienta | Campo | Tipo, requisito y comportamiento |
| --- | --- | --- |
| `execute` | `code` | **Obligatorio** string no vacío. Cuerpo de función JavaScript async. Usa `return` para el resultado. |
| `execute` | `timeoutMs` | Entero positivo opcional. Establécelo explícitamente para ejecuciones predecibles; valor predeterminado en tiempo de ejecución 90000, máximo 120000 milisegundos. |
| `execute` | `userId` | String de compatibilidad opcional. La autenticación determina la identidad; este campo no puede sobreescribirla. |
| `list_skills` | Sin campos | Envía un objeto vacío. |
| `read_skill` | `name` | **Obligatorio** string no vacío. ID de skill de `list_skills`. |
| `read_skill_file` | `name` | **Obligatorio** string no vacío. ID de skill. |
| `read_skill_file` | `file` | **Obligatorio** string no vacío. Ruta de referencia relativa listada por `read_skill`. |

## Operaciones de búsqueda [#operaciones-de-búsqueda]

| Fuente | Operación | Úsala para |
| --- | --- | --- |
| `actions` | `query.search.actions` | Una fila por caso |
| `action_records` | `query.search.action_records` | Una fila por registro, con interacción y autores |
| `messages` | `query.search.messages` | Registros de mensajes |
| `reviews` | `query.search.reviews` | Revisiones solicitadas o completadas |
| `users` | `query.search.users` | Personas |
| `user_identities` | `query.search.user_identities` | Identidades por plataforma |
| `user_ids` | `query.search.user_ids` | Una página ordenada de IDs de persona |
| `comments` | `actions.case.comment.list` | Registros de comentarios |
| `lifecycle_events` | `search.case.event.list` | Asignaciones, cambios de estado, envíos y actividad |
| `listening_results` | `query.search.listening` | Posts de Listening almacenados en un scope explícito |

Las colas, agentes, temas, etiquetas y otras entidades de configuración son operaciones de catálogo.
Descúbrelas con `sift.spec()` en `execute`. No son valores adicionales de `search.source`.

## Entrada de búsqueda común [#entrada-de-búsqueda-común]

Estos campos describen la selección de registros común. Las excepciones específicas de cada fuente siguen a continuación.

| Campo | Tipo y comportamiento |
| --- | --- |
| `filter` | Árbol de filtros estructurado opcional. Cada fuente acepta sus propios campos y operadores. No envíes un string DSL aquí. |
| `dateRange` | Objeto de fecha absoluta o relativa opcional. Ver campos de fecha a continuación. |
| `time` | Objeto de zona horaria y franja horaria opcional. Algunas fuentes rechazan el filtrado por franja horaria. |
| `sort` | Objeto opcional con `field` y `direction` opcional (`asc` o `desc`). Los campos válidos dependen de la fuente. |
| `limit` | Entero positivo opcional. La mayoría de los esquemas de registros aceptan 1–10000, predeterminado 50; los límites de página en tiempo de ejecución pueden ser menores. |
| `cursor` | String opcional. Pasa el `nextCursor` anterior sin cambios con la misma selección. |

### Campos del árbol de filtros [#campos-del-árbol-de-filtros]

| Campo | Tipo y comportamiento |
| --- | --- |
| `filterType` | **Obligatorio** string. Un campo hoja compatible con la fuente, o `and` / `or` para un grupo. |
| `operator` | **Obligatorio** para una hoja. Usa el operador declarado para ese campo. |
| `value` | Valor de hoja. El tipo depende del campo: lista de strings, escalar, booleano u objeto de rango. |
| `filters` | **Obligatorio** para un grupo `and` / `or`. Array de árboles de filtros anidados. |
| `field` | Obligatorio para filtros como `actionCustomField`, `agentCustomField` o `formField`. Nombra el campo registrado. |
| `formId` | Opcional en `formField`. Limita la comparación a un formulario. |
| `tagTypes` | Opcional en cláusulas `tag` / `tagId` compatibles: `USER`, `SYSTEM`, `GEN_AI`. |

Usa `sift.spec` para la unión completa de hojas. Un campo compatible con actions puede fallar en otra fuente.
Los campos, operadores o valores desconocidos no deben ampliar tu consulta silenciosamente.

### Campos específicos de actions [#campos-específicos-de-actions]

| Campo | Tipo y comportamiento |
| --- | --- |
| `dateField` | Reloj opcional. Lee su enum en `query.search.actions`. Una lista de casos lee la fecha de la action; una lista de registros lee `createdAt`. |
| `idsOnly` | Booleano opcional. Omite el enriquecimiento y devuelve identificadores y hora de creación. |
| `includeModerationSummary` | Booleano opcional, desactivado por defecto. Agrega el resumen de evaluación seleccionado donde la moderación está disponible. |

Actions tiene un predeterminado de 50 filas por llamada y devuelve como máximo 500.
Una lista de casos se ordena por `easyId`, `createdAt desc` o `updatedAt desc`.

`query.search.action_records` lista una fila por registro. Acepta los mismos `filter`, `dateRange`, `time`, `dateField`, `idsOnly`, `includeModerationSummary`, `cursor` y `limit`. También acepta estos campos y cualquier orden que liste el esquema:

| Campo | Tipo y comportamiento |
| --- | --- |
| `includeBrandAuthored` | Booleano opcional. Incluye registros creados por la marca, excluidos por defecto. |
| `project` | Array opcional de nombres de columnas adicionales permitidas, por ejemplo `["author", "score", "numComments"]`. Descubre los nombres válidos en el esquema. |

`query.search.actions` rechaza `grain`, `project` e `includeBrandAuthored`, y el rechazo nombra `query.search.action_records`.

### Campos de contexto y mensajes [#campos-de-contexto-y-mensajes]

| Fuente | Campo | Tipo y comportamiento |
| --- | --- | --- |
| `actions` | `context` | `lean` o `full` opcional. Actívalo para leer cada caso con su contexto; `full` agrega más casos previos e historial entre casos. |
| `actions` | `contextFormat` | `text` o `json` opcional. Predeterminado `text`; JSON separa perfil, mensajes, notas e historial. |
| `actions` (with `context`) | `limit` | Predeterminado 5; máximo en tiempo de ejecución 20. Usa páginas pequeñas para contexto completo. |
| `messages` | `externalScope` | `exclude`, `include` u `only` opcional. Predeterminado `exclude`; controla los registros de contexto externo de ambassador. |

Messages ordena por `createdAt` o `id`. Reviews ordena por `createdAt`.
Comments ordena por `createdAt`. Lifecycle events solo admite `createdAt desc`.
Users, comments y lifecycle events no admiten ventanas de franja horaria.

### Campos de personas [#campos-de-personas]

| Campo | Tipo y comportamiento |
| --- | --- |
| `windowKind` | `community`, `activity`, `first_activity` o `snapshot` opcional. |
| `userProfiles` | Objeto opcional. |
| `userProfiles.fetchCustomFields` | Booleano opcional, predeterminado false. Agrega campos de usuario definidos por la organización. |
| `userProfiles.filter` | Objeto opcional con los interruptores a continuación. Todo lo demás sobre quién es una persona va en `filter`. |

`scope` se retiró. Las identidades por plataforma son `query.search.user_identities` (solo un filtro `keyword` y paginación). Una página ordenada de IDs de perfil es `query.search.user_ids` (solo un filtro de personas y paginación).
Busca a una persona por nombre, handle o correo con una hoja `keyword` en `filter`. Envía los límites de volumen como una hoja `volume30d`.
La ventana de comunidad es `windowKind` y `dateRange` del nivel superior.
Un rango de fechas solo no convierte un snapshot de People en una población de usuarios activos.

| Campo de `userProfiles.filter` | Tipo y comportamiento |
| --- | --- |
| `filterEmptyRecords` | Booleano opcional, predeterminado true. Conserva perfiles con registros vinculados y no eliminados. |
| `championsOnly`, `excludeChampions` | Booleanos opcionales. Incluye solo champions o los excluye. |
| `championTerms` | Array de strings opcional. Términos de coincidencia de champions. |
| `staffOnly`, `excludeStaff` | Booleanos opcionales. Incluye solo personal de la comunidad o lo excluye. |
| `staffTerms` | Array de strings opcional. Términos de coincidencia del personal de la comunidad. |
| `requirePeriodActivity` | Booleano opcional. Modo comunidad con ventana; requiere contribución dentro de la ventana. |
| `sortModel` | Array opcional con string `colId` obligatorio y `sort` (`asc` / `desc`) por elemento. |

### Campos de Listening [#campos-de-listening]

| Campo | Tipo y comportamiento |
| --- | --- |
| `scope` | Objeto opcional con `from` y `to` obligatorios, y `filters` opcional. No lo combines con `dateRange`. |
| `scope.filters.filterTree` | Árbol de filtros de vista guardada opcional. El `filter` de nivel superior lo reduce. |
| `filter` | Árbol de filtros de Listening estructurado opcional. |
| `dateRange`, `time` | Campos de ventana comunes opcionales. Usa la ventana de Listening prevista. |
| `sort` | Campo de engagement almacenado opcional, `authorFollowers` u `observedAt`. Predeterminado `observedAt desc`; el orden de observación ascendente se rechaza. |
| `limit` | Entero opcional, 1–100; predeterminado 50. |
| `cursor` | Token de continuación previo opcional. |

Listening requiere autenticación personal y la funcionalidad de Listening de la organización.
Su `from` de scope es inclusivo y `to` es exclusivo. El análisis clasificado puede detenerse en un límite acotado.
Lee los metadatos de ventana y scope devueltos. No reportes un conjunto acotado como todos los posts coincidentes.

## Fechas, zona horaria y ordenamiento [#fechas-zona-horaria-y-ordenamiento]

| Campo | Tipo y comportamiento |
| --- | --- |
| `dateRange.from`, `dateRange.to` | Strings **obligatorios** para una ventana absoluta. Fecha o fecha-hora ISO. El fin no debe preceder al inicio. |
| `dateRange.relative.unit` | **Obligatorio** `day`, `week`, `month` o `year`. |
| `dateRange.relative.count` | **Obligatorio** entero, 1–3660. |
| `dateRange.relative.calendar` | **Obligatorio** booleano. `true` comienza en el límite de una unidad de calendario. |
| `dateRange.relative.includeCurrent` | **Obligatorio** booleano. Incluye el día actual o termina antes de él. |
| `time.timezone` | Zona horaria IANA opcional. Usa por defecto la zona horaria de la organización, luego UTC. |
| `time.timeOfDay.from`, `time.timeOfDay.to` | Strings `HH:mm` **obligatorios** cuando hay una ventana de reloj. Un inicio posterior al fin cruza la medianoche. |
| `sort.field` | Campo de ordenamiento específico de la fuente. Obligatorio en objetos de ordenamiento de registros; opcional en analítica. |
| `sort.direction` | `asc` o `desc` opcional. Analítica usa `desc` por defecto. |

Usa una ventana absoluta o relativa. Las ventanas de consulta resueltas usan un límite UTC `to` exclusivo.
Los límites de solo fecha representan días de calendario en la zona horaria seleccionada. Lee los límites resueltos en los metadatos del resultado.
El endpoint REST de lista de actions tiene reglas de fecha diferentes; consulta su referencia.

## Campos de entrada de analítica [#campos-de-entrada-de-analítica]

Pasa esta consulta directamente a `sift.call("query.analytics.<source>", query)`.

| Campo | Tipo y comportamiento |
| --- | --- |
| `v` | **Obligatorio** literal `1`. |
| `source` | **Obligatorio** fuente de datos compatible. Descubre los IDs de fuente en el esquema y la guía de analítica. |
| `filter` | Árbol estructurado opcional para toda la consulta. |
| `dateRange`, `time` | Campos de ventana y zona horaria opcionales descritos anteriormente. |
| `lines` | **Obligatorio** array con al menos una línea medida. |
| `groupBy` | **Obligatorio** array de dimensiones. Usa un array vacío para un resultado sin agrupación. |
| `sort` | Ordenamiento de resultados opcional. |
| `limit` | Entero positivo opcional; máximo de filas de resultado. |
| `options` | Opciones específicas de la fuente opcionales a continuación. |

### Campos de línea medida [#campos-de-línea-medida]

| Campo | Tipo y comportamiento |
| --- | --- |
| `measure` | **Obligatorio** ID de métrica no vacío. La validez depende de la fuente. |
| `aggregation` | **Obligatorio** `sum`, `avg`, `median`, `p75`, `p90`, `p95`, `p99`, `count`, `min`, `max` o `percentage`. |
| `label` | String de visualización opcional; se repite en los metadatos. |
| `filter` | Árbol opcional. Reduce esta línea dentro del filtro de la consulta. |
| `customFieldKey` | Campo de action numérico registrado opcional. |
| `sampleCount` | Literal `rows` opcional. Agrega el tamaño de muestra de la línea. |
| `formula` | Línea calculada opcional; reemplaza la agregación simple. |
| `formula.op` | **Obligatorio** `divide`, `percent_of`, `subtract` o `add`. |
| `formula.left`, `formula.right` | Objetos de operando **obligatorios**. |
| Operando `measure`, `aggregation` | **Obligatorio** ID de métrica y agregación. |
| Operando `filter` | Árbol opcional. Reduce el operando dentro del filtro de línea. |
| `formula.round` | Entero opcional. Decimales; omite para evitar redondeo. |

Cada objeto de agrupación tiene `field` obligatorio y `customFieldKey` opcional.
La compatibilidad de métricas y dimensiones depende de la fuente. Lee la guía de analítica y el contrato exacto de la operación antes de adivinar IDs.

### Opciones de analítica [#opciones-de-analítica]

| Campo | Tipo y comportamiento |
| --- | --- |
| `windowKind` | `community`, `activity`, `first_activity` o `snapshot` opcional para poblaciones de Users. |
| `dateField` | Reloj de action opcional del esquema. |
| `threshold` | Umbral numérico opcional para una métrica de umbral. |
| `asOf` | `range_end` opcional. Lee el estado histórico de la action al final de la ventana. |
| `comparison` | `previous_period` o `previous_year` opcional. |
| `comparisonOutput` | `paired`, `delta`, `percent_change` o `new_members` opcional. |
| `excludeSystemAgents` | Booleano opcional. Excluye agentes del sistema. |
| `includeAgentAttribution` | Booleano opcional. Agrega el agente que realizó el trabajo. |
| `fillEmpty` | Booleano opcional. Rellena con cero los intervalos de tiempo vacíos. |
| `resultKind` | Literal `transitions` opcional. Devuelve transiciones de estado. |

## Encontrar campos y valores [#encontrar-campos-y-valores]

Lee los campos y las métricas de una fuente de datos con `sift.spec("query.analytics.<source>")`. Devuelve la declaración TypeScript de la consulta, con una línea de comentario por campo de filtro: su nombre, sus operadores y la fuente de lista que tiene sus valores.

Lista los valores de un campo con esa fuente de lista: `sift.call("query.search.<list>", input)`. Las listas son `tags`, `tag_groups`, `channels`, `queues`, `teammates`, `servers`, `goals`, `saved_searches`, `themes`, `statuses`, `platforms`, `competitors`, `discord_roles`, `qa_forms`, `user_groups`, `gainsight_values`, `custom_fields` y `custom_field_options`. Las personas vienen de `query.search.users`: busque a una persona con una hoja `keyword`, `{ filter: { filterType: "keyword", operator: "contains", value: ["<palabras>"] } }`.

| Campo | Tipo y comportamiento |
| --- | --- |
| `name` | Cadena opcional. Conserva las filas cuyo nombre la contiene. |
| `ids` | Arreglo opcional. Devuelve exactamente esas filas. |
| `budget` | Entero opcional. Tokens por página; 4.000 por defecto, como máximo 15.000. |
| `cursor` | Cadena opcional. Pasa el `nextCursor` anterior sin cambios. |

Cada fila tiene `id` y `name`. Pon `id` en una hoja de filtro; un nombre se rechaza. La etiqueta de un campo personalizado es su nombre de campo: lista los campos con `query.search.custom_fields { source }` y las opciones de un campo con `query.search.custom_field_options { field }`.

## Campos de búsqueda de creadores [#campos-de-búsqueda-de-creadores]

Usa la búsqueda externa de creadores solo cuando el usuario lo solicite. Llama a `social.profile.get` con `sift.call`. No es una búsqueda almacenada de Sift.

| Campo de entrada | Tipo y comportamiento |
| --- | --- |
| `url` | **Obligatorio** URL pública de perfil o de agregador de enlaces compatible, no vacía. |
| `includeDemographics` | Booleano opcional, predeterminado true. Solicita inferencia de edad y género a partir de la foto. |

| Campo de salida | Significado |
| --- | --- |
| `url` | URL solicitada. |
| `demographics` | Objeto nullable: `ageLow`, `ageHigh`, `gender` y `confidence` (0–100) opcionales. Son inferencias, no hechos verificados. |
| `expandedIdentity` | Identidad de agregador nullable con `provider`, `sourceUrl`, datos de perfil opcionales y enlaces de plataforma. |
| `untrustedContentNotice` | Recordatorio de tratar el texto público como evidencia. |

`expandedIdentity.provider` es `linktree`, `linkme`, `komi`, `pillar`, `linkbio` o `beacons`.
Sus campos obligatorios son `provider`, `sourceUrl`, `verticals` (array de strings) y `destinations` (array).
Los strings opcionales son `username`, `displayName`, `bio`, `avatarUrl` y `email`.
Cada destino tiene `platform` y `url` string obligatorios, y `title` string opcional.
Los datos faltantes permanecen faltantes.

## Campos de herramientas de app y respuesta [#campos-de-herramientas-de-app-y-respuesta]

Usa estas herramientas solo cuando el servidor conectado las anuncie. Las vistas de app requieren OAuth personal.
La app integrada sigue siendo un prototipo de desarrollo; el texto y los enlaces nativos pueden funcionar sin una vista integrada.

| Herramienta | Campos |
| --- | --- |
| `open_inbox` | `scope` opcional: `queues` (predeterminado) o `mine`; `search` recortado opcional de hasta 200 caracteres; `cursor` opcional; `limit` entero opcional 1–50, predeterminado 30. |
| `open_action` | `actionId` no vacío **obligatorio**. |
| `open_dashboard` | `slug`, `from` y `to` no vacíos **obligatorios**. |
| `open_dashboard_evidence` | `slug`, `widgetId`, `from`, `to`, `expectedUpdatedAt` **obligatorios**; `cursor` opcional; `limit` entero opcional 1–50, predeterminado 20. |
| `prepare_reply` | UUID `requestId` **obligatorio**, `actionId` no vacío, `text` recortado de 1–24000 caracteres; `serverId` no vacío opcional; booleano `isPublicReply` opcional. |
| `review_reply`, `send_reply` | Solo UUID `requestId` **obligatorio**. La confirmación humana proporciona la decisión. |
| `open_reply`, `get_reply_request` | Solo UUID `requestId` **obligatorio**. Lee el estado de preparación y entrega. |
| `review_handle_reply` | UUID `requestId` **obligatorio** para la solicitud de revisión del propietario de la cuenta. OAuth personal; sin campo de decisión. |
| `save_reply_draft` | Solo app. `actionId` **obligatorio**, `expectedRevision` (64 caracteres), `clientMutationId` (8–128 caracteres), `text` recortado (1–10000 caracteres) y `replyAccountId`. Guarda una revisión de correo electrónico pendiente; nunca envía. |

`expectedUpdatedAt` vincula la evidencia a la revisión guardada del dashboard.
`expectedRevision` vincula un borrador al contexto de respuesta actual. Usa los valores devueltos por la lectura anterior.
`clientMutationId` es una clave de reintento. Reutilízala solo para el mismo borrador.
`serverId` selecciona la cuenta de envío. `isPublicReply` selecciona el modo público o privado.
`requestId` vincula una respuesta inmutable; un borrador modificado requiere un nuevo UUID.

## Campos de Events [#campos-de-events]

Events requiere un cliente moderno, una capacidad de Events anunciada y OAuth personal.
Usa `events/list` para descubrir el evento `action.message_received` compatible y su esquema de payload.
Cubre mensajes futuros entrantes de Instagram y Messenger en una action. Excluye el backfill y las respuestas de la marca.

| Método | Campos |
| --- | --- |
| `events/list` | `cursor` opcional; omítelo para el catálogo de eventos de una sola página actual. |
| `events/subscribe` | `name` **obligatorio**: `action.message_received`; `arguments.actionId` obligatorio; `delivery.mode` obligatorio: `webhook`; `delivery.url` y `delivery.secret` obligatorios; `cursor` opcional: null; entero positivo o null `ttlMs` opcional. |
| `events/unsubscribe` | UUID `id` **obligatorio** de la suscripción. |

El callback debe usar HTTPS y pasar la verificación. El secret usa `whsec_` con 24–64 bytes de clave codificados en base64.
Guárdalo en un almacén de secrets. La suscripción tiene una vida útil finita; conserva su expiración devuelta.

Los campos del payload son `eventId` (UUID), `name`, `timestamp` (fecha-hora ISO), `data.actionId`, `data.recordId`, `data.url` y `cursor` (null).
Verifica los encabezados de webhook firmados antes de procesar. Lee la action para obtener evidencia actual; un evento no es permiso para enviar.

## Campos de resultado y descubrimiento de esquema [#campos-de-resultado-y-descubrimiento-de-esquema]

Dentro de `execute`, `sift.call` devuelve el resultado de la operación. Si la operación falla, lanza un Error cuyo mensaje indica el `code`, el `message` y los campos con error.
Un resultado que requiere aprobación no contiene una escritura completada.

```js
// La declaración TypeScript de la operación: sus tipos de entrada y de salida.
return await sift.spec("query.analytics.actions")
```

`sift.spec(id)` devuelve una operación como declaración TypeScript: `declare function call(id, input: XInput): Promise<XOutput>`, con la descripción de cada campo como comentario. La entrada y la salida son tipos con nombre en el mismo texto. Un tipo que se repite, como el árbol de filtros, se escribe una vez y se usa por su nombre. La declaración se genera del mismo esquema con el que valida el servidor, así que sigue al día cuando el servidor cambia. Los clientes HTTP leen el mismo contrato como JSON Schema en OpenAPI.

`sift.spec()` sin id devuelve el índice del catálogo: `id`, `productFamily`, `aliases` opcional, `summary`, `description`, `domain`, `effect`, `access`, `ui`, `url`, `discovery`, `examples` opcional, `inputSchema` y `outputSchema`. Fíltralo en código y devuelve solo lo que necesitas.

### Salida de búsqueda [#salida-de-búsqueda]

Lee `items` y `nextCursor`. Un cursor null termina la lista. La búsqueda no devuelve un total.
Los metadatos de fuente varían; inspecciona el esquema de salida. Una primera página vacía incluye `emptyReason`.
Las filas de action pueden incluir `id`, `actionId`, `threadId`, `userId`, `username`, `author`, `engagement`, `platform`, `operationStatus`, `channelId`, `channel`, `summary`, `description`, `matchedText`, `easyId`, `easyIdNumber`, `link` y `url`.

Usa `actionId` para un caso, `link` para su página en Sift y `url` para evidencia pública de la fuente.
Los campos pueden ser null o estar ausentes. Las proyecciones agregan columnas específicas de la fuente; no asumas que todas las filas contienen todos los campos.

### Salida de analítica [#salida-de-analítica]

| Campo | Significado |
| --- | --- |
| `rows` | Valores de agrupación y valores de líneas medidas. |
| `_filter` de fila | Selección de registros detrás del grupo. Combínala con los filtros de consulta y línea para lecturas de evidencia. |
| `_window` de fila | Ventana opcional para un intervalo de reloj de action. |
| `meta.queryJSON` | Consulta exacta que se ejecutó, incluyendo scope resuelto y valores predeterminados. |
| `meta.source` | Fuente resuelta. |
| `meta.dateField` | Reloj de action resuelto opcional. |
| `meta.dateRange` | Ventana `from` / `to` resuelta opcional; `to` es exclusivo. |
| `meta.appliedDefaults` | Array de `id` y `summary` para los valores predeterminados aplicados. |
| `meta.truncated` | Si existen más filas de las devueltas. |
| `meta.lines` | Por línea: `key`, `label`, `measure`, `aggregation`, `sampleCountKey` y `windowKind` opcionales. |
| `meta.units` | Unidades opcionales. Lee antes de mostrar duraciones o puntuaciones. |
| `comparison` | `dateRange` y `rows` del período anterior opcionales. |

Lee los valores por `meta.lines[].key`, no por un nombre de columna adivinado.
Las herramientas de app devuelven su vista en `structuredContent`. Conserva la URL nativa y los campos de vista versionados.
Usa el esquema de salida conectado para una proyección completa de la app; no trates un resultado de app como un envelope de búsqueda.

## Consejos [#consejos]

- Lee los esquemas antes de nuevas operaciones. No inferas campos a partir de nombres de herramientas.
- Usa IDs reales devueltos. Las etiquetas y nombres de usuario no reemplazan todos los campos de ID.
- Conserva el scope de paginación y los enlaces de evidencia devueltos.
- Mantén las credenciales fuera de `code` y otros argumentos de herramientas.

Consulta el [Diccionario de campos de registros](/docs/developer/record-fields) para entender `pmid`, `prid`, otras claves cortas y los campos anidados de los resultados.

## Relacionado [#relacionado]

<Cards>
  <Card href="/docs/developer/agent-guide" title="Guía de agente">Procedimiento de trabajo y recetas copiables.</Card>
  <Card href="/docs/developer/mcp-connections" title="Conexiones MCP">Autenticación y campos de conexión.</Card>
  <Card href="/docs/developer/api-reference" title="Referencia de campos de API">Los contratos REST separados.</Card>
</Cards>
