2020from contextlib import asynccontextmanager
2121from typing import TYPE_CHECKING , Any , Dict , List , Optional , Union , get_args , get_origin
2222
23- import mcp .types as types
2423from fastapi import FastAPI
25- from mcp .server .fastmcp .server import _convert_to_content
26- from mcp .server .lowlevel import Server as MCPServer
27- from mcp .server .streamable_http_manager import StreamableHTTPSessionManager
2824from pydantic import BaseModel
2925from starlette .applications import Starlette
3026from starlette .routing import Mount
3127from starlette .types import Receive , Scope , Send
3228
3329from litserve .utils import is_package_installed
3430
31+ _is_mcp_installed = is_package_installed ("fastmcp" )
32+
33+
34+ if _is_mcp_installed :
35+ from fastapi import FastAPI
36+ from mcp .server .fastmcp .server import _convert_to_content
37+ from mcp .server .lowlevel import Server as MCPServer
38+ from mcp .server .streamable_http_manager import StreamableHTTPSessionManager
39+ from mcp .types import Tool as ToolType
40+
41+ else :
42+ ToolType = object
43+
3544if TYPE_CHECKING :
3645 from litserve .api import LitAPI
3746
@@ -243,7 +252,7 @@ async def _call_handler(handler, **kwargs):
243252 return _convert_to_content (await handler (* bound .args , ** bound .kwargs ))
244253
245254
246- class ToolEndpointType (types . Tool ):
255+ class ToolEndpointType (ToolType ):
247256 endpoint : str
248257
249258
@@ -348,6 +357,11 @@ def __init__(
348357 self .input_schema = input_schema
349358 self ._connected = False
350359
360+ if not is_package_installed ("fastmcp" ):
361+ raise RuntimeError (
362+ "mcp package is required for MCP support. To install, run `pip install fastmcp` in the terminal."
363+ )
364+
351365 @property
352366 def name (self ) -> str :
353367 return self ._name
@@ -364,11 +378,6 @@ def _connect(self, lit_api: "LitAPI"):
364378 self ._connected = True
365379
366380 def as_tool (self ) -> ToolEndpointType :
367- if not is_package_installed ("mcp" ):
368- raise RuntimeError (
369- "MCP is not installed. Please install it with `pip install mcp[cli]` or `uv pip install mcp[cli]`"
370- )
371-
372381 if not self ._connected :
373382 raise RuntimeError ("MCP is not connected to a LitAPI." )
374383
@@ -400,7 +409,7 @@ def as_tool(self) -> ToolEndpointType:
400409
401410
402411class _MCPRequestHandler :
403- def __init__ (self , mcp_server : MCPServer ):
412+ def __init__ (self , mcp_server : " MCPServer" ):
404413 self .mcp_server = mcp_server
405414 self ._session_manager = None
406415
@@ -536,7 +545,7 @@ async def _call_tool(name: str, arguments: dict):
536545 starlette_app = self .request_handler .streamable_http_app ()
537546 app .mount ("/" , starlette_app , name = "mcp" )
538547
539- def connect_mcp_server (self , mcp_tools : List [types . Tool ], app : FastAPI ):
548+ def connect_mcp_server (self , mcp_tools : List [ToolType ], app : FastAPI ):
540549 """LitServer calls this method to connect MCP server to the FastAPI app.
541550
542551 Args:
0 commit comments