GamerC0der commited on
Commit
68c317d
·
verified ·
1 Parent(s): 6fc0401

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +22 -12
app.py CHANGED
@@ -5,6 +5,7 @@ import urllib.request
5
  import re
6
  from http.server import BaseHTTPRequestHandler, HTTPServer
7
  import threading
 
8
 
9
  async def scrape_site(url: str) -> str:
10
  req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
@@ -29,7 +30,6 @@ class SimpleMCPServer:
29
  try:
30
  req = json.loads(request)
31
  method = req.get("method")
32
-
33
  if method == "initialize":
34
  return json.dumps({
35
  "jsonrpc": "2.0",
@@ -40,11 +40,9 @@ class SimpleMCPServer:
40
  "serverInfo": {"name": "simple-mcp", "version": "1.0.0"}
41
  }
42
  })
43
-
44
  if method == "tools/list":
45
  tools = [{"name": name, "description": info["description"]} for name, info in self.tools.items()]
46
  return json.dumps({"jsonrpc": "2.0", "id": req.get("id"), "result": {"tools": tools}})
47
-
48
  if method == "tools/call":
49
  tool_name = req["params"]["name"]
50
  args = req["params"].get("arguments", {})
@@ -55,11 +53,9 @@ class SimpleMCPServer:
55
  "id": req.get("id"),
56
  "result": {"content": [{"type": "text", "text": result}]}
57
  })
58
-
59
  except Exception as e:
60
  return json.dumps({"jsonrpc": "2.0", "error": {"code": -32000, "message": str(e)}})
61
 
62
-
63
  class MCPRequestHandler(BaseHTTPRequestHandler):
64
  def __init__(self, server_instance, *args, **kwargs):
65
  self.server_instance = server_instance
@@ -69,14 +65,12 @@ class MCPRequestHandler(BaseHTTPRequestHandler):
69
  try:
70
  content_length = int(self.headers['Content-Length'])
71
  post_data = self.rfile.read(content_length).decode('utf-8')
72
-
73
  loop = asyncio.new_event_loop()
74
  asyncio.set_event_loop(loop)
75
  try:
76
  response = loop.run_until_complete(self.server_instance.handle_request(post_data))
77
  finally:
78
  loop.close()
79
-
80
  self.send_response(200)
81
  self.send_header('Content-Type', 'application/json')
82
  self.send_header('Access-Control-Allow-Origin', '*')
@@ -98,31 +92,47 @@ class MCPRequestHandler(BaseHTTPRequestHandler):
98
  self.send_header('Access-Control-Allow-Headers', 'Content-Type')
99
  self.end_headers()
100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  def run_http_server(server_instance):
102
  def handler_factory(server_instance):
103
  def create_handler(*args, **kwargs):
104
  return MCPRequestHandler(server_instance, *args, **kwargs)
105
  return create_handler
106
-
107
  httpd = HTTPServer(('0.0.0.0', 7860), handler_factory(server_instance))
108
  print("Simple MCP HTTP Server started on port 7860")
109
- print("Available tools: scrape_site, plaintext")
110
  httpd.serve_forever()
111
 
112
  async def main():
113
  server = SimpleMCPServer()
114
  server.register_tool("scrape_site", scrape_site, "Get HTML content from a website URL")
115
  server.register_tool("plaintext", plaintext, "Get plain text content from a website URL (removes HTML tags, scripts, and styles)")
116
-
117
  server_thread = threading.Thread(target=run_http_server, args=(server,))
118
  server_thread.daemon = True
119
  server_thread.start()
120
-
121
  try:
122
  while True:
123
  await asyncio.sleep(1)
124
  except KeyboardInterrupt:
125
- print("Server shutting down...")
126
 
127
  if __name__ == "__main__":
128
  asyncio.run(main())
 
5
  import re
6
  from http.server import BaseHTTPRequestHandler, HTTPServer
7
  import threading
8
+ import time
9
 
10
  async def scrape_site(url: str) -> str:
11
  req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
 
30
  try:
31
  req = json.loads(request)
32
  method = req.get("method")
 
33
  if method == "initialize":
34
  return json.dumps({
35
  "jsonrpc": "2.0",
 
40
  "serverInfo": {"name": "simple-mcp", "version": "1.0.0"}
41
  }
42
  })
 
43
  if method == "tools/list":
44
  tools = [{"name": name, "description": info["description"]} for name, info in self.tools.items()]
45
  return json.dumps({"jsonrpc": "2.0", "id": req.get("id"), "result": {"tools": tools}})
 
46
  if method == "tools/call":
47
  tool_name = req["params"]["name"]
48
  args = req["params"].get("arguments", {})
 
53
  "id": req.get("id"),
54
  "result": {"content": [{"type": "text", "text": result}]}
55
  })
 
56
  except Exception as e:
57
  return json.dumps({"jsonrpc": "2.0", "error": {"code": -32000, "message": str(e)}})
58
 
 
59
  class MCPRequestHandler(BaseHTTPRequestHandler):
60
  def __init__(self, server_instance, *args, **kwargs):
61
  self.server_instance = server_instance
 
65
  try:
66
  content_length = int(self.headers['Content-Length'])
67
  post_data = self.rfile.read(content_length).decode('utf-8')
 
68
  loop = asyncio.new_event_loop()
69
  asyncio.set_event_loop(loop)
70
  try:
71
  response = loop.run_until_complete(self.server_instance.handle_request(post_data))
72
  finally:
73
  loop.close()
 
74
  self.send_response(200)
75
  self.send_header('Content-Type', 'application/json')
76
  self.send_header('Access-Control-Allow-Origin', '*')
 
92
  self.send_header('Access-Control-Allow-Headers', 'Content-Type')
93
  self.end_headers()
94
 
95
+ def do_GET(self):
96
+ if self.path == "/sse":
97
+ self.send_response(200)
98
+ self.send_header('Content-Type', 'text/event-stream')
99
+ self.send_header('Cache-Control', 'no-cache')
100
+ self.send_header('Connection', 'keep-alive')
101
+ self.send_header('Access-Control-Allow-Origin', '*')
102
+ self.end_headers()
103
+ try:
104
+ for i in range(1000):
105
+ data = f"data: {{\"message\": \"ping {i}\"}}\n\n"
106
+ self.wfile.write(data.encode('utf-8'))
107
+ self.wfile.flush()
108
+ time.sleep(1)
109
+ except BrokenPipeError:
110
+ pass
111
+ else:
112
+ self.send_response(404)
113
+ self.end_headers()
114
+
115
  def run_http_server(server_instance):
116
  def handler_factory(server_instance):
117
  def create_handler(*args, **kwargs):
118
  return MCPRequestHandler(server_instance, *args, **kwargs)
119
  return create_handler
 
120
  httpd = HTTPServer(('0.0.0.0', 7860), handler_factory(server_instance))
121
  print("Simple MCP HTTP Server started on port 7860")
 
122
  httpd.serve_forever()
123
 
124
  async def main():
125
  server = SimpleMCPServer()
126
  server.register_tool("scrape_site", scrape_site, "Get HTML content from a website URL")
127
  server.register_tool("plaintext", plaintext, "Get plain text content from a website URL (removes HTML tags, scripts, and styles)")
 
128
  server_thread = threading.Thread(target=run_http_server, args=(server,))
129
  server_thread.daemon = True
130
  server_thread.start()
 
131
  try:
132
  while True:
133
  await asyncio.sleep(1)
134
  except KeyboardInterrupt:
135
+ pass
136
 
137
  if __name__ == "__main__":
138
  asyncio.run(main())