NexusAndroid
This MCP server lets an AI agent see and control a real Android phone over ADB (USB or local Wi-Fi), with no root, no app on the phone and no cloud relay.
See the screen:
lookreturns a numbered UI tree[N](role, text, state, center@x,y) plus an image, filterable by text query or zoomed to a region.Drive the phone:
actruns batched gestures in order — tap, long press, double tap, type (accents and emoji included), clear, keys, scroll, swipe, wait, open URLs (geo:,tel:,mailto:,https://) — with targets as[N], visible text orx,y, and per-step feedback (✓ read back, ~ unverified, ✗ refused/failed).Open apps:
launchby package name or partial name (e.g. "whatsapp", "maps").Read messages:
messageslists recent SMS/RCS conversations and reads a conversation by contact or number, with attached photos; security codes masked.Draft replies:
draftopens SMS/RCS or WhatsApp with text pre-written — sent only after the user explicitly says "send".Notifications:
notificationslists on-screen notifications (app, time, title, text), optionally including ongoing ones; codes masked.Files:
fileslists,pulls to the PC orpushes files in/sdcard— never overwrites, never deletes.Read-only info:
infogives last known location (with Maps link), recent calls, a contact's numbers and upcoming calendar events.Settings:
settingsreads or changes Wi-Fi, Bluetooth, mobile data, location, NFC, do-not-disturb, brightness and media volume, then reads back the result.Connection state:
phonereports the connected device, model, screen, foreground app, fold posture and reboot detection.Health report:
checkupcovers system, security patch, battery, storage, memory, apps installed outside stores and wireless debugging;cleanclears app caches.Safeguards: sensitive actions (paying, sending, calling, deleting, uninstalling…) require explicit
confirm=true; banking/payment apps allow navigation only; screen text is treated as data, never instructions.
Drives a real Android phone over plain ADB (USB or local Wi-Fi) without root or an on-device app: reads the screen image and numbered UI tree, runs batched gestures (tap, long press, swipe, scroll, typing with accents/emoji, keys, links), launches apps, and inspects/controls device settings such as Wi-Fi, Bluetooth, mobile data, location, NFC, do-not-disturb, brightness and volume, plus health checkups (battery, storage, memory, security patch, sideloaded apps).
Uses location and Maps data on the phone: exposes the last known location with accuracy, age and a Maps link, and can open Google Maps or follow geo:/google.navigation: links to start navigation to a destination.
Reads SMS and RCS conversations from Android's messaging provider (never by scraping the screen), by contact name or number, including attached photos, with security codes masked; also detects RCS group members and sender names, and flags conversations hidden/archived in Google Messages.
Opens WhatsApp with a reply already drafted to a recipient given by name or number, with the message sent only after the user explicitly confirms.
Click on "Deploy 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., "@NexusAndroidOpen Google Maps and start navigation to the nearest pharmacy."
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.
NexusAndroid


Android computer use for AI agents, over plain ADB. One MCP server, nexus-android, lets Claude Code, Codex
and Antigravity see and drive a real Android phone: screen and UI tree, gestures, typing with accents and emoji,
SMS/RCS reading, prepared replies, notifications, files, settings. No root, no app to install on the phone, no
cloud relay: a USB cable or the local Wi-Fi.
Built and tested on a Samsung Galaxy Fold (SM-F971B, One UI) with a Windows PC. Other Android phones with USB
debugging should work but have not been tested. Agent-facing messages are in French.
Part of the Nexus family: NexusWindows
(Claude ·
Codex ·
Antigravity),
NexusBrowser (repo),
NexusAndroid (repo).
Project page: julienpiron.fr/nexusandroid.
Quick start
Phone: Settings → About phone → tap Build number 7 times, then Developer options → USB debugging on. Plug it in and accept the PC's key on the phone.
PC: install
uvand the Android Platform Tools (winget install Google.PlatformTools).Add the server to your agent (installed from PyPI by
uvx, no clone needed):
claude mcp add nexus-android --scope user -- uvx --python 3.14 nexus-androidThen ask your agent: "Look at my phone and tell me what is on the screen."
[mcp_servers.nexus-android]
command = "uvx"
args = ["--python", "3.14", "nexus-android"]{
"mcpServers": {
"nexus-android": {
"command": "uvx",
"args": ["--python", "3.14", "nexus-android"]
}
}
}If adb is not on the PATH, set NEXUS_ANDROID_ADB to its full path in the server's environment. Typing accents
and emoji needs the pinned scrcpy server that install.ps1 downloads and checks; without it,
ASCII typing still works.
Example prompts
"Open Google Maps and start navigation to the nearest pharmacy."
"Read my last SMS from Alice and draft a reply saying I'll be 10 minutes late." (drafted, never sent without your "yes")
"Turn on do not disturb and lower the brightness."
"Pull the last three photos from the phone to my PC."
"Run a checkup: battery, storage, security patch, apps installed outside the stores."
Related MCP server: scrcpy-mcp
How it works
flowchart LR
A["Claude Code"] --> S
B["Codex"] --> S
C["Antigravity"] --> S
S["nexus-android<br/>MCP server (Python)"] -->|"ADB over USB or local Wi-Fi"| P["Android phone<br/>(no app, no root)"]
S -.->|"shared lock, screen-awake state"| L[("~/.nexus")]look returns a screenshot plus the numbered UI tree; act runs a batch of gestures, re-reading the screen before
each one and reporting what really happened. Messages, notifications, contacts and settings are read through
Android's own providers and dumpsys, never by scraping the screen.
Why a shared server
Each agent has its own desktop computer use, but none of the three clients has a built-in tool for a phone. One server avoids maintaining the same ADB access three times, and lets the three agents share one lock, one screen-awake session and the same safeguards.
Tools
Tool | Role |
| Connected phone (USB or Wi-Fi), model, screen, foreground app, fold posture, reboot detection (structured output) |
| Screen image and numbered |
| Batched gestures: tap, long press, typing (accents and emoji included), clear, keys, scroll, swipe, wait, links ( |
| Open an app by package or part of its name |
| SMS and RCS conversations, read by contact name or number, attached photos; security codes masked |
| Open SMS/RCS or WhatsApp with the reply already written, recipient by name or number; sent only after the user explicitly says "send" |
| Notifications on screen: app, time, title, text; security codes masked; |
| Shared storage only ( |
| Read-only: last known location (accuracy, age, Maps link), recent calls, a contact's numbers, upcoming events (structured output) |
| Read or change, then read back: Wi-Fi, Bluetooth, mobile data, location, NFC, do not disturb, brightness, media volume; turning Wi-Fi off is refused when the link goes through it (structured output) |
| Health report: system, security patch, battery, storage, memory, apps installed outside the stores, wireless debugging; |
Google Messages stores RCS messages in Android's messaging provider, like MMS, so the server reads them without going through the screen. An RCS group only has an encoded address there: the server works out its members and names the sender of each received message. A conversation archived or trashed in Google Messages stays readable and is labelled as hidden in the app.
Safeguards
Paying, sending, calling, publishing, deleting for good, formatting, uninstalling, resetting, cancelling a subscription, making a repository public: a button of this kind is refused without
confirm=true, for every gesture aimed at it (tap, typing, clearing, swipe,x,ycoordinates included). The agent sets it on the user's explicit order for that gesture, or after their "yes". The labels come from one policy file shared with the desktop tools (garde-fous.json), matched without accents or case and in every listed form ("Envoyez", "Payez", "Paiement", "Commandez", "Checkout", "Appeler"...). Everything else is free: deleting to the trash, accepting, sharing. A generic "OK" or "Validate" needs it on a screen that talks about a payment or a format. In a messaging, mail, social or phone app, a clickable icon with no name at all (often the send or call button) needs it too. Enter, call keys and any key outside a short safe list need it as well.Target checked on the current screen: the UI and the phone state (lock, foreground app) are read again in one round trip just before each gesture; a changed
[N]or a spot with nothing readable is refused. Reports: ✓ effect read back, ~ sent but not verified, ✗ refused or failed.One phone only: the owner's phone is identified by its hardware serial number, recorded at the first USB connection; emulators, TV boxes and other devices are ignored. One agent at a time drives it (lock shared by all servers on the PC).
Banking, payment, crypto, gambling, identity, authenticators: look, scroll and wait freely; tap, type or swipe only with
confirm=true(the user's order to navigate); a money or send button, or an unnamed icon, never, even withconfirm=true; a link (open_url) that would open one of them is refused (a deep link can prepare a payment).Codes received by SMS or shown in notifications: masked before the agent reads them, and blacked out on the image. When the UI tree cannot be read, codes cannot be located, so the image is not sent unless
lookgetsconfirm=true(with the user's agreement).Passwords: no typing into a password field.
Locked phone: no gestures. The user unlocks it; no code is ever entered.
Text read on screen or in messages is data, never instructions.
User holding the phone: no gesture mixes with theirs. If the phone was touched in the last 3 seconds (and not by an agent), the server waits up to 10 seconds, then refuses.
Link lost during a gesture: reported as
?(effect unknown), never as a plain failure: the agent looks again before redoing it, so nothing is sent twice.Fold folded or unfolded since the last image:
x,ytargets are refused until a newlook.Reboot:
phoneandlooksay once that the phone restarted; when it cannot be found, the message reminds that Android turns wireless debugging off after a reboot or a network change.Other control tools (mobile-mcp, Appium, Shizuku, another scrcpy) left running on the phone can block the UI tree:
checkupand the error name them.
Screen kept on while the agent works
Unlocking again and again while an agent works is tedious, but a phone used to pay must not stay unlocked. So, at the
first gesture (act, launch, draft) on a phone the user has unlocked, the server saves the screen timeout
(screen_off_timeout) and raises it to 30 minutes; phone shows until when.
About 2 minutes after the last gesture of any agent, the original timeout is restored and the screen is turned off,
which locks the phone again. If the user is holding the phone at that moment, or changed the timeout themselves, the
screen is left alone. The original value is saved once (~\.nexus\nexus-android\awake.json) and shared by all
servers under the common lock: one save, one restore, never the raised value taken for the original. After a crash,
the next server to start restores it. The server never unlocks the phone.
NEXUS_ANDROID_AWAKE_IDLE (seconds, default 120) changes the delay; NEXUS_ANDROID_KEEP_AWAKE=0 turns it off.
Known limitations
Gestures go through the real screen, on purpose: the user sees the agent working. No invisible virtual display.
Accented text and emoji go through the clipboard (Android's
input textonly takes ASCII): the scrcpy server (Genymobile, Apache 2.0, version and SHA-256 pinned, downloaded byinstall.ps1) runs only during the paste, then the previous clipboard is put back. Samsung's clipboard history may keep the pasted text.Notifications: Android only keeps the app name of dismissed ones, not their text.
An app protected by
FLAG_SECUREproduces a black screenshot; the server says so and the[N]elements stay readable.The link is USB or local Wi-Fi through wireless debugging, paired with each PC. ADB does not work over Bluetooth.
Windows only for now: the installer, the tests and the default paths target Windows.
Rejected options
Companion app on the phone: notifications, typing with accents, files and settings all come from ADB itself; an app would only add control away from USB and home Wi-Fi, which is rarely needed.
Invisible screen: seeing the agent work on the real screen is a feature.
Internet relay (tunnels, VPN): USB or local Wi-Fi only.
Full install (Windows)
Recommended for daily use: one local environment, registration in every client found on the PC, the scrcpy server for accents, and the shared state between agents.
Prerequisites: Windows, PowerShell 7, uv, Python 3.14 and the Android Platform Tools
(winget install Google.PlatformTools). On the phone: Developer options → USB debugging.
pwsh -NoProfile -File install.ps1 # environment, Claude Code/Codex/Antigravity registration, tests
pwsh -NoProfile -File install.ps1 -Live # plus a run on the connected phoneThe script registers the server in each client present on the PC:
Claude Code:
claude mcp add, user scope.Codex:
[mcp_servers.nexus-android]table in~\.codex\config.toml, with a backup made first.Antigravity:
nexus-androidentry in~\.gemini\config\mcp_config.json.
The virtual environment, caches and backups stay under ~\.nexus\nexus-android, outside the repository.
Cable-free Wi-Fi, once per PC
Phone: Settings → Developer options → Wireless debugging → Pair device with pairing code.
PC:
adb pair <ip>:<port>, then enter the code shown on the phone.
From then on, nexus-android finds the phone on the local Wi-Fi. Since One UI does not announce the phone over mDNS,
the server records its Wi-Fi address and the wireless debugging port every time it is plugged in over USB. This port
changes after a reboot or a network change: plugging in over USB once is then enough. The cable takes priority when
it is plugged in. NEXUS_ANDROID_SERIAL forces a specific device, by serial number or ip:port address.
Privacy
NexusAndroid runs entirely on your PC and talks to your phone over ADB (USB cable or local Wi-Fi). It has no account, no telemetry, no analytics and no cloud relay; the server itself makes no internet requests.
What it reads: the screen and UI tree, SMS/RCS messages, notifications, files in shared storage, location, recent calls, contacts and calendar, only when the agent calls the matching tool. Security codes are masked before the agent sees them.
Where it goes: tool results are returned to the AI client you connected (Claude, Codex, Antigravity…). That client may send them to its model provider under its own privacy policy; NexusAndroid sends nothing anywhere else.
What it stores on the PC, under
~/.nexus/: the phone's Wi-Fi address and wireless debugging port, the saved screen timeout, a lock file, the pinned scrcpy server, and backups of the client configs thatinstall.ps1edits. Files youpullgo to~/Downloads/Telephone. The server writes no messages, screenshots or logs to disk.Removing it: delete
~/.nexus/nexus-android/and~/.nexus/android.lockand revoke the PC's key on the phone (Developer options → Revoke USB debugging authorizations).
Questions or concerns: open an issue, or see SECURITY.md for private reports.
Development
pwsh -NoProfile -File test.ps1 # ruff, pyright and the unit tests, offline, no phone neededLicense
MIT. Not affiliated with Google, Samsung, Anthropic, OpenAI or Genymobile.
Available Tools
11 toolsactADestructive
Gestes sur le téléphone, dans l'ordre (arrêt à la première erreur), puis l'écran à jour. Étapes : tap, long_press, double_tap, type (tout texte, accents et emoji compris ; target = champ à toucher d'abord ; hors ASCII, collé par le presse-papiers, rendu ensuite à l'utilisateur tel quel), clear, key (back, home, recent, delete, ctrl+a, flèches, tab, volume ; enter et autres KEYCODE_* : confirm=true), scroll (direction = sens de lecture : down pour voir la suite), swipe (target → to), wait (text apparu, ou gone=true), open_url (text = adresse ou lien d'app). Cible : "[N]" (crochets ; un nombre seul est un texte), texte visible ou "x,y" image ; jugée sur l'écran relu juste avant le geste. Compte rendu : ✓ effet relu, ~ envoyé non vérifié, ✗ échec/refus. Exemple : steps=[{"do":"tap","target":"Rechercher"},{"do":"type","text":"wifi"}].
| Name | Required | Description | Default |
|---|---|---|---|
| then | No | both | |
| steps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructive/idempotent/openWorld), the description discloses that execution halts on first error, that the response carries a freshly read screen plus per-step verdicts (✓ verified, ~ sent but unverified, ✗ failure/refusal), that non-ASCII text is pasted via clipboard and echoed back verbatim to the user, and the wait timeout bounds (5s default, 30s max). These are exactly the side-effect and verification details an agent needs before committing a destructive action.
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 purpose and stopping rule are front-loaded, and nearly every clause carries unique information; the step list and the reporting legend both earn their space. It is, however, one dense run-on with stacked parentheticals that is harder to parse than it needs to be.
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 10-step, destructive, open-world tool with no output schema, the definition covers ordering, per-step field semantics, confirmation policy, and the shape of the return (verdicts + refreshed screen). It is only incomplete on the `then` output selector and never states the prerequisite of reading the screen with `look` before choosing targets.
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 reported schema coverage at 0%, the description does the heavy lifting by mapping each `do` value to its fields: `type` (target = field to touch first), `key` (key list plus the confirm rule for enter/KEYCODE_*), `scroll` (direction = reading direction, down to continue), `swipe` (target → to), `wait` (text appears, or gone=true), `open_url` (text = address). The notable gap is the top-level `then` parameter (both/image/elements/none), which is never explained and directly governs what the agent gets back.
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 opening sentence gives a specific verb+resource (gestures on the phone, executed in order, then the refreshed screen) and the enumeration of ten step types makes the scope concrete. It never explicitly contrasts itself with siblings such as `launch` or `settings` for the cases where those would be the right pick, so it falls just short of a 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?
It gives real operational rules: steps run in order and execution stops at the first error, `confirm=true` is required for enter and other KEYCODE_* and only on explicit user instruction or after a "yes", and targets are resolved against the screen read just before the gesture. What is missing is a stated alternative or when-not-to-use (e.g. "use look first", "use launch to start an app").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
checkupAIdempotent
Bilan du téléphone : système, correctif de sécurité, batterie, stockage, mémoire, applications hors magasins, débogage sans fil, accessibilité. clean=true vide aussi les caches des applications (sans perte de données).
| Name | Required | Description | Default |
|---|---|---|---|
| clean | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is already structured. The description adds real value on top: it discloses that clean=true also wipes application caches and explicitly reassures 'sans perte de données', which is exactly the side-effect context an agent needs before setting the flag. It stops short of 5 because it never says what the checkup returns.
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?
Two sentences, front-loaded with the scope enumeration and closing with the one conditional behavior that matters. No filler. The enumeration is a laundry list but each item is a distinct inspection target, so it 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 diagnostic tool with no output schema and no return-value description, the agent learns the scope and the clean side effect but not the shape of the report it will get back, nor cost/duration. Annotations cover the safety profile, so the remaining gap is the output contract. Adequate but incomplete.
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 0%, so the description carries the full burden for the single 'clean' boolean. It does so well, explaining that clean=true additionally clears app caches and that no user data is lost, which is meaning the bare schema cannot convey. A 4 rather than 5 because it does not state the default (false) or what other side effects, if any, accompany the flag.
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 names a specific verb-resource (a phone 'bilan'/checkup) and enumerates the exact subsystems inspected: system, security patch, battery, storage, memory, sideloaded apps, wireless debugging, accessibility. That is far more specific than the bare name 'checkup'. It does not, however, explicitly distinguish itself from siblings like 'info', 'settings', or 'phone', so it stops short of a 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?
There is no statement of when to run a checkup versus 'info' or 'settings', nor any prerequisite or exclusion. The only usage-adjacent cue is the conditional behavior of clean=true, which is a parameter note rather than routing guidance. The agent must infer the use case entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draftA
Préparer une réponse sans l'envoyer : ouvre la conversation avec le texte déjà écrit (accents permis). to : nom du répertoire (« Alice »), numéro (06…, +33…, 36179 : des chiffres seuls sont un numéro) ou numéro de conversation entre crochets « [N] ». app : sms (SMS/RCS) ou whatsapp. Envoi : seulement si l'utilisateur dit explicitement « envoie » pour CE brouillon, alors act(steps=[{"do":"tap","target":"Envoyer…","confirm":true}]) et vérifier sur l'image que c'est parti.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| app | No | sms | |
| text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and the non-sending title, but the description adds valuable context: it opens the conversation with text pre-filled, permits accents, and describes the exact follow-up sending flow via act with confirmation and visual verification. It does not cover whether drafts persist or are editable, but it goes well beyond the structured safety hints.
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 front-loaded with purpose, then parameter details, then the sending condition, so an agent can parse it efficiently. It is dense but every sentence adds operational value; minor run-on structure prevents a perfect score.
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 three-parameter tool with no output schema, the description supplies purpose, parameter semantics, behavioral constraints, and the exact handoff to act for sending. The annotations already cover the safety profile, and nothing essential for correct invocation appears missing.
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% schema description coverage, the description compensates substantially by explaining the 'to' parameter's accepted formats (name, phone number, conversation number in brackets, digits alone) and the 'app' enum values (sms/RCS or whatsapp). It also implicitly covers 'text' as the pre-written message body and notes accents are allowed, though it does not elaborate on text formatting or limits.
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?
States a specific verb and resource: preparing a reply without sending it, opening the conversation with the text already written. It explicitly distinguishes this from the sibling tool 'act', which is reserved for actually sending. An agent can tell exactly what this tool does and does not do.
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?
Gives a clear condition for using this tool (prepare without sending) and a clear alternative (use act with confirm) only when the user explicitly says 'envoie' for this draft. It also specifies target formats and app choices, leaving no ambiguity about when to invoke draft versus act.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
filesADestructiveIdempotent
Fichiers du stockage partagé du téléphone (/sdcard : DCIM/Camera pour les photos, Download, Documents…). list : contenu d'un dossier, plus récents d'abord (défaut /sdcard/Download). pull : copie path du téléphone vers le PC (dest, défaut ~\Downloads\Telephone ; jamais d'écrasement). push : dépose le fichier path du PC dans le dossier dest du téléphone (défaut /sdcard/Download ; refusé s'il existe déjà). Rien n'est jamais effacé.
| Name | Required | Description | Default |
|---|---|---|---|
| dest | No | ||
| path | No | ||
| action | No | list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real behavioral context the annotations do not: pull never overwrites, push is refused if the target already exists, and 'Rien n'est jamais effacé'. However, that last cluster directly conflicts with the annotation destructiveHint=true, so the agent receives contradictory signals about whether the tool can destroy data. Flagged as an annotation contradiction.
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?
One front-loaded paragraph states the resource first, then breaks each action into a labelled clause ('list :', 'pull :', 'push :'), so it scans quickly despite being dense. Every clause carries information (defaults, overwrite policy) rather than filler. Minor density cost only.
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 3-parameter tool with no output schema and 0% schema coverage, the description covers actions, defaults, overwrite/delete policy and path direction, which is most of what an agent needs. It does not describe what list returns (fields, recursion) or error behaviour, a modest remaining gap.
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 0%, so the description must carry the parameters, and it largely does: it defines action's three values, explains that path is the source file (on the phone for pull, on the PC for push), and gives per-action defaults for dest (~\Downloads\Telephone for pull, /sdcard/Download for push/list). It only leaves the exact meaning of path for list slightly implicit.
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 names a specific resource (the phone's shared storage: /sdcard, DCIM/Camera, Download, Documents) and enumerates the three concrete operations (list, pull, push) with their direction of transfer. An agent immediately understands this is a phone-file manager. It stops short of 5 because it never contrasts itself with any sibling tool (e.g. 'phone').
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?
Each action is given a clear use context: list reads a folder's contents (default /sdcard/Download), pull copies phone→PC, push copies PC→phone, and the defaults per action are stated. This tells the agent which action fits which task. There is no explicit when-not-to-use guidance or named alternative, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
infoARead-onlyIdempotent
Lecture seule. location : dernière position connue (précision, âge, lien Maps). calls : derniers appels
(reçus, émis, manqués). contacts : numéros d'un nom (query). calendar : agenda des days prochains jours.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| kind | Yes | ||
| limit | No | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| text | Yes | |
| calls | No | |
| events | No | |
| contacts | No | |
| location | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and 'Lecture seule' merely restates the read-only annotation. The description does add useful content-level context (what each kind returns, e.g. accuracy/age/Maps link, received/outgoing/missed call types), which goes beyond the annotations. No auth, rate-limit, or failure behavior is described, but that bar is lower given the annotation coverage.
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 with the read-only qualifier front-loaded, followed by a tight per-kind listing with no filler. Every clause maps to a distinct mode and earns its place, though the enum-legend format is slightly dense.
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?
An output schema exists, so return values need not be explained, and the description adequately covers the dispatcher's modes. The gaps are the undocumented `limit` parameter and the absence of routing guidance against similar siblings, which are minor given the schema and annotations.
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 0%, so the description must carry parameter meaning, and it does for three of four: `kind` (all four enum modes explained), `query` (a name for contact lookup), and `days` (calendar horizon). Only `limit` is left undefined, so it substantially compensates for the coverage gap without being complete.
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 functions as a legend for the `kind` enum, stating exactly what each mode returns (last known position, recent calls, numbers for a name, upcoming calendar). This gives an agent a clear picture of the tool's scope even though the name `info` itself is generic. It does not, however, differentiate from overlapping siblings such as `messages`, `notifications`, or `phone`.
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?
Usage is implied by the per-kind breakdown, so an agent can infer that `kind=contacts` + `query` is for looking up a number, and `kind=calendar` is for an agenda. But there is no explicit when-to-use guidance and no mention of alternatives among the many siblings (messages, notifications, phone), leaving routing ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launchAIdempotent
Ouvrir une application : nom de paquet (com.whatsapp) ou extrait (« whatsapp », « maps »), puis la voir.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (not read-only, idempotent, non-destructive). The description adds that the app becomes visible/foregrounded ("puis la voir"), which is real behavioral context beyond the annotations, but it says nothing about failure modes when the app name doesn't resolve or whether launching an already-running app is a no-op.
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?
One dense sentence, front-loaded with the action and immediately followed by accepted input formats. No filler. The trailing "puis la voir" is slightly vague but costs almost nothing.
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 single-parameter, no-output-schema tool with annotations covering the safety profile, the description supplies the two things that matter: what the tool does and how to format the only argument. Nothing essential for correct invocation is missing.
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 0% — the single `app` parameter has no description in the schema — so the description carries the full burden, and it does: it explains both accepted forms (full package name or a fragment) with concrete examples. This meaningfully compensates for the coverage gap.
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 and resource in plain terms: open an application, and it specifies the accepted identifier forms with concrete examples (com.whatsapp, "whatsapp", "maps"). It does not explicitly contrast itself with siblings like act or look, but the action is unambiguous.
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?
Usage is implied through the argument guidance — you call it with a package name or a partial name to bring an app forward. There is no statement of when to prefer this over act/look/checkup, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookARead-onlyIdempotent
Voir l'écran du téléphone : éléments numérotés [N] (rôle, texte, états, centre @x,y) et image. show : both (défaut), image, elements, none. query : ne lister que les éléments contenant ce texte. region [x1,y1,x2,y2] : zoom (pixels de la dernière image complète). Arbre UI illisible : l'image n'est pas envoyée (codes non masqués), sauf confirm=true, posé seulement avec l'accord de l'utilisateur.
| Name | Required | Description | Default |
|---|---|---|---|
| show | No | both | |
| query | No | ||
| region | No | ||
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's value is the extra behaviour it discloses: the numbered-element return shape, the privacy fallback where the image is withheld when the UI tree is unreadable, and the consent requirement for confirm. That is real context an agent cannot get from the annotations, though the phrasing of the fallback is cryptic.
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?
Purpose is front-loaded in the first clause, then each parameter is dispatched in a short fragment. No filler sentences; density is high without being padded.
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 4-parameter, zero-coverage, read-only tool with no output schema, the description covers return format, every parameter, and the safety fallback. What is missing is routing against the ten siblings and any note that this is the observation step preceding act.
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 0%, so the description must carry the load and largely does: show modes with the default, query as a text filter over listed elements, region as a zoom box measured in pixels of the last full image, and confirm tied to user consent. Only confirm's exact effect remains under-specified.
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?
States a concrete verb and resource ('Voir l'écran du téléphone') and describes the payload precisely: numbered elements with role, text, states and centre coordinates, plus an image. It is clearly the observation tool among siblings like act and launch, though it never names a sibling explicitly.
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 only real when-to-use rule is for confirm ('posé seulement avec l'accord de l'utilisateur'), which is genuinely useful. The show/query/region text explains what each option does but not when to prefer look over act or info, and there are no exclusions or prerequisite (e.g. must call before act) guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
messagesARead-onlyIdempotent
SMS et RCS du téléphone. Sans argument : conversations récentes [N] avec contact, date, non-lus.
conversation=N, ou contact="Alice" (nom du répertoire) : les limit derniers messages (jusqu'à 500), avec les
images photos les plus récentes jointes (0 pour aucune ; vidéos et fichiers seulement signalés).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| images | No | ||
| contact | No | ||
| conversation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's job is to add operational context — and it does: a 500-message ceiling, the semantics of the `images` count, and the important caveat that videos and files are only signaled rather than returned. It does not discuss pagination or failure behavior, which keeps it short of a 5.
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 two-mode structure is front-loaded: identity of the resource first, then the no-argument behavior, then the filtered behavior. Sentences are dense but each carries distinct information (limits, unread counts, attachment handling) rather than padding.
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?
With no output schema, the description responsibly sketches the return shape (contact, date, unread flag) and the attachment policy. For a 4-parameter tool at 0% schema coverage this is close to complete; missing only default-value explanations and any error/empty-result behavior.
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 0%, so the description carries the full burden and largely succeeds: `limit` is bounded at 500, `images` defaults toward returned photos with 0 meaning none, `contact` is identified as a directory name, and `conversation` takes an integer ID. Only the numeric defaults (15, 4) are left unexplained, which is a minor gap.
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 names a concrete resource ('SMS et RCS du téléphone') and spells out its two operating modes — recent-conversation listing vs. per-conversation message retrieval — so an agent immediately knows what it returns. The verb is only implied rather than stated, and no sibling tool is named, but the sibling set (files, notifications, phone) shows little overlap, so differentiation is not critical.
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?
It clearly states the conditions that select each mode: no argument yields recent conversations with contact/date/unread, while conversation=N or contact="Alice" yields the last `limit` messages. There are no explicit exclusions or named alternatives, but the branch conditions make usage unambiguous in practice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notificationsARead-onlyIdempotent
Notifications affichées sur le téléphone (application, heure, titre, texte), plus récentes d'abord ; codes de sécurité masqués. all=true : aussi les permanentes (services en cours). Android ne garde des notifications retirées que le nom de l'application.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real context: newest-first ordering, security codes being masked, and the Android platform limitation that only the app name survives for removed notifications. It does not cover result size or the limit parameter's effect.
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?
Dense and front-loaded: resource and returned fields come first, then the all=true condition, then the platform caveat. No filler sentences, though the compressed phrasing makes the trailing Android note easy to misread.
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?
With no output schema, the description usefully enumerates the returned fields and ordering, which an agent would otherwise have to guess. The only real gap is the undocumented limit parameter and any indication of how many results come back.
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 0%, so the description must compensate. It explains `all` well (include permanent/ongoing-service notifications), but `limit` is never mentioned — no default of 40, no maximum, no truncation behavior. Half the parameters remain unexplained.
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?
Names a specific resource (notifications displayed on the phone) and enumerates the returned fields (app, time, title, text), plus ordering (most recent first) and masking behavior. This is enough to separate it from siblings like messages or phone without opening any schema.
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?
Usage is implied rather than stated: the agent infers this is the tool for reading phone notifications. The only conditional guidance is 'all=true: also permanent (ongoing service) notifications', which is more parameter semantics than a when-to-use rule. No alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phoneARead-onlyIdempotent
État de la liaison : téléphone joint (USB ou Wi-Fi), modèle, écran, application au premier plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | |
| model | Yes | |
| locked | Yes | |
| serial | Yes | |
| android | Yes | |
| posture | Yes | plié, entrouvert, ouvert ou vide (téléphone non pliable) |
| rebooted | Yes | |
| screen_on | Yes | |
| transport | Yes | |
| foreground | Yes | |
| kept_awake_until | Yes | HH:MM, écran gardé allumé par les agents jusqu'à cette heure |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered by structured data. The description's contribution is the enumeration of reported fields, which is useful but partially redundant with the output schema. No rate limits, freshness, or failure modes are described.
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 sentence that front-loads the core fact (link state) and then lists the additional reported fields. Nothing is wasted and nothing is buried.
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?
With an output schema present, the description need not explain return values, and annotations cover safety. It supplies the right amount of context for a zero-parameter status reader. The only gap is the absence of any hint about when this probe is the right choice.
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 takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly avoids inventing argument behavior.
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 names a specific resource and enumerates exactly what is reported: link state, connection type (USB or Wi-Fi), model, screen, and foreground application. That is far more informative than the bare name 'phone'. It does not, however, distinguish itself from overlapping siblings such as 'info' or 'checkup', so it falls short of a 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?
There is no statement of when to call this tool versus alternatives, nor any prerequisite or context. An agent must infer from the name alone that this is a status probe, and with siblings like 'info' and 'checkup' present the routing question is left entirely open.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
settingsAIdempotent
Réglages du téléphone, réversibles : sans value, lit l'état ; sinon le change puis le relit. wifi/bluetooth/data/location/nfc : on|off (couper le Wi-Fi est refusé quand la liaison passe par lui). dnd (ne pas déranger) : on|off|priority|alarms. brightness : 1-100 (%) ou auto. volume : 0-100 (%, médias).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| value | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| text | Yes | |
| value | Yes | valeur relue sur le téléphone après le changement éventuel |
| changed | Yes | true si une valeur a été demandée (changement envoyé, puis relu) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds valuable nuance: changes are reversible, and reading happens after change. It also discloses a specific refusal condition for Wi-Fi. That's meaningful behavioral context beyond 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 structured in a few dense lines: purpose, then a per-setting value legend. It's front-loaded with the read/write behavior. Slightly terse and mixing French/English terms, but every sentence carries information.
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?
With an output schema present, return values needn't be described. The description gives enough for an agent to call correctly: when to read vs write, allowed values per setting, and a key constraint. It could be more complete about error handling for invalid values, but it's solid for a simple 2-param tool.
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 0%, so the description must compensate. It does: it explains the 'name' enum semantics for each setting and gives value formats/ranges (on/off, 1-100%, auto, 0-100%, dnd modes). Only gap: it doesn't explicitly map each format to each enum name, but it's inferable.
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 this tool controls phone settings (read or modify) — a specific verb+resource. It's distinguishable from siblings like info or phone. The dual read/write behavior is explicitly stated ('sans value, lit l'état ; sinon le change puis le relit').
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 explains when to read vs write based on the presence of the 'value' parameter. It also gives a specific constraint: cutting Wi-Fi is refused when the connection goes through it. However, it doesn't mention alternatives or when not to use the tool for other settings not listed.
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.
5 tool updates
v0.4.1- Changed
act1 field changed- changed
Input schema / $defs / Step / properties / confirm / descriptionPrevious value: -"Uniquement après un « oui » explicite de l'utilisateur pour cette action"New value: +"Seulement sur l'ordre explicite de l'utilisateur pour CE geste, ou après son « oui » à la question posée"
- Changed
info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$defs": { + "Call": { + "properties": { + "date": { + "description": "ISO 8601, heure locale du PC", + "title": "Date", + "type": "string" + }, + "duration_s": { + "title": "Duration S", + "type": "integer" + }, + "number": { + "title": "Number", + "type": "string" + }, + "type": { + "description": "reçu, émis, manqué, messagerie, refusé, bloqué", + "title": "Type", + "type": "string" + }, + "who": { + "title": "Who", + "type": "string" + } + }, + "required": [ + "date", + "type", + "who", + "number", + "duration_s" + ], + "title": "Call", + "type": "object" + }, + "Contact": { + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "number": { + "title": "Number", + "type": "string" + } + }, + "required": [ + "name", + "number" + ], + "title": "Contact", + "type": "object" + }, + "Event": { + "properties": { + "all_day": { + "title": "All Day", + "type": "boolean" + }, + "begin": { + "title": "Begin", + "type": "string" + }, + "end": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "End" + }, + "location": { + "title": "Location", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + } + }, + "required": [ + "begin", + "end", + "all_day", + "title", + "location" + ], + "title": "Event", + "type": "object" + }, + "Location": { + "properties": { + "accuracy_m": { + "title": "Accuracy M", + "type": "integer" + }, + "age_s": { + "title": "Age S", + "type": "integer" + }, + "latitude": { + "title": "Latitude", + "type": "number" + }, + "longitude": { + "title": "Longitude", + "type": "number" + }, + "maps_url": { + "title": "Maps Url", + "type": "string" + } + }, + "required": [ + "latitude", + "longitude", + "accuracy_m", + "age_s", + "maps_url" + ], + "title": "Location", + "type": "object" + } + }, + "description": "Réponse structurée de info : le champ du `kind` demandé est rempli, le texte reprend tout.", + "properties": { + "calls": { + "items": { + "$ref": "#/$defs/Call" + }, + "title": "Calls", + "type": "array" + }, + "contacts": { + "items": { + "$ref": "#/$defs/Contact" + }, + "title": "Contacts", + "type": "array" + }, + "events": { + "items": { + "$ref": "#/$defs/Event" + }, + "title": "Events", + "type": "array" + }, + "kind": { + "enum": [ + "location", + "calls", + "contacts", + "calendar" + ], + "title": "Kind", + "type": "string" + }, + "location": { + "anyOf": [ + { + "$ref": "#/$defs/Location" + }, + { + "type": "null" + } + ], + "default": null + }, + "text": { + "title": "Text", + "type": "string" + } + }, + "required": [ + "kind", + "text" + ], + "title": "InfoResult", + "type": "object" +}
- Changed
look1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": false, + "title": "Confirm", + "type": "boolean" +}
- Changed
phone1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "android": { + "title": "Android", + "type": "string" + }, + "foreground": { + "title": "Foreground", + "type": "string" + }, + "kept_awake_until": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "HH:MM, écran gardé allumé par les agents jusqu'à cette heure", + "title": "Kept Awake Until" + }, + "locked": { + "title": "Locked", + "type": "boolean" + }, + "model": { + "title": "Model", + "type": "string" + }, + "posture": { + "description": "plié, entrouvert, ouvert ou vide (téléphone non pliable)", + "title": "Posture", + "type": "string" + }, + "rebooted": { + "title": "Rebooted", + "type": "boolean" + }, + "screen_on": { + "title": "Screen On", + "type": "boolean" + }, + "serial": { + "title": "Serial", + "type": "string" + }, + "text": { + "title": "Text", + "type": "string" + }, + "transport": { + "enum": [ + "usb", + "wifi" + ], + "title": "Transport", + "type": "string" + } + }, + "required": [ + "text", + "model", + "serial", + "transport", + "android", + "posture", + "screen_on", + "locked", + "foreground", + "kept_awake_until", + "rebooted" + ], + "title": "PhoneStatus", + "type": "object" +}
- Changed
settings1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "changed": { + "description": "true si une valeur a été demandée (changement envoyé, puis relu)", + "title": "Changed", + "type": "boolean" + }, + "name": { + "title": "Name", + "type": "string" + }, + "text": { + "title": "Text", + "type": "string" + }, + "value": { + "description": "valeur relue sur le téléphone après le changement éventuel", + "title": "Value", + "type": "string" + } + }, + "required": [ + "name", + "value", + "changed", + "text" + ], + "title": "SettingResult", + "type": "object" +}
11 tool updates
v0.3.1- First observed
act - First observed
checkup - First observed
draft - First observed
files - First observed
info - First observed
launch - First observed
look - First observed
messages - First observed
notifications - First observed
phone - First observed
settings
TDQS
Scored across 11 tools
Each tool targets a distinct primary purpose: diagnostics (checkup), visual state (look), gesture execution (act), app launching (launch), SMS/RCS reading (messages), reply drafting (draft), notifications, file transfer, read-only info, settings toggles, and connection status. Minor overlaps such as checkup vs phone for status or messages vs notifications for phone data are clarified by descriptions, so an agent can reliably choose the right tool.
All names are single lowercase words with no mixed camelCase or snake_case, giving a consistent surface format. However, they mix verbs (look, act, launch) and nouns (messages, files, settings, phone), so there is no single action-oriented pattern like verb_noun throughout.
11 tools is well within the sweet spot for an Android phone control server. Each tool covers a distinct area of functionality and earns its place, with no obvious redundancy or bloat.
The surface covers core workflows: diagnostics, screen reading, gestures, app launching, SMS/RCS, reply drafting, notifications, files, location/calls/contacts/calendar, settings, and connection state. Direct send-message, call, media, and app-management operations are absent, but the general act tool provides a UI-automation workaround, leaving minor gaps rather than dead ends.
Maintenance
Related MCP Connectors
Cloud Android phones for AI agents: create a phone, read the screen, tap, type, install APKs, park.
Control real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.
A real Android phone in the cloud for MCP agents: observe the screen, act, reset to a saved state.
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.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceLets AI agents see and use a real Android phone over Wi-Fi: read the screen, find elements by text or ID, tap, type, swipe, take screenshots and read notifications, without ADB or root.19MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to visually perceive and directly control Android devices via ADB and screen-control tooling, including screenshots, taps, swipes, typing, app management, UI inspection, file transfer, shell commands, and audio/video streaming.154 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to see and control Android devices through ADB and scrcpy, supporting screenshots, input, app management, UI automation, shell/file access, and audio/video streaming.154 npmMIT
- AlicenseNot gradedqualityAmaintenanceGives AI agents vision and control over Android devices through ADB and scrcpy, enabling screenshots, taps, swipes, typing, app launching, UI element inspection, file transfer, and shell commands. Input and screen capture stay fast via scrcpy's binary control protocol, with an ADB fallback when no session is active.154 npmMIT