SSH MCP Server
Enables VS Code Copilot Chat to perform hardened SSH operations and manage remote Linux systems through a natural language interface using the Model Context Protocol.
Allows secure management of remote Linux servers via SSH, providing tools for host discovery, templated command execution, SFTP file transfers, and SSH certificate lifecycle management.
What Is This?
SSH MCP Server lets you manage remote Linux servers through natural language in VS Code Copilot Chat. Instead of switching to a terminal and remembering SSH commands, you just ask:
"Check disk usage on production-web"
"Show me the last 200 lines of /var/log/nginx/error.log on staging"
"Download /var/log/syslog from web-server-01 for incident INC-2026-0309"
The server enforces strict security policies — no raw shell access, all commands go through pre-approved templates, parameters are regex-validated, secrets in output are auto-redacted, and privileged operations require an approval workflow.
Related MCP server: mcp-ssh
Features
23 MCP tools — host discovery, session management, command execution (sync + background), file transfer, SFTP operations, SSH key management, certificate lifecycle, approval workflows
Template-only execution — no raw shell; every command matches a registered template with regex-validated parameters
3-tier security model — read-only (Tier 0), controlled mutation with confirmation (Tier 1), privileged with approval workflow (Tier 2)
Automatic secret redaction — AWS keys, bearer tokens, passwords, private keys are scrubbed from output
Tamper-evident audit log — every operation is logged with hash-chain integrity verification
Short-lived SSH certificates — issue and revoke certificates with TTL enforcement via a local CA
Persistent SSH sessions — connection pooling with keepalive probes and configurable idle timeout
Background command execution — run long-running template commands asynchronously with output polling
Path traversal protection —
..sequences blocked in all path parameters and file transfersTransfer policy — allowed paths, blocked extensions, size limits, mandatory justification for downloads
Quick Start
Prerequisites
Python 3.11+
VS Code with GitHub Copilot extension
SSH access to at least one remote Linux host
Install
As vscode plugin
Follow instructions on link:
https://marketplace.visualstudio.com/items?itemName=bhayanak.ssh-mcp-server-secure
Python package: https://pypi.org/project/ssh-mcp-server-copilot/
Install from Source (for development / contributing)
git clone https://github.com/bhayanak/ssh-mcp-server.git
cd ssh-mcp-server
python -m venv .venv
source .venv/bin/activate # macOS/Linux
# .venv\Scripts\activate # Windows
pip install -e ".[dev]"For local development, create .vscode/mcp.json pointing to the local source:
{
"servers": {
"ssh-mcp": {
"type": "stdio",
"command": "${workspaceFolder}/.venv/bin/python",
"args": ["-m", "ssh_mcp.server"],
"env": {
"SSH_MCP_CONFIG_DIR": "${workspaceFolder}/config",
"SSH_MCP_HOSTS_FILE": "${workspaceFolder}/config/hosts.json",
"SSH_MCP_TEMPLATES_FILE": "${workspaceFolder}/config/templates.json",
"SSH_MCP_AUDIT_LOG_DIR": "${workspaceFolder}/audit_logs",
"SSH_MCP_CERT_DATA_DIR": "${workspaceFolder}/cert_data",
"SSH_MCP_APPROVAL_DATA_DIR": "${workspaceFolder}/approval_data",
"SSH_MCP_SSH_KNOWN_HOSTS_FILE": "~/.ssh/known_hosts"
}
}
}
}Configure Your Hosts
Edit the hosts file with your actual servers. If you used ssh-mcp-server-copilot init, edit ~/.ssh-mcp/hosts.json. If developing from source, edit config/hosts.json.
[
{
"host_id": "my-server",
"hostname": "192.168.1.10",
"port": 22,
"ssh_user": "deploy",
"labels": {"env": "production", "role": "web"},
"description": "Production web server",
"allowed_roles": ["operator", "admin"]
}
]Field | Required | Description |
| Yes | Unique identifier (alphanumeric, dots, dashes) |
| Yes | IP address or FQDN |
| No | SSH port (default: 22) |
| Yes* | Remote SSH username. If empty, uses your OS username |
| No | Key-value tags for organization |
| No | Human-readable description |
| No | Which roles can access this host (default: operator, admin) |
Set Up SSH Access
Your SSH key must be authorized on each host:
# Generate a key if you don't have one
ssh-keygen -t ed25519 -C "your-email@example.com"
# Copy to each host
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@192.168.1.10
# Load into ssh-agent (required — the MCP server uses the agent)
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# Verify access
ssh deploy@192.168.1.10 "echo OK"Add host keys to known_hosts:
ssh-keyscan -H 192.168.1.10 >> ~/.ssh/known_hostsStart Using
Open the workspace in VS Code
The MCP server auto-starts from
.vscode/mcp.jsonOpen Copilot Chat (Cmd+Shift+I / Ctrl+Shift+I)
Switch to "Agent" mode (critical — only Agent mode can invoke MCP tools)
Verify tools are loaded — click the tools icon in the chat input bar, you should see 23 tools from
ssh-mcp
Now just ask in natural language:
> List all my SSH hosts
> Check disk usage on my-server
> Show me the last 100 lines of /var/log/syslog on my-server
> What's the status of nginx on my-server?Tools (23)
Tier 0 — Read-Only (No Confirmation)
Tool | Description |
| List all configured SSH hosts with labels and metadata |
| Get OS, uptime, kernel info from a host |
| View the tamper-evident audit trail |
| List available command templates |
| View pending approval requests |
Session Management
Tool | Description |
| Open a persistent SSH session (returns session_id for reuse) |
| Close a persistent session |
| List active sessions and remaining connection slots |
| Health-check a session (liveness, idle time, uptime) |
Tier 1 — Controlled Mutation (Confirmation Required)
Tool | Description |
| Execute a template command on a host (supports |
| Download/upload files via SFTP with path and extension policies (supports |
Background Command Execution
Tool | Description |
| Start a template command in the background (returns job_id) |
| Read accumulated stdout/stderr of a background job (redacted) |
| List all background jobs (running + completed) |
| Cancel a running background job |
Enhanced SFTP
Tool | Description |
| List files in a remote directory (within allowed paths) |
| Delete a remote file (within allowed paths, requires justification) |
Tier 2 — Privileged (Approval Required)
Tool | Description |
| Register a public SSH key with TTL enforcement |
| Revoke a registered SSH key |
| Issue a short-lived SSH certificate via the local CA |
| Revoke a certificate and delete its PEM |
| Approval workflow for privileged ops |
Configuration
Command Templates
Templates define which commands can be executed. Edit config/templates.json:
[
{
"template_id": "disk_usage",
"description": "Show disk usage summary",
"command": "df -h",
"allowed_params": {},
"allowed_roles": ["developer", "operator", "admin"],
"timeout_seconds": 10,
"risk_level": "low"
},
{
"template_id": "tail_log",
"description": "Tail the last N lines of a log file",
"command": "tail -n {lines} {log_path}",
"allowed_params": {
"lines": "^[0-9]{1,5}$",
"log_path": "^/var/log/[a-zA-Z0-9_./-]+$"
},
"allowed_roles": ["operator", "admin"],
"timeout_seconds": 15,
"risk_level": "low"
}
]Each parameter is validated against a regex pattern before substitution. Path traversal (..) is blocked automatically.
Environment Variables
All configuration is via environment variables with the SSH_MCP_ prefix:
Variable | Default | Description |
|
| Base config directory (all other paths derive from this) |
|
| Path to hosts configuration |
|
| Path to command templates |
|
| Audit log directory |
|
| Certificate storage directory |
|
| Approval data directory |
|
| Max simultaneous SSH sessions |
|
| Idle session timeout (seconds) |
|
| SSH keepalive interval (seconds) |
|
| Max failed keepalive probes before disconnect |
|
| Max concurrent background jobs |
|
| Max output buffer per background job (1 MB) |
|
| Background job auto-expiry (1 hour) |
| (none) | Path to SSH known_hosts file |
|
| Require different user as approver |
| (none) | Bearer token (empty = dev mode) |
|
| SSH connection timeout |
Transfer Policy (Defaults)
Setting | Default |
Allowed paths |
|
Blocked extensions |
|
Max file size | 50 MB |
Require justification for downloads | Yes |
Roles
Role | Access |
| Read-only tools, low-risk commands |
| All Tier 0 + Tier 1 tools |
| All tools including Tier 2 (key/cert management) |
| Audit log access |
Security
Design Principles
No raw shell — all commands go through registered templates
Parameter validation — every parameter is regex-validated before substitution
Path traversal blocking —
..sequences rejected in all parameters and file pathsSecret redaction — AWS keys, bearer tokens, passwords, private keys automatically scrubbed from output
Approval workflow — privileged operations (key/cert management) require explicit approval with HMAC-verified tokens
Tamper-evident audit — hash-chained audit log for forensic analysis
Strict host validation — paramiko
RejectPolicyby default (no auto-accepting unknown hosts)TTL enforcement — SSH certificates and keys have configurable maximum lifetimes
Approval Workflow
Tier 2 operations follow a 3-step flow:
1. request_approval → returns request_id + one-time approval_token
2. approve_request → verifies HMAC token, marks approved
3. call the tool → pass approval_request_id, consumed after useWith REQUIRE_TWO_PARTY_APPROVAL=true (production), a different user must approve.
Audit Log Verification
python -c "
from ssh_mcp.audit import AuditLogger
from pathlib import Path
logger = AuditLogger(Path('audit_logs'))
ok, msg = logger.verify_chain()
print(f'Chain integrity: {ok} — {msg}')
"Testing
Unit Tests
# Run all tests
pytest tests/ -v
# With coverage
pytest tests/ -v --cov=ssh_mcpRuntime Directories (git-ignored, auto-created)
Directory | Purpose |
| Tamper-evident audit log ( |
| CA keys, issued certificates, revocation list |
| Pending and consumed approval requests |
CLI Reference
ssh-mcp-server-copilot --version # Print version
ssh-mcp-server-copilot init # Create ~/.ssh-mcp with default configs
ssh-mcp-server-copilot # Start MCP server (stdio transport)
ssh-mcp-server-copilot --config-dir PATH # Use custom config directory
ssh-mcp-server-copilot --config-dir PATH init # Init a custom config directoryContributing
Fork the repository
Create a feature branch:
git checkout -b feature/my-featureMake your changes
Run tests:
pytest tests/ -vLint:
ruff check src/ tests/Submit a pull request
License
Available Tools
23 toolsadd_ssh_keyA
Register a new SSH public key with policy checks.
Validates key format and strength. Enforces TTL limits from key policy. Requires ADMIN role and prior approval.
Risk level: high (requires approval).
| Name | Required | Description | Default |
|---|---|---|---|
| user_name | Yes | ||
| public_key | Yes | ||
| ttl_seconds | No | ||
| reason | No | ||
| approval_request_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It successfully discloses validation behavior ('Validates key format and strength'), policy enforcement ('Enforces TTL limits'), authorization requirements ('ADMIN role'), and risk profile ('high'). Missing idempotency guarantees and specific side effects beyond registration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five distinct sentences, each earning its place: action, validation, enforcement, authorization, risk. Information is front-loaded with the core action and structured logically from functional description to security constraints.
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?
While the description covers behavioral and security context well for a complex mutation tool, and an output schema exists (relieving return value documentation), the 0% parameter schema coverage combined with insufficient parameter explanation in the description leaves significant gaps in required documentation for a 5-parameter 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?
With 0% schema description coverage, the description must compensate heavily. It provides context for 'ttl_seconds' (TTL limits), 'approval_request_id' (prior approval), and 'public_key' (key format validation), but fails to explain required parameter 'user_name' or optional 'reason' field semantics beyond their titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool 'Register[s] a new SSH public key' with specific scope (policy checks included). It effectively distinguishes from sibling 'remove_ssh_key' and relates to approval workflow tools (approve_request, request_approval) by mentioning registration vs. removal and approval requirements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states prerequisites: 'Requires ADMIN role and prior approval' and 'Risk level: high'. This signals when the tool is appropriate (admin tasks with existing approval) and implies the workflow sequence (approval first), though it doesn't explicitly state 'do not use without approval' or contrast with non-admin alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
approve_requestA
Approve a pending approval request.
In two-party mode, the approver must be a different user from the requester.
Risk level: high (grants execution permission).
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes | ||
| approval_token | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Effectively discloses critical behavioral traits: high risk level, that it grants execution permission, and two-party mode requirements. Does not mention if approval is reversible or immediate side effects.
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?
Three sentences, each earning its place: purpose first, operational constraint second, risk warning third. No redundant or filler text. Appropriately front-loaded.
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?
Adequate for a high-risk mutation tool given the output schema exists (covering return values). However, gaps remain: with 0% schema coverage, parameters lack documentation in both schema and description, and there's no mention of prerequisite steps (e.g., obtaining tokens from list_pending_approvals).
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 0% (no parameter descriptions), yet the description adds no semantic information about 'request_id' or 'approval_token'. Relies entirely on parameter names being self-explanatory, providing no context on where the approval_token originates or its format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action (approve) and resource (pending approval request) clearly. Distinguishes sufficiently from sibling 'request_approval' through the opposite verb, though could explicitly reference the relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a specific operational constraint ('In two-party mode, the approver must be a different user from the requester'), but lacks explicit guidance on when to use this versus alternatives or prerequisites like obtaining the approval_token.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_background_jobB
Cancel a running background job.
Risk level: medium (requires user confirmation).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 successfully communicates risk level and confirmation requirements, but omits critical operational details like whether cancellation is immediate or graceful, whether partial results are preserved, or what the output schema contains.
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 optimally concise with two information-dense sentences. The primary action is front-loaded in the first sentence, while risk metadata follows in the second. No filler or redundant text is present.
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 (single required parameter) and existence of an output schema, the description adequately covers the core operation and risk profile. However, completeness suffers from the lack of parameter documentation and absence of behavioral details about the cancellation mechanism itself.
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 has 0% description coverage (job_id has only a title). The description fails to compensate by not mentioning the parameter at all, nor explaining where to obtain valid job IDs (e.g., from list_background_jobs). While the parameter intent is inferable from the tool name, this gap leaves the agent without guidance on job_id format or source.
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 specific action (Cancel) and resource (running background job), distinguishing it from sibling tools like list_background_jobs, poll_background_job, and run_ssh_command_background. However, it doesn't specify what types of background jobs (e.g., SSH commands, cert operations) are cancellable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a risk level ('medium') and explicitly states that user confirmation is required, which guides cautious usage. However, it lacks explicit guidance on when to cancel versus let jobs complete, and doesn't mention that job_id values likely come from list_background_jobs or run_ssh_command_background siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audit_logsB
Return the last N audit log entries. Read-only.
Risk level: low.
| Name | Required | Description | Default |
|---|---|---|---|
| last_n | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 successfully indicates the read-only nature and risk level, but lacks details about log content, retention periods, or pagination behavior beyond the 'last N' limitation.
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 appropriately front-loaded with the core purpose in the first sentence, followed by safety metadata. Every sentence adds value with no redundancy or waste.
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 (1 optional parameter) and the existence of an output schema, the description provides minimum viable information. However, with zero schema annotations, it should explicitly document the parameter's default value and optional status.
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 0%, requiring the description to compensate. It partially compensates by mapping 'last N' to the parameter's purpose, but fails to document that the parameter is optional, has a default value of 50, or specify valid ranges/constraints.
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 specific action (Return) and resource (audit log entries), distinguishing it from sibling SSH and approval management tools. However, it doesn't explicitly differentiate from other list/retrieve operations like list_background_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides safety information ('Read-only', 'Risk level: low') but offers no guidance on when to use this tool versus alternatives, prerequisites, or conditions where it might not be appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_host_factsA
Get safe host metadata (OS, uptime, kernel) — no secrets.
Risk level: low.
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description compensates well with explicit risk disclosure ('Risk level: low', 'safe', 'no secrets'). Clearly signals this is a read-only operation that doesn't expose sensitive data.
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 efficient sentences with zero waste. Front-loaded with the core action and safety constraints. The em-dash effectively separates the scope from the safety assertion.
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?
Adequate for a single-parameter tool with existing output schema (no return value description needed). However, the undocumented host_id parameter leaves a significant gap given the schema lacks descriptions.
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 has 0% description coverage (host_id lacks description), and the description fails to compensate. No mention of what host_id represents (UUID, hostname, IP) or its relationship to the operation.
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?
Excellent specificity with verb 'Get', resource 'host metadata', and concrete examples (OS, uptime, kernel). The 'safe' qualifier effectively distinguishes this from sibling execution tools like run_ssh_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?
Implies usage through 'safe' and 'no secrets' constraints, suggesting when to prefer this over command execution tools. However, lacks explicit when-to-use guidance or named alternatives (e.g., vs run_ssh_command).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
issue_certA
Issue a short-lived SSH certificate for a user.
Certificates are signed by the local CA with a tight TTL. Requires ADMIN role and prior approval.
Risk level: high.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| principals | No | ||
| ttl_seconds | No | ||
| justification | No | ||
| approval_request_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 effectively communicates authorization requirements (ADMIN role), prerequisites (prior approval), risk profile (high), and operational characteristics (signed by local CA, tight TTL). It appropriately signals this is a sensitive write operation.
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 optimally structured with the purpose front-loaded in the first sentence, followed by implementation details, requirements, and risk assessment. Every sentence delivers unique value without redundancy or fluff.
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 complexity (5 parameters, security-sensitive mutation) and presence of an output schema, the description adequately covers operational context and risk. The main gap is parameter documentation, which should have been addressed given the 0% schema coverage.
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 0%, requiring the description to compensate. It partially succeeds by implying semantics for 'user_id' ('for a user'), 'ttl_seconds' ('tight TTL'), and 'approval_request_id' ('prior approval'). However, it fails to explain 'principals' (SSH-specific concept) or 'justification' (audit purpose), leaving critical parameters undocumented.
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 opens with a specific verb ('Issue') and resource ('short-lived SSH certificate'), clearly defining the tool's scope. It distinguishes itself from sibling tools like 'add_ssh_key' by specifying 'certificate' and from 'revoke_cert' by specifying 'Issue'.
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 states prerequisites ('Requires ADMIN role and prior approval'), implying the workflow sequence with 'request_approval'. It also flags 'Risk level: high' to guide cautious usage. However, it lacks explicit guidance on choosing between this and 'add_ssh_key' for different authentication scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_background_jobsA
List all background jobs (running + completed).
Risk level: low (read-only).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries full burden of safety disclosure. It explicitly states 'Risk level: low (read-only)' and clarifies the scope includes both running and completed jobs. Output schema exists per context signals, so return format explanation is not required.
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?
Extremely concise two-line structure: first line states purpose, second line states risk level. Zero redundancy, front-loaded with critical information.
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?
Adequate for a zero-parameter list operation with output schema present. Covers purpose, scope, and safety profile. Minor gap: could mention pagination behavior or relationship to poll_background_job sibling.
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?
Zero parameters present (schema is empty object), establishing baseline of 4. No parameter documentation needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description provides specific verb ('List') + resource ('background jobs') + scope ('running + completed'), clearly distinguishing from sibling tools like poll_background_job or cancel_background_job.
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?
Lacks explicit when-to-use guidance versus alternatives like poll_background_job. The scope 'all' implies usage, but does not explicitly state when to prefer listing all jobs versus polling a specific job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_hostsA
List all allowed SSH hosts with metadata (labels, roles, description).
No authentication required beyond basic identity. Risk level: low.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 disclosing behavioral traits. It successfully adds critical security context: authentication level requirements and explicit 'Risk level: low' classification. It could be improved by mentioning idempotency or caching behavior, but covers the essential safety profile.
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?
Three tightly constructed sentences with zero redundancy. Purpose is front-loaded in the first sentence, followed by authentication context and risk classification. Every sentence earns its place with no 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 zero-parameter list operation with an output schema present (making return value description redundant), the description is complete. It appropriately focuses on security context (auth and risk level), which is critical for SSH infrastructure tools, rather than repeating structural information available in the schema.
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 tool has zero parameters (empty schema), which per evaluation rules establishes a baseline score of 4. No parameter documentation is required or expected in the description text.
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 specific verb 'List' with clear resource 'allowed SSH hosts' and explicitly scopes the output to 'metadata (labels, roles, description)'. This effectively distinguishes it from siblings like get_host_facts (which likely retrieves detailed facts for a specific host) and run_ssh_command (execution).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context about authentication requirements ('No authentication required beyond basic identity'), which helps the agent understand prerequisites for invocation. However, it does not explicitly name alternative tools or provide explicit when-not-to-use guidance, stopping short of a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pending_approvalsA
List all pending approval requests.
Risk level: low (read-only).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden and explicitly states 'Risk level: low (read-only)', informing the agent this is a safe operation. It could improve by mentioning pagination behavior or result limits, but adequately covers the critical safety profile.
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 with zero waste: first states the operation, second discloses risk classification. Information is front-loaded and appropriately sized for a zero-parameter 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?
Given zero parameters and existence of an output schema (per context signals), the description is complete. It covers the operation purpose and safety level without needing to document return values or complex parameter interactions.
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?
Per evaluation rules, zero parameters warrants a baseline score of 4. The description appropriately does not invent parameter semantics where none exist in the empty input 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 uses specific verb 'List' with clear resource 'pending approval requests', clearly distinguishing it from sibling tools 'approve_request' (action) and 'request_approval' (creation). The scope 'all' precisely defines the operation's breadth.
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?
While the description implies usage through clear naming (list vs approve), it lacks explicit when-to-use guidance or comparison with alternatives like 'approve_request'. The agent must infer when listing is preferable to other approval-related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesA
List all available command templates that can be used with run_ssh_command.
Each template defines a pre-approved command pattern with its allowed parameters, roles, and risk level. Use the template_id when calling run_ssh_command.
Risk level: low.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses 'Risk level: low' and explains template contents (pre-approved patterns, allowed parameters, roles), providing necessary behavioral context for a security-sensitive SSH tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with zero waste: purpose (sentence 1), template contents (sentence 2), usage instruction (sentence 3), risk disclosure (sentence 4). Well front-loaded and appropriately sized.
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?
Tool has output schema (documented separately), so return values need not be described. For a zero-parameter list operation, description adequately covers purpose, output usage (template_id), and risk profile.
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?
Zero parameters present, meeting the baseline score of 4. Schema is empty object with 100% coverage; no parameter documentation needed.
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?
Specific verb 'List' with clear resource 'command templates'. Explicitly links to sibling tool 'run_ssh_command', distinguishing it from other list operations like list_hosts or list_background_jobs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use the template_id when calling run_ssh_command', establishing the relationship with the sibling execution tool. Lacks explicit 'when not to use' exclusions, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
poll_background_jobA
Read accumulated output and status of a background job (redacted).
Returns new stdout since last poll, plus current status and exit code. Risk level: low (read-only).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and successfully discloses key behaviors: the incremental nature of returns ('new stdout since last poll'), the read-only safety profile ('Risk level: low'), and the specific return contents (stdout, status, exit code). Minor gaps remain regarding error cases or rate limits.
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?
Three sentences with zero waste. Purpose is front-loaded ('Read accumulated output...'), followed by return value specifics, then risk classification. Each sentence adds distinct value.
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?
Appropriate for a single-parameter polling tool. The description explains return values even though an output schema exists (helpful redundancy). Minor gap: does not mention that job_id typically comes from run_ssh_command_background or list_background_jobs.
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 has 0% description coverage (only title 'Job Id'). The description mentions operating on a 'background job' which implicitly maps to the job_id parameter, but does not explicitly describe the parameter semantics, format, or where to obtain valid job IDs.
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 specific action (Read) and resource (accumulated output and status of a background job). It effectively distinguishes from siblings like cancel_background_job (mutation vs read) and list_background_jobs (listing all vs polling specific job state).
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 phrase 'new stdout since last poll' implies iterative usage for monitoring, but there is no explicit guidance on when to use this versus list_background_jobs, or that it should be used repeatedly to track jobs started by run_ssh_command_background.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_ssh_keyA
Revoke / remove an SSH key by its key_id.
Requires ADMIN role and prior approval. Risk level: high.
| Name | Required | Description | Default |
|---|---|---|---|
| key_id | Yes | ||
| reason | No | ||
| approval_request_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 successfully communicates authentication requirements (ADMIN role), workflow prerequisites (prior approval), and safety profile (high risk). It omits whether the operation is reversible or if it affects existing SSH sessions.
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?
Three sentences with zero waste: action definition, permission requirements, and risk warning. Information is front-loaded with the core purpose in the first sentence.
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?
Adequate for a high-risk administrative tool given the existence of an output schema (covering return values), but gaps remain in parameter documentation. With 0% schema coverage, the description should explicitly document all three parameters and their relationships to the approval workflow.
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 0%, requiring the description to compensate. While 'key_id' is mentioned explicitly and 'prior approval' loosely implies 'approval_request_id', the 'reason' parameter is completely undocumented. The relationship between the approval workflow and the approval_request_id parameter is not explicitly stated.
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 opens with the specific action 'Revoke / remove' targeting the 'SSH key' resource, using 'key_id' as the identifier. This clearly distinguishes it from sibling tool 'add_ssh_key' and other SSH management operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States explicit prerequisites ('Requires ADMIN role and prior approval') and risk profile ('Risk level: high'), which helps determine when the tool is appropriate. However, it doesn't explicitly map the 'prior approval' requirement to the 'approval_request_id' parameter or reference sibling 'approve_request' as the prerequisite step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_approvalA
Request approval for a privileged (Tier 2) operation.
Returns a request_id and one-time approval_token. The token must be presented to the approver. The request_id is then passed to the privileged tool.
Risk level: low (creating a request is safe).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| justification | Yes | ||
| host_id | No | ||
| ticket_ref | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden. It successfully states the operation is safe (risk level: low), returns a request_id and one-time approval_token, and specifies the token presentation requirement. Could improve by mentioning expiration or who can approve, but covers core behavioral traits well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences with zero waste: purpose front-loaded, followed by return values, workflow steps, and risk assessment. Each sentence earns its place. Well-structured for quick parsing.
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 approval workflow is conceptually complete and output schema exists (reducing need for return value description). However, the complete absence of parameter documentation for 4 fields—especially 2 required ones—creates a critical gap for an agent trying to construct valid invocations.
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 0% (only titles provided). The description mentions 'Tier 2 operation' which gives semantic context to the 'action' parameter, but provides no guidance on 'justification' format, 'host_id' usage, or 'ticket_ref' purpose. With zero schema descriptions, the description fails to compensate for undocumented required parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool requests approval for 'privileged (Tier 2) operations,' using specific verb (request) and resource (approval). The 'Tier 2' qualifier and distinction from sibling 'approve_request' (via workflow description) makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Excellent workflow guidance: explains the token must be presented to an approver and request_id passed to the privileged tool. Describes the multi-step process clearly. Lacks explicit 'when not to use' or direct comparison to sibling 'approve_request,' but the flow description provides strong implicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_certA
Revoke an issued SSH certificate.
Revoked certificates are added to the revocation list and their PEM files are deleted. Requires ADMIN role and prior approval.
Risk level: high.
| Name | Required | Description | Default |
|---|---|---|---|
| cert_id | Yes | ||
| reason | No | ||
| approval_request_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses destructive effects (PEM files deleted), side effects (added to revocation list), authorization requirements (ADMIN role), and workflow constraints (prior approval). Strong coverage of 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?
Well-structured with clear paragraph breaks: action statement, side effects, requirements, and risk. Every sentence conveys distinct information (effects, auth, risk). Efficient length with no 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?
Adequate for a high-risk administrative tool with output schema present (no return value documentation needed). Covers authorization, side effects, and risk. Minor gap: could explicitly document the three parameters given 0% schema coverage.
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 has 0% description coverage. Description implies 'cert_id' through the revocation action and 'approval_request_id' through 'prior approval' mention, but does not explicitly document parameters or explain the 'reason' field. Provides baseline semantic context for the operation.
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?
Opens with specific verb+resource ('Revoke an issued SSH certificate') and distinguishes from sibling 'issue_cert'. Clearly defines scope by stating revoked certs are added to revocation list and PEM files deleted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states prerequisites ('Requires ADMIN role and prior approval') and risk context ('Risk level: high'), which guides when to invoke. Lacks explicit comparison to sibling alternatives like 'issue_cert' or 'remove_ssh_key'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_ssh_commandA
Execute a pre-approved command template on a target host.
Use list_templates to discover available template_ids. Examples:
disk_usage: run df -h (no params needed)
service_status: check a systemd service (params: {"service": "docker"})
list_processes: show top processes by memory (no params needed)
tail_log: tail a log file (params: {"lines": "100", "log_path": "/var/log/syslog"})
Only commands from the template registry are allowed. Parameters are validated against per-template regex rules. Output is automatically redacted for secrets.
Pass session_id from ssh_connect to reuse a persistent connection.
Risk level: medium (requires user confirmation in VS Code).
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes | ||
| template_id | Yes | ||
| params | No | ||
| session_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure burden and succeeds admirably. It discloses validation behavior ('validated against per-template regex rules'), security processing ('Output is automatically redacted for secrets'), safety requirements ('requires user confirmation in VS Code'), and connection state management ('reuse a persistent connection').
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?
Information density is high with zero waste. The structure flows logically: purpose → prerequisite → concrete examples → constraints → validation → security → optimization → risk. Every sentence provides unique value not available in the schema, and the examples efficiently illustrate parameter patterns for the polymorphic 'params' field.
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 complex operation involving SSH execution, template registries, dynamic parameters, and security redaction, the description is remarkably complete despite zero schema annotations. It covers discovery workflows, security constraints, output processing, and connection reuse patterns. Since an output schema exists, the description appropriately omits return value details.
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?
Given 0% schema description coverage (only titles like 'Host Id'), the description fully compensates by explaining all four parameters through context and examples. It illustrates 'params' structure with concrete JSON examples (e.g., {"service": "docker"}), explains 'session_id' sourcing from ssh_connect, and clarifies 'template_id' discovery via list_templates.
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 opens with a precise action ('Execute a pre-approved command template') and clearly identifies the target resource ('target host'). It effectively distinguishes this tool from arbitrary command execution tools by emphasizing the 'pre-approved' constraint and template registry requirement, setting clear boundaries against siblings like direct SSH tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit workflow guidance by directing users to 'Use list_templates to discover available template_ids' and referencing 'ssh_connect' for obtaining session_id. While it establishes the prerequisite chain clearly, it does not explicitly contrast with 'run_ssh_command_background' to guide when to use foreground versus background execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_ssh_command_backgroundA
Start a template command in the background (non-blocking).
Returns a job_id immediately. Use poll_background_job to read output, list_background_jobs to see all jobs, or cancel_background_job to stop.
Same template-only security model as run_ssh_command. Risk level: medium (requires user confirmation).
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes | ||
| template_id | Yes | ||
| params | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses non-blocking behavior, immediate return of job_id, security model (template-only), and risk level (medium, requires confirmation). Could improve by mentioning job persistence or timeout 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?
Five sentences, each earning its place: purpose, return value, workflow tools, security context, and risk level. Front-loaded with the core action and efficiently structured.
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?
Has output schema (per context signals), so omitting detailed return value explanation is acceptable. However, with 3 parameters at 0% schema coverage and only 'template' mentioned in description, the parameter documentation is incomplete for a tool of this 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?
Schema has 0% description coverage. Description mentions 'template command' implying template_id's purpose, but fails to explain host_id (hostname vs UUID?) or params structure (key-value substitutions?). With zero schema coverage, the description must compensate more for the three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific action (Start), resource (template command), and key behavioral trait (non-blocking/background). Distinguishes from sibling 'run_ssh_command' by emphasizing the async nature and immediate job_id return.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names three related tools for the job lifecycle workflow: 'poll_background_job to read output', 'list_background_jobs to see all jobs', and 'cancel_background_job to stop'. Also references sibling 'run_ssh_command' for security model comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sftp_deleteA
Delete a remote file via SFTP.
Only files within allowed_paths can be deleted. Blocked extensions are enforced. Requires a justification. Risk level: medium (requires user confirmation).
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes | ||
| remote_path | Yes | ||
| justification | No | ||
| session_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and discloses critical behavioral traits: scope constraints (allowed_paths), validation rules (blocked extensions), prerequisites (justification required), and risk profile (medium risk requiring user confirmation).
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?
Excellent structure: single sentence stating purpose followed by bullet-like constraints. Every line provides essential safety or constraint information. No redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive operation with 4 parameters and an output schema, the description adequately covers safety-critical aspects (constraints, risk, confirmation requirements). Missing explicit parameter semantics, but the output schema handles return values.
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 has 0% description coverage. The description mentions 'Requires a justification' which maps to the justification parameter, but provides no semantics for host_id, remote_path (format/path rules), or session_id (when to use optional session vs new connection).
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 specific action (Delete), resource (remote file), and method (via SFTP). It effectively distinguishes from siblings like sftp_list_directory, transfer_file, and run_ssh_command by specifying the exact operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear constraints on usage (allowed_paths only, blocked extensions enforced, justification required) and risk level (medium). However, it does not explicitly name alternatives or state when to prefer run_ssh_command for deletion instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sftp_list_directoryA
List files and directories at a remote path.
Only paths within the configured allowed_paths are accessible. Risk level: low (read-only).
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes | ||
| remote_path | Yes | ||
| session_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and successfully discloses 'Risk level: low (read-only)' and the allowed_paths access restriction. However, it omits error behavior for invalid paths or connection failures.
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?
Three sentences efficiently convey the core action, access constraints, and safety profile without redundancy. The most critical information ('List files...') is front-loaded.
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 presence of an output schema, the description appropriately omits return value details. However, with zero parameter schema coverage and no mention of the authentication/connection model (host_id/session_id relationship), the description leaves significant gaps for a 3-parameter 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 0%, requiring the description to compensate. While 'remote path' maps to the remote_path parameter, the description fails to explain host_id (likely referencing list_hosts) or session_id (optional connection reuse), leaving two of three parameters undocumented.
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 opens with a specific verb ('List') and clear resource ('files and directories at a remote path'), immediately distinguishing it from sibling tools like sftp_delete, transfer_file, and run_ssh_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 description provides the important constraint 'Only paths within the configured allowed_paths are accessible,' which defines operational boundaries, but lacks explicit when-to-use guidance or comparisons to alternatives like transfer_file or sftp_delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_connectA
Open a persistent SSH session to a host.
Returns a session_id that can be passed to run_ssh_command and transfer_file to reuse the connection. Sessions have keepalive probes and auto-close after idle timeout.
Risk level: low.
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Discloses key behavioral traits: keepalive probes, auto-close after idle timeout, return value semantics (session_id), and security posture ('Risk level: low'). Does not cover authentication requirements or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with zero redundancy. Front-loaded with purpose ('Open...'), followed by return value, lifecycle behavior, and risk level. Every sentence 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?
Appropriate for tool complexity (single parameter, output schema exists). Covers connection lifecycle management and integration points with sibling tools. Could mention authentication prerequisites given SSH context, but acceptable without.
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 has 0% description coverage for the single 'host_id' parameter. Description mentions 'to a host' but fails to specify what host_id represents (IP address, hostname, or reference from list_hosts?), acceptable formats, or constraints. Insufficient compensation for schema gap.
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?
Specific verb ('Open') + resource ('persistent SSH session') + scope ('to a host'). Explicitly distinguishes from sibling tools by stating it returns a session_id for 'run_ssh_command' and 'transfer_file', establishing the persistent vs. one-off usage pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance by naming specific sibling tools (run_ssh_command, transfer_file) that consume the output. Mentions 'reuse the connection' implying when to choose this over stateless alternatives. Lacks explicit 'when not to use' exclusions (e.g., short-lived commands).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_disconnectB
Close a persistent SSH session.
Risk level: low.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but only adds 'Risk level: low'. It fails to disclose whether the close is graceful, what happens to running commands, or what the output schema contains (despite output schema existing).
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?
Extremely concise with only two sentences. Front-loaded with the core action. The risk level statement earns its place as the only behavioral hint provided.
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 annotations, zero schema coverage, and the existence of an output schema, the description is too sparse. It should explain the session_id parameter and ideally reference the return value or success confirmation.
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 has 0% description coverage, yet the description does not compensate by explaining the session_id parameter, its format, or how to obtain it (e.g., from ssh_connect or ssh_list_sessions).
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 ('Close') and resource ('persistent SSH session'), clearly distinguishing it from siblings like ssh_connect, ssh_list_sessions, and run_ssh_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?
Provides no explicit 'when to use' guidance or workflow context (e.g., 'use when finished with a session'), though the purpose implies cleanup. Does not mention prerequisites like requiring an existing session from ssh_connect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_list_sessionsA
List all active SSH sessions and remaining connection slots.
Risk level: low.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It adds valuable safety context ('Risk level: low') and resource constraints ('remaining connection slots'), but omits other behavioral details like real-time vs cached data, rate limits, or authentication requirements.
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 appropriately brief and front-loaded with the core action. The two-line structure separates functionality from risk assessment efficiently. No sentences are wasted, though the risk level could potentially be conveyed in a single sentence with the main description.
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 output schema exists, the description appropriately omits return value details. However, for a tool with many SSH-related siblings, it could better contextualize when to inspect sessions versus taking action. The mention of connection slots is a good domain-specific addition.
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 tool has zero parameters with 100% schema description coverage (vacuously). Per scoring guidelines, this warrants a baseline score of 4. The description correctly does not invent parameters where none exist.
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') with a clear resource ('active SSH sessions') and adds scope detail ('remaining connection slots'). It clearly distinguishes this from siblings like ssh_connect, run_ssh_command, and ssh_disconnect by positioning it as a passive inspection/monitoring tool.
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 through the action (listing sessions suggests monitoring or capacity checking), but provides no explicit when-to-use guidance, prerequisites, or alternatives. It does not mention, for example, to use this before ssh_connect to verify available slots.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ssh_session_pingA
Health-check a persistent SSH session.
Returns liveness, idle time, and uptime. Risk level: low.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 successfully adds 'Risk level: low' (safety context) and specifies return values ('liveness, idle time, and uptime'), providing crucial behavioral context beyond the schema. It could be improved by mentioning whether this operation affects session state (e.g., resets idle time) or has side effects.
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?
Every sentence earns its place: the first states purpose, the second describes returns, and the third provides safety context. The description is appropriately front-loaded with the core action and contains no redundant or wasted text despite being only three lines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter health check tool with an output schema (reducing the need for detailed return documentation), the description is minimally adequate. It covers risk and return semantics but leaves the critical session_id parameter undocumented. Given the tool's simplicity, this is sufficient for basic usage but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate by explaining the session_id parameter. It fails to do so, providing no information about what constitutes a valid session ID, where to obtain it (likely from ssh_list_sessions), or its format. While the parameter name is somewhat self-explanatory, the lack of any documentation for the sole required parameter is a significant gap.
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 ('Health-check') and resource ('persistent SSH session') that clearly distinguishes this from sibling tools like ssh_connect, run_ssh_command, or ssh_list_sessions. It precisely defines the tool's scope as monitoring existing sessions rather than creating or using them.
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 term 'Health-check' implies usage for verifying existing session status, providing implicit context for when to use it (before relying on a session). However, it lacks explicit guidance on when to prefer this over ssh_list_sessions or what to do if the health check fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_fileA
Upload or download a file to/from a remote host.
Enforces path policy, blocked extensions, and size limits. Downloads require a justification string. For uploads, provide local_path (the file to upload).
Pass session_id from ssh_connect to reuse a persistent connection.
Risk level: medium-high (requires user confirmation).
| Name | Required | Description | Default |
|---|---|---|---|
| host_id | Yes | ||
| direction | Yes | ||
| remote_path | Yes | ||
| local_path | No | ||
| justification | No | ||
| session_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, description carries full burden and discloses critical constraints: 'Enforces path policy, blocked extensions, and size limits' and 'Risk level: medium-high (requires user confirmation).' Could improve by noting whether transfers are atomic or overwrite 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?
Six sentences with zero waste. Logical progression from purpose → constraints → conditional requirements → prerequisites → risk classification. Front-loaded with core functionality.
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 6 parameters with 0% schema coverage and existence of output schema (covering return values), the description successfully documents behavioral constraints, security policies, and parameter interdependencies. Minor gap: does not enumerate direction values (upload/download).
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?
Excellent compensation for 0% schema description coverage. Explains semantics of justification (required for downloads), local_path (source for uploads), session_id (reuse persistent connection), and implies direction values. Missing explicit description of host_id format and remote_path semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with specific verbs ('Upload or download') and clear resource ('file'), immediately distinguishing it from sibling command execution tools (run_ssh_command) and connection management (ssh_connect). The bidirectional nature is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides strong conditional guidance: 'Downloads require a justification string' and 'For uploads, provide local_path.' Explicitly references prerequisite sibling tool ssh_connect for session_id. Lacks explicit contrast with sftp_delete for deletion scenarios.
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. Dates show when Glama detected each change.
23 tool updates
v0.1.4- First observed
add_ssh_key - First observed
approve_request - First observed
cancel_background_job - First observed
get_audit_logs - First observed
get_host_facts - First observed
issue_cert - First observed
list_background_jobs - First observed
list_hosts - First observed
list_pending_approvals - First observed
list_templates - First observed
poll_background_job - First observed
remove_ssh_key - First observed
request_approval - First observed
revoke_cert - First observed
run_ssh_command - First observed
run_ssh_command_background - First observed
sftp_delete - First observed
sftp_list_directory - First observed
ssh_connect - First observed
ssh_disconnect - First observed
ssh_list_sessions - First observed
ssh_session_ping - First observed
transfer_file
TDQS
Tools are generally well-differentiated by resource and action (e.g., request_approval vs approve_request vs list_pending_approvals form a clear workflow). However, with 23 granular tools, some operational overlap exists between transfer_file and sftp_* operations, and the background job suite requires careful reading to distinguish from standard command execution.
While all tools use snake_case with clear verbs, the prefix conventions are inconsistent: SSH session tools use ssh_* (ssh_connect, ssh_list_sessions) but host operations use bare verbs (list_hosts, get_host_facts); SFTP operations use sftp_* while file transfer uses unprefixed transfer_file. This mixed convention forces agents to read carefully.
At 23 tools, this falls into the borderline-heavy range (16-25). While the server covers a complex domain (governed SSH access with approval workflows, background jobs, and certificate management), the surface feels granular—session management alone uses four distinct tools, suggesting potential for consolidation (e.g., combining list/poll/cancel into a job management tool).
Core workflows for approvals, background jobs, and sessions are complete, but notable gaps exist: there are tools to add/remove SSH keys and issue/revoke certificates, but no corresponding list_ssh_keys or list_certs to inspect current state. Similarly, SFTP supports delete and list but lacks explicit upload/download (relying on the separate transfer_file tool).
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
The OpenRouter MCP server plugs OpenRouter into the AI tools you already use. Once connected, your assistant can pull live OpenRouter data (models, prices, your credits, rankings, and docs) and send quick test messages, all without leaving your editor.
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
- emisarOAuthdev.emisar
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn SSH MCP server that enables users to connect to and manage remote servers directly from Claude Code. It provides tools to execute commands, monitor connection status, and dynamically manage server configurations through natural language.10386MIT
- AlicenseAqualityDmaintenanceMCP server for remote Linux/Unix server management via SSH, enabling command execution, system monitoring, file operations, and diagnostics through natural language.341MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol (MCP) SSH client server that provides autonomous SSH operations for GitHub Copilot and VS Code. Enable natural language SSH automation without manual prompts or GUI interactions.201MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for remote Linux server administration via SSH, integrating with Claude Code to manage Ubuntu/Debian servers.2-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bhayanak/ssh-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server