"""test_server.py — verify the MCP server instantiates and all tools are registered.""" from __future__ import annotations import asyncio # --------------------------------------------------------------------------- # Expected tools (must match EXACTLY what mcp_server.py registers) # --------------------------------------------------------------------------- EXPECTED_TOOLS = { "search", "ask", "wiki_read", "wiki_list", "discover_leads", "provenance_verify", "synthesis_browse", } def test_server_instance_exists() -> None: """The module-level ``mcp`` FastMCP instance must exist.""" from codex.mcp_server import mcp assert mcp is not None assert mcp.name == "codex" def test_all_tools_registered() -> None: """Every expected tool name must be registered on the server.""" from codex.mcp_server import mcp tools = asyncio.run(mcp.list_tools()) registered = {t.name for t in tools} missing = EXPECTED_TOOLS - registered assert not missing, f"Tools not registered: {missing}" def test_no_extra_unexpected_write_tools() -> None: """No tool outside the expected set should be registered (belt-and-suspenders).""" from codex.mcp_server import mcp tools = asyncio.run(mcp.list_tools()) registered = {t.name for t in tools} unexpected = registered - EXPECTED_TOOLS assert not unexpected, f"Unexpected tools registered: {unexpected}"