docs/apps/overview.mdx
import { VersionBadge } from '/snippets/version-badge.mdx' import PrefabPinWarning from '/snippets/prefab-pin-warning.mdx'
<VersionBadge version="3.0.0" />A FastMCP app is a tool that returns an interactive UI instead of text. When the host calls it, the user sees a chart, a table, a form, or a whole dashboard rendered right inside the conversation, with working sort, search, tooltips, and state.
<div style={{ margin: '0 clamp(-180px, calc(-18vw + 90px), 0px) 2rem', maxHeight: '700px', overflow: 'hidden', position: 'relative', maskImage: 'linear-gradient(to bottom, black 75%, transparent)', WebkitMaskImage: 'linear-gradient(to bottom, black 75%, transparent)', }}> <iframe src="/apps/demos/hitchhikers.html" style={{width:"100%", height:"2000px", border:"none", borderRadius:"8px", background:"transparent"}} frameBorder="0" scrolling="no" allowtransparency="true"></iframe> </div>The dashboard above is a Prefab showcase — a taste of what you can deliver from a FastMCP tool. Every card, chart, slider, dialog, and carousel is a Python component. Build a composition like this, add @mcp.tool(app=True), and the host renders it inside the conversation.
Under the hood, FastMCP builds on the MCP Apps extension and uses Prefab to describe UIs in Python.
pip install "fastmcp[apps]"
Four patterns cover almost everything you'd want to build. Most apps start with Interactive Tools; you only reach for the others when you've hit a specific limit.
Add app=True to a tool and return a Prefab component. Charts, tables, dashboards, and client-side interactivity (toggles, tabs, filtering) all work without any server round-trips.
@mcp.tool(app=True)
def team_directory() -> DataTable:
return DataTable(columns=[...], rows=employees, search=True)
Forms that save data, buttons that trigger backend work, search that hits a database. FastMCPApp manages the wiring between UI actions and backend tools, with stable tool identifiers that survive server composition.
Register one provider and the model can write Prefab code tailored to the current data and request. The user watches the UI build up as the model generates it.
mcp.add_provider(GenerativeUI())
Write your own HTML, CSS, and JavaScript. Use a specific framework, drop in a map or 3D viewer, embed video. You're talking to the MCP Apps protocol directly.
fastmcp dev apps