BareGit
"""Deterministic MCP protocol peer for transport and client tests."""

import importlib.util
import json
from pathlib import Path
import signal
import sys
import time

spec = importlib.util.spec_from_file_location(
    "example", Path(__file__).parent.parent / "demo/mcp_server_example.py")
example = importlib.util.module_from_spec(spec)
spec.loader.exec_module(example)
mode = sys.argv[1] if len(sys.argv) > 1 else "normal"
initialized = False
cancelled = []
held = None


def emit(frame):
    # Deliberate byte-fragmentation exercises line accumulation.
    text = json.dumps(frame) + "\n"
    sys.stdout.write(text[:7])
    sys.stdout.flush()
    sys.stdout.write(text[7:])
    sys.stdout.flush()


def reply(request, result):
    emit({"jsonrpc": "2.0", "id": request["id"], "result": result})


if mode == "stubborn":
    signal.signal(signal.SIGTERM, signal.SIG_IGN)

for line in sys.stdin:
    request = json.loads(line)
    method = request.get("method")
    params = request.get("params", {})
    if method == "notifications/initialized":
        initialized = True
        emit({"jsonrpc": "2.0", "method": "notifications/test",
              "params": {"ready": True}})
        emit({"jsonrpc": "2.0", "id": "server-ping", "method": "ping"})
        emit({"jsonrpc": "2.0", "id": "unsupported",
              "method": "sampling/createMessage", "params": {}})
        continue
    if method == "notifications/cancelled":
        cancelled.append(params["requestId"])
        # A server can finish work despite cancellation. This late response
        # must not be delivered to a newer request or poison the connection.
        emit({"jsonrpc": "2.0", "id": params["requestId"],
              "result": {"content": [{"type": "text", "text": "late"}]}})
        continue
    if not method:
        if request.get("id") == "server-ping":
            assert request.get("result") == {}
        if request.get("id") == "unsupported":
            assert request.get("error", {}).get("code") == -32601
        continue
    if "id" not in request:
        continue
    if mode == "bad_json":
        print("not-json", flush=True)
        continue
    if method != "initialize" and not initialized:
        sys.exit(3)
    if method == "initialize" and mode == "hang_init":
        continue
    if method == "initialize" and mode == "bad_version":
        result = example.dispatch(method, params)
        result["protocolVersion"] = "1999-01-01"
        reply(request, result)
        continue
    if (mode == "optional_missing" and method in
            ("resources/list", "prompts/list")) or (
            mode == "no_tools" and method == "tools/list"):
        emit({"jsonrpc": "2.0", "id": request["id"],
              "error": {"code": -32601, "message": "Not supported"}})
        continue
    if mode == "optional_bad" and method == "resources/list":
        reply(request, {"resources": "invalid"})
        continue
    if mode == "pagination" and method == "tools/list":
        result = example.dispatch(method, params)
        if "cursor" in params:
            result["tools"][0]["name"] = "second"
        else:
            result["nextCursor"] = "page2"
        reply(request, result)
        continue
    if mode == "cycle" and method == "tools/list":
        reply(request, {"tools": [], "nextCursor": "same"})
        continue
    if method == "tools/call":
        name = params["name"]
        if name == "hang":
            continue
        if name == "disconnect":
            sys.exit(0)
        if name == "cancelled":
            reply(request, {"content": [{"type": "text",
                                          "text": json.dumps(cancelled)}]})
            continue
        if name == "rpc_error":
            emit({"jsonrpc": "2.0", "id": request["id"],
                  "error": {"code": -32001, "message": "Remote failure",
                            "data": {"reason": "test"}}})
            continue
        if name == "bad_envelope":
            emit({"id": request["id"], "result": {}})
            continue
        if name == "multimodal":
            reply(request, {"content": [{"type": "image", "data": "AA=="}]})
            continue
        if name == "ordered":
            if held is None:
                held = request
            else:
                for item in (request, held):
                    reply(item, {"content": [{"type": "text",
                        "text": item["params"]["arguments"]["label"]}]})
                held = None
            continue
    if mode == "binary" and method == "resources/read":
        reply(request, {"contents": [{"uri": "example://help", "blob": "AA=="}]})
        continue
    if mode == "resource_disconnect" and method == "resources/read":
        sys.exit(0)
    if mode == "bad_prompt" and method == "prompts/get":
        reply(request, {"messages": [{"role": "system",
            "content": {"type": "text", "text": "test"}}]})
        continue
    try:
        reply(request, example.dispatch(method, params))
        if mode == "stop_reading" and method == "prompts/list":
            while True:
                time.sleep(1)
    except LookupError:
        emit({"jsonrpc": "2.0", "id": request["id"],
              "error": {"code": -32601, "message": "Not supported"}})

if mode == "stubborn":
    while True:
        time.sleep(1)