Skip to main content
Glama
danieldoalto

Terminal Session Manager

by danieldoalto

Terminal Session Manager

Terminal Session Manager minimalista, modular e orientado a agentes. O sistema mantém sessões de terminal persistentes independentemente do agente que as iniciou, gerencia execução de jobs, preserva histórico ordenado de eventos e opera dispositivos cadastrados sem expor credenciais em texto puro.

Este repositório implementa a arquitetura incremental descrita em spec.md.


Etapa 0 — Contrato e Esqueleto

Nesta etapa inicial foi construído o esqueleto executável e os contratos fundamentais de domínio, sem acoplamento a integrações de rede ou bibliotecas externas no núcleo:

  • Modelos de Domínio:

    • Session e SessionStatus (created, running, waiting, completed, failed, closed, lost) com máquina de estados e validação estrita de transições.

    • Job e JobStatus (created, running, completed, failed, cancelled, timeout) com controle de ciclo de vida, códigos de saída e timestamps.

    • Device, DeviceType e ConnectionMethod para catálogo de inventário e parametrização segura de conexões.

    • CredentialRef e CredentialType com garantia estrutural de não armazenar nem vazar segredos ao agente ou histórico.

    • Event e EventType (stdin, stdout, stderr, state_change, system) com suporte a ordenação estrita (sequence, timestamp) e flags para mascaramento de dados sensíveis.

  • Interfaces e Contratos (typing.Protocol):

    • SessionRepository, JobRepository, EventRepository (persistência).

    • TerminalTransport (adaptadores de transporte/PTY).

    • DeviceRepository (catálogo de dispositivos).

    • CredentialResolver (resolução interna de segredos para adaptadores).

  • Erros de Domínio:

    • DomainError, InvalidStateTransitionError, InvalidStateError, EntityNotFoundError, SessionNotFoundError, JobNotFoundError, DeviceNotFoundError, CredentialNotFoundError e ValidationError.


Related MCP server: mcp-interactive-terminal

Etapa 1 — Sessão Local Mínima

Implementa um adaptador concreto de terminal/processo local e um orquestrador de sessão conectado ao ciclo de vida de Session:

  • LocalProcessTransport (transports/local_process.py):

    • Implementa o protocolo TerminalTransport sobre subprocessos do sistema operacional.

    • Leitura não-bloqueante multithread com suporte a timeout real e isolamento cross-platform (Windows e Linux).

    • Operações de open, read, write, resize e close com liberação limpa de recursos.

  • LocalSession (services/local_session.py):

    • Orquestra sessões de terminal acopladas a transportes via injeção de dependências (pluggable).

    • Sincroniza o ciclo de vida da entidade Session (CREATED -> RUNNING -> COMPLETED / FAILED / CLOSED) com o estado real do transporte.

    • Métodos de conveniência como read_text() e write().


Etapa 2 — Persistência e Histórico

Implementa persistência durável em SQLite (sqlite3 da biblioteca padrão) para sessões, jobs e histórico sequencial de eventos:

  • Repositórios SQLite (persistence/sqlite.py):

    • SqliteSessionRepository: CRUD e upsert de metadados e ciclo de vida de sessões.

    • SqliteJobRepository: CRUD e vinculação de jobs com comandos e resultados.

    • SqliteEventRepository: persistência com unicidade estrita (session_id, sequence), ordenação e paginação por cursor (since_sequence, limit).

  • Histórico e Proteção de Segredos (services/local_session.py):

    • Emissão e persistência automática de eventos STDIN, STDOUT, STDERR e STATE_CHANGE.

    • Suporte a write(..., is_sensitive=True) registrando eventos com is_masked=True e payload mascarado "[REDACTED]", impedindo vazamento de segredos para a base durável.

    • Recuperação completa de estado e histórico após reinício do serviço.


Etapa 3 — Jobs Assíncronos

Implementa execução, espera, cancelamento e monitoramento de jobs desacoplados da conexão contínua do cliente:

  • Serviço de Jobs (JobService em services/job_service.py):

    • Submissão não-bloqueante (submit_job) com execução em thread dedicada e subprocesso isolado.

    • Vínculo a session_id e persistência contínua de eventos (STATE_CHANGE, STDIN, STDOUT, STDERR).

    • Espera com bloqueio sincronizado (wait_job) e cancelamento forçado com terminação de processo (cancel_job).

    • Controle de timeout por job com transição para TIMEOUT e encerramento de processo.

    • Reconciliação em reinício (recover_orphaned_jobs): jobs interrompidos por crash/reinício do serviço são detectados e marcados como FAILED, garantindo que nenhuma falha seja silenciosa.


Etapa 4 — Dispositivos e Credenciais

