vela-mcp
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., "@vela-mcp what's the current CPU usage on the remote host?"
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.
Vela MCP Server
MCP (Model Context Protocol) server that exposes Vela RemotePC endpoints as tools, so AI clients (Claude Desktop, Cline, Cursor, Gemini, etc.) can control remote systems.
Architecture
The server supports two transport modes that share the same 150+ tool definitions (tools.py):
1. STDIO (single-tenant, per-process)
Each process is bound to one agent via environment variables. Run multiple agents by defining multiple entries in mcp_settings.json, each with its own env block.
MCP client config (cline_mcp_settings.json or claude_desktop_config.json):
{
"mcpServers": {
"vela-home": {
"command": "/path/to/.venv/bin/mcp",
"args": ["run", "vela_mcp/tools.py:mcp"],
"cwd": "/path/to/vela-mcp",
"env": {
"VELA_API_URL": "https://vela.mikesplore.tech",
"VELA_TOKEN": "<relay_secret>",
"AGENT_ID": "agt_123"
}
},
"vela-work": {
"command": "/path/to/.venv/bin/mcp",
"args": ["run", "vela_mcp/tools.py:mcp"],
"cwd": "/path/to/vela-mcp",
"env": {
"VELA_API_URL": "https://vela.mikesplore.tech",
"VELA_TOKEN": "<relay_secret>",
"AGENT_ID": "agt_456"
}
}
}
}2. HTTP (multi-tenant, shared server)
A single server instance handles any number of agents. Create a scoped MCP connection with vela --mcp; it returns an opaque URL and a dedicated bearer credential:
MCP URL: https://mcp.mikesplore.tech/mcp/c_8f4a...
Authentication: Bearer <mcp-credential>The MCP credential is stored as a hash and can expire or be revoked independently of the Vela relay secret. The gateway resolves the connection to its agent and uses the relay secret internally. Neither agent_id nor relay_secret is accepted in the MCP URL.
Claude connectors select OAuth during setup. The gateway provides OAuth discovery, dynamic client registration, PKCE authorization, short-lived bearer access tokens, and rotating refresh tokens. During authorization, enter the MCP credential printed once by vela --mcp; supported clients can then renew access without asking for that credential again.
MCP tool safety
The gateway applies the same risk categories used by Vela’s assistant. Read-only tools execute immediately. Medium- and high-risk tools return a short-lived, single-use approval link and request_id instead of executing. Open the returned approval_url, approve once, then let the MCP client continue the exact pending request. The server claims and completes that request atomically, so duplicate continuations cannot execute the action twice. High-risk approvals also require the Vela ASSISTANT_ACTION_PIN when one was configured during connection creation.
Each MCP connection has a user-selected tool policy: strict (default) requires approval for medium/high-risk tools, read_only exposes only read-only tools, and open executes all exposed tools without MCP approval. Set MCP_TOOL_POLICY in the agent .env, or override one connection with vela --mcp --mcp-policy read_only.
Stdio mode also supports strict approvals. The first gated call starts a
loopback-only approval page on 127.0.0.1, returns a one-time local link, and
waits for the client to continue the request. The server never opens the
browser automatically and the page is not reachable from the network. Set
ASSISTANT_ACTION_PIN in the MCP environment if high-risk local approvals
should require a PIN.
How multi-tenancy works
vela-mcp stores scoped MCP connection records. It extracts only an opaque connection ID and a dedicated MCP credential from each request, then resolves the agent server-side.
velavps (the relay server) enforces isolation:
_verify_agent_access(agent_id, secret)rejects requests where the secret doesn't match the agent's registered secret, or where the agent belongs to another user.150+ tools are untouched — they call
vela_client.get/post/…which resolves to either the per-request or per-process client automatically.
Related MCP server: allcanuse-mcp
Quick Start
python -m vela_mcp.serverServer starts on http://0.0.0.0:8002 with the MCP endpoint at /mcp/{connection_id}.
Setup
Copy
.env.exampleto.envSet
VELA_API_URL— your Vela relay VPS host (e.g.https://vela.mikesplore.tech)For stdio mode: also set
VELA_TOKEN(relay secret) andAGENT_IDFor HTTP mode: you only need
VELA_API_URLandPORT; credentials come from the client
Run Script
./run.sh # start the MCP server (HTTP/streamable transport)
./run.sh dev # start the MCP Inspector (dev/testing UI)Project Layout
vela_mcp/
__init__.py
config.py # Settings (VELA_API_URL, VELA_TOKEN, AGENT_ID, PORT)
client.py # RelayConnection, VelaClient, per-request contextvar proxy
server.py # FastAPI app with scoped middleware at /mcp/{connection_id}
tools.py # 150+ MCP tool definitions (unchanged)Development
.venv/bin/mcp dev vela_mcp/tools.py:mcpRequirements
Python >= 3.10
mcp >= 1.0.0fastapi >= 0.110.0httpx >= 0.27.0pydantic-settings >= 2.0.0uvicorn >= 0.30.0
Available Tools
183 toolsactive_windowARead-onlyIdempotent
Get the currently focused window title and app path.
Inputs: no named parameters.
audio_devicesARead-onlyIdempotent
List available audio sinks and sources.
Inputs: no named parameters.
beep_audioA
Play a simple notification beep sound.
Inputs: no named parameters.
cancel_jobA
Cancel a scheduled task.
Inputs: task_id (required).
check_alert_statusARead-onlyIdempotent
Check the monitoring system status: whether spike alerts and daily summaries are scheduled, alerts today, and recipient email from .env. No email input needed — reads RECIPIENT_EMAIL from .env.
Inputs: no named parameters.
check_package_installedBRead-onlyIdempotent
Check whether a package is installed (apt/dnf/pacman).
Inputs: name (required).
check_portARead-onlyIdempotent
Find what process is listening on a TCP port on this machine. Use when the user asks what service/app uses a port, what's on port X, or if a port is open (e.g. 8765 for the local Vela API). Returns PID, process name, and command line.
Inputs: port (required).
check_updatesARead-onlyIdempotent
Check for available system updates.
Inputs: no named parameters.
check_vnstat_statusARead-onlyIdempotent
Check if vnstat is installed, its version, and which network interfaces it's monitoring.
Inputs: no named parameters.
clear_cacheA
Clear /tmp and user cache directories.
Inputs: no named parameters.
clear_clipboardA
Clear the clipboard contents.
Inputs: no named parameters.
clear_notificationsA
Clear all desktop notifications.
Inputs: no named parameters.
close_applicationA
Close a desktop/GUI application. Accepts the same friendly names and .desktop resolution as open_application (e.g. 'Chrome', 'firefox'). Matches running processes by exec binary and process name.
Inputs: name (required).
close_windowB
Close a window by window ID.
Inputs: window_id (required).
compose_statusBRead-onlyIdempotent
List services from a Docker Compose project.
Inputs: project, project_directory.
connect_wifiC
Connect to a WiFi network.
Inputs: ssid (required), password.
count_toolsARead-onlyIdempotent
Count how many assistant tools are available on this host. Use when the user asks how many tools/capabilities/commands you have, or how many things you can do.
Inputs: no named parameters.
delete_pathBDestructive
Delete a file or directory.
Inputs: path (required).
disable_micA
Mute the default microphone source.
Inputs: no named parameters.
disable_webcamA
Disable the webcam by unloading the kernel module.
Inputs: no named parameters.
disconnect_wifiB
Disconnect from the current WiFi network.
Inputs: no named parameters.
display_recordBRead-onlyIdempotent
Record a short screen clip and return MP4 as base64.
Inputs: duration_seconds (required).
display_screenshotARead-onlyIdempotent
Capture the current screen with flameshot to ~/Pictures and return it to the client as base64 image data (compressed for relay delivery when large). The AI model only receives a success confirmation — the image is delivered to the user interface separately.
Inputs: no named parameters.
download_fileARead-onlyIdempotent
Download a file from the local filesystem and send it to the user interface. Images are shown in the UI (not to the AI model) — you only get a success confirmation with path/size. Files larger than the configured limit are rejected with size details; do not retry the same path. Use for transferring a file the user asked to see or receive, not for reading file contents yourself.
Inputs: path (required).
enable_micA
Unmute the default microphone source.
Inputs: no named parameters.
enable_webcamA
Enable the webcam by loading the kernel module.
Inputs: no named parameters.
gatekeeper_block_projectA
Manually block a Gatekeeper client project (gates their site/API). Requires slug and a non-empty reason. Confirmation gate applies.
Inputs: slug (required), reason (required).
gatekeeper_check_certificate_statusARead-onlyIdempotent
Check whether an SSL certificate is installed for a domain.
Inputs: domain (required).
gatekeeper_check_image_statusARead-onlyIdempotent
Wizard helper: check whether an image is available locally before attempting container creation.
Inputs: image (required).
gatekeeper_containers_wizard_contextARead-onlyIdempotent
Wizard helper: fetch Docker container-creation context (networks + internal network info).
Inputs: no named parameters.
gatekeeper_containers_wizard_ports_checkBRead-onlyIdempotent
Wizard helper: check whether host ports are already in use on the Docker host.
Inputs: hostPorts (required).
gatekeeper_containers_wizard_validateBRead-onlyIdempotent
Wizard helper: validate and normalize a CreateContainerRequest without applying changes.
Inputs: no named parameters.
gatekeeper_create_containerA
Create and start a new Docker container with custom configuration. DEPLOYMENT ORDER: This is step 1 of 4 — do this first. Requires image. Optional: name, projectSlug, ports, env, network, volumes, restartPolicy. If the user provides .env variables, pass them in the env field. If the user says the env vars are already in a local .env file on the Docker host, prefer passing envFilePath (absolute path) so Gatekeeperd can load it server-side. After creation, verify the container is running before proceeding to project creation.
Inputs: image (required), env, name, ports, +5 more.
gatekeeper_create_projectA
Create a new Gatekeeper project registration. PREREQUISITE: Docker container must already exist and be running (use gatekeeper_create_container first). DEPLOYMENT ORDER: This is step 2 of 4. 1) gatekeeper_check_image_status → gatekeeper_create_container → ensure running 2) gatekeeper_create_project (this step) 3) gatekeeper_nginx_wizard_context → gatekeeper_nginx_enable 4) gatekeeper_install_certificate. Use for onboarding new clients.
Inputs: name (required), slug (required), type (required), domain (required), +7 more.
gatekeeper_delete_containerBDestructive
Delete a container permanently.
Inputs: name (required).
gatekeeper_delete_imageADestructive
Delete a Docker image from the local Docker host.
Inputs: image (required), tag, force.
gatekeeper_delete_projectADestructive
Archive a Gatekeeper project (soft delete). Preserves payments and audit log. Use when removing a client while keeping historical data.
Inputs: slug (required).
gatekeeper_get_containerARead-onlyIdempotent
Get details for a single container by name or ID prefix.
Inputs: name (required).
gatekeeper_get_container_healthBRead-onlyIdempotent
Get container health/running state.
Inputs: name (required).
gatekeeper_get_projectARead-onlyIdempotent
Get one Gatekeeper project with payment history and audit log. Use when the user asks about a specific client site or slug.
Inputs: slug (required).
gatekeeper_get_project_auditARead-onlyIdempotent
Get audit log for a specific project.
Inputs: slug (required).
gatekeeper_initialize_paymentA
Generate a Paystack payment link for a project. Requires slug and email. Creates a pending payment and returns a checkout URL.
Inputs: slug (required), email (required).
gatekeeper_install_certificateA
Install an SSL certificate for a domain using certbot. DEPLOYMENT ORDER: This is step 4 of 4 — do this last. PREREQUISITE: nginx site must be enabled (use gatekeeper_nginx_enable first). Requires domain and email. This completes the deployment.
Inputs: email (required), domain (required).
gatekeeper_list_auditARead-onlyIdempotent
Recent Gatekeeper audit log entries across all projects (block/unblock/payments).
Inputs: limit.
gatekeeper_list_certificatesARead-onlyIdempotent
List installed SSL certificates found under /etc/letsencrypt/live.
Inputs: no named parameters.
gatekeeper_list_containersARead-onlyIdempotent
List all Docker containers visible to Gatekeeperd on the host.
Inputs: no named parameters.
gatekeeper_list_networksARead-onlyIdempotent
List Docker networks.
Inputs: no named parameters.
gatekeeper_list_overdueARead-onlyIdempotent
List active Gatekeeper projects past their due date, sorted by days overdue. Use for payment triage — who is late and when auto-block kicks in.
Inputs: no named parameters.
gatekeeper_list_paymentsARead-onlyIdempotent
List payments across all Gatekeeper projects with optional filters: status (pending/success/failed/abandoned/reversed), project_slug, from/to dates, limit, offset.
Inputs: to, limit, offset, status, +2 more.
gatekeeper_list_projectsARead-onlyIdempotent
List all Gatekeeper client projects (slug, name, domain, status, due date, amount due). Use for billing/access overview across hosted clients.
Inputs: no named parameters.
gatekeeper_nginx_disableA
Disable (unlink) an nginx site without removing the config file.
Inputs: slug (required).
gatekeeper_nginx_enableA
Generate and enable an nginx site config for a project. PREREQUISITE: Project must exist and container must be running. DEPLOYMENT ORDER: This is step 3 of 4. Use gatekeeper_nginx_wizard_context first to fetch project details and validate. After enabling, proceed to gatekeeper_install_certificate for SSL.
Inputs: slug (required).
gatekeeper_nginx_removeADestructive
Remove an nginx site completely (both sites-available file and sites-enabled symlink).
Inputs: slug (required).
gatekeeper_nginx_statusBRead-onlyIdempotent
Check if a project has an nginx site configured and enabled, and whether SSL is set up.
Inputs: slug (required).
gatekeeper_nginx_validateB
Wizard helper: validate nginx enable inputs and return a config preview without applying changes.
Inputs: slug (required).
gatekeeper_nginx_wizard_contextARead-onlyIdempotent
Wizard helper: fetch project + nginx context to drive a step-by-step UI (status, container hints, certificate options).
Inputs: slug (required).
gatekeeper_pull_imageC
Pull a Docker image from a registry.
Inputs: image (required), tag, pullViaCli.
gatekeeper_remove_certificateBDestructive
Remove an SSL certificate for a domain.
Inputs: domain (required).
gatekeeper_restart_containerC
Restart a container.
Inputs: name (required).
gatekeeper_revenue_reportBRead-onlyIdempotent
Gatekeeper revenue summary: total this month, last month, and monthly breakdown. Optional input: period (default month), months (default 6).
Inputs: months, period.
gatekeeper_start_containerC
Start a stopped container.
Inputs: name (required).
gatekeeper_stop_containerB
Stop a running container.
Inputs: name (required).
gatekeeper_unblock_projectA
Manually unblock a Gatekeeper client project after payment or agreement. Requires slug and a non-empty reason. Confirmation gate applies.
Inputs: slug (required), reason (required).
gatekeeper_update_projectA
Update Gatekeeper project fields for an existing client project. PATCH semantics: provide slug to target the project plus ONLY the fields the user asked to change — every body field is optional but at least one is required. Editable fields: name, domain, containerName, type (frontend|backend), clientName, clientEmail, amountDue (number), currency (e.g. KES/USD), dueDate (YYYY-MM-DD, or null to clear), gracePeriodDays (integer). Do NOT send fields the user did not ask to change.
Inputs: slug (required), name, type, domain, +7 more.
get_batteryARead-onlyIdempotent
Battery percentage, plugged state, and remaining seconds.
Inputs: no named parameters.
get_boot_errorsARead-onlyIdempotent
Recent error-level journal entries from the current boot.
Inputs: lines (required).
get_container_logsBRead-onlyIdempotent
Recent logs from a Docker container.
Inputs: lines (required), name_or_id (required).
get_container_statusARead-onlyIdempotent
Detailed status for one Docker container. Use FIRST when asked if a container is running.
Inputs: name_or_id (required).
get_currently_playing_songBRead-onlyIdempotent
Current playback status, title, artist, album, album art URL, and position.
Inputs: no named parameters.
get_device_infoARead-onlyIdempotent
High-level device identity: laptop model (e.g. ThinkPad X1 Carbon Gen 9), vendor (e.g. Lenovo), OS distro, kernel, architecture, hostname. Use when the user asks 'what device/laptop/computer is this'. For deeper hardware specs use get_system_info; for OS-only details use get_system_os.
Inputs: no named parameters.
get_directory_treeBRead-onlyIdempotent
Get directory tree structure for folder navigation.
Inputs: path (required), max_depth (required).
get_disk_usageARead-onlyIdempotent
Disk space usage: how much free and used space each mounted partition has. Use when the user asks how much space is left or available. Do NOT use for partition layout or filesystem type — use get_system_disk for that.
Inputs: no named parameters.
get_display_brightnessARead-onlyIdempotent
Get the current screen brightness.
Inputs: no named parameters.
get_docker_infoARead-onlyIdempotent
Check whether Docker is installed and the daemon is running.
Inputs: no named parameters.
get_firewall_statusARead-onlyIdempotent
Get ufw firewall status when installed.
Inputs: no named parameters.
get_logsARead-onlyIdempotent
Get the last N lines of a systemd service log.
Inputs: lines (required), service (required).
get_monitor_stateARead-onlyIdempotent
Check whether the monitor is currently on or off. Use before toggling monitor state if unsure of the current state.
Inputs: no named parameters.
get_network_ipARead-onlyIdempotent
Local and public IP addresses.
Inputs: no named parameters.
get_network_locationARead-onlyIdempotent
Public IP with geo-location: city, region, country, timezone, ISP, coordinates.
Inputs: no named parameters.
get_power_profileA
Get the current power profile (performance, balanced, power-saver).
Inputs: no named parameters.
get_resolutionARead-onlyIdempotent
Get the current display resolution and refresh rate.
Inputs: no named parameters.
get_service_statusARead-onlyIdempotent
Check whether a specific systemd service is running, failed, or stopped. Use FIRST when the user asks if a service is up/running/active. Do NOT start or restart the service to answer a status question.
Inputs: name (required), scope (required).
get_snapshotARead-onlyIdempotent
Live system metrics snapshot: current CPU load, RAM usage, GPU usage, disk I/O rates, network I/O rates, temperatures, fan speeds, battery level, top processes. Use for 'how is my PC doing' or real-time status. Do NOT use for static hardware specs — use get_system_info for that.
Inputs: no named parameters.
get_system_biosBRead-onlyIdempotent
BIOS vendor, version, release date, and motherboard.
Inputs: no named parameters.
get_system_configARead-onlyIdempotent
Get system configuration (home directory, username).
Inputs: no named parameters.
get_system_cpuARead-onlyIdempotent
Static CPU specs: model name, core/thread counts, base clock, architecture. Use when the user asks WHAT CPU they have. Do NOT use for live CPU load — use monitor_cpu for current usage.
Inputs: no named parameters.
get_system_diskARead-onlyIdempotent
Static disk layout: partition names, mount points, filesystem types, and total sizes. Use when the user asks about drive partitions or disk setup. Do NOT use for free space or usage stats — use get_disk_usage for that.
Inputs: no named parameters.
get_system_gpuARead-onlyIdempotent
Static GPU info: GPU device names and models. Use when the user asks WHAT GPU they have. Do NOT use for live GPU load — use monitor_gpu for that.
Inputs: no named parameters.
get_system_infoARead-onlyIdempotent
Static hardware specs bundle: CPU model, RAM capacity, GPU model, disk partitions, OS version, USB devices, monitor config, and BIOS. Use when the user wants to know WHAT their machine is made of. Do NOT use for live usage — use get_snapshot for live metrics.
Inputs: no named parameters.
get_system_monitorsARead-onlyIdempotent
Static monitor hardware info: display names, resolutions, refresh rates. Use when the user asks about their monitor specs. Do NOT use to check if the monitor is on/off — use get_monitor_state for that.
Inputs: no named parameters.
get_system_osARead-onlyIdempotent
OS identity: distro name, kernel version, hostname, current username. Use for OS/kernel-specific questions. For a full device summary including hardware vendor and model, use get_device_info instead.
Inputs: no named parameters.
get_system_ramARead-onlyIdempotent
Static RAM capacity: total installed memory and swap size. Use when the user asks how much RAM they have. Do NOT use for live memory usage — use monitor_ram for that.
Inputs: no named parameters.
get_system_statsARead-onlyIdempotent
Get current system stats on demand: CPU usage, memory, vnstat network (today + month), top processes, uptime. Use when the user asks 'how's my system', 'give me stats', 'show system status'.
Inputs: no named parameters.
get_system_usbBRead-onlyIdempotent
Connected USB devices.
Inputs: no named parameters.
get_top_processesARead-onlyIdempotent
Top resource-consuming processes ranked by CPU and memory usage. Use when the user asks what is slowing down or eating up their system. Do NOT use to find a specific process by name — use list_processes for that.
Inputs: no named parameters.
get_uptimeARead-onlyIdempotent
Get system uptime: how long the laptop has been running since last boot, returned as seconds, minutes, hours, days, and a human-readable formatted string.
Inputs: no named parameters.
get_vnstat_dataARead-onlyIdempotent
Get network usage from vnstat for a specific period. period: 'day' (today — default), 'month' (this month), 'hour' (current hour). Use when the user asks about their data usage or bandwidth.
Inputs: period.
get_volumeARead-onlyIdempotent
Current master volume level and mute state.
Inputs: no named parameters.
get_vpn_statusARead-onlyIdempotent
Check whether a VPN interface or NetworkManager VPN connection is active.
Inputs: no named parameters.
get_wifi_statusARead-onlyIdempotent
Current WiFi connection state only: connected/disconnected, active SSID, signal strength. Use when the user asks if they are connected or what network they are on. Do NOT use to browse nearby networks — use list_wifi_networks for that.
Inputs: no named parameters.
health_checkCRead-onlyIdempotent
Probe an HTTP(S) URL and report whether it responds.
Inputs: url (required).
is_process_runningARead-onlyIdempotent
Check whether a process or app is currently running by name. Use FIRST when asked if an application/process is open — do NOT launch it just to check.
Inputs: name (required).
kill_processBDestructive
Kill a process by PID.
Inputs: pid (required).
kill_process_by_nameBDestructive
Kill all processes matching a name.
Inputs: name (required).
list_bluetooth_devicesARead-onlyIdempotent
List connected Bluetooth devices and paired devices available to connect.
Inputs: no named parameters.
list_docker_containersARead-onlyIdempotent
List Docker containers. Use when the user asks what containers are running or to find a container by name/image.
Inputs: all (required), filter.
list_failed_servicesBRead-onlyIdempotent
List failed systemd units from the current boot.
Inputs: scope (required).
list_filesCRead-onlyIdempotent
List files and directories at a path.
Inputs: path (required).
list_installed_applicationsARead-onlyIdempotent
List installed desktop applications from this machine (.desktop entries): display name, desktop id, exec binary. Use when the user asks what apps are installed, what browser/IDE they have, or before opening an ambiguous app name.
Inputs: filter.
list_jobsBRead-onlyIdempotent
List all scheduled tasks.
Inputs: no named parameters.
list_notificationsA
List all desktop notification history system-wide (all apps). Use when the user asks to see recent notifications or missed alerts.
Inputs: no named parameters.
list_processesARead-onlyIdempotent
Full list of all running processes with PIDs. Use when the user wants to find a specific process by name or get a PID to kill. Do NOT use to see what is consuming the most resources — use get_top_processes for that.
Inputs: no named parameters.
list_servicesARead-onlyIdempotent
List systemd services and their status. Use filter to narrow results and scope=system|user|all for system vs user units (Vela runs as user services). Do NOT use to answer whether one specific service is running — use get_service_status instead.
Inputs: scope (required), filter.
list_timersARead-onlyIdempotent
List systemd timers and when they next run.
Inputs: scope (required), filter.
list_toolsARead-onlyIdempotent
List all assistant tool names available on this host, optionally filtered by a search term. Use when the user asks what tools/capabilities/commands you have, what you can do, or whether a specific capability exists.
Inputs: filter.
list_wifi_networksARead-onlyIdempotent
Scan and list all nearby WiFi networks with SSID and signal strength. Use when the user wants to see what networks are available nearby, not just their current connection.
Inputs: no named parameters.
lock_screen_displayA
Lock the screen via the display manager (fast path, no fallbacks). Prefer lock_screen_security unless you specifically need the display-manager lock.
Inputs: no named parameters.
lock_screen_securityA
Lock the screen with multiple fallbacks (most reliable). Use this when the user says 'lock', 'lock the screen', or 'lock my computer'. Prefer this over lock_screen_display.
Inputs: no named parameters.
login_historyARead-onlyIdempotent
Get recent login events from system auth logs.
Inputs: no named parameters.
logout_userA
Log out the current user session.
Inputs: no named parameters.
make_directoryA
Create a new directory.
Inputs: path (required).
minimize_windowC
Minimize a window by window ID.
Inputs: window_id (required).
monitor_battery_healthARead-onlyIdempotent
Get detailed battery health information (cycle count, capacity, health percent).
Inputs: no named parameters.
monitor_cpuARead-onlyIdempotent
Live CPU usage: current load percentage overall and per core. Use when the user asks how loaded their CPU is right now. Do NOT use for CPU specs or model — use get_system_cpu for that.
Inputs: no named parameters.
monitor_disk_ioBRead-onlyIdempotent
Per-disk I/O rates.
Inputs: no named parameters.
monitor_fansCRead-onlyIdempotent
Fan speed sensor readings.
Inputs: no named parameters.
monitor_gpuARead-onlyIdempotent
Live GPU usage: current GPU utilization percentage and VRAM used. Use when the user asks how hard their GPU is working right now. Do NOT use for GPU model info — use get_system_gpu for that.
Inputs: no named parameters.
monitor_network_ioARead-onlyIdempotent
Network I/O rates per interface.
Inputs: no named parameters.
monitor_offA
Turn the monitor/screen off (blank the display). Use when the user says 'turn off the screen', 'blank the display', or similar.
Inputs: no named parameters.
monitor_onA
Turn the monitor/screen back on. Use when the user says 'turn on the screen', 'wake the display', or similar.
Inputs: no named parameters.
monitor_ramARead-onlyIdempotent
Live memory usage: how much RAM and swap is currently used vs free. Use when the user asks how much memory is being used right now. Do NOT use for total RAM capacity — use get_system_ram for that.
Inputs: no named parameters.
monitor_temperaturesCRead-onlyIdempotent
Sensor temperature readings.
Inputs: no named parameters.
mute_audioA
Mute or unmute the master audio channel.
Inputs: muted (required).
next_trackA
Skip to the next media track.
Inputs: no named parameters.
open_applicationA
Open a desktop/GUI application. Accepts friendly names ('Chrome', 'firefox'), .desktop ids ('google-chrome.desktop'), or exec binaries — resolved against installed .desktop entries on this PC. Use list_installed_applications when unsure of the exact name.
Inputs: args (required), name (required).
open_pathA
Open a file or directory with the default system application.
Inputs: path (required).
pair_bluetooth_deviceC
Pair with a Bluetooth device.
Inputs: address (required).
ping_hostBRead-onlyIdempotent
Ping a host and return packet loss and average RTT.
Inputs: host (required), count (required).
press_keyboard_keysB
Press one or more keyboard keys or shortcuts.
Inputs: keys (required).
previous_trackA
Skip to the previous media track.
Inputs: no named parameters.
read_clipboardARead-onlyIdempotent
Read the current clipboard text.
Inputs: no named parameters.
read_notificationsA
Read only the notifications that were sent by this agent in the current session. Do NOT use for system-wide notification history — use list_notifications for that.
Inputs: no named parameters.
rename_pathC
Rename or move a file or directory.
Inputs: to (required), from_path (required).
restart_containerC
Restart a Docker container.
Inputs: name_or_id (required).
restart_serviceB
Restart a systemd service. Use only when the user asks to restart/fix it — not to check status.
Inputs: name (required), scope (required).
run_job_nowB
Trigger a scheduled task immediately.
Inputs: task_id (required).
run_updateA
Run a full system update (requires confirmation).
Inputs: confirm (required).
schedule_jobC
Schedule a command at a specific time or on a cron schedule.
Inputs: args (required), run_at (required), command (required), recurring.
search_and_playA
Search Spotify for a song and immediately play it. If no active device is available, Vela opens the local Spotify app and registers this PC as a playback device before retrying. Use when the user wants to hear a specific song.
Inputs: query (required), device_id.
search_filesARead-onlyIdempotent
Search files and directories by name under allowed directories. Prefer path under the user home (e.g. /home/). If path is / or omitted, search is automatically limited to configured allowed_base_dirs.
Inputs: query (required), path.
seek_mediaA
Seek media playback to a position in seconds.
Inputs: seconds (required).
send_daily_summary_nowA
Send the daily system summary email right now. Includes CPU, memory, vnstat network stats, top processes. Goes to RECIPIENT_EMAIL from .env — no email prompt.
Inputs: no named parameters.
send_notificationC
Send a desktop notification.
Inputs: title (required), message (required), urgency, app_name.
send_push_notificationA
Send a push notification to the user's registered mobile devices.
Inputs: body (required), title (required), data.
send_test_emailA
Send a test spike alert email to RECIPIENT_EMAIL (from .env) to verify Resend is working. Always sends regardless of CPU/memory. No email input needed.
Inputs: no named parameters.
send_test_spike_alertA
Manually check CPU/memory and send an alert email if thresholds are exceeded. Email goes to RECIPIENT_EMAIL from .env (no prompt). Optional: cpu_threshold (default 80%), memory_threshold (default 85%).
Inputs: cpu_threshold, memory_threshold.
set_display_brightnessC
Set the screen brightness.
Inputs: value (required).
set_night_lightA
Enable or disable night light and set colour temperature.
Inputs: enabled (required), temperature (required).
set_output_deviceC
Switch the default audio output device.
Inputs: device_id (required).
set_power_profileC
Set the power profile.
Inputs: profile (required).
set_volumeA
Set audio volume to a specific percentage.
Inputs: value (required).
speed_testA
Run a network speed test (download, upload, ping).
Inputs: no named parameters.
spotify_authA
Start Spotify account linking. Returns an auth URL the user must open in a browser to sign in and approve access. After approving, Spotify redirects to the configured callback URL and Vela finishes linking automatically — the browser should show a success or failure page.
Inputs: no named parameters.
spotify_callbackA
Legacy/manual completion of Spotify linking with an authorization code. Prefer the automatic browser redirect to /spotify/callback; only use this if the redirect could not finish linking.
Inputs: code (required).
spotify_devicesARead-onlyIdempotent
Get list of available Spotify playback devices (speakers, computers, phones). Use when the user asks what devices are available for playback.
Inputs: no named parameters.
ssh_sessionsARead-onlyIdempotent
List active SSH sessions.
Inputs: no named parameters.
start_containerA
Start a Docker container. Check status first unless the user explicitly asked to start it.
Inputs: name_or_id (required).
start_serviceA
Start a systemd service. Use get_service_status first when the user asks if it is running; only start when they ask to start it or it is down and they want it fixed.
Inputs: name (required), scope (required).
stop_containerB
Stop a Docker container.
Inputs: name_or_id (required).
stop_serviceC
Stop a systemd service.
Inputs: name (required), scope (required).
sync_timeA
Sync the system clock via NTP.
Inputs: no named parameters.
toggle_bluetoothA
Enable or disable the Bluetooth radio.
Inputs: enabled (required).
toggle_play_pauseA
Toggle media playback on or off.
Inputs: no named parameters.
toggle_wifiB
Enable or disable the WiFi radio.
Inputs: enabled (required).
type_keyboardA
Type text at the current focused input.
Inputs: text (required).
unpair_bluetooth_deviceC
Unpair a Bluetooth device.
Inputs: address (required).
unzip_pathB
Extract a zip archive to a destination directory.
Inputs: path (required), destination (required).
upload_fileCDestructive
Upload a file to a destination path.
Inputs: path (required), file_base64 (required).
volume_downB
Decrease the master volume by a step.
Inputs: step (required).
volume_upB
Increase the master volume by a step.
Inputs: step (required).
webcam_snapshotA
Capture a webcam image and return it as base64 PNG.
Inputs: no named parameters.
write_clipboardA
Write text to the clipboard.
Inputs: text (required).
zip_pathsC
Create a zip archive from files and directories.
Inputs: paths (required), output (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 183 tools
Descriptions are unusually careful with cross-references ('Do NOT use X for Y'), which makes most tools easy to tell apart. Still, some clusters overlap enough to cause misselection, such as Docker container tools vs. Gatekeeper container tools, and lock_screen_display vs. lock_screen_security.
The overwhelming majority of tools use a clear snake_case verb_noun pattern (list_, get_, set_, monitor_, start_, stop_, etc.). A few outliers like audio_devices, active_window, login_history, and health_check break the pattern but do not make the set chaotic.
183 tools is an extreme count for any MCP server, far beyond the 50+ threshold for a low score. Even with a broad all-in-one device-management scope, this volume creates heavy context overhead and makes tool selection expensive.
Within the domains the server targets, coverage is quite thorough: files, processes, services, Docker, Gatekeeper deployment, media, notifications, and network monitoring all have lifecycle-oriented operations. Minor gaps exist, such as no Compose up/down, no per-PID process details beyond listing, and no explicit payment-success recording, but these are workable.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server exposing the Backtest360 engine API as tools for AI agents.
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that allows AI agents to remotely control Windows, Linux, and macOS systems via VNC. It provides tools for mouse and keyboard interaction, text input, and screen capturing.6404 npm61MIT
- AlicenseNot gradedqualityDmaintenanceA MCP server for Windows/Linux that provides 90+ tools enabling AI assistants to systematically manage local systems, including system probing, command execution, file editing, network diagnostics, and more.13MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that enables AI agents to control remote machines via RustDesk, supporting device management, remote shell commands, file operations, power controls, and screen interaction.MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to control Windows PCs by executing shell commands, managing files, capturing screenshots, and monitoring system information through a comprehensive set of MCP tools.181MIT