"""MCP 服务器自检:以 stdio 拉起自身,列出工具并调一次 case_list。 用法:uv run python scripts/mcp_smoke.py 验证要点:工具数量与名称、structured_content 可解析、instructions 已下发。 """ from __future__ import annotations import asyncio import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from mcp.client.stdio import StdioServerParameters # noqa: E402 from mcp import Client # noqa: E402 async def main() -> int: root = str(Path(__file__).resolve().parents[1]) params = StdioServerParameters(command=sys.executable, args=["-m", "src.mcp.server"], cwd=root) async with Client(params) as client: listed = await client.list_tools() tools = list(getattr(listed, "tools", listed)) names = sorted(t.name for t in tools) print("instructions bytes:", len(getattr(client, "instructions", "") or "")) print("tools:", len(names)) for name in names: print(" -", name) result = await client.call_tool("case_list", {}) payload = getattr(result, "structured_content", None) if not isinstance(payload, dict) or not payload.get("ok"): print("case_list 调用异常:", payload) return 1 print("case_list ok, cases:", len(payload.get("cases", []))) missing = [ n for n in ("case_status", "match_payments", "info_skeleton", "doc_requisition", "case_patch_extraction") if n not in names ] print("关键工具缺失:", missing or "无") return 1 if missing else 0 if __name__ == "__main__": sys.exit(asyncio.run(main()))