phone-agent-mcp
This MCP server controls a connected Android phone through an AI agent, enabling natural language task automation, device interaction, and persistent memory management.
Task Automation: Execute multi‑step tasks from natural language goals (e.g., "Open WeChat and send hello to John"). Supports asynchronous execution via the MCP Tasks extension, with real‑time progress updates over SSE. Manage tasks with
abort_task,get_task_result(per‑step details optional), andget_latest_task.Device Interaction: Capture PNG screenshots (
take_screenshot) and retrieve device status (get_device_status) including model, brand, and OS version.Memory Management: Search the agent’s persistent memory by keywords (
search_memory), save semantic memories with optional tags (save_memory), and delete entries by ID (delete_memory).Integration: Accessible via Streamable HTTP (SSE) or stdio, compatible with MCP clients like Qoder and OpenClaw.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@phone-agent-mcpopen WeChat and send a message to John saying I'm running late"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
phone-agent-mcp
本地 MCP Server — 将 WebADB 浏览器中的 AI Agent 能力暴露为 MCP Tools,供 OpenClaw / Qoder 等外部 AI 客户端通过标准协议调用。
架构概览
外部 AI 客户端(Qoder / OpenClaw / 浏览器端 MCP 客户端)
│
│ Streamable HTTP(SSE 流,首选) 或 stdio(JSON-RPC 2.0)
▼
┌───────────────────┐ WebSocket ┌──────────────────────────────┐
│ phone-agent-mcp │ ◄──────────────────► │ Mobile AI Agent 浏览器页面 │
│ (Node.js 进程) │ ws://localhost │ (https://mobile-ai-use.com) │
│ │ :7788 │ │
│ ┌──────────────┐ │ │ ┌─────────────────┐ │
│ │ McpServer │ │ callBrowser() │ │ MCP Relay │ │
│ │ (HTTP+stdio) │ │ ──── tool/args ────► │ │ (WS Client) │ │
│ │ │ │ ◄─── result ──────── │ │ │ │
│ │ 9 个 Tools │ │ │ │ Agent 调度 │ │
│ │ │ │ progress ◄───────── │ │ 工具执行 │ │
│ └──────────────┘ │ │ └─────────────────┘ │
└───────────────────┘ └──────────────────────────────┘MCP 层:基于
@modelcontextprotocol/sdk的McpServer,提供两种传输通道:Streamable HTTP(默认
7789端口,/mcp端点):SSE 流式输出结果与中间过程,支持多会话,首选通道stdio:兼容 Qoder / OpenClaw 等本地 CLI 类客户端的传统接入方式
中继层:内嵌
wsWebSocket Server(默认7788端口),将工具调用请求转发给浏览器页面中的 MCP Relay进度上报:支持 MCP
notifications/progress协议,Agent 思考/执行过程实时推送至客户端Tasks 扩展:支持 MCP Tasks 扩展(
io.modelcontextprotocol/tasks),长耗时任务异步化,客户端可轮询状态、获取进度、断连后恢复
Related MCP server: scrcpy-mcp
前置条件
Node.js ≥ 18
pnpm(推荐,项目统一包管理器)
Mobile AI Use 浏览器页面已打开并运行(
https://mobile-ai-use.com),页面顶栏 MCP Relay 状态指示器绿色亮起即表示已连接
快速开始
# 1. 进入 mcp-server 目录
cd mcp-server
# 2. 安装依赖
pnpm install
# 3. 构建(生成 dist/server.js)
pnpm run build
# 4. 启动服务
pnpm start开发模式(无需构建,直接运行 TypeScript):
pnpm run dev启动成功后,控制台输出:
[phone-agent-mcp] WebSocket relay on ws://localhost:7788
[phone-agent-mcp] MCP server ready (stdio transport)
[phone-agent-mcp] Streamable HTTP on http://localhost:7789/mcp环境变量
变量名 | 默认值 | 说明 |
|
| WebSocket 中继端口号 |
|
| Streamable HTTP 端口号 |
注册的工具(Tools)
工具名 | 权限 | 超时 | 说明 |
| 写入 | 可配置 | 在已连接的手机上运行 AI Agent 任务,传入自然语言目标(支持 Tasks 扩展异步执行) |
| 写入 | 10s | 中止当前正在运行的 Agent 任务 |
| 只读 | 10s | 按任务 ID 获取已完成任务的详细结果(含步骤) |
| 只读 | 10s | 获取当前对话中最近一次 Agent 任务的结果 |
| 只读 | 30s | 对已连接的手机屏幕截图,返回 PNG 图片 |
| 只读 | 15s | 获取设备信息(型号、品牌、系统版本等) |
| 只读 | 10s | 按关键词搜索 Agent 的持久化记忆库 |
| 写入 | 10s | 保存一条语义记忆到记忆库 |
| 写入 | 10s | 按 ID 删除一条记忆 |
run_agent_task 详解
参数 | 类型 | 必填 | 说明 |
|
| 是 | 自然语言任务目标,如 "打开微信,向张三发送你好" |
|
| 否 | 最大执行时间(毫秒),默认 1,200,000(20 分钟) |
Agent 将自动规划执行步骤,通过屏幕视觉识别和触摸控制完成目标。执行期间的思考/工具调用/步骤结果会通过 MCP notifications/progress 实时推送。
MCP Tasks 扩展(异步长耗时任务)
run_agent_task 注册为 task-based 工具(taskSupport: 'optional'),支持 MCP Tasks 扩展(io.modelcontextprotocol/tasks),解决长耗时操作的阻塞与连接中断问题。
工作流程
客户端 服务端
│ tools/call run_agent_task │
│ params: { arguments, task: { ttl } } │
├──────────────────────────────────────►│ createTask → 立即返回
│ CreateTaskResult { task: { taskId, │ 后台继续执行
│ status: 'working', pollInterval } } │
│◄──────────────────────────────────────┤
│ tasks/get { taskId } ◄── 轮询 ───► │ notifications/tasks/status 主动推送
│ … 状态:working(statusMessage=进度)… │
│ tasks/result { taskId } │ 任务完成后
│◄────────────── CallToolResult ─────────┤任务状态
状态 | 含义 |
| 任务执行中, |
| 任务成功完成,可通过 |
| 任务失败(含浏览器未连接、超时等),结果中包含错误信息 |
| 客户端通过 |
服务端能力声明
"capabilities": {
"tasks": {
"list": {},
"cancel": {},
"requests": { "tools": { "call": {} } }
}
}支持的端点:tasks/get(查状态)、tasks/result(取结果)、tasks/list(列任务)、tasks/cancel(取消)。
关键参数
参数 | 取值 | 说明 |
TTL |
| 任务完成后结果保留时长,过期自动清理 |
pollInterval |
| 建议客户端轮询间隔 |
向后兼容
新客户端(声明 tasks 能力):带
task参数调用 → 立即获得taskId,轮询tasks/get/ 取结果tasks/result旧客户端(不带
task参数):服务端自动降级为内部轮询,同步等待并直接返回CallToolResult,行为与旧版一致
注:
tasks/cancel仅标记任务取消并停止结果写入;如需真正中断手机端执行,请另行调用abort_task工具。
配置到 AI 客户端
Streamable HTTP(推荐)
支持远程/HTTP 接入的客户端(含浏览器端 MCP 客户端)直接指向 URL:
{
"mcpServers": {
"phone-agent": {
"url": "http://localhost:7789/mcp"
}
}
}验证连通性:
curl -N -X POST http://localhost:7789/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'响应头 mcp-session-id 即会话 ID,后续请求需携带;响应体为 SSE 流(text/event-stream)。
stdio(Qoder / Claude Desktop / OpenClaw 本地接入)
在客户端的 MCP 配置文件中添加:
{
"mcpServers": {
"phone-agent": {
"command": "node",
"args": ["/path/to/mcp-server/dist/server.js"],
"env": {
"PHONE_AGENT_WS_PORT": "7788"
}
}
}
}OpenClaw
mcp_servers:
phone-agent:
command: node
args:
- /path/to/mcp-server/dist/server.js
env:
PHONE_AGENT_WS_PORT: "7788"配置完成后,AI 客户端中即可看到上述 9 个手机 Agent 工具,直接调用即可操控手机。
Streamable HTTP 传输详解
Streamable HTTP 是 MCP 标准传输协议,服务端通过 SSE 流在同一个 HTTP 响应内依次输出中间过程通知与最终结果,无需客户端额外轮询:
端点 | 方法 | 作用 |
| POST | 客户端消息入口(initialize / tools/call / tasks/* 等),响应为 SSE 流 |
| GET | 打开独立 SSE 流,接收服务端主动推送(如 |
| DELETE | 关闭会话 |
流式输出内容
长耗时工具(如 run_agent_task)执行期间,响应流内会实时推送:
notifications/progress:Agent 思考/执行进度(客户端声明progressToken时)notifications/message:进度日志降级通道notifications/tasks/status:任务状态变更(working/completed/failed)
流末尾为最终 CallToolResult 或 CreateTaskResult(task 模式)。
会话管理
有状态模式:服务端生成 sessionId,随
initialize响应头mcp-session-id下发,后续请求必须携带每会话一个 McpServer 实例;工具 handler 共享全局浏览器中继与任务存储(
taskStore跨会话,断连重连后可继续轮询任务)CORS 已放开:浏览器端 MCP 客户端可直接访问
连接流程
启动 mcp-server:
pnpm start,启动 stdio / Streamable HTTP 双通道和 WS 中继打开浏览器页面:访问 WebADB 页面,确保设备已连接
确认 Relay 连接:页面顶栏 Relay 状态指示器变绿,控制台输出
Browser connected接入 MCP 客户端:
HTTP 客户端指向
http://localhost:7789/mcp(initialize 后携带mcp-session-id)本地 CLI 客户端通过 stdio 启动
node dist/server.js
调用工具:请求经 WS 转发至浏览器执行,结果与中间过程经 SSE / stdio 流式返回
项目结构
mcp-server/
├── src/
│ └── server.ts # 主服务:McpServer + WS + 8 个工具注册
├── dist/
│ └── server.js # 编译产物
├── package.json
├── tsconfig.json # TypeScript 配置(ES2022 / NodeNext)
└── pnpm-lock.yaml技术栈
组件 | 版本 | 用途 |
| ^1.12.0 | MCP 服务端框架(McpServer + StdioServerTransport) |
| ^8.18.0 | WebSocket 服务端,中继浏览器连接 |
| ^4.4.3 | 工具参数校验与 Schema 声明 |
| ~5.8.3 | 类型安全 |
| ^4.19.0 | 开发模式直接运行 TS |
设计要点
双传输通道:Streamable HTTP(SSE 流式输出结果与中间过程,多会话)与 stdio(本地 CLI 兼容)并存,工具注册逻辑由
createPhoneAgentServer()工厂函数统一提供任务存储跨会话共享:
InMemoryTaskStore全局单例,客户端断连重连(新会话)后仍可通过tasks/get/tasks/result继续轮询未过期任务单浏览器连接:同一时刻只接受一个浏览器 WS 连接,新连接替换旧连接
请求-响应匹配:通过
id字段将 WS 响应路由到对应的挂起 Promise超时兜底:每个工具调用有独立超时,超时返回错误信息而非挂死
进度双通道:优先使用
notifications/progress(需客户端声明progressToken),降级为notifications/message(logging);task 模式下同步写入task.statusMessage并推送notifications/tasks/status静默容错:进度推送失败不中断任务执行;任务被取消/TTL 清理后后台写入安全跳过
浏览器离线提示:WS 未连接时返回友好错误 "Browser not connected"
Available Tools
9 toolsabort_taskB
Abort the currently running Agent task.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states it aborts the running task but doesn't disclose consequences (are results lost? Is it reversible? Does it need admin privileges?). An abort operation likely has destructive implications that are not surfaced, and there's no annotation to cover the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with zero wasted words. It's efficient and front-loaded. Slight deduction only because it's arguably under-specified rather than optimally concise for a potentially destructive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description is reasonably complete on the surface. However, the absence of any behavioral context about side effects or prerequisites of an abort operation is a notable gap for a destructive-sounding tool. It's adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters and no schema to document, so the schema coverage is trivially 100%. With no parameters, there is nothing for the description to explain, making the baseline 4 for parameter semantics appropriate since no compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Abort') with a clear resource ('the currently running Agent task'). It clearly states what the tool does. It lacks explicit sibling differentiation, though the sibling list shows related task tools (run_agent_task, get_task_result) where this abort action is contextually distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what it does but gives no guidance on when to use it versus alternatives or what conditions apply. It doesn't specify whether it applies only to tasks started by this system, what happens to partial results, or whether running is a prerequisite. No exclusions or explicit context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_memoryA
Delete one memory entry (semantic or episodic) by its id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Memory id returned by search_memory / save_memory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the operation targets either semantic or episodic memory types, which is useful scope information. However, it doesn't disclose whether deletion is permanent/irreversible, whether it requires any permissions, or whether related/referenced memories are also affected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence with zero wasted words. It front-loads the primary verb and resource, then scopes with the semantic/episodic distinction and id requirement. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter destructive operation with no output schema, the description is reasonably complete. However, as a delete operation with zero annotations, it would benefit from stating irreversibility or idempotency behavior. The mention of 'semantic or episodic' types is genuinely helpful context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents the 'id' parameter. The description adds minimal value by confirming the id refers to what search_memory/save_memory return (already stated in the schema). With full coverage, the baseline of 3 is appropriate with no significant extra meaning added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete one memory entry (semantic or episodic) by its id' - a specific verb (delete) and resource (memory entry), with clarity that it handles both semantic and episodic types. It differentiates from siblings like save_memory and search_memory by describing the write/delete operation, though it doesn't explicitly contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying 'by its id' and mentioning both semantic and episodic memory types, indicating when this applies. However, it doesn't provide explicit when-to-use vs alternative guidance, nor does it address edge cases like what happens when the operations is attempted on a missing/invalid id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_device_statusARead-only
Get information about the connected phone device (model, brand, OS version, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description aligns with this by framing the operation as 'Get information' — no contradiction. The description adds value by specifying what kind of information is returned (model, brand, OS version, etc.), which helps the agent anticipate output. It doesn't cover edge cases like device-not-connected errors, but for a read-only info tool, the coverage is reasonable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that gets straight to the point. It's front-loaded with the core purpose and enumerates example fields for concreteness without padding. Slightly more structure (e.g., a separate note on return behavior) could help, but it's appropriately lean for a zero-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 0 parameters, a readOnlyHint annotation, no output schema, and low conceptual complexity, the description is largely sufficient. What's missing: no explicit mention of failure modes (e.g., what happens when no device is connected), but for a zero-param info retrieval tool, the description covers the essentials well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and with no params, the baseline is 4 per the rubric. There are no parameters to document, so semantic gaps don't apply. The description appropriately explains what the tool retrieves rather than trying to document nonexistent parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Get information about the connected phone device') and enumerates example fields (model, brand, OS version), making the purpose clear. However, it doesn't explicitly distinguish itself from sibling tools, though the sibling set (memory, tasks, screenshots) is clearly different enough that no confusion is likely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (checking device details) but provides no explicit when-to-use guidance or exclusions. With 8 siblings spanning memory, task, and screen operations, the absence of any 'use this for X, not Y' type guidance leaves some room for ambiguity, though the tool's domain (device info) is fairly self-apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_taskARead-only
Get the most recent Agent task result from the current conversation.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is already covered. The description adds scope context ('most recent', 'current conversation') beyond annotations. However, it doesn't disclose what happens if no task exists in the conversation (error, null result, etc.), and being read-only is largely implied by the annotation already.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly-scoped sentence with zero waste. Every word earns its place — verb, resource, and the two scope qualifiers ('most recent', 'current conversation') all carry meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 0-parameter, read-only, no-output-schema tool, the description is reasonably complete. The main gap is behavioral: what happens on an empty conversation or when no agent task has run, and whether 'task result' refers to run_agent_task or get_task_result outputs. Some ambiguity remains around what constitutes a 'task result' and its relationship to sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and schema coverage at 100%, the schema fully documents everything. No parameter information is needed in the description since there are no parameters to explain. Baseline 4 for a 0-param tool is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Get the most recent Agent task result from the current conversation' — a specific verb+resource ('get... task result') with clarifying scope ('most recent', 'current conversation'). It's clear about what it does, though it doesn't explicitly distinguish from sibling get_task_result, relying on the 'most recent' qualifier to differentiate scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from the current conversation' provides some context for when it applies, and having sibling get_task_result implies there's a scoping distinction (latest vs specific). However, there's no explicit guidance on when to choose this over get_task_result, when the conversation context matters, or any prerequisites (e.g., must a task have been run first?).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_resultARead-only
Get the detailed result of a completed Agent task by its task ID.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task ID returned by run_agent_task | |
| includeSteps | No | Include per-step details (default: true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, which the description aligns with (a 'get' operation is consistent). The description adds context that the task must be 'completed' for a result to exist, implying that incomplete/running tasks won't yield results via this tool. This is a meaningful behavioral constraint beyond the annotation. Siblings like abort_task and run_agent_task suggest a task lifecycle where this tool is the terminal read step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, compact sentence that states exactly what the tool does with no filler. Every word earns its place. This is appropriately front-loaded and minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only result-fetch tool with a fully documented schema (100% coverage, no output schema), the description plus annotations cover the essential contract: what it returns (result of a completed task), key input (taskId), and optional behavior (includeSteps with default). The absence of an output schema reduces the descriptive burden. A minor gap is not noting what happens for a task in progress or an invalid ID, but for a simple fetch tool this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters documented: taskId is described as 'returned by run_agent_task' and includeSteps has a default of true. The description itself adds no parameter-specific detail beyond 'by its task ID,' relying on the schema. Baseline 3 is appropriate since the schema does the heavy lifting and explicitly documents both parameters well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Get the detailed result of a completed Agent task by its task ID.' It states the resource (task result), the action (get), and the identifier (task ID). It doesn't differentiate from siblings like get_latest_task, which retrieves tasks but for a different scope (latest vs. by ID). A small mention of 'completed' adds scope but no explicit sibling distinction, so 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving completed task results by task ID, but doesn't explicitly state when to use this vs. get_latest_task or when not to use it. No alternative tools are named. The context (completed task, task ID from run_agent_task) is implied by the parameter description in the schema rather than stated in the tool description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_agent_taskADestructive
Run an AI Agent task on the connected phone. The agent will plan and execute multiple steps to achieve the goal using screen vision and touch controls.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | Natural language task goal, e.g. "Open WeChat and send hello to John" | |
| timeoutMs | No | Max execution time in milliseconds (default: 120000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the agent autonomously plans and executes multiple steps using screen vision and touch controls, which is important behavioral information (the agent has agency and may perform actions beyond a simple explicit one). The annotations already declare destructiveHint=true and readOnlyHint=false, which the description aligns with. It adds context that the agent is autonomous and may take multiple actions, which is valuable beyond the raw annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single focused sentence plus an example in the schema. It's front-loaded with the core purpose and adds the key behavioral detail about autonomous planning. Efficient and earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 2 well-documented parameters, no output schema, and good annotations, the description covers the essential purpose, the autonomous execution mode, and the execution mechanism. It could mention what the return value looks like (task ID, result, etc.) since there's no output schema, but given the 100% schema coverage and sibling context, it's reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents both parameters (goal and timeoutMs) with descriptions. The description adds some context by showing a concrete example ('Open WeChat and send hello to John') in the schema, and mentions timeouts indirectly. Baseline of 3 is appropriate since the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs an AI agent task on the connected phone, explaining it plans and executes steps using screen vision and touch controls. It uses a specific verb+resource combination ('run agent task'), which distinguishes it from siblings like take_screenshot or get_device_status. However, it doesn't explicitly differentiate itself from related task tools like abort_task or get_latest_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys it's for multi-step goals achieved via vision and touch, implying usage for complex tasks. However, there's no explicit guidance on when to use this vs alternatives like take_screenshot or when not to use it. The distinction from simpler direct-action tools is implied but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_memoryB
Save a semantic memory (reusable knowledge) into the phone agent's persistent memory.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | One-line title of the memory | |
| content | Yes | Memory content, under 200 chars recommended | |
| keywords | No | Optional search keywords |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral transparency. It states the write/persist nature ('into persistent memory'), but does not disclose whether the operation is additive-only, how it interacts with existing memories of the same title, whether duplicates are overwritten or stacked, storage limits, or any side effects. Beyond the schema's own field hints, little additional behavior is revealed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, focused sentence that conveys the core action and purpose without waste. Any behavioral or usage detail is absent, but as written it is maximally efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple 3-param write tool with 100% schema coverage and no nested objects, so it doesn't demand much. However, with no annotations and no usage exclusions, it would benefit from clarifying memory-management behavior (e.g., whether same-title writes override or append, and typical use cases vs search_memory). Adequate but with gaps given the sibling tooling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (title, content, keywords) have inline schema documentation. The description adds the 'under 200 chars recommended' guidance via the schema, not the tool description itself. The description text adds little beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Save' plus the resource 'semantic memory' clearly states the tool's action. The parenthetical 'reusable knowledge' usefully clarifies what a semantic memory means. It's distinguishable from siblings like search_memory and delete_memory, though it doesn't explicitly call out any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes this is for 'reusable knowledge' saved into persistent memory, implying it's for knowledge that should persist. However, there is no explicit guidance on when NOT to use it, when to prefer alternatives, or what kind of content is appropriate beyond the persistence framing. It lacks excluded cases (e.g., ephemeral data).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memoryBRead-only
Search the persistent memory of the phone agent by keywords. Returns semantic memories (learned experience) and/or episodic records (task history).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Restrict to one memory type (default: both) | |
| limit | No | Max results (default: 5) | |
| query | Yes | Keyword query, Chinese or English |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already declares this as a safe read operation, so the bar for transparency is lower. The description confirms it's a search (non-mutating) operation, consistent with the annotation. However, it doesn't disclose what happens when no matches are found, whether results are ordered, or anything about the result format, which would be useful given there's no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that packs in the tool's purpose and the semantic/episodic distinction. It's front-loaded with the core action ('search the persistent memory') followed by clarifying detail. No wasted words, though it could arguably say more about result behavior without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with readOnlyHint, 100% schema coverage, and no output schema, the description provides adequate but not rich context. It defines the two memory types, which is helpful. However, it doesn't describe what the results look like (the return format is undocumented), and it doesn't mention pagination or ordering behavior. A search tool with a limit parameter would benefit from describing what happens with results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds the semantic vs. episodic distinction and mentions keyword search, which aligns with the query parameter's 'keyword query' description. However, the description doesn't add meaningful semantic detail beyond what the schema provides—it clarifies what the two memory types mean ('learned experience' vs 'task history') but doesn't enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (search), resource (persistent memory), and scope (keyword-based search). It also distinguishes between semantic memories and episodic records, which adds specificity. It doesn't explicitly differentiate from sibling tools like delete_memory or save_memory, but the verbs alone make the distinction obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for searching memory contents but doesn't provide explicit when-to-use guidance or contrast with alternatives. The mention of both semantic and episodic types gives some context, but there's no statement about when to search one type versus the other, nor guidance about when to use run_agent_task or other task-related tools instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_screenshotARead-only
Take a screenshot of the connected phone screen. Returns a PNG image.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this is a safe read operation, so the bar is lower. The description adds that it returns a PNG image, which is a useful behavioral detail. However, it does not disclose potential limitations such as screen lock state, permission requirements, or what happens if no phone is connected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with zero wasted words. It front-loads the core action ('Take a screenshot') and follows with the output format. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only tool with a clear purpose and stated output format (PNG), the description is reasonably complete. There is no output schema, but the description addresses the return type. Minor gaps around failure conditions exist, but they don't substantially impede correct tool usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are 0 parameters, so the schema carries no burden and the description doesn't need to explain any. With no parameters to document, the baseline of 4 applies. The description correctly focuses on behavior and output rather than parameter details that don't exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (take a screenshot), the target resource (connected phone screen), and the output (PNG image). It distinguishes itself from siblings—none of which relate to screen capture—so there is no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (when a screenshot of the phone is needed) but does not explicitly name alternatives or exclusion conditions. There is no guidance about prerequisites like device connection state, which the sibling get_device_status might help verify. However, the purpose is clear enough that an agent can infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
9 tool updates
v1.0.0- First observed
abort_task - First observed
delete_memory - First observed
get_device_status - First observed
get_latest_task - First observed
get_task_result - First observed
run_agent_task - First observed
save_memory - First observed
search_memory - First observed
take_screenshot
TDQS
Most tools are clearly distinct: run_agent_task, get_task_result, get_latest_task, take_screenshot, get_device_status, abort_task, and the three memory tools all have obvious purposes. get_task_result and get_latest_task could be mildly confused (both retrieve task results), and save_memory vs search_memory vs delete_memory are clear. No significant overlap issues.
All tools follow a consistent verb_noun pattern throughout: delete_memory, run_agent_task, get_task_result, get_latest_task, take_screenshot, get_device_status, save_memory, search_memory, abort_task. Every name is snake_case with a clear action verb followed by a target noun, showing strong uniformity.
Nine tools is well within the ideal 3-15 range for a phone agent MCP server. Each tool corresponds to a distinct capability: task management (run/get/latest/abort), memory management (save/search/delete), device inspection, and screen capture. None feels redundant or unnecessary.
The server covers core workflows: device inspection, task execution/retrieval/abort, screenshots, and memory operations. However, there are no explicit memory update operations (only save/delete/search), and no direct touch-input tool outside of the agent task abstraction, which may be fine given the agent-centric design but leaves some gaps for low-level control.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Melaya is a remote MCP server. It gives an assistant hands on your own Android phone and browser: it reads the screen through the accessibility tree, then taps, types and navigates inside the apps and sites you allow-list, with no per-app API. It also builds, schedules and runs agent pipelines across 6k+ connected tools. OAuth 2.1, nothing to install.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
Related MCP Servers
- FlicenseAqualityDmaintenanceA MCP server that enables AI assistants to control Android devices via ADB, supporting device info, screen control, input simulation, app management, shell execution, file transfer, and UI parsing.20-
- AlicenseAqualityAmaintenanceMCP server that gives AI agents full vision and control over Android devices via ADB and scrcpy. Supports screenshots, input, apps, UI automation, shell, files, and clipboard.3839191MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that wraps Android ADB functionality into AI assistant tools, enabling device management, shell execution, file operations, app management, media capture, and log analysis via natural language.262MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that enables AI agents to control Android and iOS devices via natural language, using platform tools like adb and simctl.6,61346Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MobileAiUse/mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server