Skip to main content
Glama
TejasQ

CityJS London 2026 Companion

by TejasQ

Básicamente, MCP Apps

¿Sabes cómo los servidores MCP devuelven texto, JSON y cosas así? Bueno, las MCP Apps llevan eso un paso más allá: tus herramientas pueden devolver widgets HTML completos que se renderizan directamente dentro de ChatGPT. En lugar de que el modelo vuelque un muro de JSON al usuario, este ve una interfaz de usuario real. Tarjetas, cuadrículas, líneas de tiempo... lo que quieras.

Esto es literalmente solo una prueba de concepto (POC) y nada demasiado serio. Es una aplicación complementaria para la conferencia CityJS London 2026: horarios, ponentes, búsqueda de charlas... todo renderizado como una interfaz de usuario rica y temática dentro de ChatGPT.

Ejecútalo

./start.sh

Eso es todo. Un comando. Instala las dependencias, inicia el servidor, abre un túnel cloudflared y te entrega una URL para pegar en ChatGPT. Necesitas Node.js 18+ y cloudflared (brew install cloudflared en Mac).

Verás algo como esto:

  ┌─────────────────────────────────────────────────────────┐
  │                                                         │
  │   YOUR MCP ENDPOINT:                                    │
  │                                                         │
  │   https://something-random.trycloudflare.com/mcp        │
  │                                                         │
  │   NOW GO ADD IT TO CHATGPT:                             │
  │                                                         │
  │   1. Open chatgpt.com                                   │
  │   2. Click the tools icon (wrench) in the input bar     │
  │   3. Click 'Add MCP Server'                             │
  │   4. Paste the URL above                                │
  │   5. Ask: 'What's the CityJS London schedule?'          │
  │                                                         │
  └─────────────────────────────────────────────────────────┘

Luego pídele a ChatGPT cosas como "muéstrame los ponentes", "cuéntame sobre la charla de Douglas Crockford" o "busca charlas sobre IA" y observa cómo aparecen los widgets.

Related MCP server: Hello Widget Example

Vale, pero ¿cómo aprendo sobre las MCP Apps?

¡EL CÓDIGO FUENTE NO DA MIEDO! Revísalo. Básicamente hay 3 archivos relevantes (¡y son pequeños!):

Archivo

Qué hace

server.js

El servidor MCP. Registra widgets, registra herramientas, los vincula. Empieza aquí.

widgets/schedule.html

Un widget HTML que renderiza una línea de tiempo de la conferencia. Lee la etiqueta <script> al final.

widgets/speakers.html

Un widget HTML que renderiza una cuadrícula de tarjetas de ponentes. El mismo patrón que el anterior.

widgets/speaker-detail.html

Un widget HTML para la tarjeta de perfil completa de un solo ponente.

VE A LEERLOS. ¡ES DIVERTIDO, DE VERDAD!

Cómo funciona básicamente

Una MCP App es solo un servidor MCP que también sirve widgets HTML. Cuando ChatGPT llama a tu herramienta, renderiza tu widget y canaliza los datos de salida de la herramienta hacia él. Tres cosas hacen que esto suceda:

1. Escribes un widget HTML

Un archivo HTML autónomo con CSS y JS integrados. Recibe datos de ChatGPT y los renderiza. Eso es todo lo que hace. Mira widgets/speakers.html: es solo una función render(data) y algo de CSS.

El widget recoge los datos de ChatGPT así:

// ChatGPT puts tool output here when the widget loads
tryRender(window.openai?.toolOutput);

// Or fires this event slightly later
window.addEventListener("openai:set_globals", (e) => {
  tryRender(e.detail?.globals?.toolOutput);
});

También recoge el tema (window.openai?.theme) para que coincida automáticamente con el modo claro/oscuro de ChatGPT.

2. Registras el widget como un recurso

En server.js, le dices al host MCP "oye, tengo este widget":

server.registerResource(
  "schedule-widget",
  "ui://cityjs/schedule.html",
  { mimeType: "text/html;profile=mcp-app" },  // <-- this MIME type is the magic
  async () => ({
    contents: [{
      uri: "ui://cityjs/schedule.html",
      mimeType: "text/html;profile=mcp-app",
      text: scheduleWidgetHtml,  // the raw HTML string
    }],
  })
);

El tipo MIME text/html;profile=mcp-app es lo que convierte un servidor MCP normal en una MCP App. Le dice al host "esto es un widget renderizable, no solo un archivo".

3. Vinculas una herramienta al widget

Cuando registras una herramienta, le dices al host qué widget renderizar cuando se llama a la herramienta:

server.registerTool(
  "get_schedule",
  {
    title: "Get Schedule",
    description: "Get the CityJS London 2026 schedule...",
    inputSchema: { day: z.enum(["day1", "day2", "day3", "all"]).optional() },
    _meta: {
      ui: { resourceUri: SCHEDULE_URI },           // MCP spec way
      "openai/outputTemplate": SCHEDULE_URI,        // ChatGPT-specific way
    },
  },
  async ({ day }) => {
    return {
      structuredContent: { days },   // <-- your widget receives THIS
      content: [{ type: "text", text: JSON.stringify({ days }) }],  // fallback for non-UI hosts
    };
  }
);

structuredContent son los datos que renderiza tu widget. content es una alternativa de texto para hosts que aún no tienen interfaz de usuario (como Claude). Devuelve siempre ambos.

Y eso es básicamente todo. Widget + recurso + vinculación de herramienta = MCP App.

El proyecto

basically-mcp-apps/
  start.sh               <- run this. that's it.
  server.js              <- the MCP server. START READING HERE.
  package.json
  data/
    data.json            <- raw conference data (speakers, talks, bios)
    cityjs.js            <- enriches the raw data with rooms, types, etc.
  widgets/
    schedule.html        <- conference schedule timeline widget
    speakers.html        <- speaker grid widget
    speaker-detail.html  <- individual speaker profile card widget

Dependencias

Sin React, sin paso de compilación, sin empaquetador, sin framework. Solo archivos HTML y un servidor Node.

¡Feliz hackeo!

F
license - not found
Not graded
quality - not tested
D
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A minimal MCP server demonstrating how to build ChatGPT-compatible applications using Next.js with widget rendering capabilities. Provides a starter template for integrating Next.js applications with the ChatGPT Apps SDK through the Model Context Protocol.
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A minimal ChatGPT app demonstrating interactive greeting widgets with confetti animations and theme support, built as a template for creating MCP servers with custom UI components.
  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server template integrated with the OpenAI Apps SDK for building ChatGPT-compatible widgets with automatic tool registration. It provides a suite of interactive UI components and ecommerce examples for creating type-safe, theme-aware widgets.
  • F
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that enables AI models to render GitHub's Primer React components directly within chat interfaces using a JSON component tree. It provides tools to list available components and display interactive UI elements with full GitHub theming support.

View all related MCP servers

Related MCP Connectors

  • MCP server for AI dialogue using various LLM models via AceDataCloud

  • Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.

  • Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TejasQ/basically-mcp-apps'

If you have feedback or need assistance with the MCP directory API, please join our Discord server