from pam_deploy_graph.mcp_client import ( FunctionMcpToolClient, load_mcp_client_config, SessionMcpToolClient, normalize_mcp_sdk_result, ) def test_function_mcp_client_wraps_callable(): client = FunctionMcpToolClient(lambda name, args: {"tool": name, "args": args}) assert client.call_tool("pam_get_online_ips", {"airportCode": "HET"})["tool"] == "pam_get_online_ips" def test_normalize_mcp_sdk_result_structured_content(): result = type("Result", (), {"structuredContent": {"ok": True}})() assert normalize_mcp_sdk_result(result) == {"ok": True} def test_session_mcp_client_normalizes_text_json_content(): content = [type("Text", (), {"text": '{"ok": true}'})()] result = type("Result", (), {"content": content})() class Session: def call_tool(self, tool_name, arguments): return result client = SessionMcpToolClient(Session()) assert client.call_tool("tool", {}) == {"ok": True} def test_load_mcp_client_config(tmp_path): path = tmp_path / "mcp.json" path.write_text( '{"server_name": "pam-node-prod", "tool_names": {"get-online-ips": "custom_ips"}}', encoding="utf-8", ) config = load_mcp_client_config(path) assert config.server_name == "pam-node-prod" assert config.tool_names["get-online-ips"] == "custom_ips"