From 7017ff3315bce74b97fb0e2cf8668059309067ba Mon Sep 17 00:00:00 2001 From: butubb <1422726308@qq.com> Date: Fri, 4 Sep 2026 12:50:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(M1):=20=E8=A1=A5=20de=5Fwake/de=5Fpress=5F?= =?UTF-8?q?key=20=E5=B7=A5=E5=85=B7=EF=BC=88Agent=20=E7=86=84=E5=B1=8F?= =?UTF-8?q?=E5=8F=AF=E8=87=AA=E5=94=A4=E9=86=92=EF=BC=89=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20MCP=20SDK=20v2=20input=5Fschema=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mcp_agent/agent.py | 3 ++- mcp_server/mcp_server.py | 32 ++++++++++++++++++++++++++++++++ mcp_server/platform_client.py | 12 ++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/mcp_agent/agent.py b/mcp_agent/agent.py index 1533d50..826e4a6 100644 --- a/mcp_agent/agent.py +++ b/mcp_agent/agent.py @@ -48,7 +48,8 @@ class Agent: tools = await self._mcp.list_tools() self.tools_schema = [] for t in tools: - schema = t.inputSchema if hasattr(t, "inputSchema") else {} + # MCP SDK v2 改名 input_schema,兼容新旧字段 + schema = getattr(t, "input_schema", None) or getattr(t, "inputSchema", {}) # fastmcp Tool 属性兼容:name/description/inputSchema name = getattr(t, "name", "") desc = getattr(t, "description", "") or "" diff --git a/mcp_server/mcp_server.py b/mcp_server/mcp_server.py index 1fe77e5..a783e59 100644 --- a/mcp_server/mcp_server.py +++ b/mcp_server/mcp_server.py @@ -163,6 +163,38 @@ def de_swipe(serial: str, x1: int, y1: int, x2: int, y2: int, return _ok({"action": "swipe", "serial": serial}) +_KEYS = ("back", "home", "recent", "menu", "power", "volume_up", + "volume_down", "enter", "delete", "search", "camera") + + +@mcp.tool() +def de_wake(serial: str) -> dict: + """点亮设备屏幕并解锁(熄屏时先调用它再截图)。""" + try: + _check_write() + serial = _check_serial(serial) + platform().wake(serial) + except PlatformError as e: + return _err(e) + audit.audit("de_wake", serial, "", "ok") + return _ok({"action": "wake", "serial": serial}) + + +@mcp.tool() +def de_press_key(serial: str, key: str) -> dict: + """按设备按键:back/home/recent/menu/power/enter/delete 等。""" + try: + _check_write() + serial = _check_serial(serial) + if key not in _KEYS: + raise PlatformError("invalid_param", f"不支持的按键: {key}(可选 {_KEYS})") + platform().press_key(serial, key) + except PlatformError as e: + return _err(e) + audit.audit("de_press_key", serial, key, "ok") + return _ok({"action": "press_key", "serial": serial, "key": key}) + + def main(): _log.info("MCP mobile-control 启动: allow_write=%s port=%s", S.allow_write, S.http_port) diff --git a/mcp_server/platform_client.py b/mcp_server/platform_client.py index ff3fb9f..cb8cadc 100644 --- a/mcp_server/platform_client.py +++ b/mcp_server/platform_client.py @@ -107,6 +107,18 @@ class PlatformClient: "duration": float(duration)}) return self._check_op(r, "swipe") + def wake(self, serial): + """亮屏并解锁(POST /api/device/screen_all mode=on)。""" + r = self._post("/api/device/screen_all", + json={"mode": "on", "serials": [serial]}) + return self._check_op(r, "wake") + + def press_key(self, serial, key): + """按键(POST /api/screen/key)。""" + r = self._post("/api/screen/key", + json={"serial": serial, "key": key}) + return self._check_op(r, "key") + @staticmethod def _check_op(r, name): if r.status_code == 503: