portal
Portal is an MCP server for starting, interacting with, and managing interactive terminal programs (SSH, REPLs, TUIs, etc.) via tool calls.
Start processes with arguments, working directory, environment, idle timeout, and optional PTY mode for interactive/TUI programs
Read process output by time window or incrementally since last read, from stdout/stderr/stdin, with ANSI stripping
Write to stdin including sending Ctrl+C interrupts to PTY processes
Send OS signals to processes (full signal set in pipe mode; limited PTY signal support)
List and inspect running/managed processes with metadata and I/O counts
Kill individual processes or all processes; kill-all is immediate
Clear or clean up process I/O records and terminated process data
Snapshot live PTY screens for full-screen TUIs like vim/htop/less, with optional resize
Query and record persistent program registry facts about whether executables need a PTY
Allows interaction with the MySQL command-line client as an interactive process, providing tools to start, monitor, read/write I/O, and control it.
Click on "Install 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., "@portalStart a psql session and run: SELECT * FROM users;"
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.
Portal — MCP Server for Interactive Programs
An MCP (Model Context Protocol) server purpose-built for interactive programs. Start, monitor, read/write I/O, and control processes that need sustained bidirectional interaction — all through MCP tool calls. Where a one-shot Shell tool hangs on interactive programs, Portal is designed for them.
Why Portal
AI agents (Claude, Cursor, …) can drive interactive programs the way they drive a shell — minus the hanging:
Interactive programs, end to end — start, read/write I/O, signal, and kill processes that require sustained bidirectional interaction (SSH, GDB, database CLIs, REPLs, full-screen TUIs).
Real terminal (PTY) support — ConPTY on Windows (10 1809+) and ptyprocess on POSIX. Programs that check
isatty()(ssh, gdb, psql, REPLs) behave exactly as they do in a human-run terminal.Full-screen TUI snapshots —
process_screencaptures the live screen of vim, htop, less and other full-screen TUIs, whose raw record streams are garbled fragments.Never hangs, never orphans — a per-process idle timeout kills stuck programs and cleans up their data.
Learns from experience — a persistent, machine-global registry (
program_query/program_record) remembers which executables need a PTY, with a confirmation counter so settled facts stick.Clean output — ANSI escape sequences stripped; I/O history stored in SQLite with timestamps, queryable per source (stdout / stderr / stdin).
Cross-platform — Windows and POSIX, Python 3.11+, run via uv with zero installation.
When to use it
Situation | Examples | Use |
Interactive programs | ssh, gdb, psql, mysql, telnet, REPLs | Portal |
Full-screen TUIs | vim, htop, less, top, man | Portal |
One-shot commands |
| built-in Shell tool |
Related MCP server: PTY MCP Server
Quick Start
No package installation needed — Portal runs directly with uv:
uv sync # optional: pre-create .venv; `uv run` auto-syncs on first launchRequires uv and Python 3.11+. Dependencies are
managed by uv from pyproject.toml: mcp (1.x), aiosqlite, pyte, plus
pywinpty (Windows) / ptyprocess (POSIX).
MCP client configuration
Add to your MCP client configuration (e.g., Claude Code), substituting
<PORTAL_PATH> with the absolute path of this repo:
{
"mcpServers": {
"portal": {
"type": "stdio",
"command": "uv",
"args": ["run", "--project", "<PORTAL_PATH>", "portal-mcp"]
}
}
}Claude Code one-liner:
claude mcp add portal -- uv run --project "<PORTAL_PATH>" portal-mcpThe PORTAL_DB_PATH environment variable controls the SQLite database
location. By default each server instance uses its own file,
.portal/portal-<pid>-<timestamp>.db in the working directory — created
fresh on every startup, kept as timestamped history, and named
per-instance so a lingering or concurrent server can never lock the
file and block a new one.
One-Click Install
Copy the prompt from llms-install.md into your AI
agent to automatically install and configure Portal.
MCP Tools
Tool | Description |
| Start a subprocess with optional args, cwd, env, timeout |
| Read output records (stdout/stderr/stdin/both) within a time window |
| Read output produced since the last read (per source, server-side cursor) |
| Write content to a process's stdin |
| Send an OS-native signal to a process |
| List all managed processes with summary info |
| Get detailed info about a process |
| Kill a single process (output data retained) |
| Kill all managed processes |
| Clear I/O records for a process |
| Remove a terminated process and all its data |
| Snapshot the live screen of a PTY process (for full-screen TUIs) |
| Look up whether a program needs a PTY (persistent registry) |
| Record a confirmed program fact in the persistent registry |
Tools Reference
process_start
Start a subprocess and begin capturing its output.
command(required): Executable or command to runargs(optional): List of command-line argumentscwd(optional): Working directoryenv(optional): Environment variables (merged with current env)timeout_ms(optional): Idle timeout in milliseconds (0 = no timeout)pty(optional, defaultfalse): Run on a virtual PTY instead of pipes — settruefor programs that checkisatty()(ssh, gdb, psql, REPLs) or render full-screen TUIs (vim, htop, less); when in doubt, usetrue(see Virtual PTY support)
Returns: id, os_pid, status
process_read
Read captured output from a process. Resets the idle timer.
id(required): Internal process IDsource(optional):stdout,stderr,stdin, orboth(default:both)duration(optional): How far back to read (default: 1000)unit(optional): Time unit —ns,us,ms,s(default:ms)
Returns: List of records with timestamp, source, content
process_read_new
Read output produced since the last call to this tool, for the requested source. Resets the idle timer.
id(required): Internal process IDsource(optional):stdout,stderr, orboth(default:both)
The server remembers the read position per process and per source, so
repeated calls return each record exactly once, in insertion order.
Only the requested source's cursor advances — reading stdout never
causes stderr records to be skipped and vice versa. process_read
(time-window) does not affect these cursors; process_clear resets
them.
Returns: List of records with timestamp, source, content
process_write
Write content to the process's stdin. Only works while running.
id(required): Internal process IDcontent(required): String to write
process_signal
Send an OS signal. On Windows, supports CTRL_C_EVENT (0) and
CTRL_BREAK_EVENT (1). On POSIX, supports the full signal set
(SIGTERM, SIGKILL, SIGINT, etc.).
id(required): Internal process IDsignal(required): Signal name or number
process_list
List all managed processes.
Returns: Array of {id, os_pid, status, timeout_ms, inactive_duration_ms, io_count}
process_inspect
Get full details of a single process.
id(required): Internal process ID
Returns: All metadata plus io_count, stdout_count, stderr_count, stdin_count
process_kill
Kill a single process. Output data is retained for later reading.
id(required): Internal process ID
process_kill_all
Kill all managed processes immediately.
process_clear
Clear all I/O records for a process. The table remains, records are deleted.
id(required): Internal process ID
process_cleanup
Remove a terminated process and all its data. Only allowed for exited
or killed processes.
id(required): Internal process ID
Virtual PTY Support
By default Portal runs programs on OS pipes. Programs that check
isatty() (ssh, gdb, psql, interactive REPLs) or render full-screen
TUIs (vim, htop, less) need a virtual PTY instead: pass "pty": true
to process_start. On Windows this uses ConPTY (Windows 10 1809+);
on POSIX it uses ptyprocess.
PTY mode differences from pipe mode:
stdout and stderr are merged into one console stream (
process_readwithsource="stderr"returns empty)records are arbitrary chunks, not lines — a line may span multiple records, and prompts may arrive without a trailing newline
input you write is echoed back into the output stream (real terminal behavior) — treat echoes as your own input
to interrupt a PTY process, write
and a carriage return as two separate writes (Ctrl+C then Enter — split delivery is measurably more reliable) viaprocess_write; aKeyboardInterrupttraceback is expected outputprocess_signalon PTY processes supports only SIGTERM (terminate, a hard kill on Windows), SIGKILL (kill) and CTRL_C_EVENT (graceful Ctrl+C); other signals are rejectedexit code is
nullon Windows (ConPTY exposes none)
process_screen snapshots the live screen of a PTY process — use it
for full-screen TUIs, whose record streams are garbled fragments.
Passing cols/rows resizes the live PTY first; omitting them is a
pure snapshot. The screen stays queryable after exit until
process_cleanup.
Choosing pty
Signal | Examples | Decision |
Checks | ssh, gdb, psql, mysql, telnet, REPLs |
|
Full-screen TUI | vim, htop, top, less, man |
|
Interactive flags |
|
|
One-shot / batch |
|
|
Paged one-shots | git log/diff, less | pipe mode + |
When in doubt, use pty: true — a non-interactive program tolerates
a PTY; an interactive one without one hangs.
Program registry
program_query / program_record maintain a persistent, machine-global
registry (programs.db in the platform app-data dir, or
PORTAL_DATA_DIR if set) of which executables need a PTY. Agents
record conclusions after first encounters — including negatives.
Repeated confirmation increments confirmed_count (>= 2 means
settled); recording the opposite value resets it (a correction).
Process Lifecycle
START → RUNNING → EXITED → (read-only, data retained)
→ KILLED → (read-only, data retained)
→ timeout → KILL + CLEANUP (data removed)READ and WRITE operations reset the idle timer, preventing timeout kills.
ANSI Stripping
All color codes and cursor movement sequences (\x1b[...m, \x1b[...J,
etc.) are stripped from output before storage. In pipe mode content is
otherwise stored as-is, preserving whatever newline conventions the
process uses; in PTY mode bare carriage returns (\r) are also removed
(ConPTY emits \r\n).
Architecture
MCP Client
│ JSON-RPC (stdio)
▼
Portal MCP Server
├── ProcessManager (lifecycle + timeout monitor)
│ └── ManagedProcess (per-process wrapper)
│ └── asyncio.subprocess.Process
└── Database (SQLite via aiosqlite)
├── processes table (metadata)
└── proc_<id> tables (I/O records)Development
# Sync the uv environment (includes pytest)
uv sync
# Run tests
uv run pytest tests/ -vLicense
MIT — free to use, modify, distribute, and integrate into commercial projects, with attribution.
Author
Developed and maintained by TieFeiyu.
Available Tools
13 toolsprocess_cleanupA
Remove a terminated process and all its data. Only allowed for processes with status 'exited' or 'killed'.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Internal process ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses destructive behavior ('Remove... all its data') and the status constraint, but does not mention error handling, reversibility, or consequences of calling on non-eligible processes, leaving some ambiguity.
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 sentence, efficient and free of redundancy. It conveys purpose and eligibility without unnecessary details.
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 simple tool with one parameter and no output schema, the description covers the core purpose and usage constraint. It could be more complete by specifying outcomes for invalid calls, but overall it is adequate and not misleading.
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 input schema fully describes the 'id' parameter (100% coverage), and the description adds no additional meaning beyond the schema. The baseline of 3 applies as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Remove a terminated process and all its data'), with a specific resource and scope. It distinguishes from siblings like process_kill and process_clear by focusing on terminated processes and their data cleanup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit eligibility condition ('Only allowed for processes with status 'exited' or 'killed''), giving clear when-to-use context. It does not explicitly name alternatives or discuss when not to use, but the constraint implicitly guides usage among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_clearA
Clear all I/O records for a process. The process table remains, but records are deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Internal process ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It clearly states that records are deleted and the process table is preserved, which conveys the destructive nature and the scope of the operation. However, it does not mention reversibility, permissions, or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the main action, and contains no filler or redundancy. 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?
For a simple tool with one parameter and no output schema, the description fully explains the tool's effect (clears I/O records, keeps process table) and is complete. No additional context is needed.
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 input schema has 100% coverage with the parameter 'id' described as 'Internal process ID.' The description adds no additional meaning beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('clear') and resource ('all I/O records for a process'), and distinguishes itself from siblings like process_kill by noting the process table remains. This makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by explaining that I/O records are deleted while the process table remains, but it does not explicitly state when to use this tool versus alternatives like process_cleanup or process_kill. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_inspectA
Get detailed information about a single process including all metadata and per-stream I/O counts.
For PTY processes: stderr_count is always 0 (merged stream) and I/O counts are chunk-based, not line-based; exit_code is null on Windows (ConPTY exposes none).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Internal process ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does an excellent job by revealing important platform-specific behaviors (PTY stderr_count always 0, chunk-based counts, exit_code null on Windows ConPTY). These details are not evident from the schema and are valuable for interpreting results. It could be more exhaustive about error cases or required privileges, but it goes beyond a simple statement of intent.
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 concise: two sentences. The first sentence front-loads the core purpose, and the second adds essential caveats. No wasted words or redundant details. Every sentence earns its place, making it easy to quickly comprehend the tool's function and nuances.
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 no output schema, the description must give the agent a sense of what to expect. It mentions 'all metadata and per-stream I/O counts' and provides specific examples (stderr_count, exit_code) with caveats. This is moderately complete, though it could detail the full return structure or mention failure scenarios. Overall, it is sufficient for a single-process inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage for the single parameter 'id' with the description 'Internal process ID.' The tool description does not add further semantics to the parameter, such as how to obtain the ID or any format constraints. Since the schema fully documents the parameter, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Get detailed information about a single process' including metadata and per-stream I/O counts. This distinguishes it from sibling tools like process_list (which lists processes), process_kill, and process_start, making its purpose unmistakable.
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 usage context is clear: use this tool when you need detailed information about one process, identified by its id. It does not explicitly mention alternatives or exclusions, but the 'single process' phrasing combined with sibling names like process_list implies the appropriate selection. A direct pointer to process_list for listing would have earned a 5, but the context is otherwise unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_killA
Kill a single process. Its output data is retained for reading. Use process_cleanup to remove it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Internal process ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description must disclose behavioral traits. It does state two important behaviors: the process is killed and its output data is retained. It also implies that process_cleanup is needed to remove the data. However, it does not clarify whether the kill uses a specific signal, whether it is reversible, or what happens to the process's resources beyond output retention. This is adequate but leaves 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?
The description is two short sentences that each earn their place. The first states the core action, the second adds critical behavioral context and points to the cleanup tool. No waste, front-loaded with the primary verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description covers the essential information: what it does, what happens to output, and how to fully clean up. It is slightly incomplete in not specifying return behavior or whether the kill is graceful, but for a simple kill operation this is sufficient.
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 input schema fully documents the single parameter 'id' as an internal process ID (100% coverage). The description adds no additional meaning about the parameter, but since the schema already covers it, a baseline 3 is appropriate.
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 the exact action ('Kill a single process') with a specific verb and resource. It distinguishes from siblings by explicitly saying 'single process' (contrasting with process_kill_all) and by indicating 'output data is retained' (contrasting with process_cleanup).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: when you need to kill a process but retain its output. It explicitly names process_cleanup as the alternative for removing the output, and 'single process' differentiates from kill_all. It does not mention when to use process_signal or other alternatives, so it misses explicit exclusion guidance, but the core guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_kill_allB
Kill all managed processes.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 merely restates the tool name with 'managed' added, and gives no warning about irreversibility, side effects, or that this terminates all processes. For a destructive operation, this is a significant omission.
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 concise sentence that front-loads the verb and object. It is appropriately sized for a zero-parameter tool, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the tool is simple, the description omits critical context for a kill-all operation: whether it is destructive, what 'managed processes' means, and what happens afterward. With no output schema or annotations, the description is insufficient for safe 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?
There are zero parameters, so the baseline is 4. The description does not need to explain parameter meanings, and none are present. It does not add any parameter semantics, but none are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Kill all managed processes' clearly states the action (kill) and the scope (all managed processes), and distinguishes from the sibling tool process_kill (which presumably targets a single process).
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, no exclusions, and no mention of prerequisites or consequences. The description only states what it does, not when it should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_listA
List all managed processes with summary info: id, os_pid, status, timeout, idle duration, and I/O record count.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the tool return a list of summary information including specific fields, implying a read-only overview. It does not mention side effects, but for a simple listing tool this is adequate.
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 sentence that front-loads the action and resource, lists the returned fields, and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with no parameters and no output schema, the description provides the key return fields and states the scope ('all managed processes'). It is complete enough for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty input schema, so there are no parameter semantics to clarify. The baseline for zero-parameter tools is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'List all managed processes with summary info' with a specific verb (list) and resource (managed processes), and enumerates the summary fields, distinguishing it from sibling tools like process_inspect or process_kill.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: to list all managed processes at a summary level. It does not explicitly exclude other tools or name alternatives, but the purpose is evident, and the sibling tools' names signal the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_readA
Read output from a process. Reads records from the specified time window. Resets the process idle timer.
For PTY processes stderr is merged into stdout (source=stderr reads return empty) and records are arbitrary chunks, not lines — a line may span multiple records. Prompts may arrive without a trailing newline. Read with a generous duration — the default window is only 1s.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Internal process ID. | |
| unit | No | Time unit for duration. | ms |
| source | No | Which output stream to read. | both |
| duration | No | How far back to read (in the specified unit). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure responsibility. It reveals significant behavioral traits: idle timer reset, PTY stderr merging, chunked records, prompts without newlines, and the short default window. This goes well beyond a generic 'read' statement.
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 compact and front-loaded. The first sentence states the core purpose, followed by a short functional summary, then a tight paragraph with high-value edge cases. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential behavioral quirks and usage advice, making it nearly complete for a read tool. It does not describe the return format (e.g., list of records), but the absence of an output schema is partially mitigated by the mention of 'records' and 'chunks'. A brief note on return shape would push this to 5.
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 already describes all parameters (100% coverage). The description adds context around duration ('default window is only 1s') and the source parameter for PTY processes, reinforcing the interaction between unit and duration. This elevates it above the baseline 3, though the schema already carries most parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read output from a process' – a specific verb and resource. It immediately distinguishes this from sibling tools like process_write, process_list, and process_kill. The scope ('specified time window') and the additional behavior ('Resets the process idle timer') further clarify purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear situational guidance, such as 'Read with a generous duration — the default window is only 1s' and explains PTY-specific behavior (stderr merged, chunks not lines). However, it does not explicitly name alternatives or state when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_screenA
Snapshot the live screen of a PTY process. For full-screen TUIs (vim, htop, less): the record stream is garbled fragments — use this tool instead of process_read. Screen remains queryable after exit until process_cleanup. Snapshot is pure; passing cols/rows resizes the live PTY first. buffer is 'primary' or 'alternate' (the TUI's alternate screen).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Internal process ID. | |
| cols | No | Optional: resize width first. | |
| rows | No | Optional: resize height first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavior. It states that the snapshot is pure but that passing cols/rows resizes the live PTY, and that the screen stays queryable until process_cleanup. It also explains buffer semantics. However, it does not describe the return value format, so it is not a perfect 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and packs a lot of behavioral detail into a compact paragraph. The buffer sentence is somewhat terse and could be clearer, and the overall structure is a single dense block rather than separated sections, but it remains efficient.
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 description covers when to use the tool, side effects, lifecycle, and parameter effects, which is strong for a tool with no output schema. The main gaps are the missing buffer parameter in the schema and the lack of an explicit return format, keeping it from being fully 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 descriptions are minimal, but the description adds meaningful context: cols/rows resize the live PTY first, and buffer is described as 'primary' or 'alternate'. However, the buffer parameter is not actually present in the input schema, which is a significant mismatch that prevents a perfect score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Snapshot the live screen of a PTY process' with a specific verb and resource. It further distinguishes from the sibling tool process_read by explicitly mentioning the TUI use case, making the purpose unmistakable.
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 explicitly says 'use this tool instead of process_read' for full-screen TUIs, providing a clear when-to-use instruction and naming the alternative. The note about the screen remaining queryable after exit also clarifies its lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_signalA
Send a signal to a process by name or number. Available signals: SIGABRT, SIGALRM, SIGBUS, SIGCHLD, SIGCLD, SIGCONT, SIGFPE, SIGHUP, SIGILL, SIGINT, SIGIO, SIGIOT, SIGKILL, SIGPIPE, SIGPOLL, SIGPROF, SIGPWR, SIGQUIT, SIGRTMAX, SIGRTMIN, SIGSEGV, SIGSTKFLT, SIGSTOP, SIGSYS, SIGTERM, SIGTRAP, SIGTSTP, SIGTTIN, SIGTTOU, SIGURG, SIGUSR1, SIGUSR2, SIGVTALRM, SIGWINCH, SIGXCPU, SIGXFSZ. For PTY processes only SIGTERM -> terminate, SIGKILL -> kill, and CTRL_C_EVENT -> Ctrl+C are supported; other signals are rejected with an error. For a graceful interrupt use process_write: send and a carriage return as two separate writes(split delivery).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Internal process ID. | |
| signal | Yes | OS signal name (e.g., SIGTERM, SIGKILL, SIGINT) or signal number. PTY processes support SIGTERM, SIGKILL and CTRL_C_EVENT only; signal numbers in the help text refer to pipe mode. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses important behavioral details: PTY processes only support SIGTERM, SIGKILL, and CTRL_C_EVENT, and other signals are 'rejected with an error.' It also gives a workaround for graceful interrupts. However, it does not mention what happens on a successful signal send (e.g., return value) or state that sending a signal like SIGKILL is destructive, though that is inherent to the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, but the long list of signal names makes it somewhat bulky. However, every element serves a purpose: the signal list is a valuable reference not fully covered by the schema. The additional sentences about PTY limitations and process_write are concise and actionable. It could be improved by shortening the signal list (e.g., referencing a standard set) but remains appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (signal handling, PTY-specific behavior) and absence of an output schema, the description addresses the key contextual points: supported signals, error behavior for unsupported signals, and an alternative for graceful interrupts. It does not explain the return format on success, but that is less critical for this type of tool. Overall, it provides sufficient context for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by enumerating all acceptable signal names in its 'Available signals' list, which the schema only exemplifies ('e.g., SIGTERM, SIGKILL, SIGINT'). It also clarifies PTY-specific signal restrictions, complementing the schema's note about signal numbers. This goes beyond the schema's provided details, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Send a signal to a process by name or number.' It lists available signals, which distinguishes it from the more specific process_kill sibling, though it doesn't explicitly name alternative tools. The phrase 'by name or number' is slightly ambiguous—it could refer to the process or the signal—but the context and following signal list resolve it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: it specifies which signals are supported for PTY processes and that others are rejected, and it explicitly recommends process_write as an alternative for graceful interrupts ('For a graceful interrupt use process_write: send and a carriage return as two separate writes'). This clearly tells the agent when to use this tool and when to use a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_startA
Start a subprocess for interactive use. Use this for interactive programs like SSH, GDB, psql, python REPL, etc. — not for simple one-shot commands. Returns the internal process ID, OS PID, and initial status.
pty — default false for backward compatibility; this is NOT a recommendation. Set true for anything interactive or TUI (ssh, gdb, psql/mysql, REPLs, vim, htop, top, less; anything with -i/-it/-t flags). Consult program_query for this executable BEFORE starting. When in doubt, true — a non-interactive program tolerates a PTY; an interactive one without one hangs. Exception: one-shot commands that page output (git log/diff, less) — prefer pipe mode with --no-pager/GIT_PAGER=cat.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Working directory. | |
| env | No | Environment variables (merged with current env). | |
| pty | No | Run on a virtual PTY instead of pipes. True for programs that need a terminal (see tool description). Default false for backward compatibility — NOT a recommendation. | |
| args | No | Command-line arguments. | |
| command | Yes | Executable or command to run. | |
| timeout_ms | No | Idle timeout in milliseconds. Process is killed and cleaned up if no tool interaction occurs for this duration. 0 = no timeout. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses return values (internal process ID, OS PID, initial status), PTY vs pipe behavior, and hang risks. However, it omits details on failure modes, cleanup, and interaction after start, leaving some transparency 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?
The description is efficiently structured: a front-loaded purpose statement, return value summary, then a focused PTY guidance paragraph. Every sentence adds value, and the length is appropriate for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a start command, the description covers the essential context: when to use, return values, and the critical PTY decision. Missing lifecycle details (how to interact later) are implied by sibling tools, so the description is reasonably complete without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description enriches the 'pty' parameter with detailed guidance and examples well beyond the schema, but does not add value for other parameters (cwd, env, etc.) beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool starts a subprocess for interactive use, with specific examples (SSH, GDB, psql). It explicitly contrasts with one-shot commands, distinguishing its purpose from sibling tools like process_list or process_kill.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('interactive programs'), when-not-to-use ('not for simple one-shot commands'), and alternative approaches ('pipe mode with --no-pager/GIT_PAGER=cat'). It also instructs to consult program_query before starting, offering clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_writeA
Write content to a process's stdin. Only available while the process is running.
Input you write reappears in the output stream (terminal echo) — treat it as your own input, not program output, and do not re-send it. To interrupt a PTY process, send and a carriage return as two separate writes (Ctrl+C then Enter — ConPTY is line-buffered; split delivery is measurably more reliable); a KeyboardInterrupt traceback in output is expected, not an error. process_signal/process_kill are fallbacks — see their descriptions for the PTY signal mapping (CTRL_C_EVENT is a graceful interrupt, not a hard stop).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Internal process ID. | |
| content | Yes | Content to write to stdin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that written input reappears in the output stream as echo, cautions against re-sending it, and explains that KeyboardInterrupt traceback is expected. This goes well beyond any annotation (none provided) and covers critical PTY 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 front-loaded with the purpose in the first sentence, followed by necessary behavioral caveats and usage guidance. It is relatively long but every sentence provides value, and the structure is logical.
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?
Covers the main usage, conditional availability, echo behavior, interrupt handling, and fallback alternatives. No output schema exists, but the description adequately addresses the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already fully describes both parameters (id and content) with 100% coverage. The description reinforces that content is written to stdin but adds no additional parameter semantics beyond that.
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 first sentence uses a specific verb 'Write' and resource 'process's stdin', clearly differentiating it from sibling tools like process_read or process_signal. It also notes the availability constraint 'while process is running'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool for writing input, and directs to process_signal/process_kill as fallbacks for interrupts. Provides detailed usage instructions for sending Ctrl+C via two separate writes, including the reasoning about ConPTY line-buffering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
program_queryA
Look up whether a program needs a PTY in the persistent program registry. Call BEFORE process_start. A miss is a normal result, not an error — it means apply the decision rules in the instructions. confirmed_count >= 2 means settled; a single confirmation is a hint — re-verify on first use.
| Name | Required | Description | Default |
|---|---|---|---|
| program | Yes | Executable name, e.g. 'ssh'. |
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 explains that a miss is a normal result and provides thresholds for confirmed_count (>=2 settled, 1 is a hint). This is valuable context, though it does not describe the exact return structure or side effects (though none are expected for a query).
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 tightly structured in three sentences: purpose, usage timing, and result interpretation. Each sentence provides distinct and necessary information without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter lookup with no output schema, the description covers the essential aspects: what it does, when to call it, and how to interpret results. It omits detailed return formatting, but the provided semantics are sufficient for correct usage in the intended workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'program' is fully described in the schema with an example ('ssh'). The tool description does not add parameter-specific semantics or format details, so the baseline score of 3 for high schema coverage is appropriate.
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 action ('look up') on a specific resource ('persistent program registry') and clarifies the goal ('whether a program needs a PTY'). It clearly distinguishes itself from sibling process-management tools by focusing on registry querying rather than process operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit temporal guidance: 'Call BEFORE process_start.' It also explains how to interpret a miss and apply decision rules. However, it does not mention when not to use the tool or direct users to alternative tools, which prevents a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
program_recordA
Record a confirmed program fact in the persistent registry after observing its behavior: needs_pty true if it required a terminal (TTY error, hang in pipe mode, or TUI rendering with pty:true), false if it ran fine without one. Record every first-encounter conclusion, including negatives. notes should carry flag-specific caveats (e.g. 'docker run -it only, not docker build').
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Optional caveats or context. | |
| program | Yes | Executable name. | |
| needs_pty | Yes | Whether the program needs a PTY. |
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 does this well by detailing what needs_pty means (TTY error, hang in pipe mode, TUI rendering) and setting the policy to record every first-encounter conclusion, including negatives. It also specifies notes content with an example. Missing details about behavior for existing records or persistence semantics, but it covers the essential behavioral traits.
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 concise and front-loaded, with no unnecessary words. The first sentence establishes the primary purpose and the key parameter semantics; the second sentence adds an important usage directive and notes guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Considering the tool's simplicity (3 parameters, no output schema, no annotations), the description is quite thorough. It explains the purpose, the meaning of the boolean, the recording policy, and what to include in notes. It doesn't address what happens if a record already exists (whether it updates or errors), which is a minor gap for a registry tool, but overall it is adequate for the intended use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, providing baseline descriptions for all parameters. The description adds extra meaning beyond the schema: it clarifies the semantic meaning of needs_pty with concrete detection criteria, explains that negatives should also be recorded, and gives an example for notes. This goes beyond the baseline of 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 clearly states the tool's purpose with a specific verb ('Record') and resource ('confirmed program fact in the persistent registry'), and it distinguishes itself from siblings like program_query by focusing on recording rather than querying. It also narrows the scope to needs_pty, making it highly specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: after observing program behavior and confirming a first-encounter conclusion, including negatives. It does not explicitly name alternatives like program_query or state when not to use it, but the instructions are sufficiently clear for the intended use case.
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.
13 tool updates
v0.1.0- First observed
process_cleanup - First observed
process_clear - First observed
process_inspect - First observed
process_kill - First observed
process_kill_all - First observed
process_list - First observed
process_read - First observed
process_screen - First observed
process_signal - First observed
process_start - First observed
process_write - First observed
program_query - First observed
program_record
TDQS
Scored across 13 tools
Each tool has a clearly distinct purpose: listing vs inspecting, killing one vs all, clearing data vs removing process, and reading vs writing vs signaling. The process_* and program_* prefixes further separate management from registry operations, leaving no ambiguity.
All tools follow a consistent noun_verb snake_case pattern, with process_ for process operations and program_ for registry operations. Verbs are descriptive and uniform (list, inspect, kill, read, write, etc.), making the pattern predictable.
With 13 tools, the set is well-scoped for a process management server, covering start, interaction, monitoring, control, and cleanup. Each tool earns its place and the count is appropriate for the domain.
The tool surface covers the full lifecycle of managed processes: start, read, write, signal, kill, clear, cleanup, list, inspect, and screen snapshot. The program registry adds query/record for PTY decisions, completing the workflow without evident gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Run commands and read/write files on your servers over Termalin's keyless tunnels (hosted MCP).
Remote shell and detached long-running jobs on your own machines — no SSH, open ports or VPN.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Manage Sprites: sandboxed compute environments with exec, services, and checkpoints.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides tools for executing shell commands both synchronously and asynchronously with real-time output streaming and process management capabilities. It enables users to start background tasks, monitor progress, and manage long-running processes via Stdio or HTTP transports.152MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage interactive pseudo-terminal (PTY) sessions for programs requiring full terminal emulation like vim, ssh, and interactive REPLs. It provides tools to spawn sessions, send input with escape sequences, and read buffered terminal output.14MIT
- FlicenseAqualityDmaintenanceEnables AI agents to start and manage pseudo-terminal sessions, run shell commands and interact with REPLs programmatically.7-
- AlicenseNot gradedqualityCmaintenanceEnables spawning, interacting with, and capturing screen output from terminal-based programs for debugging PTY/TTY/TUI applications.167MIT