vcctrl (ecliptik/vcctrl) is an MCP server listed on the M8ven Trust Index. It scores 58 out of 100, grade D. It declares 69 tools. No publisher has claimed this listing.

D
Caution
58/100

vcctrl

RaspberryPi KVM and Agent AI Control for Modern and Retro Computers

Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.

How we verified

⚡ Live Monitored: not connected

Verified is a snapshot. Live keeps it current, and builds your track record.

⚡ Connect GitHub → continuous verification on every pushwhy connect →

Who stands behind it

ecliptik

Source: github_repo_search

Is this your MCP?

Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →

Install from

The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.

// key findings
⚠️
Tool descriptions don’t match what handlers do
1 tool describes read intent but its handler mutates — vcctrl_sweep_list (line 1674: proc = subprocess.run()
No credential exfiltration, no sensitive file access, no obfuscation
Static analysis found nothing flowing your secrets to unexpected places.
Open source with a license and README
Anyone can audit the code, the license is declared, and the publisher documents what it does.
// tools this server exposes74 tools · 5 behind config

These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.

vcctrl_profiles

Every vcctrld instance actually running on this host, discovered by socket presence (bin/vcctrl-client's own `profiles` command) -- not a maintained list that can drift out of sync with what is real. Always includes "default", the primary instance every tool targets unless told otherwise.

vcctrl_profile_set

Change which profile a tool call's OMITTED `profile` argument resolves to, for the rest of this MCP server's session -- so a sequence of calls can target modernpc (say) without passing profile="modernpc" on every single one. An explicit `profile` argument on any individual call always overrides this

vcctrl_status

Device paths, USB4VC hold state, LED state -- the Pi's own end of the wire. Does not prove anything reached the target; see vcctrl_verify_input for that.

vcctrl_board

Which USB4VC protocol board is installed, and therefore which machine input reaches. `unknown` is a real, honest answer -- never guessed as the IBM PC. Always `id: null` on a profile with no swappable protocol board (e.g. modernpc) -- that is the correct answer for a target that was never on a board

vcctrl_sysinfo

The DOS target's own hardware -- CPU, memory, video, sound -- as a dinspect report last pulled off the card. A READING, not a live poll: `age_s` says how old it is and `source: null` means none has ever been pulled. `stale: true` means the USB4VC board changed since this reading was taken; `stale: f

vcctrl_public_telemetry

Aggregate, non-identifying usage stats for the public read-only KVM mirror (kvm-ro, e.g. straylight): visit counts by day, first-frame load-time samples (ms), and client-side error counts by message. No per-visitor data of any kind -- no IP, no user-agent, no cookie, no session id -- is ever collect

vcctrl_caps

Capability health across input, leds, power, video, audio, files.

vcctrl_note

Set the one-sentence 'what's happening right now' shown on the public read-only KVM page -- e.g. "rebooting into NET profile to copy log files for review". Not gated by the input lock: it touches no hardware, so it needs no --as arbitration beyond attribution. No expiry of its own, but the next gate

vcctrl_config_show

What the RUNNING daemon actually resolved at start, with source and any VCCTRL_* overrides -- different from reading the file, and the one worth asking when something behaves oddly.

vcctrl_keymap

Key names this daemon accepts, chord modifier order, and the alias table -- read this before building a combo. Does NOT say which keys reach the target; only a measured sweep at the machine can.

vcctrl_leds

PS/2 LED return channel snapshot. `available: false` with `why: "unsupported"` on ADB (the Mac Plus) is working hardware, not a fault -- see `why` for which of the (open-ended) set of reasons this is. Always empty on a hid-gadget profile (e.g. modernpc) -- there is no PS/2 return channel over a gene

vcctrl_ledwait

Block until LED state changes, or timeout_s elapses.

vcctrl_led_changes

The last n LED transitions, newest first. Shows that an intermittent left a trace -- does NOT establish a reading is current, since the byte only arrives on a lock-key change and an idle machine publishes nothing.

vcctrl_power_state

Smart-plug identity and last known relay state. A read, never gated -- diagnosing a stuck run must never require the input lock or knowing which board is seated. `board_match` (added alongside the board-scoped power fix) says whether a WRITE to this plug would be honoured right now for the installed

vcctrl_powerlog

Append-only record of every mains action taken, across daemon restarts.

vcctrl_video_state

Capture device state.

vcctrl_shot

One selected (judged) frame, written to a local file on THIS machine, or an explicit 'no picture'. Two-valued: the file exists iff the daemon says picture; a failed shot removes any stale file at that path rather than leaving it for a caller to mistake for this run's.

vcctrl_camera_state

State of the second, discretionary UVC webcam pointed at the physical target itself (the room/hardware), not its captured video signal -- a photographic companion view, independent of the analog capture stick's own ring/lock/frozen-frame machinery, so it can still answer when vcctrl_video_state cann

vcctrl_camera_shot

The single latest frame from the second camera, written to a local file, or an explicit no-frame-yet. RAW, like vcctrl_frame/vcctrl_burst, not judged like vcctrl_shot -- CameraCapability keeps no ring and makes no picture/no-lock judgement (a UVC webcam either delivers frames or the process exits, u

vcctrl_lastgood

The last frame that was positively picture, aged. Same two-valued --out contract as vcctrl_shot.

vcctrl_frame

One RAW frame by sequence number (from vcctrl_timeline). RAW means the daemon passes no picture judgement on it -- use vcctrl_shot for a judged frame.

vcctrl_burst

n RAW frames at once, written to a local directory. All or nothing -- a burst with silent holes in it would look like a complete capture and is not, so a failure leaves no partial directory behind.

vcctrl_timeline

Index of every frame in the scrub buffer: seq, timestamp, size. No pixels, so cheap to poll -- use this to find a seq for vcctrl_frame.

vcctrl_framestats

Duplicate-hash stats over the last n frames.

vcctrl_pin

Stop the ring evicting frames while you examine them: action is status, on, or off. Auto-releases after 300s daemon-side regardless, so an interrupted session cannot wedge it.

vcctrl_record

The scrub buffer as an AVI, written to a local file.

vcctrl_audio_state

ALSA capture device state.

vcctrl_level

Mean/peak dBFS over the last ms, from the PCM ring.

vcctrl_spectrum

Per-band energy and active_bands over the last ms, from the PCM ring.

vcctrl_audio_verdict

Is music/SFX playing right now -- one call, no thresholds to know.

vcctrl_activity

What is running, for how long, and who holds input -- check this before acting, not only for a human watching the rig.

vcctrl_events

Activity log since a sequence number (omit for the recent window).

vcctrl_lock_status

Input-lock status: who holds it, for how long. Never gated -- an observation, not an action. Each profile has its OWN lock (its own vcctrld instance, its own Arbiter) -- a lock held on the primary instance says nothing about whether modernpc's is free, and vice versa.

vcctrl_key

Tap keys in sequence (e.g. ["enter"], ["esc","f1"]). Acquires the input lock first; refuses (does not force) if a human or peer holds it.

vcctrl_type

Type literal text, shifted characters handled.

vcctrl_hold

Press, dwell ms, release -- the primitive gameplay/interactive testing needs; a keystroke with no duration cannot hold a direction.

vcctrl_keydown

Press and hold, no release -- pair with vcctrl_keyup or vcctrl_release_all.

vcctrl_keyup

Release a key held by vcctrl_keydown.

vcctrl_release_all

Release every key currently held by vcctrl_keydown.

vcctrl_combo

Chord (e.g. ["ctrl","alt","delete"]). Keys press modifiers-first regardless of the order given, release in reverse; the reply echoes the order actually sent.

vcctrl_mouse_move

Relative move. PS/2 and ADB mice, and the hid-gadget backend, are all relative-only -- there is no absolute positioning; home the cursor by moving into a screen corner first if you need a known starting point. Movement is silently clamped at screen edges.

vcctrl_mouse_click

Click left, right, or middle.

vcctrl_mouse_down

Press and hold a mouse button, for a drag. The matching vcctrl_mouse_up may never come from your side -- a disconnect (or the web KVM releasing capture) still releases it, the same guarantee release_all already gives a key left down by vcctrl_keydown.

vcctrl_mouse_up

Release a mouse button held by vcctrl_mouse_down.

vcctrl_mouse_release_all

Release every mouse button vcctrl_mouse_down left held. Separate from vcctrl_release_all (the keyboard's own version): a viewer can hold keyboard and mouse capture independently, and giving up one must not silently drop whatever the other is mid-operation on.

vcctrl_mouse_wheel

Scroll. Confirmed live 2026-09-02 over the hid-gadget backend (a terminal window on modernpc visibly scrolled). Unmeasured on PS/2 -- see docs/MOUSE.md sec 7 -- whether it reaches DOS at all.

vcctrl_verify_input

Prove the input path by PS/2 LED round trip -- the only check that says anything about the FAR end of the wire; every other input status describes the Pi's own end. Refuses (exit 2, available: false) on boards with no LED channel (ADB / the Mac Plus) rather than reporting a false alarm about working

vcctrl_lock_acquire

Explicitly take the input lock AND KEEP IT HELD across every subsequent gated call against this SAME profile, until vcctrl_lock_release(profile) or the 300s idle timer. Most tools acquire the lock automatically on first need and release it again as soon as that one action finishes (see _gated_run);

vcctrl_lock_release

Release the input lock now (and clear any sticky hold from vcctrl_lock_acquire) for this profile, without waiting for the idle timeout -- use this when you know you're done with input for a while and want to let a human, peer, or one of your own in-flight jobs back in. Releasing one profile's lock h

vcctrl_power

Mains control. action is "on", "off", or "cycle" -- each REQUIRES confirm to equal the action name exactly (confirm="cycle" for a cycle), the same discipline as vcctrl_combo's reboot gate: a named confirmation that has to be typed on purpose, not a bare boolean one accidental True turns into nothing

vcctrl_files

Can the currently attached machine be sent a file at all? A WORD, not a boolean: available, unsupported (e.g. the Mac Plus -- no packet driver, working hardware, nothing to fix), unknown, not-configured, unreachable, or unchecked.

vcctrl_file_check

Is the file server actually answering? Run BEFORE a transfer, not after -- a dead server discovered post-reboot has cost the target's whole environment for nothing. Four-valued exit code like vcctrl_verify_input: 0 ready, 1 not answering, 2 could-not-look, 3 this machine cannot receive files at all.

vcctrl_stage_file

Queue a LOCAL file (on this control host) for the next transfer. Nothing is sent to the target yet -- this only stages it. `path` must exist on the machine running this MCP server; bin/vcctrl handles the copy to the daemon host itself (the same --out-style host-boundary handling as every capture too

vcctrl_file_queue

What is staged: action is "list" or "clear". `clear` with no name drops everything staged; a name drops just that one. Never touches anything this MCP session did not stage itself... actually it is daemon-global, so `clear` drops what ANY caller staged -- check vcctrl_file_queue("list") first if tha

vcctrl_file_name

What `name` becomes on the target: DOS 8.3, uppercase. The rename happens here because the target cannot rename in transit -- check this before staging if the shortened name matters.

vcctrl_file_bats

The CONTENTS of the two batch files this rig's CF card needs (VCGET.BAT, VCCHK.BAT), carrying this rig's own server address and login -- returned as text, not written anywhere. Deliberately no output-directory option: the CLI's `file-bats DIR` form writes on whichever host runs the command, and unli

vcctrl_send_file

Send everything staged to the target. mode is "return" (reboot back to the measurement-clean menu default afterward) or "stay" (leave the machine in NET -- no measured run may start from there). REBOOTS THE TARGET TWICE and destroys its environment, so this requires confirm="send". Returns at once -

vcctrl_file_status

How the running transfer (send/refresh/get) is getting on, with the last n log lines. Exit 0 while still running -- nothing has failed yet; 0 also means fully done and verified. 1 means at least one file did not. 2 means it finished but work was left (cancelled or stopped early) -- `remaining` names

vcctrl_file_cancel

Stop after the file currently in flight. NOT mid-transfer -- the target's FTP client cannot be interrupted from here, so between files is the only honest boundary.

vcctrl_file_list

What the target's OUT directory held when it was LAST READ, with the age of that reading. Touches nothing -- reading it for real means rebooting, which is what vcctrl_file_refresh is for.

vcctrl_file_refresh

Go and actually read the target's OUT directory. mode is "return" or "stay", same meaning as vcctrl_send_file. REBOOTS THE TARGET, so this requires confirm="refresh". already_net skips the reboot but NOT the arrival proof -- being wrong about where the machine already is costs a refusal, not a comma

vcctrl_get_file

Fetch files out of the target's OUT directory. Pass either fetch_all=True or a names list (from vcctrl_file_list) -- a name not currently listed there is refused here rather than typed at the machine. REBOOTS THE TARGET (unless already_net), so this requires confirm="get". paranoid fetches each file

vcctrl_file_scan

Take a fresh dinspect reading of the DOS target's own hardware. REBOOTS THE TARGET TWICE: once to the menu default (typed blind -- nothing here can confirm the machine is at a usable prompt first, so only call this when you know it is not mid-boot or mid-something-else) to run DINSPECT.EXE there, th

vcctrl_pulled

What has been fetched off the target and is sitting on the daemon host: action is "list" or "clear" (+name). Use vcctrl_pulled_save to copy one to THIS machine.

vcctrl_pulled_save

Copy one previously-fetched file to a local path on this machine (via bin/vcctrl's normal --out host-boundary handling).

vcctrl_preflight

ONE gate for "is this rig fit to run": caps, board, power, video, scrub ring, the input lock, and (unless no_input) the input round trip. Exit codes like vcctrl_verify_input: 0 fit to run, 1 a real fault named in decided_by, 2 could not tell, 3 the tool itself failed. Scope is the HARNESS, not the t

vcctrl_job_status

Poll a job launched by vcctrl_run_cell / vcctrl_run_sweep / vcctrl_collect: running state, exit code once finished, and the last `tail` lines of its combined stdout/stderr.

vcctrl_job_list

Every job this MCP server has launched this session, with status.

vcctrl_job_cancel

Terminate a running job (SIGTERM). LAST RESORT, NOT GRACEFUL: unlike vcctrl_file_cancel (which waits for a clean file boundary), this can land mid-keystroke or mid-reboot on the target, because the harness scripts have no external stop signal designed in -- see docs/PLAN.md/vcctrl-sweep's own docstr

vcctrl_audio_matchbehind config

Does the live audio resemble a reference file's frequency shape?

vcctrl_sweep_listbehind config

Every sweep name this rig's profile knows, with its cell count and timeout -- from profiles/doskutsu.yaml. Safe, fast, no hardware touched.

vcctrl_run_cellbehind config

Run ONE doskutsu cell by hand -- the diagnostic single-cell shape, not a sweep. Launched detached; poll with vcctrl_job_status(job_id).

vcctrl_run_sweepbehind config

Run a full unattended QA sweep -- 12 to 23 minutes per profiles/doskutsu.yaml, one of the sweep names from vcctrl_sweep_list. Launched detached; poll with vcctrl_job_status(job_id). Ties up the rig for its full duration, so this requires confirm="run".

vcctrl_collectbehind config

Bring a sweep's logs back off the target, unattended. Pass either (sweep, machine_digit) or tags (a list like ["GMN","GMF"]). Reboots the target (unless already_net) -- CONFIRMATION COMES FROM THE FILESYSTEM, not the screen: arrival of each log in the FTP server's incoming/ is what's checked, which

// environment variables
To run this server yourself, you supply these values. They go in your own MCP client configuration and stay on your machine. The secret label means the value is sensitive, not that the server mishandles it.
configVCCTRL_MCP_ROLE
configVCCTRL_MCP_BIN
configVCCTRL_MCP_HOST
configVCCTRL_MCP_PORT
configVCCTRL_MCP_ALLOWED_HOSTS
configVCCTRL_HOST
configVCCTRL_SHOTS
configVCCTRL_CONFIG
configVCCTRL_WEB_PORT
configVCCTRL_PUBLIC_BIND
configVCCTRL_PUBLIC_PORT
configVCCTRL_PUBLIC_PREFIX
configVCCTRL_PUBLIC_STATE_DIR
configVCCTRL_WS_HOST
// quality suggestions

Tool annotations

No tools have read-only/destructive annotations

Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.

All four hints declared on every tool

74/74 tools missing one or more hints — vcctrl_profiles (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); vcctrl_profile_set (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); vcctrl_status (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +71 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.

For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.

Destructive tools are labelled

1 tool perform destructive updates without destructiveHint — vcctrl_burst deletes at line 860 (os.rmdir(out_dir))

Add destructiveHint:true to any tool whose handler calls .delete(), .upsert(), .update(), unlink, rm, DELETE, DROP, REPLACE INTO, or any operation that overwrites existing data.

Descriptions match behaviour

1 tool describes read intent but its handler mutates — vcctrl_sweep_list (line 1674: proc = subprocess.run()

Rename the tool, rewrite the description, or move the side-effect into a separate clearly-named tool.

Tool test coverage

Only 18/74 tools referenced in tests (24%)

Write tests that reference each tool by name so every tool has at least one test.

Tool description accuracy

vcctrl_burst: description implies read-only but handler writes/deletes/executes

Update tool descriptions to accurately reflect all capabilities — especially write, delete, or execute operations.

Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.

// full audit trail
The findings above are the summary. The full trail, every check we ran, each deduction, the network hosts observed and the dependency advisories, goes to verified publishers, along with an alert whenever a new one lands. Verified publishers can also review each finding and dispute it in one click. Publisher corrections have sharpened several of our checks this month, because the maintainer knows the codebase better than any scanner.
// improvement guidance — verified publishers only
We have 6 concrete improvements we can share with the publisher of this MCP. Each comes with specific guidance to raise the trust score.
// embed badge in your README
[![M8ven Verified](https://m8ven.ai/badge/mcp/ecliptik/vcctrl?variant=verified)](https://m8ven.ai/mcp/ecliptik/vcctrl)
Shows verification status without the grade. Want the grade badge instead? Remove ?variant=verified from the URL.
commit: d10b4ecd394e04cd4f7ddb758077f1e5c8279e51
code hash: 856f0d2cff2033dd8973dd837c1ed2d75b43d5e9a89042818a794fe2beb7257d
view raw JSON →
Check MCPs from inside your assistant
Tool Check · MCP

Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.

https://m8ven.ai/api/mcp/tool-check
check_toolsearch_toolscompare_toolsrecommend_alternativescheck_publisherreport_concern
How to add it →Free · no account needed · works in any MCP client