Skip to main content
Glama
Krineon-lab

Rob Desktop Commander

by Krineon-lab

Rob Desktop Commander

Rob Desktop Commander is a private, self-hosted Model Context Protocol (MCP) server for controlling a workstation from an MCP-capable AI client.

It is designed to replace the hosted Remote Desktop Commander relay for Rob's workflows: no provider account dependency, no telemetry service, no third-party relay quota, and a tool surface optimized for repeated software-project work.

Current version

v0.3.2

Core goals:

  • efficient single-call operations instead of unnecessary MCP round-trips;

  • fair multi-project concurrency;

  • bounded queues and output buffers;

  • safe concurrent file editing;

  • efficient streaming search;

  • detailed optional JSONL diagnostics;

  • no inbound public MCP listener;

  • Windows-first behavior while remaining cross-platform.

Related MCP server: local-mcp

Architecture

ChatGPT / MCP client
        |
        | MCP
        v
OpenAI Secure MCP Tunnel (optional for ChatGPT)
        |
        | outbound HTTPS from the PC
        v
tunnel-client
        |
        | stdio
        v
Rob Desktop Commander
        |
        +-- workspace-aware scheduler
        +-- filesystem
        +-- streaming ripgrep
        +-- PowerShell / shell processes
        +-- persistent process sessions
        +-- metrics + optional debug JSONL logs

Rob Desktop Commander itself speaks MCP over stdio. It does not open an inbound network port.

Tool surface

The v0.3 surface deliberately stays compact even after adding batch operations.

Tool

Purpose

rob_status

Runtime, concurrency, logging and optional performance/session diagnostics

rob_logging

Runtime logging status / enable / disable / flush / log-level control

fs_read

Efficient text range, tail, or base64-prefix read; hashing opt-in

fs_read_many

Batch-read multiple UTF-8 file prefixes

fs_write

Atomic write/append with optional SHA-256 precondition

fs_write_many

Concurrent multi-file creation/update in one MCP call

fs_patch

Exact validated patch of one file or multiple files in parallel

fs_list

Bounded tree listing with common generated directories excluded by default

fs_manage

stat/mkdir/move/copy/delete

search

Streaming ripgrep content, filename, or files-with-matches search

workspace_inspect

One-call project root + Git status + manifests + compact top-level inspection

exec

One shell command; direct result or automatic persistent-session detach

exec_batch

Multiple commands in parallel or sequentially in one MCP call

process

Persistent process start/read/input/kill/list via a single action-based tool

The older five-tool process surface was intentionally collapsed into process so the model has fewer tools to choose between.

Efficiency changes in v0.3

Fewer MCP round-trips

exec still returns short-command output in the same MCP call. Longer commands auto-detach.

New high-value batch operations reduce repeated calls further:

  • exec_batch: up to 12 independent commands;

  • fs_write_many: up to 32 independent files;

  • fs_patch: up to 32 independent files when using files[];

  • workspace_inspect: replaces several common tree / Git / manifest inspection calls.

File hashing is now opt-in

Earlier versions calculated SHA-256 around writes even when the caller did not need it.

v0.3 only performs a full existing-file hash when:

  • expectedSha256 is supplied, or

  • the caller explicitly asks for a returned hash.

For a normal overwrite, the after-hash can be computed directly from the content already in memory instead of rereading the file.

search no longer needs to buffer an entire repository result set before returning the first N results.

It streams ripgrep output and terminates collection after either:

  • maxResults is reached, or

  • the configured output-character budget is reached.

Modes:

  • content: matching lines;

  • name: matching paths;

  • files: files containing matching content.

Efficient text reads

fs_read supports:

  • fast direct line-range reads for files up to 2 MiB, avoiding async readline overhead;

  • bounded-memory streaming fallback for larger files;

  • adaptive backward tail reads that start at 1 KiB and grow only when more history is needed;

  • binary/base64 prefixes;

  • optional SHA-256.

The fast range path does not cache file contents, so external edits are visible immediately. This is particularly useful for source files and large debug logs.

Efficient process output

Persistent process reads are event-driven.

A process { action: "read", waitMs: ... } call wakes as soon as:

  • new stdout/stderr arrives, or

  • the process exits,

instead of blindly sleeping for the whole wait interval.

The process output buffer is bounded. If an extremely noisy process exceeds the retained output budget, old events are dropped in batches and the response reports droppedBeforeSeq.

