1
+ import asyncio
2
+ from typing import AsyncGenerator
3
+
4
+ from fastapi import FastAPI
5
+ from starlette .responses import StreamingResponse
6
+ import uvicorn
7
+ from threading import Thread
8
+ import httpx
9
+ from mcp .client .sse import aconnect_sse
10
+
11
+ # Mock SSE server using FastAPI
12
+ app = FastAPI ()
13
+
14
+ @app .get ("/sse" )
15
+ async def sse_endpoint () -> StreamingResponse :
16
+ async def event_stream () -> AsyncGenerator [str , None ]:
17
+ for i in range (3 ):
18
+ yield f"data: Hello { i + 1 } \n \n "
19
+ await asyncio .sleep (0.1 )
20
+ return StreamingResponse (event_stream (), media_type = "text/event-stream" )
21
+
22
+ def run_mock_server () -> None :
23
+ uvicorn .run (app , host = "127.0.0.1" , port = 8012 , log_level = "warning" )
24
+
25
+ # MCP client demo to connect to the mock SSE server
26
+ async def run_demo () -> None :
27
+ server_thread = Thread (target = run_mock_server , daemon = True )
28
+ server_thread .start ()
29
+ await asyncio .sleep (1 )
30
+
31
+ messages = []
32
+
33
+ async with httpx .AsyncClient () as client :
34
+ async with aconnect_sse (client , "GET" , "http://127.0.0.1:8012/sse" ) as event_source :
35
+ async for event in event_source .aiter_sse ():
36
+ if event .data :
37
+ print ("Event received:" , event .data )
38
+ messages .append (event .data )
39
+ if len (messages ) == 3 :
40
+ break
41
+
42
+ print ("\n Client demo finished. Messages received:" , messages )
43
+
44
+ if __name__ == "__main__" :
45
+ asyncio .run (run_demo ())
0 commit comments