The obvious fix is to decouple services from model providers — let users bring their own API keys. But most people don't use APIs. That's a developer-only path.
So the remaining option is to build within the LLM's native environment. But current LLM interfaces don't support structured, persistent UI interaction. What they offer today (artifacts, canvas, etc.) are one-shot renders — display-only, no state, no function calls back and forth. Essentially toys.
MUP (Model UI Protocol) is my attempt to solve this. A MUP is a single HTML file that bundles a visual interface with callable functions. The user clicks buttons; the LLM calls functions. Both sides operate on the same state in real time. Multiple MUPs can run simultaneously, and the LLM orchestrates data between them.
It runs as an MCP server — plug it into Claude Code or Claude Desktop, and the MUP panels appear in a browser grid alongside your chat. No build step, no framework. Write an HTML file with a manifest, and it works.
I've built 20+ example MUPs: a full music production toolkit (7 instruments + mixer + arranger), pixel art editor, chess, kanban, presentation builder, camera, and more.
demo: https://youtu.be/HkmWpmfX46o
demos: https://github.com/Ricky610329/mup#demos
GitHub: https://github.com/Ricky610329/mup