Fix MCP server startup for Claude Code compatibility
- Suppress stderr output (Claude Code rejects servers with stderr) - Make SyncEngine.start() non-blocking (blocking sync caused 15s+ timeout) - Skip Content-Length header lines gracefully (NDJSON transport) - Silently ignore malformed JSON lines instead of sending error responses
This commit is contained in:
parent
be9e6352c3
commit
a52afe050d
2 changed files with 8 additions and 18 deletions
|
|
@ -600,19 +600,11 @@ class MemoryServer:
|
||||||
try:
|
try:
|
||||||
for line in sys.stdin:
|
for line in sys.stdin:
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if not line:
|
if not line or line.startswith("Content-Length:"):
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
message = json.loads(line)
|
message = json.loads(line)
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError:
|
||||||
print(
|
|
||||||
json.dumps({
|
|
||||||
"jsonrpc": "2.0",
|
|
||||||
"id": None,
|
|
||||||
"error": {"code": -32700, "message": f"Parse error: {e}"},
|
|
||||||
}),
|
|
||||||
flush=True,
|
|
||||||
)
|
|
||||||
continue
|
continue
|
||||||
response = self.process_message(message)
|
response = self.process_message(message)
|
||||||
if response is not None:
|
if response is not None:
|
||||||
|
|
@ -623,6 +615,11 @@ class MemoryServer:
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
|
# Suppress all stderr output — MCP clients (e.g. Claude Code) may treat
|
||||||
|
# any stderr as a fatal error and refuse to load the server.
|
||||||
|
sys.stderr = open(os.devnull, "w")
|
||||||
|
logging.disable(logging.CRITICAL)
|
||||||
|
|
||||||
server = MemoryServer()
|
server = MemoryServer()
|
||||||
server.run()
|
server.run()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,14 +87,7 @@ class SyncEngine:
|
||||||
return self._last_sync_success
|
return self._last_sync_success
|
||||||
|
|
||||||
def start(self) -> None:
|
def start(self) -> None:
|
||||||
"""Run initial sync (blocking), then start background thread."""
|
"""Start background sync thread (non-blocking)."""
|
||||||
try:
|
|
||||||
self._sync_once()
|
|
||||||
self._last_sync_success = True
|
|
||||||
except Exception:
|
|
||||||
logger.warning("Initial sync failed, starting in offline mode")
|
|
||||||
self._last_sync_success = False
|
|
||||||
|
|
||||||
self._thread = threading.Thread(target=self._sync_loop, daemon=True)
|
self._thread = threading.Thread(target=self._sync_loop, daemon=True)
|
||||||
self._thread.start()
|
self._thread.start()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue