@@ -1143,6 +1143,11 @@ app = Starlette(
11431143 ],
11441144 lifespan = lifespan,
11451145)
1146+
1147+ # Note: Clients connect to http://localhost:8000/echo/mcp and http://localhost:8000/math/mcp
1148+ # To mount at the root of each path (e.g., /echo instead of /echo/mcp):
1149+ # echo_mcp.settings.streamable_http_path = "/"
1150+ # math_mcp.settings.streamable_http_path = "/"
11461151```
11471152
11481153_ Full example: [ examples/snippets/servers/streamable_starlette_mount.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/streamable_starlette_mount.py ) _
@@ -1166,6 +1171,172 @@ By default, SSE servers are mounted at `/sse` and Streamable HTTP servers are mo
11661171
11671172For more information on mounting applications in Starlette, see the [ Starlette documentation] ( https://www.starlette.io/routing/#submounting-routes ) .
11681173
1174+ #### StreamableHTTP servers
1175+
1176+ You can mount the StreamableHTTP server to an existing ASGI server using the ` streamable_http_app ` method. This allows you to integrate the StreamableHTTP server with other ASGI applications.
1177+
1178+ ##### Basic mounting
1179+
1180+ <!-- snippet-source examples/snippets/servers/streamable_http_basic_mounting.py -->
1181+ ``` python
1182+ """
1183+ Basic example showing how to mount StreamableHTTP server in Starlette.
1184+
1185+ Run from the repository root:
1186+ uvicorn examples.snippets.servers.streamable_http_basic_mounting:app --reload
1187+ """
1188+
1189+ from starlette.applications import Starlette
1190+ from starlette.routing import Mount
1191+
1192+ from mcp.server.fastmcp import FastMCP
1193+
1194+ # Create MCP server
1195+ mcp = FastMCP(" My App" )
1196+
1197+
1198+ @mcp.tool ()
1199+ def hello () -> str :
1200+ """ A simple hello tool"""
1201+ return " Hello from MCP!"
1202+
1203+
1204+ # Mount the StreamableHTTP server to the existing ASGI server
1205+ app = Starlette(
1206+ routes = [
1207+ Mount(" /" , app = mcp.streamable_http_app()),
1208+ ]
1209+ )
1210+ ```
1211+
1212+ _ Full example: [ examples/snippets/servers/streamable_http_basic_mounting.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/streamable_http_basic_mounting.py ) _
1213+ <!-- /snippet-source -->
1214+
1215+ ##### Host-based routing
1216+
1217+ <!-- snippet-source examples/snippets/servers/streamable_http_host_mounting.py -->
1218+ ``` python
1219+ """
1220+ Example showing how to mount StreamableHTTP server using Host-based routing.
1221+
1222+ Run from the repository root:
1223+ uvicorn examples.snippets.servers.streamable_http_host_mounting:app --reload
1224+ """
1225+
1226+ from starlette.applications import Starlette
1227+ from starlette.routing import Host
1228+
1229+ from mcp.server.fastmcp import FastMCP
1230+
1231+ # Create MCP server
1232+ mcp = FastMCP(" MCP Host App" )
1233+
1234+
1235+ @mcp.tool ()
1236+ def domain_info () -> str :
1237+ """ Get domain-specific information"""
1238+ return " This is served from mcp.acme.corp"
1239+
1240+
1241+ # Mount using Host-based routing
1242+ app = Starlette(
1243+ routes = [
1244+ Host(" mcp.acme.corp" , app = mcp.streamable_http_app()),
1245+ ]
1246+ )
1247+ ```
1248+
1249+ _ Full example: [ examples/snippets/servers/streamable_http_host_mounting.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/streamable_http_host_mounting.py ) _
1250+ <!-- /snippet-source -->
1251+
1252+ ##### Multiple servers with path configuration
1253+
1254+ <!-- snippet-source examples/snippets/servers/streamable_http_multiple_servers.py -->
1255+ ``` python
1256+ """
1257+ Example showing how to mount multiple StreamableHTTP servers with path configuration.
1258+
1259+ Run from the repository root:
1260+ uvicorn examples.snippets.servers.streamable_http_multiple_servers:app --reload
1261+ """
1262+
1263+ from starlette.applications import Starlette
1264+ from starlette.routing import Mount
1265+
1266+ from mcp.server.fastmcp import FastMCP
1267+
1268+ # Create multiple MCP servers
1269+ api_mcp = FastMCP(" API Server" )
1270+ chat_mcp = FastMCP(" Chat Server" )
1271+
1272+
1273+ @api_mcp.tool ()
1274+ def api_status () -> str :
1275+ """ Get API status"""
1276+ return " API is running"
1277+
1278+
1279+ @chat_mcp.tool ()
1280+ def send_message (message : str ) -> str :
1281+ """ Send a chat message"""
1282+ return f " Message sent: { message} "
1283+
1284+
1285+ # Configure servers to mount at the root of each path
1286+ # This means endpoints will be at /api and /chat instead of /api/mcp and /chat/mcp
1287+ api_mcp.settings.streamable_http_path = " /"
1288+ chat_mcp.settings.streamable_http_path = " /"
1289+
1290+ # Mount the servers
1291+ app = Starlette(
1292+ routes = [
1293+ Mount(" /api" , app = api_mcp.streamable_http_app()),
1294+ Mount(" /chat" , app = chat_mcp.streamable_http_app()),
1295+ ]
1296+ )
1297+ ```
1298+
1299+ _ Full example: [ examples/snippets/servers/streamable_http_multiple_servers.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/streamable_http_multiple_servers.py ) _
1300+ <!-- /snippet-source -->
1301+
1302+ ##### Path configuration at initialization
1303+
1304+ <!-- snippet-source examples/snippets/servers/streamable_http_path_config.py -->
1305+ ``` python
1306+ """
1307+ Example showing path configuration during FastMCP initialization.
1308+
1309+ Run from the repository root:
1310+ uvicorn examples.snippets.servers.streamable_http_path_config:app --reload
1311+ """
1312+
1313+ from starlette.applications import Starlette
1314+ from starlette.routing import Mount
1315+
1316+ from mcp.server.fastmcp import FastMCP
1317+
1318+ # Configure streamable_http_path during initialization
1319+ # This server will mount at the root of wherever it's mounted
1320+ mcp_at_root = FastMCP(" My Server" , streamable_http_path = " /" )
1321+
1322+
1323+ @mcp_at_root.tool ()
1324+ def process_data (data : str ) -> str :
1325+ """ Process some data"""
1326+ return f " Processed: { data} "
1327+
1328+
1329+ # Mount at /process - endpoints will be at /process instead of /process/mcp
1330+ app = Starlette(
1331+ routes = [
1332+ Mount(" /process" , app = mcp_at_root.streamable_http_app()),
1333+ ]
1334+ )
1335+ ```
1336+
1337+ _ Full example: [ examples/snippets/servers/streamable_http_path_config.py] ( https://github.com/modelcontextprotocol/python-sdk/blob/main/examples/snippets/servers/streamable_http_path_config.py ) _
1338+ <!-- /snippet-source -->
1339+
11691340#### SSE servers
11701341
11711342> ** Note** : SSE transport is being superseded by [ Streamable HTTP transport] ( https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http ) .
0 commit comments