fix: ThreadingHTTPServer + unbuffered stdout + correct endpoint URL

This commit is contained in:
brian
2026-05-29 14:59:19 -07:00
parent 3a62428751
commit d2c6b7c9b1
2 changed files with 12 additions and 6 deletions

View File

@@ -1,8 +1,9 @@
FROM python:3.12-slim FROM python:3.12-slim
WORKDIR /app WORKDIR /app
ENV PYTHONPATH=/app
COPY lib/ lib/ COPY lib/ lib/
COPY scripts/ scripts/ COPY scripts/ scripts/
COPY server.py . COPY server.py .
RUN python3 scripts/init_db.py RUN python3 scripts/init_db.py
EXPOSE 3101 EXPOSE 3101
CMD ["python3", "server.py"] CMD ["python3", "-u", "server.py"]

View File

@@ -6,6 +6,7 @@ import queue
import threading import threading
import uuid import uuid
from http.server import HTTPServer, BaseHTTPRequestHandler from http.server import HTTPServer, BaseHTTPRequestHandler
from socketserver import ThreadingMixIn
from urllib.parse import urlparse, parse_qs from urllib.parse import urlparse, parse_qs
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
@@ -259,10 +260,10 @@ class MCPHandler(BaseHTTPRequestHandler):
self.send_header("Connection", "keep-alive") self.send_header("Connection", "keep-alive")
self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Access-Control-Allow-Origin", "*")
self.end_headers() self.end_headers()
# Send endpoint info self.wfile.flush()
endpoint_msg = {"jsonrpc": "2.0", "method": "endpoint", # Send endpoint event immediately per MCP SSE spec
"params": {"uri": f"http://0.0.0.0:{PORT}/messages?client_id={client.id}"}} msg_url = f"http://192.168.86.11:{PORT}/messages?client_id={client.id}"
self.wfile.write(f"event: endpoint\ndata: {json.dumps(endpoint_msg)}\n\n".encode()) self.wfile.write(f"event: endpoint\ndata: {msg_url}\n\n".encode())
self.wfile.flush() self.wfile.flush()
try: try:
while True: while True:
@@ -331,12 +332,16 @@ class MCPHandler(BaseHTTPRequestHandler):
self.end_headers() self.end_headers()
self.wfile.write(body) self.wfile.write(body)
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
daemon_threads = True
def main(): def main():
db.init_db() db.init_db()
server = HTTPServer(("0.0.0.0", PORT), MCPHandler) server = ThreadingHTTPServer(("0.0.0.0", PORT), MCPHandler)
print(f"Handoff Pro MCP server running on port {PORT}") print(f"Handoff Pro MCP server running on port {PORT}")
print(f"SSE endpoint: http://0.0.0.0:{PORT}/sse") print(f"SSE endpoint: http://0.0.0.0:{PORT}/sse")
print(f"Tools registered: {len(TOOLS)}") print(f"Tools registered: {len(TOOLS)}")
sys.stdout.flush()
server.serve_forever() server.serve_forever()
if __name__ == "__main__": if __name__ == "__main__":