Multi-project concurrency

Workspace detection first searches upward for a Git root. If none exists it falls back to common project markers, including:

  • package.json

  • pyproject.toml

  • Cargo.toml

  • go.mod

  • Maven / Gradle

  • Composer

  • Ruby

  • Elixir

  • Deno

The workspace resolver uses a bounded TTL/LRU-like cache.

Default scheduler limits:

  • child processes: 8 global / 3 per workspace;

  • ripgrep searches: 4 global / 2 per workspace;

  • filesystem I/O: 24 global / 8 per workspace.

The queue is fair round-robin by workspace, not a single FIFO. A project with a large backlog therefore cannot put every later project behind all of its queued work.

Auto-detached processes keep their process slot until they actually exit.

Writes/patches touching the same path are serialized; unrelated paths can run concurrently.

Queues are also bounded by default:

  • 1000 queued operations globally

  • 100 queued operations per workspace

This prevents an accidental burst from consuming unbounded memory.

In-memory metrics

rob_status reports per-tool metrics such as:

  • call count;

  • errors;

  • average / maximum / last duration;

  • average / maximum queue wait.

It also reports pool utilization and rejection/timeout counters.

By default rob_status does not include the full session list to keep its response compact. Use includeSessions: true when needed.

Detailed debug logging

File logging is disabled by default.

Enable it for the first days of testing with:

$env:ROB_DC_LOG_ENABLED = "1"
$env:ROB_DC_LOG_LEVEL = "debug"

or use the convenience launchers:

.\scripts\start-debug.ps1

For the ChatGPT tunnel runtime:

.\scripts\run-openai-tunnel-debug.ps1

Default log directory:

<repository>\.rob-dc\logs

Logs are JSON Lines (.jsonl) and include events such as:

  • server startup;

  • tool start/end/error and duration;

  • queue wait;

  • process start/close/error/timeout/kill;

  • process exit code and duration.

Payload contents are not fully logged by default. Strings are represented by size plus a short redacted preview. Obvious API-token patterns and secret-like keys are redacted.

To include fuller payloads while debugging:

$env:ROB_DC_LOG_INCLUDE_PAYLOADS = "1"

Use this only when necessary because file contents, commands or other sensitive data may then be present in the logs.

Logging can also be changed without restarting through rob_logging:

action=status
action=enable
action=disable
action=flush
action=set_level   level=debug|info|warn|error

Log rotation defaults to 25 MB per file and 7 files.

Configuration

Variable

Default

Meaning

ROB_DC_ALLOWED_DIRS

user home

Filesystem-tool roots; * means unrestricted

ROB_DC_SHELL

PowerShell on Windows

Shell used for shell commands

ROB_DC_TIMEOUT_MS

30000

Default exec process lifetime

ROB_DC_DETACH_AFTER_MS

2500

Time before exec becomes a persistent session

ROB_DC_QUEUE_TIMEOUT_MS

15000

Maximum wait for a saturated pool

ROB_DC_MAX_QUEUE_GLOBAL

1000

Maximum queued jobs per pool globally

ROB_DC_MAX_QUEUE_PER_WORKSPACE

100

Maximum queued jobs per project in a pool

ROB_DC_SESSION_RETENTION_MS

600000

Completed persistent-session retention

ROB_DC_MAX_PROCESSES

8

Running child processes globally

ROB_DC_MAX_PROCESSES_PER_WORKSPACE

3

Running child processes per project

ROB_DC_MAX_SEARCHES

4

Concurrent searches globally

ROB_DC_MAX_SEARCHES_PER_WORKSPACE

2

Concurrent searches per project

ROB_DC_MAX_IO

24

Concurrent filesystem jobs globally

ROB_DC_MAX_IO_PER_WORKSPACE

8

Concurrent filesystem jobs per project

ROB_DC_MAX_OUTPUT_CHARS

1000000

Per-stream retained/output budget

ROB_DC_MAX_READ_BYTES

2000000

Default binary/tail/patch size budget

ROB_DC_MAX_SEARCH_RESULTS

500

Global search-result ceiling

ROB_DC_WORKSPACE_CACHE_TTL_MS

300000

Workspace cache TTL

ROB_DC_WORKSPACE_CACHE_MAX

10000

Workspace cache entry ceiling

ROB_DC_LOG_ENABLED

0

Enable JSONL file logging

ROB_DC_LOG_LEVEL