Implementa o catálogo persistente de dispositivos e a resolução segura de credenciais:

  • Catálogo de Dispositivos (persistence/sqlite.py e services/device_service.py):

    • SqliteDeviceRepository: persistência durável de metadados não-secretos no SQLite (devices), com garantia de unicidade de nome/nickname e exclusão lógica (is_deleted).

    • DeviceService: gerenciamento completo de ciclo de vida (criação, consulta, atualização, desativação e remoção lógica) e resolução interna de dados de conexão (resolve_connection).

  • Resolução Segura e Proteção em Repouso (services/credential_store.py):

    • ProtectedLocalCredentialStore: armazenamento local cifrado em SQLite (credential_secrets) usando derivação de chaves PBKDF2-HMAC-SHA256, cifra de fluxo autenticada e tags HMAC contra adulteração, mantendo zero dependências externas no runtime e nunca persistindo segredos em texto puro.

    • DelegatingCredentialResolver: resolução com delegação a provedores externos (ExternalCredentialProvider) e fallback local.

    • ResolvedConnection: objeto de trânsito em memória estrita, ocultando segredos em representações (__repr__) e inacessível a agentes.

  • Integração à Sessão e Mascaramento de Saídas (services/local_session.py):

    • Associação injetável da resolução de dispositivo no fluxo de LocalSession.

    • Mascaramento dinâmico em saídas de terminal: qualquer eco ou saída contendo o segredo resolvido é redigido para [REDACTED] antes da persistência de eventos no histórico.


Etapa 5 — API HTTP

Expõe por HTTP os serviços essenciais do Terminal Session Manager através de uma arquitetura leve, minimalista e sem dependências externas:

  • Coordenação de Sessões (SessionService em services/session_service.py):

    • Gerencia instâncias de sessões interativas em memória (LocalSession), integrando-as com SqliteSessionRepository, EventRepository e DeviceService.

    • Suporte à escrita (write_session) e leitura mascarada (read_session).

  • Servidor HTTP e Roteador (APIServer e TSMRequestHandler em api/):

    • Servidor multi-threaded baseado em http.server.ThreadingHTTPServer da biblioteca padrão do Python.

    • Autenticação local configurável via Bearer token (Authorization: Bearer <token>) ou X-API-Key.

    • Mapeamento uniforme e sanitizado de exceções de domínio para códigos HTTP (400, 401, 404, 409, 500).

    • Endpoints Disponíveis:

      • POST /sessions: Cria e inicia nova sessão.

      • GET /sessions: Lista todas as sessões cadastradas.

      • GET /sessions/{id}: Consulta metadados da sessão.

      • POST /sessions/{id}/write: Escreve dados na sessão ativa (com flag is_sensitive).

      • POST /sessions/{id}/read: Lê dados do canal de saída da sessão.

      • POST /sessions/{id}/close: Encerra o canal de transporte da sessão.

      • GET /sessions/{id}/events?since_sequence=...&limit=...: Consulta paginada do histórico por cursor sequencial.

      • POST /sessions/{id}/jobs e POST /jobs: Submete um job assíncrono.

      • GET /jobs/{id}: Consulta status, exit_code e saídas do job.

      • GET /sessions/{id}/jobs: Lista jobs associados a uma sessão.

      • POST /jobs/{id}/wait: Aguarda conclusão com timeout.

      • POST /jobs/{id}/cancel: Cancela execução de um job em andamento.

      • POST /devices: Cadastra novo dispositivo no catálogo.

      • GET /devices: Lista dispositivos registrados (?only_active=true).

      • GET /devices/{id_or_name}: Consulta detalhes do dispositivo.

      • PATCH /devices/{id}: Atualiza parâmetros do dispositivo.

      • POST /devices/{id}/deactivate: Desativa logicamente um dispositivo.

      • GET /devices/{id_or_name}/resolve: Resolve parâmetros de conexão por nickname sem expor segredos (has_credential: true/false).


Etapa 6 — MCP com FastMCP

Expõe as capacidades essenciais do Terminal Session Manager para agentes de inteligência artificial através do protocolo Model Context Protocol (MCP), utilizando a biblioteca FastMCP:

  • Servidor FastMCP (terminal_session_manager.mcp.server):

    • Execução via transporte padrão stdio, compatível com Claude Desktop, Cursor, Antigravity e clientes MCP em geral.

    • Reutiliza diretamente as instâncias de domínio (SessionService, JobService, DeviceService, SqliteEventRepository), garantindo paridade total com a API HTTP.

  • Ferramentas MCP Expostas (17 Tools):

    • Sessões: create_session, get_session, list_sessions, write_session, read_session, close_session.

    • Histórico de Eventos: get_events (paginação por cursor com since_sequence e limit).

    • Jobs em Segundo Plano: submit_job, get_job, list_jobs, wait_job, cancel_job.

    • Catálogo e Resolução de Dispositivos: list_devices, get_device, resolve_device.

    • Transferência SCP: scp_upload, scp_download.

  • Terminal Local Nativo (Sem Cadastro Prévio):

    • Para abrir uma sessão interativa no computador local onde o TSM roda, não é necessário cadastrar nenhum dispositivo. Omitir device_identifier ao chamar create_session (ou enviar POST /sessions com {"name": "local"}) dispara diretamente o LocalProcessTransport nativo do SO (cmd.exe no Windows ou /bin/sh no Linux/macOS). O catálogo de dispositivos é destinado a conexões remotas SSH.

  • Garantias de Segurança:

    • resolve_device resolve internamente parâmetros de conexão, validando existência e atividade do dispositivo, indicando has_credential: true/false, mas omite estritamente segredos, senhas e chaves privadas da resposta ao agente.

  • Configuração em Clientes MCP:

