Skip to main content
A tai server is a first-class MCP citizen. The MCP-native features — output schemas and structured content, elicitation, progress, sampling, completions, and native tags — are all reachable, and anything the platform’s facets do not wrap is reachable through one escape hatch to the raw underlying FastMCP server.

Built on FastMCP

The skeleton’s server is a FastMCP server underneath. The platform layers its own governance over it — manifest gating, the extension registry’s validation, and the access-control gate — and exposes its features through typed facets. The MCP-native capabilities ride the FastMCP foundation, so an MCP client gets structured content, progress, elicitation, and the rest as it would from any MCP server. An elicitation a tool raises in process, with no MCP client to answer it, is answered through ask instead, in the inbox; its accepted result carries the _meta key tai42/reply_to, which is null because the answer did not come over a channel (see an elicitation answered through ask). The server’s management tools are not hand-registered on this surface: they project from the operations layer, curated by api_tools. An AuthzMiddleware installed on this FastMCP instance and on every sub-MCP mount authorizes each projected-operation dispatch before the tool runs. The advertised-tools read (list_mcp_advertised_tools) and the tool-selection write (set_mcp_tool_filter) are operations too, so they project as api_tools decides; the selection write is destructive-flagged, so it projects only with expose_destructive on.

The app.fastmcp escape hatch

For anything the facets do not wrap, the app exposes the raw FastMCP instance directly:
Reach here for what the facets deliberately leave to FastMCP — prompts, resources, add_middleware, sampling, elicit-handlers, completions, server metadata such as name/version/auth, and the process-global fastmcp.settings.
Anything registered through app.fastmcp skips the platform’s governance: manifest gating, the extension registry’s validation, and the access-control gate. Prefer the facets; use the escape hatch only for what they do not cover. It is named fastmcp (not mcp) so it does not read as the sub-MCP namespace, app.sub_app.
The accessor is intentionally not on the TaiApp contract protocol — the contract stays FastMCP-free so an alternative implementation of the platform remains possible, which makes this accessor skeleton-specific.

FastMCP’s own capabilities

The platform documents the escape hatch — what the app.fastmcp field is and what it grants — not FastMCP’s own API. For a deep dive into FastMCP’s prompts, resources, middleware, and the rest, see FastMCP’s documentation at gofastmcp.com. See the Python SDK reference for the app.fastmcp field and the platform’s facets.