The settings belong to whoever runs the service.
The agent never changes these. They belong to the person who installs and runs MCP Console, in the environment where it runs. Settings are read by the service: setting a variable in another shell does not reconfigure it. Coordinate changes with its owner because some take effect on later operations and others need a restart. An ordinary stop can end existing terminals, so read persistent terminals first.
MCP Console runs real commands as its own service account, with that account's files, network access, programs and inherited environment. Configure it for a group of people who are trusted with that environment: use a separate approved command environment for unrelated groups.
What the service needs on the machine.
| Requirement | Detail |
|---|---|
| Operating system | Linux (amd64, arm64). On macOS and Windows, MCP Console runs in the managed Linux environment that AIDC Launch provides |
| Shells | bash (the default), sh, zsh or fish, installed in the service environment |
| Utilities | A compatible base64 -d for structured command execution |
| Reload continuity | Ask the service owner whether this installation supports persistent terminals through the intended reload |
| Network | Local terminal use needs no external service; workloads use the environment's available network, and browser access needs its provided route |
In the MAIT image, Console is available through MCP Registry as console, with browser access enabled. A standalone installation can differ. Ask its owner which connection and browser route are provided before changing settings.
Pick one transport with serve.
Outside the registry, choose one MCP transport with mcp-console serve:
| Transport | Command | Notes |
|---|---|---|
| Standard input and output | mcp-console serve --transport stdio | The MCP client starts and owns the process; closing its input stops the service |
| Unix socket | mcp-console serve --transport unix --socket /absolute/private/dir/console.sock | Create the socket's parent as a private directory only your account can enter; the server deletes any file already at the socket path, so use a path that holds nothing else. Do not use /tmp. |
| HTTP | mcp-console serve --transport http --http-addr 127.0.0.1:8080 | Keep HTTP on loopback, or put an authenticated, encrypted proxy that you operate in front of it. |
--session-mode per-connection is the default and gives each connection its own terminal namespace. --session-mode shared puts every connection in one namespace, so everyone connected can operate on one another's terminals; use it only where all participants trust each other's work. Reconnecting does not restore an earlier session.
For standard input and output, capture standard error separately, because standard output carries the protocol. Leave MAIT_LOG_FORMAT=json unset there: that log format writes to standard output and breaks the stream.
Keep the service account's runtime directory private and ask its owner to resolve startup failures. Accept a new service with the first command and named-shell exercise in Get started. If reload continuity or browser access is required, verify each separately; a first command does not establish either.
How many terminals, and how long they live.
| Setting | Default | Effect |
|---|---|---|
MCP_CONSOLE_MAX_TERMINALS | 50 | Most terminals one connection may hold |
MCP_CONSOLE_MAX_ATTACHED_IDLE | 3600 seconds | Idle time after which an attached terminal is detached (persistent) or closed (not persistent) |
MCP_CONSOLE_MAX_DETACH_DURATION | 86400 seconds | Age after which a detached persistent terminal is closed |
The cleanup check runs every five minutes, so these are not exact deadlines. Plan capacity with the service owner and inspect actual terminals after concurrent creation requests. A malformed number falls back to the default and zero is not a general way to switch a limit off. Do not use these settings as resource isolation or billing limits.
Defaults for terminal_watch and terminal_stats.
| Setting | Default | Effect |
|---|---|---|
MCP_CONSOLE_RESOURCE_INTERVAL_MS | 2000 | Default interval of a resource watch, held between 500 and 300000 milliseconds |
MCP_CONSOLE_RESOURCE_DEFAULT_SUSTAINED_MS | 15000 | How long a threshold must stay exceeded before an alert |
MCP_CONSOLE_RESOURCE_CADENCE_MS | 1000 | How often the shared process snapshot is refreshed |
A single watch can set its own interval and sustained time. Asking more often than the snapshot cadence returns the same measurement.
Let a person join one terminal from a browser.
| Setting | Default | Effect |
|---|---|---|
MCP_CONSOLE_WEB | Off | Turns the bridge on when set to exactly 1, true, yes or on (lowercase) |
MCP_CONSOLE_WEB_ADDR | A detected address, port 7680 | IP address and port, for example 127.0.0.1:7680, used both to listen and to build the attachUrl. Host names are not accepted |
MCP_CONSOLE_WEB_MAX_CONN | 4 | Live browser connections admitted per terminal |
The bridge works beside any MCP transport, standard input and output included, so turning it on adds a network listener even when MCP has none. For a browser on the same machine:
MCP_CONSOLE_WEB=1 MCP_CONSOLE_WEB_ADDR=127.0.0.1:7680 mcp-console serve --transport unix --socket /absolute/private/dir/console.sock
Reach it only through an HTTPS route you operate, and only from trusted clients. Because one address is used to listen and to advertise, an address the service cannot bind locally, such as a host port mapped into a container, cannot be set directly. For access through a reverse proxy or tunnel, keep the local address and forward the scheme, host, port, path, query string and WebSocket at the proxy; a page served over HTTPS uses a secure WebSocket. The returned attachUrl is built from configuration and does not prove the listener started: if binding fails, the service logs it and MCP keeps working.
Each terminal must still be opted in one by one with web: true. What the person with the link can do, and how to take it back, is in Let a person watch or type:
- A link is a credential: anyone who holds it can read the terminal, type into it and resize it. Send it only through a private channel agreed in advance, and never put it in a public issue, screenshot or diagnostic.
- Confirm the HTTPS route with the service owner before confidential input is typed.
- Repeating
web: truereplaces the private link. Disable the link withweb: false. To end browser access at once, close the terminal withterminal_close. - Disable the link with
web: falsebefore you detach a terminal. Plan for the idle-cleanup rules even while someone is typing in the browser. - Obtain a new private link after a reload.
What survives a handoff, a reload and a stop.
A persistent terminal supports a cooperative handoff while the service remains available and can survive a supported reload when the installation preserves it. It is not a job queue and does not promise survival through an ordinary stop, host restart or loss of the execution environment.
| What ends | What happens to a persistent terminal |
|---|---|
| The owning session is reclaimed while the service remains running | Active persistent terminals are detached for later attachment; other terminal records are cleaned up |
| A supported service reload arranged by the owner | Eligible work may return detached when the installation preserves it |
An ordinary stop (SIGTERM, SIGINT or closing standard input) | The service attempts to close every terminal it tracks, persistent ones included. Setting persistent: true does not turn a stop into a reload, so do not count on continuity |
| The required execution environment or continuity state is lost | Prior work cannot be recovered through attachment |
Closing a Unix or HTTP connection alone does not establish session cleanup and can leave terminal records and work present until explicit close, expiry or service shutdown. Closing standard input for a client-owned stdio server stops that service; it is the ordinary-stop case above. Close or detach owned terminals deliberately before disconnecting.
After a reload, persistent terminals can return detached with reconstructed basic details. Execution history, read positions, run captures, watches, browser links and original timestamps are not restored. Read the current output and establish the workload's actual state before continuing. A tracked command can defer idle cleanup for up to 24 hours; browser activity and statistics or frame polling do not keep a terminal active by themselves.
For work that must survive machine loss, the workload needs its own checkpoints and saved results. The steps for an actual handoff are in Hand a terminal to the next connection.
How often tools may be called and how long they wait.
| Limit | Value |
|---|---|
| All console tools together | 600 calls per minute |
terminal_run | 60 calls per minute |
terminal_stats | 120 calls per minute |
| The other terminal tools together | 120 calls per minute |
terminal_run foreground wait | 120 seconds by default, set with timeout |
A wait inside terminal_send | Ten seconds at most |
Limits refill over time and allow an initial burst. A call that is too frequent returns an error with a retry interval. Client and transport deadlines can end a wait separately.
What is kept, where, and what you must protect.
| Data | Where it lives | How long |
|---|---|---|
| Terminal processes and screen history | The selected execution environment | Until closed, cleaned up or continuity is lost |
| Run-output captures | Service memory, at most 500 entries and 64 MiB | Until evicted or the service restarts |
| Frame history | Service memory, 120 frames per terminal | Until evicted or the terminal closes |
| Browser links | Service memory | Until replaced, disabled or the service restarts |
| Persistent-terminal metadata | The installation's continuity state | Until the terminal closes |
Commands can write files and use the environment's network. Keep required reports and checkpoints in the workload's durable output; do not treat terminal history as its only copy.
- Treat access to any console endpoint, socket or
attachUrlas permission to run commands as the service account. - Keep each socket in a directory only your account can enter, and keep HTTP on loopback, or put an authenticated, encrypted proxy that you operate in front of it.
- Avoid inheriting credentials that the intended commands do not need.
- Remove browser links, environment values, command arguments and unrelated terminal text from any diagnostic you share.