Adicione a configuração abaixo ao seu cliente MCP (por exemplo, claude_desktop_config.json ou arquivo de settings do IDE):

{
  "mcpServers": {
    "terminal-session-manager": {
      "command": "uv",
      "args": [
        "--directory",
        "d:/Projetos/TerminalPersistente",
        "run",
        "terminal-session-manager-mcp"
      ],
      "env": {
        "TSM_DB_PATH": ".tsm/tsm.db"
      }
    }
  }
}

Etapa 7 — Configuração e Endurecimento

Consolida a configuração centralizada, ciclo de vida operacional, reconciliação de recursos órfãos e rotação de credenciais protegidas:

  • Configuração Centralizada (config.yml e config.py):

    • Carregamento declarativo via config.yml com defaults seguros para servidor, armazenamento, sessões, jobs e limites de eventos.

    • Sobrescrita estrita via variáveis de ambiente com prefixo TSM_:

      • TSM_CONFIG_PATH: Caminho alternativo para o arquivo de configuração.

      • TSM_SERVER_HOST: Endereço de escuta da API (padrão: 127.0.0.1).

      • TSM_SERVER_PORT: Porta TCP da API HTTP (padrão: 8000).

      • TSM_API_TOKEN: Token de autenticação da API HTTP.

      • TSM_DB_PATH: Caminho do banco SQLite (padrão: .tsm/tsm.db).

      • TSM_MASTER_KEY: Chave mestra criptográfica para proteção em repouso.

      • TSM_REQUIRE_AUTH: Obrigatoriedade de autenticação HTTP (true/false).

    • Validação Antecipada na Inicialização: Portas inválidas, timeouts nulos ou negativos, limites invertidos ou ativação de require_auth sem token informado levantam ConfigurationError imediato e abortam a execução com erro claro.

    • Segredos Fora do YAML: Nenhuma credencial ou chave secreta é persistida em texto puro no arquivo config.yml.

  • Endurecimento de Ciclo de Vida e Reconciliação (app.py):

    • TSMApplication: Container central que injeta a mesma configuração e banco entre API, MCP e serviços.

    • startup(): Executa reconciliação de recursos interrompidos:

      • Jobs em execução durante falhas/reinícios são marcados como FAILED.

      • Sessões ativas em banco sem processo no runtime são marcadas como LOST.

    • shutdown(): Encerramento gracioso que fecha todas as sessões ativas (close_all()), cancela processos em segundo plano e fecha conexões SQLite de maneira determinística.

  • Segurança e Rotação do Armazenamento de Credenciais:

    • rotate_master_key(new_master_key): Re-criptografa todas as credenciais sob uma nova chave mestra em transação atômica única no SQLite.

    • rotate_credential(ref_id, new_secret): Atualiza o segredo de uma credencial gerando novo sal, nonce e tag de autenticação HMAC.

    • Restrição de permissões de arquivo em sistemas POSIX (0o600 para banco e 0o700 para diretório).


Requisitos

  • Python >= 3.11

  • uv (gerenciador de dependências e ambientes)


Instalação

Clone o repositório e sincronize o ambiente virtual com uv:

uv sync

Execução

O utilitário CLI unificado terminal-session-manager oferece controle sobre todos os serviços e operações:

# Validar arquivo de configuração e banco de dados
uv run terminal-session-manager validate

# Iniciar o servidor HTTP REST API (com documentação Swagger em /docs)
uv run terminal-session-manager api

# Iniciar o servidor MCP (transporte stdio para Claude Desktop / Cursor / Antigravity)
uv run terminal-session-manager mcp

# Exibir status e visão geral
uv run terminal-session-manager status

# Ponto de entrada direto do MCP
uv run terminal-session-manager-mcp

# Gerenciador interativo de dispositivos (SSH, chaves, diagnóstico e transferências SCP)
uv run python scripts/manage_devices.py

# Verificar versão instalada
uv run terminal-session-manager --version

Etapa 8 — Transporte SSH

