The server provides 12 well-organized tools with consistent naming conventions and present schemas. All tools use action-verb prefixes (ssh_*, sftp_*), which aids LLM discoverability. Parameter schemas are defined using Zod with proper type constraints. However, descriptions lack depth and specificity, most are terse (20-80 chars) and don't explain WHY the LLM should use each tool or when to prefer one over similar alternatives. Output schemas are inferred from interface definitions but not documented in tool registrations. Error handling is present but generic, most errors are caught and logged without actionable recovery guidance for LLMs. Security is reasonable (credentials handled via env vars) but tool responses may contain session IDs and connection details that could be over-shared in logs.
Delete a remote file or directory.
Download a file from the remote server to local.
List files and directories in a remote path. Returns file names, sizes, permissions, and modification times.
Create a directory on the remote server.
Read the content of a remote text file.
Rename a remote file or directory.
Upload a local file to the remote server.
Descriptions lack actionable specificity and are too brief (20-80 chars). They do not explain WHEN to use each tool vs. similar alternatives (e.g., when to call sftp_read vs sftp_download, or sftp_write vs sftp_upload).
Output schemas are defined as TypeScript interfaces (ExecResult, ListSessionsResult, etc.) but are NOT documented within the tool registration itself. LLMs cannot see what fields to expect without inspecting the implementation code. The MCP tool definitions should include explicit outputSchema properties.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 52 | - | v1 |
Write content to a remote file. Creates the file if it doesn't exist, overwrites if it does.
Create a new SSH connection to a remote server. Returns a session_id for subsequent operations. If server is pre-configured via environment variables, this is optional.
Disconnect an SSH session and release resources. If session_id is omitted, disconnects the default session.
Execute a command on a connected SSH session. Returns stdout, stderr, and exit code. If session_id is omitted, uses the default pre-configured session.
List all active SSH sessions with their connection details.
Error responses lack recovery guidance. Most errors are caught and logged but don't tell the LLM what to do next or whether the error is retryable. For example, 'No session_id provided and no default session available' is clear, but most SSH/SFTP errors in the catch blocks don't provide actionable next steps.
Tool descriptions do not declare whether operations are idempotent or have side effects. LLMs need to know which operations can be safely retried (e.g., sftp_read is idempotent; sftp_write, sftp_delete are not) to make intelligent retry decisions.
Descriptions do not explain parameter relationships or dependencies. For example, ssh_exec accepts an optional session_id but also states 'If session_id is omitted, uses the default pre-configured session.' This conditional behavior is important for LLM understanding but is buried in the description and not highlighted as a dependency.
Session IDs are returned in tool responses (e.g., ConnectResult.session_id) but may be exposed in logs or LLM context. While these are not secrets, they are internal system identifiers that could be sensitive, document whether session IDs should be kept private.
sftp_delete supports a 'recursive' parameter but the description does not warn about the destructive nature or recommend confirmation. Destructive tools should have explicit warnings and ideally support a dry-run or confirmation step.
No tool batch variants exist. If an LLM needs to upload 10 files, it must call sftp_upload 10 times. Batch variants (e.g., sftp_upload_batch) would reduce token waste and latency.