# # Copyright 2025 The InfiniFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # from peewee import fn from api.db.db_models import DB, MCPServer from api.db.services.common_service import CommonService class MCPServerService(CommonService): """Service class for managing MCP server related database operations. This class extends CommonService to provide specialized functionality for MCP server management, including MCP server creation, updates, and deletions. Attributes: model: The MCPServer model class for database operations. """ model = MCPServer @classmethod @DB.connection_context() def get_servers(cls, tenant_id: str, id_list: list[str] | None, page_number, items_per_page, orderby, desc, keywords): """Retrieve all MCP servers associated with a tenant. This method fetches all MCP servers for a given tenant, ordered by creation time. It only includes fields for list display. Args: tenant_id (str): The unique identifier of the tenant. id_list (list[str]): Get servers by ID list. Will ignore this condition if None. Returns: list[dict]: List of MCP server dictionaries containing MCP server details. Returns None if no MCP servers are found. """ fields = [ cls.model.id, cls.model.name, cls.model.server_type, cls.model.url, cls.model.description, cls.model.variables, cls.model.create_date, cls.model.update_date, ] query = cls.model.select(*fields).order_by(cls.model.create_time.desc()).where(cls.model.tenant_id == tenant_id) if id_list: query = query.where(cls.model.id.in_(id_list)) if keywords: query = query.where(fn.LOWER(cls.model.name).contains(keywords.lower())) if desc: query = query.order_by(cls.model.getter_by(orderby).desc()) else: query = query.order_by(cls.model.getter_by(orderby).asc()) if page_number and items_per_page: query = query.paginate(page_number, items_per_page) servers = list(query.dicts()) if not servers: return None return servers @classmethod @DB.connection_context() def get_by_name_and_tenant(cls, name: str, tenant_id: str): try: mcp_server = cls.model.query(name=name, tenant_id=tenant_id) return bool(mcp_server), mcp_server except Exception: return False, None