2727 ListResourcesResult ,
2828 ListToolsRequest ,
2929 ListToolsResult ,
30+ LoggingCapability ,
3031 LoggingLevel ,
3132 PingRequest ,
3233 ProgressNotification ,
3334 Prompt ,
3435 PromptReference ,
36+ PromptsCapability ,
3537 ReadResourceRequest ,
3638 ReadResourceResult ,
3739 Resource ,
3840 ResourceReference ,
41+ ResourcesCapability ,
3942 ServerCapabilities ,
4043 ServerResult ,
4144 SetLevelRequest ,
4245 SubscribeRequest ,
4346 Tool ,
47+ ToolsCapability ,
4448 UnsubscribeRequest ,
4549)
4650
5155)
5256
5357
58+ class NotificationOptions :
59+ def __init__ (
60+ self ,
61+ prompts_changed : bool = False ,
62+ resources_changed : bool = False ,
63+ tools_changed : bool = False ,
64+ ):
65+ self .prompts_changed = prompts_changed
66+ self .resources_changed = resources_changed
67+ self .tools_changed = tools_changed
68+
69+
5470class Server :
5571 def __init__ (self , name : str ):
5672 self .name = name
5773 self .request_handlers : dict [type , Callable [..., Awaitable [ServerResult ]]] = {
5874 PingRequest : _ping_handler ,
5975 }
6076 self .notification_handlers : dict [type , Callable [..., Awaitable [None ]]] = {}
77+ self .notification_options = NotificationOptions ()
6178 logger .debug (f"Initializing server '{ name } '" )
6279
63- def create_initialization_options (self ) -> types .InitializationOptions :
80+ def create_initialization_options (
81+ self , notification_options : NotificationOptions | None = None ,
82+ experimental_capabilities : dict [str , dict [str , Any ]] | None = None
83+ ) -> types .InitializationOptions :
6484 """Create initialization options from this server instance."""
6585
6686 def pkg_version (package : str ) -> str :
@@ -78,20 +98,51 @@ def pkg_version(package: str) -> str:
7898 return types .InitializationOptions (
7999 server_name = self .name ,
80100 server_version = pkg_version ("mcp_python" ),
81- capabilities = self .get_capabilities (),
101+ capabilities = self .get_capabilities (
102+ notification_options or NotificationOptions (),
103+ experimental_capabilities or {}
104+ ),
82105 )
83106
84- def get_capabilities (self ) -> ServerCapabilities :
107+ def get_capabilities (
108+ self , notification_options : NotificationOptions ,
109+ experimental_capabilities : dict [str , dict [str , Any ]]
110+ ) -> ServerCapabilities :
85111 """Convert existing handlers to a ServerCapabilities object."""
86-
87- def get_capability (req_type : type ) -> dict [str , Any ] | None :
88- return {} if req_type in self .request_handlers else None
112+ prompts_capability = None
113+ resources_capability = None
114+ tools_capability = None
115+ logging_capability = None
116+
117+ # Set prompt capabilities if handler exists
118+ if ListPromptsRequest in self .request_handlers :
119+ prompts_capability = PromptsCapability (
120+ listChanged = notification_options .prompts_changed
121+ )
122+
123+ # Set resource capabilities if handler exists
124+ if ListResourcesRequest in self .request_handlers :
125+ resources_capability = ResourcesCapability (
126+ subscribe = False ,
127+ listChanged = notification_options .resources_changed
128+ )
129+
130+ # Set tool capabilities if handler exists
131+ if ListToolsRequest in self .request_handlers :
132+ tools_capability = ToolsCapability (
133+ listChanged = notification_options .tools_changed
134+ )
135+
136+ # Set logging capabilities if handler exists
137+ if SetLevelRequest in self .request_handlers :
138+ logging_capability = LoggingCapability ()
89139
90140 return ServerCapabilities (
91- prompts = get_capability (ListPromptsRequest ),
92- resources = get_capability (ListResourcesRequest ),
93- tools = get_capability (ListToolsRequest ),
94- logging = get_capability (SetLevelRequest ),
141+ prompts = prompts_capability ,
142+ resources = resources_capability ,
143+ tools = tools_capability ,
144+ logging = logging_capability ,
145+ experimental = experimental_capabilities
95146 )
96147
97148 @property
@@ -169,9 +220,7 @@ def decorator(func: Callable[[], Awaitable[list[Resource]]]):
169220
170221 async def handler (_ : Any ):
171222 resources = await func ()
172- return ServerResult (
173- ListResourcesResult (resources = resources )
174- )
223+ return ServerResult (ListResourcesResult (resources = resources ))
175224
176225 self .request_handlers [ListResourcesRequest ] = handler
177226 return func
@@ -216,7 +265,6 @@ async def handler(req: ReadResourceRequest):
216265
217266 return decorator
218267
219-
220268 def set_logging_level (self ):
221269 from mcp_python .types import EmptyResult
222270
0 commit comments