소개:작성자: Boxu Li
ChatGPT의 앱은 이제 타사 개발자가 대화 인터페이스 내에서 작동하는 인터랙티브 미니 애플리케이션을 구축할 수 있도록 허용합니다. 사용자를 웹사이트나 모바일 앱으로 보내는 대신, 이러한 앱은 대화 내에서 실행되며 모델의 추론을 활용해 작업을 수행합니다. Canva, Coursera, Expedia 및 Zillow와 같은 초기 파트너들은 사용자가 ChatGPT를 떠나지 않고도 재생 목록을 요청하거나 포스터를 디자인하거나 부동산을 검색할 수 있는 방법을 시연했습니다[1]. 새로운 Apps SDK는 외부 도구 및 사용자 인터페이스와 상호 작용할 수 있는 오픈 표준인 **모델 컨텍스트 프로토콜 (MCP)**을 기반으로 구축되었습니다[2]. 이 블로그는 MCP 기반 앱의 아키텍처를 깊이 있게 탐구하고, SDK의 기능을 설명하며, 앱을 단계별로 구축하는 과정을 안내하고, 사용자가 앱을 발견하고 사용하는 방법을 탐구하며, 개인정보 보호 및 보안 고려사항에 대해 논의합니다. 전반적으로 공식 문서와 신뢰할 수 있는 저널리즘을 인용하여 분석을 신뢰할 수 있는 출처에 기반을 둡니다.
The Model Context Protocol은 Apps SDK의 기초입니다. 개발자 문서에 따르면, 모든 Apps SDK 통합은 도구를 노출하고 인증을 처리하며 ChatGPT에서 렌더링되는 구조화된 데이터와 HTML을 패키징하기 위해 MCP 서버를 사용합니다[2]. MCP는 오픈 표준입니다—누구나 어떤 언어로든 서버를 구현하고 GPT‑4나 Codex 같은 모델을 연결할 수 있습니다. 오픈 소스 특성 덕분에 특정 벤더에 종속되지 않으며, 이론적으로는 어떤 AI 플랫폼에서도 프로토콜을 구현하면 동일한 앱을 실행할 수 있습니다. 이러한 개방성은 커뮤니티 기여를 장려하고 HTTP와 같은 표준이 상호 운용 가능한 웹사이트를 가능하게 했던 초기 웹과 유사한 생태계를 조성합니다.
MCP 서버는 하나 이상의 도구를 노출합니다. 도구는 모델이 호출할 수 있는 행동을 정의하며, 예를 들어 "칸반 보드 생성", "주택 검색" 또는 "플레이리스트 생성"과 같은 것입니다. 각 도구는 머신 이름, 사용자 친화적인 제목 및 모델이 수락하는 인수를 설명하는 JSON 스키마로 설명됩니다. ChatGPT가 도구를 호출해야 한다고 판단하면 서버에 구조화된 호출을 보냅니다. 서버는 API 쿼리, 계산 수행 또는 데이터베이스와의 상호작용을 통해 논리를 실행한 다음 도구 응답을 반환합니다. 이 응답에는 세 가지 필드가 포함됩니다:
도구는 또한 HTML 템플릿이나 이미지와 같은 자원을 ui:// URL을 참조하여 사용할 수 있습니다. 서버는 시작 시 이러한 자원을 등록합니다. 문서에서는 OpenAI의 인프라에 의해 자원이 캐시되기 때문에, 개발자는 파일 이름에 빌드 해시를 포함하여 자원을 버전 관리해야 한다고 경고합니다[5]. 그렇지 않으면 배포 후 사용자에게 오래된 UI가 표시될 수 있습니다.
structuredContent와 _meta의 구분은 매우 중요합니다. 문서에 따르면, structuredContent는 모델에 표시되며 UI 구성 요소를 보완하는 데 사용됩니다. _meta는 모델에서 숨겨져 있으며 드롭다운 메뉴 목록과 같은 UI에 필요한 추가 데이터를 포함할 수 있습니다[3]. 표시되는 데이터와 숨겨진 데이터를 분리함으로써, 개발자는 민감한 정보를 모델로부터 보호하면서도 풍부한 인터페이스를 구현할 수 있습니다. 이 설계는 또한 최소한의 데이터 공유를 장려하여, 작업을 수행하는 데 필요한 정보만 노출되도록 하여 프라이버시 원칙에 부합합니다.
사용자가 앱을 처음 호출할 때, 서버는 사용자를 인증해야 할 수 있습니다. Apps SDK는 OAuth 2.1 흐름을 지원하며, 개발자는 범위를 지정하고 사용자를 신원 제공자로 리디렉션합니다. 사용자가 동의를 하면, 앱은 토큰을 얻어 사용자의 데이터에 접근할 수 있습니다. 서버의 역할은 사용자 ChatGPT 계정에 키가 지정된 데이터베이스에 토큰을 저장하여 세션 상태를 관리하는 것입니다. 이를 통해 후속 도구 호출 시 사용자에게 다시 묻지 않고 세션을 재사용할 수 있습니다.
OpenAI는 최소 권한, 명시적 사용자 동의 및 심층 방어를 강조합니다[6]. 앱은 필요한 최소한의 권한만 요청해야 하며, 사용자는 데이터 공유를 명시적으로 승인해야 합니다. 모델 자체는 절대 자격 증명을 추측해서는 안 됩니다. 데이터 보유는 제한됩니다: 구조화된 콘텐츠는 사용자의 프롬프트가 활성화되어 있는 동안에만 유지되며, 로그는 개발자와 공유되기 전에 편집됩니다[6]. 앱 구성 요소의 네트워크 접근은 콘텐츠 보안 정책에 의해 제한됩니다; iframes는 임의의 브라우저 API에 접근할 수 없으며, 모든 HTTP 요청은 클라이언트가 아닌 서버에서 시작되어야 합니다[7]. 이는 크로스 사이트 스크립팅과 토큰 유출을 방지합니다.

