Skip to content

Commit 2cbd155

Browse files
Add SSE demo notebook to PR
1 parent 697b6e8 commit 2cbd155

File tree

1 file changed

+184
-0
lines changed

1 file changed

+184
-0
lines changed
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 2,
6+
"id": "8f0351de-69f9-40c3-9298-5d6321f33a1d",
7+
"metadata": {},
8+
"outputs": [
9+
{
10+
"name": "stdout",
11+
"output_type": "stream",
12+
"text": [
13+
"Requirement already satisfied: flask in c:\\users\\vinis\\anaconda3\\lib\\site-packages (2.2.5)\n",
14+
"Requirement already satisfied: requests in c:\\users\\vinis\\anaconda3\\lib\\site-packages (2.31.0)\n",
15+
"Requirement already satisfied: Werkzeug>=2.2.2 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from flask) (2.2.3)\n",
16+
"Requirement already satisfied: Jinja2>=3.0 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from flask) (3.1.3)\n",
17+
"Requirement already satisfied: itsdangerous>=2.0 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from flask) (2.0.1)\n",
18+
"Requirement already satisfied: click>=8.0 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from flask) (8.1.7)\n",
19+
"Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from requests) (2.0.4)\n",
20+
"Requirement already satisfied: idna<4,>=2.5 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from requests) (3.4)\n",
21+
"Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from requests) (2.0.7)\n",
22+
"Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from requests) (2024.8.30)\n",
23+
"Requirement already satisfied: colorama in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from click>=8.0->flask) (0.4.6)\n",
24+
"Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\vinis\\anaconda3\\lib\\site-packages (from Jinja2>=3.0->flask) (2.1.3)\n",
25+
"Note: you may need to restart the kernel to use updated packages.\n"
26+
]
27+
}
28+
],
29+
"source": [
30+
"pip install flask requests\n"
31+
]
32+
},
33+
{
34+
"cell_type": "code",
35+
"execution_count": 5,
36+
"id": "564f36a1-de43-4eb8-b0f4-b3e259f980c2",
37+
"metadata": {},
38+
"outputs": [
39+
{
40+
"name": "stdout",
41+
"output_type": "stream",
42+
"text": [
43+
" * Serving Flask app '__main__'\n",
44+
" * Debug mode: off\n"
45+
]
46+
},
47+
{
48+
"name": "stderr",
49+
"output_type": "stream",
50+
"text": [
51+
"WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.\n",
52+
" * Running on http://127.0.0.1:5000\n",
53+
"Press CTRL+C to quit\n"
54+
]
55+
},
56+
{
57+
"name": "stdout",
58+
"output_type": "stream",
59+
"text": [
60+
"\n",
61+
"✅ Server started at http://127.0.0.1:5000\n",
62+
"\n",
63+
"📥 Received request: {'tool': 'example_tool', 'input': {'message': 'Hello via SSE!'}}\n"
64+
]
65+
},
66+
{
67+
"name": "stderr",
68+
"output_type": "stream",
69+
"text": [
70+
"127.0.0.1 - - [28/Apr/2025 17:31:39] \"POST /mcp HTTP/1.1\" 200 -\n"
71+
]
72+
},
73+
{
74+
"name": "stdout",
75+
"output_type": "stream",
76+
"text": [
77+
"\n",
78+
"🚀 Connecting to SSE Server...\n",
79+
"\n",
80+
"data: {\"message\": \"Update 1\"}\n",
81+
": keep-alive\n",
82+
"data: {\"message\": \"Update 2\"}\n",
83+
"\n",
84+
"🎯 Successfully received all SSE events!\n"
85+
]
86+
}
87+
],
88+
"source": [
89+
"import threading\n",
90+
"import time\n",
91+
"from flask import Flask, Response, request\n",
92+
"import requests\n",
93+
"\n",
94+
"# --- 1. SETUP FLASK MOCK SERVER ---\n",
95+
"\n",
96+
"app = Flask(__name__)\n",
97+
"\n",
98+
"@app.route('/mcp', methods=['POST'])\n",
99+
"def mcp_handler():\n",
100+
" data = request.json\n",
101+
" print(\"\\n📥 Received request:\", data)\n",
102+
"\n",
103+
" def stream():\n",
104+
" for i in range(3):\n",
105+
" time.sleep(1)\n",
106+
" yield f\"data: {{\\\"message\\\": \\\"Update {i+1}\\\"}}\\n\\n\"\n",
107+
" yield \": keep-alive\\n\\n\" # Force immediate flush\n",
108+
"\n",
109+
" return Response(stream(), mimetype='text/event-stream')\n",
110+
"\n",
111+
"@app.route('/')\n",
112+
"def home():\n",
113+
" return \"🏠 MCP Mock Server Running!\"\n",
114+
"\n",
115+
"def start_server():\n",
116+
" app.run(port=5000)\n",
117+
"\n",
118+
"# --- 2. START SERVER IN BACKGROUND THREAD ---\n",
119+
"server_thread = threading.Thread(target=start_server)\n",
120+
"server_thread.daemon = True\n",
121+
"server_thread.start()\n",
122+
"\n",
123+
"# --- 3. WAIT FOR SERVER TO BE READY ---\n",
124+
"time.sleep(3) # Give Flask server a few seconds to boot\n",
125+
"\n",
126+
"print(\"\\n✅ Server started at http://127.0.0.1:5000\")\n",
127+
"\n",
128+
"# --- 4. CLIENT CODE: CONNECT TO SERVER ---\n",
129+
"\n",
130+
"try:\n",
131+
" SERVER_URL = \"http://127.0.0.1:5000\"\n",
132+
"\n",
133+
" response = requests.post(f\"{SERVER_URL}/mcp\", stream=True, json={\n",
134+
" \"tool\": \"example_tool\",\n",
135+
" \"input\": {\"message\": \"Hello via SSE!\"}\n",
136+
" })\n",
137+
"\n",
138+
" print(\"\\n🚀 Connecting to SSE Server...\\n\")\n",
139+
" event_count = 0\n",
140+
" for line in response.iter_lines():\n",
141+
" if line:\n",
142+
" decoded_line = line.decode('utf-8')\n",
143+
" print(decoded_line)\n",
144+
" event_count += 1\n",
145+
" if event_count >= 3:\n",
146+
" break # Stop after 3 messages\n",
147+
"\n",
148+
" print(\"\\n🎯 Successfully received all SSE events!\")\n",
149+
"\n",
150+
"except Exception as e:\n",
151+
" print(\"❌ Connection failed:\", e)\n"
152+
]
153+
},
154+
{
155+
"cell_type": "code",
156+
"execution_count": null,
157+
"id": "9f9497e8-4354-44e7-b79a-105091ee479b",
158+
"metadata": {},
159+
"outputs": [],
160+
"source": []
161+
}
162+
],
163+
"metadata": {
164+
"kernelspec": {
165+
"display_name": "Python 3 (ipykernel)",
166+
"language": "python",
167+
"name": "python3"
168+
},
169+
"language_info": {
170+
"codemirror_mode": {
171+
"name": "ipython",
172+
"version": 3
173+
},
174+
"file_extension": ".py",
175+
"mimetype": "text/x-python",
176+
"name": "python",
177+
"nbconvert_exporter": "python",
178+
"pygments_lexer": "ipython3",
179+
"version": "3.11.10"
180+
}
181+
},
182+
"nbformat": 4,
183+
"nbformat_minor": 5
184+
}

0 commit comments

Comments
 (0)