Introducción:Autor: Boxu Li
Las aplicaciones en ChatGPT ahora permiten a los desarrolladores de terceros construir miniaplicaciones interactivas que viven dentro de la interfaz de chat. En lugar de enviar a los usuarios a sitios web o aplicaciones móviles, estas aplicaciones funcionan dentro de la conversación y aprovechan el razonamiento del modelo para impulsar acciones. Socios tempranos como Canva, Coursera, Expedia y Zillow demostraron cómo los usuarios pueden pedir una lista de reproducción, diseñar un cartel o buscar bienes raíces sin salir de ChatGPT[1]. El nuevo SDK de aplicaciones está construido sobre el Protocolo de Contexto del Modelo (MCP), un estándar abierto que permite a los modelos interactuar con herramientas externas e interfaces de usuario[2]. Este blog profundiza en la arquitectura de las aplicaciones basadas en MCP, explica las capacidades del SDK, guía el desarrollo de una aplicación paso a paso, explora cómo los usuarios descubren y utilizan aplicaciones, y discute consideraciones de privacidad y seguridad. A lo largo, citamos documentación oficial y periodismo de renombre para fundamentar el análisis en fuentes creíbles.
El Protocolo de Contexto del Modelo es la base del SDK de Apps. Según la documentación para desarrolladores, cada integración del SDK de Apps utiliza un servidor MCP para exponer herramientas, manejar la autenticación y empaquetar tanto datos estructurados como HTML que se renderiza en ChatGPT[2]. MCP es un estándar abierto: cualquiera puede implementar un servidor en cualquier lenguaje y conectar un modelo como GPT-4 o Codex. La naturaleza de código abierto significa que no hay bloqueo de proveedor; teóricamente, la misma aplicación puede ejecutarse en cualquier plataforma de IA que implemente el protocolo. Esta apertura fomenta las contribuciones de la comunidad y promueve un ecosistema análogo a la web temprana, donde estándares como HTTP permitieron sitios web interoperables.
Un servidor MCP expone una o más herramientas. Una herramienta define una acción que el modelo puede llamar, como "crear un tablero kanban", "buscar casas" o "generar una lista de reproducción". Cada herramienta se describe mediante un nombre de máquina, un título amigable para el usuario y un esquema JSON que indica al modelo qué argumentos acepta. Cuando ChatGPT decide que se debe invocar la herramienta, envía una llamada estructurada al servidor. El servidor ejecuta la lógica, ya sea consultando una API, realizando un cálculo o interactuando con una base de datos, y luego devuelve una respuesta de herramienta. Esta respuesta incluye tres campos:
Las herramientas también pueden referirse a resources, como plantillas HTML o imágenes, haciendo referencia a un URL ui://. El servidor registra estos recursos durante el inicio. La documentación advierte que debido a que los recursos son almacenados en caché por la infraestructura de OpenAI, los desarrolladores deben versionarlos incluyendo un hash de compilación en el nombre del archivo[5]. De lo contrario, los usuarios podrían ver interfaces obsoletas después de los despliegues.
La distinción entre structuredContent y _meta es crítica. Según la documentación, structuredContent es visible para el modelo y se usa para hidratar el componente de la interfaz de usuario; _meta está oculto para el modelo y puede contener datos adicionales para la interfaz, como listas para menús desplegables[3]. Al separar los datos visibles de los ocultos, los desarrolladores pueden proteger la información sensible del modelo mientras siguen renderizando interfaces ricas. Este diseño también fomenta el intercambio mínimo de datos; solo se expone lo necesario para realizar la tarea, alineándose con los principios de privacidad.
Cuando un usuario llama por primera vez a una aplicación, el servidor puede necesitar autenticarlos. El Apps SDK admite flujos OAuth 2.1; los desarrolladores especifican alcances y redirigen a los usuarios al proveedor de identidad. Una vez que el usuario otorga su consentimiento, la aplicación obtiene un token y puede acceder a los datos del usuario. La tarea del servidor es gestionar el estado de la sesión, a menudo almacenando tokens en una base de datos vinculada a la cuenta de ChatGPT del usuario. Esto asegura que las llamadas posteriores a la herramienta puedan reutilizar la sesión sin volver a solicitar al usuario.
OpenAI enfatiza el mínimo privilegio, el consentimiento explícito del usuario y la defensa en profundidad[6]. Las aplicaciones deben solicitar solo los permisos mínimos necesarios, y los usuarios deben autorizar explícitamente el intercambio de datos; el modelo en sí nunca debe adivinar credenciales. La retención de datos es limitada: el contenido estructurado permanece solo mientras el aviso del usuario está activo, y los registros se redactan antes de ser compartidos con los desarrolladores[6]. El acceso a la red para los componentes de la aplicación está restringido por una política de seguridad de contenido; los iframes no pueden acceder a las API del navegador arbitrariamente, y todas las solicitudes HTTP deben originarse desde el servidor en lugar del cliente[7]. Esto previene el scripting entre sitios y la exfiltración de tokens.

