CityJS London 2026 Companion
기본적으로, MCP 앱
MCP 서버가 텍스트나 JSON 등을 반환한다는 것을 알고 계신가요? MCP 앱은 여기서 한 걸음 더 나아갑니다. 도구가 ChatGPT 내부에서 직접 렌더링되는 전체 HTML 위젯을 반환할 수 있습니다. 모델이 사용자에게 JSON 덩어리를 쏟아내는 대신, 실제 UI를 보여줍니다. 카드, 그리드, 타임라인 등 원하는 무엇이든 가능합니다.
이 프로젝트는 단순히 개념 증명(POC)을 위한 것이며 거창한 목적은 없습니다. CityJS London 2026 컨퍼런스 컴패니언 앱으로, 일정, 연사, 발표 검색 기능을 ChatGPT 내에서 풍부한 테마 UI로 렌더링합니다.
실행 방법
./start.sh이게 전부입니다. 명령어 하나로 의존성을 설치하고, 서버를 시작하며, cloudflared 터널을 열어 ChatGPT에 붙여넣을 URL을 제공합니다. Node.js 18+와 cloudflared(Mac의 경우 brew install cloudflared)가 필요합니다.
다음과 같은 화면이 나타날 것입니다:
┌─────────────────────────────────────────────────────────┐
│ │
│ 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?' │
│ │
└─────────────────────────────────────────────────────────┘그런 다음 ChatGPT에게 "연사들 보여줘", "Douglas Crockford의 발표에 대해 알려줘", 또는 *"AI 관련 발표 찾아줘"*와 같이 질문하고 위젯이 나타나는 것을 확인하세요.
Related MCP server: Hello Widget Example
MCP 앱에 대해 배우려면
소스 코드는 전혀 어렵지 않습니다! 살펴보세요. 기본적으로 3개의 관련 파일이 있으며(매우 작습니다!), 내용은 다음과 같습니다:
파일 | 역할 |
MCP 서버. 위젯과 도구를 등록하고 서로 연결합니다. 여기서부터 시작하세요. | |
컨퍼런스 타임라인을 렌더링하는 HTML 위젯. 하단의 | |
연사 카드 그리드를 렌더링하는 HTML 위젯. 위와 동일한 패턴입니다. | |
단일 연사의 전체 프로필 카드를 위한 HTML 위젯. |
직접 읽어보세요. 정말 재미있습니다!
기본적인 작동 원리
MCP 앱은 HTML 위젯을 함께 제공하는 MCP 서버일 뿐입니다. ChatGPT가 도구를 호출하면 위젯을 렌더링하고 도구의 출력 데이터를 위젯으로 전달합니다. 이를 가능하게 하는 세 가지 요소는 다음과 같습니다:
1. HTML 위젯 작성
인라인 CSS와 JS가 포함된 독립형 HTML 파일입니다. ChatGPT로부터 데이터를 받아 렌더링하는 것이 전부입니다. widgets/speakers.html을 살펴보세요. render(data) 함수와 약간의 CSS로 구성되어 있습니다.
위젯은 다음과 같이 ChatGPT로부터 데이터를 가져옵니다:
// 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);
});또한 테마(window.openai?.theme)를 가져와 ChatGPT의 라이트/다크 모드에 자동으로 맞춥니다.
2. 위젯을 리소스로 등록
server.js에서 MCP 호스트에게 위젯이 있음을 알립니다:
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
}],
})
);MIME 타입 text/html;profile=mcp-app은 일반 MCP 서버를 MCP 앱으로 변환하는 핵심입니다. 이는 호스트에게 "이것은 단순한 파일이 아니라 렌더링 가능한 위젯이다"라고 알려줍니다.
3. 도구를 위젯에 바인딩
도구를 등록할 때, 도구가 호출될 때 어떤 위젯을 렌더링할지 호스트에게 알려줍니다:
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는 위젯이 렌더링할 데이터입니다. content는 아직 UI를 지원하지 않는 호스트(예: Claude)를 위한 텍스트 대체 수단입니다. 항상 둘 다 반환하세요.
기본적으로 이게 전부입니다. 위젯 + 리소스 + 도구 바인딩 = MCP 앱.
프로젝트
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의존성
@modelcontextprotocol/sdk-- MCP 서버 SDKzod-- 입력 스키마 검증cloudflared-- 로컬 호스트를 인터넷으로 터널링하여 ChatGPT가 접근할 수 있게 함Node.js 18+
React, 빌드 단계, 번들러, 프레임워크가 필요 없습니다. HTML 파일과 Node 서버만 있으면 됩니다.
즐거운 코딩 되세요!
This server cannot be installed
Maintenance
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
- FlicenseNot gradedqualityDmaintenanceA 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.
- FlicenseNot gradedqualityNot gradedmaintenanceA 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.
- FlicenseNot gradedqualityDmaintenanceAn 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.
- FlicenseNot gradedqualityBmaintenanceAn 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.
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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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