SSH Remote MCP Server
SSH 원격 MCP 서버
MCP(Model Context Protocol)를 통해 MCP 호환 클라이언트에 대한 SSH 원격 액세스를 제공합니다.
빠른 시작
MCP 서버를 실행할 동일한 OS에서 생성된 가상 환경을 사용하십시오. Windows와 WSL/Linux 간에 venv를 공유하지 마십시오.
Windows
설치:
.\install.ps1Claude Desktop, Claude Code 또는 Codex에 MCP 추가:
{ "mcpServers": { "ssh-remote": { "command": "C:\\Users\\Intel\\Desktop\\adremote-mcp\\.venv-win\\Scripts\\python.exe", "args": [ "C:\\Users\\Intel\\Desktop\\adremote-mcp\\ssh_mcp_server.py" ] } } }paramiko와mcp가 설치된 Windows Python이 이미 있는 경우,.venv-win대신 해당 인터프리터를 직접 사용할 수 있습니다.
WSL/Linux
설치:
./install.shClaude Desktop, Claude Code 또는 Codex에 MCP 추가:
{ "mcpServers": { "ssh-remote": { "command": "/home/user/adremote-mcp/.venv-linux/bin/python", "args": [ "/home/user/adremote-mcp/ssh_mcp_server.py" ] } } }Windows 드라이브에서 WSL을 통해 리포지토리에 액세스하는 경우, WSL 경로를 사용하십시오:
{ "mcpServers": { "ssh-remote": { "command": "/mnt/c/Users/Intel/Desktop/adremote-mcp/.venv-linux/bin/python", "args": [ "/mnt/c/Users/Intel/Desktop/adremote-mcp/ssh_mcp_server.py" ] } } }
휴대용 런처
일치하는 OS용으로 포함된 런처를 MCP 클라이언트에 지정할 수도 있습니다:
Windows:
C:\Users\Intel\Desktop\adremote-mcp\run-ssh-mcp.cmdWSL/Linux:
/path/to/adremote-mcp/run-ssh-mcp.sh
런처는 OS별 venv를 우선적으로 사용하며, 그 다음 python3 또는 python으로 대체됩니다. Windows에서는 SSH_MCP_PYTHON을 설정하여 특정 Python 인터프리터를 강제로 지정할 수 있습니다.
WSL/Linux 클라이언트의 경우, 스크립트가 실행 가능으로 표시되지 않은 경우 args: ["/path/to/adremote-mcp/run-ssh-mcp.sh"]와 함께 command: "/bin/sh"를 사용하십시오.
직접 실행
종속성을 설치한 후 서버를 직접 실행할 수 있습니다:
Windows:
.\.venv-win\Scripts\python.exe .\ssh_mcp_server.pyWSL/Linux:
./.venv-linux/bin/python ssh_mcp_server.py자동 설정
이 리포지토리를 다운로드하고 Claude 또는 Codex를 실행한 다음, 현재 OS의 전역 MCP 서버로 이 폴더를 추가하도록 요청하십시오. 그 후에는 채팅에서 직접 사용할 수 있습니다.
문제 해결
Windows에서 다음과 같이 보고하는 경우:
No Python at '"/usr/bin\python.exe'MCP가 WSL/Linux에서 생성된 venv를 가리키고 있는 것입니다. .\install.ps1로 Windows venv를 생성하고 MCP 명령을 .venv-win\Scripts\python.exe로 업데이트하십시오.
Related MCP server: MCP SSH Server
기능
Windows 및 Linux의 MCP 호환 클라이언트와 작동
SSH를 통해 원격 서버에 연결
기본 SSH 점프 호스트 / 배스천 지원
원격으로 명령 실행
SFTP를 통한 파일 업로드/다운로드
다중 연결 관리
상태 모니터링
사용 예시
비밀번호로 연결:
Connect to 192.168.1.100 with username ubuntu and password mypass또는 더 짧은 형식:
ssh 192.168.1.100:22 ubuntu mypassMCP는 먼저 사용자 이름과 비밀번호로 SSH 연결을 테스트합니다. 로그인이 성공하면 SSH 키를 생성하거나 설치하고, 키 기반 자격 증명을 로컬에 저장하며 비밀번호는 저장하지 않습니다. 비밀번호는 처음 한 번만 사용됩니다.
일회성 세션에 비밀번호로 연결:
ssh 192.168.1.100:22 ubuntu mypass, save_credentials false이것은 라이브 연결만 유지합니다. 재사용 가능한 자격 증명은 저장되지 않으며 자동 키 부트스트랩도 시도되지 않습니다.
저장된 이름을 사용하여 나중에 연결:
ssh saved-name첫 번째 성공적인 설정 후, 저장된 자격 증명 이름을 사용하여 다시 연결하십시오.
암호화된(암호로 보호된) 개인 키로 연결:
Connect to 10.0.2.15 as ubuntu using private key ~/.ssh/id_ed25519 with passphrase mysecret또는 도구 매개변수를 통해:
{
"hostname": "10.0.2.15",
"username": "ubuntu",
"private_key_path": "~/.ssh/id_ed25519",
"private_key_passphrase": "mysecret"
}암호는 저장된 자격 증명과 함께 저장되므로 향후 ssh_connect_saved 호출 시 다시 입력할 필요가 없습니다. 단일 세션에 대해 저장된 값을 재정의하려면 ssh_connect_saved에서 private_key_passphrase를 계속 제공할 수 있습니다.
점프 호스트를 통해 연결:
ssh_connect 또는 ssh_save_credentials에서 jump_host 객체를 사용하십시오:
{
"hostname": "10.0.2.15",
"username": "ubuntu",
"private_key_path": "~/.ssh/id_ed25519",
"jump_host": {
"hostname": "203.0.113.10",
"username": "bastion",
"private_key_path": "~/.ssh/id_ed25519",
"port": 22
}
}점프 호스트 키도 암호로 보호될 수 있습니다. jump_host 객체 내에 private_key_passphrase를 추가하십시오.
이것은 대상 호스트에 대한 기본 SSH 터널을 사용하며, 저장된 자격 증명은 동일한 점프 호스트 구성을 유지합니다. 재사용 가능한 저장된 자격 증명의 경우, 점프 호스트는 비밀번호 대신 private_key_path를 사용해야 합니다.
명령 실행:
List files in /home directory on my server
Run 'top' command on the remote server
Execute script.py and monitor its log파일 전송:
Upload local file.txt to /home/user/ on the server
Download /var/log/app.log from the server연결 상태 및 인벤토리:
Check health of all SSH connections
Show me all active SSH connections요구 사항
Python 3.10+
paramiko
mcp
최신 업데이트
버전 1.0.3은 저장된 자격 증명에 개인 키 암호를 유지합니다:
ssh_connect또는ssh_save_credentials를 통해 저장할 때private_key_passphrase가 자격 증명 파일에 저장됩니다.ssh_connect_saved는 저장된 암호를 자동으로 사용하므로 모든 호출 시 제공할 필요가 없습니다.ssh_connect_saved에서private_key_passphrase를 제공하면 해당 세션에 대해서만 저장된 값이 재정의됩니다.ssh_list_saved_credentials는 암호가 저장된 경우private key (passphrase saved)를 표시합니다.
버전 1.0.2는 암호로 보호된(암호화된) 개인 키에 대한 지원을 추가합니다:
ssh_connect,ssh_connect_saved및ssh_save_credentials에서private_key_passphrase허용대상 호스트 키와 점프 호스트 키 모두에 적용
키가 암호화되어 있지만 암호가 제공되지 않았거나 암호가 틀린 경우 명확한 오류 메시지 표시
버전 1.0.1은 더 안전하고 실용적인 일상적인 SSH 워크플로우를 추가합니다:
직접 로그인은 기본적으로 재사용 가능한 자격 증명을 저장하지만,
save_credentials=false를 사용하면 비밀번호 세션에 대해서도 깔끔하게 제외할 수 있습니다.저장된 자격 증명 흐름에는 이제 연결, 저장, 나열, 삭제 및 수동 키 설정 도우미가 포함됩니다.
호스트 신뢰 및 파일 전송 규칙이 더 엄격해졌으며, 로컬 루트 제한 및 최초 사용 시 신뢰 호스트 고정이 적용됩니다.
라이브 세션과 저장된 자격 증명 모두에 대해 기본 점프 호스트 연결이 지원됩니다.
저장된 자격 증명은 키 기반이므로 일반적인 사용 시 마스터 비밀번호가 필요하지 않습니다.
수동으로 저장된 개인 키 경로는 나중에 첫 연결 시가 아니라 저장할 때 유효성이 검사됩니다.
지원
협업하려면 저에게 연락하십시오.
Available Tools
12 toolsssh_connectA
Connect to a remote Ubuntu server via SSH
| Name | Required | Description | Default |
|---|---|---|---|
| hostname | No | Remote server hostname or IP address | |
| username | No | SSH username | |
| password | No | SSH password for first-time bootstrap when no private key is available | |
| private_key_path | No | Path to private key file (optional) | |
| port | No | SSH port (default: 22) | |
| connection_name | No | Name for this connection (default: hostname) | |
| known_hosts_path | No | Optional path to a known_hosts file to trust in addition to system host keys | |
| trust_unknown_host | No | Allow connecting to hosts not present in known_hosts. Defaults to false. | |
| saved_credential_name | No | Load connection details from a saved local credential entry | |
| save_credentials | No | Persist a reusable local credential after a successful connect. Defaults to true for direct logins with password or private key. Password logins are converted into saved key-based credentials. | |
| credential_name | No | Name to use when saving credentials locally. Defaults to connection_name or hostname. | |
| jump_host | No | Optional SSH jump host (bastion) used to reach the target via native SSH tunneling |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions bootstrap password usage, credential saving behavior (conversion to key-based), and trust_unknown_host details. However, it doesn't describe what happens on failure or session management beyond connection, so 4.
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 a single sentence, which is concise, but it lacks structure for the 12-parameter complexity. Important behavioral details (like credential saving) are not front-loaded. A longer description with structured details would be more helpful, so 3.
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 the complexity (12 params, nested objects, no output schema), the description is incomplete. It doesn't explain return values or connection lifetime. Annotations are absent. The description covers purpose and some behavior but misses key context about success/failure indicators.
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 100%, so baseline is 3. The description adds value by explaining the purpose of password (first-time bootstrap) and save_credentials behavior (conversion to key-based), which goes beyond schema. Nested jump_host adds complexity, but the description references it indirectly. Score 4.
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 ('Connect') and the resource ('remote Ubuntu server via SSH'), with the verb+resource pattern. It distinguishes from siblings like ssh_execute or ssh_download_file but doesn't explicitly differentiate from ssh_connect_saved, so 4.
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?
No explicit guidance on when to use this tool vs alternatives like ssh_connect_saved or ssh_setup_key_auth. The presence of many sibling tools suggests a need for usage context, yet the description only states the basic purpose. A 3 reflects the minimal viable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_connect_savedB
Connect to a remote server using a saved local SSH credential name
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Saved credential name to use for the connection | |
| connection_name | No | Optional active connection name override |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It describes the action (connect) and input (saved credential name), but does not disclose what happens if credentials are invalid, whether a new connection is created or reused, or any side effects. Adequate but missing details.
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 a single sentence that directly states the purpose. It is concise and front-loaded, but omits necessary behavioral and usage details that could be added without making it verbose.
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 the tool has 2 parameters, no output schema, and no annotations, the description is serviceable but lacks information on return behavior, connection state changes, and error conditions. It is minimally complete for a straightforward connection tool.
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 100%, so the baseline is 3. The description adds no extra meaning beyond the schema: it mentions 'saved credential name' but the schema already describes 'name' as such. No additional context for 'connection_name' is provided.
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 specifies the verb 'connect' and the resource 'remote server using a saved local SSH credential name', distinguishing it from sibling tools like ssh_connect (likely prompts for credentials) and ssh_save_credentials. It clearly indicates the tool uses saved credentials.
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 tool description implies it should be used when a saved credential exists, but it does not explicitly state when to use this tool over ssh_connect or provide guidance on prerequisites like having saved credentials. No alternative tools are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_delete_saved_credentialsA
Delete a saved local SSH credential entry
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Saved credential name to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It correctly indicates a destructive action ('Delete'), but does not clarify side effects (e.g., whether deletions are irreversible or affect active connections). This is adequate but not thorough.
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 a single, concise sentence that directly states the tool's purpose with no unnecessary words or 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?
Given the tool has one parameter, no output schema, and no annotations, the description is minimally sufficient. However, it lacks information about return values or error handling, which would be expected for a deletion tool.
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 100%, so the parameter is well-documented in the schema. The description adds no extra meaning beyond 'delete by name', but the schema already provides sufficient detail. A score of 4 reflects that the description meets the baseline expectation.
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 'Delete a saved local SSH credential entry' uses a specific verb (Delete) and resource (saved local SSH credential entry), clearly distinguishing it from sibling tools like ssh_save_credentials or ssh_list_saved_credentials.
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 does not provide guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or caveats (e.g., the credential must exist before deletion).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_disconnectA
Disconnect from a remote SSH connection
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Name of the SSH connection to disconnect |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the action (disconnect) but does not disclose any side effects or prerequisites beyond connection existence.
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 a single, clear sentence with no unnecessary words. It effectively conveys the tool's purpose.
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 the simplicity of the tool (1 required param, no output schema), the description is complete enough. It lacks details like whether it closes all sessions or just one, but likely adequate.
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 100%, and the description adds no additional meaning beyond the schema. However, the single parameter is clearly described in schema, so baseline 3 is appropriate plus extra clarity from schema description.
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 uses the specific verb 'Disconnect' and the resource 'remote SSH connection', clearly indicating its action and differentiating it from sibling tools like ssh_connect or ssh_execute.
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 implies usage after establishing an SSH connection, but does not provide explicit guidance on when not to use it or mention alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_download_fileA
Download a remote file to an allowed local root via SFTP
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Name of the SSH connection to use | |
| remote_path | Yes | Remote file path to download | |
| local_path | Yes | Local destination path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The phrase 'to an allowed local root' hints at a security restriction on local paths, but does not explain what happens if path is not allowed, or disclose other behaviors like overwrite policy, error handling, or authorization requirements. Since no annotations are provided, the description carries full burden, yet it omits important behavioral details.
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?
Single sentence, direct, no filler. Every word adds meaning—action, resource, protocol, constraint. Ideal length.
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 the parameter count and no output schema, the description is reasonably complete for a file download tool. However, missing details on allowed local roots, file size limits, overwrite behavior, and how the connection_name relates to established connections (e.g., must be connected?) leave room for ambiguity.
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?
All three parameters are documented in the schema with descriptions (100% coverage), so the tool's description repeats no parameter info. However, it adds context about path restrictions ('allowed local root') that the schema does not capture, adding value 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?
Clearly indicates the action ('download'), resource ('remote file'), and mechanism ('via SFTP') with a constraint ('to an allowed local root'). Differentiates from sibling 'ssh_upload_file' but could explicitly contrast from 'ssh_execute'.
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 implies usage for downloading files, but does not specify when to prefer this over alternatives like 'ssh_execute' with scp, or mention prerequisites (e.g., connection must be established). No explicit when-not or exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_executeB
Execute a command on a remote SSH connection
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Name of the SSH connection to use | |
| command | Yes | Command to execute on the remote server | |
| timeout | No | Command timeout in seconds (default: 30) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It doesn't disclose behavioral traits like whether the command runs in a new shell, environment variables, or changes to remote state. The timeout parameter is mentioned in schema but not in description. Score 3 is appropriate as basic functionality is clear but lacks depth.
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 a single, concise sentence that conveys core purpose. No extraneous information. Could be slightly more detailed without being verbose, but as is, it earns its place.
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 is relatively simple with three parameters and no output schema. The description provides minimal context. Given the presence of many sibling tools, additional context about assuming an active connection or return behavior would improve completeness. Score 3 as adequate but not rich.
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 100%, so the schema already documents all three parameters. The description does not add any additional meaning beyond what the schema provides, such as how connection_name is resolved or what constitutes a valid command. Baseline 3 is correct.
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 (execute) and resource (command on remote SSH connection), providing a specific verb+resource pair. It distinguishes from siblings like ssh_connect (connection setup) and ssh_download_file (file transfer), but could be more explicit about the exact scope (single command execution vs. scripting).
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 implies use after establishing a connection via ssh_connect or similar, but does not explicitly state prerequisites or when to use alternatives like ssh_download_file. No guidance on when not to use this tool is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_health_checkB
Check the health of SSH connections
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | No | Name of the SSH connection to check (optional, checks all if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It fails to mention what 'health' means, potential side effects (read-only?), required permissions, or whether it impacts SSH connections. The description is vague about its behavior beyond a simple health check.
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 one short sentence. It is concise but too brief, lacking adequate context. It does not earn its place with sufficient detail, so it is not an optimal use of space.
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 no output schema and no annotations, the description fails to explain what the tool returns or how health is assessed. For a tool with a simple parameter schema, the description should provide more context on the health check process, but it does not.
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 100%, so the description adds only general context. The input schema already describes the optional parameter and its behavior (checks all if not provided). The description adds no extra semantics, so 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 clearly states the tool checks health of SSH connections. It specifies the verb 'check' and resource 'health of SSH connections'. However, it lacks differentiation from sibling tools; 'ssh_connect' and 'ssh_execute' might also imply health checks, so purpose is clear but not distinct.
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 implies usage by stating 'check the health', but it provides no explicit guidance on when to use this tool versus alternatives like ssh_connect or ssh_list_connections. It does not mention when not to use it or any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_list_connectionsA
List all active SSH connections
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description conveys a read-only listing behavior and implies no destructive side effects. However, since no annotations are provided, it carries the full burden and does not clarify what counts as 'active', whether output is scoped to the current user, or how connection status is determined.
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 five words and contains no filler. It front-loads the action and resource with maximum efficiency.
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 parameterless listing tool, the description is mostly complete: an agent knows what the tool does and can invoke it. Minor gaps around output format and the precise scope of 'all active SSH connections' prevent a higher score, but the low complexity makes this acceptable.
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?
This tool takes zero parameters, so the input schema is already complete. The description adds no parameter details, but none are needed; baseline 4 applies for parameterless tools.
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 all active SSH connections'. It is clearly distinguishable from sibling tools like ssh_connect, ssh_execute, and ssh_disconnect, though it does not explicitly contrast with get_network_connections.
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?
No guidance is given about when to use this tool instead of alternatives such as get_network_connections or scan_network. The intended use is implied but not stated, and there are no exclusions or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_list_saved_credentialsA
List saved local SSH credential entries
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It correctly indicates a read-only, non-destructive operation by saying 'list,' which is consistent with the tool name.
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 one efficient sentence that clearly states the action and resource without any redundancy.
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 zero parameters and a simple list operation, the description is complete enough. It doesn't mention return format, but with no output schema, that's acceptable for a list tool.
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 input schema has 100% description coverage (no properties), so the schema conveys everything. The description doesn't add parameter details because there are none.
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 uses the specific verb 'list' and clearly identifies the resource as 'saved local SSH credential entries,' which is distinct from other sibling tools like ssh_connect, ssh_save_credentials, or ssh_delete_saved_credentials.
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's clear when to use this tool: when you need to see saved SSH credentials. However, it doesn't explicitly exclude any contexts or mention alternatives like ssh_list_connections.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_save_credentialsA
Save SSH credentials locally under a reusable name. If a password is provided, the server is contacted once to bootstrap a key and only the generated key credential is saved.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Saved credential name | |
| hostname | Yes | Remote server hostname or IP address | |
| username | Yes | SSH username | |
| password | No | SSH password for first-time bootstrap when no private key is available | |
| private_key_path | No | Path to private key file (optional) | |
| port | No | SSH port (default: 22) | |
| known_hosts_path | No | Optional path to an extra known_hosts file | |
| trust_unknown_host | No | Allow connecting to hosts not present in known_hosts. Defaults to false. | |
| jump_host | No | Optional SSH jump host (bastion) used to reach the target via native SSH tunneling |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses critical behavior: when a password is provided, the server is contacted to bootstrap a key and only the key is saved. This adds important context beyond the schema about the side effect and stored credential format.
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 sentences, perfectly sized. First sentence states the core purpose. Second sentence adds a crucial behavioral detail. No filler words.
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 the complexity (9 parameters, nested object, no output schema), the description is complete enough. It explains the key behavioral nuance. However, it could mention that the saved credential can later be used with ssh_connect_saved, enhancing integration awareness.
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 100%, so baseline is 3. The description adds a high-level behavioral note but does not add semantic detail for individual parameters beyond what the schema's descriptions already provide.
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 (save SSH credentials locally), the result (under a reusable name), and the key behavioral nuance (if password provided, bootstrap a key and save only the key credential). This distinguishes it from siblings like ssh_connect_saved or ssh_setup_key_auth.
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 implies usage: when you want to store credentials for later reuse. However, it does not explicitly state when NOT to use it (e.g., if you only need a one-time connection, use ssh_connect) or mention alternatives like ssh_setup_key_auth for key-only setup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_setup_key_authA
Generate a local SSH keypair, install the public key on the remote server, and save a key-based credential for future connections
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Existing active SSH connection that authenticated with a password | |
| credential_name | No | Saved credential name for future key-based logins | |
| key_name | No | Local key filename stem. Defaults to credential_name or connection_name. | |
| key_comment | No | Comment appended to the generated public key | |
| overwrite_saved_credential | No | Overwrite an existing saved credential with the same credential_name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the tool's actions (keypair generation, public key installation, credential saving), which are inherently destructive (overwriting keys/credentials) and involve network changes. However, it does not mention error conditions, idempotency, or what happens if the key already exists or the connection fails.
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 a single, well-structured sentence that efficiently conveys the three-step process. Every part is essential, and no words are wasted.
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 the complexity of the tool (multiple steps, side effects) and the absence of an output schema or annotations, the description provides a clear overview of what the tool does. However, it could be more complete by noting that the tool modifies the remote server's authorized_keys and saves a local credential, which are irreversible actions.
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?
Although the input schema already has 100% coverage with descriptions, the tool description adds context by explaining that 'key_name' defaults to credential_name or connection_name, and 'overwrite_saved_credential' controls overwriting existing credentials. This adds meaning beyond the schema's raw descriptions.
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 a three-step process: generating a keypair, installing the public key on a remote server, and saving a credential for future use. It uses specific verbs (generate, install, save) and identifies the resources (local SSH keypair, remote server, credential), distinguishing it from siblings like ssh_connect or ssh_save_credentials.
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 implies that this tool is used for setting up key-based authentication after password authentication, as the required 'connection_name' parameter refers to an 'Existing active SSH connection that authenticated with a password'. However, it does not explicitly state when not to use it or mention alternatives among siblings for similar tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_upload_fileB
Upload a local file from an allowed local root to the remote server via SFTP
| Name | Required | Description | Default |
|---|---|---|---|
| connection_name | Yes | Name of the SSH connection to use | |
| local_path | Yes | Local file path to upload | |
| remote_path | Yes | Remote destination path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. It indicates the upload is via SFTP and requires an 'allowed local root', hinting at a security constraint. However, it doesn't disclose whether the file is overwritten, whether permissions are set, or what happens on failure. The behavior is partially transparent.
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 a single sentence that efficiently conveys the core purpose. It is front-loaded with the action and key concepts. No unnecessary words, but it could be slightly more informative within the same space.
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 the tool has 3 parameters, 100% schema coverage, no output schema, and no annotations, the description could provide more context about behavior (e.g., overwrite policy, permission settings). It is adequate but not rich for a file transfer operation.
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?
Input schema covers all 3 parameters with descriptions. The tool description adds the context of 'allowed local root' for local_path, which provides additional meaning beyond the schema. However, for connection_name and remote_path, the description doesn't add extra value beyond the schema's own descriptions.
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), the resource (local file), and the transport method (SFTP via an SSH connection). It distinguishes itself from sibling tools like ssh_download_file (which does the opposite) and ssh_execute (which runs commands). However, it doesn't explicitly mention that the upload is to a remote server, which is already implied by SFTP.
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 mentions 'allowed local root', giving a hint about prerequisites, but it doesn't clearly state when to use this tool vs alternatives like setting up key auth first or ensuring the connection is established. No explicit when-not or alternatives are provided.
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.
12 tool updates
v1.0.1- First observed
ssh_connect - First observed
ssh_connect_saved - First observed
ssh_delete_saved_credentials - First observed
ssh_disconnect - First observed
ssh_download_file - First observed
ssh_execute - First observed
ssh_health_check - First observed
ssh_list_connections - First observed
ssh_list_saved_credentials - First observed
ssh_save_credentials - First observed
ssh_setup_key_auth - First observed
ssh_upload_file
TDQS
Scored across 12 tools
Each tool targets a distinct action on SSH connections or credentials. For example, ssh_connect and ssh_connect_saved differ by credential source, ssh_execute and ssh_download_file/ssh_upload_file are clearly different operations. No overlapping purposes detected.
All tools use a consistent 'ssh_' prefix and verb_noun pattern (e.g., ssh_connect, ssh_execute, ssh_download_file). Minor deviation: ssh_setup_key_auth and ssh_delete_saved_credentials use slightly longer verbs but still follow the pattern.
12 tools is reasonable for an SSH management server covering connection lifecycles, file transfer, and credential management. Slightly on the higher end but each tool is justified.
Covers core SSH operations: connect/disconnect, execute, file transfer, credential management, and health check. Minor gap: no explicit tool for listing remote files/directories, but file transfer tools imply that capability.
Maintenance
Related MCP Connectors
Work on your own computers from Claude or ChatGPT: run commands, edit and search files.
Use your Mac, Windows or Linux computer from ChatGPT, Claude or Codex: files, commands, documents.
Termalin's hosted MCP server. Claude, ChatGPT or any MCP client runs commands, moves files over SFTP, queries databases and reads server metrics and monitoring alerts on your servers, keylessly through Termalin Connectors: no SSH key is handed over and no inbound port is opened. Per-host command policy and an audit log. Needs a termal.in Pro or Team account (new accounts start with a 14-day Pro trial).
Scoped, audited SSH exec, sessions, and SFTP on your saved servers without exposing credentials
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables remote server control via SSH through Claude, supporting command execution, file transfers, and multi-server management with both standard and streamable HTTP protocols.-
- AlicenseNot gradedqualityNot gradedmaintenanceConnects Claude to remote servers via SSH to execute commands, manage files, and browse directories. It allows users to add, edit, and switch between multiple server configurations through natural language conversations.-
- AlicenseAqualityCmaintenanceEnables Claude to connect to servers via SSH, execute commands, transfer files, and manage connections through natural language.99 npm1MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables Claude Code to control remote servers via SSH for automated deployment, testing, and operations, including command execution and file transfer.4-