You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

provider.py 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import json
  2. from typing import Any
  3. from core.mcp.types import Tool as RemoteMCPTool
  4. from core.tools.__base.tool_provider import ToolProviderController
  5. from core.tools.__base.tool_runtime import ToolRuntime
  6. from core.tools.entities.common_entities import I18nObject
  7. from core.tools.entities.tool_entities import (
  8. ToolDescription,
  9. ToolEntity,
  10. ToolIdentity,
  11. ToolProviderEntityWithPlugin,
  12. ToolProviderIdentity,
  13. ToolProviderType,
  14. )
  15. from core.tools.mcp_tool.tool import MCPTool
  16. from models.tools import MCPToolProvider
  17. from services.tools.tools_transform_service import ToolTransformService
  18. class MCPToolProviderController(ToolProviderController):
  19. provider_id: str
  20. entity: ToolProviderEntityWithPlugin
  21. def __init__(self, entity: ToolProviderEntityWithPlugin, provider_id: str, tenant_id: str, server_url: str) -> None:
  22. super().__init__(entity)
  23. self.entity = entity
  24. self.tenant_id = tenant_id
  25. self.provider_id = provider_id
  26. self.server_url = server_url
  27. @property
  28. def provider_type(self) -> ToolProviderType:
  29. """
  30. returns the type of the provider
  31. :return: type of the provider
  32. """
  33. return ToolProviderType.MCP
  34. @classmethod
  35. def _from_db(cls, db_provider: MCPToolProvider) -> "MCPToolProviderController":
  36. """
  37. from db provider
  38. """
  39. tools = []
  40. tools_data = json.loads(db_provider.tools)
  41. remote_mcp_tools = [RemoteMCPTool(**tool) for tool in tools_data]
  42. user = db_provider.load_user()
  43. tools = [
  44. ToolEntity(
  45. identity=ToolIdentity(
  46. author=user.name if user else "Anonymous",
  47. name=remote_mcp_tool.name,
  48. label=I18nObject(en_US=remote_mcp_tool.name, zh_Hans=remote_mcp_tool.name),
  49. provider=db_provider.server_identifier,
  50. icon=db_provider.icon,
  51. ),
  52. parameters=ToolTransformService.convert_mcp_schema_to_parameter(remote_mcp_tool.inputSchema),
  53. description=ToolDescription(
  54. human=I18nObject(
  55. en_US=remote_mcp_tool.description or "", zh_Hans=remote_mcp_tool.description or ""
  56. ),
  57. llm=remote_mcp_tool.description or "",
  58. ),
  59. output_schema=None,
  60. has_runtime_parameters=len(remote_mcp_tool.inputSchema) > 0,
  61. )
  62. for remote_mcp_tool in remote_mcp_tools
  63. ]
  64. return cls(
  65. entity=ToolProviderEntityWithPlugin(
  66. identity=ToolProviderIdentity(
  67. author=user.name if user else "Anonymous",
  68. name=db_provider.name,
  69. label=I18nObject(en_US=db_provider.name, zh_Hans=db_provider.name),
  70. description=I18nObject(en_US="", zh_Hans=""),
  71. icon=db_provider.icon,
  72. ),
  73. plugin_id=None,
  74. credentials_schema=[],
  75. tools=tools,
  76. ),
  77. provider_id=db_provider.server_identifier or "",
  78. tenant_id=db_provider.tenant_id or "",
  79. server_url=db_provider.decrypted_server_url,
  80. )
  81. def _validate_credentials(self, user_id: str, credentials: dict[str, Any]) -> None:
  82. """
  83. validate the credentials of the provider
  84. """
  85. pass
  86. def get_tool(self, tool_name: str) -> MCPTool: # type: ignore
  87. """
  88. return tool with given name
  89. """
  90. tool_entity = next(
  91. (tool_entity for tool_entity in self.entity.tools if tool_entity.identity.name == tool_name), None
  92. )
  93. if not tool_entity:
  94. raise ValueError(f"Tool with name {tool_name} not found")
  95. return MCPTool(
  96. entity=tool_entity,
  97. runtime=ToolRuntime(tenant_id=self.tenant_id),
  98. tenant_id=self.tenant_id,
  99. icon=self.entity.identity.icon,
  100. server_url=self.server_url,
  101. provider_id=self.provider_id,
  102. )
  103. def get_tools(self) -> list[MCPTool]: # type: ignore
  104. """
  105. get all tools
  106. """
  107. return [
  108. MCPTool(
  109. entity=tool_entity,
  110. runtime=ToolRuntime(tenant_id=self.tenant_id),
  111. tenant_id=self.tenant_id,
  112. icon=self.entity.identity.icon,
  113. server_url=self.server_url,
  114. provider_id=self.provider_id,
  115. )
  116. for tool_entity in self.entity.tools
  117. ]