Rex SSH MCP
Provides tools for managing remote Linux servers over SSH, including executing commands, reading and writing files, listing directories, checking metadata, tailing logs, and uploading/downloading files.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Rex SSH MCPcheck disk space on server 148"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Rex SSH MCP
English | 简体中文
一个通过 MCP 操作多台远程 Linux 服务器的本地 stdio 服务。每台服务器使用别名选择,密码由 Windows DPAPI 按当前用户加密保存;MCP 工具和聊天内容不接收密码。
环境要求
Windows 10/11 或 Windows Server
Node.js 22 或更高版本
允许密码认证和 SFTP 的远程 SSH 服务
克隆、安装并编译:
git clone https://github.com/lunix1024/rex-ssh-mcp.git
Set-Location rex-ssh-mcp
npm install
npm run buildRelated MCP server: ssh-winrm-mcp
配置服务器
运行中文交互式配置界面:
npm run configWindows 下也可以直接双击项目根目录的 config-servers.bat。脚本会自动切换到项目目录、检查 Node.js/npm/依赖,并打开同一个配置界面;启动失败时窗口会保留错误信息。
TUI 支持查看、新增、编辑、修改密码、测试连接和删除服务器。密码输入会被遮罩,随后使用 Windows DPAPI CurrentUser 加密。配置保存在项目根目录的 servers.json,结构如下:
菜单中的每个选项都有编号:输入编号会定位并高亮对应项,按 Enter 确认,也可以使用方向键。所有子页面按 Esc 返回上一层,主菜单按 Esc 退出。编辑服务器信息时会先展示各字段当前值,可只选择需要修改的字段;多项修改保存在内存草稿中,选择“保存全部修改”后才会一次性写入配置。
{
"version": 1,
"servers": [
{
"alias": "生产-148",
"host": "192.0.2.148",
"port": 22,
"username": "operator",
"encryptedPassword": "dpapi:v1:<由 TUI 生成的密文>",
"hostFingerprint": "SHA256:可选的OpenSSH主机公钥指纹"
}
]
}不要手工填写或传递明文密码。servers.json 已加入 .gitignore;它只包含 DPAPI 密文,但仍应限制不受信任用户读取。DPAPI 密文与加密时的 Windows 用户上下文绑定:更换用户、重装系统或迁移机器后,需要重新录入密码。相同 Windows 用户下运行的程序有能力请求 DPAPI 解密,因此这是静态存储保护,不是对已被攻陷账户的隔离。
启动 MCP Server
npm start开发模式:
npm run dev这是 stdio MCP 服务,启动后会等待客户端通过 stdin 发送协议消息,不会打开浏览器,也不会在启动时连接 SSH。日志写入 logs/rex-ssh-mcp.log,并同步写到 stderr;stdout 仅用于 MCP 协议。
Codex 的 MCP 配置可指向:
{
"command": "node",
"args": ["D:/path/to/rex-ssh-mcp/dist/index.js"]
}请把示例路径替换为本机仓库的绝对路径。首次使用前先运行 npm run build 和 npm run config。
服务器选择规则
所有操作工具都要求 server 参数,并且只能使用配置中的准确别名。用户可以自然地说:
通过 MCP 检查 148 服务器的磁盘空间
模型应先调用 ssh_list_servers,用 148 过滤别名、主机/IP 和用户名。如果只有一个结果,就在后续每次工具调用中自动携带该规范别名;没有结果或存在多个结果时必须要求用户确认,不能猜测。服务端没有全局“当前服务器”,因此并发任务不会因切换目标而串到另一台机器。
MCP 工具
工具 | 作用 |
| 查询服务器别名、主机、端口、登录用户、指纹配置状态和连接状态 |
| 执行非交互 shell 命令 |
| 读取 UTF-8 文本文件 |
| 原子写入 UTF-8 文本并可备份 |
| 列出远程目录 |
| 查看远程路径元数据 |
| 读取日志末尾行 |
| 上传本机文件 |
| 下载远程文件 |
| 重载并立即验证指定服务器配置 |
除了 ssh_list_servers 外,每个工具都必须传入准确的 server 别名。配置文件变化会在下一次调用时自动生效:新请求使用新的连接代次,已经在执行的请求结束后旧连接才关闭。不同服务器分别懒连接并独立复用。
安全行为
密码不会出现在 MCP 参数、服务器列表、正常结果或错误结果中。
只有实际连接某台服务器时才解密该服务器密码;解密后立即加入全局日志和返回值脱敏集合。
重连或修改密码后,新旧密码都会继续脱敏,保护仍在结束的旧请求。
DPAPI 调用使用固定 PowerShell 脚本,敏感数据只经过 stdin/stdout 管道,不进入命令行或环境变量。
可配置 OpenSSH SHA256 主机公钥指纹;正式环境建议启用。
常见的整机删除、格式化磁盘和关机命令会被阻止,但这不是完整 shell 沙箱。应使用权限受限的专用 SSH 账号。
命令、路径和非 SSH 密码的业务密钥可能进入运行日志,日志目录应只允许受信任的本机用户读取。
缺少 servers.json 或服务器列表为空时,MCP 仍能启动,ssh_list_servers 返回空列表;其他工具返回 server_not_configured。损坏配置、未知别名和 DPAPI 解密失败分别返回固定错误,不传播第三方错误文本。
测试
npm test测试使用本机环回 SSH/SFTP 服务,不连接真实服务器,覆盖配置校验、多服务器路由、连接复用与重连、热更新、危险命令、传输、输出限额以及多密码脱敏。DPAPI 往返测试仅在 Windows 运行。
参与贡献
欢迎提交 Issue 和 Pull Request。开始前请阅读 CONTRIBUTING.md,安全问题请按照 SECURITY.md 私下报告,不要在公开 Issue 中披露凭据或漏洞细节。
许可证
本项目基于 MIT License 开源。
Available Tools
10 toolsssh_download_fileADestructive
Download a remote file from the selected server through SFTP to an absolute local path. Existing local files are not overwritten by default. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| server | Yes | Exact configured server alias returned by ssh_list_servers. | |
| timeout | No | Transfer timeout in seconds (1–3600), default 300. | |
| localPath | Yes | ||
| overwrite | No | ||
| remotePath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, so the destructive nature is known. The description adds valuable specifics: 'Existing local files are not overwritten by default' clarifies the overwrite behavior, and 'SSH credentials are private server-side configuration. Never ask the user for a password' is a critical operational note not captured in annotations. This goes beyond the structured fields and helps the agent handle real-world constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with zero fluff. The core action is front-loaded, followed by a behavioral note and a critical usage rule. Every sentence adds essential information, and the structure is clean and scannable for an agent. This is an exemplar of conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 5 parameters and no output schema, so the description must provide enough context for correct invocation. It covers server alias resolution, password handling, and overwrite default, which are critical. However, it doesn't mention what happens on success (e.g., return value) or potential error conditions (e.g., connection failure, invalid paths). The timeout parameter is handled by the schema, but the overall description could be more complete for a file-transfer operation. Still, the core usage is adequately covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40%, with only server and timeout described. The description partially compensates: it defines localPath as 'absolute local path' and mentions the default overwrite behavior, which relates to the overwrite parameter. However, remotePath is not described beyond the tool name, and overwrite itself isn't explicitly defined as a parameter. Given the low coverage, the description adds some value but doesn't fully explain all parameters. A score of 3 reflects this partial compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Download a remote file from the selected server through SFTP to an absolute local path.' It specifies the resource (remote file) and destination (local path). While it doesn't explicitly contrast with similar siblings like ssh_read_file or ssh_upload_file, the phrase 'through SFTP' and 'to an absolute local path' distinguishes it well enough. A clear, specific purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use ssh_list_servers when the user has not supplied an exact configured alias.' It also instructs the agent to never ask for a password, which is a key usage rule. However, it doesn't explicitly state when to use this tool versus ssh_upload_file (the inverse operation), but the direction is obvious from the name and description. Overall, useful usage direction is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_execADestructive
Execute a shell command on the selected remote Linux server. Timeout is in seconds (default 30, maximum 300); stdout and stderr are capped at 1 MiB each. Common destructive commands are blocked. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| server | Yes | Exact configured server alias returned by ssh_list_servers. | |
| command | Yes | ||
| timeout | No | Command timeout in seconds (1–300), default 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation risk is known. The description adds valuable behavioral context beyond annotations: timeout range and default, stdout/stderr 1 MiB caps, blocking of common destructive commands, and private server-side SSH credentials. It does not contradict annotations. A small gap is that it doesn't specify what happens on timeout or output truncation, but the disclosed constraints are substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct information: what it does, timeout behavior, output caps and destructive-command blocking, credential handling, and sibling routing. No filler or repetition of schema details. Front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema, the description covers the key operational constraints an agent needs: timeout, output limits, destructive command blocking, credential privacy, and server alias resolution. It doesn't describe the return format or error behavior, but the annotations cover the safety profile and the description covers the main invocation concerns. Slightly more detail on exit codes or output structure would make it a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%: server and timeout have descriptions, but command has none. The description adds context about the command being a shell command on a remote Linux server and mentions output caps, but it doesn't add much about the command parameter's semantics beyond what the schema implies. The timeout parameter is already well documented in the schema, so the description's timeout mention is redundant. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Execute'), a resource ('shell command on the selected remote Linux server'), and clearly distinguishes itself from siblings by focusing on arbitrary command execution rather than file operations or server listing. It is immediately clear what this tool does and how it differs from ssh_read_file, ssh_write_file, ssh_list_servers, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use ssh_list_servers when the user has not supplied an exact configured alias, and instructs the agent to never ask the user for a password. This provides clear when-to-use and when-not-to-use guidance, plus a direct pointer to the relevant sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_list_dirARead-only
List a remote directory through SFTP on the selected server, returning at most 10000 entries. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| server | Yes | Exact configured server alias returned by ssh_list_servers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint, so the safety profile is covered. The description adds value by explaining that SSH credentials are private server-side configuration and that the operation returns at most 10000 entries, which is beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, with the core action and limit front-loaded, followed by credential handling and routing to an alternative. No fluff or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with annotations covering read-only and open-world behavior, the description covers the action, return limit, credential handling, and when to use the alternative. No critical information for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% (only 'server' has a description, which is already present in the schema). The tool description does not add extra detail about the 'path' parameter beyond implying it is the directory to list. Since coverage is moderate, the description does not compensate further, but the parameters are self-explanatory given the tool's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (List) and resource (remote directory) via SFTP on a selected server, and includes a return limit. This clearly distinguishes it from siblings like ssh_stat, ssh_read_file, and ssh_exec, which perform different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to use ssh_list_servers when the user has not supplied an exact alias, providing a clear alternative. It also adds a behavioral constraint ('Never ask the user for a password'), which is important for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_list_serversARead-onlyIdempotent
List configured SSH servers, optionally filtering by alias, host/IP fragment, or username. Returns only non-secret metadata and connection status. A unique result provides the exact alias required by all operation tools. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional alias, host/IP fragment, or username used to filter configured servers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly and idempotent, but the description adds significant context: it returns only non-secret metadata and connection status, and explains that SSH credentials are private server-side configuration, so the agent must never request passwords. This goes beyond the annotation baseline and prevents dangerous assumptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and contains several useful sentences, but it is slightly longer than necessary. The password instruction and usage rule are valuable, though the secret-credentials sentence could be merged with the password rule to reduce redundancy. Overall, it is well-structured and each sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description clearly states what the tool returns (non-secret metadata and connection status) and emphasizes the importance of the alias for subsequent operation tools. It also addresses credential handling, which is critical for a discovery tool. Missing minor details like pagination or sorting are not significant for this use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes the single optional parameter: 'Optional alias, host/IP fragment, or username used to filter configured servers.' The description repeats this list without adding format details, examples, or edge cases. With 100% schema coverage, the description adds no extra semantic value beyond what the schema provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List configured SSH servers' and clearly identifies the optional filtering by alias, host/IP, or username. It distinguishes itself from sibling operation tools by explaining that it returns metadata and the exact alias needed for them, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use this tool: 'Use ssh_list_servers when the user has not supplied an exact configured alias.' It also includes a critical behavioral rule, 'Never ask the user for a password,' preventing a common misuse. The guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_read_fileARead-only
Read a remote UTF-8 regular file through SFTP on the selected server, default 1 MiB, maximum 5 MiB. Oversized text is truncated and binary content is rejected. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| server | Yes | Exact configured server alias returned by ssh_list_servers. | |
| maxBytes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses critical behaviors: default 1 MiB limit, hard 5 MiB max, truncation of oversized text, rejection of binary content, and that SSH credentials are private server-side configuration. This adds substantial safety and edge-case awareness for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose and size limits, and each sentence earns its place—no filler or repetition of schema fields that are already self-explanatory.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers size limits, content type validation, credential handling, and server selection guidance. It doesn't describe the success output format or error cases (e.g., file not found, permission denied), but the readOnly and openWorld annotations partially offload that burden. For a simple read-file tool, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 33% schema description coverage, the description compensates by clarifying the server parameter (exact alias, use ssh_list_servers), maxBytes (size limits and truncation behavior), and path (regular UTF-8 file). It doesn't add explicit format constraints for path beyond the schema, but it provides meaningful context for two of the three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Read a remote UTF-8 regular file through SFTP') and identifies the resource and scope. It also names ssh_list_servers as a fallback, helping an agent distinguish this tool from siblings like ssh_tail_file or ssh_stat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context by mentioning server alias selection and explicitly instructs the agent to use ssh_list_servers when the user hasn't provided an alias, and never to ask for a password. It doesn't explicitly contrast with ssh_tail_file or other read-type alternatives, so the guidance stops short of being fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_reconnectARead-onlyIdempotent
Reload and immediately validate the selected server configuration. Other server connections are not affected. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| server | Yes | Exact configured server alias returned by ssh_list_servers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive hints. The description adds valuable behavioral context: only the selected connection is reloaded/validated, other connections are not affected, and SSH credentials are private server-side configuration. It does not contradict the annotations and supplements them meaningfully.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each with a distinct purpose: action, scoping guarantee, credential privacy constraint, and alternative-tool routing. The primary action is front-loaded and there is no extraneous or redundant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, this description covers the action, scope, credential handling, and fallback tool selection. It does not detail validation failure behavior, but that is not essential for correct invocation given the annotations and schema richness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the sole parameter with 100% coverage. The description enhances this by specifying that the alias must be an exact configured server alias and directs the agent to ssh_list_servers when one is not available, adding practical sourcing guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (reload and validate) on a specific resource (selected server configuration). It distinguishes itself from siblings by explicitly scoping to the selected server and noting that other connections are unaffected, making the tool's role clear among the listed SSH tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit routing guidance to ssh_list_servers when the user has not supplied an exact configured alias, and includes a firm instruction to never ask for a password. It could further contrast against other sibling tools, but the most relevant alternative is addressed and the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_statARead-only
Inspect a remote path through SFTP lstat on the selected server. The final symlink is not followed. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| server | Yes | Exact configured server alias returned by ssh_list_servers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the readOnlyHint annotation: it discloses the SFTP lstat mechanics, the symlink-following behavior, and the server-side credential model. It also gives a security directive—'Never ask the user for a password'—which is valuable for agent behavior. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, purpose-driven sentences. The first sentence delivers the core purpose, the second adds a critical behavior, and the remaining sentences address credentials and server routing. Every sentence earns its place, and the structure is front-loaded and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is largely complete for a read-only stat tool: it explains the operation, symlink behavior, credential handling, and how to obtain the server alias. With no output schema, it does not explicitly describe the returned stat fields, but 'SFTP lstat' reasonably implies standard stat metadata; this is a minor gap rather than a critical omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: the server parameter is already described in the schema, but the path parameter has no schema description. The tool description helps by calling it 'a remote path' and explaining lstat semantics, but it does not add much detail about path formatting or expected values. This partially compensates for the schema gap but does not fully clarify parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation: 'Inspect a remote path through SFTP lstat on the selected server.' It also clarifies an important semantic detail—'The final symlink is not followed'—which distinguishes this from a plain read or list operation and helps separate it from siblings like ssh_read_file and ssh_list_dir.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: 'Use ssh_list_servers when the user has not supplied an exact configured alias.' This addresses a common precondition for selecting the tool. It does not, however, contrast ssh_stat with path-related siblings such as ssh_read_file, ssh_list_dir, or ssh_exec, so the when-not-to-use guidance is partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_tail_fileARead-only
Read the last lines of a remote log file on the selected server. Output is capped and the timeout is 30 seconds. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| lines | No | ||
| server | Yes | Exact configured server alias returned by ssh_list_servers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds useful behavioral context: output is capped, timeout is 30 seconds, SSH credentials are private server-side configuration, and the agent must never ask for a password. It does not detail failure modes or timeout results, but the annotations already cover the read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each carrying a distinct operational fact, with the purpose front-loaded. It could be slightly tightened by combining the two credential-related sentences, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, output boundaries, timeout, authentication constraints, and fallback routing. It lacks explicit failure/timeout behavior and return format, but for a simple tail-file tool this is an adequate and practical level of detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate. It adds that the path refers to a remote log file and that the behavior is tail-like, but the exact meaning of the `lines` parameter is still left mostly to the schema and parameter name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('Read'), a specific resource ('remote log file'), and tail semantics ('last lines'). This cleanly distinguishes it from ssh_read_file (full file) and ssh_list_servers (alias discovery).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use ssh_list_servers when the user has not supplied an exact configured alias, and gives clear credentials guidance. It does not explicitly contrast with ssh_read_file for full-file reads, leaving a small when-not gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_upload_fileADestructive
Upload a local file to the selected remote server through SFTP. The local path must be absolute; replacement is atomic and backed up by default. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| server | Yes | Exact configured server alias returned by ssh_list_servers. | |
| timeout | No | Transfer timeout in seconds (1–3600), default 300. | |
| localPath | Yes | ||
| remotePath | Yes | ||
| createBackup | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true, but the description adds critical behavioral details beyond them: 'replacement is atomic and backed up by default' discloses the write semantics and safety net, and 'SSH credentials are private server-side configuration' clarifies authentication constraints. This significantly enhances the agent's understanding of side effects without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with the core purpose in the first sentence and usage constraints in the second. It wastes no words, front-loads the action, and integrates all essential guidance without redundancy. Every clause contributes to effective tool selection or invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a file-upload tool with 5 parameters and no output schema, the description covers the key operational aspects: absolute local path, atomic replacement, backup behavior, credential privacy, and the alias resolution via ssh_list_servers. It also aligns with the destructive annotation, preparing the agent for overwrites. Given the moderate complexity and presence of annotations covering read-only/destructive flags, this is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40% (server and timeout have descriptions; localPath, remotePath, createBackup do not). The description compensates by clarifying that localPath must be absolute, and by mentioning atomic replacement and backup defaults that relate to createBackup and remotePath behavior. While remotePath semantics aren't explicitly detailed, the description's context plus intuitive naming cover most gaps. It adds meaningful info beyond the schema for the undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Upload a local file to the selected remote server through SFTP'), specifies the resource types (local file, remote server), and distinguishes it from siblings like ssh_download_file and ssh_write_file by naming the SFTP transport and the upload direction. It also adds specifics (absolute path, atomic replacement, backup) that reinforce the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: it instructs to never ask the user for a password, and it directs the agent to use ssh_list_servers when an exact configured alias hasn't been supplied. This clearly delineates when to use this tool versus the listed sibling. It also implies the prerequisite of an exact alias, providing a decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_write_fileADestructive
Write UTF-8 text through SFTP on the selected server using a temporary file and atomic rename. Existing files are backed up by default. Replacing symlinks is refused. SSH credentials are private server-side configuration. Never ask the user for a password. Use ssh_list_servers when the user has not supplied an exact configured alias.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| server | Yes | Exact configured server alias returned by ssh_list_servers. | |
| content | Yes | ||
| createBackup | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description adds behavioral details: backups by default, refusal to replace symlinks, and credential handling (private server-side config, never ask password). These go beyond annotations, so the agent understands safety and edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences with no filler, each adding distinct information. The main action is first, followed by safety and usage notes. Efficient and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no output schema, the description covers the core behavior, backup, symlink handling, and credential rules, plus routing to ssh_list_servers. It could mention return value or error behavior, but given the tool's simplicity, it's fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, with server having a description. The description adds context that content is UTF-8 text and mentions backup default and symlink refusal, which inform path and createBackup semantics. However, it doesn't explicitly define path requirements or content format beyond UTF-8, so it partially compensates but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: writing UTF-8 text via SFTP to a selected server, with specifics like atomic rename and backup. It distinguishes from siblings like ssh_upload_file (likely binary) and ssh_exec (commands) by focusing on text content and SFTP write semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to use ssh_list_servers when the user hasn't provided an exact alias, and warns never to ask for a password. It does not explicitly exclude other file operations, but the alias condition and password rule give clear context for when to use this tool.
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.
10 tool updates
v2.0.0- First observed
ssh_download_file - First observed
ssh_exec - First observed
ssh_list_dir - First observed
ssh_list_servers - First observed
ssh_read_file - First observed
ssh_reconnect - First observed
ssh_stat - First observed
ssh_tail_file - First observed
ssh_upload_file - First observed
ssh_write_file
TDQS
Scored across 10 tools
Each tool targets a distinct operation: server listing/reconnect, command execution, file metadata, content reading, writing, directory listing, tailing, upload, and download. No two tools overlap in purpose, and edge cases like stat vs read_file vs tail_file are clearly differentiated.
All tools follow the ssh_ prefix with a consistent verb_noun pattern (list_servers, read_file, write_file, list_dir, upload_file, download_file, tail_file). The uniform style makes the tool surface predictable and easy to navigate.
Ten tools is well-scoped for an SSH/SFTP server management server. Each tool earns its place, covering connection management, remote execution, and file operations without redundant or excessive entries.
The core SSH/SFTP workflow is well covered: exec, read, write, list, stat, tail, upload, download. A notable gap is the lack of a delete/remove operation for remote files or directories, and no rename/mkdir, but most common administrative tasks can be completed with the existing surface.
Maintenance
Related MCP Connectors
Run commands and read/write files on your servers over Termalin's keyless tunnels (hosted MCP).
Scoped, audited SSH exec, sessions, and SFTP on your saved servers without exposing credentials
Securely use files, terminals, screenshots and processes on computers you pair with ReMCP.
Remote MCP for 1,500+ APIs. Vault-managed credentials; OAuth or API key. Search, load, and execute.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables secure SSH connections to multiple remote servers with support for command execution, file transfers (SFTP), directory listing, and both password and key-based authentication.7MIT
- AlicenseBqualityCmaintenanceMCP server for administering Linux/Unix hosts via SSH and Windows hosts via WinRM/PowerShell Remoting, supporting persistent inventory, sessions, jobs, and command groups.29MIT
- AlicenseAqualityBmaintenanceManages multiple SSH servers through a local workspace with MCP tools, executing commands and transferring files securely with credential isolation.91MIT
- AlicenseAqualityBmaintenanceEnables AI clients to securely execute remote commands and transfer files over SSH through standardized MCP tools, with multi-host management, flexible authentication, and an admin console.5232 npm3ISC