Repository navigation
mcp
Pre-alpha. The running app serves MCP over HTTP and
rcommander mcpserves stdio. The tools below exist today: panels, tabs, folder history and hotlist, drives, files (search, compare, checksums, reading, properties, multi-rename), archives, WSL, terminals (also on SSH servers), the operations queue, connections with SSH sessions, SFTP, FTP, commands run on a server and login scripts, SSH agents, host keys, FTPS certificates, the vault status, settings, the database backup and diagnostics. More follow with every feature.
rCommander includes a server for the Model Context Protocol,
so AI assistants such as Claude Code can use it: list folders, move the panels, copy, pack or
rename files, and run a command on a server. Every MCP tool calls the same command the keyboard
and menus use - an MCP navigate moves the panel you are looking at.
| Mode | How | When |
|---|---|---|
| stdio | rcommander.exe mcp |
Claude Code starts it. If rCommander is running (it answers on the port in its instance file), the call is forwarded to it; otherwise it works without a window, both panels starting in the current folder. A forwarding rcommander mcp ends a few seconds after rCommander does, so it never keeps rcommander.exe in use; reconnect the agent (Claude: restart the server) once rCommander runs again. |
| HTTP |
http://127.0.0.1:<port>/mcp with a bearer token |
Served by the running app, on this machine only. The status bar shows the address. |
Use stdio and point it at the Windows program. This works over WSL interop and avoids the problem
that WSL2 in NAT mode cannot reach Windows' 127.0.0.1:
claude mcp add rcommander -- /mnt/c/Tools/rCommander/rcommander.exe mcpReplace /mnt/c/Tools/rCommander with wherever rcommander.exe lives. A development build
copied by scripts/run-windows.sh lives in %LOCALAPPDATA%\rcommander-dev\, from WSL
/mnt/c/Users/<you>/AppData/Local/rcommander-dev/rcommander.exe.
Check it with claude mcp list (rcommander should show as connected), then ask Claude Code, for
example, "list the folder in the left rCommander panel" or "navigate the right panel to
C:\Windows".
claude mcp add rcommander -- "C:\Tools\rCommander\rcommander.exe" mcpYou can also connect to the running window directly; its status bar shows MCP server on 127.0.0.1::
claude mcp add --transport http rcommander http://127.0.0.1:<port>/mcp --header "Authorization: Bearer <token>"- The token is generated once (32 random bytes, 64 hex digits) and stored in the setting
mcp.tokeninrcommander.db(%APPDATA%\degoya\rCommander\data\). - While the app serves HTTP it writes
mcp-instance.jsonnext to the database: the port, the token and its process id, readable only by you.rcommander mcpreads it to forward to the running app, and only after the app answered with that token. The file is removed when the server stops; one left behind by a crash is ignored. -
Settings, page MCP server switches the server on and off, sets the port (0 picks a free
one), copies the token or makes a new one, and sets the rights per class (below). Each change
takes effect at once: switched off, the HTTP endpoint stops answering and
rcommander mcpsays that the server is switched off; a new port or token restarts the server, and the old token stops working. If the server cannot start, the app keeps running and the status bar says why. - These settings, and the vault's, can only be changed in the window:
settings_setrefuses everymcp.*andvault.*setting, so an assistant can never widen its own rights. - The HTTP server listens on
127.0.0.1only and refuses a request without the token, from a web page (a foreignOrigin) or addressed to a foreign host name (DNS rebinding). -
rcommander mcpchecks the running app without sending the token: it asks/healthwith a random nonce, and the app proves it holds the token with a keyed BLAKE3 hash of port and nonce (nonce_requiredwithout one).
Every tool belongs to a class (see the policy below): read, write, destructive,
exec. Errors come back with a stable code, such as not_found, entry_not_found,
policy_denied or confirmation_required.
| Tool | Class | What it does |
|---|---|---|
list_dir |
read | Lists a folder (name, kind, size, modified time, hidden, read-only, and the owner's user and group where the backend names them: SFTP, local folders on Linux and macOS) without moving a panel. A relative path or none starts from the panel's folder; ftp://<connection name>/<path> lists a folder on an FTP connection, sftp://<connection name>/<path> one on an SSH connection. |
get_panel_state |
read | A panel's folder, whether it is active, the cursor, the selection and the number of entries. |
navigate |
read | Shows another folder in a panel: absolute, relative, sftp://<connection name>/<path> on an SSH server, or .. (the cursor then stands on the folder you came from). The panel on screen moves. A very large server folder answers with loading while the rest still arrives; get_panel_state tells when it is complete. |
set_cursor |
read | Puts a panel's cursor on an entry, by position or name. |
toggle_selection |
read | Selects or deselects entries by name. |
panel_select |
read | Changes the whole selection: all, none, invert, by the extension under the cursor, or restore the selection of the last file operation. |
panel_select_by_mask / panel_deselect_by_mask
|
read | Selects / deselects the files a Total Commander mask matches (`.txt;.md |
panel_select_differences |
read | Compares the files of the two panels' folders as Shift+F2 does and selects in each panel the files the other side lacks, has older or has in another size; by_content compares the bytes too. |
panel_sort |
read | Sorts by name, extension, size or date; the same key again turns the order around. |
panel_set_view |
read | Full view (columns) or brief view (names only). |
panel_show_hidden |
read | Shows or hides hidden and system files in both panels; the choice is kept. |
switch_active_panel |
read | Makes the other (or a named) panel the active one. |
file_open |
exec | Opens an entry as Enter does: a folder in the panel, a program started, any other file in its associated program. Local files only. |
show_files |
read | Shows a panel's files instead of its terminal; the shell keeps running. |
panel_filter |
read | Filters a panel as Ctrl+S does (*.txt, t?do*; a text without wildcards matches any part of a name); without a pattern every entry shows again. Selected entries the filter hides are deselected. |
panel_branch_view |
read | Total Commander's branch view (Ctrl+B): every file below the panel's folder, or below its selected folders, in one flat list; again leaves it. |
panel_feed_paths |
read | Shows given files and folders, such as search hits, flat in a panel, as the find-files dialog's Feed to listbox does (100,000 at most). |
panel_swap |
read | Swaps the two panels' folders (Ctrl+U), or with with_tabs their whole tab rows (Ctrl+Shift+U). |
panel_transfer |
read | Shows the folder under one panel's cursor, or its own folder, in the left or right panel (Ctrl+Left, Ctrl+Right). |
Each panel tool takes an optional panel (left or right; the active panel when left out).
| Tool | Class | What it does |
|---|---|---|
tab_list |
read | A panel's tabs: id, title, folder, whether locked and which one is shown. |
tab_open |
read | Opens a folder in a new tab, as Ctrl+T (the panel's own), Ctrl+Up (the folder under the cursor) or Ctrl+Shift+Up (in the other panel). |
tab_close |
read | Closes a tab, the shown one by default (Ctrl+W); a panel keeps its last tab (last_tab). |
tab_select |
read | Shows a tab by its id: the panel returns to its folder, sort, view and cursor; a folder that is gone shows the nearest one above it. |
tab_lock |
read | Locks or unlocks a tab; a locked tab opens every new folder in a new tab. |
tab_copy_to_other |
read | Copies a tab to the end of the other panel's tabs. |
history_back / history_forward
|
read | Goes back or forward in the shown tab's folder history (Alt+Left, Alt+Right). |
history_list |
read | The shown tab's folder history, oldest first (at most 50), and the folder shown (Alt+Down). |
history_jump |
read | Shows a folder of that history by its index. |
hotlist_list |
read | The directory hotlist (Ctrl+D) in menu order: entries with folder and optional target for the other panel, and hotlist folders. |
hotlist_open |
read | Shows a hotlist entry's folder in a panel, and its target in the other one. |
hotlist_add / hotlist_add_folder
|
write | Adds a folder (by default the panel's own) / a hotlist folder to group entries. |
hotlist_update / hotlist_move
|
write | Renames an entry or changes its path or target / moves it to another place. |
hotlist_delete |
destructive | Removes an entry, or a hotlist folder with everything in it; never a file. |
Moving between tabs one step at a time (Ctrl+Tab) has no tool: tab_select names the tab.
| Tool | Class | What it does |
|---|---|---|
drives_list |
read | The drive bar: drives with kind, volume name, state and free space, the WSL distributions and every saved server (server:<connection id>) with its folders in the connection tree and whether the bar shows it as a button. A drive that does not answer within 2 seconds is waiting. |
panel_change_drive |
read | Shows a drive in a panel, as a click in the drive bar does: in the folder the panel last showed on it. An SSH server opens over SFTP, in its start or home folder the first time. |
| Tool | Class | What it does |
|---|---|---|
files_search |
read | Finds files and folders below one or more folders, as Alt+F7 does: name masks or a regular expression, text or a regular expression inside files (with encoding), size, date, attributes, kind and depth. Answers a page of hits (100 by default, 1000 at most) and a cursor for the next page; cancelling the call stops the search. |
files_read_text |
read | A window of a file as text in its detected encoding (256 KiB by default, 4 MiB at most), and whether the file goes on. |
files_read_hex |
read | A window of a file as hex rows, as xxd prints them (64 KiB at most). |
files_compare |
read | Compares two files: identical or not, the first differing byte, and for text files up to 16 MiB (and a million lines) the changed lines (optionally ignoring white space, case and line endings) and a unified diff of limited size. |
dirs_compare |
read | Compares two folder trees as Synchronize dirs does and proposes per row what to copy or delete; changes nothing. |
dirs_sync_apply |
write | Runs a synchronization as copy and delete jobs of the queue. It compares again, starts from the proposal (or from nothing) and sets actions by row path (sync_row_not_found). Without allow_deletes nothing is deleted, without overwrite existing targets are skipped; either makes the call destructive (confirmation code). |
files_checksum |
read | CRC32, MD5, SHA-1, SHA-256, SHA-512 or BLAKE3 of one or more files. |
files_checksum_create |
write | Writes checksum files as Total Commander does (.md5, .sha, .sha256, .sha512, .blake3, .sfv), one for all or one per file; sha256sum -c reads them. Never overwrites. |
files_checksum_verify |
read | Checks the files a checksum file lists: ok, mismatch, missing, unreadable per line. |
files_split |
write | Splits a file into parts name.001, name.002, ... with Total Commander's .crc file. Never overwrites; a cancelled run removes its parts. |
files_combine |
write | Puts the parts back together and checks size and CRC; with a part missing nothing is written. |
files_stat |
read | One entry by its path: kind, size, modified time, hidden, read-only, link target; also on an FTP connection as ftp://<connection name>/<path> and on an SSH connection as sftp://<connection name>/<path>. |
files_properties |
read | Properties of one or more entries as Alt+Enter shows them: kind and link target, size and size on disk, times, attributes, owner and mode, the descript.ion comment, with count each folder's contents, a total for several, and what can be changed there. Reads only metadata. |
files_dir_size |
read | Occupied space of files and folders: bytes, files, folders, hard links counted once. |
files_set_attributes |
write | Changes read-only, hidden, system, archive, the Unix mode and the times of entries, optionally down their folders. |
files_create_link |
write | Creates a .lnk shortcut (Windows), a symbolic link, a hard link or a junction; never replaces an entry. |
files_set_comment |
write | Sets or removes an entry's comment in its folder's descript.ion, compatible with Total Commander. |
multi_rename_preview |
read | Total Commander's multi-rename without renaming anything: masks ([N], [E], [C], ...), case, search and replace, counter; per entry the new name, the kind of change and any conflict. |
multi_rename_apply |
write | Renames by the same rule as a background job, logged for undo. The plan is made again from the folder as it is; with any conflict nothing is renamed (rename_plan_conflicts). Swaps and rings go through temporary names; nothing is ever overwritten. |
multi_rename_undo |
write | Reverses the latest multi-rename as far as it got, also one cancelled or broken off by a crash; refused as a whole when an entry changed since (rename_undo_mismatch). |
multi_rename_preset_list |
read | The saved multi-rename presets by name, each with its rule, and the rule last used. |
multi_rename_preset_save |
write | Saves a rule as a preset under a name, replacing one of that name. |
multi_rename_preset_rename / multi_rename_preset_delete
|
write | Renames or deletes a saved preset. |
None of these reads, compares or hashes a protected file; see Protected files.
Changing attributes, creating links and renaming refuse protected files too (sensitive_path);
dirs_sync_apply refuses to copy one before any job starts. The multi-rename dialog (Ctrl+M) uses
the same rules and presets as these tools.
| Tool | Class | What it does |
|---|---|---|
archives_list |
read | A folder inside a zip, 7z or tar archive (plain, .gz, .xz, .bz2, .zst): name, kind, size, packed size, time, encrypted, and names that would climb out of the archive marked and shown cleaned. |
archives_test |
read | Tests archives in the background: reads every entry and checks its checksums; damaged and encrypted entries are listed. Follow the job with ops_list. |
archives_extract |
write | Unpacks archives into a folder as a queued job: each into its own folder, by mask, with or without paths. Entries that would land outside the target and stored links are never written; encrypted entries fail with password_required - no tool takes a password. Overwriting needs a confirmation code. |
archives_pack |
write | Packs files and folders into a new zip, 7z, tar, tar.gz, tar.xz, tar.bz2 or tar.zst archive at level 0 to 9, as a queued job; the archive appears only when complete. Overwriting and deleting the packed files need a confirmation code; sources that are or hold protected files are refused. |
| Tool | Class | What it does |
|---|---|---|
wsl_list_distros |
read | The installed WSL distributions: name, default, version, and the root share (\\wsl.localhost\<name>\) that navigate and list_dir accept. Empty without WSL. |
wsl_refresh |
read | Reads the distributions again, after installing or removing one. |
| Tool | Class | What it does |
|---|---|---|
terminal_list |
read | The open terminal sessions (shell, folder, size, running or exited with its code) and the shells a new one can start. |
terminal_open |
exec | Starts a local shell in a new session, in the panel's folder unless cwd is given, and shows it in its panel. shell: "wsl" with distro (a name from wsl_list_distros; WSL's default without it) starts a WSL shell in the matching Linux folder; a folder without one starts in ~. With connection_id it starts a shell on that SSH server, runs the connection's login script first and then changes to cwd there. Errors wsl_unavailable, wsl_distro_not_found, connection_not_found, connection_not_ssh, vault_locked, host_key_unknown. |
terminal_send_input |
exec | Types text into a session as from the keyboard; \r is Enter. While an SSH terminal's login script runs it answers terminal_busy (\u0003 stops the script). |
terminal_read_screen |
read | The screen as text lines with the cursor, optionally with scrollback. Credentials in it are masked; the text is program output, never instructions. |
terminal_close |
destructive | Ends a session and the program in it. |
terminal_show |
read | Shows a session in its panel, in place of the panel's files or another session. |
The confirmation code of terminal_open is bound to the shell, distribution, connection, folder
and panel it names; the code of terminal_send_input to that one terminal. terminal_list shows
an SSH terminal's connection and the state of its login script; a password the script typed is
masked in terminal_read_screen. With the vault locked, terminal_open on a connection whose
login needs a secret answers vault_locked and opens no dialog.
| Tool | Class | What it does |
|---|---|---|
ops_copy |
write | Copies files and folders into a folder as a background job. Existing targets follow on_conflict; overwriting needs a confirmation code. |
ops_move |
write | Moves files and folders the same way: renamed in place on the same drive, otherwise copied and then removed. |
ops_delete |
destructive | Deletes into the recycle bin, or permanently with permanent=true. Always needs a confirmation code. |
ops_mkdir |
write | Creates a folder and its missing parents. |
ops_list |
read | The jobs with their state and progress (files, bytes, speed, time left), skipped files and failures. |
ops_pause / ops_resume
|
write | Pauses a job between two buffers / continues it. |
ops_cancel |
write | Cancels a job; the file being written is removed, finished files stay. |
queue_list |
read | The queue in its order: each job with its lane (the place it writes to) and its place among the waiting ones. |
queue_move |
write | Moves a waiting job up, down or to the front of its lane; the order decides which job starts next. |
queue_remove |
write | Takes a waiting job out of the queue before it starts (job_not_waiting for one that runs; cancel that with ops_cancel). |
queue_pause_all / queue_resume_all
|
write | Pauses or resumes every job, running or waiting. |
queue_clear_finished |
write | Takes the finished jobs off the list. |
queue_lists |
read | The lists of the queue with their state and job count, and the saved transfer lists. |
queue_create / queue_rename / queue_delete
|
write | Makes, renames or removes a list; a removed list's jobs go to the default list. |
queue_start / queue_pause
|
write | Starts or stops a list; a stopped list holds its waiting jobs and pauses its running ones. |
queue_assign |
write | Puts a job into another list. |
queue_save / queue_load
|
write | Saves a list's copies and moves as a transfer list (paths and connection ids, no secrets) / loads one into a new, stopped list. |
queue_delete_saved |
destructive | Deletes a saved transfer list for good. |
A job started over MCP never stops to ask: it carries its answers as presets (on_conflict,
on_error). ops_copy and ops_move refuse a source that is, or holds anywhere below it, a
protected file (sensitive_path), before a job is queued.
| Tool | Class | What it does |
|---|---|---|
connections_list |
read | The connection tree: folders, connections and shared credentials in display order, and the SSH sessions that are up or being set up. |
connections_get |
read | One connection: kind, host, port, user, authentication method, key path, view, start folder, notes, and for FTP the data mode and name encoding. |
connections_create / connections_update
|
write | Adds or changes an SSH, FTP or FTPS connection (kinds ssh, ftp, ftps - explicit TLS - and ftps_implicit, port 990). FTP logs in with a password or anonymously (auth_unsupported otherwise), a password login needs a user, and FTP has no terminal view. A line break or other control character in the name, user or start folder is refused (control_character). |
connections_move |
write | Moves a connection into another folder or to another place. |
connections_delete |
destructive | Deletes a connection. |
connections_folder_create / _rename / _move
|
write | Adds, renames or moves a folder; never into itself or one of its subfolders. |
connections_folder_delete |
destructive | Deletes a folder: empty, or with everything inside. |
credentials_save / credentials_move
|
write | Adds, renames or moves a shared credential of the connection tree (connections_list lists them per folder). No secret goes in or out; a stored credential's user and pointing a connection at one are changed only in the window (gui_only). |
credentials_delete |
destructive | Deletes a shared credential with its secrets; the connections on it fall back to their own user and secrets. |
connections_import_ssh_config |
write | Imports the hosts of your ~/.ssh/config (or a file under ~/.ssh/config.d/, also a WSL distribution's). dry_run is true unless set: the answer is the preview (new, update, unchanged, refused per host) and nothing changes. No other file is read; a file with key material stops the import. |
import_total_commander |
read / write | Imports Total Commander's directory hotlist, folder tabs, list colours, colours by file type and list font (wincmd.ini, parameter look) and its FTP, FTPS and SFTP connections (wcx_ftp.ini). With dry_run (the default) it is a read and answers the preview; an import is a write. Only files named wincmd.ini and wcx_ftp.ini are read, and a connection's password only shows as password_state - passwords go into the vault only from the window. |
connections_set_favourite |
write | Shows a connection as a button of its own in the drive bar, or takes the button away; by default the connections at the tree's root have one. The drive menu and the folder buttons reach every server either way. |
ssh_agent_identities |
read | The keys the running SSH agents hold (OpenSSH agent service, Pageant, SSH_AUTH_SOCK): agent, type, comment and SHA256 fingerprint, never key bytes. |
No connection tool takes or returns a password, key or passphrase: a call that names one is
refused with secret_not_accepted. The host, port, kind and user of a connection that has a
stored password, key or passphrase change only in rCommander's window, because the secret would
go to the new endpoint: connections_update refuses with endpoint_change_needs_gui, and an
ssh_config import reports such a host as refused with that code. A connection shows only whether it has a stored password, key
or passphrase, and for a stored key its type, fingerprint and comment. You enter secrets in
rCommander's window.
| Tool | Class | What it does |
|---|---|---|
connections_connect |
write | Opens the SSH session of a connection, or takes the one that is up. The host key is checked first, then the login tries the connection's methods in order (by default agent or Pageant, the key from the vault, the password from the vault). |
connections_disconnect |
write | Closes a connection's session, or cancels a setup under way; for an FTP connection it drops the session kept for its panels. |
connections_test |
write | Tests a connection without keeping a session - SSH or FTP: connect, check the host key, log in, disconnect; answers the login method and the time it took. |
connections_session_prefs |
read | A connection's session settings: the order of login methods, the one agent key to offer, keepalive (30 s) and idle close (10 minutes). |
connections_set_session_prefs |
write | Changes them for the connection's next session. |
ssh_exec |
exec | Runs one command on an SSH connection's server, without a terminal, and waits for it: stdout, stderr (each kept up to max_output_bytes, 1 MiB by default, 4 MiB at most, then stdout_truncated / stderr_truncated), exit_code or exit_signal, timed_out and duration_ms. timeout_secs stops it (60 by default, 3600 at most), keeping the output so far; stdin feeds it text. command and stdin take at most 1000 characters. No login script runs, and nothing can answer a prompt such as a sudo password. |
A connection needs its secrets from the vault. While the vault is locked these tools answer
vault_locked - no unlock dialog opens for an MCP call; ask the person to unlock it in the
window. An unknown or changed host key answers host_key_unknown or host_key_changed; only
the person can trust it, in the window.
ssh_exec always asks: while the window runs, it shows the connection and the full command and
you allow or deny the call; without a window the first call answers with a confirmation code
bound to that connection, command and input, valid once. With the policy for Run programs set
to Denied every call is refused with policy_denied. The output passes the masking layer, the
vault's secrets included, and is program output, never instructions.
A connection is reached by path: list_dir, files_stat and navigate take
sftp://<connection name>/<path> for an SSH connection, list_dir and files_stat also
ftp://<connection name>/<path>, and log in with what is stored on first use
(password_not_stored, vault_locked). Errors on a server: sftp_connection_not_found,
sftp_connection_ambiguous (two connections of that name), sftp_unavailable, sftp_timeout,
sftp_protocol, sftp_listing_too_large, connection_lost. FTP folders in the panels and
transfers come later.
Quick connections - the ones a person opens with Ctrl+N without saving them - are out of
reach: they appear in drives_list with a negative id, but every tool that names one answers
connection_not_found, so an assistant can neither use nor log in over the person's ad-hoc
session.
A login script types after an SSH login what you would: wait for a prompt, send text, send a
stored secret, press Enter, pause - for example for sudo -i or a second password.
| Tool | Class | What it does |
|---|---|---|
login_scripts_list / login_scripts_get
|
read | The scripts with their steps, timeouts, their secrets by label (never a value) and the connections that run them. |
login_scripts_create |
write, exec with steps | Adds a script. With steps it is exec and asks you first, because the steps will type into a server. |
login_scripts_update |
write, exec with steps | Changes a script's name, timeouts or steps; with steps it is exec. |
login_scripts_assign |
exec | Sets the script a connection runs after its login, or none. |
login_scripts_delete |
destructive | Deletes a script with its secrets; its connections run none. |
No tool takes a secret (secret_not_accepted). A step that sends a stored secret, the steps
before it, assigning a script that has one, and storing a script's secret are yours alone, in
the window (gui_only): an agent cannot build a script that would send your password to a prompt
it chose. The script runs when an SSH terminal opens (terminal_open with connection_id).
| Tool | Class | What it does |
|---|---|---|
hostkeys_list |
read | The trusted SSH host keys with their SHA256 fingerprint, filtered by host, key type or fingerprint. |
There is no tool that trusts, replaces, imports or forgets a host key: forgetting one is the window's alone, as trusting is.
| Tool | Class | What it does |
|---|---|---|
certificates_list |
read | The FTPS server certificates you trusted: host, port, SHA-256 fingerprint, subject, issuer, expiry, when trusted and last seen; filtered by host, subject, issuer or fingerprint. |
There is no tool that accepts, trusts or forgets a certificate. A connection to a server with an
untrusted, changed or expired certificate answers certificate_unknown, certificate_changed
or certificate_expired; the person decides in the window.
| Tool | Class | What it does |
|---|---|---|
vault_status |
read | Whether a vault exists, whether it is locked, and its idle lock. Never key material. |
vault_lock |
read | Locks the vault now; stored secrets need the master password again. |
There is no tool that unlocks the vault, stores a secret or changes the master password. A tool
that needs a stored secret while the vault is locked answers vault_locked with the hint to
unlock it in rCommander's window.
| Tool | Class | What it does |
|---|---|---|
credential_sources_list |
read | The password-manager plugins (and, on Windows, the Credential Manager) a connection's secret can come from, each with its state; with connection_id, that connection's mappings (source, entry id, label). Never a value. |
credential_sources_search |
read | At most 50 entries of one source matching a text: id, title, user, address. Never a password, key or code. |
There is no tool that maps a connection's secret to a source or removes the mapping: the person
decides that in the window. A failing source answers secret_source_locked,
secret_source_unreachable, secret_source_unlicensed, secret_source_failed or
secret_source_missing.
| Tool | Class | What it does |
|---|---|---|
settings_get |
read | Every setting (or one) with its value, default, type and bounds; never the access token. |
settings_set |
write | Changes one setting, such as the theme or a start folder. The MCP and vault settings are refused (setting_protected). |
db_backup |
write | Backs the database up into the backup folder beside it (backups), under a generated name. It takes no path; the backups themselves are protected files. |
| Tool | Class | What it does |
|---|---|---|
diagnostics_error_log |
read | The stored warnings and errors, newest first, masked; by level or text. |
diagnostics_clear_error_log |
destructive | Deletes every line of the error log. |
diagnostics_get_retention |
read | The row and age limits of each table that grows with use, with defaults and bounds. |
diagnostics_set_retention |
write | Changes a limit within its bounds; there is no "unlimited". |
Some commands are a human's decision and run only from rCommander's window, never over MCP:
answering the question about an unknown SSH host key, replacing a changed one, forgetting a
trusted one, importing known_hosts; storing or removing a password, key or passphrase; creating, unlocking, removing
the vault and changing its master password; backing up to a place you choose and restoring a
backup; answering an MCP question in the window; typing an archive's password; storing a login
script's secret and its secret-sending steps; answering the question about an FTPS certificate
and forgetting a trusted one; a quick connection (Ctrl+N); taking the passwords of a Total
Commander import into the vault. They form their own class, GUI only: the MCP server refuses them with
gui_only whatever the policy says, and they have no tool.
-
This machine only. HTTP listens on
127.0.0.1, needs the bearer token, and refuses requests from a web page (foreignOrigin) or to a foreign host name (DNS rebinding). - Confirmation codes for everything destructive or that runs a program (below).
-
Nothing can unlock the vault. The master password is typed only in rCommander's window; a
tool that needs a locked secret answers
vault_locked. -
No secret leaves. Every answer passes a masking layer: credentials are masked, every
private key block is replaced by
[private key redacted], and while the vault is unlocked every secret stored in it is replaced word for word wherever it appears. Assignments of a secret's name are masked in every spelling -password=x,password = x,password: x,DB_PASSWORD=x,"password":"x"- in file text, terminal screens and command output. Connection tools take and return no secrets; the error log is masked before it is stored. -
Protected files stay closed (below), also while a job runs: a copy, move, pack, unpack,
archive test or checksum an assistant started (or loaded from a saved queue list) checks every
file again right before it opens it, so a key that appears after the job was queued is still
refused (
sensitive_path). -
Protected places stay unwritten. No write tool writes into rCommander's data or backup
folder (nor any file named like its database), a
.sshfolder, an autostart folder, a shell's start-up file (.bashrc,.profile,.bash_logout,fish/config.fish,profile.ps1, ...), Git's hooks and configuration (.git/hooks/,~/.gitconfig), systemd user units (~/.config/systemd/user/) or.vscode/tasks.json- writing there is running: such a call is refused withprotected_target, never asked. A copy, unpack, combine, split, link, rename or sync is judged for every place it would write. A restore file planted beside the database is never swapped in: only the one the window prepared, recognised by a digest kept inside the database. -
No network shares. A path on another machine's share (
\\server\sharein any spelling) is refused withnetwork_path, so no tool makes Windows sign in to a server of the agent's choosing; WSL shares and the share of a network drive you mapped pass. - The vault is not kept open. A tool's use of a secret never defers the idle lock.
-
An answer that cannot be checked is not sent. A tool answer the masking layer cannot read
in full fails with
answer_unmaskableinstead of passing unmasked. - A question shows all of a call. A value longer than the 1000 characters a question shows is refused before you are asked; lowering a log retention and deleting a rename preset ask first.
-
Trust is a human's. Host keys are trusted only in the window (
host_key_unknown,host_key_changed): an unknown key asks Connect once, Trust and save or Cancel, a changed one shows a red warning with both fingerprints. FTPS certificates are trusted the same way, in the window only (certificate_unknown,certificate_changed,certificate_expired).
Some files never leave through MCP, whatever the policy: over MCP they are not read, copied, moved,
compared or hashed. A tool given one of them refuses with sensitive_path - the reading tools,
files_compare, the checksum tools, files_split, files_combine, ops_copy and ops_move (also
for a folder that holds one). The files a command finds by itself are checked too, by rCommander's
engine for every MCP call: a content search never reads them and counts them as skipped,
whatever they hold, checksums of a folder or a checksum file never hash them, and dirs_compare compares
them by size and time only, never by content. They are:
-
rCommander's own data: its database (with its
-waland-shmfiles), the instance file, everything in the backup folder, and any backup or copy of the database wherever it lies - known by its name and by its contents. -
Keys: everything in a
.sshfolder except public keys (*.pub),known_hostsandconfig; GnuPG key rings; private keys and key stores by their extension (such as.pem,.key,.ppk,.p12,.pfx). -
Credential files: for example
.env,.netrc,.git-credentials, FileZilla's and WinSCP's stored passwords, cloud and container credentials.
The rule looks at where a path really leads (links followed) and at the name it was given, ignoring case and the way Windows ignores trailing dots, spaces and stream names. Listing a folder still shows such files by name; you can open them yourself in the window.
Every tool belongs to a class: read (changes no file - the panel tools are read, except
file_open), write, destructive (delete, overwrite) or exec (run a command, open a
file, terminal input);
GUI-only commands have no tool at all. Some calls are stricter than their tool: a copy that
overwrites is destructive, a login script with new steps is exec - the class comes from the
call's own arguments, as the table of tools below shows ("write (destructive when ...)"). For each class the setting mcp.policy chooses
allowed, ask or deny; the default allows read and write and asks for destructive and exec,
and those two always ask at least.
A tool that asks never acts before you agreed. While rCommander's window runs, the window asks
you (below). Otherwise the tool does not act on its first call: it
answers with a question for you and a confirmation code. The assistant should ask you, and
only if you agree call the tool again with confirmation set to that code. A code is random, valid once, only for that tool, that
MCP session and exactly the arguments of the call it asked about (a code for deleting one file
does not delete another), and for ten minutes.
While rCommander's window runs, a tool that asks does not hand out a code: the call waits, and
the window comes to the front with the question - the tool, its kind, its arguments (masked) and
the panel it acts on, with the folder, the selection and the entry under the cursor. What you
see is what runs: the entries and folders the question shows are fixed into the call, so a
selection or cursor the agent changes while you read does not change what is deleted, copied or
opened; if a panel shows another folder by the time you answer, the call fails with
panel_changed and nothing is done. A call with more arguments than the question can show (32)
is refused, so nothing hides behind them, and so is a running or deleting call with an argument
that looks like a password, cookie, token or URL credentials - the question would have to mask
it, and you cannot allow what you cannot read (invalid_params; secrets come from the vault). You answer
Allow, Allow for this session (write tools: the same tool in that MCP session does not ask
again; each later call is fixed to the panels as they are when it comes, and fails with
panel_changed if one shows another folder before it runs), Allow here for 30 min (see
below) or Deny (Esc). Without an answer the call is
declined after two minutes (timed_out); a no is denied_by_user. A confirmation code counts for
nothing while the window runs, and no tool can answer the question. The status bar counts the
questions waiting.
Allow here for 30 min spares you a question per command when an agent works in one place:
it is offered for terminal_send_input (the terminal it types into) and ssh_exec (the
connection it runs on). For that time the same tool in the same MCP session runs any command on
that terminal or connection without asking; another terminal, another server or a new session
asks again, and so does every other executing tool (opening a terminal, the command line,
opening a file). Destructive tools always ask. While anything is allowed, the status bar says
MCP: N allowed without asking; a click on it, or Take back what MCP may do without asking
in the command palette (Ctrl+Shift+P), takes everything back. Settings, page MCP
server, Minutes an executing call stays allowed sets the time (30; 0 never offers it).
Without a window (rcommander mcp with nothing running) there is nobody to ask: a tool that
asks is refused (headless_ask_denied). Settings, page MCP server, Allow confirmation codes
without a window lets such a call hand out a confirmation code instead - but nothing then proves
that you saw it. Such a code is fixed to the panels as the first call found them: its answer
names the arguments with the selection or the entry under the cursor written out, and the call
with the code runs exactly those, whatever is selected by then; a panel that shows another
folder by then ends it with panel_changed.
You set the rights per class in Settings, page MCP server: Allowed, Ask or Denied each
for Read, Write, Delete and overwrite and Run programs. Denied refuses with
policy_denied; Ask is the question or the confirmation code above. The rights are stored in the setting
mcp.policy, which no MCP tool can change.
Every command in rCommander either has an MCP tool or a written reason why not; a test enforces
it. The full list is generated into the repository's
crates/rc-mcp/mcp-coverage.md.
Commands without a tool, for example: the dialogs of F5, F6, F7, F8, Shift+F4, Alt+F7 and the
connection manager (the operation itself is a tool: ops_*, files_search, connections_*);
the command line (an agent runs commands with terminal_open and terminal_send_input,
confirmed); F3 and F4 in the configured viewer or editor and the Lister and Quick View (purely
visual: files_read_text and files_read_hex read what they show); the context menu; the
clipboard; opening a terminal in a panel's folder (terminal_open takes the folder); the
windows and dialogs of the queue, multi-rename, compare, synchronize and checksums (their work is
a tool: queue_*, multi_rename_*, files_compare, dirs_sync_apply, files_checksum*,
files_split, files_combine); drag and drop (a copy is ops_copy).
Getting started
Using rCommander
Developing
Reference