mount() does.
When you mount a server, all its tools, resources, and prompts become available through the parent. The connection is live: add a tool to the child after mounting, and it’s immediately visible through the parent.
Mounting External Servers
Mount remote HTTP servers or subprocess-based MCP servers usingcreate_proxy():
Mounting npm/uvx Packages
For npm packages or Python tools, use the config dict format:Namespacing
When mounting multiple servers, use namespaces to avoid naming conflicts:How Namespacing Works
Namespacing uses transforms under the hood.
Dynamic Composition
Becausemount() creates a live link, you can add components to a child server after mounting and they’ll be immediately available through the parent:
Protocol Extensions
When you mount a local FastMCP server, its provider-bundled extensions follow the components to the parent. Extensions that opt into automatic registration give the parent the capabilities and request methods its clients need. Configure an extension explicitly on the parent to choose its settings for all mounted providers. Compose providers that need new extensions before the parent starts. Once extension lifespans have begun, additional providers can use extensions already registered on the root. The startup rules also apply through nested mounts and aggregates.Tag Filtering
Parent server tag filters apply recursively to mounted servers:Performance Considerations
Operations likelist_tools() on the parent are affected by the performance of all mounted servers. This is particularly noticeable with:
- HTTP-based mounted servers (300-400ms vs 1-2ms for local tools)
- Mounted servers with slow initialization
- Deep mounting hierarchies
Custom Routes
Custom HTTP routes defined with@server.custom_route() are also forwarded when mounting:

