Skip to main content
Glama
tiefeiyu
by tiefeiyu

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.

Python 3.11+ MCP 1.x Windows POSIX uv License

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 snapshotsprocess_screen captures 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

ls, echo, build 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 launch

Requires 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-mcp

The 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

process_start

Start a subprocess with optional args, cwd, env, timeout

process_read

Read output records (stdout/stderr/stdin/both) within a time window

process_read_new

Read output produced since the last read (per source, server-side cursor)

process_write

Write content to a process's stdin

process_signal

Send an OS-native signal to a process

process_list

List all managed processes with summary info

process_inspect

Get detailed info about a process

process_kill

Kill a single process (output data retained)

process_kill_all

Kill all managed processes

process_clear

Clear I/O records for a process

process_cleanup

Remove a terminated process and all its data

process_screen

Snapshot the live screen of a PTY process (for full-screen TUIs)

program_query

Look up whether a program needs a PTY (persistent registry)

program_record

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 run

  • args (optional): List of command-line arguments

  • cwd (optional): Working directory

  • env (optional): Environment variables (merged with current env)

  • timeout_ms (optional): Idle timeout in milliseconds (0 = no timeout)

  • pty (optional, default false): Run on a virtual PTY instead of pipes — set true for programs that check isatty() (ssh, gdb, psql, REPLs) or render full-screen TUIs (vim, htop, less); when in doubt, use true (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 ID

  • source (optional): stdout, stderr, stdin, or both (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 ID

  • source (optional): stdout, stderr, or both (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 ID

  • content (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 ID

  • signal (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_read with source="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) via process_write; a KeyboardInterrupt traceback is expected output

  • process_signal on PTY processes supports only SIGTERM (terminate, a hard kill on Windows), SIGKILL (kill) and CTRL_C_EVENT (graceful Ctrl+C); other signals are rejected

  • exit code is null on 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 isatty()

ssh, gdb, psql, mysql, telnet, REPLs

pty: true

Full-screen TUI

vim, htop, top, less, man

pty: true

Interactive flags

-i / -it / -t

pty: true

One-shot / batch

python -c, build commands

pty: false

Paged one-shots

git log/diff, less

pipe mode + --no-pager/GIT_PAGER=cat

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/ -v

License

MIT — free to use, modify, distribute, and integrate into commercial projects, with attribution.

Author

Developed and maintained by TieFeiyu.

Available Tools

13 tools
process_cleanupA

Remove a terminated process and all its data. Only allowed for processes with status 'exited' or 'killed'.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInternal process ID.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInternal process ID.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInternal process ID.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInternal process ID.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior1/5

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

No annotations are provided, so the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives, 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInternal process ID.
unitNoTime unit for duration.ms
sourceNoWhich output stream to read.both
durationNoHow far back to read (in the specified unit).

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInternal process ID.
colsNoOptional: resize width first.
rowsNoOptional: resize height first.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInternal process ID.
signalYesOS 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

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cwdNoWorking directory.
envNoEnvironment variables (merged with current env).
ptyNoRun 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.
argsNoCommand-line arguments.
commandYesExecutable or command to run.
timeout_msNoIdle timeout in milliseconds. Process is killed and cleaned up if no tool interaction occurs for this duration. 0 = no timeout.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInternal process ID.
contentYesContent to write to stdin.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
programYesExecutable name, e.g. 'ssh'.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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').

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional caveats or context.
programYesExecutable name.
needs_ptyYesWhether the program needs a PTY.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 13 tool updatesv0.1.0
    • First observedprocess_cleanup
    • First observedprocess_clear
    • First observedprocess_inspect
    • First observedprocess_kill
    • First observedprocess_kill_all
    • First observedprocess_list
    • First observedprocess_read
    • First observedprocess_screen
    • First observedprocess_signal
    • First observedprocess_start
    • First observedprocess_write
    • First observedprogram_query
    • First observedprogram_record

TDQS

A4.2/5.0

Scored across 13 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides 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.
    152
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    14
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables AI agents to start and manage pseudo-terminal sessions, run shell commands and interact with REPLs programmatically.
    7
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables spawning, interacting with, and capturing screen output from terminal-based programs for debugging PTY/TTY/TUI applications.
    16
    7
    MIT