Maqui Analytics
Server Details
Marketing analytics for local businesses — Instagram, ads, web traffic, SEO and reviews.
- Status
- Healthy
- Uptime
- 29.2% over 78 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- somosmaqui/maqui-mcp
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 22 tools
Most tools are clearly separated by data source and metric type: GA4 traffic, Search Console organic visibility, Clarity UX friction, Google Ads, Meta Ads, Instagram organic, leads, reviews, and sales all have distinct scopes. A few areas could still be confused, especially the multiple page-level tools (GA4 vs Search Console vs Clarity) and keyword/search-term/query tools across ads and SEO, but the descriptions do a good job clarifying boundaries.
Tool names follow a very predictable snake_case pattern: get_*_summary for aggregate metrics, list_* for breakdowns, and source-specific prefixes such as google_ads, instagram, search_console, and clarity. The few non-summary get_ tools (get_leads, get_reviews, get_sales) still fit the same verb-resource convention.
Twenty-two tools is slightly heavy but justified by the broad multi-platform analytics scope: GA4, Clarity, Google Ads, Meta Ads, Instagram, Search Console, CRM leads, reviews, and POS sales. Each tool appears to cover a distinct reporting need, though some summarization could reduce the surface.
The set covers core read-only analytics needs across summaries, pages, traffic sources, campaigns, keywords, search terms, hashtags, top posts, leads, reviews, and sales. Minor gaps remain around consistent time-series/trend tools, period comparisons, and deeper breakdowns such as ad sets or conversion paths, but the main workflows are covered.
Available Tools
22 toolsget_analytics_summaryResumen de Google AnalyticsARead-onlyInspect
[DEMO SINTÉTICA] Tráfico al sitio web según Google Analytics 4: sesiones, suma de usuarios diarios (no usuarios únicos del período), usuarios nuevos, páginas vistas, bounce rate, duración promedio de sesión y conversiones. Responde preguntas sobre "visitas", "tráfico del sitio", "cuántas personas entraron", "usuarios de la web" o "page views"; es lo que un cliente suele querer decir con "visitas".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tráfico web de todos los canales según GA4. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, closed-world behavior, so the description does not need to repeat safety. It adds valuable behavioral nuance by specifying that "usuarios" is the sum of daily users, not unique users for the period—a subtle but important detail for correct interpretation. It does not cover data freshness or timezone handling, but that is a minor gap given the annotations and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the metric list before the usage phrases. The first sentence is dense but every clause names a distinct metric or clarifies aggregation, so little is wasted. The synthetic demo marker is non-functional noise, but the rest is efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, annotations cover safety and openness, and the single parameter is fully documented in the schema. The description supplies the metric list, the colloquial query mapping, and the daily-user aggregation caveat, which is everything an agent needs to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (date_range) with 100% schema description coverage, including examples and a default. The description does not add any further meaning or formatting guidance for date_range, so the schema carries the parameter semantics alone, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (Google Analytics 4 traffic) and lists the exact metrics returned (sessions, daily user sum, new users, page views, bounce rate, session duration, conversions). It is clear what the tool does, but it does not explicitly name or distinguish itself from sibling summary tools like get_search_console_summary or list_analytics_pages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context by mapping common user phrasings ("visitas", "tráfico del sitio", "cuántas personas entraron", "page views") to this tool. However, it does not state when not to use it or name alternative tools for adjacent queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_clarity_summaryComportamiento en el sitioARead-onlyInspect
[DEMO SINTÉTICA] Comportamiento y fricción de los visitantes en el sitio según Microsoft Clarity: scroll promedio, tiempo activo por sesión y tasas de rage clicks (clics repetidos por frustración), dead clicks (clics sin respuesta), quickbacks (entra y vuelve atrás en segundos), scroll excesivo, error clicks y errores de JavaScript. Sirve para preguntas de CRO/UX: "por qué no convierte", "dónde se frustran", "experiencia de usuario", "fricción". No mide volumen de tráfico. Los datos empiezan el día del alta en Clarity (no hay histórico previo).
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Comportamiento según Clarity; agregados null cuando no hay filas. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/openWorld=false, so the safety profile is covered. The description adds a genuinely useful behavioral caveat the annotations don't carry: data begins on the Clarity signup date with no prior history, which prevents the agent from promising historical comparisons. Return values are covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and metric list, then usage framing, then limits — a sensible order. It is a long single paragraph and the '[DEMO SINTÉTICA]' prefix is non-informative noise, but otherwise every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read-only summary tool with an output schema and full annotations, the description covers what is measured, what questions it answers, what it excludes, and the data-availability constraint. Nothing material an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and the schema description already documents date_range with formats and a default (100% coverage). The description adds no additional date-range semantics, so the schema does the heavy lifting — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (Microsoft Clarity visitor behavior/friction) and enumerates the exact metrics returned: scroll depth, active time, rage clicks, dead clicks, quickbacks, excessive scroll, error clicks, JS errors. It also explicitly carves out what it is not ('No mide volumen de tráfico'), which separates it from get_analytics_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete CRO/UX question patterns ('por qué no convierte', 'dónde se frustran') that tell the agent when to pick this tool, plus an explicit exclusion for traffic-volume queries. It never names the sibling that does handle volume (e.g. get_analytics_summary), so routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_google_ads_summaryResumen de Google AdsARead-onlyInspect
[DEMO SINTÉTICA] Performance de Google Ads (publicidad pagada en Google Search/Display/YouTube). Gasto, impresiones, clics, CTR, CPC, conversiones, CPA, ROAS. Sirve para "Google Ads", "publicidad en Google", "campañas pagas", "cuánto gastamos en Google", "anuncios de Google".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Publicidad pagada en Google; conversiones atribuidas no equivalen necesariamente a ventas del POS. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so safety is covered structurally. The description adds that the data is synthetic ([DEMO SINTÉTICA]) and which metrics come back, but says nothing about aggregation granularity, time-zone handling, or empty-data behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and metric list are front-loaded in one sentence, followed by a routing keyword list. The keyword list is somewhat redundant filler, but it is short and serves query matching.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single optional parameter is fully covered by the schema. What is missing is only the relationship to the per-entity Google Ads list siblings, which is a minor gap for a simple read-only summary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the single date_range parameter is documented with examples and a default (últimos 30 días). The description adds nothing about the parameter, so the baseline 3 applies — the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (Google Ads performance) and enumerates the metrics returned (spend, impressions, clicks, CTR, CPC, conversions, CPA, ROAS), which clearly marks it as the aggregate summary rather than a per-entity listing. It does not explicitly name the sibling list tools it replaces, so differentiation is implied by the metric list rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The quoted trigger phrases ("cuánto gastamos en Google", "campañas pagas", "anuncios de Google") give an agent a clear signal for when this tool applies. However, there is no exclusion guidance — nothing says to use list_google_ads_campaigns or list_google_ads_keywords instead when a breakdown is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instagram_follower_growthCrecimiento de seguidoresARead-onlyInspect
[DEMO SINTÉTICA] Evolución de la cantidad de seguidores de Instagram en el tiempo: serie diaria con total absoluto y crecimiento porcentual. Sirve para "crecimiento de seguidores", "ganamos/perdimos seguidores", "evolución de la audiencia".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Evolución de seguidores; ausencia de snapshots no equivale a crecimiento cero. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine value by disclosing the return content (daily series, absolute totals and percentage growth), which tells the agent what to expect beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, and the example intents are compact. The '[DEMO SINTÉTICA]' prefix and quoted phrases add slight noise but serve routing value, so only minor trimming is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-parameter analytics tool with an output schema and full schema description coverage, the description is largely complete: purpose, output nature, and use cases are all covered. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 100% and the single date_range parameter fully documented in the schema (including examples and a default), the schema does the heavy lifting. The description adds no additional parameter semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: the evolution of Instagram follower count over time, and specifies the output shape ('serie diaria con total absoluto y crecimiento porcentual'). It's clear what the tool returns, though it doesn't explicitly contrast with get_instagram_summary or other siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete intent phrases ('crecimiento de seguidores', 'ganamos/perdimos seguidores', 'evolución de la audiencia') that map user queries to this tool, giving clear routing context. It stops short of naming when NOT to use it or pointing to sibling alternatives like get_instagram_summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instagram_summaryResumen de InstagramARead-onlyInspect
[DEMO SINTÉTICA] Performance de Instagram orgánico (no pagado). Métricas agregadas de posts: alcance total, engagement rate, likes, comentarios, guardados, compartidos. Sirve para preguntas sobre "Instagram", "redes sociales", "alcance" o "engagement" sin contexto de publicidad pagada.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Instagram orgánico del período. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the bar is lower. The description still adds a substantive behavioral fact beyond them: the response is aggregated at the account level rather than per-post, which determines whether the agent should reach for list_instagram_top_posts instead. It says nothing about result size or freshness, but the output schema presumably handles shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: scope first, routing keywords second, with zero redundancy. The '[DEMO SINTÉTICA]' prefix is the only wasted token, though it is a deliberate marker rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single fully-described optional parameter, an output schema, and complete annotations, this description supplies everything remaining: what the tool aggregates, what it excludes (paid), and when to pick it. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional date_range parameter is documented with examples, formats and a default. The description adds nothing about parameters, which is acceptable but earns only the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource: aggregated organic Instagram post metrics, and enumerates exactly which metrics (reach, engagement rate, likes, comments, saves, shares). The '(no pagado)' qualifier and the closing clause separate it cleanly from get_meta_ads_summary without requiring the agent to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the question phrasings that should route here ('Instagram', 'redes sociales', 'alcance', 'engagement') and excludes paid-advertising context. It does not, however, name the sibling that covers paid Instagram ads, nor does it distinguish itself from get_instagram_follower_growth or list_instagram_top_posts, which are plausible confusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leadsLeadsARead-onlyInspect
[DEMO SINTÉTICA] Leads/prospectos capturados desde formularios del sitio y campañas: total del período, conteo por estado en el pipeline (nuevo/contactado/calificado/cerrado/perdido) y, por lead, nombre, fuente de captación, estado y fecha. No incluye email, teléfono ni notas. Sirve para "leads", "prospectos", "formularios", "contactos nuevos", "pipeline de ventas". Solo disponible si la cuenta tiene CRM habilitado.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filtrar por estado: nuevo, contactado, calificado, cerrado, perdido | |
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, closed-world behavior. The description adds valuable context beyond annotations: CRM availability gating, included aggregate breakdowns, included per-lead fields, and excluded fields such as email, phone, and notes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the resource and return contents, followed by trigger terms and an availability condition. It is mostly efficient, though the single long first sentence could be easier to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that annotations cover safety semantics and an output schema exists, the description provides enough context to call the tool correctly: what is returned, what is excluded, and the account-level CRM prerequisite. No critical ambiguity remains for a read-only leads summary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters are already documented in the schema, including status values and date-range examples/default. The description does not add syntax or usage detail for the parameters beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific retrieval resource (leads/prospectos captured from forms and campaigns) and enumerates the returned aggregates and per-lead fields. It also explicitly excludes sensitive fields, making the scope distinguishable from broader analytics or sales tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful trigger terms ("leads", "prospectos", "formularios", "contactos nuevos", "pipeline de ventas") and a prerequisite: CRM must be enabled. However, it does not explicitly name when to prefer this over a sibling tool or give when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meta_ads_summaryResumen de Meta AdsARead-onlyInspect
[DEMO SINTÉTICA] Performance de Meta Ads (publicidad pagada en Facebook e Instagram). Gasto, alcance, impresiones, clics, CTR, CPM, mensajes, leads, compras. Sirve para "Meta Ads", "Facebook Ads", "publicidad en Instagram pagada", "cuánto gastamos en Meta", "anuncios de Facebook". Solo publicidad pagada; no incluye Instagram orgánico.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Publicidad pagada en Facebook e Instagram, independiente del Instagram orgánico. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond them by naming the metric set and the paid-only scope, though it says nothing about data freshness, attribution windows, or account/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose, metric list and scope caveat are all front-loaded and waste-free. The "[DEMO SINTÉTICA]" prefix and the long quoted alias list consume space but serve retrieval matching rather than the calling agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be explained, and the description still enumerates the key metrics and the paid-vs-organic boundary. For a one-parameter read-only summary tool, an agent has everything needed to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter with 100% schema description coverage, including accepted formats and the default of last 30 days. The description adds no parameter guidance beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (Meta Ads / paid Facebook & Instagram advertising) and enumerates the exact metrics returned (spend, reach, impressions, clicks, CTR, CPM, messages, leads, purchases). It also draws an explicit boundary against organic Instagram, which separates it from get_instagram_summary and get_analytics_summary without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a rich set of trigger phrases ("cuánto gastamos en Meta", "anuncios de Facebook") and an explicit exclusion ("Solo publicidad pagada; no incluye Instagram orgánico"). It stops short of routing the agent to the natural drill-down sibling, list_meta_ads_campaigns, when campaign-level detail is needed instead of a summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reviewsReseñasARead-onlyInspect
[DEMO SINTÉTICA] Reseñas de Google Business Profile y otras plataformas (Facebook): rating promedio, conteo total, tasa de respuesta y últimas reseñas con autor, rating, texto y si fueron respondidas. Sirve para "reseñas", "reputación", "qué dicen los clientes", "rating en Google", "reviews".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. | |
| min_rating | No | Filtrar reseñas con rating mínimo (1-5). Omitir para ver todas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Reputación y reseñas del período. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile needs no restating. The description adds one real behavioral fact beyond them — that data spans Google Business Profile AND Facebook — but says nothing about refresh cadence, account/location scoping, or why Google is named first while the title implies only reviews.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the substantive payload before the intent keywords. The keyword string is somewhat stuffed and the '[DEMO SINTÉTICA]' prefix is noise, but neither obscures the core statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't document return structure, and the 100%-covered two-param schema needs no explanation. What it covers — sources, metrics, and routing intents — is sufficient to call the tool correctly; only the multi-location/multi-account scoping question is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters (date_range with worked format examples and a default, min_rating with its 1-5 range) are fully documented in the schema. The description adds no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieves Google Business Profile and Facebook reviews, and enumerates the payload (average rating, total count, response rate, latest reviews with author/rating/text/response status). This is far more specific than a title restatement, and no sibling tool covers reviews, though it never explicitly names a sibling it differs from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'sirve para' clause maps concrete user intents ("reseñas", "reputación", "qué dicen los clientes", "rating en Google") onto this tool, which is genuinely useful routing guidance for an agent choosing among 21 summary/list tools. It stops short of stating when NOT to use it or which sibling to pick when the user wants ads or traffic data instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_salesVentasARead-onlyInspect
[DEMO SINTÉTICA] Ventas del restaurante registradas en Fudo (sistema POS gastronómico): total facturado, cantidad de tickets, ticket promedio, desglose por canal (Local, Delivery, Mostrador). Sirve para "ventas", "facturación", "ingresos", "tickets", "qué vendimos". Solo disponible para restaurantes/locales con Fudo conectado.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuine context beyond that: the upstream data source (Fudo POS), the precondition that Fudo must be connected, and the synthetic/demo nature of the data — all of which affect whether results can be trusted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the payload contents, followed by the usage triggers and the availability caveat. The [DEMO SINTÉTICA] prefix is the only overhead and it carries real information about data provenance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, annotations cover the safety profile, and the one parameter is fully described in the schema. The description fills the remaining gaps — data source, prerequisites, and intended query phrases — leaving nothing an agent needs before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional date_range parameter is fully documented with examples and a default, so the schema does the heavy lifting. The description adds no additional semantics about the period parameter, which is the expected baseline when coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (sales recorded in Fudo POS) and enumerates the exact metrics returned: total billed, ticket count, average ticket, and channel breakdown (Local, Delivery, Mostrador). This clearly separates it from the sibling tools, which are all ad/analytics-platform summaries rather than POS revenue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger vocabulary ("ventas", "facturación", "ingresos", "tickets", "qué vendimos") and a hard availability condition: only for restaurants/locations with Fudo connected. It does not name an alternative tool or an exclusion case, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_search_console_summaryResumen de Search ConsoleARead-onlyInspect
[DEMO SINTÉTICA] Visibilidad del sitio en resultados ORGÁNICOS de Google (no pagado, no GA4): clics desde búsqueda, impresiones (cuántas veces aparecimos), CTR y posición promedio. Sirve para preguntas sobre "SEO", "posicionamiento", "ranking", "búsquedas orgánicas" o "aparecemos en Google". No mide visitas totales al sitio, solo lo que llega desde la búsqueda orgánica.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Visibilidad orgánica en Google; clics no son sesiones de GA4. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and non-destructive behavior, so the description correctly focuses on scope instead: what is measured, what is excluded (paid, GA4, total site visits), and the default period. It adds no information about data freshness or attribution lag, which is the one behavioral trait an agent might still need.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scope statement is front-loaded, the metric list is compact, and the exclusion clause is placed at the end where it belongs. The list of quoted trigger keywords is slightly verbose but earns its place for routing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotation coverage, and one well-documented optional parameter, the description is nearly complete. Only data-freshness/caching behavior is unaddressed, which would matter for a time-sensitive reporting tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage including examples and default, so the schema carries the full burden. The description adds nothing about date_range format or constraints, which is acceptable at this coverage level (baseline 3).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource (site visibility in organic Google results) and enumerates the exact metrics returned: clicks from search, impressions, CTR and average position. It explicitly excludes paid traffic and GA4, which cleanly separates it from siblings like get_analytics_summary and get_google_ads_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete trigger phrasing ("SEO", "posicionamiento", "ranking", "búsquedas orgánicas", "aparecemos en Google") and a negative condition ("No mide visitas totales al sitio"), which is strong routing guidance. It does not name an alternative sibling tool for total-traffic questions, so the agent has to infer that get_analytics_summary is the fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_analytics_pagesPáginas más visitadasARead-onlyInspect
[DEMO SINTÉTICA] Páginas más visitadas del sitio web según GA4: path, page views, sesiones, suma de usuarios diarios por página (no únicos del período), bounce rate y tiempo promedio. Sirve para "páginas más vistas", "contenido más popular", "qué páginas funcionan", "top landing pages".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Páginas del sitio según GA4. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile needs no restating. The description contributes real behavioral context beyond that: 'suma de usuarios diarios por página (no únicos del período)' warns that the user metric is a sum of daily users, not period-unique users — a nuance that would otherwise cause misreading of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence front-loads the resource and its metrics, followed by a short routing clause; little is wasted. The '[DEMO SINTÉTICA]' prefix and the long metric list slightly dilute density but the structure remains front-loaded and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so there is no need to describe the return envelope, and the metric caveat plus usage triggers cover what an agent needs to call and interpret it. The only real gap is the absence of explicit guidance on choosing between this and the search-console/clarity page lists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single date_range parameter is fully documented in the schema with formats and a default. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete resource (GA4 páginas) and enumerates the returned metrics (path, page views, sesiones, bounce rate, tiempo promedio), so an agent knows exactly what this tool produces. Naming GA4 implicitly separates it from the Search Console and Clarity siblings, but it never explicitly contrasts with list_search_console_pages, which also returns page-level data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Sirve para' clause gives concrete user phrasings that should route here ('páginas más vistas', 'contenido más popular', 'qué páginas funcionan', 'top landing pages'), which is strong positive routing signal. It stops short of saying when NOT to use it or which sibling to prefer for page-level traffic from other sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_analytics_traffic_sourcesFuentes de tráficoARead-onlyInspect
[DEMO SINTÉTICA] De dónde vienen los visitantes del sitio: source/medium (google/organic, facebook/social, direct, etc.) con sesiones, usuarios y conversiones. Sirve para "de dónde viene el tráfico", "fuentes de tráfico", "canales de adquisición", "qué porcentaje es orgánico vs pagado".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Adquisición de tráfico en GA4. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety and scope are covered. The description adds the output dimensions (source/medium, sessions, users, conversions), but since an output schema exists, this is supplementary rather than essential behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then gives useful query examples. It is reasonably efficient, though the quoted query phrases are somewhat repetitive and the '[DEMO SINTÉTICA]' marker, while likely metadata, takes up front space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple one-parameter read tool with a full output schema and clear annotations, the description covers what the tool returns and when to use it. It does not need to re-explain safety or parameter details, and the remaining gaps are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the single date_range parameter is fully documented with examples and a default. The description does not mention the parameter at all, so it adds no meaning beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specifically what the tool returns: traffic sources grouped by source/medium with sessions, users, and conversions. This distinguishes it from page-level siblings like list_analytics_pages, but it does not explicitly name alternatives or clarify when to use this versus get_analytics_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context by listing example questions it answers ('de dónde viene el tráfico', 'fuentes de tráfico', 'canales de adquisición', etc.). It does not explicitly state when NOT to use it or name sibling alternatives, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_clarity_pagesPáginas con fricciónARead-onlyInspect
[DEMO SINTÉTICA] Páginas del sitio ordenadas por sesiones con su fricción según Clarity: scroll promedio, tiempo activo por sesión y tasas (%) de rage clicks, dead clicks, quickbacks, scroll excesivo, error clicks y errores de script. Sirve para "qué página arreglar primero", "dónde se frustran los usuarios", "landing con problemas de UX", "CRO por página". Se puede filtrar por dispositivo para separar móvil de escritorio.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Opcional: PC, Mobile, Tablet u Other. Sin valor, todas. | |
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Fricción por página y dispositivo. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context: pages are ordered by sessions and include friction metrics such as average scroll, active time per session, and several click/scroll/script error rates. It does not mention pagination or result limits, but the output schema covers return structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and metric list, then gives usage examples and the device filter. It is appropriately sized, though the long first sentence packs many details together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that annotations cover safety, the schema fully documents both optional parameters, and an output schema exists, the description provides enough context to select and call the tool. Minor missing details like ordering behavior beyond 'by sessions' or limits are not essential here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters are already documented there, including device values and date_range examples. The description mentions device filtering to separate mobile from desktop, but adds no syntax or semantics beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and operation: site pages ordered by sessions with Clarity friction metrics, including the exact metrics returned. It is not explicitly contrasted with sibling tools like list_clarity_sources or get_clarity_summary, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context with example questions it answers (which page to fix first, where users get frustrated, landing-page UX issues, per-page CRO). It also mentions device filtering to separate mobile from desktop, but does not state when not to use it or name an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_clarity_sourcesComportamiento por fuenteARead-onlyInspect
[DEMO SINTÉTICA] Fricción por canal de adquisición (source/medium) según Clarity: sesiones, scroll, tiempo activo y tasas de rage/dead clicks y quickbacks. Sirve para "el tráfico pagado se frustra más que el orgánico", "qué canal trae visitas que rebotan rápido", "calidad del tráfico por fuente". No incluye conversiones.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Calidad del tráfico según Clarity; no mide conversiones. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive and closed-world, so the safety profile is covered. The description adds substance beyond that: which behavioural metrics are computed and the explicit non-inclusion of conversions, which prevents a common misread of 'quality by source'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: metric scope first, then use cases, then the exclusion. The '[DEMO SINTÉTICA]' marker is noise but negligible against otherwise zero-waste phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, a full output schema and a fully documented single parameter, the description covers everything needed to call it correctly. The only residual gap is that it does not clarify when to prefer this over the similarly named traffic-source and clarity page tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter and the schema documents it fully with formats and a stated default of the last 30 days. The description adds nothing about the date range, so the baseline of 3 for high schema coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and dimension (friction by acquisition channel, source/medium) plus the exact metric set returned: sessions, scroll, active time, rage/dead click rates and quickbacks. Naming Clarity and those metrics distinguishes it from the generic sibling list_analytics_traffic_sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete question phrasings that map to when this tool applies (paid traffic frustration, fast-bouncing channels, traffic quality by source) and explicitly excludes conversions. It does not name which sibling to use instead for conversion or page-level questions, so routing is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_google_ads_campaignsCampañas de Google AdsARead-onlyInspect
[DEMO SINTÉTICA] Desglose de Google Ads campaña por campaña: nombre, estado (activa/pausada), gasto, clics, impresiones, conversiones y CTR. Sirve para "qué campañas de Google Ads tenemos", "campaña que mejor funciona", "performance por campaña".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Campañas ordenadas por gasto descendente. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the metric list as return context, but says nothing about ordering, pagination, limits, or whether paused campaigns are included in spend — and the metric list partly duplicates the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the resource/metric scope comes first, the usage examples second. The only waste is the "[DEMO SINTÉTICA]" prefix, which carries no operational meaning for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one optional parameter, full schema coverage, an output schema, and read-only annotations, the definition gives enough to call the tool correctly and know what it returns. Remaining gaps (ordering, pagination, campaign-count limits) are minor for a listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter, and the schema documents it at 100% coverage including accepted formats and the default (últimos 30 días). The description adds no additional constraint or format guidance beyond what the schema already states, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and granularity ("Desglose de Google Ads campaña por campaña") and enumerates the metrics returned (nombre, estado, gasto, clics, impresiones, conversiones, CTR). This implicitly separates it from get_google_ads_summary and the keyword/search-term listers, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete trigger phrasings ("qué campañas de Google Ads tenemos", "campaña que mejor funciona", "performance por campaña") that map user intent to this tool. It stops short of stating when to prefer get_google_ads_summary instead, so an exclusion rule is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_google_ads_keywordsPalabras clave de Google AdsARead-onlyInspect
[DEMO SINTÉTICA] Keywords contra las que pujamos en Google Ads (las que configuramos en las campañas): gasto, clics, conversiones, CPC, match type. Sirve para "keywords que compramos", "palabras clave de mis campañas", "en qué keywords gasto más". Distinto de search terms (lo que el usuario realmente escribió).
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Hasta 100 keywords ordenadas por gasto descendente; no son las consultas escritas por usuarios. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context by naming the metric set returned and by framing this as configured/campaign-level data rather than user-query data. It says nothing about volume, sorting, or aggregation limits, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact paragraph that front-loads the definition, then example intents, then the disambiguation from search terms. The '[DEMO SINTÉTICA]' marker is noise, but otherwise every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only single-parameter list tool with an output schema, annotations, and a clear sibling distinction — the description covers what an agent needs to select and call it. Only minor operational details (result limits, ordering) are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single optional parameter whose schema description is fully covered (100%), including accepted formats and the default of last 30 days. The description adds no further semantics about date_range, so the schema carries the weight and the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (keywords bid on in Google Ads campaigns) and enumerates the metrics returned: spend, clicks, conversions, CPC, match type. It also explicitly distinguishes itself from search terms, which is exactly the ambiguity a sibling like list_google_ads_search_terms creates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete trigger phrases ('keywords que compramos', 'palabras clave de mis campañas', 'en qué keywords gasto más') and an explicit exclusion rule pointing to search terms for what the user actually typed. An agent can route between the two tools without further inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_google_ads_search_termsTérminos de búsqueda de Google AdsARead-onlyInspect
[DEMO SINTÉTICA] Búsquedas reales que escribieron los usuarios y dispararon nuestros anuncios de Google Ads. Muestra términos exactos con clics y gasto. Cubre siempre los últimos 30 días a la fecha de la última sincronización; no admite otro período. Útil para encontrar oportunidades (nuevas keywords) o exclusiones (queries irrelevantes). Sirve para "qué buscan los usuarios", "términos de búsqueda", "search terms".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Hasta 100 filas ordenadas por gasto, agregadas en los últimos 30 días a la fecha de la última sincronización; una consulta puede aparecer en varias campañas. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: the fixed rolling 30-day window anchored to the last sync, and that no custom date range is possible — a constraint an agent would otherwise guess wrong on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the data is, then the hard time-window constraint, then usage. The trailing quoted phrase list ('qué buscan los usuarios', 'términos de búsqueda', 'search terms') is retrieval filler but harmless and short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, annotations covering safety, and an output schema handling return values, the description supplies what is missing: fixed time window, what metrics come back, and why you'd call it. Only the absence of explicit sibling routing keeps it below 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. Nothing in the description contradicts or obscures the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete resource with scope: real user queries that triggered Google Ads, showing exact terms with clicks and spend. That distinguishes it conceptually from list_google_ads_keywords (which returns the keywords you bid on, not the queries), though it never names the sibling outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit use cases (finding new keyword opportunities, building negative-keyword exclusions) and a hard constraint: only the last 30 days up to the last sync date, no other period supported. Missing an explicit 'for X instead use list_google_ads_keywords' routing statement, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_instagram_hashtagsRendimiento de hashtagsARead-onlyInspect
[DEMO SINTÉTICA] Hashtags usados en posts de Instagram, ordenados por alcance promedio. Incluye cuántos posts usan cada tag y su engagement rate promedio. Útil para identificar qué tags están generando más visibilidad. Sirve para "hashtags que funcionan", "qué tags usar", "tags con más alcance".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Hashtags extraídos de los captions del período. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real behavioral value beyond that by disclosing the ordering (average reach), the included metrics, and the ranking intent. It says nothing about result limits or pagination, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns and how it is ranked, then supporting metrics, then intent phrases. The trailing quoted-phrase list is somewhat redundant but still earns its place as routing signal; the description is appropriately short for a single-parameter listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description still summarizes the key metrics. For a one-optional-param, read-only ranking tool this is essentially complete; only absence of any note on result count or scope limits is a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter, and the schema description already covers it at 100% coverage, including accepted formats and the 'últimos 30 días' default. The description adds no additional meaning about date_range, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: hashtags used in Instagram posts, ranked by average reach, with post count and average engagement rate. This is clearly distinct from siblings like list_instagram_top_posts or get_instagram_follower_growth by virtue of the resource named. The '[DEMO SINTÉTICA]' prefix is noise but does not obscure the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete user-intent phrases ('hashtags que funcionan', 'qué tags usar', 'tags con más alcance') that map cleanly to when to reach for this tool, which is genuinely helpful routing signal. It stops short of naming alternatives or stating when not to use it (e.g. versus list_instagram_top_posts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_instagram_top_postsMejores publicaciones de InstagramARead-onlyInspect
[DEMO SINTÉTICA] Posts de Instagram con mejor performance, ordenados por engagement, alcance, likes, guardados o comentarios. Incluye caption, fecha, métricas y permalink. Sirve para "mejores posts", "qué contenido funcionó", "posts más vistos".
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ordenar por: engagement (default), reach, likes, saved, comments | |
| limit | No | Cantidad de posts a retornar (default: 10, max: 50) | |
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Hasta 50 posts, ordenados según sort. Lista vacía si no hay posts con alcance positivo. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the default/max limit context and the fact that results are ranked by a chosen engagement dimension and include caption, date, metrics and permalink. No mention of pagination beyond limit, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with the ranking behavior stated first and trigger phrases last. The '[DEMO SINTÉTICA]' prefix and the partial restatement of the title are minor waste but nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't document return values, yet it helpfully lists the included fields; parameters and annotations are complete. What remains would be explicit routing against sibling Instagram analytic tools, which is a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (sort, limit, date_range) are fully documented in the schema including defaults and accepted values. The description mirrors the sort dimensions but adds no syntax or edge-case detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (list Instagram posts with best performance) plus the ordering dimensions and returned fields, so an agent knows exactly what it yields. It does not explicitly distinguish itself from get_instagram_summary or list_instagram_hashtags, leaving that inference to the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Sirve para' clause gives concrete trigger phrases ('mejores posts', 'qué contenido funcionó', 'posts más vistos') that map query intent to this tool. It stops short of naming alternatives or exclusions (e.g., when to prefer get_instagram_summary).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_meta_ads_campaignsCampañas de Meta AdsARead-onlyInspect
[DEMO SINTÉTICA] Desglose de Meta Ads campaña por campaña: nombre, objetivo (tráfico/leads/ventas/mensajes), estado, gasto, alcance, clics. Sirve para "campañas de Meta Ads", "qué objetivos tenemos en Facebook", "performance por campaña".
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Campañas ordenadas por gasto descendente. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds only the set of returned metrics, which is largely duplicated by the output schema; it says nothing about account scoping, data freshness, or empty-result behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the field list is front-loaded and the trigger phrases follow. The '[DEMO SINTÉTICA]' prefix and quoted example queries add bulk but no real waste for an agent scanning for intent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotation coverage, and a single well-documented parameter, the description carries only the framing burden and meets it. The only gap is not distinguishing itself from the aggregation sibling get_meta_ads_summary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single date_range parameter is fully documented in the schema, including accepted formats and a 30-day default. The description never mentions date_range, so it adds nothing beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and granularity: 'Desglose de Meta Ads campaña por campaña' plus the exact fields returned (nombre, objetivo, estado, gasto, alcance, clics). This distinguishes it implicitly from get_meta_ads_summary by promising a per-campaign breakdown, though it never names that sibling to make the contrast explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Sirve para' clause supplies concrete trigger phrasings ('campañas de Meta Ads', 'qué objetivos tenemos en Facebook', 'performance por campaña'), which gives implied usage context. However, it never states when NOT to use it or that get_meta_ads_summary is the alternative for aggregate totals, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_search_console_pagesPáginas en GoogleARead-onlyInspect
[DEMO SINTÉTICA] Páginas del sitio con mejor visibilidad orgánica en Google según Search Console: URL, clics, impresiones, CTR, posición promedio. Sirve para "páginas con mejor SEO", "qué URLs rankean", "landings que reciben tráfico orgánico". Solo cuenta el tráfico orgánico de Google, no el total.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Páginas con visibilidad orgánica en Google. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds meaningful context beyond that: only Google organic traffic counts, not total traffic — a caveat that prevents misreading the numbers — plus the implied ranking by visibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and metrics, then the intent synonyms, then the scope caveat. Efficient overall, though the "[DEMO SINTÉTICA]" prefix is noise and the synonym list is slightly verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, annotations cover the safety profile, and the single parameter is fully documented, so the description only needs to establish purpose and scope — which it does. Minor gaps around sorting/limit behavior remain but are not required for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single optional parameter at 100% schema description coverage (including examples and the 30-day default), the schema carries all parameter meaning. The description adds nothing about date_range, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (pages in Google Search Console) and enumerates the returned metrics (URL, clicks, impressions, CTR, average position). This clearly separates it from list_search_console_queries (queries) and get_search_console_summary (aggregate) without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user-intent examples ("páginas con mejor SEO", "qué URLs rankean", "landings que reciben tráfico orgánico") that tell an agent when to pick this tool. It does not explicitly name sibling alternatives or state when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_search_console_queriesBúsquedas en GoogleARead-onlyInspect
[DEMO SINTÉTICA] Búsquedas orgánicas en Google por las que aparece el sitio: query exacta, clics recibidos, impresiones, CTR y posición promedio. Sirve para "por qué nos encuentran", "queries SEO", "keywords orgánicas", "términos de búsqueda orgánicos". Solo búsqueda orgánica; no incluye publicidad pagada.
| Name | Required | Description | Default |
|---|---|---|---|
| date_range | No | Período a consultar. Ejemplos: "últimos 30 días", "enero 2025", "2025-01-01 a 2025-01-31", "este mes", "mes pasado". Por defecto: últimos 30 días. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Consultas SEO según Search Console, distintas de consultas publicitarias. |
| demo | No | Solo aparece en demo; todos sus datos son ficticios. |
| notice | No | Aviso obligatorio de datos sintéticos cuando demo es true. |
| sample_period | No | Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango. |
| requested_period | No | Rango solicitado a la demo; no es el período real de sus ejemplos. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly=true, non-destructive and non-open-world, so the safety profile is covered. The description still adds real behavioral context beyond that: the data scope is organic-only, paid ads are excluded, and the metric set returned is stated. It stops short of describing row limits or ordering, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource and metric list, then the trigger phrases, then the scope exclusion — a sensible order with little waste. The demo marker and the quoted trigger list add slight noise but both serve routing purposes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description supplies what is left: what is measured and what is out of scope. Granularity (top-N rows, sort order) and aggregation level are not addressed, but that is a minor gap given the structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single date_range parameter is fully documented with accepted formats and a default. The description contributes nothing about date handling, so it sits at the baseline for a well-described schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (organic Google search queries the site appears for) and enumerates the returned metrics (query, clicks, impressions, CTR, average position). The closing line 'Solo búsqueda orgánica; no incluye publicidad pagada' separates it from the Google Ads siblings, so the agent can tell it apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete user-intent triggers ('por qué nos encuentran', 'queries SEO', 'keywords orgánicas') that map well onto when to reach for this tool, plus an explicit exclusion of paid search. It does not, however, name which sibling to use instead for page-level or summary-level views (list_search_console_pages, get_search_console_summary).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
list_google_ads_search_terms2 fields changed- removed
Input schema / properties / date_rangeRemoved value: -{ - "description": "Período a consultar. Ejemplos: \"últimos 30 días\", \"enero 2025\", \"2025-01-01 a 2025-01-31\", \"este mes\", \"mes pasado\". Por defecto: últimos 30 días.", - "type": "string" -} - changed
Output schema / properties / data / descriptionPrevious value: -"Hasta 100 filas ordenadas por gasto; una consulta puede aparecer en varios días o campañas."New value: +"Hasta 100 filas ordenadas por gasto, agregadas en los últimos 30 días a la fecha de la última sincronización; una consulta puede aparecer en varias campañas."
39 tool updates
- Removed
clarity_pages - Removed
clarity_sources - Removed
clarity_summary - Removed
ga4_pages - Removed
ga4_sources - Removed
ga4_summary - Removed
gads_campaigns - Removed
gads_keywords - Removed
gads_search_terms - Removed
gads_summary - Added
get_analytics_summary - Added
get_clarity_summary - Added
get_google_ads_summary - Added
get_instagram_follower_growth - Added
get_instagram_summary - Changed
get_leads1 field changed- changed
Output schema / properties / data / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "CRM habilitado: contactos del período.", - "properties": { - "byStatus": { - "additionalProperties": { - "description": "Leads devueltos en ese estado.", - "type": "number" - }, - "description": "Conteo por estado de las filas devueltas (hasta 100), no del total completo.", - "type": "object" - }, - "leads": { - "description": "Hasta 100 leads, de más reciente a más antiguo.", - "items": { - "additionalProperties": false, - "description": "Lead de la cuenta autenticada.", - "properties": { - "created_at": { - "description": "Fecha y hora de captación.", - "type": [ - "string", - "null" - ] - }, - "email": { - "description": "Email del prospecto.", - "type": [ - "string", - "null" - ] - }, - "name": { - "description": "Nombre del prospecto.", - "type": [ - "string", - "null" - ] - }, - "notes": { - "description": "Notas del contacto.", - "type": [ - "string", - "null" - ] - }, - "phone": { - "description": "Teléfono del prospecto.", - "type": [ - "string", - "null" - ] - }, - "source": { - "description": "Fuente de captación.", - "type": [ - "string", - "null" - ] - }, - "status": { - "description": "Estado almacenado en CRM.", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "name", - "email", - "phone", - "source", - "status", - "created_at", - "notes" - ], - "type": "object" - }, - "type": "array" - }, - "period": { - "additionalProperties": false, - "description": "Rango consultado, desde from hasta to inclusive.", - "properties": { - "from": { - "description": "Fecha YYYY-MM-DD.", - "format": "date", - "type": "string" - }, - "to": { - "description": "Fecha YYYY-MM-DD.", - "format": "date", - "type": "string" - } - }, - "required": [ - "from", - "to" - ], - "type": "object" - }, - "total": { - "description": "Total de leads del período y filtro, no limitado a 100.", - "type": "number" - } - }, - "required": [ - "period", - "total", - "byStatus", - "leads" - ], - "type": "object" - }, - { - "additionalProperties": false, - "description": "CRM no disponible; no interpretar como cero leads.", - "properties": { - "error": { - "description": "Motivo por el que la consulta no está disponible, por ejemplo CRM no habilitado.", - "type": "string" - } - }, - "required": [ - "error" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "description": "CRM habilitado: contactos del período.", + "properties": { + "byStatus": { + "additionalProperties": { + "description": "Leads devueltos en ese estado.", + "type": "number" + }, + "description": "Conteo por estado de las filas devueltas (hasta 100), no del total completo.", + "type": "object" + }, + "leads": { + "description": "Hasta 100 leads, de más reciente a más antiguo.", + "items": { + "additionalProperties": false, + "description": "Lead de la cuenta autenticada, sin datos de contacto.", + "properties": { + "created_at": { + "description": "Fecha y hora de captación.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Nombre del prospecto.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Fuente de captación.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "Estado almacenado en CRM.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "source", + "status", + "created_at" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "total": { + "description": "Total de leads del período y filtro, no limitado a 100.", + "type": "number" + } + }, + "required": [ + "period", + "total", + "byStatus", + "leads" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "CRM no disponible; no interpretar como cero leads.", + "properties": { + "error": { + "description": "Motivo por el que la consulta no está disponible, por ejemplo CRM no habilitado.", + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + } +]
- Added
get_meta_ads_summary - Added
get_search_console_summary - Removed
gsc_pages - Removed
gsc_queries - Removed
gsc_summary - Removed
ig_followers_growth - Removed
ig_hashtags - Removed
ig_summary - Removed
ig_top_posts - Added
list_analytics_pages - Added
list_analytics_traffic_sources - Added
list_clarity_pages - Added
list_clarity_sources - Added
list_google_ads_campaigns - Added
list_google_ads_keywords - Added
list_google_ads_search_terms - Added
list_instagram_hashtags - Added
list_instagram_top_posts - Added
list_meta_ads_campaigns - Added
list_search_console_pages - Added
list_search_console_queries - Removed
meta_campaigns - Removed
meta_summary
22 tool updates
- Changed
clarity_pages1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Fricción por página y dispositivo.", + "properties": { + "device": { + "description": "Filtro aplicado; null significa todos los dispositivos.", + "enum": [ + "PC", + "Mobile", + "Tablet", + "Other", + null + ], + "type": [ + "string", + "null" + ] + }, + "pages": { + "description": "Hasta 50 páginas ordenadas por sesiones.", + "items": { + "additionalProperties": false, + "description": "Comportamiento en esta página.", + "properties": { + "active_time": { + "description": "Suma de activeTime exportado por Clarity. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "active_time_per_session": { + "description": "active_time dividido por sesiones, redondeado. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "avg_scroll_depth": { + "description": "Profundidad de scroll, promedio ponderado por sesiones. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "bot_sessions": { + "description": "Sesiones identificadas como bots. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "dead_click_events": { + "description": "Eventos de dead_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "dead_click_rate": { + "description": "Sesiones afectadas por dead_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "dead_click_sessions": { + "description": "Sesiones afectadas por dead_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "error_click_events": { + "description": "Eventos de error_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "error_click_rate": { + "description": "Sesiones afectadas por error_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "error_click_sessions": { + "description": "Sesiones afectadas por error_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_events": { + "description": "Eventos de excessive_scroll; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_rate": { + "description": "Sesiones afectadas por excessive_scroll sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_sessions": { + "description": "Sesiones afectadas por excessive_scroll. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "page_path": { + "description": "Ruta de página, sin dominio, query ni fragmento.", + "type": [ + "string", + "null" + ] + }, + "pages_per_session": { + "description": "Páginas por sesión, promedio ponderado por sesiones.", + "type": [ + "number", + "null" + ] + }, + "quickback_events": { + "description": "Eventos de quickback; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "quickback_rate": { + "description": "Sesiones afectadas por quickback sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "quickback_sessions": { + "description": "Sesiones afectadas por quickback. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "rage_click_events": { + "description": "Eventos de rage_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "rage_click_rate": { + "description": "Sesiones afectadas por rage_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "rage_click_sessions": { + "description": "Sesiones afectadas por rage_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "script_error_events": { + "description": "Eventos de script_error; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "script_error_rate": { + "description": "Sesiones afectadas por script_error sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "script_error_sessions": { + "description": "Sesiones afectadas por script_error. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "sessions": { + "description": "Suma de sesiones en los días consultados. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "total_time": { + "description": "Suma de totalTime exportado por Clarity. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "users": { + "description": "Suma de usuarios diarios; no son usuarios únicos del período. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "page_path", + "sessions", + "bot_sessions", + "users", + "pages_per_session", + "avg_scroll_depth", + "total_time", + "active_time", + "active_time_per_session", + "dead_click_sessions", + "dead_click_events", + "dead_click_rate", + "rage_click_sessions", + "rage_click_events", + "rage_click_rate", + "quickback_sessions", + "quickback_events", + "quickback_rate", + "excessive_scroll_sessions", + "excessive_scroll_events", + "excessive_scroll_rate", + "error_click_sessions", + "error_click_events", + "error_click_rate", + "script_error_sessions", + "script_error_events", + "script_error_rate" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "period", + "device", + "pages" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
clarity_sources1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Calidad del tráfico según Clarity; no mide conversiones.", + "properties": { + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sources": { + "description": "Hasta 30 combinaciones ordenadas por sesiones.", + "items": { + "additionalProperties": false, + "description": "Comportamiento por fuente/medio.", + "properties": { + "active_time": { + "description": "Suma de activeTime exportado por Clarity. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "active_time_per_session": { + "description": "active_time dividido por sesiones, redondeado. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "avg_scroll_depth": { + "description": "Profundidad de scroll, promedio ponderado por sesiones. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "bot_sessions": { + "description": "Sesiones identificadas como bots. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "dead_click_events": { + "description": "Eventos de dead_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "dead_click_rate": { + "description": "Sesiones afectadas por dead_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "dead_click_sessions": { + "description": "Sesiones afectadas por dead_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "error_click_events": { + "description": "Eventos de error_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "error_click_rate": { + "description": "Sesiones afectadas por error_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "error_click_sessions": { + "description": "Sesiones afectadas por error_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_events": { + "description": "Eventos de excessive_scroll; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_rate": { + "description": "Sesiones afectadas por excessive_scroll sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_sessions": { + "description": "Sesiones afectadas por excessive_scroll. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "medium": { + "description": "Medio de adquisición.", + "type": [ + "string", + "null" + ] + }, + "pages_per_session": { + "description": "Páginas por sesión, promedio ponderado por sesiones.", + "type": [ + "number", + "null" + ] + }, + "quickback_events": { + "description": "Eventos de quickback; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "quickback_rate": { + "description": "Sesiones afectadas por quickback sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "quickback_sessions": { + "description": "Sesiones afectadas por quickback. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "rage_click_events": { + "description": "Eventos de rage_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "rage_click_rate": { + "description": "Sesiones afectadas por rage_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "rage_click_sessions": { + "description": "Sesiones afectadas por rage_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "script_error_events": { + "description": "Eventos de script_error; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "script_error_rate": { + "description": "Sesiones afectadas por script_error sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "script_error_sessions": { + "description": "Sesiones afectadas por script_error. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "sessions": { + "description": "Suma de sesiones en los días consultados. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "source": { + "description": "Fuente de adquisición.", + "type": [ + "string", + "null" + ] + }, + "total_time": { + "description": "Suma de totalTime exportado por Clarity. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "users": { + "description": "Suma de usuarios diarios; no son usuarios únicos del período. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "source", + "medium", + "sessions", + "bot_sessions", + "users", + "pages_per_session", + "avg_scroll_depth", + "total_time", + "active_time", + "active_time_per_session", + "dead_click_sessions", + "dead_click_events", + "dead_click_rate", + "rage_click_sessions", + "rage_click_events", + "rage_click_rate", + "quickback_sessions", + "quickback_events", + "quickback_rate", + "excessive_scroll_sessions", + "excessive_scroll_events", + "excessive_scroll_rate", + "error_click_sessions", + "error_click_events", + "error_click_rate", + "script_error_sessions", + "script_error_events", + "script_error_rate" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "period", + "sources" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
clarity_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Comportamiento según Clarity; agregados null cuando no hay filas.", + "properties": { + "active_days": { + "description": "Días con datos disponibles; Clarity no tiene histórico anterior al alta.", + "type": "number" + }, + "active_time": { + "description": "Suma de activeTime exportado por Clarity. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "active_time_per_session": { + "description": "active_time dividido por sesiones, redondeado. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "avg_scroll_depth": { + "description": "Profundidad de scroll, promedio ponderado por sesiones. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "bot_sessions": { + "description": "Sesiones identificadas como bots. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "dead_click_events": { + "description": "Eventos de dead_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "dead_click_rate": { + "description": "Sesiones afectadas por dead_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "dead_click_sessions": { + "description": "Sesiones afectadas por dead_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "error_click_events": { + "description": "Eventos de error_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "error_click_rate": { + "description": "Sesiones afectadas por error_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "error_click_sessions": { + "description": "Sesiones afectadas por error_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_events": { + "description": "Eventos de excessive_scroll; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_rate": { + "description": "Sesiones afectadas por excessive_scroll sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "excessive_scroll_sessions": { + "description": "Sesiones afectadas por excessive_scroll. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "pages_per_session": { + "description": "Páginas por sesión, promedio ponderado por sesiones.", + "type": [ + "number", + "null" + ] + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "quickback_events": { + "description": "Eventos de quickback; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "quickback_rate": { + "description": "Sesiones afectadas por quickback sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "quickback_sessions": { + "description": "Sesiones afectadas por quickback. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "rage_click_events": { + "description": "Eventos de rage_click; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "rage_click_rate": { + "description": "Sesiones afectadas por rage_click sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "rage_click_sessions": { + "description": "Sesiones afectadas por rage_click. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "script_error_events": { + "description": "Eventos de script_error; una sesión puede tener varios. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "script_error_rate": { + "description": "Sesiones afectadas por script_error sobre sesiones totales. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "script_error_sessions": { + "description": "Sesiones afectadas por script_error. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "sessions": { + "description": "Suma de sesiones en los días consultados. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "total_time": { + "description": "Suma de totalTime exportado por Clarity. Unidad no confirmada: no presentar como segundos o minutos sin verificarla.", + "type": [ + "number", + "null" + ] + }, + "users": { + "description": "Suma de usuarios diarios; no son usuarios únicos del período. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "period", + "sessions", + "bot_sessions", + "users", + "pages_per_session", + "avg_scroll_depth", + "total_time", + "active_time", + "active_time_per_session", + "dead_click_sessions", + "dead_click_events", + "dead_click_rate", + "rage_click_sessions", + "rage_click_events", + "rage_click_rate", + "quickback_sessions", + "quickback_events", + "quickback_rate", + "excessive_scroll_sessions", + "excessive_scroll_events", + "excessive_scroll_rate", + "error_click_sessions", + "error_click_events", + "error_click_rate", + "script_error_sessions", + "script_error_events", + "script_error_rate", + "active_days" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
ga4_pages1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Páginas del sitio según GA4.", + "properties": { + "pages": { + "description": "Hasta 50 páginas ordenadas por vistas.", + "items": { + "additionalProperties": false, + "description": "Página y métricas de GA4.", + "properties": { + "avg_session_duration": { + "description": "Promedio simple de duración media diaria en segundos, redondeado.", + "type": [ + "number", + "null" + ] + }, + "bounce_rate": { + "description": "Promedio simple de tasas diarias de rebote. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "page_path": { + "description": "Ruta de página, sin dominio.", + "type": [ + "string", + "null" + ] + }, + "page_views": { + "description": "Vistas de página. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "sessions": { + "description": "Sesiones registradas para la página. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "total_users": { + "description": "Suma de usuarios diarios por página, no deduplicada para el período. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "page_path", + "page_views", + "sessions", + "total_users", + "bounce_rate", + "avg_session_duration" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "period", + "pages" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
ga4_sources1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Adquisición de tráfico en GA4.", + "properties": { + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sources": { + "description": "Hasta 50 combinaciones ordenadas por sesiones; la lista puede omitir fuentes menores.", + "items": { + "additionalProperties": false, + "description": "Fuente/medio de adquisición.", + "properties": { + "conversions": { + "description": "Conversiones/key events. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "session_medium": { + "description": "Medio de la sesión.", + "type": [ + "string", + "null" + ] + }, + "session_source": { + "description": "Fuente de la sesión.", + "type": [ + "string", + "null" + ] + }, + "sessions": { + "description": "Sesiones de esta fuente/medio. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "total_users": { + "description": "Suma de usuarios diarios por fuente/medio; no deduplicada para el período. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "session_source", + "session_medium", + "sessions", + "total_users", + "conversions" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "period", + "sources" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
ga4_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Tráfico web de todos los canales según GA4.", + "properties": { + "activeDays": { + "description": "Días con filas disponibles; no es el número de días del rango solicitado.", + "type": "number" + }, + "avgSessionDurationSeconds": { + "description": "Promedio simple de la duración media diaria, en segundos, redondeado.", + "type": "number" + }, + "bounceRate": { + "description": "Promedio simple de las tasas diarias de rebote, no ponderado por sesiones. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "conversions": { + "description": "Conversiones/key events registrados en GA4; no equivalen necesariamente a ventas.", + "type": "number" + }, + "engagementRate": { + "description": "Promedio simple de las tasas diarias de engagement, no ponderado por sesiones. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "newUsers": { + "description": "Suma de usuarios nuevos diarios.", + "type": "number" + }, + "pageViews": { + "description": "Vistas de página, incluidas visitas repetidas.", + "type": "number" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sessions": { + "description": "Suma de sesiones diarias.", + "type": "number" + }, + "totalUsers": { + "description": "Suma de usuarios diarios; no son usuarios únicos de todo el período.", + "type": "number" + } + }, + "required": [ + "period", + "sessions", + "totalUsers", + "newUsers", + "pageViews", + "bounceRate", + "avgSessionDurationSeconds", + "engagementRate", + "conversions", + "activeDays" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
gads_campaigns1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "description": "Campañas ordenadas por gasto descendente.", + "items": { + "additionalProperties": false, + "description": "Campaña de Google Ads.", + "properties": { + "campaign": { + "description": "Nombre de la campaña.", + "type": [ + "string", + "null" + ] + }, + "clicks": { + "description": "Clics registrados. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "conversions": { + "description": "Conversiones atribuidas; pueden ser fraccionarias. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "ctr": { + "description": "Clics divididos por impresiones; 0 cuando no hay impresiones. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "impressions": { + "description": "Impresiones registradas. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "spend": { + "description": "Gasto en la moneda de la cuenta publicitaria; consultar el resumen del mismo canal para conocerla.", + "type": "number" + }, + "status": { + "description": "Estado informado por la plataforma.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "campaign", + "status", + "spend", + "clicks", + "impressions", + "ctr", + "conversions" + ], + "type": "object" + }, + "type": "array" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
gads_keywords1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "description": "Hasta 100 keywords ordenadas por gasto descendente; no son las consultas escritas por usuarios.", + "items": { + "additionalProperties": false, + "description": "Keyword comprada y sus resultados.", + "properties": { + "campaign": { + "description": "Nombre de campaña.", + "type": [ + "string", + "null" + ] + }, + "clicks": { + "description": "Clics registrados. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "conversions": { + "description": "Conversiones atribuidas; pueden ser fraccionarias. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "cpc": { + "description": "Costo por clic en la moneda de Google Ads; 0 si no hay clics.", + "type": "number" + }, + "impressions": { + "description": "Impresiones registradas. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "keyword": { + "description": "Keyword configurada para pujar.", + "type": [ + "string", + "null" + ] + }, + "matchType": { + "description": "Tipo de concordancia.", + "type": [ + "string", + "null" + ] + }, + "spend": { + "description": "Gasto en la moneda de la cuenta publicitaria; consultar el resumen del mismo canal para conocerla.", + "type": "number" + } + }, + "required": [ + "campaign", + "keyword", + "matchType", + "spend", + "clicks", + "impressions", + "conversions", + "cpc" + ], + "type": "object" + }, + "type": "array" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
gads_search_terms1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "description": "Hasta 100 filas ordenadas por gasto; una consulta puede aparecer en varios días o campañas.", + "items": { + "additionalProperties": false, + "description": "Fila de consulta publicitaria, sin agregación adicional del servidor.", + "properties": { + "campaign": { + "description": "Nombre de campaña.", + "type": [ + "string", + "null" + ] + }, + "clicks": { + "description": "Clics registrados. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "conversions": { + "description": "Conversiones atribuidas; pueden ser fraccionarias. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "impressions": { + "description": "Impresiones registradas. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "searchTerm": { + "description": "Consulta real que disparó el anuncio.", + "type": [ + "string", + "null" + ] + }, + "spend": { + "description": "Gasto en la moneda de la cuenta publicitaria; consultar el resumen del mismo canal para conocerla.", + "type": "number" + } + }, + "required": [ + "campaign", + "searchTerm", + "impressions", + "clicks", + "spend", + "conversions" + ], + "type": "object" + }, + "type": "array" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
gads_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Publicidad pagada en Google; conversiones atribuidas no equivalen necesariamente a ventas del POS.", + "properties": { + "campaigns": { + "description": "Campañas distintas con filas en el período.", + "type": "number" + }, + "clicks": { + "description": "Clics.", + "type": "number" + }, + "conversions": { + "description": "Conversiones atribuidas por Google Ads; pueden ser fraccionarias.", + "type": "number" + }, + "cpa": { + "description": "Costo por conversión en currency; 0 si no hay conversiones.", + "type": "number" + }, + "cpc": { + "description": "Costo por clic en currency; 0 si no hay clics.", + "type": "number" + }, + "ctr": { + "description": "Clics / impresiones; 0 si no hay impresiones. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "currency": { + "description": "Moneda configurada en la cuenta (por ejemplo CLP o USD); el servidor usa CLP si no está configurada.", + "type": "string" + }, + "impressions": { + "description": "Impresiones.", + "type": "number" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "roas": { + "description": "Valor de conversiones / gasto, como múltiplo: 3 significa 3 veces, no 3%. 0 si no hay gasto.", + "type": "number" + }, + "totalSpend": { + "description": "Gasto total en currency; ya convertido de micros a unidades monetarias.", + "type": "number" + } + }, + "required": [ + "period", + "currency", + "totalSpend", + "impressions", + "clicks", + "ctr", + "cpc", + "conversions", + "cpa", + "roas", + "campaigns" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
get_leads1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "anyOf": [ + { + "additionalProperties": false, + "description": "CRM habilitado: contactos del período.", + "properties": { + "byStatus": { + "additionalProperties": { + "description": "Leads devueltos en ese estado.", + "type": "number" + }, + "description": "Conteo por estado de las filas devueltas (hasta 100), no del total completo.", + "type": "object" + }, + "leads": { + "description": "Hasta 100 leads, de más reciente a más antiguo.", + "items": { + "additionalProperties": false, + "description": "Lead de la cuenta autenticada.", + "properties": { + "created_at": { + "description": "Fecha y hora de captación.", + "type": [ + "string", + "null" + ] + }, + "email": { + "description": "Email del prospecto.", + "type": [ + "string", + "null" + ] + }, + "name": { + "description": "Nombre del prospecto.", + "type": [ + "string", + "null" + ] + }, + "notes": { + "description": "Notas del contacto.", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "Teléfono del prospecto.", + "type": [ + "string", + "null" + ] + }, + "source": { + "description": "Fuente de captación.", + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "Estado almacenado en CRM.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "name", + "email", + "phone", + "source", + "status", + "created_at", + "notes" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "total": { + "description": "Total de leads del período y filtro, no limitado a 100.", + "type": "number" + } + }, + "required": [ + "period", + "total", + "byStatus", + "leads" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "CRM no disponible; no interpretar como cero leads.", + "properties": { + "error": { + "description": "Motivo por el que la consulta no está disponible, por ejemplo CRM no habilitado.", + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ] + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
get_reviews1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Reputación y reseñas del período.", + "properties": { + "avgRating": { + "description": "Rating promedio en escala 1 a 5; excluye Facebook. null si no hay ratings numéricos.", + "type": [ + "number", + "null" + ] + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "responseRate": { + "description": "Reseñas con respuesta del propietario / total; 0 si no hay reseñas. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "reviews": { + "description": "Hasta 20 reseñas, de más reciente a más antigua; total puede ser mayor.", + "items": { + "additionalProperties": false, + "description": "Reseña individual.", + "properties": { + "author_name": { + "description": "Nombre del autor.", + "type": [ + "string", + "null" + ] + }, + "has_reply": { + "description": "1 si el propietario respondió; 0 si no.", + "enum": [ + 0, + 1 + ], + "type": "number" + }, + "platform": { + "description": "Plataforma de origen.", + "type": [ + "string", + "null" + ] + }, + "rating": { + "description": "Rating en escala 1 a 5; null para reseñas sin rating.", + "type": [ + "number", + "null" + ] + }, + "review_date": { + "description": "Fecha de reseña según la fuente.", + "type": [ + "string", + "null" + ] + }, + "review_text": { + "description": "Texto de la reseña; null si no existe.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "author_name", + "rating", + "review_text", + "review_date", + "platform", + "has_reply" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "description": "Reseñas del período que pasan el filtro, incluidas las de Facebook sin rating.", + "type": "number" + } + }, + "required": [ + "period", + "total", + "avgRating", + "responseRate", + "reviews" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
get_sales1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "anyOf": [ + { + "additionalProperties": false, + "description": "Ventas registradas en Fudo, no conversiones publicitarias.", + "properties": { + "byChannel": { + "additionalProperties": false, + "description": "Desglose de los tres canales conocidos; otros tipos pueden quedar fuera del desglose.", + "properties": { + "delivery": { + "additionalProperties": false, + "description": "Ventas de este canal.", + "properties": { + "total": { + "description": "Facturación en la moneda del POS.", + "type": "number" + }, + "ventas": { + "description": "Cantidad de tickets cerrados.", + "type": "number" + } + }, + "required": [ + "ventas", + "total" + ], + "type": "object" + }, + "local": { + "additionalProperties": false, + "description": "Ventas de este canal.", + "properties": { + "total": { + "description": "Facturación en la moneda del POS.", + "type": "number" + }, + "ventas": { + "description": "Cantidad de tickets cerrados.", + "type": "number" + } + }, + "required": [ + "ventas", + "total" + ], + "type": "object" + }, + "mostrador": { + "additionalProperties": false, + "description": "Ventas de este canal.", + "properties": { + "total": { + "description": "Facturación en la moneda del POS.", + "type": "number" + }, + "ventas": { + "description": "Cantidad de tickets cerrados.", + "type": "number" + } + }, + "required": [ + "ventas", + "total" + ], + "type": "object" + } + }, + "required": [ + "local", + "delivery", + "mostrador" + ], + "type": "object" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "ticketPromedio": { + "description": "Promedio por ticket cerrado en moneda del POS, redondeado.", + "type": "number" + }, + "totalFacturado": { + "description": "Facturación de tickets cerrados en moneda del POS, redondeada.", + "type": "number" + }, + "totalVentas": { + "description": "Tickets cerrados registrados en Fudo.", + "type": "number" + } + }, + "required": [ + "period", + "totalVentas", + "totalFacturado", + "ticketPromedio", + "byChannel" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "Sin datos de ventas; no afirmar ingresos cero sin verificar cobertura del POS.", + "properties": { + "message": { + "description": "Aviso de que no hay datos de ventas para el período.", + "type": "string" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "period", + "message" + ], + "type": "object" + } + ] + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
gsc_pages1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Páginas con visibilidad orgánica en Google.", + "properties": { + "pages": { + "description": "Hasta 50 páginas ordenadas por clics.", + "items": { + "additionalProperties": false, + "description": "Página y visibilidad orgánica.", + "properties": { + "clicks": { + "description": "Clics orgánicos desde Google. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "ctr": { + "description": "Clics divididos por impresiones. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "impressions": { + "description": "Apariciones en resultados de Google. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "page": { + "description": "URL de la página en Search Console.", + "type": [ + "string", + "null" + ] + }, + "position": { + "description": "Posición ponderada por clics del período (cálculo actual del servidor); menor es mejor. null si no hay clics.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "page", + "clicks", + "impressions", + "ctr", + "position" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "period", + "pages" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
gsc_queries1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Consultas SEO según Search Console, distintas de consultas publicitarias.", + "properties": { + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "queries": { + "description": "Hasta 50 consultas ordenadas por clics; no cubre necesariamente todas las consultas.", + "items": { + "additionalProperties": false, + "description": "Consulta y visibilidad orgánica.", + "properties": { + "clicks": { + "description": "Clics orgánicos desde Google. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "ctr": { + "description": "Clics divididos por impresiones. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "impressions": { + "description": "Apariciones en resultados de Google. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "position": { + "description": "Posición ponderada por clics del período (cálculo actual del servidor); menor es mejor. null si no hay clics.", + "type": [ + "number", + "null" + ] + }, + "query": { + "description": "Consulta orgánica exacta en Google.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "query", + "clicks", + "impressions", + "ctr", + "position" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "period", + "queries" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
gsc_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Visibilidad orgánica en Google; clics no son sesiones de GA4.", + "properties": { + "activeDays": { + "description": "Días con datos disponibles.", + "type": "number" + }, + "avgPosition": { + "description": "Posición ponderada por clics según el cálculo actual del servidor; menor es mejor. 0 si no hay clics (no significa posición 0).", + "type": "number" + }, + "clicks": { + "description": "Clics orgánicos desde Google.", + "type": "number" + }, + "ctr": { + "description": "Clics / impresiones; 0 si no hay impresiones. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "impressions": { + "description": "Apariciones en resultados de Google.", + "type": "number" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "period", + "clicks", + "impressions", + "ctr", + "avgPosition", + "activeDays" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
ig_followers_growth1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Evolución de seguidores; ausencia de snapshots no equivale a crecimiento cero.", + "properties": { + "growth": { + "description": "Último snapshot menos el primero; puede ser negativo. null si faltan snapshots.", + "type": [ + "number", + "null" + ] + }, + "growthPct": { + "description": "Crecimiento relativo al primer snapshot. null si falta o vale 0. Porcentaje: 5 significa 5%, no 0,05. null indica que no se puede calcular.", + "type": [ + "number", + "null" + ] + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "series": { + "description": "Serie cronológica de snapshots disponibles; puede estar vacía.", + "items": { + "additionalProperties": false, + "description": "Snapshot diario de seguidores.", + "properties": { + "date": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "followers": { + "description": "Seguidores al cierre de ese día. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "date", + "followers" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "period", + "series", + "growth", + "growthPct" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
ig_hashtags1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Hashtags extraídos de los captions del período.", + "properties": { + "hashtags": { + "description": "Hasta 30 hashtags ordenados por alcance promedio.", + "items": { + "additionalProperties": false, + "description": "Resultados de posts que usan el hashtag; no prueban un efecto causal.", + "properties": { + "avgEngRate": { + "description": "Promedio del engagement rate de esos posts. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "avgReach": { + "description": "Alcance promedio de esos posts, redondeado.", + "type": "number" + }, + "posts": { + "description": "Posts que incluyen este hashtag.", + "type": "number" + }, + "tag": { + "description": "Hashtag normalizado en minúsculas, sin #.", + "type": "string" + } + }, + "required": [ + "tag", + "posts", + "avgReach", + "avgEngRate" + ], + "type": "object" + }, + "type": "array" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "period", + "hashtags" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
ig_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Instagram orgánico del período.", + "properties": { + "account": { + "description": "Usuario de Instagram; puede faltar si la cuenta no existe.", + "type": [ + "string", + "null" + ] + }, + "avgReach": { + "description": "Alcance promedio por publicación, redondeado.", + "type": "number" + }, + "engagementRate": { + "description": "(Likes + comentarios + guardados + compartidos) / alcance acumulado. 0 si el alcance es 0. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "posts": { + "description": "Publicaciones del período.", + "type": "number" + }, + "totalComments": { + "description": "Comentarios acumulados.", + "type": "number" + }, + "totalLikes": { + "description": "Likes acumulados.", + "type": "number" + }, + "totalReach": { + "description": "Suma del alcance de los posts; una persona puede contarse en varios posts.", + "type": "number" + }, + "totalSaved": { + "description": "Guardados acumulados.", + "type": "number" + }, + "totalShares": { + "description": "Compartidos acumulados.", + "type": "number" + } + }, + "required": [ + "period", + "posts", + "totalReach", + "avgReach", + "totalLikes", + "totalComments", + "totalSaved", + "totalShares", + "engagementRate" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
ig_top_posts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "description": "Hasta 50 posts, ordenados según sort. Lista vacía si no hay posts con alcance positivo.", + "items": { + "additionalProperties": false, + "description": "Publicación con sus métricas.", + "properties": { + "caption": { + "description": "Texto de la publicación; null si no existe.", + "type": [ + "string", + "null" + ] + }, + "comments_count": { + "description": "Comentarios del post. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "engagementRate": { + "description": "Interacciones del post divididas por su alcance. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "ig_media_id": { + "description": "ID del post en Instagram.", + "type": [ + "string", + "null" + ] + }, + "like_count": { + "description": "Likes del post. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "media_type": { + "description": "Tipo de publicación informado por Instagram.", + "type": [ + "string", + "null" + ] + }, + "permalink": { + "description": "Enlace a la publicación.", + "type": [ + "string", + "null" + ] + }, + "reach": { + "description": "Alcance del post; solo se incluyen posts con alcance positivo.", + "type": "number" + }, + "saved": { + "description": "Guardados del post.", + "type": "number" + }, + "shares": { + "description": "Compartidos del post.", + "type": "number" + }, + "timestamp": { + "description": "Fecha y hora de publicación según la fuente.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "ig_media_id", + "media_type", + "caption", + "timestamp", + "permalink", + "like_count", + "comments_count", + "reach", + "saved", + "shares", + "engagementRate" + ], + "type": "object" + }, + "type": "array" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
meta_campaigns1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "description": "Campañas ordenadas por gasto descendente.", + "items": { + "additionalProperties": false, + "description": "Campaña de Meta Ads.", + "properties": { + "campaign": { + "description": "Nombre de la campaña.", + "type": [ + "string", + "null" + ] + }, + "clicks": { + "description": "Clics registrados. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "ctr": { + "description": "Clics divididos por impresiones; 0 cuando no hay impresiones. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "impressions": { + "description": "Impresiones registradas. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "objective": { + "description": "Objetivo de campaña informado por Meta.", + "type": [ + "string", + "null" + ] + }, + "reach": { + "description": "Suma de alcances diarios; no es alcance único del período. null indica ausencia del valor en la fuente.", + "type": [ + "number", + "null" + ] + }, + "spend": { + "description": "Gasto en la moneda de la cuenta publicitaria; consultar el resumen del mismo canal para conocerla.", + "type": "number" + }, + "status": { + "description": "Estado informado por la plataforma.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "campaign", + "status", + "spend", + "clicks", + "impressions", + "ctr", + "objective", + "reach" + ], + "type": "object" + }, + "type": "array" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
meta_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "description": "Estadísticas de la cuenta autenticada en data. Si demo es true, son ejemplos sintéticos; sample_period es su período y requested_period solo el rango solicitado.", + "properties": { + "data": { + "additionalProperties": false, + "description": "Publicidad pagada en Facebook e Instagram, independiente del Instagram orgánico.", + "properties": { + "campaigns": { + "description": "Campañas distintas con filas en el período.", + "type": "number" + }, + "clicks": { + "description": "Clics.", + "type": "number" + }, + "cpc": { + "description": "Costo por clic en currency; 0 si no hay clics.", + "type": "number" + }, + "cpm": { + "description": "Costo por mil impresiones en currency; 0 si no hay impresiones.", + "type": "number" + }, + "ctr": { + "description": "Clics / impresiones; 0 si no hay impresiones. Porcentaje: 5 significa 5%, no 0,05.", + "type": "number" + }, + "currency": { + "description": "Moneda configurada en la cuenta (por ejemplo CLP o USD); el servidor usa CLP si no está configurada.", + "type": "string" + }, + "impressions": { + "description": "Impresiones.", + "type": "number" + }, + "leads": { + "description": "Acciones lead atribuidas por Meta.", + "type": "number" + }, + "messages": { + "description": "Conversaciones iniciadas: onsite_conversion.messaging_conversation_started_7d.", + "type": "number" + }, + "period": { + "additionalProperties": false, + "description": "Rango consultado, desde from hasta to inclusive.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "purchases": { + "description": "Acciones purchase atribuidas por Meta; no son tickets del POS.", + "type": "number" + }, + "reach": { + "description": "Suma de alcances diarios por campaña; no es alcance único del período.", + "type": "number" + }, + "totalSpend": { + "description": "Gasto total en currency.", + "type": "number" + } + }, + "required": [ + "period", + "currency", + "totalSpend", + "impressions", + "clicks", + "reach", + "ctr", + "cpc", + "cpm", + "messages", + "leads", + "purchases", + "campaigns" + ], + "type": "object" + }, + "demo": { + "const": true, + "description": "Solo aparece en demo; todos sus datos son ficticios.", + "type": "boolean" + }, + "notice": { + "description": "Aviso obligatorio de datos sintéticos cuando demo es true.", + "type": "string" + }, + "requested_period": { + "additionalProperties": false, + "description": "Rango solicitado a la demo; no es el período real de sus ejemplos.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "sample_period": { + "additionalProperties": false, + "description": "Período fijo de los ejemplos sintéticos; no cambia al solicitar otro rango.", + "properties": { + "from": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + }, + "to": { + "description": "Fecha YYYY-MM-DD.", + "format": "date", + "type": "string" + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
3 tool updates
- Added
clarity_pages - Added
clarity_sources - Added
clarity_summary
19 tool updates
- First observed
ga4_pages - First observed
ga4_sources - First observed
ga4_summary - First observed
gads_campaigns - First observed
gads_keywords - First observed
gads_search_terms - First observed
gads_summary - First observed
get_leads - First observed
get_reviews - First observed
get_sales - First observed
gsc_pages - First observed
gsc_queries - First observed
gsc_summary - First observed
ig_followers_growth - First observed
ig_hashtags - First observed
ig_summary - First observed
ig_top_posts - First observed
meta_campaigns - First observed
meta_summary
Related MCP Connectors
Marketing and practice analytics for law firms: leads, meetings, attribution, ads, SEO, pipeline.
Marketing analytics from your real data: GA4, Piano, Matomo, Shopify, Google Ads, Meta Ads.
Analytics for founders: traffic, search, ad spend, revenue and retention per product.
Instagram and TikTok analytics for many accounts: reach, views, saves, shares, competitors, reports.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables Instagram and Facebook analytics via the Meta Graph API, offering account insights, media analytics, and post engagement data.197MIT
- AlicenseBqualityDmaintenanceProvides tools for analyzing Instagram engagement metrics, extracting demographic insights, and identifying potential leads from Instagram posts and accounts.557 npm46MIT
- FlicenseNot gradedqualityAmaintenanceCross-source attribution across 37+ business tools. True ROAS in 14 seconds. Not a dashboard. A decision.29-

Sociality MCPofficial
AlicenseNot gradedqualityCmaintenanceSocial media analytics, post insights, and competitor benchmarking for AI agents.6MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.