El SDK de aplicaciones encapsula el MCP en bibliotecas cliente idiomáticas (actualmente Python y TypeScript) y herramientas de andamiaje. Cuando creas una aplicación, defines las herramientas, registras plantillas de UI e implementas la lógica del servidor. El servidor puede ejecutarse en tu propia infraestructura y utilizar cualquier marco (FastAPI, Express, etc.), pero debe implementar los endpoints de MCP. OpenAI proporciona servidores de desarrollo y un Inspector MCP para probar llamadas localmente.
Los desarrolladores diseñan tanto la lógica como la interfaz de usuario. Las UIs suelen escribirse en React y compilarse en recursos estáticos. Se sirven dentro de un iframe aislado en ChatGPT. Dentro de este iframe, los desarrolladores pueden acceder a un objeto global window.openai para interactuar con el host. Según la guía Construir una UX personalizada, esta API proporciona:
Estas API permiten a los desarrolladores construir componentes interactivos ricos que se sincronizan con el razonamiento del modelo. Por ejemplo, si un usuario arrastra una tarea a una nueva columna en un tablero kanban, el componente puede enviar un callTool para actualizar el servidor, mantener el nuevo estado y luego devolver un nuevo structuredContent. Mientras tanto, el modelo solo ve el estado general del tablero; la IU maneja detalles como arrastrar y soltar.
In the server code you register a tool and its template. For instance, in a TypeScript server you might write:
import { Tool, StructuredToolResponse } from "@openai/apps";
// Register UI template
server.registerResource("ui://kanban-board/abc123", buildHtml());
// Define tool schema
const createBoard: Tool = {
name: "createKanbanBoard",
description: "Create a new kanban board with given tasks and columns",
inputSchema: z.object({
title: z.string(),
columns: z.array(z.object({ name: z.string() })),
tasks: z.array(z.object({ name: z.string(), columnIndex: z.number() }))
}),
async execute(input, ctx): Promise<StructuredToolResponse> {
// compute board state
const columns = input.columns.map((col, i) => ({
id: i,
title: col.name,
taskIds: input.tasks.filter(t => t.columnIndex === i).map((_t, idx) => idx)
}));
const tasksById = input.tasks.map((task, id) => ({ id, name: task.name }));
return {
content: `Created board '${input.title}'`,
structuredContent: { title: input.title, columns },
_meta: { tasksById, uiTemplate: "ui://kanban-board/abc123" }
};
}
};
The _meta field includes tasksById for hidden metadata and uiTemplate referencing the registered HTML. When ChatGPT receives this response, it will render the template with the structured content. The window.openai.toolOutput object in the component can then read the board data and display it.
Debido a que recursos como las plantillas de UI se almacenan en caché en los servidores de OpenAI, los desarrolladores deben incluir un hash único o versión en el identificador ui://. Los documentos advierten que si despliegas una nueva versión sin actualizar la ruta, los usuarios pueden seguir viendo la UI antigua debido al caché[5]. Una buena práctica es incrustar el SHA del commit o el ID de compilación en la URL. Esto asegura que cada implementación resulte en un recurso nuevo.
A menudo, los componentes necesitan mantener el estado. Por ejemplo, una aplicación de lista de reproducción podría permitir a los usuarios marcar canciones como favoritas; estas favoritas deben permanecer incluso cuando el usuario haga otra pregunta. El método setWidgetState() almacena datos fuera de structuredContent y persiste a través de turnos[8]. El modelo no ve este estado, asegurando la privacidad.
A veces, una aplicación necesita hacer una pregunta aclaratoria al usuario. El método sendFollowupTurn() permite que el componente envíe un nuevo mensaje de vuelta a ChatGPT, que aparecerá en la transcripción como si el modelo hubiera hecho la pregunta[8]. Esto es útil para flujos de trabajo de varios pasos: por ejemplo, una aplicación de reservas de viaje podría preguntar "¿Cuántas noches te quedarás?" después de que el usuario seleccione un hotel.
In this section we will build a simple Task Tracker app that demonstrates the core concepts of the Apps SDK. The app will let a user create tasks and organise them into categories. We choose this example because it is generic, easy to extend and showcases structured content, metadata, custom UI and tool calls.
First install the TypeScript SDK and scaffolding tool:
npm install -g @openai/apps-generator
apps init task-tracker
cd task-tracker
npm install
This command scaffolds a project with a server, a React frontend and build scripts. The server uses Express and the @openai/apps library. Run npm run dev to start the development server; the project includes an MCP Inspector that opens in your browser and simulates ChatGPT calling your app.
Open src/server.ts and define a tool called createTasks. The tool accepts an array of tasks and returns structured content grouping them by category. It also provides a summary in the content field.
import { Tool, StructuredToolResponse } from "@openai/apps";
export const createTasks: Tool = {
name: "createTasks",
description: "Create a list of tasks grouped by category",
inputSchema: z.object({ tasks: z.array(z.object({ name: z.string(), category: z.string() })) }),
async execute({ tasks }): Promise<StructuredToolResponse> {
const categories = Array.from(new Set(tasks.map(t => t.category)));
const grouped = categories.map(category => ({
name: category,
taskIds: tasks.filter(t => t.category === category).map((_, i) => i)
}));
const tasksById = tasks.map((task, id) => ({ id, name: task.name, category: task.category }));
return {
content: `Created ${tasks.length} tasks in ${categories.length} categories`,
structuredContent: { categories: grouped },
_meta: { tasksById, uiTemplate: "ui://task-tracker/1.0.0" }
};
}
};
Register the template before using it:
server.registerResource("ui://task-tracker/1.0.0", fs.readFileSync(path.join(__dirname, "../dist/index.html"), "utf8"));
server.registerTool(createTasks);
Next open src/frontend/App.tsx. This React component will read the structuredContent and display categories and tasks. It will also allow users to mark tasks as complete and persist that state using setWidgetState.
import { useEffect, useState } from "react";
declare global {
interface Window {
openai: any;
}
}
export default function App() {
const [complete, setComplete] = useState<{ [id: string]: boolean }>(() => window.openai.widgetState?.complete || {});
const output = window.openai.toolOutput;
const tasksById = output?._meta?.tasksById || [];
const categories = output?.structuredContent?.categories || [];
// persist completion state
useEffect(() => {
window.openai.setWidgetState({ complete });
}, [complete]);
return (
<div className="task-tracker">
{categories.map((cat: any, ci: number) => (
<div key={ci} className="category">
<h3>{cat.name}</h3>
<ul>
{cat.taskIds.map((tid: number) => (
<li key={tid}>
<label>
<input type="checkbox" checked={complete[tid]} onChange={() => setComplete(prev => ({ ...prev, [tid]: !prev[tid] }))} />
{tasksById[tid].name}
</label>
</li>
))}
</ul>
</div>
))}
</div>
);
}
This component uses window.openai.toolOutput to access the structuredContent and _meta fields. It stores completion state in widgetState so that checking a box persists even when the user continues the conversation. On subsequent tool calls, the component can fetch new tasks or update existing ones. This demonstrates how to combine model reasoning with client‑side interactions.
Run npm run dev again and open the MCP Inspector. In the prompt area, type:
@task‑tracker create a list of tasks: buy milk in shopping, finish report in work, call mom in personal
The inspector will show the structured content and render the task list UI. You can check tasks off; the state persists across turns. You can then ask ChatGPT: “Remind me of my tasks later.” Because the model retains context, it can call the tool again, display the UI and summarise your progress.

