77logger = logging .getLogger (__name__ )
88
99
10- async def confugure_app ( name : str , remote_app : ClientSession ):
11- app = server . Server ( name )
10+ async def create_proxy_server ( remote_app : ClientSession ):
11+ """Create a server instance from a remote app."""
1212
13- async def _list_prompts (_ : t .Any ) -> types .ServerResult :
14- result = await remote_app .list_prompts ()
15- return types .ServerResult (result )
13+ response = await remote_app .initialize ()
14+ capabilities = response .capabilities
1615
17- app . request_handlers [ types . ListPromptsRequest ] = _list_prompts
16+ app = server . Server ( response . serverInfo . name )
1817
19- async def _get_prompt (req : types .GetPromptRequest ) -> types .ServerResult :
20- result = await remote_app .get_prompt (req .params .name , req .params .arguments )
21- return types .ServerResult (result )
18+ if capabilities .prompts :
19+ async def _list_prompts (_ : t .Any ) -> types .ServerResult :
20+ result = await remote_app .list_prompts ()
21+ return types .ServerResult (result )
2222
23- app .request_handlers [types .GetPromptRequest ] = _get_prompt
23+ app .request_handlers [types .ListPromptsRequest ] = _list_prompts
2424
25- async def _list_resources ( _ : t . Any ) -> types .ServerResult :
26- result = await remote_app .list_resources ( )
27- return types .ServerResult (result )
25+ async def _get_prompt ( req : types . GetPromptRequest ) -> types .ServerResult :
26+ result = await remote_app .get_prompt ( req . params . name , req . params . arguments )
27+ return types .ServerResult (result )
2828
29- app .request_handlers [types .ListResourcesRequest ] = _list_resources
29+ app .request_handlers [types .GetPromptRequest ] = _get_prompt
3030
31- # list_resource_templates() is not implemented in the client
32- # async def _list_resource_templates (_: t.Any) -> types.ServerResult:
33- # result = await remote_app.list_resource_templates ()
34- # return types.ServerResult(result)
31+ if capabilities . resources :
32+ async def _list_resources (_ : t .Any ) -> types .ServerResult :
33+ result = await remote_app .list_resources ()
34+ return types .ServerResult (result )
3535
36- # app.request_handlers[types.ListResourceTemplatesRequest ] = _list_resource_templates
36+ app .request_handlers [types .ListResourcesRequest ] = _list_resources
3737
38- async def _read_resource (req : types .ReadResourceRequest ):
39- result = await remote_app .read_resource (req .params .uri )
40- return types .ServerResult (result )
38+ # list_resource_templates() is not implemented in the client
39+ # async def _list_resource_templates(_: t.Any) -> types.ServerResult:
40+ # result = await remote_app.list_resource_templates()
41+ # return types.ServerResult(result)
4142
42- app .request_handlers [types .ReadResourceRequest ] = _read_resource
43+ # app.request_handlers[types.ListResourceTemplatesRequest ] = _list_resource_templates
4344
44- async def _set_logging_level (req : types .SetLevelRequest ):
45- await remote_app .set_logging_level (req .params .level )
46- return types .ServerResult (types . EmptyResult () )
45+ async def _read_resource (req : types .ReadResourceRequest ):
46+ result = await remote_app .read_resource (req .params .uri )
47+ return types .ServerResult (result )
4748
48- app .request_handlers [types .SetLevelRequest ] = _set_logging_level
49+ app .request_handlers [types .ReadResourceRequest ] = _read_resource
4950
50- async def _subscribe_resource (req : types .SubscribeRequest ):
51- await remote_app .subscribe_resource (req .params .uri )
52- return types .ServerResult (types .EmptyResult ())
51+ if capabilities .logging :
52+ async def _set_logging_level (req : types .SetLevelRequest ):
53+ await remote_app .set_logging_level (req .params .level )
54+ return types .ServerResult (types .EmptyResult ())
5355
54- app .request_handlers [types .SubscribeRequest ] = _subscribe_resource
56+ app .request_handlers [types .SetLevelRequest ] = _set_logging_level
5557
56- async def _unsubscribe_resource (req : types .UnsubscribeRequest ):
57- await remote_app .unsubscribe_resource (req .params .uri )
58- return types .ServerResult (types .EmptyResult ())
58+ if capabilities .resources :
59+ async def _subscribe_resource (req : types .SubscribeRequest ):
60+ await remote_app .subscribe_resource (req .params .uri )
61+ return types .ServerResult (types .EmptyResult ())
5962
60- app .request_handlers [types .UnsubscribeRequest ] = _unsubscribe_resource
63+ app .request_handlers [types .SubscribeRequest ] = _subscribe_resource
6164
62- async def _list_tools ( _ : t . Any ):
63- tools = await remote_app .list_tools ( )
64- return types .ServerResult (tools )
65+ async def _unsubscribe_resource ( req : types . UnsubscribeRequest ):
66+ await remote_app .unsubscribe_resource ( req . params . uri )
67+ return types .ServerResult (types . EmptyResult () )
6568
66- app .request_handlers [types .ListToolsRequest ] = _list_tools
69+ app .request_handlers [types .UnsubscribeRequest ] = _unsubscribe_resource
6770
68- async def _call_tool (req : types .CallToolRequest ) -> types .ServerResult :
69- try :
70- result = await remote_app .call_tool (
71- req .params .name , (req .params .arguments or {})
72- )
73- return types .ServerResult (result )
74- except Exception as e :
75- return types .ServerResult (
76- types .CallToolResult (
77- content = [types .TextContent (type = "text" , text = str (e ))],
78- isError = True ,
71+ if capabilities .tools :
72+ async def _list_tools (_ : t .Any ):
73+ tools = await remote_app .list_tools ()
74+ return types .ServerResult (tools )
75+
76+ app .request_handlers [types .ListToolsRequest ] = _list_tools
77+
78+ async def _call_tool (req : types .CallToolRequest ) -> types .ServerResult :
79+ try :
80+ result = await remote_app .call_tool (
81+ req .params .name , (req .params .arguments or {})
82+ )
83+ return types .ServerResult (result )
84+ except Exception as e :
85+ return types .ServerResult (
86+ types .CallToolResult (
87+ content = [types .TextContent (type = "text" , text = str (e ))],
88+ isError = True ,
89+ )
7990 )
80- )
8191
82- app .request_handlers [types .CallToolRequest ] = _call_tool
92+ app .request_handlers [types .CallToolRequest ] = _call_tool
8393
8494 async def _send_progress_notification (req : types .ProgressNotification ):
8595 await remote_app .send_progress_notification (
@@ -96,19 +106,18 @@ async def _complete(req: types.CompleteRequest):
96106
97107 app .request_handlers [types .CompleteRequest ] = _complete
98108
99- async with server .stdio_server () as (read_stream , write_stream ):
100- await app .run (
101- read_stream ,
102- write_stream ,
103- app .create_initialization_options (),
104- )
109+ return app
105110
106111
107112async def run_sse_client (url : str ):
108113 from mcp .client .sse import sse_client
109114
110115 async with sse_client (url = url ) as (read_stream , write_stream ):
111116 async with ClientSession (read_stream , write_stream ) as session :
112- response = await session .initialize ()
113-
114- await confugure_app (response .serverInfo .name , session )
117+ app = await create_proxy_server (session )
118+ async with server .stdio_server () as (read_stream , write_stream ):
119+ await app .run (
120+ read_stream ,
121+ write_stream ,
122+ app .create_initialization_options (),
123+ )
0 commit comments