Terminal Session Manager
This MCP server lets an agent manage persistent terminal sessions, background jobs, event history, and device resolution without exposing secrets.
Create, list, inspect, write to, read from, and close persistent terminal sessions.
Optionally bind sessions to registered devices by nickname/UUID; omit device for local terminal.
Read ordered session events with cursor pagination via
since_sequenceandlimit(capped at 200).Submit asynchronous commands/jobs to sessions with optional stdin inputs and timeout.
Query, list, wait for, and cancel background jobs.
List, retrieve, and resolve registered devices; device resolution omits secrets and reports credential availability.
Mask sensitive session input as
[REDACTED]and automatically redact credentials/tokens from read output.
Runs local terminal sessions and background jobs natively via /bin/sh on Linux (and other Unix-like systems).
Runs local terminal sessions and background jobs natively via /bin/sh on macOS.
Persists sessions, jobs, event history, devices, and encrypted credentials in a local SQLite database using the standard library sqlite3 module.
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., "@Terminal Session Managerstart a terminal session and run npm test"
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.
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:
SessioneSessionStatus(created,running,waiting,completed,failed,closed,lost) com máquina de estados e validação estrita de transições.JobeJobStatus(created,running,completed,failed,cancelled,timeout) com controle de ciclo de vida, códigos de saída e timestamps.Device,DeviceTypeeConnectionMethodpara catálogo de inventário e parametrização segura de conexões.CredentialRefeCredentialTypecom garantia estrutural de não armazenar nem vazar segredos ao agente ou histórico.EventeEventType(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,CredentialNotFoundErroreValidationError.
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
TerminalTransportsobre 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,resizeeclosecom 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()ewrite().
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,STDERReSTATE_CHANGE.Suporte a
write(..., is_sensitive=True)registrando eventos comis_masked=Truee 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 (
JobServiceemservices/job_service.py):Submissão não-bloqueante (
submit_job) com execução em thread dedicada e subprocesso isolado.Vínculo a
session_ide 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
TIMEOUTe 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 comoFAILED, 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.pyeservices/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 (
SessionServiceemservices/session_service.py):Gerencia instâncias de sessões interativas em memória (
LocalSession), integrando-as comSqliteSessionRepository,EventRepositoryeDeviceService.Suporte à escrita (
write_session) e leitura mascarada (read_session).
Servidor HTTP e Roteador (
APIServereTSMRequestHandleremapi/):Servidor multi-threaded baseado em
http.server.ThreadingHTTPServerda biblioteca padrão do Python.Autenticação local configurável via Bearer token (
Authorization: Bearer <token>) ouX-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 flagis_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}/jobsePOST /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 comsince_sequenceelimit).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_identifierao chamarcreate_session(ou enviarPOST /sessionscom{"name": "local"}) dispara diretamente oLocalProcessTransportnativo do SO (cmd.exeno Windows ou/bin/shno Linux/macOS). O catálogo de dispositivos é destinado a conexões remotas SSH.
Garantias de Segurança:
resolve_deviceresolve internamente parâmetros de conexão, validando existência e atividade do dispositivo, indicandohas_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.ymleconfig.py):Carregamento declarativo via
config.ymlcom 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_authsem token informado levantamConfigurationErrorimediato 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 (
0o600para banco e0o700para 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 syncExecuçã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 --versionEtapa 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 (
SSHTransportemtransports/ssh.py):Implementa o protocolo
TerminalTransport(open,read,read_stderr,write,resize,close,is_alive,exit_code) utilizandoparamiko>=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_shellcom 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 transporteSSHTransportinstanciado 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 (
SCPServiceemservices/scp_service.py):Desacoplado de
TerminalTransport, tratando transferências de arquivos com semântica dedicada.Suporta operações de
upload(local -> remoto) edownload(remoto -> local).Cada transferência é registrada e gerenciada como um
Jobassí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_hostsestrict_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_uploadescp_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 -vTodos 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 SQLiteAvailable Tools
15 toolscancel_jobCancel JobC
Cancels a running background job, terminating its process.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Human-readable name for the session. | default |
| device_identifier | No | Optional nickname or UUID of a registered device to bind. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name_or_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum events to return (capped at 200). | |
| session_id | Yes | Session identifier. | |
| since_sequence | No | Starting sequence number (inclusive cursor). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| only_active | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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. "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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| max_bytes | No | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name_or_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | No | Optional stdin lines to send. | |
| command | Yes | The command to execute (as a list of arguments or a shell string). | |
| timeout | No | Maximum execution duration in seconds. | |
| session_id | Yes | The ID of the session the job runs in. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Command or input string to send. | |
| session_id | Yes | ID of the active session. | |
| is_sensitive | No | If True, masks the input as [REDACTED] in recorded history. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries 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.
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.
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.
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.
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.
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.
15 tool updates
v0.1.0- First observed
cancel_job - First observed
close_session - First observed
create_session - First observed
get_device - First observed
get_events - First observed
get_job - First observed
get_session - First observed
list_devices - First observed
list_jobs - First observed
list_sessions - First observed
read_session - First observed
resolve_device - First observed
submit_job - First observed
wait_job - First observed
write_session
TDQS
Scored across 15 tools
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.
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.
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.
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
Related MCP Connectors
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
Hosted MCP memory and agent control plane for durable conversations, jobs, and operations.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceTerminal-first SSH access for MCP clients and AI agents, enabling interactive remote sessions, file uploads, and stateful workflows.51MIT
- AlicenseAqualityCmaintenanceMCP server that gives AI agents real interactive terminal sessions for running REPLs, SSH, database clients, and any interactive CLI with clean text output and smart completion detection.74918MIT
- AlicenseNot gradedqualityDmaintenanceAn 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.1MIT
- FlicenseNot gradedqualityCmaintenanceEnables 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-