ChatGPT surfaces apps when it believes they can assist the user. There are two primary discovery modes. Named mention occurs when the user explicitly mentions the app name at the beginning of a prompt; in this case, the app will be surfaced automatically[9]. For instance, “@Spotify create a workout playlist” immediately invokes the Spotify integration. The user must place the app name at the start; otherwise the assistant may treat it as part of the conversation.
In‑conversation discovery happens when the model infers that an app could help based on context. The documentation explains that the model evaluates the conversation context, prior tool results and the user’s linked apps to determine which app might be relevant[9]. For example, if you are discussing travel plans, ChatGPT might suggest the Expedia app to book flights. The algorithm uses metadata like tool descriptions and keywords to match the conversation with potential actions[10]. Developers can improve discoverability by writing action‑oriented descriptions and clear UI component names.
OpenAI plans to release an app directory where users can browse and discover new apps[10]. Each listing will include the app name, description, supported prompts and any onboarding instructions. Users can also access the launcher via the “+” button in chat; this shows a menu of available apps based on context. These entry points will help less technical users find and enable apps without memorising names.
La primera vez que un usuario activa una aplicación, ChatGPT inicia un flujo de incorporación. El modelo pide al usuario que conecte su cuenta (si es necesario) y explica qué datos necesita la aplicación. Las directrices para desarrolladores enfatizan que las aplicaciones deben respetar la privacidad de los usuarios, comportarse de manera predecible y tener políticas claras[11]. Los usuarios deben otorgar o negar permiso explícitamente; no hay acceso a datos en silencio. Una vez conectada, la aplicación puede permanecer vinculada para interacciones posteriores, pero los usuarios siempre tienen la capacidad de desconectar y revocar permisos.
Las Directrices para Desarrolladores de Aplicaciones de OpenAI definen varios principios para garantizar que el ecosistema siga siendo seguro y confiable. Las aplicaciones deben proporcionar un servicio legítimo, tener una política de privacidad clara y prácticas de retención de datos, y cumplir con las políticas de uso[11]. Deben minimizar la recopilación de datos, evitar almacenar información personal sensible y no compartir datos de usuario sin consentimiento[12]. Las aplicaciones deben comportarse de manera predecible; no pueden manipular el modelo para producir contenido dañino o engañoso.
Las directrices enfatizan que las aplicaciones solo deben recopilar datos esenciales para su función y no deben solicitar ni almacenar datos sensibles como registros de salud o identificaciones gubernamentales [12]. El contenido estructurado enviado al modelo no debe contener secretos; los metadatos ocultos no deben almacenar tokens de usuario ni detalles privados. Los desarrolladores deben implementar un cifrado fuerte y almacenamiento seguro para cualquier token obtenido durante OAuth. El servidor debe mantener límites estrictos entre las sesiones de usuario; los datos de un usuario nunca deben filtrarse al contexto de otro.
La Guía de Seguridad y Privacidad describe los mecanismos de defensa incorporados en la plataforma. Hace hincapié en el principio de mínimo privilegio y el consentimiento explícito del usuario como principios centrales[6]. La retención de datos es limitada; los registros accesibles para los desarrolladores están redactados para eliminar información personalmente identificable, y el contenido estructurado solo se retiene mientras lo requiera la solicitud[6]. El acceso a la red desde el iframe está restringido por la política de seguridad de contenido; las solicitudes externas deben pasar por el servidor, evitando solicitudes no autorizadas de origen cruzado[7]. La autenticación utiliza flujos estándar de OAuth con tokens de corta duración. Se requiere que los desarrolladores implementen revisiones de seguridad, canales de reporte de errores y monitoreo de incidentes para mantener la preparación operativa[7].
Las aplicaciones deben ser apropiadas para un público amplio. Las directrices prohíben aplicaciones que ofrezcan contenido extenso, automatización compleja o anuncios[13]. Por ejemplo, una aplicación no debería intentar ofrecer un video de 30 minutos o replicar una red social completa dentro de ChatGPT. La plataforma fomenta interacciones concisas que complementen el flujo conversacional. Las violaciones pueden llevar al rechazo o eliminación.
Al abrir ChatGPT a aplicaciones de terceros, OpenAI se posiciona como una “capa de intención” entre los usuarios y los servicios. Los desarrolladores ahora pueden llegar a millones de usuarios a través de la interfaz de chat sin necesidad de crear aplicaciones web o móviles por separado. Las aplicaciones tienen el potencial de reducir la fricción: en lugar de descargar una aplicación o visitar un sitio web, los usuarios simplemente mencionan el servicio en la conversación. Esto podría democratizar el acceso a herramientas y nivelar el campo de juego para los pequeños desarrolladores.
Las primeras asociaciones muestran las posibilidades: los usuarios pueden ver conferencias de Coursera mientras hacen preguntas a ChatGPT; diseñar carteles en Canva; explorar opciones de viaje en Expedia o listados inmobiliarios en Zillow; generar listas de reproducción en Spotify; o diagramar ideas con Figma[14][13]. Como las aplicaciones se ejecutan dentro del chat, el modelo puede resumir, analizar y generar recomendaciones, convirtiendo contenido estático en lecciones interactivas. Las aplicaciones también ofrecen múltiples modos de visualización: tarjetas en línea, pantalla completa o imagen en imagen, proporcionando flexibilidad para diferentes tareas[15].
La capacidad de usar aplicaciones sin cambiar de contexto podría transformar la forma en que las personas interactúan con los servicios. ChatGPT se convierte no solo en un chatbot, sino en un sistema operativo universal para intenciones. Como observó Casey Newton, esto nos mueve de lanzar aplicaciones discretas a simplemente expresar lo que queremos[16]. Algunos analistas comparan este cambio con el lanzamiento de la App Store o el navegador: una única plataforma que agrega funcionalidad y competencia.
Sin embargo, esta transformación plantea preguntas sobre control y poder. Si ChatGPT determina qué aplicaciones mostrar, podría convertirse en un guardián. Newton advierte que un “grafo de IA” construido sobre las preferencias de los usuarios podría crear riesgos de privacidad más serios que los de las redes sociales[16]. Los incentivos económicos podrían llevar a una colocación o clasificación de aplicaciones de pago. Los desarrolladores podrían sentirse presionados a diseñar para ChatGPT en lugar de mantener su relación con los usuarios. Es crucial que la plataforma se mantenga transparente y justa para mantener la confianza.
Debido a que las aplicaciones pueden acceder a datos personales, como ubicación, contactos y métodos de pago, los reguladores pueden examinar cómo fluye la información a través de ChatGPT. Los desarrolladores deben cumplir con las leyes de privacidad como el RGPD, incluso si la plataforma aún no está disponible en la Unión Europea[17]. OpenAI ha prometido controles de privacidad más detallados y opciones de monetización, incluyendo un protocolo de comercio agéntico que permitirá pagos instantáneos dentro del chat[18]. El éxito de este ecosistema dependerá de una seguridad robusta, un consentimiento claro del usuario y modelos económicos justos.
El SDK de Apps aún está en vista previa, y muchas características aún deben desarrollarse por completo. La hoja de ruta para desarrolladores incluye:
La introducción de las Apps en ChatGPT y el SDK de Apps basado en MCP marca un cambio significativo en cómo interactuamos con el software. Al llevar aplicaciones de terceros directamente a la interfaz de chat, OpenAI ha creado una nueva plataforma que combina lenguaje natural, razonamiento e interfaces de usuario interactivas. El Protocolo de Contexto de Modelo proporciona una forma abierta y estandarizada para que los modelos llamen herramientas y rendericen componentes; el SDK de Apps simplifica el desarrollo al manejar la comunicación con el servidor, la integración de la UI y la gestión de estados. Ejemplos paso a paso como el Task Tracker demuestran lo fácil que es construir una app útil mientras se mantienen estrictos límites de datos y privacidad.
Sin embargo, esta innovación conlleva responsabilidades. Los desarrolladores deben seguir directrices que prioricen la privacidad, seguridad y equidad del usuario[11][12]. Los mecanismos de seguridad como el privilegio mínimo y el consentimiento explícito protegen a los usuarios[6]. Al mismo tiempo, los observadores de la industria advierten que la plataforma podría crear nuevas formas de control y riesgos de privacidad[16]. A medida que el ecosistema madura, la transparencia, los estándares abiertos y el compromiso de la comunidad determinarán si la plataforma de aplicaciones de ChatGPT se convierte en una capa transformadora y confiable para las tareas cotidianas.
[1] Últimas noticias de la carrera armamentista de IA: ChatGPT ahora permite a los usuarios conectarse con Spotify y Zillow en las conversaciones
[2] [3] [4] [5] Configura tu servidor
https://developers.openai.com/apps-sdk/build/mcp-server
[6] [7] Seguridad y Privacidad
https://developers.openai.com/apps-sdk/guides/security-privacy
[8] Crea una experiencia de usuario personalizada
https://developers.openai.com/apps-sdk/build/custom-ux
[9] [10] Interacción del usuario
https://developers.openai.com/apps-sdk/concepts/user-interaction
[11] [12] Guías para desarrolladores de aplicaciones
https://developers.openai.com/apps-sdk/app-developer-guidelines/
[13] Las apps de ChatGPT están en vivo: Aquí están las primeras que puedes probar | The Verge
https://www.theverge.com/news/793081/chagpt-apps-sdk-spotify-zillow-openai
[14] OpenAI DevDay 2025: ChatGPT obtiene aplicaciones, AgentKit para desarrolladores y modelos GPT más económicos
[15] OpenAI anuncia Apps SDK que permite a ChatGPT lanzar y ejecutar aplicaciones de terceros como Zillow, Canva, Spotify | VentureBeat
https://venturebeat.com/ai/openai-announces-apps-sdk-allowing-chatgpt-to-launch-and-run-third-party
[16] Nueva plataforma, riesgos familiares: Zillow y Expedia apuestan por el lanzamiento de aplicaciones de ChatGPT de OpenAI – GeekWire
[17] OpenAI DevDay: Aplicaciones de ChatGPT, AgentKit y lanzamiento GA de Codex - SD Times
https://sdtimes.com/ai/openai-devday-chatgpt-apps-agentkit-and-ga-release-of-codex/
[18] OpenAI quiere convertir ChatGPT en una interfaz de aplicación universal - Ars Technica
https://arstechnica.com/ai/2025/10/openai-wants-to-make-chatgpt-into-a-universal-app-frontend/