Fix: Replace stdout with truly unbuffered wrapper to prevent response buffering

The previous sys.stdout.reconfigure(line_buffering=True) didn't work when
stderr is redirected. Now we create a new io.TextIOWrapper around
sys.stdout.buffer with line_buffering=False, ensuring immediate flush.

Also sets PYTHONUNBUFFERED=1 for extra safety.
pull/5310/head
Rene Cannao 4 months ago
parent edac8eb5e0
commit f5606986ff

@ -25,6 +25,7 @@ Or configure in Claude Code's MCP settings:
"""
import asyncio
import io
import json
import os
import sys
@ -33,15 +34,29 @@ from datetime import datetime
import httpx
# CRITICAL: Ensure unbuffered stdout for MCP stdio protocol
# Also set PYTHONUNBUFFERED=1 in environment for extra safety
os.environ['PYTHONUNBUFFERED'] = '1'
# Redirect stderr to a log file in /tmp
LOG_FILE = "/tmp/proxysql_mcp_bridge.log"
stderr_log_file = open(LOG_FILE, "a", buffering=1)
sys.stderr = stderr_log_file
sys.__stderr__ = stderr_log_file
# CRITICAL: Ensure stdout is line-buffered for stdio MCP protocol
# Without this, responses may be buffered and never sent to Claude Code
sys.stdout.reconfigure(line_buffering=True)
# CRITICAL: Force stdout to be unbuffered
# Reconfigure doesn't work reliably when stderr is redirected, so we
# need to replace stdout with an unbuffered wrapper
unbuffered_stdout = io.TextIOWrapper(
sys.stdout.buffer,
encoding='utf-8',
errors='strict',
newline='\n',
line_buffering=False # Explicitly disable line buffering too
)
sys.stdout = unbuffered_stdout
# Also update __stdout__ for completeness
sys.__stdout__ = unbuffered_stdout
# Debug logging - ALWAYS ON for extreme verbosity
VERBOSE = True # Always verbose logging

Loading…
Cancel
Save