Implementa conexão e execução remota SSH para dispositivos cadastrados, reutilizando o contrato TerminalTransport, LocalSession, DeviceService, CredentialResolver, JobService, API HTTP e FastMCP:

  • Adaptador SSH Pluggable (SSHTransport em transports/ssh.py):

    • Implementa o protocolo TerminalTransport (open, read, read_stderr, write, resize, close, is_alive, exit_code) utilizando paramiko>=3.5.0.

    • Suporte a autenticação por senha ou chave privada (RSA, Ed25519, ECDSA) a partir de dados resolvidos em memória pelo DeviceService / ProtectedLocalCredentialStore.

    • Modo interativo (invoke_shell com PTY) para sessões de terminal contínuas e modo de execução de comando (exec_command) para jobs remotos.

    • Verificação estrita de host keys contra known_hosts (paramiko.RejectPolicy), rejeitando silenciosamente qualquer host não confiável por padrão em modo seguro.

  • Integração de Sessões e Jobs Remotos:

    • ConnectionMethod.SSH: Dispositivos registrados com método SSH têm o transporte SSHTransport instanciado automaticamente ao criar a sessão ou submeter um job informando apenas o nickname do dispositivo.

    • Mascaramento garantido: senhas e tokens resolvidos são proativamente censurados ([REDACTED]) no histórico de eventos persistidos no SQLite.

    • Falhas de rede, recusa de chave de host e erros de autenticação resultam em estados previsíveis (FAILED) sem vazar credenciais em mensagens de erro ou logs.


Etapa 9 — Transferência SCP

Implementa suporte modular a transferências seguras de arquivos entre o host TSM e dispositivos SSH remotos, utilizando a biblioteca scp>=0.15.0 integrada à infraestrutura existente:

  • Serviço Modular (SCPService em services/scp_service.py):

    • Desacoplado de TerminalTransport, tratando transferências de arquivos com semântica dedicada.

    • Suporta operações de upload (local -> remoto) e download (remoto -> local).

    • Cada transferência é registrada e gerenciada como um Job assíncrono persistente no SQLite, emitindo eventos de auditoria sequenciados (STATE_CHANGE, STDOUT, STDERR).

    • Suporta cancelamento limpo (cancel_transfer) e timeouts de transferência com transição de status determinística (JobStatus.CANCELLED, JobStatus.TIMEOUT).

    • Verificação estrita de known_hosts e strict_host_key_checking, validação de integridade de caminhos locais e remotos e sanitização de segredos em qualquer saída ou erro.

  • Endpoints na API HTTP REST:

    • POST /scp/upload: Dispara transferência de envio de arquivo local para destino remoto.

    • POST /scp/download: Dispara transferência de recebimento de arquivo remoto para storage local.

# Exemplo de Upload via cURL (retorna HTTP 202 com os metadados do Job)
curl -X POST http://127.0.0.1:8000/scp/upload \
  -H "Content-Type: application/json" \
  -d '{
    "device": "maclinux",
    "local_path": "C:/dados/config.yml",
    "remote_path": "/tmp/config.yml",
    "timeout": 30.0
  }'

# Exemplo de Download via cURL
curl -X POST http://127.0.0.1:8000/scp/download \
  -H "Content-Type: application/json" \
  -d '{
    "device": "maclinux",
    "remote_path": "/etc/os-release",
    "local_path": "C:/dados/os-release.txt",
    "timeout": 30.0
  }'

# Acompanhar conclusão do Job de transferência
curl http://127.0.0.1:8000/jobs/{job_id}
  • Ferramentas FastMCP para Agentes (17 Tools):

    • scp_upload e scp_download: Permitem a agentes LLM enviar e baixar arquivos em máquinas remotas informando apenas o nickname do dispositivo (ex: maclinux).

  • Gerenciador Interativo (scripts/manage_devices.py):

    • Opção 9) Transferência e teste de arquivos SCP (Upload / Download) no menu interativo para transferir arquivos e executar teste rápido de conectividade SCP sem precisar escrever código.


Testes

A suíte de testes automatizados valida modelos, transportes locais e SSH, transferências SCP, persistência durável, ciclo de vida de jobs, catálogo e resolução de dispositivos, autenticação e documentação OpenAPI:

uv run pytest -v

Todos os 150 testes são autossuficientes e executam sem qualquer dependência de hardware externo, portas de rede abertas ou servidores SSH físicos (utilizando mocks de cliente Paramiko e SCPClient).


Estrutura do Projeto

