"""真实 SDK 调用，支持内存直连与 stdio 子进程；没有模型调用。"""
import argparse
import asyncio
from pathlib import Path
import sys
from mcp import Client, StdioServerParameters


def server_parameters() -> StdioServerParameters:
    # 固定受控脚本路径，不执行模型或外部文档提供的任意启动命令。
    path = Path(__file__).with_name("mcp_server.py").resolve()
    return StdioServerParameters(command=sys.executable, args=[str(path)])


async def all_tools(client: Client) -> list:
    tools, cursor, seen = [], None, set()
    for _ in range(100):
        page = await client.list_tools(cursor=cursor)
        tools.extend(page.tools)
        cursor = page.next_cursor
        if cursor is None:
            return tools
        if cursor in seen:
            raise RuntimeError("目录游标重复")
        seen.add(cursor)
    raise RuntimeError("目录页数超过演示限制")


async def main(mode: str = "memory") -> None:
    if mode == "memory":
        from mcp_server import mcp
        target = mcp  # 同进程直接分发，不验证真实传输帧。
    else:
        target = server_parameters()
    # async with 负责建立和释放连接，stdio 模式还管理子进程。
    async with Client(target) as client:
        print("tools:", [t.name for t in await all_tools(client)])
        result = await client.call_tool("get_order", {"order_id": "A1042"})
        print("is_error:", result.is_error)
        print("structured_content:", result.structured_content)
        resource = await client.read_resource("policy://refund")
        print("resource:", resource.contents)
        prompt = await client.get_prompt("explain_refund", {"order_id": "A1042"})
        print("prompt:", prompt.messages)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--mode", choices=["memory", "stdio"], default="memory")
    args = parser.parse_args()
    asyncio.run(main(args.mode))
