The OpenAI Apps Directory Kit packages React directory widgets and a companion MCP server so you can build a specialized directory-style ChatGPT app without managing separate hosting for front-end assets.
- Node.js 18 or newer
- pnpm
pnpm installThis single install covers the widgets and the MCP server workspace.
pnpm run buildThis command compiles the widgets into hashed bundles in assets/. Run it whenever you change code under src/ or otherwise need fresh widget assets for the MCP server. After the build completes, restart the MCP server so it reloads the updated bundles. (Pure config or data edits do not require a build.)
pnpm run devThe Vite dev server serves each widget at http://localhost:4044/<widget>.html with hot reloading. It also injects the current directory data into window.openai.toolOutput, so every preview renders with live content as you iterate. The dev script automatically keeps the generated defaults in sync—no manual sync step required.
Open http://localhost:4044/ in your browser to browse the full list of widgets and load their individual previews.
cd directory_server_node
pnpm startThe server listens on port 8000 by default and hot-reloads changes to config/directory.json and data/directory-places.json.
ngrok http 8000Copy the HTTPS forwarding URL that ngrok prints (for example, https://<random>.ngrok-free.app).
- Open ChatGPT in developer mode and create a custom connector.
- Set the connector URL to your ngrok forwarding address with
/mcpappended (e.g.,https://<random>.ngrok-free.app/mcp). - Save the connector and invoke any of the directory tools (
directory-map,directory-list,directory-carousel, ordirectory-albums). ChatGPT renders the widgets using the inlined assets delivered by the MCP server.
- Edit
directory_server_node/config/directory.jsonto adjust copy, branding, theming, field mappings, and Supabase settings. - Update
directory_server_node/data/directory-places.jsonto change the bundled fallback dataset used by both the widgets and the MCP server. - Wire up Supabase by copying
.env.exampleto.envinsidedirectory_server_nodeand filling inSUPABASE_URLandSUPABASE_SERVICE_ROLE_KEY. When either variable is missing the MCP server automatically serves the bundled JSON data instead.
The dev server and MCP server automatically pick up changes to these files—no manual sync or build steps are required.
Production deployment instructions coming soon.