debug

Minimum file-log level

ROB_DC_LOG_DIR

.rob-dc\logs

Log directory

ROB_DC_LOG_INCLUDE_PAYLOADS

0

Include expanded payload data

ROB_DC_LOG_MAX_MB

25

Maximum size per log file

ROB_DC_LOG_MAX_FILES

7

Rotated files retained

ROB_DC_LOG_FLUSH_MS

250

Buffered log flush interval

ROB_DC_LOG_BUFFER_EVENTS

5000

Maximum in-memory log event queue

ROB_DC_ALLOW_DANGEROUS

0

Disable the lightweight dangerous-command guard

The launch scripts default UV_THREADPOOL_SIZE to 8 to give concurrent filesystem operations more room on Windows.

Install

git clone https://github.com/Krineon-lab/MCP-CLI.git
cd MCP-CLI
npm install
npm test

Normal local run:

.\scripts\start-local.ps1

Debug local run:

.\scripts\start-debug.ps1

Connect to ChatGPT with Secure MCP Tunnel

  1. Create a Secure MCP Tunnel in OpenAI Platform and obtain its tunnel_... ID.

  2. Create a restricted Runtime API key with Tunnels Read + Use.

  3. Run the one-time Windows setup:

.\scripts\configure-tunnel-autostart.ps1

The setup:

  • asks for the tunnel ID and runtime key locally;

  • stores the runtime key encrypted with Windows DPAPI for the current user;

  • creates the rob-desktop tunnel-client profile;

  • runs doctor;

  • enables detailed Rob Desktop Commander logging;

  • enables the live activity console;

  • installs the Rob Desktop Commander Scheduled Task;

  • starts the tunnel immediately.

The live console shows compact, color-coded activity without full payloads: file reads/writes, searches, commands, process lifecycle, durations, queue waits, errors and tunnel health. Closing the console does not stop the tunnel.

Windows management command

RobDC.cmd provides one compact control surface for day-to-day use:

RobDC status
RobDC start
RobDC restart
RobDC stop
RobDC monitor
RobDC monitor-stop
RobDC logs

Running the repository RobDC.cmd without arguments opens an interactive menu. On Windows, it can optionally be copied to a directory on the user PATH (for example %USERPROFILE%\bin) and exposed through Desktop shortcuts for the control menu and live monitor.

The Scheduled Task runs at user logon (rather than before login) so the current-user DPAPI secret can be decrypted safely. It restarts automatically after failures and removes any stale orphaned rob-desktop tunnel-client instance before starting a new one.

The runtime script used by the task is:

.\scripts\run-tunnel-service.ps1

Once the daemon is healthy, open ChatGPT connector settings, choose Connection: Tunnel, then select the tunnel or paste its tunnel ID. The daemon must remain running for connector discovery and every later MCP call.

Security model

This server is intentionally powerful.

ROB_DC_ALLOWED_DIRS restricts the dedicated filesystem tools. It is not an operating-system sandbox for arbitrary shell commands.

Commands launched through exec, exec_batch or process run with the permissions of the account that started the server.

For hard isolation, run Rob Desktop Commander under a dedicated low-privilege account, VM or container.

The dangerous-command matcher is a guardrail, not a security boundary.

Never expose the stdio server through an unauthenticated public proxy.

Testing

npm run check
npm test
npm run bench

The automated suite covers:

  • dangerous-command regressions;

  • fair concurrency;

  • same-path locking;

  • bounded queue rejection;

  • workspace detection/cache isolation;

  • streaming search limits;

  • efficient tail/range reads;

  • real concurrent MCP calls across two projects;

  • JSONL logging enable/flush/disable;

  • batch file patch/write;

  • batch command execution;

  • event-driven persistent-process reads;

  • normal MCP handshake/tool enumeration.

Local benchmark

On the development PC during the v0.3 second optimization pass:

Benchmark

Result

workspace resolver, cold + 999 warm calls

7.87 ms

tail read ×100

32.23 ms

line 40000 range read ×20

32.18 ms

fair scheduler, 2000 jobs

13.07 ms

The v0.3.2 text-read optimization reduced the local tail benchmark from 81.9 ms to 32.23 ms and the line-40000 range benchmark from 263.1 ms to 32.18 ms on the development PC. The earlier workspace benchmark was ~61.5 ms before the exact-path cache.

These are local microbenchmarks, not universal performance guarantees.

