From 97cbccc2bacccf2d4b3f59c4d7ccb7c51c637930 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Thu, 17 Apr 2025 00:41:04 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E2=9C=A8=20feat:=20mcp=20=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E5=B8=82=E5=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/dashboard/routes/tools.py | 27 +- .../src/components/shared/ExtensionCard.vue | 2 +- dashboard/src/views/ExtensionPage.vue | 2 +- dashboard/src/views/ToolUsePage.vue | 694 +++++++++++++----- 4 files changed, 540 insertions(+), 185 deletions(-) diff --git a/astrbot/dashboard/routes/tools.py b/astrbot/dashboard/routes/tools.py index 9a3c5aa53..af81fe0d2 100644 --- a/astrbot/dashboard/routes/tools.py +++ b/astrbot/dashboard/routes/tools.py @@ -1,5 +1,6 @@ import os import json +import aiohttp import traceback from .route import Route, Response, RouteContext from quart import request @@ -20,6 +21,7 @@ class ToolsRoute(Route): "/tools/mcp/add": ("POST", self.add_mcp_server), "/tools/mcp/update": ("POST", self.update_mcp_server), "/tools/mcp/delete": ("POST", self.delete_mcp_server), + "/tools/mcp/market": ("GET", self.get_mcp_markets), } self.register_routes() self.tool_mgr = self.core_lifecycle.provider_manager.llm_tools @@ -107,7 +109,9 @@ class ToolsRoute(Route): for key, value in server_data.items(): if key not in ["name", "active", "tools"]: # 排除特殊字段 if key == "mcpServers": - key_0 = list(server_data["mcpServers"].keys())[0] # 不考虑为空的情况 + key_0 = list(server_data["mcpServers"].keys())[ + 0 + ] # 不考虑为空的情况 server_config = server_data["mcpServers"][key_0] else: server_config[key] = value @@ -168,7 +172,9 @@ class ToolsRoute(Route): for key, value in server_data.items(): if key not in ["name", "active", "tools"]: # 排除特殊字段 if key == "mcpServers": - key_0 = list(server_data["mcpServers"].keys())[0] # 不考虑为空的情况 + key_0 = list(server_data["mcpServers"].keys())[ + 0 + ] # 不考虑为空的情况 server_config = server_data["mcpServers"][key_0] else: server_config[key] = value @@ -258,3 +264,20 @@ class ToolsRoute(Route): except Exception as e: logger.error(traceback.format_exc()) return Response().error(f"删除 MCP 服务器失败: {str(e)}").__dict__ + + async def get_mcp_markets(self): + BASE_URL = "https://api.soulter.top/astrbot/mcpservers" + try: + async with aiohttp.ClientSession() as session: + async with session.get(f"{BASE_URL}") as response: + if response.status == 200: + data = await response.json() + return Response().ok(data["data"]).__dict__ + else: + return ( + Response() + .error(f"获取市场数据失败: HTTP {response.status}") + .__dict__ + ) + except Exception as _: + logger.error(traceback.format_exc()) diff --git a/dashboard/src/components/shared/ExtensionCard.vue b/dashboard/src/components/shared/ExtensionCard.vue index e6573260c..73da2f4b5 100644 --- a/dashboard/src/components/shared/ExtensionCard.vue +++ b/dashboard/src/components/shared/ExtensionCard.vue @@ -81,7 +81,7 @@ const viewReadme = () => {
{{ extension.author }} /
-

+

{{ extension.name }}