Feat: add MCP dashboard operations (#8460)

### What problem does this PR solve?

Add MCP server dashboard operations.

### Type of change

- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
Yongteng Lei
2025-06-25 09:26:04 +08:00
committed by GitHub
parent 18fd7983f1
commit af6850c8d8
7 changed files with 193 additions and 72 deletions

View File

@ -107,6 +107,8 @@ class CanvasType(StrEnum):
class MCPServerType(StrEnum):
SSE = "sse"
StreamableHttp = "streamable-http"
STREAMABLE_HTTP = "streamable-http"
VALID_MCP_SERVER_TYPES = {MCPServerType.SSE, MCPServerType.STREAMABLE_HTTP}
KNOWLEDGEBASE_FOLDER_NAME=".knowledgebase"

View File

@ -806,13 +806,13 @@ class MCPServer(DataBaseModel):
url = CharField(max_length=2048, null=False, help_text="MCP Server URL")
server_type = CharField(max_length=32, null=False, help_text="MCP Server type")
description = TextField(null=True, help_text="MCP Server description")
variables = JSONField(null=True, default=[], help_text="MCP Server variables")
headers = JSONField(null=True, default={}, help_text="MCP Server additional request headers")
variables = JSONField(null=True, default=dict, help_text="MCP Server variables")
headers = JSONField(null=True, default=dict, help_text="MCP Server additional request headers")
class Meta:
db_table = "mcp_server"
class Search(DataBaseModel):
id = CharField(max_length=32, primary_key=True)
avatar = TextField(null=True, help_text="avatar base64 string")
@ -949,6 +949,6 @@ def migrate_db():
except Exception:
pass
try:
migrate(migrator.add_column("mcp_server", "variables", JSONField(null=True, help_text="MCP Server variables", default=[])))
migrate(migrator.add_column("mcp_server", "variables", JSONField(null=True, help_text="MCP Server variables", default=dict)))
except Exception:
pass

View File

@ -13,6 +13,8 @@
# 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
@ -31,7 +33,7 @@ class MCPServerService(CommonService):
@classmethod
@DB.connection_context()
def get_servers(cls, tenant_id: str, id_list: list[str] | None = None):
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.
@ -46,16 +48,39 @@ class MCPServerService(CommonService):
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.update_date
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,
]
servers = cls.model.select(*fields).order_by(cls.model.create_time.desc()).where(cls.model.tenant_id == tenant_id)
query = cls.model.select(*fields).order_by(cls.model.create_time.desc()).where(cls.model.tenant_id == tenant_id)
if id_list is not None:
servers = servers.where(cls.model.id.in_(id_list))
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(servers.dicts())
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