License

MIT. See LICENSE.

Desktop Commander is a separate MIT-licensed project; see THIRD_PARTY_NOTICES.md.

Available Tools

14 tools
execB
Destructive

Run a shell command efficiently. If it finishes before detachAfterMs, stdout/stderr and exit code are returned in this same MCP call. If still running, it automatically becomes a persistent session and returns sessionId.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNo
shellNo
commandYes
timeoutMsNo
detachAfterMsNo

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond that: it discloses exactly what is returned on fast completion (stdout/stderr plus exit code in the same call) and that a slow command silently converts into a persistent session returning a sessionId. It omits timeout/cancellation behavior and permission requirements, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core action and followed by the conditional outcome, with no redundancy. The adverb 'efficiently' is mild filler that earns nothing, otherwise the structure is exemplary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a session-spawning shell tool with no output schema and zero parameter documentation, the description covers the most important unknown (what comes back and when it becomes a session) but leaves four of five parameters, timeout behavior, and session lifecycle unaddressed. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 5 parameters, so the description carries the full burden and mostly fails it. It explains only detachAfterMs (indirectly, via the completion threshold) and the command parameter; cwd, shell, and timeoutMs are never mentioned, leaving the agent to guess their semantics and defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Run a shell command') and the description's second sentence clarifies the execution model. However, it never distinguishes itself from the sibling process_start, which an agent could reasonably pick for the same task, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: nothing says when to use exec versus process_start, process_read, or process_input. The description does explain the conditional fallback to a persistent session, which hints at how the tool behaves, but there are no explicit when/when-not rules or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fs_listB
Read-onlyIdempotent

List a directory tree with bounded recursion and result count.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
depthNo
maxEntriesNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered. The description contributes genuinely new behavioral context by disclosing that recursion and result count are bounded, but it never says what happens at the bound (silent truncation, partial results, or error) or whether results are ordered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the core verb and resource come first and the two bounding constraints follow compactly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with no output schema, an agent still lacks the return shape, entry ordering, and truncation semantics — though the annotations and the "bounded" phrasing cover just enough that the tool is callable. It is minimally viable rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden and largely does not: it alludes to recursion depth and entry caps conceptually but never names `depth` or `maxEntries`, their defaults (2 and 1000), or their limits. The only remaining signal comes from the schema's own min/max/default constraints, not from the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ("List") plus resource ("directory tree") makes the operation unmistakable and separable from fs_read/fs_write/fs_manage siblings that operate on file contents rather than enumerating entries. It stops short of explicitly naming those siblings or the boundary between listing and reading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no statement of prerequisites (permissions, path must exist), and no routing to alternatives such as fs_manage for higher-level operations. The mention of "bounded recursion" hints at limits but does not tell the agent when this tool is the right pick.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fs_manageC
Destructive

Perform filesystem management in one tool: stat, mkdir, move, copy or delete. destination is required for move/copy.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
forceNo
operationYes
recursiveNo
destinationNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, so safety is partly communicated by structure. The description adds nothing beyond the destination rule: it never says delete is irreversible or destructive, what force does on delete/move, or that mkdir with recursive creates parents. For a five-mode mutation tool this is thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence, front-loaded with the operation list and ending with the one parameter constraint that matters. No padding, though the brevity contributes to the coverage gaps elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, no annotation elaboration, and 0% schema coverage mean the description is the only source of behavioral and parameter detail — yet it covers only one constraint on one of five parameters for a multi-mode destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 5 parameters, so the description must carry the burden. It only clarifies that destination applies to move/copy, leaving force, recursive, and path semantics completely undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific resource (filesystem) and enumerates the five operations (stat, mkdir, move, copy, delete), which lets an agent distinguish it from the read/write/list/patch siblings that cover other filesystem surface. It is clear but does not explicitly say how it differs from fs_write, fs_read, or fs_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description supplies one conditional rule — destination is required for move/copy — which is genuine usage guidance for parameter selection. It gives no guidance on when to choose this tool over fs_write, fs_read, fs_list, or fs_patch, nor on prerequisites or the fact that it handles multiple unrelated operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fs_patchA
Destructive

