Plantilla

Widget de tabla de datos para MCP Apps

Filas y columnas con cabecera fija, y las columnas las decide quien llama. Un solo widget para facturas, leads, pedidos o cualquier lista de registros que devuelvan tus tools.

¿Qué facturas siguen sin cobrar este mes?

Ha usado show_table

El de la casa: contorno negro, amarillo mantequilla y subrayado de rotulador en el título.

Cuándo usar un widget de tabla

La mayoría de las tools que llama un agente devuelven listas de registros. Una tabla es la forma más directa de enseñarlas: sin interpretar nada, con todos los campos a la vista y fácil de recorrer por columnas. En un chat gana a una tabla en Markdown en cuanto hay más de unas pocas filas o las columnas tienen que alinearse.

Úsalo para:

  • Facturas pendientes de la herramienta de contabilidad, con los importes alineados a la derecha.
  • Leads nuevos u oportunidades del CRM.
  • Pedidos abiertos con su estado y su fecha de entrega.
  • Resultados de búsqueda de cualquier API interna, tal como llegan.

Si las filas son tareas que pasan de un estado a otro, encaja mejor el tablero kanban. Si lo que cuenta son unos pocos totales, usa los indicadores.

Cómo lo rellena el modelo

Es la plantilla más genérica de la galería, y eso sale de su esquema. En vez de campos fijos, quien llama define las columnas:

  • columns: una lista de key (la propiedad de cada fila que va en esa columna), label (la cabecera) y un align opcional (left, right o center).
  • rows: un objeto por fila, con propiedades que coinciden con las claves de las columnas. Lo demás que traiga una fila se ignora.
  • title y un footnote opcional para una línea bajo la tabla, como una nota sobre impuestos o la fuente de los datos.

Así el mismo widget enseña facturas en un momento y tickets de soporte al siguiente. Alinea a la derecha las columnas numéricas: además usan cifras tabulares y los importes quedan en columna.

Las celdas se escriben como texto, tal cual las manda el modelo. Eso deja el formato en sus manos: debería mandar los importes con su moneda y las fechas escritas para quien lee, no marcas de tiempo en bruto. Si ciñes el widget a un tipo de registro, ponlo en la descripción (por ejemplo, "importes en euros con formato español"); el modelo la lee como descripción de la tool. Todo lo que llega lo escapa Liquid, así que una etiqueta suelta en un registro se ve como texto en vez de ejecutarse.

Qué hace en el chat

La cabecera se queda fija al hacer scroll, y una tabla ancha se desplaza en horizontal dentro de su panel en vez de romper el chat. Las celdas no saltan de línea, así que cada fila ocupa una sola. Las filas se resaltan bajo el puntero, la primera columna va en negrita como identificador de la fila, y una lista vacía enseña un aviso corto en vez de un hueco en blanco.

No hay script ni librerías: el widget no necesita declarar nada en su CSP y se pinta en cuanto llegan los datos.

De serie no declara acciones del host, y es la plantilla en la que más rinde añadir una.

Hazlo tuyo

Una fila puede llamar a una tool de tu propio servidor al hacer clic. Imagina que tu servidor tiene una tool get_record y tus filas traen un id:

html
<tr data-wg-tool="get_record" data-wg-args='{"id": "{{ row.id }}"}'>

El widget llama a esa tool a través del host. O usa data-wg-message en la fila para dejar en el chat una pregunta de seguimiento.

Los diseños cambian el carácter de la tabla: líneas finas y una monoespaciada para los números en Nórdico, una lámina de cristal con la cabecera iluminada en Aurora, una barra de cabecera negra y filas a rayas en Brutalista, una tabla abierta entre dos filetes gruesos con cabecera en versalitas en Editorial y un listado de terminal con líneas discontinuas en Neón.

Llévalo a tu servidor

Enlaza el widget publicado desde tu servidor MCP o descarga el HTML y el manifiesto; la guía para añadir una interfaz a tu servidor MCP cubre las dos vías. Si prefieres que lo monte un agente, mira cómo crear widgets con un agente de IA.

Los datos que recibe

CampoTipoQué es
titleobligatoriostring
columnsobligatorioobject[]
└ keyobligatoriostringProperty of each row shown in this column
└ labelobligatoriostring
└ alignleft | right | center
rowsobligatorioobject[]
footnotestring

Datos de ejemplo

{
  "title": "Facturas pendientes",
  "columns": [
    {
      "key": "number",
      "label": "Factura"
    },
    {
      "key": "client",
      "label": "Cliente"
    },
    {
      "key": "due",
      "label": "Vence"
    },
    {
      "key": "amount",
      "label": "Importe",
      "align": "right"
    }
  ],
  "rows": [
    {
      "number": "F260031",
      "client": "Muebles Fiordo",
      "due": "15 oct",
      "amount": "4.200,00 €"
    },
    {
      "number": "F260032",
      "client": "Café Aurora",
      "due": "20 oct",
      "amount": "2.750,00 €"
    },
    {
      "number": "F260033",
      "client": "Estudio Prisma",
      "due": "31 oct",
      "amount": "6.480,00 €"
    },
    {
      "number": "F260034",
      "client": "Talleres Brío",
      "due": "5 nov",
      "amount": "1.320,00 €"
    }
  ],
  "footnote": "Importes con IVA incluido."
}

La tool que lo muestra

Un widget hecho con esta plantilla se muestra con una tool. El modelo lee su descripción para decidir cuándo llamarla y rellena el esquema de entrada con los datos. Esta es la definición que exporta Widgetry:

{
  "name": "show_table",
  "title": "Tabla",
  "description": "Shows tabular data: the caller defines the columns (key and header) and passes one object per row. Use it for lists of records such as invoices, leads or orders.",
  "inputSchema": {
    "type": "object",
    "required": [
      "title",
      "columns",
      "rows"
    ],
    "properties": {
      "title": {
        "type": "string"
      },
      "columns": {
        "type": "array",
        "items": {
          "type": "object",
          "required": [
            "key",
            "label"
          ],
          "properties": {
            "key": {
              "type": "string",
              "description": "Property of each row shown in this column"
            },
            "label": {
              "type": "string"
            },
            "align": {
              "type": "string",
              "enum": [
                "left",
                "right",
                "center"
              ]
            }
          }
        }
      },
      "rows": {
        "type": "array",
        "items": {
          "type": "object"
        }
      },
      "footnote": {
        "type": "string"
      }
    }
  }
}

Tu primer widget, en el chat en unos minutos

Elige una plantilla, pon tus datos y míralo como lo enseñarán ChatGPT o Claude. Después enlázalo desde tu servidor MCP, o deja que tu agente haga el siguiente.