.
├── pyproject.toml                         # Configuração uv e dependências
├── README.md                              # Documentação de uso e instalação
├── help.md                                # Guia operacional completo
├── skill.md                               # Especificação das ferramentas FastMCP para agentes
├── spec.md                                # Especificação completa do produto
├── scripts/
│   └── manage_devices.py                  # Gerenciador CLI interativo (CRUD, SSH, chaves, SCP)
├── reports/
│   ├── 01-contrato-e-esqueleto.md         # Relatório da Etapa 0
│   ├── 02-sessao-local.md                 # Relatório da Etapa 1
│   ├── 03-persistencia-e-historico.md     # Relatório da Etapa 2
│   ├── 04-jobs-assincronos.md             # Relatório da Etapa 3
│   ├── 05-catalogo-dispositivos.md        # Relatório da Etapa 4
│   ├── 06-api-http.md                     # Relatório da Etapa 5
│   ├── 07-mcp.md                          # Relatório da Etapa 6
│   ├── 08-transporte-ssh.md               # Relatório da Etapa 8
│   └── 09-scp.md                          # Relatório da Etapa 9 (Transferência SCP)
├── src/
│   └── terminal_session_manager/
│       ├── __init__.py                    # Exportações públicas de domínio
│       ├── errors.py                      # Exceções de domínio e transporte
│       ├── main.py                        # Ponto de entrada CLI
│       ├── api/                           # API HTTP REST e OpenAPI
│       │   ├── handler.py                 # Handlers HTTP (/sessions, /jobs, /devices, /scp)
│       │   ├── openapi.py                 # Esquemas e especificação OpenAPI
│       │   └── server.py                  # Servidor HTTP multithread com autenticação
│       ├── mcp/                           # Servidor FastMCP
│       │   └── server.py                  # 17 ferramentas MCP para agentes LLM
│       ├── models/                        # Entidades e máquinas de estado
│       │   ├── credential.py              # CredentialRef, CredentialType
│       │   ├── device.py                  # Device, DeviceType, ConnectionMethod
│       │   ├── event.py                   # Event, EventType
│       │   ├── job.py                     # Job, JobStatus, JOB_TRANSITIONS
│       │   └── session.py                 # Session, SessionStatus, SESSION_TRANSITIONS
│       ├── transports/                    # Adaptadores de transporte
│       │   ├── local_process.py           # LocalProcessTransport (subprocess + non-blocking queue)
│       │   └── ssh.py                     # SSHTransport (Paramiko SSH interativo e comando)
│       ├── services/                      # Orquestradores de domínio
│       │   ├── device_service.py          # DeviceService (catálogo e resolução de dispositivos)
│       │   ├── job_service.py             # JobService (execução assíncrona em background)
│       │   ├── local_session.py           # LocalSession controller
│       │   └── scp_service.py             # SCPService (upload/download assíncrono via SCP)
│       └── persistence/                   # Repositórios duráveis (SQLite)
│           ├── sqlite.py                  # SqliteStorage, Repositories
│           └── protected_store.py         # ProtectedLocalCredentialStore (cofre criptografado)
└── tests/
    ├── test_contracts.py                  # Verificação dos protocolos em memória
    ├── test_device_and_credential.py      # Testes de Device e CredentialRef
    ├── test_event.py                      # Testes de Event e ordenação estrita
    ├── test_job.py                        # Testes de Job e transições de ciclo de vida
    ├── test_job_service.py                # Testes de JobService assíncrono
    ├── test_local_session.py              # Testes do controlador LocalSession
    ├── test_local_transport.py            # Testes do adaptador LocalProcessTransport
    ├── test_ssh_transport.py              # Testes do adaptador SSHTransport
    ├── test_scp_service.py                # Testes do serviço SCPService
    ├── test_api_devices.py                # Testes de API HTTP para dispositivos
    ├── test_api_scp.py                    # Testes de API HTTP e MCP para SCP
    ├── test_persistence_lifecycle.py      # Testes de reinício, saída volumosa e segredos
    ├── test_session.py                    # Testes de Session e máquina de estados
    └── test_sqlite_persistence.py         # Testes dos repositórios SQLite

Available Tools

15 tools
cancel_jobCancel JobC

Cancels a running background job, terminating its process.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses that the job's process is terminated, but omits irreversibility, permission requirements, idempotency, and whether non-running jobs produce errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tightly written sentence with the action and effect front-loaded; no filler or redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive cancellation tool with no annotations and an undocumented parameter, the description is too thin. It should at least note side effects, prerequisites, or error behavior; the existing output schema means return values need not be explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single job_id parameter has no schema description (0% coverage), and the description never mentions it. The parameter name is self-explanatory, but no format, source, or validation is added beyond the schema's bare type declaration.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'Cancels' and resource 'background job' with qualifier 'running' clearly state the action and distinguish from session siblings like close_session and job siblings like submit_job/get_job/wait_job. However, it does not explicitly name alternatives or exclusions, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is given. The word 'running' only weakly implies it applies to active jobs, and alternatives such as get_job, wait_job, or close_session are not mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_sessionClose SessionC

Terminates an active session and marks it closed.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It says the session is terminated and marked closed, but says nothing about whether closing is idempotent, what happens if the session is already closed, whether the session's data/events survive, or what permissions are needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with no filler, and the action is front-loaded. It is appropriately sized, though there is no structure to speak of for a one-line description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. However, as a destructive-style state transition with zero annotations and an undocumented parameter, the description omits the behavioral context an agent needs before calling it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter session_id. The description never mentions the parameter at all, so it adds no meaning about which identifier format or session state is acceptable beyond the schema's type declaration.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Terminates') and resource ('an active session') plus the resulting state ('marks it closed'). This distinguishes it from siblings like get_session or write_session, though it never names those alternatives explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to close vs. leave a session open, no prerequisites, and no mention of alternatives. The agent must infer that this is the teardown counterpart to create_session.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_sessionCreate SessionA

