servidor-mcp
Provides Docker visibility on remote servers through system status and container log inspection, allowing AI agents to check Docker containers and logs alongside other server state.
Enables AI agents to work on remote Linux servers over SSH, providing tools for system status, service and system logs, file reading/writing, and shell command execution.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@servidor-mcprevisa el estado del servidor dev y dime si hay servicios caídos"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
servidor-mcp
Servidor MCP para que las IAs (Claude Code, Claude Desktop, Cursor, VS Code…) trabajen en tus servidores Linux por SSH, sin darles tu contraseña y sin instalar nada en el servidor.
Tú: srv-mcp on dev → escribes la contraseña → sesión SSH abierta (8h)
IA: ejecutar_comando(...) → usa esa sesión abierta, sin contraseña
Tú: srv-mcp off dev → la IA pierde el acceso al instanteHerramientas que recibe la IA
Herramienta | Qué hace |
| Servidores registrados y si su sesión está abierta |
| Carga, memoria, disco, top procesos, servicios caídos, Docker |
| journalctl de un servicio, |
| Primeras o últimas N líneas de un archivo |
| Crea/reemplaza un archivo, con respaldo |
| Cualquier comando de shell (no interactivo) |
Cada llamada aparece en tu cliente de IA con el comando exacto, y queda en la bitácora
~/.srv-mcp/logs/<servidor>.log (srv-mcp log <servidor>).
Related MCP server: ssh-pro-mcp
Antes de empezar (lo hace el administrador de los servidores)
Crear un usuario SSH propio para cada persona en cada servidor (no compartan usuarios: así la bitácora y los permisos son de cada quien y se puede revocar a uno sin afectar a otros).
Opcional, para que pueda leer logs de servicios (
journalctl), en cada servidor:sudo usermod -aG systemd-journal <usuario>
Guía paso a paso (cada persona, en su Mac o Linux)
Requisitos: Python 3.11+, OpenSSH y git. Los comandos funcionan desde cualquier carpeta.
1. Instalar
Opción A: plugin de Claude Code (recomendada). Dentro de Claude Code:
/plugin install servidor-mcp --marketplace Daniel-Riv/servidor-mcpEn versiones anteriores a 2.1.275, en dos pasos:
/plugin marketplace add Daniel-Riv/servidor-mcp y luego
/plugin install servidor-mcp@servidor-mcp.
O desde la terminal (sirve también si usas la app de escritorio):
claude plugin marketplace add Daniel-Riv/servidor-mcpclaude plugin install servidor-mcp@servidor-mcpAbre una sesión nueva: al iniciar, el plugin prepara Python solo (unos segundos la
primera vez). Para tener el comando srv-mcp en tu terminal, crea el atajo una vez:
mkdir -p ~/bin && ln -sf ~/.claude/plugins/data/servidor-mcp-servidor-mcp/srv-mcp ~/bin/srv-mcp(si ~/bin no está en tu PATH: echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zshrc).
El comando en Claude es /servidor-mcp:access-server. Se actualiza con
/plugin update servidor-mcp.
Opción B: clonar el repo (sin plugins, o para usar el MCP con otras IAs):
git clone https://github.com/Daniel-Riv/servidor-mcp.git ~/servidor-mcp && ~/servidor-mcp/instalar.shEl instalador crea .venv con las dependencias, deja el comando srv-mcp en ~/bin
(y lo agrega al PATH) e instala la skill como /access-server.
No uses las dos opciones a la vez (tendrías la skill duplicada). Abre una terminal
nueva al terminar. Comprueba con srv-mcp: debe mostrar la ayuda.
2. Registrar cada servidor
srv-mcp setupHace estas preguntas (escribe la respuesta y Enter):
Pregunta | Qué responder |
Nombre corto | Un alias sin espacios, ej. |
IP o dominio | La dirección del servidor |
Usuario SSH | Tu usuario en ese servidor |
Puerto SSH | Enter si es 22 |
¿Se entra pasando por otro servidor? | Enter si entras directo desde tu Mac. Si primero hay que entrar a otro servidor, escribe el alias de ese (debe estar registrado antes) |
¿Solo lectura? |
|
Ejemplo con un servidor principal y dos máquinas internas (dev y prod) a las que se llega desde él:
Tu Mac ──▶ principal (IP pública) ──▶ dev (IP interna)
└──▶ prod (IP interna)Servidor | IP | ¿Pasando por otro? | ¿Solo lectura? |
| IP pública | Enter (directo) |
|
| IP interna |
|
|
| IP interna |
|
|
Registra primero el principal, luego los demás. Revisa con srv-mcp list.
3. Abrir la sesión
srv-mcp on devLa primera vez pregunta
Are you sure you want to continue connecting (yes/no)?→yes.Pide tu contraseña. Mientras la escribes no se ve nada, es normal; Enter al final.
Si el servidor pasa por otro, pide primero la contraseña de ese (si no estaba abierto).
La sesión dura 8 horas.
srv-mcp statusmuestra cuáles están abiertas (●).
Comprueba que funciona sin pedir contraseña:
srv-mcp run dev "hostname && uptime"4. Usarlo con Claude Code
En una sesión nueva de Claude:
/servidor-mcp:access-server revisa el estado de dev(Con la opción B el comando es /access-server.) Claude solo toca servidores cuando
escribes ese comando. Cada comando te lo muestra
antes de ejecutarlo; los cambios los consulta primero. Al terminar:
srv-mcp log dev # qué ejecutó la IA
srv-mcp off dev # cortar el accesoActualizar
cd ~/servidor-mcp && git pull && ./instalar.shProblemas comunes
Síntoma | Causa y solución |
| La terminal se abrió antes de instalar. Abre una nueva (o usa |
| La sesión no está abierta o expiró: |
| Ese alias no existe; revisa |
| Está esperando tu respuesta: escríbela en la terminal y Enter. |
| Tu usuario no está en el grupo |
La IA dice "está en modo 'lectura'" | Ese servidor es solo lectura; se cambia en |
El comando no aparece en Claude | Abre una sesión nueva. Plugin: revisa que esté activo en |
| Plugin: abre una sesión nueva para que se prepare (necesita Python 3.11+). Opción B: corre |
| No es interactivo: corre ese comando tú mismo, o configura |
Otras IAs (Claude Desktop, Cursor…): servidor MCP
La skill usa srv-mcp run/estado/logs/leer/escribir, con las mismas
reglas y bitácora que el servidor MCP. Si prefieres que Claude Code pueda usarlo sin /,
instala con ./instalar.sh --mcp.
Para otros clientes, el comando del servidor es la ruta absoluta a .venv/bin/servidor-mcp.
En el archivo de configuración MCP del cliente:
{
"mcpServers": {
"servidor": { "command": "/ruta/a/servidor-mcp/.venv/bin/servidor-mcp" }
}
}Claude Desktop:
~/Library/Application Support/Claude/claude_desktop_config.jsonCursor:
~/.cursor/mcp.json
Referencia de comandos
srv-mcp setup # registrar un servidor
srv-mcp list # servidores registrados
srv-mcp on <servidor> # abrir sesión (pide contraseña)
srv-mcp status # qué sesiones están abiertas
srv-mcp log <servidor> # qué ejecutaron las IAs
srv-mcp off <servidor> # cerrar sesión
srv-mcp run <servidor> "comando" # ejecutar a mano con las mismas reglasPara quitar un servidor, borra su bloque (# srv-mcp: <alias> … # srv-mcp: fin <alias>)
de ~/.ssh/config y su sección en ~/.srv-mcp/config.toml, si tiene.
Permisos (~/.srv-mcp/config.toml)
Por defecto todo está permitido. Cada usuario lo cambia en su archivo (ver config.ejemplo.toml):
modo = "lectura" # "completo" (defecto) o "lectura"
bloqueados = ['\breboot\b', 'rm -rf'] # regex que se rechazan siempre
timeout = 120 # segundos por comando
[servidores."prod"] # ajustes por servidor (setup lo crea si eliges solo lectura)
modo = "lectura"
bloqueados = ['virsh destroy']Los cambios aplican en la siguiente llamada; no hay que reiniciar nada.
El modo "lectura" rechaza comandos que parecen modificar el servidor (rm, mv,
systemctl restart, apt install, docker stop/rm/down, redirecciones >…). Es una
red de seguridad contra errores de la IA, no un límite de seguridad. El límite real es
el usuario SSH: para acceso realmente restringido, crea en el servidor un usuario sin
sudo y regístralo con srv-mcp setup.
Seguridad
La contraseña solo la escribes tú en tu terminal; queda un socket local en
~/.ssh/cm/que solo tu usuario del Mac puede usar.Solo se aceptan servidores registrados con
srv-mcp setup.Mientras la sesión esté abierta, la IA puede hacer lo que tu usuario SSH pueda hacer. Ciérrala con
srv-mcp offal terminar.sudocon contraseña no funciona (no es interactivo). Para permitir comandos concretos, configuraNOPASSWDsolo para ellos en el servidor.
Desarrollo
.venv/bin/pip install -e ".[dev]" && .venv/bin/pytestLas pruebas usan un ssh falso (tests/fake_ssh) que ejecuta en local.
Available Tools
6 toolsejecutar_comandoADestructive
Ejecuta un comando de shell en el servidor y devuelve código de salida, stdout y stderr.
No es interactivo: comandos que piden datos (contraseñas, confirmaciones, editores) fallan o se cancelan al agotar el tiempo. Usa flags como -y o --no-pager.
| Name | Required | Description | Default |
|---|---|---|---|
| comando | Yes | ||
| servidor | Yes | ||
| timeout_segundos | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the risk profile is known. The description adds genuinely non-obvious behavior: it will hang or fail on any prompt for input and hit the timeout. It still doesn't mention privilege level of the remote shell or that output of destructive commands is unrecoverable.
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?
Front-loaded with purpose and return values, then a short second paragraph for the non-interactive caveat. Two sentences plus one, every one earning 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?
An output schema exists, so return values are covered structurally. But for a destructive open-world tool with 0% parameter coverage, the description leaves meaningful gaps: the timeout parameter is unexplained and there is no signal about the privileges the remote command runs with.
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% — none of the three parameters is documented anywhere. The description only obliquely references 'el servidor' and says nothing about timeout_segundos, which is exactly the parameter most relevant to the timeout behavior it describes. Given the coverage gap, the description needed to compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Ejecuta un comando de shell en el servidor") and even names the return payload (exit code, stdout, stderr). It never positions itself against the more specific siblings (leer_archivo, ver_logs, estado_sistema), so the agent must infer that this is the generic escape hatch.
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?
Gives operational guidance (must be non-interactive, use -y/--no-pager) but no selection guidance: nothing says when to prefer this over escribir_archivo or ver_logs, or when it should be avoided. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
escribir_archivoADestructive
Crea o reemplaza un archivo de texto en el servidor.
Si el archivo existe y respaldo=True, primero lo copia a .bak.. No usa sudo: solo funciona en rutas donde el usuario SSH puede escribir.
| Name | Required | Description | Default |
|---|---|---|---|
| ruta | Yes | ||
| respaldo | No | ||
| servidor | Yes | ||
| contenido | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is known. The description adds real context beyond that: existing files are replaced, a backup named '<ruta>.bak.<fecha>' is made when respaldo=True, and writes require SSH-user permissions because sudo is not used. It does not explicitly warn that respaldo=False makes the overwrite irreversible.
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 short lines, front-loaded with the core action, followed by the backup condition and the permission constraint. No filler sentences; each line adds operational 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?
For a destructive file-write tool with annotations and an output schema present, the description covers the key operational facts: overwrite semantics, backup behavior, and permission requirements. The main gaps are the meaning/format of 'servidor' and any encoding or size notes for 'contenido'.
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%, so the description must carry parameter meaning. It does well for 'respaldo' (default true, backup naming convention) and implies 'ruta' is the target path, but 'servidor' and 'contenido' are left unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Crea o reemplaza un archivo de texto en el servidor.' That clearly distinguishes it from the read-oriented siblings like leer_archivo and listar_servidores. It stops short of naming a sibling or clarifying boundaries against ejecutar_comando, which could also write files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The conditional 'Si el archivo existe y respaldo=True' gives a concrete behavioral rule for the backup path, and the sudo note implies a permission prerequisite. But there is no explicit when-to-use vs. alternatives guidance, such as when to prefer ejecutar_comando or leer_archivo first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estado_sistemaBRead-only
Resumen de salud: uptime/carga, memoria, disco, procesos que más consumen, servicios systemd caídos y contenedores Docker.
| Name | Required | Description | Default |
|---|---|---|---|
| servidor | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the breadth of collection (systemd + Docker + process sampling), which hints at a potentially slow aggregation call, but it never says so outright, nor does it mention auth or failure behavior for unreachable hosts.
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?
One dense sentence that front-loads the purpose ('Resumen de salud') and then lists payload contents; nothing is redundant. The comma-spliced list is slightly harder to scan than a structured breakdown but wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and annotations cover the read-only profile. What remains missing is the only input parameter's semantics and any note about cost/latency of a multi-subsystem probe — a real gap for a one-required-param tool with 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% and the single required parameter 'servidor' is documented nowhere — the schema only carries the title 'Servidor'. The description never mentions the parameter, so an agent gets no help on expected format (hostname vs. IP vs. alias from listar_servidores) for the one input it must supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (health summary) and enumerates exactly what is gathered: uptime/load, memory, disk, top processes, failed systemd services and Docker containers. That inventory distinguishes it well from siblings like ver_logs or leer_archivo, though it never names an alternative explicitly.
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 enumerated data categories imply the use case (a diagnostic snapshot of a machine), but there is no explicit 'use this when…' statement, no exclusion of when to prefer ver_logs or ejecutar_comando, and no prerequisites such as needing a reachable server.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leer_archivoBRead-only
Lee un archivo de texto del servidor (las primeras o últimas N líneas).
| Name | Required | Description | Default |
|---|---|---|---|
| ruta | Yes | ||
| lineas | No | ||
| servidor | Yes | ||
| desde_el_final | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the meaningful behavioral detail that reads are truncated to a first-or-last N-line window rather than returning the whole file. It does not mention behavior on a missing/unreadable path, encoding, or size limits, so it is additive but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler and the key scoping detail in parentheses. It is efficient, though the extreme brevity shifts work into the undocumented parameters rather than being optimally sized for a 4-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?
An output schema exists, so return values need no explanation, and annotations cover safety and open-world behavior. Still, for a tool with 4 parameters at 0% schema coverage and a crowded sibling set (ver_logs, ejecutar_comando), the description lacks the routing guidance and parameter semantics an agent needs to call it correctly the first time.
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%, so the description carries the full explanatory burden, and it does map conceptually onto all four parameters (servidor, ruta, lineas as N, desde_el_final as first-vs-last). However, it adds nothing about path format (absolute vs relative), what a valid servidor identifier looks like, or that lineas affects how desde_el_final behaves, leaving gaps the agent must infer.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Lee un archivo de texto del servidor") plus a clear scope qualifier ("las primeras o últimas N líneas"), so an agent knows exactly what operation this performs. It does not name or differentiate itself from siblings such as ver_logs, which is the closest ambiguity in the set.
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 contains no when-to-use or when-not-to-use guidance; nothing tells the agent to prefer leer_archivo over ver_logs or ejecutar_comando for inspecting remote content. The only usable cue is the implicit read-only nature of the operation, which the annotations already state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
listar_servidoresARead-only
Lista los servidores registrados y si su sesión SSH está abierta.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds the useful behavioral detail that it reports live SSH session state, but says nothing about whether it actively probes each server, latency, or permission requirements for a network-touching (openWorld) read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste that names both the resource and the key returned signal. Nothing to trim and nothing buried.
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?
An output schema exists, so return-value explanation is not required, and with zero parameters and clear read-only annotations the description is nearly sufficient. The only missing piece is a hint about when to reach for this versus estado_sistema, which is minor for such a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description correctly implies no input is needed to obtain the server list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Lista los servidores registrados") and adds the returned attribute (whether the SSH session is open). This is clearly a discovery/enumeration tool, distinguishable from execution siblings like ejecutar_comando or escribir_archivo, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use, when-not-to-use, or prerequisite guidance is given. The usage is only implied by the purpose: an agent would infer it should call this first to discover available servers before invoking ejecutar_comando. The routing is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ver_logsBRead-only
Últimas líneas de logs.
tipo: "servicio" (unidad systemd, ej. nginx), "docker" (nombre del contenedor), "archivo" (ruta, ej. /var/log/nginx/error.log) o "sistema" (journal completo). filtro: texto o regex para grep -iE. desde: solo para servicio/sistema/docker, ej. "1 hour ago" o "2026-10-28 08:00" (docker usa formato como "1h").
| Name | Required | Description | Default |
|---|---|---|---|
| tipo | Yes | ||
| desde | No | ||
| filtro | No | ||
| lineas | No | ||
| nombre | No | ||
| servidor | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, open-world profile, and the description adds non-obvious behavior: filtro is applied as grep -iE, and the time format differs per tipo (docker wants "1h" while others accept "1 hour ago" or a timestamp). It does not say what happens with an invalid nombre or whether lineas truncates output, so it stops short of full disclosure.
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?
Purpose is front-loaded in one line, followed by compact per-parameter notes with no filler. The only structural weakness is that the tipo notes and the target-name examples are merged into one line, which is where the ambiguity comes from.
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 6-parameter tool with a required "nombre"/"servidor" pair and zero schema descriptions, the definition leaves too much unsaid. The output schema excuses it from explaining return values and annotations cover safety, but the missing meaning of nombre, lineas and servidor is a genuine gap.
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%, so the description carries the whole burden, and it only documents tipo, filtro and desde. Worse, it attaches the unit/container/path examples (nginx, /var/log/nginx/error.log) to "tipo", which is an enum — it never explains that those values belong in the required "nombre" parameter. "lineas" and "servidor" are left entirely undefined, inviting a malformed call.
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?
"Últimas líneas de logs" states a concrete verb+resource (tail recent log lines) and the tipo enumeration makes the scope of log sources explicit. It is distinguishable from siblings like leer_archivo or estado_sistema, though it never names those alternatives directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful per-tipo guidance and correctly restricts "desde" to servicio/sistema/docker (implying archivo ignores it), which is real usage guidance. However, it never says when to prefer this over leer_archivo or estado_sistema, nor does it state preconditions such as the server needing to be reachable.
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.
6 tool updates
v0.2.0- First observed
ejecutar_comando - First observed
escribir_archivo - First observed
estado_sistema - First observed
leer_archivo - First observed
listar_servidores - First observed
ver_logs
TDQS
Scored across 6 tools
Each tool targets a distinct operation (listing servers, running commands, health summary, logs, file read, file write) and the boundaries are explained in the descriptions. There is some functional overlap, since ejecutar_comando could technically do log tailing or file reads, but the specialized tools exist as safer/easier conveniences and are clearly named.
Names follow a Spanish verb_noun pattern consistently (listar_servidores, ejecutar_comando, ver_logs, leer_archivo, escribir_archivo), with snake_case throughout. The one deviation is estado_sistema, which is a noun phrase rather than verb_noun, but it remains readable and predictable.
Six tools is a well-scoped set for remote server administration: connectivity, command execution, health overview, logs, and file read/write. No tool feels redundant or gratuitous.
The core lifecycle for operating a remote server is covered: discover servers, run commands, inspect health and logs, read and write files. The main gap is the lack of a directory-listing or file-transfer operation, so agents must guess paths or fall back to ejecutar_comando with ls/cat, which is a workable but indirect path.
Maintenance
Related MCP Connectors
- emisarOAuthdev.emisar
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Scoped, audited SSH exec, sessions, and SFTP on your saved servers without exposing credentials
Linux VMs for AI agents: create VMs, run commands, edit files and open preview URLs.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI assistants to securely execute remote SSH commands, perform file transfers, and monitor system status through a standardized interface. It features robust security controls including command whitelisting, blacklisting, and credential isolation to prevent unauthorized operations.1011 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage remote servers via SSH, including command execution, multi-host batch operations, SFTP file transfer, background job handling, DevOps diagnostics, port tunneling, and safety guardrails like high-risk command blocking and read-only mode.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to securely connect to and manage remote servers via SSH, with tools for running commands, file operations, log inspection, service management, and system monitoring under configurable access controls and audit logging.125 npm1MIT
- FlicenseNot gradedqualityAmaintenanceEnables AI-controlled administration of remote Linux hosts and containers, including bounded shell execution, persistent PTY sessions, durable jobs/tasks, hardened filesystem access, process/service control, and resumable transfers.-