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