--- title: app sidebarTitle: app --- # `fastmcp.apps.app` FastMCPApp — 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) ## Classes ### `FastMCPApp` 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` ```python tool(self, name_or_fn: F) -> F ``` #### `tool` ```python tool(self, name_or_fn: str | None = None) -> Callable[[F], F] ``` #### `tool` ```python 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` ```python ui(self, name_or_fn: F) -> F ``` #### `ui` ```python ui(self, name_or_fn: str | None = None) -> Callable[[F], F] ``` #### `ui` ```python 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` ```python 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` ```python lifespan(self) -> AsyncIterator[None] ``` #### `run` ```python run(self, transport: Literal['stdio', 'http', 'sse', 'streamable-http'] | None = None, **kwargs: Any) -> None ``` Create a temporary FastMCP server and run this app standalone.