Skip to main content
Glama
keesjankoster

Server Maintenance MCP Server

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.json is gitignored by default to prevent accidental credential commits.

  • ⚔ Native SSH & SFTP Engine: Powered by ssh2 without relying on host ssh.exe or 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.json

Quick Start

1. Configure Your Servers

Copy config/servers.example.json to config/servers.json:

cp config/servers.example.json config/servers.json

Edit 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 build

To run the automated test suite:

npm test

Antigravity 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/default on prod-web to update the proxy pass URL and test the configuration with nginx -t."

Available Tools

8 tools
ssh_execute_commandB

Execute a bash or shell command on a remote server over SSH. Supports working directory, timeouts, and sudo.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoOptional remote working directory to execute the command from.
sudoNoWhether to run the command with sudo privilege.
commandYesThe shell command to execute.
serverIdYesThe ID of the configured target server.
timeoutSecondsNoOptional execution timeout in seconds (default: 60).

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoThe remote path to list. Defaults to remote home/current directory if omitted.
serverIdYesThe ID of the configured target server.

TDQS

A3.5/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional tag to filter servers by (e.g. "production", "database", "web").

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesThe remote absolute path to the file (e.g. /etc/nginx/nginx.conf or /var/log/syslog).
maxLinesNoOptional maximum number of lines to return.
serverIdYesThe ID of the configured target server.
offsetLinesNoOptional starting line index (0-indexed).

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNoNumber of log lines to retrieve if action is "logs" (default: 50).
actionNoThe action to perform on the service (default: "status").
serverIdYesThe ID of the target server.
serviceNameYesThe systemd service name (e.g. "nginx", "docker", "redis-server") or container name.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
serverIdYesThe ID of the configured target server.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
serverIdNoThe server ID to test. If omitted, tests all configured servers.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoOptional file permissions mode in octal notation, e.g. "0644" or "0755".
pathYesThe remote absolute path where the file should be written.
backupNoWhether to create a timestamped backup before writing if file exists (default: true).
contentYesThe string content to write into the file.
serverIdYesThe ID of the configured target server.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 8 tool updatesv1.0.0
    • First observedssh_execute_command
    • First observedssh_list_directory
    • First observedssh_list_servers
    • First observedssh_read_file
    • First observedssh_service_status
    • First observedssh_system_info
    • First observedssh_test_connection
    • First observedssh_write_file

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    11
    12
    4
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    17
    8
    MIT
  • F
    license
    Not graded
    quality
    F
    maintenance
    Enables managing Linux servers via SSH with tools for command execution, file operations, service management, and log analysis.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables remote shell control of Linux and network devices via SSH/Telnet, with session management and file transfer capabilities.
    -