"""Exercise the actual MCP protocol, including denied and invalid calls."""
import asyncio
import json
import sys
from pathlib import Path

from mcp import Client, StdioServerParameters


async def main() -> None:
    directory = Path(__file__).resolve().parent
    server = StdioServerParameters(
        command=sys.executable,
        args=[str(directory / "logs_server.py")],
        env={"ALLOWED_SERVICE": "service-a", "LOG_DB_PATH": str(directory / "logs.sqlite")},
    )
    async with Client(server) as client:
        tools = await client.list_tools()
        assert any(tool.name == "search_logs" for tool in tools.tools)
        result = await client.call_tool(
            "search_logs", {"service": "service-a", "query": "API", "limit": 10}
        )
        assert not result.is_error, result.content
        output = json.dumps([item.model_dump(mode="json") for item in result.content])
        assert "API timeout" in output and "[REDACTED]" in output
        assert "private-test-token" not in output and "Restricted service" not in output
        denied = await client.call_tool(
            "search_logs", {"service": "service-b", "query": "error"}
        )
        assert denied.is_error, "An out-of-scope service must be denied"
        invalid = await client.call_tool(
            "search_logs", {"service": "service-a", "query": "API", "limit": 101}
        )
        assert invalid.is_error, "Limits above 100 must be rejected"
    print("PASS: discovery, search, redaction, scope denial, input validation")


if __name__ == "__main__":
    asyncio.run(main())
