io.github.tinqiao-oss/clawtouch-mcp
PYPI · CLAWTOUCH-MCP · SCANNED SEP 21
USB-HID keyboard/mouse (Pico 2, open firmware) as MCP tools; --mock runs with no hardware
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security94
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 1 of 1 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency35
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 6 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability66
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 2715 tokens (~169/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
- Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage77
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 31% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities20
- Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28. See how to fix → Fail
How do I install the io.github.tinqiao-oss/clawtouch-mcp server?
io.github.tinqiao-oss/clawtouch-mcp runs locally as a PyPI package, launched with uvx clawtouch-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · clawtouch-mcp
claude mcp add tinqiao-oss-clawtouch-mcp -- uvx clawtouch-mcp
{
"mcpServers": {
"tinqiao-oss-clawtouch-mcp": {
"command": "uvx",
"args": [
"clawtouch-mcp"
]
}
}
} {
"servers": {
"tinqiao-oss-clawtouch-mcp": {
"command": "uvx",
"args": [
"clawtouch-mcp"
]
}
}
} codex mcp add tinqiao-oss-clawtouch-mcp -- uvx clawtouch-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"tinqiao-oss-clawtouch-mcp": {
"type": "local",
"command": [
"uvx",
"clawtouch-mcp"
],
"enabled": true
}
}
} openclaw mcp add tinqiao-oss-clawtouch-mcp --command uvx --arg clawtouch-mcp
mcp_servers:
tinqiao-oss-clawtouch-mcp:
command: "uvx"
args: ["clawtouch-mcp"] {
"McpServers": {
"tinqiao-oss-clawtouch-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"clawtouch-mcp"
]
}
}
} assistant mcp add tinqiao-oss-clawtouch-mcp -t stdio -c uvx -a clawtouch-mcp
{
"mcpServers": {
"tinqiao-oss-clawtouch-mcp": {
"command": "uvx",
"args": [
"clawtouch-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 −3
- Stability: pass → 0.80 functional
- 17 Sept 26 0
- Stability: 0.97 → pass security
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 0
- Stability: 0.90 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: fail → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. functional
- Package version: 0.5.1 → 0.5.2 functional
- 14 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed pypi/clawtouch-mcp@0.5.2
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 1 package
| Packages resolved | 1 |
|---|---|
| Stale | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
device.info ~16
Active bridge's connection + sequence info.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
device.list ~14
List candidate Pico serial ports.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
hid.batch ~521
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Run a SHORT, PRE-PLANNED sequence of HID actions (max 10) in ONE call, in strict order. This is a transport convenience for an action list you ALREADY know — e.g. clicking several fixed coordinates a solver has computed — collapsing N tool round-trips into one. It is NOT an orchestration / control-flow layer: no branching, no reading a result mid-sequence, no looping. For 'act → observe → decide → act' you still issue separate calls (an action that depends on an earlier action's outcome cannot be pre-planned into a batch). Each op is {type, ...params, delay_ms?}. Types: • click / move — (x, y, relative, button, double, move_ms); identical absolute closed-loop converge and ACK semantics to hid.click / hid.move. • button_down / button_up — (button). • key — (key, modifiers); same 'ctrl+c' shorthand as hid.key. • type — (text). • scroll — (delta). `delay_ms` pauses AFTER that op (0–2000 ms). Omit it and click/button ops get a small default gap (~50 ms) so the OS doesn't merge or drop back-to-back clicks; non-click ops default to 0. Set delay_ms explicitly (including 0) to override. Execution: ops run strictly sequentially. With stop_on_error=true (default) the run halts at the first op that fails; if any button/key was pressed before the stop, release_all fires so nothing stays held. Returns {ok (= every op ok), count, failed_index, stopped_early, released_all, results:[per-op dicts carrying the same fields the standalone tool returns — e.g. converged / clicked / chars]}. Held state is NOT auto-released on clean completion, so a batch may intentionally leave a button/key down for a follow-up call. Capped at 10 ops: this drives real input and a batch cannot be interrupted mid-run (stdio is serial), so a large blind burst is refused at the boundary.
| Name | Type | Req | Description |
|---|---|---|---|
| ops | array | yes | Up to 10 HID actions, executed in array order. |
| stop_on_error | boolean | – | Halt at the first failing op (default). false = run every op, recording failures. |
No output schema declared.
No examples provided.
hid.click ~497
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Click mouse. Default semantics: (x, y) is an ABSOLUTE screen coordinate — the server queries the OS for the current cursor position (Win32 GetCursorPos / macOS CGEventGetLocation / Linux/X11 XQueryPointer via ctypes) and emits a relative move so the firmware (which is a USB Boot Mouse and only supports relative deltas) lands at the target. Pass relative=true to skip the OS query and send (x, y) directly as a pixel delta. On Wayland and on hosts where the OS cursor query fails, absolute mode returns an error and the caller must use relative=true. Absolute mode runs a closed-loop converge (query → delta → settle, up to 10 iterations, ≤5 px tolerance) to absorb OS pointer-ballistics non-linearity (macOS scales single HID deltas ~110% in the low-speed segment, so a fire-and-forget move overshoots by 10-90 px). The returned `x`/`y` are the actual landing coordinates; `target_x`/`target_y` echo the request; `converged: true` means residual ≤5 px. The click only fires after the move succeeds — i.e. the cursor is confirmed within ≤5 px of target. If convergence fails (or the OS cursor query is unavailable), NO click is sent and the move result is returned unchanged (`ok: false` plus `converged`/`residual_x`/`residual_y`/`hint`); inspect those and retry. Optional `move_ms` switches to glide mode: the move is broken into ~10 ms HID reports over N ms (linear interpolation, then a closed-loop converge pass to clean up the final landing). Default 0 = snap mode.
| Name | Type | Req | Description |
|---|---|---|---|
| button | string | – | – |
| double | boolean | – | – |
| move_ms | integer | – | Glide mode: break the move into ~10 ms HID reports over N ms (linear interp + post-slide converge). 0 = snap mode (default, instant move). |
| relative | boolean | – | If true, x/y are pixel deltas; absolute mode is skipped. |
| x | integer | yes | – |
| y | integer | yes | – |
No output schema declared.
No examples provided.
hid.drag ~208
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Drag from (from_x, from_y) to (to_x, to_y) while holding the named button. Internally: absolute move to source → mouse_button_down → glided absolute move to destination → mouse_button_up. Matches Anthropic Computer Use's left_click_drag action. Useful for design / spreadsheet / file-manager workflows where 'press → drag → release' is the atomic UI gesture.
| Name | Type | Req | Description |
|---|---|---|---|
| button | string | – | – |
| from_x | integer | yes | – |
| from_y | integer | yes | – |
| move_ms | integer | – | Duration of the held-button move from source to destination. |
| relative | boolean | – | If true, from_x/y and to_x/y are pixel deltas, not absolute coords. |
| to_x | integer | yes | – |
| to_y | integer | yes | – |
No output schema declared.
No examples provided.
hid.hold_key ~125
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Press a key, wait duration_ms, then release. Matches Anthropic Computer Use's hold_key action. Useful for scenarios where a single tap is too short — e.g. holding an arrow key to scroll a long list, or holding Space to pan in a design app.
| Name | Type | Req | Description |
|---|---|---|---|
| duration_ms | integer | – | – |
| key | string | yes | – |
| modifiers | array | – | – |
No output schema declared.
No examples provided.
hid.hover ~206
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Move mouse to (x,y) then idle for duration_ms (no click). `duration_ms` is the IDLE time AFTER reaching the target; `move_ms` (optional) is the time spent on the move ITSELF (glide mode). Default move_ms=0 = snap mode (instant move), then idles. Absolute mode runs the same closed-loop converge as hid.click — see that tool's description for landing / convergence semantics.
| Name | Type | Req | Description |
|---|---|---|---|
| duration_ms | integer | – | Idle time AFTER reaching target. |
| move_ms | integer | – | Glide mode for the move itself: break into ~10 ms HID reports over N ms (linear interp + post-slide converge). 0 = snap mode (default, instant move). |
| x | integer | yes | – |
| y | integer | yes | – |
No output schema declared.
No examples provided.
hid.key ~139
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Press a key or keyboard shortcut.
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | yes | Named key (enter/tab/f1…), a single character, or shortcut shorthand like 'ctrl+c' or 'ctrl+alt+l' — modifiers in the prefix are split out and combined with the modifiers array. |
| modifiers | array | – | Explicit modifier list. Combined with any modifiers parsed from the key shorthand. Optional when the key field already encodes the modifiers (e.g. 'ctrl+c'). |
No output schema declared.
No examples provided.
hid.key_press ~120
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Press a key (or shortcut) WITHOUT releasing. Pair with hid.key_release. Useful for 'hold shift while clicking N times' multi-select patterns: hid.key_press('shift') → several hid.click → hid.key_release('shift'). For a fixed-duration hold, prefer hid.hold_key.
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | yes | – |
| modifiers | array | – | – |
No output schema declared.
No examples provided.
hid.key_release ~96
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Release a previously-pressed key (or shortcut). Idempotent. Pass no arguments to release ALL held keys and mouse buttons (panic stop, same as hid.release_all).
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | – | – |
| modifiers | array | – | – |
No output schema declared.
No examples provided.
hid.mouse_button_down ~102
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Press a mouse button WITHOUT releasing it. Pair with hid.mouse_button_up (and hid.move in between) to compose a drag, or use hid.drag for a one-call wrapper. Matches Anthropic Computer Use's left_mouse_down action.
| Name | Type | Req | Description |
|---|---|---|---|
| button | string | – | – |
No output schema declared.
No examples provided.
hid.mouse_button_up ~91
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Release a previously-pressed mouse button. Idempotent — releasing a non-held button is a no-op (no error). Matches Anthropic Computer Use's left_mouse_up action.
| Name | Type | Req | Description |
|---|---|---|---|
| button | string | – | – |
No output schema declared.
No examples provided.
hid.move ~246
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Move mouse. Default semantics: (x, y) is an ABSOLUTE screen coordinate (see hid.click for how absolute mode works under the hood, including the closed-loop convergence that absorbs OS pointer-ballistics). Pass relative=true to send (x, y) as a pixel delta directly. On hosts where the OS cursor query is unavailable, absolute mode returns an error. Returns `x`/`y` = actual landing coordinates, `target_x`/`target_y` = original request, `converged` / `iters` for the absolute path. Optional `move_ms` switches snap mode (default) → glide mode; see hid.click for the trade-off.
| Name | Type | Req | Description |
|---|---|---|---|
| move_ms | integer | – | Glide mode: break the move into ~10 ms HID reports over N ms (linear interp + post-slide converge). 0 = snap mode (default, instant move). |
| relative | boolean | – | – |
| x | integer | yes | – |
| y | integer | yes | – |
No output schema declared.
No examples provided.
hid.release_all ~58
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Release every held key / mouse button (panic stop).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
hid.scroll ~66
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Scroll the mouse wheel. Positive=up, negative=down.
| Name | Type | Req | Description |
|---|---|---|---|
| delta | integer | yes | – |
No output schema declared.
No examples provided.
hid.type ~98
[Physical HID input — pick this when other automation paths (file APIs, browser automation, OS APIs) cannot accomplish the task, or when the user explicitly requests physical keyboard or mouse input.] Type a string as if on a physical keyboard (US layout). Plain ASCII only: text containing any other character (Chinese, emoji, curly quotes) is refused before anything is typed - paste such text via the clipboard instead.
| Name | Type | Req | Description |
|---|---|---|---|
| text | string | yes | – |
No output schema declared.
No examples provided.
What is the io.github.tinqiao-oss/clawtouch-mcp server?
io.github.tinqiao-oss/clawtouch-mcp is listed in the public MCP registry as io.github.tinqiao-oss/clawtouch-mcp. USB-HID keyboard/mouse (Pico 2, open firmware) as MCP tools; --mock runs with no hardware. This page covers its PyPI package (clawtouch-mcp).
Is the io.github.tinqiao-oss/clawtouch-mcp server safe to use?
io.github.tinqiao-oss/clawtouch-mcp scores 73 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.tinqiao-oss/clawtouch-mcp server expose?
io.github.tinqiao-oss/clawtouch-mcp exposes 16 tools: hid.click, hid.move, hid.hover, hid.type, hid.scroll, and 11 more. Their descriptions and schemas cost roughly 2,603 tokens of context every time the server is loaded.
Is the io.github.tinqiao-oss/clawtouch-mcp server still maintained?
io.github.tinqiao-oss/clawtouch-mcp is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.