diff --git a/apps/entities/mcp.py b/apps/entities/mcp.py new file mode 100644 index 0000000000000000000000000000000000000000..3bef20b88415dea00d85289b0e0de41cc721f810 --- /dev/null +++ b/apps/entities/mcp.py @@ -0,0 +1,55 @@ +""" +MCP 相关数据结构 + +Copyright (c) Huawei Technologies Co., Ltd. 2023-2025. All rights reserved. +""" + +from enum import Enum + +from pydantic import BaseModel, Field + + +class MCPServerConfig(BaseModel): + """MCP 服务器配置""" + + icon_path: str = Field(description="MCP 服务器图标路径") + env: dict[str, str] = Field(description="MCP 服务器环境变量") + + +class MCPServerStdioConfig(MCPServerConfig): + """MCP 服务器配置""" + + command: str = Field(description="MCP 服务器命令") + args: list[str] = Field(description="MCP 服务器命令参数") + + +class MCPServerSSEConfig(MCPServerConfig): + """MCP 服务器配置""" + + url: str = Field(description="MCP 服务器地址") + + +class MCPConfig(BaseModel): + """MCP 配置""" + + mcp_servers: dict[ + str, + MCPServerSSEConfig | MCPServerStdioConfig, + ] = Field(description="MCP 服务器配置") + + +class MCPType(str, Enum): + """MCP 类型""" + + SSE = "sse" + STDIO = "stdio" + STREAMABLE = "stream" + + +class MCPMessageType(str, Enum): + """MCP 消息类型""" + + INIT = "initialize" + TOOL_LIST = "tools/list" + TOOL_CALL = "tools/call" + PING = "ping" diff --git a/apps/scheduler/mcp/client.py b/apps/scheduler/mcp/client.py new file mode 100644 index 0000000000000000000000000000000000000000..9b7f1e5bb78f77101ab17be643f475121689abe6 --- /dev/null +++ b/apps/scheduler/mcp/client.py @@ -0,0 +1,35 @@ +"""MCP Client""" + +from mcp import ClientSession +from mcp.client.sse import sse_client +from mcp.client.stdio import stdio_client + +from apps.entities.mcp import MCPConfig, MCPType + + +class MCPClient: + """MCP Agent Client""" + + async def _send_request(self, data: dict) -> dict: + """发送消息给Server""" + raise NotImplementedError + + +class MCPClientSSE(MCPClient): + """MCP Client SSE""" + + def __init__(self, url: str) -> None: + """初始化 MCP SSE客户端""" + self.url = url + + async def _send_request(self, data: dict) -> dict: + """发送消息给Server""" + raise NotImplementedError + + +class MCPClientStdio(MCPClient): + """MCP Client Stdio""" + + async def _send_request(self, data: dict) -> dict: + """发送消息给Server""" + raise NotImplementedError diff --git a/apps/scheduler/mcp/config.py b/apps/scheduler/mcp/config.py new file mode 100644 index 0000000000000000000000000000000000000000..6cb470bb916e9354a17bd7f813ac7e1b08ff5298 --- /dev/null +++ b/apps/scheduler/mcp/config.py @@ -0,0 +1,28 @@ +"""MCP 配置文件的处理""" + + +DEFAULT_STDIO = { + "mcpServers": { + "server-name": { + "iconPath": "icon.png", + "command": "uv", + "args": [ + "your_package", + ], + "env": { + "EXAMPLE_ENV": "example_value", + }, + }, + }, +} +DEFAULT_SSE = { + "mcpServers": { + "server-name": { + "iconPath": "icon.png", + "url": "http://localhost:8000/sse", + "env": { + "EXAMPLE_HEADER": "example_value", + }, + }, + }, +} diff --git a/apps/scheduler/mcp/host.py b/apps/scheduler/mcp/host.py deleted file mode 100644 index 17c38bbe2ca2e45139806cfd4846f8ae94a81804..0000000000000000000000000000000000000000 --- a/apps/scheduler/mcp/host.py +++ /dev/null @@ -1,7 +0,0 @@ -"""MCP Host""" - - -class MCPHost: - """MCP Agent Host""" - -