Creates and starts a new persistent terminal session.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoHuman-readable name for the session.default
device_identifierNoOptional nickname or UUID of a registered device to bind.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses two meaningful traits — the session is 'persistent' and it is 'started' immediately on creation — but says nothing about auth/permissions, name-collision behavior, or what happens if the device binding fails.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with the action verb front-loaded and zero filler. Every word contributes to identifying the operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values needn't be described, and the schema fully documents both optional parameters. With zero required parameters and a single, simple operation, the description covers what an agent needs to make the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are fully documented in the schema (100% coverage), including the device-binding semantics, so the description needn't compensate. Baseline 3 applies; the description adds no parameter detail beyond the schema, though the schema already handles it well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource pair ('Creates ... a persistent terminal session') that unambiguously distinguishes it from the read/write/list/close siblings. The phrase 'persistent terminal session' also pins down the resource type rather than a generic session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus alternatives, no prerequisites, and no mention of what happens with an already-existing session name. The implied workflow (create before read/write) is left entirely to inference from sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_deviceGet DeviceB

Retrieves non-sensitive device configuration by nickname or ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
name_or_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses that only non-sensitive configuration is returned, which is a real behavioral trait, but it omits auth requirements, error behavior for unknown devices, and side effects. A meaningful disclosure, but not comprehensive for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the resource, qualifier, and identifier options front-loaded and zero filler. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the single required parameter is addressed. For a simple read tool the description is nearly sufficient; only failure behavior and sibling routing are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With one parameter and 0% schema description coverage, the description must compensate, and it partially does by clarifying that name_or_id accepts either a nickname or an ID. It does not state format, casing, or what happens on ambiguous matches, so the gap is only partly closed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (retrieves) and resource (device configuration) with a qualifier (non-sensitive) that scopes what is returned. It implicitly distinguishes itself from list_devices and resolve_device by emphasizing single-device lookup by nickname or ID, though it does not name those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'by nickname or ID' hints at the retrieval context, but there is no explicit when-to-use guidance, no prerequisites, and no mention of when to prefer resolve_device or list_devices instead. The agent must infer routing from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_eventsGet EventsB

Retrieves ordered event stream for a session using cursor pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum events to return (capped at 200).
session_idYesSession identifier.
since_sequenceNoStarting sequence number (inclusive cursor).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose two meaningful traits: results are ordered and pagination is cursor-based. However, it says nothing about retention, whether the stream can be incomplete, how to resume or detect the end, or permission requirements — for a paginated read with zero annotation coverage, that leaves real gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or repetition. It is efficient, though the extreme brevity leaves the remaining elements unaddressed rather than being purely a conciseness win.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required, and parameter documentation is complete via the schema. Still missing is guidance on pagination continuation and end-of-stream detection, which matters for a cursor-paginated event tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents limit, session_id, and since_sequence (including the inclusive-cursor semantics and the 200 cap), establishing the baseline of 3. The phrase 'cursor pagination' loosely ties to since_sequence/limit but adds no format or usage detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('retrieves'), a specific resource ('ordered event stream'), and its scope ('for a session'), which distinguishes it from sibling session tools like get_session or read_session. It does not explicitly contrast itself with any sibling by name, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus get_session, read_session, or get_job, nor any prerequisite or exclusion. The session-scoped event resource implies usage, but the agent is left to infer it entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_jobGet JobC

Queries the execution status, exit code, and outputs of a background job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only query and lists returned fields, but says nothing about whether the call blocks, what happens for unknown/expired job IDs, whether output is truncated, or 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that names the action and the returned data with no filler. Nothing wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be described. However, for a background-job status getter with no annotations, the absence of when-to-use guidance relative to wait_job/list_jobs and any blocking/error semantics leaves a meaningful gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter job_id is undocumented in both schema and description. The description does not compensate by clarifying the expected ID format or source (e.g., from submit_job/list_jobs).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (queries) and resource (background job) plus what it returns: execution status, exit code, and outputs. It is clearly distinguishable from mutating siblings like submit_job and cancel_job, though it does not explicitly differentiate itself from wait_job or list_jobs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus wait_job (which presumably blocks) or list_jobs. The description implies a status-check use case but gives no conditions, prerequisites, or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sessionGet SessionB

Retrieves session metadata and live status by session ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. It conveys the read-only, non-destructive nature (retrieves metadata and live status) and notes that status is live, which is useful, but says nothing about permissions, missing-session errors, or freshness/caching semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, with zero filler. Nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the tool is a simple single-parameter read. What remains missing is sibling disambiguation, but the core lookup contract is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single parameter with 0% schema description coverage, so the description must compensate. 'by session ID' confirms the parameter's identity, but adds no format, example, or source guidance beyond the property name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (retrieves) and resource (session metadata and live status) keyed by session ID, which is clearer than a bare restatement. However, it does not distinguish itself from the sibling 'read_session', leaving the agent unsure which retrieval tool applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no exclusions, and no mention of alternatives such as read_session or list_sessions, despite the tool having several closely related siblings. The agent must infer the selection criteria from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_devicesList DevicesB

Lists registered devices in inventory without secrets.