Apply one or more exact text replacements to a file in memory, validate expected match counts, then write once atomically.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
editsYes
expectedSha256No

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly=false, destructive=true). The description adds meaningful details beyond annotations: edits are applied in memory, match counts are validated, and the write is atomic. It doesn't mention atomicity guarantees or failure behavior, but adds useful operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One efficient sentence that front-loads the core operation and includes key constraints. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 3 params and no output schema, the description covers the high-level flow but omits parameter details (e.g., expectedSha256, expected count semantics) and error handling. Annotations cover safety, but parameter-level guidance is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description could compensate but doesn't name any parameters. However, it does describe the core semantics of 'edits' and match validation. The nested 'expected' field is not explained. Baseline of 3 is appropriate given the schema does some structural work but lacks descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (apply text replacements), the target resource (a file), and the mechanics (in memory, atomic write). It clearly distinguishes fs_patch from fs_write (full write), fs_read, and fs_manage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use for exact text replacements and mentions match validation, but doesn't explicitly say when to use fs_patch versus fs_write or fs_manage. No exclusions or prerequisites are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fs_readA
Read-onlyIdempotent

Read one local file. Supports UTF-8 line slicing or base64 for binary files. Prefer fs_read_many when several files are needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
encodingNoutf8
maxBytesNo
maxLinesNo
offsetLineNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuine context beyond that: two encoding modes and line-slicing support for text vs base64 for binary. It omits truncation/error behavior (e.g. what happens when maxLines is hit).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler, with the core action stated first and the sibling routing last. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description should hint at the return shape and truncation semantics; it does not say whether content is truncated at maxLines/maxBytes or how binary results are returned. For a read tool with five parameters and silent defaults, that is a meaningful gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden, and it only partially does: 'UTF-8 line slicing' maps to maxLines/offsetLine and 'base64 for binary files' maps to encoding. maxBytes, the default 1000-line cap, and the 20MB ceiling go unexplained, yet these strongly affect output.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read one local file') and explicitly eliminates its nearest sibling with 'Prefer fs_read_many when several files are needed.' An agent can select between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear routing rule to the alternative tool (fs_read_many for multiple files), which is exactly the ambiguity in this tool family. It stops short of any exclusion beyond that, e.g. when to use fs_list or search instead of reading directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fs_read_manyA
Read-onlyIdempotent

Read multiple UTF-8 files in one MCP call. Use this instead of repeated fs_read calls when gathering project context.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYes
maxBytesEachNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so safety is covered. The description adds the UTF-8 encoding constraint and the single-call batching rationale, but says nothing about partial-failure behavior, per-file errors, or truncation via maxBytesEach.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the core capability front-loaded and the routing advice immediately after. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 0% schema coverage and no output schema, the description should explain the return shape (per-file content vs. errors) and the maxBytesEach truncation semantics. For a batch tool where partial failures are likely, these omissions matter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry parameter meaning. It implies a plural path input but never explains the paths array, and completely omits maxBytesEach — including that it silently caps per-file content — leaving the truncation parameter undocumented everywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read) and resource (multiple UTF-8 files) with explicit batch scope, and distinguishes itself from the fs_read sibling by framing the batch case. An agent can tell it apart from fs_read without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this instead of repeated fs_read calls when gathering project context" gives an explicit condition and names the alternative tool. It stops short of stating when a plain fs_read is still preferable, so it lacks full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fs_writeA
Destructive

Create, overwrite or append a UTF-8 file. Overwrites are atomic by default and can use expectedSha256 as an optimistic concurrency guard.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNooverwrite
pathYes
atomicNo
contentYes
createParentsNo
expectedSha256No

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=false). The description adds non-obvious behavioral context beyond that: atomicity is the default and expectedSha256 serves as an optimistic concurrency guard. That's genuinely useful. However, it omits what happens on concurrency conflict, whether append is atomic, or what atomic=false implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. The primary verbs and the default behavior are front-loaded, followed by the concurrency-guard detail. Every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter mutation tool with no annotations on atomic semantics and no output schema, the description supplies the critical missing context (atomic write, optimistic concurrency). It leaves append-mode behavior and conflict/error semantics unexplained, so it isn't fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the purpose of two non-obvious parameters: atomic (default overwrite atomicity) and expectedSha256 (optimistic concurrency guard). It does not cover mode semantics (overwrite vs append), createParents, or path/content, but the parameters it does address are the highest-value ones.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb set (create, overwrite, append) and resource (UTF-8 file). It is distinguishable from fs_read and fs_patch by naming the write semantics, though it doesn't explicitly contrast with fs_patch, which also modifies files. Clear but no sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus fs_patch (for edits) or when to choose append vs overwrite mode. The description conveys capability but no selection criteria or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

