test_mcp_call.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from __future__ import annotations
  2. import argparse
  3. import asyncio
  4. import json
  5. import os
  6. from typing import Any
  7. from fastmcp import Client
  8. def _json_default(value: Any) -> Any:
  9. if hasattr(value, "model_dump"):
  10. return value.model_dump()
  11. if hasattr(value, "dict"):
  12. return value.dict()
  13. if hasattr(value, "__dict__"):
  14. return value.__dict__
  15. return str(value)
  16. def _parse_args() -> argparse.Namespace:
  17. parser = argparse.ArgumentParser(description="Call a data-collector-mcp tool over HTTP.")
  18. parser.add_argument(
  19. "--url",
  20. default=os.getenv("MCP_TEST_URL", "http://127.0.0.1:8501/mcp"),
  21. help="MCP HTTP URL. Default: http://127.0.0.1:8501/mcp",
  22. )
  23. parser.add_argument(
  24. "--tool",
  25. default="project.list",
  26. help="Tool name to call. Default: project.list",
  27. )
  28. parser.add_argument(
  29. "--args",
  30. default="{}",
  31. help='Tool arguments as JSON. Example: --args "{\"project_key\":\"dev-01\"}"',
  32. )
  33. parser.add_argument(
  34. "--list-tools",
  35. action="store_true",
  36. help="List available tools instead of calling one tool.",
  37. )
  38. return parser.parse_args()
  39. async def _main() -> None:
  40. args = _parse_args()
  41. try:
  42. tool_args = json.loads(args.args)
  43. except json.JSONDecodeError as exc:
  44. raise SystemExit(f"invalid --args JSON: {exc}") from exc
  45. if not isinstance(tool_args, dict):
  46. raise SystemExit("--args must be a JSON object")
  47. async with Client(args.url) as client:
  48. if args.list_tools:
  49. print(json.dumps({"request": {"url": args.url, "action": "list_tools"}}, ensure_ascii=False, indent=2))
  50. result = await client.list_tools()
  51. else:
  52. print(
  53. json.dumps(
  54. {
  55. "request": {
  56. "url": args.url,
  57. "tool": args.tool,
  58. "arguments": tool_args,
  59. }
  60. },
  61. ensure_ascii=False,
  62. indent=2,
  63. default=_json_default,
  64. )
  65. )
  66. result = await client.call_tool(args.tool, tool_args)
  67. print(json.dumps({"response": result}, ensure_ascii=False, indent=2, default=_json_default))
  68. if __name__ == "__main__":
  69. asyncio.run(_main())