load_mcp_server.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import json
  2. import logging
  3. import os
  4. from dotenv import load_dotenv
  5. from typing import Any, Dict
  6. from langchain_mcp_tools import convert_mcp_to_langchain_tools
  7. from base.config import config_handler
  8. from logger.loggering import server_logger
  9. from utils.common import handler_err
  10. class LoadMcpServer:
  11. def __init__(self):
  12. self.tools = [] # 默认为空列表
  13. self.cleanup = None
  14. self.mcp_server_config_path = config_handler.get("mcp","MCP_SERVER_CONFIG_PATH")
  15. # 加载MCP配置文件信息
  16. self.mcp_configs = self.load_mcp_configs(self.mcp_server_config_path)
  17. def load_mcp_configs(self, conf_file_path: str) -> Dict[str, Any]:
  18. """
  19. 从 JSON 文件加载服务器配置
  20. Args:
  21. conf_file_path: JSON 配置文件路径
  22. Returns:
  23. 包含服务器配置的字典
  24. """
  25. # 获取当前文件的目录
  26. current_dir = os.path.dirname(__file__)
  27. # 构建到 .env 的相对路径
  28. conf_file_path = os.path.join(current_dir , '../', 'config' , conf_file_path)
  29. server_logger.info(f"加载服务器配置: {conf_file_path}")
  30. if not os.path.exists(conf_file_path):
  31. server_logger.error(f"配置文件不存在: {conf_file_path}")
  32. raise ValueError(f"'conf_file_path':{conf_file_path} 不存在!!")
  33. try:
  34. with open(conf_file_path, "r") as f:
  35. return json.load(f)
  36. except Exception as e:
  37. server_logger.error(f"❌ 加载 MCP 配置文件失败: {e}")
  38. async def get_mcp_tools(self):
  39. """
  40. 加载MCP-Server对应的工具列表
  41. """
  42. try:
  43. if not self.tools:
  44. # ...原有工具加载逻辑...
  45. tools, cleanup = await convert_mcp_to_langchain_tools(
  46. self.mcp_configs,
  47. server_logger
  48. )
  49. self.tools = tools
  50. self.cleanup = cleanup
  51. # 打印工具列表
  52. self.server_logger_tools_info()
  53. server_logger.info(f"tools init success")
  54. except Exception as e:
  55. handler_err(server_logger, e, err_name="工具加载失败")
  56. return self.tools
  57. def server_logger_tools_info(self):
  58. """
  59. 打印 MCP 模型工具列表
  60. """
  61. server_logger.info(f"MCP 模型工具总共[{len(self.tools)}]个")
  62. server_logger.info(f"MCP 模型工具列表分别如下:")
  63. for tool in self.tools:
  64. server_logger.info("=" * 50)
  65. server_logger.info(f"工具名称: {tool.name}")
  66. server_logger.info(f"工具描述: {tool.description}")
  67. server_logger.info(f"工具参数: {tool.args}")
  68. async def close(self):
  69. """
  70. 关闭MCP服务端连接资源
  71. """
  72. if self.cleanup is not None:
  73. try:
  74. await self.cleanup()
  75. server_logger.info("✅ MCP 资源已成功清理")
  76. except Exception as e:
  77. server_logger.error(f"⚠️ 清理 MCP 资源失败: {e}")