process_inputC
Destructive

Send input to an interactive persistent process session.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYes
newlineNo
sessionIdYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered externally. The description adds only that the target is an 'interactive persistent process session', which is useful target context but discloses nothing about blocking behavior, what the input overwrites, or error semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or repetition. It is appropriately sized as a fragment, though it is arguably too terse for the amount of behavior it needs to convey, which is captured under contextual completeness rather than bloating this dimension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent mutation tool with 0% parameter coverage and no output schema, the description omits critical context: that a session must already exist, whether the write appends a newline, whether it blocks, and how failures surface. Annotations carry the safety profile, but the remaining gaps are substantial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters, so the description must compensate and largely does not. The word 'input' loosely maps to the input parameter, but sessionId, and especially the newline default of true, receive no clarification.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb (Send) and resource (input) against a specific target (interactive persistent process session). It is distinguishable from siblings like exec or process_start because it targets an existing session, though it does not explicitly name any alternative tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no prerequisites (e.g., a session must first be created via process_start), and no comparison to alternatives like exec or process_start. The phrase 'persistent process session' weakly implies the context but leaves everything to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

process_killA
DestructiveIdempotent

Terminate a persistent process session, including its child process tree on Windows.

ParametersJSON Schema
NameRequiredDescriptionDefault
sessionIdYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new context beyond them: the blast radius extends to the child process tree, and that tree behavior is Windows-specific. It still omits whether termination is graceful or forced and what happens on non-Windows hosts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the action front-loaded and zero filler. The Windows qualifier is placed where it is most relevant, immediately after the scope claim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool whose annotations fully declare the safety profile and which has no output schema, the description covers the essential what and blast radius. Minor gaps remain around failure modes (invalid or already-dead sessionId) and graceful vs forced termination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and schema coverage is 0%, so the description must carry meaning but never mentions sessionId at all. The schema's uuid format plus strict pattern partially self-documents the expected value shape, but the description adds nothing about where to obtain a valid sessionId, so 3 is the ceiling.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (terminate) and resource (a persistent process session), which is enough to distinguish it from process_read, process_input, and process_start. It does not explicitly call out which sibling to use instead, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no mention of prerequisites (e.g. a valid active sessionId), and no routing to alternatives such as process_list or process_input. The only usable cue is the implicit 'this ends the session', which the agent must infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

process_listA
Read-onlyIdempotent

List active and recently completed persistent process sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description's only added behavioral detail is the temporal filter ("active and recently completed"), which usefully signals that older history is excluded, but it says nothing about ordering, pagination, or result volume.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no filler, front-loading the verb and resource with the scope qualifier attached. Every element of the sentence does work.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless list tool with annotations covering the safety profile, the description is nearly sufficient. Since no output schema exists, it could have hinted at what each listed session contains or how results are ordered, but this is a minor gap for such a simple operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain; the baseline for a parameterless tool is 4. The description correctly avoids inventing filtering options that the empty schema does not support.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ("List") and resource ("persistent process sessions") with a qualifying scope ("active and recently completed"). This clearly separates it from process_read/process_input/process_kill, which act on a single session, though it does not name or reference those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is the discovery step before process_read or process_input, but the description states no explicit when-to-use condition, no prerequisites, and no contrast with sibling tools. Nothing is misleading, but nothing is spelled out either.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

process_readA
Read-only

Read new output events from a persistent process session. Omit cursor for incremental reads; provide cursor for explicit replay position.

ParametersJSON Schema
NameRequiredDescriptionDefault
cursorNo
waitMsNo
sessionIdYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, non-destructive, openWorld=false, but idempotentHint=false is notable and the description explains why: omitting the cursor consumes new events incrementally while supplying one replays from a fixed position. That stateful-consume behavior is genuine value beyond the annotations, though waitMs semantics and buffer/consumption behavior remain undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core action first and the cursor semantics second. No filler, nothing repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description never characterizes the returned events or the cursor value an agent should pass next, and waitMs is unexplained. For a streaming-read tool this leaves real gaps an agent would need to probe at runtime.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the param burden. It explains cursor's two modes well, but sessionId is left to the schema and waitMs (a 0-10000 long-poll-style delay) is never explained despite being the least self-evident parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: reading output events from a persistent process session. The scope word 'persistent process session' separates it from fs_read and search, though it never names a sibling or explains the boundary with process_input.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives conditional guidance for the cursor parameter (omit for incremental, provide for replay), which is really parameter usage rather than tool selection. It offers no statement of when to reach for this tool versus process_list, process_input, or fs_read.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