ParametersJSON Schema
NameRequiredDescriptionDefault
only_activeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose one useful behavioral trait — results exclude secrets — but says nothing about pagination, ordering, or permissions for what is presumably a read-only enumeration.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with no filler, and the key scoping detail ('without secrets') is included rather than buried. It is terse but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and this is a simple one-parameter read tool. However, the total absence of information about the only_active filter leaves a real gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter 'only_active', which has a default of true and no documented meaning. The description never mentions filtering behavior, so it fails to compensate for the coverage gap on the one parameter that controls the result set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Lists') and resource ('registered devices in inventory'), so the agent knows it enumerates devices rather than fetching one. It does not explicitly differentiate itself from siblings like get_device or resolve_device, leaving the list-vs-single distinction to inference from the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as get_device or resolve_device, nor any stated preconditions. The agent must infer usage entirely from the name and the list/get naming convention.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_jobsList JobsB

Lists all background jobs associated with a specific session.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. "Lists" implies a read-only operation, but nothing is said about pagination, ordering, whether completed/failed jobs are included, or run-time cost for a potentially large job set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with no filler, and the scoping constraint is stated up front. It is efficient, though arguably too terse for the behavioral gaps left unfilled.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. Still, for a listing tool with no annotations, the description omits any note about result size, pagination, or job-state coverage, leaving the agent to guess at the shape of the listing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter carries no format or constraint info. The description at least conveys that session_id scopes the listing to one session, but adds no syntax (e.g., ID format) or validation details beyond the schema's type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Lists all background jobs") and scopes it to a session, which is enough to distinguish it from get_job or submit_job. It does not explicitly name or contrast itself with sibling tools like get_job, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "all background jobs associated with a specific session" implies the enumeration use case, which implicitly contrasts with get_job for a single job. However, it never says when to prefer this over get_job or how to handle filtering, so the guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sessionsList SessionsB

Lists all registered sessions with up-to-date execution status.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It adds only that status is 'up-to-date' (implying live/refreshed values); it never states that this is a non-mutating read, whether results paginate, or how large the listing can be.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no filler, front-loading the action and resource. Nothing needs trimming and nothing important is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be explained. However, for a read tool with zero annotations the description is thin: it omits confirmation that this is side-effect-free and gives no hint about result volume or ordering, leaving an agent with gaps beyond the structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which sets the baseline at 4. There is nothing further for the description to disambiguate about inputs, so this dimension is effectively satisfied by the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Lists) and resource (sessions) plus the scope 'all registered', which implicitly distinguishes it from the single-target get_session. It does not explicitly name that sibling or contrast with list_jobs/list_devices, so differentiation is only inferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this versus get_session (single session) or the job-listing siblings. Usage can only be inferred from the word 'Lists' and 'all'; no exclusions, prerequisites, or alternatives are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_sessionRead SessionB

Reads output text from an active terminal session.

Sensitive tokens and credentials are automatically redacted before returning.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
max_bytesNo
session_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it does disclose a genuinely useful non-obvious trait: sensitive tokens and credentials are automatically redacted. It nonetheless omits read semantics (blocking vs. non-blocking, whether output is consumed) and any auth or rate-limit context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with what the tool does and followed by the redaction caveat. No filler, no restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be explained. Still, for a three-parameter tool with zero annotation coverage, the description leaves timeout/max_bytes behavior and read-blocking semantics unaddressed, so it is only partially complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters. The description mentions none of them, leaving timeout (what timeout, in what unit), max_bytes (what happens on truncation), and session_id entirely undocumented beyond their self-evident names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Reads output text") and scopes it to an "active terminal session," which is more precise than a bare 'read session.' However, it does not distinguish itself from the sibling get_session, which an agent could plausibly confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus get_session, list_sessions, or write_session. The 'active' qualifier hints at a precondition but the description never states prerequisites, exclusions, or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_deviceResolve DeviceB

Resolves device connection details internally by nickname.

NOTE: Strictly omits secrets, passwords, or keys from the output. Confirms connectivity parameters and indicates if a credential was resolved.

ParametersJSON Schema
NameRequiredDescriptionDefault
name_or_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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 secrets, passwords, and keys are omitted from output and that a credential resolution indicator is returned, but it does not state whether the operation is read-only, what permissions are required, or other side-effect behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the core purpose, and every sentence adds useful information. The security note and credential-indicator sentence earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one required parameter, an output schema, and no annotations, the description is adequate but incomplete. It covers output secrecy and credential resolution, but leaves parameter format and usage alternatives unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 mentions resolving 'by nickname,' but the parameter is named 'name_or_id' and may accept an ID as well; the description neither explains the accepted formats nor clarifies the nickname-vs-ID distinction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Resolves device connection details internally by nickname.' It clearly conveys the operation and scoping mechanism, but does not differentiate itself from siblings like get_device or list_devices, leaving ambiguity about when this tool is preferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives such as get_device or list_devices. The phrase 'by nickname' hints at a usage condition, but no alternatives or exclusions are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_jobSubmit JobB

