From d2c6b7c9b18a46874fd3d934d725d4de60190102 Mon Sep 17 00:00:00 2001 From: brian Date: Fri, 29 May 2026 14:59:19 -0700 Subject: [PATCH] fix: ThreadingHTTPServer + unbuffered stdout + correct endpoint URL --- Dockerfile | 3 ++- server.py | 15 ++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 63e7619..c2648e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,9 @@ FROM python:3.12-slim WORKDIR /app +ENV PYTHONPATH=/app COPY lib/ lib/ COPY scripts/ scripts/ COPY server.py . RUN python3 scripts/init_db.py EXPOSE 3101 -CMD ["python3", "server.py"] +CMD ["python3", "-u", "server.py"] diff --git a/server.py b/server.py index 7b359a1..fa142fd 100644 --- a/server.py +++ b/server.py @@ -6,6 +6,7 @@ import queue import threading import uuid from http.server import HTTPServer, BaseHTTPRequestHandler +from socketserver import ThreadingMixIn from urllib.parse import urlparse, parse_qs 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("Access-Control-Allow-Origin", "*") self.end_headers() - # Send endpoint info - endpoint_msg = {"jsonrpc": "2.0", "method": "endpoint", - "params": {"uri": f"http://0.0.0.0:{PORT}/messages?client_id={client.id}"}} - self.wfile.write(f"event: endpoint\ndata: {json.dumps(endpoint_msg)}\n\n".encode()) + self.wfile.flush() + # Send endpoint event immediately per MCP SSE spec + msg_url = f"http://192.168.86.11:{PORT}/messages?client_id={client.id}" + self.wfile.write(f"event: endpoint\ndata: {msg_url}\n\n".encode()) self.wfile.flush() try: while True: @@ -331,12 +332,16 @@ class MCPHandler(BaseHTTPRequestHandler): self.end_headers() self.wfile.write(body) +class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): + daemon_threads = True + def main(): 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"SSE endpoint: http://0.0.0.0:{PORT}/sse") print(f"Tools registered: {len(TOOLS)}") + sys.stdout.flush() server.serve_forever() if __name__ == "__main__":