Server Maintenance MCP Server
Allows checking the status, inspecting logs, starting, stopping, or restarting Docker containers on remote servers.
Provides SSH-based tools to connect to, inspect, and maintain remote Linux/Unix servers, including executing commands, checking system information, reading and writing files, listing directories, and managing services.
Click on "Install 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., "@Server Maintenance MCP ServerCheck the system health and disk space on prod-web"
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.
Server Maintenance MCP Server
A Model Context Protocol (MCP) server designed for Google Antigravity to securely connect, inspect, and maintain remote Linux/Unix servers over SSH.
Features
š„ļø Configurable Server Registry: Manage multiple servers with custom IDs, hostnames/IPs, custom ports, usernames, and tags.
š Flexible Authentication:
OpenSSH private keys (
~/.ssh/id_rsa,~/.ssh/id_ed25519, etc.)Passphrase-protected private keys
Password authentication
Environment variable interpolation (e.g.
"${PROD_PASSWORD}"or"${SSH_KEY_SECRET}")
š”ļø Credential Protection:
Passwords, passphrases, and private key contents are automatically scrubbed from tool outputs and agent responses.
config/servers.jsonis gitignored by default to prevent accidental credential commits.
ā” Native SSH & SFTP Engine: Powered by
ssh2without relying on hostssh.exeor terminal emulation quirks on Windows.š§° Agent Toolset:
ssh_list_servers: View all configured servers and their metadata.ssh_test_connection: Test connectivity and measure SSH ping/round-trip latency.ssh_execute_command: Run any shell command with working directory, custom timeout, and sudo support.ssh_system_info: Inspect real-time CPU model, cores, load averages, memory usage, disk mounts, and uptime.ssh_read_file: Read remote files with line offsets and line counts over SFTP.ssh_write_file: Upload/edit remote files over SFTP with automatic timestamped backup copies (.bak-...).ssh_list_directory: Explore remote directories over SFTP with file types, sizes, permissions, and timestamps.ssh_service_status: Convenience tool to check, inspect logs, start, stop, or restart systemd services or Docker containers.
Related MCP server: SSH MCP Server
Directory Structure
ServerMaintenanceMCP/
āāā config/
ā āāā servers.example.json # Documented configuration template
ā āāā servers.json # Your actual server connections (gitignored)
āāā src/
ā āāā config.ts # Configuration loader & env var expander
ā āāā index.ts # MCP Stdio Server entrypoint
ā āāā ssh-manager.ts # SSH & SFTP connection pool and handlers
ā āāā types.ts # Zod schemas & TypeScript types
ā āāā tools/
ā āāā index.ts # Tool schemas and dispatcher
āāā test/
ā āāā config-and-tools.test.ts # Vitest unit test suite
āāā dist/ # Compiled executable output
āāā mcp_config.json # Antigravity MCP registration template
āāā package.json
āāā tsconfig.jsonQuick Start
1. Configure Your Servers
Copy config/servers.example.json to config/servers.json:
cp config/servers.example.json config/servers.jsonEdit config/servers.json with your actual server details:
{
"defaultKeyPath": "~/.ssh/id_rsa",
"servers": [
{
"id": "prod-web",
"name": "Production Web & API Server",
"host": "192.168.1.50",
"port": 22,
"username": "ubuntu",
"privateKeyPath": "~/.ssh/id_rsa",
"tags": ["production", "web", "docker"],
"description": "Nginx reverse proxy and API services",
"defaultCwd": "/var/www"
},
{
"id": "staging-db",
"name": "Staging Database Server",
"host": "staging-db.internal",
"port": 2222,
"username": "deploy",
"password": "${STAGING_DB_PASSWORD}",
"tags": ["staging", "database"],
"description": "PostgreSQL staging instance"
}
]
}2. Build the Server
npm run buildTo run the automated test suite:
npm testAntigravity Integration
The server has already been registered in your global Antigravity MCP configuration:
~/.gemini/config/mcp_config.json
{
"mcpServers": {
"server-maintenance": {
"command": "node",
"args": [
"c:/Users/keesj/Documents/repos/ServerMaintenanceMCP/dist/index.js"
],
"env": {
"SERVERS_CONFIG_PATH": "c:/Users/keesj/Documents/repos/ServerMaintenanceMCP/config/servers.json"
}
}
}
}Once registered, restart Antigravity or refresh MCP tools. You can verify available tools under Additional Options (...) > MCP Servers.
Example Antigravity Prompts
Once configured, you can prompt Antigravity directly:
"List my configured servers and test connection to each one."
"Check the system health and disk space on
prod-web.""Inspect the last 50 lines of the Nginx error log on
prod-web.""Check the status of the docker service on
staging-db.""Edit
/etc/nginx/sites-available/defaultonprod-webto update the proxy pass URL and test the configuration withnginx -t."
Available Tools
8 toolsssh_execute_commandB
Execute a bash or shell command on a remote server over SSH. Supports working directory, timeouts, and sudo.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Optional remote working directory to execute the command from. | |
| sudo | No | Whether to run the command with sudo privilege. | |
| command | Yes | The shell command to execute. | |
| serverId | Yes | The ID of the configured target server. | |
| timeoutSeconds | No | Optional execution timeout in seconds (default: 60). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits, but it does not warn about the potential for destructive side effects, privilege escalation via sudo, or that commands run with the SSH user's permissions. It also doesn't mention idempotency, error handling, or that output includes stdout/stderr and exit codes. This is a significant gap for a tool that can mutate remote state.
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, with the purpose front-loaded and no extraneous detail. Every word earns its place: the first sentence states the core action, the second highlights key options. It is appropriately sized for the tool's simplicity and avoids 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?
Despite having five parameters and no output schema, the description does not explain the return format (stdout, stderr, exit code) or any failure modes (e.g., unreachable server, authentication errors). It also lacks guidance on safe usage or prerequisites. Given the tool's potential for side effects and its complexity, more detail is needed for an agent to call it confidently.
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 provides descriptions for all five parameters (100% coverage), so the description's mention of 'working directory, timeouts, and sudo' adds no new meaning beyond restating the schema. The baseline for high coverage is 3, and the description does not enrich parameter understanding with examples or constraints beyond what is already in 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?
The description states 'Execute a bash or shell command on a remote server over SSH' with a clear verb, resource, and method. It distinguishes itself from sibling tools like ssh_read_file, ssh_write_file, and ssh_list_directory, which handle specific file operations, and from ssh_system_info or ssh_service_status, which gather info. The purpose is unambiguous and contextually 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 mentions supported features (working directory, timeouts, sudo) but does not explicitly guide when to use this tool versus alternatives, such as stating 'use ssh_read_file for file retrieval' or 'use ssh_test_connection to verify connectivity'. It relies on the agent inferring from sibling names that this is for arbitrary command execution. No exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_list_directoryA
List remote directory contents via SFTP, returning filename, file type, file size, permissions, and modification timestamp.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | The remote path to list. Defaults to remote home/current directory if omitted. | |
| serverId | Yes | The ID of the configured target server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden for behavioral disclosure. It reveals the return fields but does not state whether the operation is read-only, what errors may occur (e.g., invalid path, connection failure), or any side effects. For a tool with no annotation coverage, this is a significant gap in disclosing operational behavior.
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, efficient sentence that front-loads the action and resource, and then lists the return fields with zero wasted words. Every element 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 simple with 2 parameters and no output schema, and the description covers the core function and return fields. However, it lacks context about error handling, whether listing is recursive, or any operational constraints. Given no annotations and no output schema, more detail on edge cases or limitations would be helpful, but the basic usage is adequately specified.
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% for both parameters (path and serverId), so the schema already documents them clearly. The description adds no extra meaning beyond what the schema provides; it does not elaborate on defaults, formatting, or constraints. Baseline 3 is appropriate given the high schema coverage.
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 (List), the resource (remote directory contents), the method (via SFTP), and the specific fields returned (filename, file type, file size, permissions, modification timestamp). This unambiguously distinguishes it from siblings like ssh_read_file (reads file content) and ssh_execute_command (runs commands).
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 this tool is for listing directories, but it does not explicitly state when to use it versus alternatives, nor does it mention any exclusions or prerequisites. Sibling names give context, but no direct guidance is provided, leaving the agent to infer usage from the verb and resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_list_serversA
List all configured remote servers available for SSH connections with their metadata, tags, and connection details (excluding sensitive credentials).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Optional tag to filter servers by (e.g. "production", "database", "web"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description is the only source of behavioral information. It clarifies that this is a read-only enumeration and explicitly excludes sensitive credentials, which is important safety-relevant behavior. It could mention authentication requirements or return format, but the stated exclusions add meaningful transparency.
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 leads with the primary action and result. It avoids unnecessary filler and places the most important information first.
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 one optional parameter, the description provides sufficient context: what is listed, what fields are available, and what is deliberately excluded. It could mention output format or pagination, but the absence is not critical for this straightforward read-only 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?
The only parameter, 'tag', is fully described in the schema itself, so the description adds no additional meaning beyond what the schema already provides. The baseline score applies because the schema covers the parameter adequately.
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 a specific verb ('List') and clear resource ('configured remote servers'), and it distinguishes this tool from its siblings by focusing on discovery/inventory rather than execution or inspection. The inclusion of 'metadata, tags, and connection details' further clarifies the read-only 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 clear contextual purpose ā listing configured SSH servers ā but does not explicitly state when to prefer this tool over siblings like ssh_execute_command or ssh_test_connection. There is no when-to-use or when-not-to-use guidance, though the purpose is easy to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_read_fileA
Read the contents of a remote file over SFTP. Supports offset lines and line limits for inspecting log files and large config files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | The remote absolute path to the file (e.g. /etc/nginx/nginx.conf or /var/log/syslog). | |
| maxLines | No | Optional maximum number of lines to return. | |
| serverId | Yes | The ID of the configured target server. | |
| offsetLines | No | Optional starting line index (0-indexed). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden. It states the operation is read-only ('Read') and mentions SFTP transport, but does not disclose error handling, auth requirements, or return format. It adds some behavioral context about offset and limit support, but lacks depth on what happens in edge cases. A score of 3 reflects adequate but not thorough transparency.
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. It front-loads the primary action, then adds the supporting detail about offset and limits. No unnecessary words, making it efficient for an agent to parse.
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's simplicity and that the schema covers parameter details, the description provides the essential purpose and use case. It does not mention error conditions or binary file handling, but for a read operation these are minor. The lack of an output schema means the agent must infer return value, but 'read contents' implies the file text. Overall, it is reasonably complete for its complexity.
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 four parameters are documented in the schema with descriptions, giving 100% coverage. The description reinforces the purpose of offsetLines and maxLines for log inspection, but adds no new semantic meaning beyond what the schema already states. Baseline 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 clearly states the tool reads remote file contents over SFTP, with a specific verb and resource. It distinguishes from sibling write/list/execute tools by focusing on read-only file access. The mention of offset and line limits adds specificity for large files.
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 identifies the use case (inspecting log files and large config files) which gives context for when to use it. However, it does not explicitly contrast with alternatives like ssh_execute_command or ssh_write_file, so there are no exclusions mentioned. This earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_service_statusA
Check status, view logs, start, stop, or restart a systemd service or Docker container on the remote server.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Number of log lines to retrieve if action is "logs" (default: 50). | |
| action | No | The action to perform on the service (default: "status"). | |
| serverId | Yes | The ID of the target server. | |
| serviceName | Yes | The systemd service name (e.g. "nginx", "docker", "redis-server") or container name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosure. It explicitly lists mutating actions (start, stop, restart), which reveals the tool can change system state, but it does not mention operational consequences like service downtime or reversibility.
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?
A single, dense sentence conveys the tool's purpose and scope with no filler. It front-loads the main actions and target objects, which is ideal for an agent quickly classifying the tool.
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 is clear for basic routing, but absent any annotations or output schema it does not explain return values, permission requirements, or consequences of stop/restart actions. The mutating operations are named, yet the agent has to infer the operational context.
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 parameter coverage is 100% (serverId, serviceName, action, limit), and the description does not add parameter detail. Baseline 3 is appropriate because the schema already documents parameters and the description does not need to repeat them.
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 names a specific action set ā check status, view logs, start, stop, restart ā and precise targets (systemd service or Docker container on remote server). It clearly communicates what the tool does and differentiates it from generic commands like ssh_execute_command.
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 use case is clear: any agent needing to inspect or control a systemd service or Docker container. It does not explicitly mention alternatives or when not to use it, but the described scope is specific enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_system_infoA
Gather comprehensive diagnostic overview of a remote server: OS version, kernel, uptime, CPU cores/model, load averages, RAM usage, and disk mounts.
| Name | Required | Description | Default |
|---|---|---|---|
| serverId | Yes | The ID of the configured target server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The word 'gather' implies a read-only operation, but with no annotations provided, the description carries the full burden. It does not disclose whether elevated permissions are needed, whether any remote commands are executed that could have side effects, or how connection/authentication failures are surfaced. This is acceptable for a seemingly non-destructive tool, but not fully 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 one concise sentence with the action and object front-loaded, followed by a concrete list of what the overview includes. Every word contributes meaning and there is no redundancy with the tool name.
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 the output content (OS, kernel, uptime, load, RAM, disk) which is helpful given there is no output schema. However, it does not mention response structure, error conditions, required permissions, or whether it executes privileged commands. These missing details reduce completeness for an SSH-based 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 single parameter serverId is already well described in the schema ('The ID of the configured server'). The description's mention of 'remote server' adds minimal semantic value beyond that, so it neither compensates for nor conflicts with 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?
The description starts with a specific verb and object ('Gather comprehensive diagnostic overview of a remote server') and enumerates the exact data points returned (OS version, kernel, uptime, load averages, RAM, disk mounts). This clearly distinguishes it from sibling tools like ssh_execute_command or ssh_read_file, which serve different purposes.
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 use case is implied: use this when you need overall system health/configuration of a server. However, there is no explicit guidance on when to prefer this over ssh_execute_command, ssh_service_status, or other siblings, nor any exclusions or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_test_connectionA
Test SSH connectivity and measure round-trip latency to a specified server or all configured servers.
| Name | Required | Description | Default |
|---|---|---|---|
| serverId | No | The server ID to test. If omitted, tests all configured servers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior. It mentions measuring round-trip latency, which implies a read-only, non-destructive operation. However, it does not explicitly state that no changes are made to the server, nor does it explain error handling or the nature of the test (e.g., ping vs. SSH handshake). This leaves some behavioral details implicit.
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 with no filler. It front-loads the primary action and result, and includes the parameter scope without redundancy. Every word contributes to the understanding of the tool.
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 tool with one optional parameter and no output schema, the description covers the core purpose and parameter semantics. It does not explicitly mention what the tool returns (e.g., a success/failure status or latency values), but the phrase 'measure round-trip latency' implies the output. Given the low complexity, the description is nearly complete, though a brief note on the response format would make it fully self-contained.
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% and the schema already explains serverId ('The server ID to test. If omitted, tests all configured servers.'). The description essentially repeats this information ('to a specified server or all configured servers'), adding no new meaning beyond the schema. Baseline 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 ('Test') and resource ('SSH connectivity') and adds the outcome ('measure round-trip latency'). This clearly distinguishes it from sibling tools like ssh_execute_command or ssh_list_servers, which have different purposes. The scope ('specified server or all configured servers') further clarifies the tool's function.
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 clear context for when to use this tool: testing connectivity and latency. It doesn't explicitly mention alternatives or exclusions, but the purpose is distinct enough that an agent can infer when to select it. There's no misleading guidance, and the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_write_fileA
Create or update a remote file over SFTP. By default automatically creates a timestamped backup copy (.bak-...) of any existing file before overwriting.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Optional file permissions mode in octal notation, e.g. "0644" or "0755". | |
| path | Yes | The remote absolute path where the file should be written. | |
| backup | No | Whether to create a timestamped backup before writing if file exists (default: true). | |
| content | Yes | The string content to write into the file. | |
| serverId | Yes | The ID of the configured target server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing side effects. It clearly states that existing files may be overwritten and that a timestamped backup (.bak-...) is created by default, adding meaningful behavioral context beyond the name and schema.
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 front-load the core operation and then add the most important behavioral default. There is no redundant or filler content.
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 straightforward file write tool with fully documented parameters and no output schema, the description covers the core operation and the key side-effect behavior. It could add explicit guidance on when not to use it, but the essential context for invoking it correctly is present.
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 schema already documents all five parameters. The description adds the backup filename convention (.bak-...) and default behavior, but does not need to compensate for missing parameter documentation.
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: 'Create or update a remote file over SFTP.' It clearly distinguishes this from sibling tools like ssh_read_file and ssh_execute_command by naming the transport (SFTP) and the write action.
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 writing files over SFTP, and sibling names make the read/execute/listing alternatives obvious. However, it does not explicitly state when to use this tool versus alternatives or mention any exclusions or prerequisites.
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.
8 tool updates
v1.0.0- First observed
ssh_execute_command - First observed
ssh_list_directory - First observed
ssh_list_servers - First observed
ssh_read_file - First observed
ssh_service_status - First observed
ssh_system_info - First observed
ssh_test_connection - First observed
ssh_write_file
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose: listing servers, testing connectivity, executing commands, gathering system info, reading/writing files, listing directories, and managing services. No overlap in functionality, making agent selection straightforward.
All tools share the 'ssh_' prefix and mostly follow a verb_noun pattern (e.g., ssh_list_servers, ssh_execute_command, ssh_read_file). However, ssh_system_info and ssh_service_status are noun_noun rather than verb_noun, creating a minor inconsistency.
With 8 tools, the set is well-scoped for a server maintenance domain. Each tool covers a core operation without redundancy or bloat, appropriate for the server's purpose.
The toolset covers the main lifecycle for remote server management: listing, testing, executing, inspecting, file transfer, and service control. Minor gaps exist such as file deletion or rename, but agents can work around these with execute_command, so no dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Scoped, audited SSH exec, sessions, and SFTP on your saved servers without exposing credentials
Run commands and read/write files on your servers over Termalin's keyless tunnels (hosted MCP).
- emisarOAuthdev.emisar
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Secure tunneling, reverse proxy and remote access for local applications.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables remote server management through SSH and SFTP, supporting command execution, file transfers, and interactive shell sessions. It allows for multiple concurrent connections using either password or SSH key authentication.11124MIT
- AlicenseAqualityCmaintenanceEnables remote server administration via SSH, supporting command execution, SFTP file transfers, and multi-profile management. It features security safeguards like destructive command detection and audit logging to ensure safe interaction with remote Linux/Unix environments.178MIT
- FlicenseNot gradedqualityFmaintenanceEnables managing Linux servers via SSH with tools for command execution, file operations, service management, and log analysis.-
- FlicenseNot gradedqualityBmaintenanceEnables remote shell control of Linux and network devices via SSH/Telnet, with session management and file transfer capabilities.-