Submits an asynchronous command to execute in background within a session.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputsNoOptional stdin lines to send.
commandYesThe command to execute (as a list of arguments or a shell string).
timeoutNoMaximum execution duration in seconds.
session_idYesThe ID of the session the job runs in.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that execution is asynchronous and in the background, but it omits permissions, side effects, failure behavior, and whether submitted commands can be destructive or long-running beyond the schema-provided timeout.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no wasted words, and the key qualifiers (asynchronous, background, session-scoped) are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 100% schema description coverage and an output schema, parameter and return details are already covered elsewhere. The description is minimally adequate, but for a job-submission tool with no annotations it could do more to mention monitoring, cancellation, or permission expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the four parameters are already fully documented by the schema. The description adds no additional syntax, format, or usage detail for session_id, command, inputs, or timeout, so this is the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (submits), resource (asynchronous command/job), and scope (within a session), plus the key behavioral qualifier that execution is in the background. It is clear but does not explicitly distinguish itself from sibling job tools such as get_job, wait_job, or cancel_job.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 routing to alternatives. The description only implies that this tool is for starting background commands, without saying when to prefer it over monitoring tools like get_job or wait_job.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_jobWait JobB

Blocks until a job completes, fails, or exceeds the specified timeout.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
timeoutNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It clearly discloses the blocking nature and the three termination conditions (completion, failure, timeout), which is essential for a wait operation. It does not cover permissions, concurrency, or timeout side effects, but the core behavior is well conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, well-structured sentence that is front-loaded with the key behavior and contains no wasted words. It is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 0% schema description coverage and no annotations, the description should provide more parameter context (especially for job_id) and usage guidance. While the output schema handles return values, the lack of parameter explanations and alternative references leaves the definition incomplete for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 for both parameters. It only references the timeout parameter briefly ('specified timeout') without explaining its units or default, and it does not mention job_id at all, leaving significant gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (blocks/waits) and resource (job), and its blocking behavior implicitly distinguishes it from non-blocking siblings like get_job. However, it does not explicitly name any alternative, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives such as get_job or list_jobs. It only describes behavior, leaving the agent to infer usage context without any stated exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

write_sessionWrite SessionC

Writes input data to an active terminal session.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesCommand or input string to send.
session_idYesID of the active session.
is_sensitiveNoIf True, masks the input as [REDACTED] in recorded history.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden yet only says it 'writes' input. It does not disclose what happens if the session is inactive, whether input is queued or sent immediately, error behavior, or that is_sensitive affects recorded history (that detail lives only in the schema). For a mutation tool with zero annotation coverage this is thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with no padding, and the core purpose is front-loaded. It is efficient, though its brevity reflects under-specification rather than ideal economy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and all three params are documented in the schema. Still, with no annotations and no usage or error-handling context, the description is only minimally viable for a state-mutating terminal tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents session_id, data, and is_sensitive (including the [REDACTED] masking behavior). The description adds no param-level meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Writes) and resource (input data to an active terminal session), which clearly separates it from read_session and create_session. It does not, however, explicitly name the sibling alternative, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use write_session versus create_session or read_session, nor any mention of prerequisites such as needing an already-active session. Usage is only implied by the phrase 'active terminal session'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv0.1.0
    • First observedcancel_job
    • First observedclose_session
    • First observedcreate_session
    • First observedget_device
    • First observedget_events
    • First observedget_job
    • First observedget_session
    • First observedlist_devices
    • First observedlist_jobs
    • First observedlist_sessions
    • First observedread_session
    • First observedresolve_device
    • First observedsubmit_job
    • First observedwait_job
    • First observedwrite_session

TDQS

B3.4/5.0

Scored across 15 tools

Disambiguation4/5

Tools are grouped by resource (sessions, jobs, events, devices) with clear action verbs, so most are easily distinguished. Minor overlap exists between get_device/resolve_device and write_session/submit_job, but descriptions clarify intent.

Naming Consistency5/5

All 15 tools follow a consistent snake_case verb_noun pattern (e.g., create_session, list_jobs, cancel_job). Plural nouns are used consistently for list operations.

Tool Count5/5

15 tools cover four coherent subdomains without obvious redundancy; each tool maps to a distinct operation. The count is at the upper end of the ideal range but remains well-scoped.

Completeness4/5

Session, job, and device lifecycles are largely covered (create/read/list/write/close for sessions; submit/get/list/wait/cancel for jobs; list/get/resolve for devices). Minor gaps include no session metadata update/rename and no device registration, but core workflows are supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Terminal-first SSH access for MCP clients and AI agents, enabling interactive remote sessions, file uploads, and stateful workflows.
    5
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that bridges AI assistants to real terminal sessions, enabling creation, management, and interaction with persistent PTY processes for running commands, monitoring output, and debugging.
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to connect to remote MCP servers once, access their tools through a compact MCP endpoint, pair a CLI inside sandboxes, and create watches that turn command or tool output into pollable structured events.
    2
    -