network-terminal-mcp
Enables persistent interactive terminal sessions with Cisco IOS/IOS-XE network devices, including older 29xx/35xx hardware, over SSH, Telnet, TCP console, or local serial. Supports running commands, using CLI context help, and nested SSH/Telnet within the same session.
Enables persistent interactive terminal sessions with Huawei VRP devices and Huawei OLT platforms over SSH, Telnet, TCP console, or local serial. Allows command execution and nested session interactions without one-off scripts.
Enables persistent interactive terminal sessions with MikroTik RouterOS devices over standard SSH, allowing CLI command execution and session interaction through the MCP server.
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., "@network-terminal-mcpopen SSH session to 10.0.0.1 and run show ip interface brief"
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.
network-terminal-mcp
Локальный MCP-сервер для постоянных интерактивных сессий с сетевым
оборудованием. Проект даёт OpenCode сырой терминал: подключиться к устройству,
использовать контекстную подсказку ?, выполнить несколько команд, при
необходимости зайти вторым ssh/telnet внутрь той же сессии и получить полный
вывод без временных sshpass-команд и одноразовых скриптов.
Статус: v0.1.0 — этапы 1-9 реализованы. Сессия — это один постоянный терминальный stream
(SSH, Telnet, TCP console или локальный serial /dev/tty*); модель пишет в него
точно то, что нужно, включая вложенные переходы, и читает вывод без требования
определённой формы prompt. Для первого подключения поддерживаются direct, один
локальный SOCKS5 hop и один SSH ProxyJump hop; nested-маршрутов и
командно-ориентированных инструментов больше нет. Секреты, запрашиваемые уже
внутри сессии, вводятся через terminal_write_secret со ссылкой на pass и не
попадают в audit. Один процесс держит несколько независимых сессий.
Подключение описывает модель в самом вызове open_session: host, protocol,
credentials (ссылки pass/key file или plaintext за флагом), route
(direct/socks/proxyjump), host key policy, serial-параметры и legacy-алгоритмы.
Инвентаря и profile-конфигов больше нет — после установки достаточно открыть
сессию. Единственный необязательный локальный файл — policy.yml (posture и
лимиты). Проверено на живом оборудовании: direct SSH на Cisco IOS, SNR
old/eNOS, D-Link, Huawei VRP и Junos; ProxyJump через реальные bastion.
Подробности в результатах проверок.
Текущие ограничения: raw input выполняется без per-команды подтверждения —
после одобренного open_session модель работает в устройстве свободно; оператор
может добавить permission ask для terminal_write в OpenCode. Автоматического
распознавания sensitive-команд (conf t, system-view, commit) пока нет.
Telnet, console и serial требуют явных per-call флагов и могут быть hard-deny
политикой. transcripts_enabled остаётся зарезервированной настройкой.
Основные цели
Прямой SSH, SOCKS5, ProxyJump, Telnet, TCP console и локальный serial.
Современное и устаревшее оборудование: legacy SSH алгоритмы включаются явно для конкретного host в вызове.
Постоянная сессия: авторизация выполняется один раз, затем модель пишет команды,
ssh/telnetи одиночные клавиши в тот же stream.Несколько параллельных сессий в одном процессе: переключение между устройствами без переподключения.
Zero-config: модель описывает соединение сама, локально нужен только необязательный
policy.yml.Точные команды выбирает модель. MCP не переводит абстрактные операции в vendor CLI и не хранит полный каталог команд.
Собственный терминальный слой на Paramiko, telnetlib3 и pyserial; тип устройства модель определяет сама по баннеру и выводу.
Пароли загружаются из
passили явного key file; секреты вводятся в живой prompt черезterminal_write_secretи не попадают в MCP arguments, results и audit. Plaintext-пароль — только за явным insecure-флагом.Все подключения, ввод и события терминала журналируются без секретов.
Related MCP server: mcp-ssh-interactive
Первая область поддержки
Cisco IOS/IOS-XE, включая старые 29xx/35xx.
Huawei VRP и Huawei OLT.
Juniper Junos.
SNR 29xx и 52xx на базе механики Cisco IOS, но как разные CLI-диалекты.
D-Link DGS/DES.
Eltex MES/ESR.
MikroTik RouterOS через обычный SSH.
BDCOM, EcoSGE и PON-платформы через generic transport.
Не входит в первую версию
Отдельный RouterOS API MCP.
Полноценная система управления конфигурациями или Source of Truth.
Автоматическая запись в production.
Обход TACACS/RADIUS command authorization.
Автоматическое включение слабых SSH-алгоритмов для всех устройств.
Документы
Инструкция для модели — она же MCP-ресурс
network-terminal://usage; краткий контракт едет в MCPinstructions
Установка
uvx network-terminal-mcp@latest
# или как постоянный инструмент:
uv tool install network-terminal-mcp@latest
# или:
pip install network-terminal-mcpЗапуск
Локальный MCP запускается OpenCode через stdio, без прослушивания TCP-порта:
{
"mcp": {
"network-terminal": {
"type": "local",
"command": ["uvx", "network-terminal-mcp@latest"],
"enabled": true
}
},
"permission": {
"network-terminal_open_session": "ask"
}
}Конфигурационные файлы не обязательны. Для строгих ограничений (например,
hard-deny Telnet, serial, legacy-алгоритмов, plaintext) можно положить
policy.yml в ~/.config/network-terminal-mcp/. Ввод в живой сессии по
умолчанию не подтверждается: после одобренного open_session модель работает в
терминале свободно.
Проверка локальной политики до запуска:
uvx network-terminal-mcp check
# в чекауте проекта:
uv sync && uv run python -m network_terminal_mcp checkПодробный порядок регистрации SSH host key и запуска через OpenCode описан в руководстве эксплуатации.
Available Tools
7 toolsclose_sessionC
Close a session and disconnect from the device.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| host | Yes | |
| route | Yes | |
| state | Yes | |
| prompt | No | |
| warnings | No | |
| created_at | Yes | |
| session_id | Yes | |
| last_used_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the disconnect side effect, but says nothing about whether the session becomes unrecoverable, what happens to buffered terminal output, or what error results from an invalid/already-closed session_id.
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 no filler, covering both the action and its effect. It is arguably too terse given the gaps elsewhere, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, but this is a state-changing tool with no annotations, an undocumented required parameter, and no stated prerequisites or failure modes. The description is too thin for an operation that tears down a device connection.
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 parameter has no documented meaning in the schema. The name 'session_id' is fairly self-explanatory, but the description does not say where the id comes from (e.g. open_session) or what format it takes, so it fails to compensate for the coverage 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?
States a specific verb and resource ('Close a session') plus a concrete side effect ('disconnect from the device'), which clearly contrasts with the sibling open_session. It stops short of explicitly naming the inverse tool, but the pairing is obvious from the sibling list.
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?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as leaving a session open or checking session_status first. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_sessionA
Open a raw interactive terminal session and keep it open.
Describe the target inline: protocol and port describe the
final target, credentials are references (a pass entry, an
explicit SSH key file) for ssh/telnet/console. The optional single-hop
route is socks (local SOCKS5 proxy) or proxyjump (SSH jump
host); use proxyjump to reach a bastion quickly and run further ssh or
telnet hops yourself with terminal_write inside the same session.
For local console cables use protocol="serial" with an absolute
/dev/tty* path in host, serial parameters and
allow_serial=true. Every call goes through the client's permission
approval gate.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| port | No | ||
| route | No | ||
| legacy | No | ||
| serial | No | ||
| protocol | No | ssh | |
| credentials | No | ||
| allow_serial | No | ||
| allow_telnet | No | ||
| host_key_policy | No | strict | |
| allow_plaintext_password | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| host | Yes | |
| route | Yes | |
| state | Yes | |
| prompt | No | |
| warnings | No | |
| created_at | Yes | |
| session_id | Yes | |
| last_used_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that 'every call goes through the client's permission approval gate', which is a non-obvious side effect. However, it is silent on session lifetime/timeouts, resource cleanup, and the need to pair with close_session, leaving meaningful gaps for a long-lived connection 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?
The opening sentence front-loads the core purpose, and the remaining prose is organized by concern (target description, routing, serial, permission gate). It is dense but for an 11-parameter tool most sentences earn their place; the route/jump-host explanation is the only slightly expansive part.
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 explained. Given the tool's complexity (11 params, discriminated route union, credential backends, opt-in flags), the description covers protocols, routing, serial, and the approval gate but omits the remaining safety flags and the session lifecycle. Adequate but noticeably incomplete for a tool this rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level schema description coverage is 0%, so the description must compensate and does so for roughly half the parameters: host/port/protocol, credentials-as-references, the single-hop 'socks'/'proxyjump' route, and serial needing an absolute /dev/tty* path plus allow_serial=true. It says nothing about allow_telnet, host_key_policy, allow_plaintext_password, legacy, or the relationship between protocol and the route discriminator.
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 ('Open a raw interactive terminal session and keep it open') and distinguishes itself from siblings by pointing to terminal_write for follow-up hops inside the same session. It is clear what the tool produces, though it never quite names the alternative tools for session reuse or states that the returned handle feeds terminal_read/terminal_write.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real when-to-use guidance: use 'proxyjump to reach a bastion quickly and run further ssh or telnet hops yourself with terminal_write inside the same session', and use 'protocol="serial" with an absolute /dev/tty* path' for local console cables. It stops short of explicit exclusions (e.g. when to reuse an existing session vs open a new one), but the context provided is above average.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_outputC
Read a bounded slice of accumulated session output by offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | Yes | |
| output | Yes | |
| truncated | No | |
| session_id | Yes | |
| next_offset | No | |
| oldest_offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Bounded slice' hints at pagination, but it does not say whether reads are non-destructive, whether offset is a cursor over accumulated output that persists, whether the call blocks until new output arrives, or how much output a default limit returns.
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 tight sentence with the action and scoping mechanism front-loaded. Nothing is padded, though there is too little content rather than too much.
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 shape need not be described. However, for a paged read tool with zero annotation coverage and three undocumented parameters, the description omits the semantics an agent needs: pagination/cursor behavior, default limit, and offset units.
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 compensate. It covers offset implicitly and 'bounded' gestures at limit, but session_id — the only required parameter — is never explained, nor are offset units (characters vs bytes vs lines) or the default/absence behavior of limit.
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 (Read) and resource (accumulated session output) with the scoping mechanism (bounded slice by offset). It is clear on its own, but it does not distinguish itself from the sibling terminal_read, which an agent could plausibly confuse with this 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?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as terminal_read or session_status. The agent must infer from the name alone whether this is the right read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_statusC
Return state and prompt metadata for an active session.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| host | Yes | |
| route | Yes | |
| state | Yes | |
| prompt | No | |
| warnings | No | |
| created_at | Yes | |
| session_id | Yes | |
| last_used_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. "Return" implies a read, but it does not state whether the call is safe/idempotent, what happens when the session_id is unknown or expired, whether authentication is needed, or whether the returned state is cached or live.
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, which is appropriate for a one-parameter read tool. It is slightly too terse to be maximally useful, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema removes the need to explain return values, and the tool is simple (one param, no nesting). However, with no annotations and an entirely undocumented parameter, the description leaves gaps an agent must guess at regarding session_id validity and failure behavior.
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% for the single required session_id parameter, and the description says nothing about its format, where to obtain it, or whether it must reference an active session. The description therefore adds no meaning beyond the bare parameter name.
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 ("Return") and a specific resource ("state and prompt metadata for an active session"). It is distinguishable from siblings like open_session/close_session/terminal_read, though it never names them or contrasts its scope against read_output, which also returns data.
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?
There is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives such as read_output or terminal_read. The phrase "for an active session" faintly implies it applies only to live sessions, but nothing tells the agent what to do with a closed or invalid session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terminal_readA
Read terminal output until the stream is quiet or timeout expires.
Returns everything received, including pager screens, password prompts, banners and shell output; no prompt shape is required. Use session_status and read_output for offsets and buffered history.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| output | No | |
| truncated | No | |
| session_id | Yes | |
| output_offset | No | |
| next_output_offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it discloses blocking/quiet-detection behavior, timeout-driven termination, and that output includes pager screens, password prompts, banners and shell output with 'no prompt shape required.' It omits an important trait — whether reading consumes the buffer or is repeatable — plus any auth/permission 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?
Three tight sentences, each earning its place: behavior + termination condition, then return content, then sibling routing. Core semantics are front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required, and the description still usefully previews the content classes. Without annotations it should ideally cover buffer-consumption semantics and error behavior on invalid/expired sessions, which are the remaining gaps.
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 compensate and it only partly does: it gives functional meaning to timeout ('until the stream is quiet or timeout expires'), but no units, no default (null), and no guidance on values. session_id gets no explanation at all, though it is self-evident from the sibling session tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (read terminal output) and adds the termination semantics ('until the stream is quiet or timeout expires'), which is more than a bare restatement. It partially distinguishes itself from siblings by naming read_output and session_status for offsets/buffered history, though the boundary between terminal_read and read_output remains somewhat blurred.
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 routes the agent elsewhere for a key need: 'Use session_status and read_output for offsets and buffered history.' That is a clear alternative pointer, but there is no when-not condition (e.g., when to prefer read_output entirely) and no prerequisite or auth guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terminal_writeA
Write exact input to the session's terminal stream.
Use this for commands, interactive keystrokes and nested hops such as
ssh user@host. enter appends the transport line terminator
(newline, or carriage return on serial). The full data string is
recorded in the audit; never type passwords, passphrases or other
secrets here — use terminal_write_secret.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| enter | No | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| state | Yes | |
| bytes_sent | Yes | |
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the audit-logging of the full `data` string, the terminator behavior of `enter` including the serial carriage-return nuance, and the security constraint. It does not cover error behavior or whether writes block/fail on a dead session, so not a perfect 5.
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 the core action, then progressively finer detail (use cases, terminator semantics, security). Every sentence adds distinct value with no repetition of the name or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a 3-parameter write tool with no annotations, the description covers purpose, usage, key parameter behavior and the critical security caveat — nothing essential is missing.
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 must compensate and largely does: it defines `data` as exact input that is audit-recorded and explains `enter` as appending the line terminator with a default implied. `session_id` is left to inference, which is reasonable given it appears across all sibling tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (write) and resource (session's terminal stream) with the exact-input semantics made explicit. It also names the sibling terminal_write_secret as the alternative for sensitive input, so an agent can differentiate it from the other session tools without opening schemas.
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 concrete positive guidance (commands, interactive keystrokes, nested hops like `ssh user@host`) and an explicit exclusion ('never type passwords, passphrases or other secrets here — use terminal_write_secret'), which is exactly the routing decision an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terminal_write_secretA
Send a pass entry value at a live password or passphrase prompt.
Use this for every secret typed interactively (device logins, ssh, enable, TACACS). The value is resolved inside the server and never appears in tool arguments, results or audit; only the entry name and byte count are logged.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| entry | Yes | |
| state | Yes | |
| bytes_sent | Yes | |
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the value is resolved server-side and never appears in arguments, results, or audit, and that only the entry name and byte count are logged. It omits failure behavior, e.g. what happens if the session is not at a prompt or the entry does not exist.
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 the action, then the selection rule, then the security/logging contract, in three tight sentences. The backtick markup on ``pass`` is slightly noisy but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the security model is covered. What remains thin is error/precondition handling for a tool that types into a live prompt, plus the undocumented session_id.
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 must compensate. It clarifies that `entry` is a ``pass`` entry name whose value is resolved internally, which is genuinely useful, but `session_id` is never described beyond the implied "live" session context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (write a ``pass`` entry value into a live terminal prompt) and scopes it to secrets, which distinguishes it in spirit from the sibling terminal_write for non-secret input. It stops short of naming terminal_write as the alternative, so the differentiation is implied rather than 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?
"Use this for every secret typed interactively" gives a clear selection rule, reinforced with concrete prompt examples (device logins, ssh, enable, TACACS). It never states the inverse case (use terminal_write for non-secret text) or prerequisites such as an active session sitting at a prompt.
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.
7 tool updates
v0.1.1- First observed
close_session - First observed
open_session - First observed
read_output - First observed
session_status - First observed
terminal_read - First observed
terminal_write - First observed
terminal_write_secret
TDQS
Scored across 7 tools
Most tools have distinct purposes: open/close session, write, write secret, status. The only potential confusion is between terminal_read (live, quiet-based) and read_output (bounded offset slice), but descriptions clarify the difference by pointing to each other.
All names use snake_case and are readable, but conventions are mixed: some follow verb_noun (open_session, close_session, read_output), while others use noun_verb (terminal_write, terminal_read, terminal_write_secret). The 'terminal_' prefix is applied inconsistently.
Seven tools is well-scoped for an interactive terminal session server. Each tool covers a distinct lifecycle operation (open, close, write, read, secret write, status, buffered read) and none feels redundant or excessive.
The set covers the core lifecycle: open, interact, read output, check status, and close. A minor gap is the absence of a list_sessions tool to manage multiple concurrent sessions, but agents can work around this by tracking session IDs themselves.
Maintenance
Related MCP Connectors
Protocol-native energy infrastructure orchestration for AI data centers. Provides 46 MCP tools across 8 grid protocols (IEC-61850, DNP3, Modbus, OCPP, OpenADR, IEEE 2030.5, IEC 60870-5-104, ICCP) with 5 core API primitives: connect, dispatch, settle, comply, and intel. Enables AI agents to programmatically interact with substations, grid interfaces, and energy assets for real-time workload-grid coordination.
Give AI agents identity, scoped access, trusted context, and verifiable actions through MCP.
Run commands and read/write files on your servers over Termalin's keyless tunnels (hosted MCP).
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceTerminal-first SSH access for MCP clients and AI agents, enabling interactive remote sessions, file uploads, and stateful workflows.14 npm1MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that enables AI agents to run fully interactive SSH sessions (via tmux) and execute commands like a human operator, with persistent sessions and multiple concurrent connections.6MIT
- AlicenseNot gradedqualityDmaintenanceProvides persistent interactive shell sessions via pseudo-terminals for MCP agents, enabling bidirectional communication, incremental reads, and stateful command execution across steps.13 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to have persistent, fully interactive SSH sessions into remote hosts, behaving like a local terminal.17 npm2MIT