앱 SDK는 MCP를 관용적인 클라이언트 라이브러리(현재는 Python과 TypeScript)와 스케폴딩 도구로 감쌉니다. 앱을 만들 때, 도구를 정의하고 UI 템플릿을 등록하며 서버 로직을 구현합니다. 서버는 자체 인프라에서 실행될 수 있으며, FastAPI, Express 등 어떤 프레임워크든 사용할 수 있습니다. 단, MCP 엔드포인트를 구현해야 합니다. OpenAI는 개발 서버와 로컬에서 호출을 테스트하기 위한 MCP Inspector를 제공합니다.
개발자는 로직과 사용자 인터페이스를 모두 설계합니다. UI는 보통 React로 작성되어 정적 리소스로 컴파일됩니다. 이는 ChatGPT의 샌드박스된 iframe 내에서 제공됩니다. 이 iframe 내에서 개발자는 글로벌 window.openai 객체에 접근하여 호스트와 상호작용할 수 있습니다. Build a custom UX 가이드에 따르면, 이 API는 다음과 같은 기능을 제공합니다:
이러한 API를 통해 개발자는 모델의 추론과 동기화된 풍부한 인터랙티브 컴포넌트를 구축할 수 있습니다. 예를 들어, 사용자가 칸반 보드에서 작업을 새로운 열로 드래그하면, 컴포넌트는 서버를 업데이트하고 새로운 상태를 지속하며, 새로운 structuredContent를 반환할 수 있습니다. 이때 모델은 고수준의 보드 상태만 인식하며, UI는 드래그 앤 드롭과 같은 세부 사항을 처리합니다.
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.
UI 템플릿과 같은 리소스는 OpenAI의 서버에 캐시되기 때문에, 개발자들은 ui:// 식별자에 고유한 해시나 버전을 포함해야 합니다. 문서에서는 경로를 업데이트하지 않고 새 버전을 배포하면 캐싱 때문에 사용자가 이전 UI를 계속 볼 수 있다고 경고합니다. 최선의 방법은 커밋 SHA나 빌드 ID를 URL에 포함시키는 것입니다. 이렇게 하면 각 배포가 새로운 리소스를 생성하도록 보장할 수 있습니다.
컴포넌트는 종종 상태를 유지해야 합니다. 예를 들어, 재생 목록 앱은 사용자가 노래를 즐겨찾기에 추가할 수 있으며, 이러한 즐겨찾기는 사용자가 다른 질문을 하더라도 남아 있어야 합니다. setWidgetState() 메서드는 데이터를 structuredContent 외부에 저장하고 턴을 넘어서도 지속됩니다. 모델은 이 상태를 보지 않기 때문에 개인정보가 보호됩니다.
때때로 앱은 사용자에게 명확한 질문을 해야 할 필요가 있습니다. sendFollowupTurn() 메서드는 컴포넌트가 새로운 프롬프트를 ChatGPT에 다시 보낼 수 있게 하며, 이는 마치 모델이 질문한 것처럼 대화 기록에 나타납니다. 이는 여러 단계의 워크플로우에 유용합니다. 예를 들어, 여행 예약 앱은 사용자가 호텔을 선택한 후에 "몇 박 동안 머무르실 건가요?"라고 물을 수 있습니다.
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.
사용자가 처음으로 앱을 활성화할 때, ChatGPT는 온보딩 과정을 시작합니다. 모델은 사용자에게 계정을 연결하라고 요청하고(필요한 경우), 앱이 필요한 데이터를 설명합니다. 개발자 가이드라인은 앱이 사용자의 프라이버시를 존중하고, 예측 가능하게 행동하며, 명확한 정책을 가져야 한다고 강조합니다[11]. 사용자는 명시적으로 권한을 부여하거나 거부해야 하며, 조용히 데이터에 접근할 수는 없습니다. 연결되면, 앱은 이후 상호작용을 위해 계속 연결될 수 있지만, 사용자는 언제든지 연결을 해제하고 권한을 철회할 수 있습니다.
OpenAI의 앱 개발자 지침은 생태계가 안전하고 신뢰할 수 있도록 여러 원칙을 정의합니다. 앱은 합법적인 서비스를 제공해야 하고, 명확한 개인정보 보호 정책과 데이터 보존 관행을 가져야 하며, 사용 정책을 준수해야 합니다[11]. 데이터 수집을 최소화하고, 민감한 개인 정보를 저장하지 않으며, 사용자 동의 없이 데이터를 공유하지 않아야 합니다[12]. 앱은 예측 가능하게 작동해야 하며, 모델을 조작하여 해롭거나 오해의 소지가 있는 내용을 생성할 수 없습니다.
가이드라인은 앱이 기능에 필수적인 데이터만 수집해야 하며, 건강 기록이나 정부 발급 신분증과 같은 민감한 데이터를 요청하거나 저장해서는 안 된다고 강조합니다[12]. 모델에 전송되는 구조화된 콘텐츠는 비밀을 포함해서는 안 되며, 숨겨진 메타데이터가 사용자 토큰이나 개인 정보를 저장해서는 안 됩니다. 개발자는 OAuth 과정에서 얻은 모든 토큰에 대해 강력한 암호화와 안전한 저장을 구현해야 합니다. 서버는 사용자 세션 간의 엄격한 경계를 유지해야 하며, 한 사용자의 데이터가 다른 사용자의 컨텍스트로 유출되어서는 안 됩니다.
보안 및 개인정보 보호 가이드는 플랫폼에 내장된 방어 메커니즘을 설명합니다. 최소 권한 및 명시적 사용자 동의를 중심 원칙으로 강조합니다[6]. 데이터 보유는 제한되며, 개발자가 접근할 수 있는 로그는 개인 식별 정보를 제거하기 위해 수정됩니다. 구조화된 콘텐츠는 프롬프트가 요구하는 동안에만 보유됩니다[6]. iframe 내부의 네트워크 접근은 콘텐츠 보안 정책에 의해 제한되며, 외부 요청은 서버를 통해야 하므로 무단 크로스 오리진 요청을 방지합니다[7]. 인증은 단기 유효 토큰을 사용하는 업계 표준 OAuth 흐름을 사용합니다. 개발자는 운영 준비 상태를 유지하기 위해 보안 검토, 버그 보고 채널 및 사건 모니터링을 구현해야 합니다[7].
앱은 넓은 대중을 대상으로 적합해야 합니다. 가이드라인은 장편 콘텐츠, 복잡한 자동화 또는 광고를 제공하는 앱을 금지합니다[13]. 예를 들어, 앱은 30분짜리 비디오를 제공하거나 ChatGPT 내에서 전체 소셜 네트워크를 복제하려고 해서는 안 됩니다. 플랫폼은 대화 흐름을 보완하는 간결한 상호작용을 권장합니다. 규정 위반 시 거부 또는 제거될 수 있습니다.
ChatGPT를 서드파티 앱에 개방함으로써 OpenAI는 사용자와 서비스 사이에서 '의도 레이어'로 자리를 잡습니다. 이제 개발자는 별도의 웹 또는 모바일 앱을 구축하지 않고도 채팅 인터페이스를 통해 수백만 명의 사용자에게 도달할 수 있습니다. 앱은 마찰을 줄일 잠재력을 가지고 있습니다: 앱을 다운로드하거나 웹사이트를 방문하는 대신, 사용자는 대화 중에 서비스만 언급하면 됩니다. 이는 도구에 대한 접근을 민주화하고 소규모 개발자에게 기회의 장을 평등하게 만들 수 있습니다.
초기 파트너십은 가능성을 보여줍니다: 사용자는 Coursera 강의를 시청하면서 ChatGPT에 질문할 수 있고, Canva에서 포스터를 디자인하거나 Expedia 여행 옵션 또는 Zillow 부동산 목록을 검색할 수 있습니다. Spotify 플레이리스트를 생성하거나 Figma를 사용해 아이디어를 다이어그램화할 수도 있습니다[14][13]. 앱이 채팅 내에서 실행되므로, 모델은 요약, 분석 및 추천 생성이 가능하여 정적 콘텐츠를 인터랙티브한 학습 자료로 변환할 수 있습니다. 앱은 인라인 카드, 전체 화면 또는 화면 속 화면 등 다양한 디스플레이 모드를 제공하여 다양한 작업에 유연성을 제공합니다[15].
앱을 사용하는 데 있어 맥락을 전환하지 않고도 사용할 수 있는 능력은 사람들이 서비스와 상호 작용하는 방식을 재정립할 수 있습니다. ChatGPT는 단순한 챗봇이 아니라 의도에 대한 범용 운영 체제가 됩니다. 케이시 뉴턴은 이것이 개별 앱을 실행하는 대신 원하는 것을 단순히 말하는 것으로 이동한다고 관찰했습니다[16]. 일부 분석가들은 이 변화를 앱 스토어나 브라우저의 출시와 비교합니다: 기능과 경쟁을 집계하는 단일 플랫폼.
그러나 이 변형은 통제와 권력에 대한 질문을 제기합니다. ChatGPT가 어떤 앱을 표면화할지를 결정한다면, 그것은 게이트키퍼가 될 수 있습니다. 뉴턴은 사용자 선호도를 기반으로 한 "AI 그래프"가 소셜 네트워크보다 더 심각한 프라이버시 위험을 초래할 수 있다고 경고합니다[16]. 경제적 인센티브는 앱의 배치나 순위를 위한 유료 참여를 유도할 수 있습니다. 개발자들은 사용자와의 관계를 소유하는 대신 ChatGPT를 위해 설계해야 한다는 압박을 느낄 수 있습니다. 플랫폼이 신뢰를 유지하기 위해 투명하고 공정하게 유지되는 것이 중요합니다.
앱이 개인 데이터—위치, 연락처, 결제 방법—에 접근할 수 있기 때문에 규제 기관은 ChatGPT를 통해 데이터가 어떻게 흐르는지를 면밀히 조사할 수 있습니다. 플랫폼이 아직 유럽 연합에서 제공되지 않더라도, 개발자는 GDPR과 같은 개인정보 보호법을 준수해야 합니다[17]. OpenAI는 더 세분화된 개인정보 보호 설정과 수익화 옵션을 약속했으며, 채팅 내에서 즉시 결제가 가능한 agentic commerce protocol을 포함합니다[18]. 이 생태계의 성공은 강력한 보안, 명확한 사용자 동의 및 공정한 경제 모델에 달려 있습니다.
앱 SDK는 아직 미리보기 상태이며, 많은 기능이 아직 완벽히 개발되지 않았습니다. 개발자 로드맵에는 다음이 포함됩니다:
ChatGPT의 앱 소개와 MCP 기반 앱 SDK는 소프트웨어와 상호작용하는 방식에 큰 변화를 가져옵니다. 타사 애플리케이션을 채팅 인터페이스에 직접 도입함으로써 OpenAI는 자연어, 추론 및 대화형 UI를 결합한 새로운 플랫폼을 만들었습니다. 모델 컨텍스트 프로토콜은 모델이 도구를 호출하고 구성 요소를 렌더링할 수 있는 개방적이고 표준화된 방법을 제공합니다. 앱 SDK는 서버 통신, UI 통합 및 상태 관리를 처리하여 개발을 단순화합니다. 작업 추적기와 같은 단계별 예시는 엄격한 데이터 경계와 프라이버시를 유지하면서 유용한 앱을 얼마나 쉽게 만들 수 있는지를 보여줍니다.
그러나 이러한 혁신에는 책임이 따릅니다. 개발자는 사용자 프라이버시, 안전성 및 공정성을 우선시하는 지침을 따라야 합니다[11][12]. 최소 권한 및 명시적 동의와 같은 보안 메커니즘은 사용자를 보호합니다[6]. 동시에 업계 관찰자들은 이 플랫폼이 새로운 형태의 게이트키핑과 프라이버시 위험을 초래할 수 있다고 경고합니다[16]. 생태계가 성숙해짐에 따라 투명성, 개방형 표준 및 커뮤니티 참여가 ChatGPT의 앱 플랫폼이 일상 업무를 위한 변혁적이고 신뢰할 수 있는 계층이 되는지를 결정할 것입니다.
[1] AI 경쟁의 최신 동향: ChatGPT가 이제 Spotify 및 Zillow와의 채팅 연결을 허용합니다
https://developers.openai.com/apps-sdk/build/mcp-server
https://developers.openai.com/apps-sdk/guides/security-privacy
[8] 맞춤형 UX 구축
https://developers.openai.com/apps-sdk/build/custom-ux
https://developers.openai.com/apps-sdk/concepts/user-interaction
https://developers.openai.com/apps-sdk/app-developer-guidelines/
[13] ChatGPT 앱이 출시되었습니다: 시도해 볼 수 있는 첫 번째 앱들 | The Verge
https://www.theverge.com/news/793081/chagpt-apps-sdk-spotify-zillow-openai
[14] OpenAI 개발자 데이 2025: ChatGPT 앱 및 개발자를 위한 AgentKit, 저렴한 GPT 모델 제공
[15] OpenAI, ChatGPT가 Zillow, Canva, Spotify 같은 타사 앱을 실행할 수 있는 Apps SDK 발표 | VentureBeat
https://venturebeat.com/ai/openai-announces-apps-sdk-allowing-chatgpt-to-launch-and-run-third-party
[16] 새로운 플랫폼, 익숙한 위험: Zillow와 Expedia, OpenAI의 ChatGPT 앱 출시 기대 – GeekWire
[17] OpenAI 개발자데이: ChatGPT 앱, 에이전트킷, 그리고 Codex의 GA 출시 - SD Times
https://sdtimes.com/ai/openai-devday-chatgpt-apps-agentkit-and-ga-release-of-codex/
[18] OpenAI는 ChatGPT를 범용 앱 프론트엔드로 만들고 싶어합니다 - Ars Technica
https://arstechnica.com/ai/2025/10/openai-wants-to-make-chatgpt-into-a-universal-app-frontend/