process_startA
Destructive

Start a long-running or interactive command immediately and return a sessionId without waiting.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNo
shellNo
commandYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, non-idempotent, non-read-only, and this description's 'without waiting' adds genuinely new async behavior context. However, it does not disclose consequences (e.g., that starting a command spawns a persistent process/session requiring later process_kill), nor any resource or permission notes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence that front-loads the action and the key behavioral differentiator ('without waiting'). No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the core async behavior and return value, but a mutation tool that spawns persistent OS processes ought to mention that the resulting process must be managed (process_kill) and clarify cwd/shell semantics. Given no output schema and zero param coverage, more disclosure is warranted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description only explains the required 'command' implicitly, and provides no meaning for 'cwd' (working directory) or 'shell' (shell selection). With three parameters undocumented in both schema and description, the tool relies entirely on param-name inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific action and resource: 'Start a ... command' and states the key outcome 'return a sessionId without waiting'. This clearly distinguishes it from 'exec' (synchronous execution) and from process_read/process_input/process_kill which operate on an already-started session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'long-running or interactive' indicates the use case well, but no explicit exclusion of 'exec' or mention of following up with process_input/process_read. For a session-oriented tool this is clear context without full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rob_statusB
Read-onlyIdempotent

Show Rob Desktop Commander runtime, security scope and active process sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is covered. The description adds what the tool surfaces (runtime, security scope, active process sessions), which is useful, but says nothing about freshness, cost, or output shape. Appropriate credit over the annotation baseline, but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. The list of exposed facets is dense but every clause is informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the return-value burden itself, and it does name the three main pieces of information returned. It lacks detail on format or scope boundaries, but for a zero-parameter status tool this is close to sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema carries no semantics to clarify; the baseline for a parameterless tool is 4. There is nothing in the description that misrepresents the inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Show") and a concrete resource (Rob Desktop Commander runtime, security scope, active process sessions). It is distinguishable from process_list because it describes runtime/security introspection rather than process enumeration, though it never explicitly names a sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus the many process_* and fs_* siblings, nor any prerequisite or trigger. Usage is only weakly implied by the word "status".

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.2.0
    • First observedexec
    • First observedfs_list
    • First observedfs_manage
    • First observedfs_patch
    • First observedfs_read
    • First observedfs_read_many
    • First observedfs_write
    • First observedprocess_input
    • First observedprocess_kill
    • First observedprocess_list
    • First observedprocess_read
    • First observedprocess_start
    • First observedrob_status
    • First observedsearch

TDQS

A3.6/5.0

Scored across 14 tools

Disambiguation4/5

Most tools target clearly distinct resources or actions: process_* covers session lifecycle, fs_* covers filesystem operations, and search/exec are specific utilities. The main overlap is between exec and process_start, since exec can implicitly become a session, but the descriptions differentiate quick commands from explicit long-running sessions.

Naming Consistency4/5

Nearly all names use snake_case with a domain prefix (process_, fs_, rob_) followed by an action, which is predictable and readable. The bare names search and exec are minor deviations from that prefix pattern, but not enough to cause confusion.

Tool Count5/5

At 14 tools, the set is well-scoped for a desktop commander covering process control, filesystem access, search, and shell execution. Each tool earns its place, and fs_manage consolidates multiple filesystem operations without bloating the count.

Completeness5/5

The server covers the full lifecycle for its apparent domain: process start/list/read/input/kill, filesystem read/write/patch/list/manage (stat, mkdir, move, copy, delete), local search, shell execution, and runtime status. No obvious CRUD or workflow gaps remain for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Production-grade MCP server that gives AI agents safe access to your local dev environment: filesystem, databases, processes, and OpenAPI specs.
    15
    23 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A lightweight, stdio-based MCP server enabling AI assistants to perform local file system operations like reading, writing, searching, and executing commands.
    1,023 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables remote MCP clients like ChatGPT to run shell commands and manage files on your local machine via a Cloudflare tunnel, exposing tools for file operations, search, and task management.
    6
    MIT