Universal Device MCP
Discovers Android devices over USB/ADB and Wireless Debugging, pairs and connects using advertised mDNS endpoints, inspects device properties, executes ADB shell commands, and monitors connect/disconnect events.
Scans Bluetooth LE devices, enumerates GATT services and characteristics, and reads or writes characteristic values through Bleak.
Discovers iPhone/iPad devices through Apple usbmux and Bonjour, inspects iOS device information, and runs pymobiledevice3 commands pinned to a selected device UDID, subject to pairing and trust state.
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., "@Universal Device MCPlist the USB devices connected to this computer"
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.
Universal Device MCP
Universal Hardware Discovery & Control Platform — a local-first MCP server that lets an AI agent discover connected hardware, inspect the interfaces exposed by the host operating system, communicate through generic transport operations, and retain per-device knowledge between connections.
This project is an extensible hardware access layer, not a promise that every device or proprietary protocol can be controlled. Hardware access depends on operating-system permissions, drivers, device state, and available documentation. Unknown command formats remain experiments until validated.
What works today
MCP server using the official Python MCP SDK v2 on Python 3.11+, or SDK v1 on Python 3.10. A minimal stdio compatibility runtime is available for source execution without dependencies, validates basic argument types, and declares only the protocol revision it implements.
Structured JSON tool results, with read-only/destructive behavior hints where the action is unambiguous.
MCP resources for the remembered device inventory and per-device profile/knowledge snapshots.
Runtime diagnostics through
get_runtime_status, showing Python/OS, MCP runtime, adapter dependencies, ADB availability, database path and plugin load errors without scanning hardware.USB enumeration and descriptor/interface/endpoint inspection through PyUSB.
Generic USB bulk/interrupt endpoint reads and writes and USB control transfers.
USB HID device enumeration and generic input/output report access through hidapi.
Serial port enumeration, inspection, reads and writes through PySerial.
BLE scan, GATT service/characteristic inspection, reads and writes through Bleak.
mDNS/DNS-SD discovery of advertised local TCP and UDP services with generic stream/datagram communication.
Android device discovery, property inspection and generic ADB shell argv execution.
Android Wireless Debugging discovery, pairing-code pairing and TLS ADB connection through advertised mDNS services.
iPhone/iPad USB discovery through Apple usbmux, best-effort USB descriptor detection when lockdown access is unavailable, iOS device-info inspection, paired-device Bonjour discovery, and generic
pymobiledevice3CLI execution pinned to the selected device.Local SQLite device profiles, persistent discoveries and a recent-history view over the complete communication log.
Automatic USB, HID, serial and ADB connection monitoring with a persistent event feed; BLE scanning remains on demand because it is slower and platform-sensitive.
Configuration snapshots that preserve previous hardware/interface layouts when an observed configuration changes.
Optional user-authored operation restrictions, with no restrictions imposed by default.
Extensible Python adapter interface, with optional transport dependencies loaded only when needed.
Broader non-advertising Wi-Fi/network scans, proprietary protocol inference, documentation search, and a graphical interface are extension points for later releases. ADB shell is limited by Android's own shell permissions. iOS does not expose a general-purpose shell; available services are those allowed by the device's iOS version, pairing/trust state and installed host support.
Related MCP server: MCP-Edge
Requirements
Python 3.10 or newer.
OS device permissions and transport drivers as applicable.
Optional external tools/libraries for each transport (table below).
Transport | Install | Host requirements |
USB |
| A libusb backend; some devices need a compatible driver. A kernel driver may own an interface. |
USB HID |
| HIDAPI support from the OS; protected/system devices may deny access. |
Serial/UART |
| Port permission on Linux/macOS; device driver on Windows. |
Bluetooth LE |
| Bluetooth adapter and OS permissions/services. |
Local network |
| Devices must advertise mDNS/DNS-SD TCP or UDP services; arbitrary IP ranges are not scanned. |
Android | No Python extra | Android Platform Tools ( |
iPhone/iPad |
| Uses |
Install
From a source checkout:
python -m venv .venv
# Windows PowerShell: .venv\Scripts\Activate.ps1
# macOS/Linux: source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e ".[all]"The base install includes the official MCP SDK selected for your Python version. The [all] extra adds the USB, HID, serial, BLE, network and iOS adapters. Install only the transports you need with [usb], [hid], [serial], [bluetooth], [network] or [ios]. Python 3.10 uses the SDK v1 maintenance line; Python 3.11+ uses the current SDK v2 line. For Android-only use, install the base package and Android Platform Tools separately.
Start the server directly:
universal-device-mcp
# or
python -m universal_device_mcp.serverThe process uses MCP stdio; do not type into its terminal while it is running. MCP protocol messages use stdout, so diagnostics should go to stderr.
MCP client configuration
Example for a client that accepts a local stdio server configuration (replace paths for your machine):
{
"mcpServers": {
"universal-device": {
"command": "C:/path/to/project/.venv/Scripts/universal-device-mcp.exe",
"args": [],
"env": {
"UDMCP_DATABASE": "C:/Users/you/AppData/Local/UniversalDeviceMCP/devices.sqlite3"
}
}
}
}On macOS/Linux, set command to the installed executable or the venv Python and use args: ["-m", "universal_device_mcp.server"]. Use absolute paths in client configuration. Restart the client after changing MCP configuration.
MCP tools
Tool | Purpose |
| Check installed transports and host prerequisites without starting a hardware scan. |
| Scan selected or all installed transports; each adapter reports its own errors. |
| Scan BLE, local mDNS TCP/UDP services, wireless ADB services and paired iOS Bonjour services. |
| Pair and connect only to endpoints currently advertised by ADB mDNS. |
| List locally remembered profiles. |
| Start or stop background USB, HID, serial and ADB monitoring. Monitoring starts automatically by default. |
| Read persistent connect/disconnect events after a cursor. |
| Return stored identity/interfaces and query transport-specific details. |
| Open or release a persistent USB, HID, serial, TCP or UDP interface session. |
| Generic low-level transport I/O; iOS commands use an argv array and are pinned to the selected UDID. Bytes use hexadecimal strings; an open session can be reused where supported. |
| Decode common byte views and compare samples; outputs are hypotheses, not protocol identification. |
| Append an explicit hypothesis or confirmed finding. |
| Edit saved name and metadata; the physical fingerprint and transport stay fixed. |
| Return profile, discoveries and recent experiment history. |
| Export one complete profile as JSON text. |
| Delete one profile, discoveries and experiments. |
| Show the optional local restrictions file currently applied to communication. |
With the official MCP SDK, tools that return objects provide structured MCP output as well as readable text for clients that only consume text. The dependency-free compatibility runtime returns JSON as readable text. Read-only resources are available at udmcp://devices and udmcp://devices/{device_id}/profile; the latter contains that device's saved profile, discoveries and experiment history.
Generic communication examples
First call discover_devices, then use the returned device_id and interface_id values. Inspect interfaces before communicating; do not guess endpoint addresses or protocol commands.
For cable-free Android access, enable Developer options → Wireless debugging on the phone and put it on the same Wi-Fi network as the computer. Call discover_wireless_devices; when the phone shows a pairing service, pass its exact endpoint and the six-digit code shown on the phone to pair_android_over_wifi. Then discover again and call connect_android_over_wifi with the advertised TLS connect endpoint. The device must authorize the workstation; afterward it appears in ordinary ADB discovery and supports the same inspection and shell tools as a USB-connected phone. The server does not scan arbitrary IP addresses. Android's official ADB guidance requires pairing and mDNS discovery on the same network: Wireless debugging requirements.
BLE devices can also be discovered with discover_wireless_devices or discover_devices(transports=["bluetooth"]). Use inspect_device to enumerate GATT services and characteristics, then communicate with the characteristic UUID as the interface. This supports BLE GATT; Bluetooth Classic profiles require a separate adapter.
iPhone and iPad
Install the [ios] extra and the host components listed above, then connect the device by USB. discover_devices(transports=["ios"]) uses pymobiledevice3 usbmux list to find iOS devices. If usbmux cannot provide lockdown access, the adapter also attempts a read-only Apple USB descriptor scan through PyUSB; this can identify an attached Apple device while locked, but only basic descriptors are available and USB Restricted Mode, the host driver, or the OS may prevent even that. It never bypasses the device passcode or trust prompt.
After unlocking the device and approving Trust This Computer, call inspect_device for lockdown information. discover_wireless_devices also lists Apple mobdev2 Bonjour advertisements when this computer already has the required pairing record. To use another documented pymobiledevice3 operation, call communicate with interface_id="ios-cli", operation="execute", and options={"argv": ["apps", "list"]}. The server launches the installed CLI without a shell and fixes the target UDID. These commands can modify device state; use the specific operation the owner requested. iOS does not provide an Android-style arbitrary shell, and some developer services on iOS 17+ require a developer tunnel and Developer Mode.
Serial write: operation="write", data_hex="48454c500a", options such as {"baudrate": 115200}. Serial read: operation="read", options {"baudrate": 115200, "length": 128}. Serial sessions also accept bytesize, parity, stopbits, xonxoff, rtscts, and dsrdtr where the OS driver supports them.
USB endpoint read: operation="read", options {"endpoint": "0x81", "length": 64}. USB write uses the device-reported OUT endpoint and a deliberate hex payload. Control transfers use control_read or control_write, with bmRequestType, bRequest, and optional wValue/wIndex; a control write also needs data_hex. If an interface is in a non-active USB configuration, open it with set_configuration=true to explicitly switch configurations before claiming it; one-shot transfers do not switch configurations.
For serial, USB, HID, TCP and UDP transports that support persistent handles, call open_interface once and pass the returned session_id to each communicate call. Call close_interface when finished. Sessions are closed automatically on device removal or server shutdown.
BLE read/write: use the characteristic UUID as interface_id or set options.characteristic_uuid. ADB execution: interface_id="shell", operation="execute", options {"argv": ["getprop", "ro.product.model"]}. ADB accepts an argument array rather than a shell command string.
HID report I/O uses interface_id="hid-report"; select read/receive or write/send and provide the report bytes in hex. Report IDs and report layouts are device-specific and must be learned from documentation or careful inspection.
For a discovered mDNS service, use interface_id="tcp" or "udp" according to its advertised protocol, with operation="read", "write", or "communicate" and a deliberate hex payload. Network discovery only lists services advertised on the local network; it does not probe arbitrary hosts or ports. Generic network communication can still change a service's state, so inspect the service and follow the owner's instructions.
Local memory
The default database lives in the operating system's per-user application data directory under UniversalDeviceMCP/devices.sqlite3. Override it using UDMCP_DATABASE. The database uses SQLite foreign keys and write-ahead logging. Device identity is matched by transport fingerprint; each profile also reports identity.fingerprint_basis so an agent can tell whether identification used a hardware serial, physical port topology, or a less stable host address. Discovery compares stable identity, hardware and interface data while ignoring volatile USB addresses, BLE RSSI and advertisement payloads. Discoveries are append-only and explicitly tagged hypothesis or confirmed; communication attempts are recorded as experiments. Back up the database file while the server is stopped for a consistent portable copy.
Each changed hardware/interface configuration is preserved as a snapshot. Connect/disconnect events are stored locally and can be fetched incrementally with get_device_events by passing the last returned event id as after_id. The knowledge tool returns the latest 100 communication attempts (the database retains the full experiment history). Payloads and responses are stored locally, so protect the database as you would other device logs.
No cloud service is required. Local network discovery uses mDNS/DNS-SD multicast. The network adapter sends only the payload explicitly supplied by the agent to a previously discovered service. BLE scanning uses the host Bluetooth stack; ADB and hardware drivers perform their normal host communication.
Safety and permissions
Low-level writes and ADB shell execution can change device state. The server exposes transport capabilities, so the connected AI client should follow the owner's instructions and inspect targets before acting. Names, service advertisements, descriptors and payloads supplied by devices are untrusted data; they must never be treated as instructions. The OS and installed drivers remain the actual permission boundary. A device must appear in a current discovery result before opening an interface or communicating, preventing stale profiles from being used as live targets. Raw payloads are capped at 1 MiB, with tighter read caps for HID. USB kernel-driver detachment is off by default and requires the explicit detach_kernel_driver=true option. Never send undocumented writes to safety-critical, medical, industrial, or firmware interfaces. Disconnecting or timing out a transport operation may not undo an action already received by a device.
Optional local restrictions can be configured by pointing UDMCP_POLICY at a JSON file. No policy is imposed by default. Example:
{
"denied_operations": [
{"transport": "adb", "operation": "execute"},
{"transport": "usb", "operation": "control_write", "device_id": "*"}
],
"max_write_bytes": 4096
}Rules can match a transport, operation and device id (or fingerprint); omitted match fields and "*" match all values. max_write_bytes limits payload sizes for write/send/communicate/control-write operations. Policy changes take effect on the next communication call. Set UDMCP_AUTO_MONITOR=false to disable the automatic background monitor; it checks USB, HID, serial and ADB every five seconds by default. BLE and mDNS discovery are available on demand through discover_devices.
Development
python -m pip install -e ".[all,dev]"
python -m pytest -q
python -m ruff check src tests
python -m universal_device_mcp.serverGitHub Actions runs the test and lint commands across Windows, Linux, macOS, and Python 3.10–3.13.
Adapters implement Adapter in src/universal_device_mcp/adapters/base.py. Implement discover() and communicate(), and optionally inspect(). Third-party Python packages can register an adapter factory through the universal_device_mcp.adapters entry-point group; the server loads these plugins automatically and reports load failures as discovery errors. Optional dependencies should be imported inside adapter methods so one missing library does not prevent other transports from starting.
For a Python package using setuptools, register the factory in its pyproject.toml:
[project.entry-points."universal_device_mcp.adapters"]
my_transport = "my_package.adapter:MyAdapter"MyAdapter can be an Adapter subclass or a compatible object that exposes transport, discover() and communicate(). Its factory is called with no arguments.
Troubleshooting
No USB devices: install the optional extra and a supported libusb backend; check driver ownership and OS permissions. Some keyboards, storage devices and system devices should not be claimed through libusb.
No serial ports: install a device driver, check the selected port and OS group/permission, and close other applications using the port.
HID errors: install the
hidextra and check that the OS permits access to the selected report interface.BLE errors: ensure Bluetooth is enabled and grant application permission in the OS. BLE availability differs by OS and adapter.
No local network services: install the
networkextra; only mDNS/DNS-SD-advertised TCP/UDP services are found.iPhone/iPad is missing: install the
[ios]extra. Windows requires Apple's Mobile Device Support (provided by the classic iTunes installer); Linux requires a runningusbmuxd; macOS uses its system service. Unlock the device and accept Trust This Computer for detailed lockdown access. Before that, only usbmux discovery or best-effort USB descriptors may be available, subject to the OS, cable, USB permissions and backend.ADB shows unauthorized/offline: the device remains visible in discovery with its state, but no shell interface is exposed until it reaches the authorized
devicestate. Unlock the phone and accept its USB debugging prompt.MCP server will not start: verify the client launches the same Python environment where the
mcppackage is installed; inspect the MCP client's stderr/logs.Profile database location: set
UDMCP_DATABASEto an absolute writable file path.
Roadmap
Structured USB HID report-descriptor parsing, discovery of non-advertising network devices, Bluetooth Classic, camera/microphone OS APIs, broader protocol/documentation knowledge sources, GUI, and richer import workflows remain planned. Automatic proprietary protocol discovery is inherently uncertain and is not claimed as a completed feature.
License
MIT. See LICENSE.
Available Tools
20 toolsanalyze_payloadARead-onlyIdempotent
Inspect generic bytes and optionally compare a sample with a baseline.
Returns common text and integer views, entropy, changed offsets, and cautious hypotheses. This is analysis, not protocol identification; save validated findings separately.
| Name | Required | Description | Default |
|---|---|---|---|
| data_hex | Yes | ||
| baseline_hex | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real value beyond that: it discloses that results are 'cautious hypotheses' rather than conclusions and that findings should be persisted elsewhere, which is important framing for interpreting output.
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?
Three short sentences, front-loaded with the core action, followed by outputs and then the scope caveat. No filler; every sentence adds distinct 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?
An output schema exists, so return values need not be spelled out, and the description still summarizes output categories and the reliability caveat. With only two parameters (one optional) and full annotation coverage, the main remaining gap is input format guidance, which is minor.
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. It conveys that the second parameter is an optional baseline for diffing, but never states the expected encoding/format of the inputs beyond what the parameter names ('Data Hex', 'Baseline Hex') imply. Partial compensation, not full.
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 ('inspect generic bytes', 'compare a sample with a baseline') and enumerates the outputs it produces (text/integer views, entropy, changed offsets, hypotheses). It also draws a boundary against protocol identification, so an agent can tell this is low-level byte analysis rather than a device/protocol tool like its siblings. Not quite a 5 because no sibling is named directly.
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?
Explicitly says baseline comparison is optional and clarifies the tool's role ('this is analysis, not protocol identification; save validated findings separately'), which implies when to use it and what to do afterwards. It stops short of contrasting against a named alternative tool, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_interfaceB
Close a previously opened interface session and release its operating-system handle.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the side effect (releasing an OS handle), which is genuinely useful. It does not cover idempotency, error behavior for an unknown/stale session id, or what happens to dependent device connections — significant gaps for a mutation-style teardown with zero 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?
One sentence, zero waste, with the action and its effect front-loaded. Nothing is buried or 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?
An output schema exists, so return values need not be explained, and the effect of closing is stated. But with no annotations and an undocumented parameter, the description should say more about failure modes and session lifecycle to be complete for a teardown operation.
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% and the single required parameter session_id has no documentation anywhere. The description reuses the word 'session', giving a loose semantic tie, but adds no format, source, or lookup guidance for the identifier an agent must supply.
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 ('Close a previously opened interface session') and adds the concrete effect ('release its operating-system handle'). The word 'previously' implicitly pairs it with the open_interface sibling, but the sibling is never named, so differentiation requires inference.
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?
'Previously opened' implies the precondition that a session must exist, and the sibling open_interface is the obvious counterpart. However, the description never names the alternative, states what to do if no session exists, or warns about closing sessions still in use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
communicateA
Perform a generic transport operation. Payload bytes are supplied as hexadecimal.
Serial supports read/write/send/receive. USB supports read/write plus control_read and control_write; endpoints, lengths and USB control setup fields belong in options. BLE supports read/write using a characteristic UUID. ADB supports execute with argv in options. iOS supports lockdown inspection and pymobiledevice3 commands through argv, with the selected UDID pinned by the adapter and no shell. Pass session_id from open_interface to reuse a persistent session. Transport access may change device state; target and payload must be deliberate.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| data_hex | No | ||
| device_id | Yes | ||
| operation | Yes | ||
| session_id | No | ||
| interface_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it does disclose that 'transport access may change device state' and that iOS runs with no shell and a pinned UDID, which is genuine behavioral context beyond the schema. However, it says nothing about preconditions (pairing/authorization), timeouts or blocking behavior, or what failures look like for a tool that can poke hardware directly.
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?
It front-loads the general purpose, then spends one tight clause per transport, then closes with the session-reuse and state-change caveats. Dense but every clause carries distinct information; no 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 six-parameter, five-transport tool, this covers the operation vocabulary, options contents, session reuse, and a mutation warning, and an output schema exists so return values need not be spelled out. What remains thin is error/partial-failure behavior and the preconditions implied by the pairing siblings.
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, and it largely does: data_hex is defined as payload bytes in hexadecimal, options is described as carrying endpoints, lengths, USB control setup fields, or argv, and session_id is sourced from open_interface. device_id and interface_id are only implied by 'target', which is the remaining gap across the six 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 names a concrete verb+resource ('Perform a generic transport operation') and then enumerates the actual operations per transport (serial read/write/send/receive, USB control_read/control_write, BLE characteristic read/write, ADB execute, iOS lockdown/pymobiledevice3), which lets an agent see what it really does despite the vague name. It also ties itself to the open_interface/close_interface lifecycle, distinguishing it from those siblings, though it never names a sibling it must not be confused with.
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 clear per-transport usage context — which operations each transport supports and where endpoint/length/USB setup fields or argv belong — plus the rule to pass session_id from open_interface for a persistent session. That is strong routing guidance for the operation parameter, but there are no explicit exclusions (e.g. when to prefer inspect_device or analyze_payload over communicating).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_android_over_wifiB
Connect to an Android TLS ADB service currently advertised by ADB mDNS.
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does disclose a real behavioral constraint — the target must be an mDNS-advertised TLS ADB service — but says nothing about whether connection requires prior pairing/authorization, whether the device becomes persistently registered, whether it is idempotent, or how failures (stale advertisement, TLS handshake rejection) surface.
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 front-loaded sentence with no filler; the key qualifier (must be currently advertised) is placed where it will be read first. It is arguably too terse for a tool with an ambiguous required argument, but nothing in it is wasted.
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 no explanation, but for a connection tool with zero annotation coverage and one undocumented required parameter the description leaves critical gaps: endpoint format, pairing prerequisite, and side effects on device state. An agent could not confidently invoke it without guessing.
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% and the only parameter, `endpoint`, is a bare string with no format hint. The description hints the value comes from an mDNS advertisement but never says whether it is a service instance name, host:port, or a serial — a caller cannot reliably construct it from this text.
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 (Connect) and a specific resource (an Android TLS ADB service), plus a qualifying scope: only services currently advertised via ADB mDNS. This is materially clearer than the bare tool name and separates it from generic discovery tools, though it never names the sibling it must be sequenced around (pair_android_over_wifi).
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?
"Currently advertised by ADB mDNS" implies the precondition that discovery must have happened and that the service must still be live, which is useful implicit guidance. But there is no explicit when-to-use, no statement of whether pairing is a required predecessor, and no exclusion relative to pair_android_over_wifi or discover_wireless_devices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_devicesA
Discover connected devices using available USB, serial, BLE, Android ADB and iOS adapters.
Optionally restrict transports to usb, hid, serial, bluetooth, adb, ios or network. Optional adapter dependencies and OS access errors are reported per transport without stopping other scans.
| Name | Required | Description | Default |
|---|---|---|---|
| transports | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that adapter dependency and OS access errors are reported per transport without stopping other scans, which is important failure semantics. However, it does not state whether discovery is read-only, what permissions are needed, or whether it has side effects.
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 sentences, front-loads the core purpose, and uses the second sentence efficiently for transport restriction and error behavior. There is no redundant or empty phrasing.
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. The single optional parameter is semantically covered, and partial-failure behavior is disclosed. The main remaining gap is lack of tool-selection guidance against similar discovery/list siblings.
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 so by explaining that the transports parameter optionally restricts scanning and by listing valid transport values (usb, hid, serial, bluetooth, adb, ios, network), adding meaning beyond the bare anyOf schema.
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 — discovering connected devices — and enumerates the transport types it covers (USB, serial, BLE, ADB, iOS). It is clear in isolation, but it does not explicitly distinguish itself from the sibling discover_wireless_devices or list_known_devices.
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 guidance on when to use this tool versus alternatives such as discover_wireless_devices, list_known_devices, or start_device_monitor. The only usage-like detail is the optional transport restriction, which is parameter behavior rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_wireless_devicesB
Discover BLE/local mDNS services, wireless Android ADB and paired iOS mobdev2 services.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and largely fails it. It does not say whether the scan is blocking or how long it runs, whether BLE/mDNS require host permissions or an enabled radio, or whether results are cached versus live — all material for a zero-argument discovery 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?
A single front-loaded sentence with no filler. Every clause names a distinct transport/protocol target and nothing is redundant.
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 no explanation, and there are no parameters to document. What is missing is the operational context: scan duration/blocking behavior, permission requirements, and how this differs from discover_devices — meaningful gaps for a discovery primitive in a large sibling set.
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 no parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; the enumerated protocols in the description are a bonus rather than a necessity.
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?
Specific verb ("Discover") plus an enumerated set of resources: BLE/mDNS services, wireless Android ADB, and paired iOS mobdev2 services. The agent knows exactly what classes of device/transport this covers. It loses the top score because it never distinguishes itself from the near-identically named sibling discover_devices, leaving the boundary ambiguous.
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?
No statement of when to use this versus discover_devices, list_known_devices, or remember_discovery, and no prerequisites (e.g. that pairing must happen afterward). The agent must infer the workflow position entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_device_profileBRead-onlyIdempotent
Export a complete device profile as JSON text for backup or sharing.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and closed-world scope, so safety is covered. The description adds that output is serialized JSON text suited to backup/sharing, which is genuine extra context, but it says nothing about permissions, whether the device must be known/paired, or size limits of the export.
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 twelve-word sentence that front-loads the verb and resource with zero wasted phrasing. The format and use case follow immediately with no 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?
An output schema exists, so return values need not be described, and annotations cover the safety profile. For a one-parameter read-only export, the main remaining gap is device identifier provenance, which is a moderate but not severe omission.
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 single parameter device_id has 0% schema description coverage and the description never mentions it, so nothing clarifies what identifier form is expected or whether the device must first appear in list_known_devices. The description entirely fails to compensate 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?
States a specific verb (export), resource (device profile), and output format (JSON text), which distinguishes it from read-oriented siblings like inspect_device or get_device_knowledge. It does not explicitly name which sibling to use instead, so it falls short of full sibling differentiation.
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?
"for backup or sharing" implies the scenario in which to use this tool, but there is no explicit when-not guidance and no named alternative (e.g., inspect_device for read-only viewing, update_device_profile for the inverse operation). Usage must be inferred from the stated intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forget_deviceADestructive
Permanently delete one device profile and its saved discoveries and experiments.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds genuinely new behavioral context: the deletion cascades to saved discoveries and experiments, and it is permanent. It does not say how a missing/unknown device_id is handled (error vs silent no-op), which is the main remaining gap for a non-idempotent delete.
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 sentence, zero waste, with the destructive nature front-loaded so the agent sees the risk before the details. Nothing to trim.
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 no explanation, and the annotations cover the safety profile. What's missing is small but real: how to source device_id and what happens on an unknown id, which matter for an irreversible single-parameter delete.
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?
Only one parameter (device_id) exists and schema description coverage is 0%, so the schema gives no clue about its format or provenance. The description only implies it identifies a single device profile; it never says where to obtain the id (e.g., list_known_devices) or what form it takes.
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 ('permanently delete') and resource ('one device profile') plus the cascade scope ('its saved discoveries and experiments'), which clearly separates it from read-only siblings like list_known_devices and non-destructive ones like update_device_profile. It stops short of naming a sibling alternative, so it lands at 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?
There is no guidance on when to use this versus update_device_profile, export_device_profile, or simply leaving a device unpaired. A high-stakes irreversible operation would especially benefit from a note like 'export_device_profile first if you need to retain history' — that is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_access_policyARead-onlyIdempotent
Show the optional local policy from UDMCP_POLICY; absent policy leaves operations unrestricted.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/non-destructive profile, and the description adds real value beyond them: the policy source (UDMCP_POLICY) and the crucial semantics that an absent policy means unrestricted operation. It stops short of saying whether the returned policy is raw text or parsed rules.
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 front-loaded sentence with no filler; the source and the absent-policy semantics are packed into one clause each.
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-value detail is unnecessary, and the description covers the source and the meaning of an empty result. The only gap is what the policy actually controls or which operations it can restrict.
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 spends no words on 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?
States a specific verb (Show) and a specific resource (the optional local policy from UDMCP_POLICY). No sibling tool deals with policy, so it is distinguishable, though 'UDMCP_POLICY' is an unexplained identifier an agent may not recognize as an environment variable.
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 only implied — an agent infers it should call this to inspect whether a local policy constrains operations. There is no explicit when-to-use, when-not, or reference to alternatives, though the sibling set offers no competing policy tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_device_eventsARead-onlyIdempotent
Read persistent connect/disconnect events; pass the last event id to fetch new events.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| after_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is fully covered. The description adds two pieces of real context — events are persistent (retained, so historical fetches are valid) and idempotent-by-cursor polling — but says nothing about retention window, ordering, or volume of events returned.
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 front-loads what is read and then gives the operational instruction. No filler, nothing to cut.
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?
The output schema exists, so return-value explanation is not needed, and the cursor mechanic is covered. Still, an agent cannot tell from the description how far back events persist, whether they arrive in ascending order, or what limit does — gaps that matter for a polling 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 carry the parameter burden. It explains after_id well (cursor to the last seen event id), but 'limit' is never mentioned and its default of 100 and bounds are undocumented in both places.
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 — reading persistent connect/disconnect events — which is clearly distinct from every sibling (no other event-stream tool exists; start/stop_device_monitor are about monitoring, not reading history). It does not explicitly name how it relates to the monitor tools, but the resource itself disambiguates.
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?
'Pass the last event id to fetch new events' implies the polling/cursor usage pattern, which is genuinely useful guidance. However, it gives no when-to-use vs. when-not, and does not say whether this should be used instead of or alongside start_device_monitor for live event capture.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_device_knowledgeCRead-onlyIdempotent
Read all retained discoveries and the recent communication experiment history.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds that results include retained findings plus recent experiment history, which is useful content disclosure, but it does not say how "recent" is bounded, whether results are truncated, or what happens for an unknown device.
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 no filler, front-loaded with the verb. It is slightly compressed to the point of ambiguity ("all" discoveries vs "recent" history), but nothing is wasted.
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 annotations cover safety. Still, for a read tool with one undocumented parameter, the description leaves gaps around scope, recency bounds, and behavior on invalid device IDs.
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% for the single required device_id, and the description never mentions it. It does not clarify whether the ID must be a previously discovered/paired device or what format is expected, so the description fails to compensate for the documentation 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 verb ("Read") and a resource, but the resource is expressed in internal jargon ("retained discoveries", "communication experiment history") that an agent cannot map onto concrete data without prior knowledge of this server. It also gives no signal distinguishing it from siblings like get_device_events or inspect_device, which sound related.
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 versus alternatives such as inspect_device, get_device_events, or list_known_devices, and no prerequisites or exclusions. An agent must guess based on the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_runtime_statusARead-onlyIdempotent
Report runtime, adapter, optional-library and host-tool availability without scanning hardware.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive behavior, and closed-world scope. The description adds useful context that it reports availability without scanning hardware, which is a meaningful behavioral constraint beyond the 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 efficient sentence with no wasted words. The core action and non-scanning constraint are front-loaded.
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 parameters, rich annotations, and an output schema, the description provides enough context for correct invocation. Return value details are appropriately left to the output schema.
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 zero parameters, so there is no parameter semantics burden. A baseline of 4 is appropriate for a parameterless tool.
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 gives a specific verb and resource set: report runtime, adapter, optional-library, and host-tool availability. It also distinguishes the behavior from hardware scanning, though it does not explicitly name a sibling tool it replaces.
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 'without scanning hardware' implies the tool is useful when checking environment readiness without device discovery, but it does not state explicit when-to-use or when-not-to-use conditions. No sibling alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_deviceBRead-onlyIdempotent
Inspect known device details and transport-specific interfaces/services.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is fully covered. The description adds the useful detail that results span device details and transport-specific interfaces/services, but says nothing about failure behavior for unknown device IDs or result size.
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 sentence, front-loaded with the verb and resource, with zero filler. Nothing to trim.
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. However, with 0% parameter coverage and many overlapping siblings, the definition leaves gaps about when this tool beats list_known_devices or get_device_knowledge and what happens with an unknown or stale device_id.
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 single parameter is documented only as 'Device Id'. The description's 'known device' phrasing implies the ID must reference a previously discovered device, which adds meaning beyond the schema, but no format, source, or error semantics are given.
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 (inspect) and resource (known device), plus the scope of returned content (device details and transport-specific interfaces/services). This distinguishes it from discovery siblings like discover_devices, though it does not clearly separate it from list_known_devices or get_device_knowledge.
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 word 'known' implies the device must already have been discovered, but the description never says when to call this versus list_known_devices, get_device_knowledge, or get_device_events. There are no explicit alternatives or exclusions, leaving the agent to infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_known_devicesARead-onlyIdempotent
List device profiles saved in the local knowledge database.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description usefully clarifies that results come from the local store rather than a network scan, but adds nothing on ordering, staleness, or empty-store behavior; with an output schema present, return format need not be 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 front-loaded sentence with no filler. The key scoping fact — local knowledge database — is placed where it is read first.
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 list tool with a full output schema and complete annotations, the description covers the essentials. It could go further by noting whether entries persist across sessions or how they get there (remember_discovery), but nothing required for a correct call 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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. Schema coverage is also 100%.
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 (List) and resource (device profiles), and scopes it to the local knowledge database, which distinguishes it from live-scan siblings like discover_devices or discover_wireless_devices. It does not explicitly name or contrast with get_device_knowledge or inspect_device, so sibling differentiation is only partial.
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 name and by 'saved in the local knowledge database' — this is the persisted-inventory read versus live discovery — but the description never states when to prefer it over get_device_knowledge or inspect_device, nor any prerequisites for the database being populated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_interfaceC
Open a persistent USB, HID, serial, TCP or UDP interface and return its session id.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | ||
| device_id | Yes | ||
| interface_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the interface is persistent and returns a session id, but does not explain permissions, side effects, session lifecycle, failure behavior, or what the options parameter controls.
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 front-loaded sentence with no waste. It states the action, supported transports, persistence, and return value efficiently.
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. But for a three-parameter connection tool with no annotations and no schema parameter descriptions, the definition omits critical context about prerequisites, options, session handling, and error conditions.
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% across three parameters. The description does not explain device_id, interface_id, or options, and the transport list only loosely hints at interface types without giving parameter-level meaning.
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 and resource: 'Open a persistent ... interface' and names supported transports and the returned session id. It distinguishes opening from sibling tools like close_interface and communicate by implication, but does not explicitly name those alternatives.
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: open an interface to obtain a persistent session id for subsequent communication. However, the description does not state when to call this versus discover_devices, communicate, or close_interface, nor does it mention prerequisites such as prior discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pair_android_over_wifiA
Pair Android Wireless Debugging using a six-digit code shown by the owner on the device.
The endpoint must currently be advertised by ADB mDNS as a TLS pairing service. The code is passed through stdin to adb and is not saved in device memory or experiment history.
| Name | Required | Description | Default |
|---|---|---|---|
| endpoint | Yes | ||
| pairing_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does add meaningful context: pairing requires an owner-shown code, the endpoint must be currently advertised, and the code is passed via stdin and not persisted. It still omits post-pairing side effects and failure behavior, but the security-sensitive handling is explicitly covered.
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 three short sentences, front-loads the core operation, then adds prerequisite and security handling. Every sentence contributes useful information without repetition.
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?
The output schema covers return values, and the description covers the key prerequisite and code handling. However, for a two-parameter tool with 0% schema description coverage and no annotations, the missing endpoint format and lack of workflow sequencing leave gaps an agent must infer.
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 explain both parameters. It adds useful meaning for pairing_code as a six-digit owner-visible code and for endpoint as an ADB mDNS-advertised TLS pairing service, but it does not specify the endpoint format or give examples.
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 action and resource: pairing Android wireless debugging using a six-digit code. It distinguishes itself implicitly from connect_android_over_wifi by focusing on the pairing step and the ADB mDNS TLS pairing prerequisite.
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 states a clear prerequisite: the endpoint must currently be advertised by ADB mDNS as a TLS pairing service. However, it does not explicitly route the agent through discover_wireless_devices first or name connect_android_over_wifi as the follow-up step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remember_discoveryC
Append knowledge to a device profile with confidence='hypothesis' or 'confirmed'.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | agent | |
| content | Yes | ||
| category | Yes | ||
| device_id | Yes | ||
| confidence | No | hypothesis |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Append' implies a mutation, but it does not explain permissions, reversibility, duplicate handling, or what happens to existing profile knowledge when new content is appended.
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 front-loaded sentence with no wasted words. It is efficient, though its brevity contributes to under-specification elsewhere rather than being a flaw of conciseness itself.
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 five-parameter mutation tool with no annotations and 0% schema description coverage, the description is too sparse. An output schema exists, so return values need not be explained, but the input semantics and behavioral implications are largely 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 description coverage is 0%, and four of the five parameters (device_id, category, content, source) receive no semantic explanation. The description adds meaning only for confidence by naming two accepted values, but that is far short of compensating for the undocumented 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 and resource: append knowledge to a device profile. It is distinguishable from retrieval siblings like get_device_knowledge, but does not explicitly contrast with update_device_profile or forget_device.
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 no guidance on when to use this tool versus get_device_knowledge, update_device_profile, or other knowledge-management siblings. The confidence values are mentioned, but not the conditions for choosing between them or when appending is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_device_monitorC
Start automatic USB, HID, serial and ADB connect/disconnect monitoring in this server.
| Name | Required | Description | Default |
|---|---|---|---|
| interval_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 hints that monitoring is a server-side background activity ('in this server') but says nothing about whether the call returns immediately or blocks, what happens if monitoring is already running, whether it is idempotent, or how events surface (presumably via get_device_events).
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 sentence with no filler and the scope stated up front. It is efficient, though the terseness is part of why behavior and parameter details are missing.
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, but for a stateful background-process tool with no annotations and an undocumented interval parameter, the description omits lifecycle, side effects, and event-retrieval context that an agent needs before starting a monitor.
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 single parameter interval_seconds has 0% schema description coverage (only a default of 5), and the description never mentions polling frequency or its units/valid range. With one undocumented parameter the description should compensate, and it does not.
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 ('Start') and a well-scoped resource ('automatic USB, HID, serial and ADB connect/disconnect monitoring in this server'), which clearly separates it from one-shot siblings like discover_devices. It does not explicitly name stop_device_monitor or get_device_events as counterparts, so sibling differentiation is implied rather than stated.
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?
'Automatic ... monitoring in this server' implies continuous background watching as opposed to a one-off discover_devices call, so the usage context is inferable. However, there is no explicit when-to-use/when-not, no mention of pairing with stop_device_monitor, and no statement about how observed events are retrieved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_device_monitorB
Stop automatic device connection monitoring.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and falls short. It does not say whether the call is idempotent, what happens if monitoring was never started, whether in-flight or queued device events are discarded, or whether the change is reversible without restarting.
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 short sentence with no waste, and the operative verb is front-loaded. It is lean to the point of under-specification rather than verbose, but nothing needs trimming.
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 no explanation, and there are no parameters to document. What is missing is state-transition context for a mutating control call: the no-op/precondition behavior and the effect on event collection, which matter given the absence of 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?
The tool takes zero parameters, so the baseline is 4. There is nothing extra the description could meaningfully add about inputs, and it correctly does not invent any.
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 ('Stop automatic device connection monitoring'), so the effect is unambiguous. It does not explicitly name its counterpart start_device_monitor, which is the only other monitoring-control sibling, so differentiation is left implicit.
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 word 'Stop' implies this only applies when monitoring was previously started, which is a reasonable implied usage context. However, there is no explicit when-to-use, no prerequisite check, and no mention of start_device_monitor or get_device_events as related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_device_profileA
Edit a saved profile's name, identity, hardware metadata or interface list.
Identity and hardware objects are merged with existing values; interfaces are replaced. Device fingerprint and transport cannot be edited because they identify the physical target.
| Name | Required | Description | Default |
|---|---|---|---|
| updates | Yes | ||
| device_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it delivers the most important behavior: identity and hardware are merged while interfaces are replaced wholesale, with fingerprint and transport immutable and a stated reason (they identify the physical target). Missing are error behavior for an unknown device_id and any permission/auth requirements, but the merge-vs-replace distinction is genuinely high-value disclosure a caller could not infer.
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?
Three short sentences, front-loaded with the scope, then the merge/replace rule, then the immutability constraint. No filler and each sentence carries distinct 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?
The output schema covers return values, and the description covers mutation semantics, merge behavior, and immutability — the core gaps for an unannotated write tool. Remaining shortfall is failure modes (unknown device, invalid keys inside 'updates') and permission requirements, which matter for a mutation with no 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 coverage is 0% and 'updates' is an unconstrained additionalProperties object, so the description must compensate, which it largely does by naming the four accepted categories and explicitly listing the two keys that must not be sent. It still leaves the internal field names of the identity and hardware objects unspecified.
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 (edit) and a precise resource (a saved device profile), then enumerates the editable facets: name, identity, hardware metadata, interface list. That is enough to separate it from inspect_device, export_device_profile, forget_device, and the discovery siblings, 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?
Usage is implied by the mutation framing and by the exclusion of fingerprint/transport fields, which tells the agent this is not the tool for re-identifying a device. There is no explicit 'use this when…' or 'for X use Y instead', and no prerequisites about the profile having been saved or the device being known.
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.
20 tool updates
v0.1.0- First observed
analyze_payload - First observed
close_interface - First observed
communicate - First observed
connect_android_over_wifi - First observed
discover_devices - First observed
discover_wireless_devices - First observed
export_device_profile - First observed
forget_device - First observed
get_access_policy - First observed
get_device_events - First observed
get_device_knowledge - First observed
get_runtime_status - First observed
inspect_device - First observed
list_known_devices - First observed
open_interface - First observed
pair_android_over_wifi - First observed
remember_discovery - First observed
start_device_monitor - First observed
stop_device_monitor - First observed
update_device_profile
TDQS
Scored across 20 tools
Most tools have clearly distinct targets: discovery, monitoring, profile management, interface sessions, and payload analysis are separable. The main overlap is between discover_devices and discover_wireless_devices, since discover_devices can also include wireless transports, and communicate/open_interface boundaries require reading descriptions carefully.
Names are consistently snake_case and mostly follow a verb_noun convention such as discover_devices, get_runtime_status, and update_device_profile. The only notable deviation is the verb-only name communicate, which is still understandable but breaks the pattern slightly.
Twenty tools is somewhat heavy but defensible for a universal device server spanning discovery, monitoring, Android wireless workflows, interface sessions, profile knowledge, and payload analysis. Each tool has a meaningful role, though the surface is larger than the typical 3-15 tool range.
The set covers the core lifecycle well: discovery, monitoring/events, device inspection, interface open/close, communication, profile CRUD/export, and knowledge retention. Minor gaps remain, such as policy mutation, granular deletion of discoveries/experiments, or a more generic device connection abstraction beyond Android wireless.
Maintenance
Related MCP Connectors
Connect AI assistants to authorized Windows and macOS devices for files, commands, and management.
Connect your AI to your own devices, 3D printers, factory tools and a shared agent task pool.
Run, build, and validate firmware on virtual hardware from your AI agent. Hardware knowledge corpus.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to communicate with UART/serial devices, offering tools for port management, data read/write, and protocol handling.MIT
- AlicenseNot gradedqualityCmaintenanceEnables cloud LLM agents to discover and invoke physical hardware on edge and IoT devices through standard MCP tools, bridging constrained device channels like UART, BLE, and Wi-Fi.23 PyPI3MIT
- AlicenseAqualityCmaintenanceEnables AI agents to communicate with serial devices such as Arduinos, ESP32s, USB-UART adapters, and RS-232 instruments by discovering ports, opening connections, sending commands, reading responses, and controlling reset lines.121MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to manage MicroPython and CircuitPython boards over USB, including listing boards, browsing and editing files, running Python code, resetting boards, and installing firmware.219 npm7MIT