docs/python-sdk/fastmcp-apps-app.mdx
fastmcp.apps.appFastMCPApp — a Provider that represents a composable MCP application.
FastMCPApp binds entry-point tools (model calls these) together with backend
tools (the UI calls these via CallTool). Backend tools are tagged with
meta["fastmcp"]["app"] so they can be found through the provider chain
even when transforms (namespace, visibility, etc.) have renamed or hidden
them — the server sets a context var that tells Provider.get_tool to
fall back to a direct lookup for app-visible tools.
Usage::
from fastmcp import FastMCP, FastMCPApp
app = FastMCPApp("Dashboard")
@app.ui()
def show_dashboard() -> Component:
return Column(...)
@app.tool()
def save_contact(name: str, email: str) -> str:
return name
server = FastMCP("Platform")
server.add_provider(app)
FastMCPApp <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L142" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>A Provider that represents an MCP application.
Binds together entry-point tools (@app.ui), backend tools
(@app.tool), and the Prefab renderer resource. Backend tools
are tagged with meta["fastmcp"]["app"] so Provider.get_tool
can find them by original name even when transforms have been applied.
Methods:
tool <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L164" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>tool(self, name_or_fn: F) -> F
tool <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L176" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>tool(self, name_or_fn: str | None = None) -> Callable[[F], F]
tool <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L187" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>tool(self, name_or_fn: str | AnyFunction | None = None) -> Any
Register a backend tool that the UI calls via CallTool.
Backend tools default to visibility=["app"]. Pass model=True
to also expose the tool to the model (visibility=["app", "model"]).
Supports multiple calling patterns::
@app.tool
def save(name: str): ...
@app.tool()
def save(name: str): ...
@app.tool("custom_name")
def save(name: str): ...
ui <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L252" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>ui(self, name_or_fn: F) -> F
ui <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L267" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>ui(self, name_or_fn: str | None = None) -> Callable[[F], F]
ui <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L281" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>ui(self, name_or_fn: str | AnyFunction | None = None) -> Any
Register a UI entry-point tool that the model calls.
Entry-point tools default to visibility=["model"] and auto-wire
the Prefab renderer resource and CSP. They are tagged with the app
name so structured content includes _meta.fastmcp.app.
Supports multiple calling patterns::
@app.ui
def dashboard() -> Component: ...
@app.ui()
def dashboard() -> Component: ...
@app.ui("my_dashboard")
def dashboard() -> Component: ...
add_tool <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L355" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>add_tool(self, tool: Tool | Callable[..., Any]) -> Tool
Add a tool to this app programmatically.
The tool is tagged with this app's name for routing.
lifespan <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L409" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>lifespan(self) -> AsyncIterator[None]
run <sup><a href="https://github.com/PrefectHQ/fastmcp/blob/main/src/fastmcp/apps/app.py#L417" target="_blank"><Icon icon="github" style="width: 14px; height: 14px;" /></a></sup>run(self, transport: Literal['stdio', 'http', 'sse', 'streamable-http'] | None = None, **kwargs: Any) -> None
Create a temporary FastMCP server and run this app standalone.