Atlas / MCP servers / kitepon / aiterm-mcp

aiterm-mcpBLOCK

mcp/kitepon/aiterm-mcp

One persistent MCP terminal your AI drives — and launches other coding agents (Codex/Grok/Composer) into. SSH, containers, and REPLs nest as text you send in. tmux-backed, token-reduced reads, headless over MCP.

Verdict
BLOCK
Grade
F
Trust score
57 /100
Exposed tools
9 8r · 1w · 0d
Transport
stdio
License
MIT
Stars
6
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

From any MCP client, launch Claude Code, Codex CLI, Grok CLI, or Cursor Agent CLI through one harness API inside a persistent interactive TUI.

This image represents different intelligences sharing one persistent workspace and advancing the same work from their own perspectives.

[](https://github.com/kitepon/aiterm-mcp/actions/workflows/ci.yml) [](https://www.npmjs.com/package/aiterm-mcp) [](https://www.npmjs.com/package/aiterm-mcp) [](https://nodejs.org) [](LICENSE)

(日本語: README.ja.md)
Let your AI orchestrate other AIs. One agent_launch call selects the execution harness separately from its model and hands you a persistent session to drive. Cursor can run GPT, Claude, or Grok while Cursor still owns the session, hooks, and transcript. What it is: one persistent MCP terminal your AI drives — and can launch other coding agents into. ssh, docker exec, a REPL, or another agent's TUI all nest inside that one terminal as just text you send in. The mechanism is deliberately plain — your MCP client drives the other agent's terminal turn by turn: no hidden protocol, no separate aiterm-owned shared-memory layer, no autonomous negotiation. Launched agents still read the normal project and harness memory/configuration that a direct CLI launch would use. No human at a terminal required. aiterm is driven programmatically over MCP, so an AI can launc
Read from source at commit 6ed15160cac7OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add aiterm-mcp -- npx -y [email protected]
03

Exposed tools (9)

8 read · 1 write · 0 destructive.

ToolRiskDescription
agent_launchread
diagnosticsread
pty_closereadセッションを閉じ、ログ/読取位置を破棄する。
pty_keyread制御キーを送る(C-c, C-d, Enter, Tab, Up, Down... の別名に対応)。
pty_listread握っているセッション一覧(名前 / 現在の前面コマンド / attach 状態 / サイズ)。
pty_openreadローカル永続端末(tmux セッション)を1個開き、session_id を返す。
pty_readreadセッションの出力をトークン削減して読む(既定は前回読取位置からの増分)。
pty_sendwriteセッションへテキスト(コマンド)を送る。送信後の出力は pty_read で取得する。
readread試験用の固定文字列を返す
04

Trust audit

BLOCKgrade F · trust 57/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (9 observation(s))
Network
declared (4 observation(s))
Shell
declared (6 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/update-cli.ts:7
"--hostは~/.ssh/configの接続名かホスト名です。接続先は保存しません。--checkは入れ替えずに現在の版と更新先だけを確かめます。\n" +
Why it matters. touches a credential store
HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
rag/sources/ansi-handling/terminal-coding-agent-context-engineering.md:2271
with independently designed layers ensures that no single bypass compromises safety: schema gating prevents
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
rag/sources/completion-detection/roo-code-shell-integration-fallback.md:79
## What is Shell Integration?[](#what-is-shell-integration "Direct link to What is Shell Integration?")
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
rag/sources/completion-detection/roo-code-shell-integration-fallback.md:97
## Terminal Integration Settings[](#terminal-integration-settings "Direct link to Terminal Integration Settings")
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
rag/sources/completion-detection/roo-code-shell-integration-fallback.md:104
### Command Execution Timeout Settings[](#command-execution-timeout-settings "Direct link to Command Execution Timeout Settings")
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
rag/sources/completion-detection/roo-code-shell-integration-fallback.md:108
#### `roo-cline.commandExecutionTimeout`[](#roo-clinecommandexecutiontimeout "Direct link to roo-clinecommandexecutiontimeout")
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
rag/sources/completion-detection/roo-code-shell-integration-fallback.md:127
#### `roo-cline.commandTimeoutAllowlist`[](#roo-clinecommandtimeoutallowlist "Direct link to roo-clinecommandtimeoutallowlist")
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/parent-hook-diagnostic.ts:29
const value: unknown = JSON.parse(readFileSync(file, "utf8").replace(/^/u, ""));
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
rag/sources/discoverability/claude-code-mcp-configuration.md:624
--dsn "postgresql://readonly:[email protected]:5432/analytics"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/runtime-error-report.test.mjs:14
const SECRET = "bughub-test-secret-do-not-use-0123456789abcdef";
LOWInventory / provenance · inv.binary · CWE-1104
rag/sources/completion-detection/libes-expect-paper.md
libes-expect-paper.md
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
rag/sources/safety/cert-vu763073-iterm2-tmux-rce.md
cert-vu763073-iterm2-tmux-rce.md
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
rag/sources/safety/xterm-bracketed-paste-spec.md
xterm-bracketed-paste-spec.md
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/tmux-runtime.ts:27
export const WIN_NS = `aiterm-${createHash("sha1").update(SOCKDIR).digest("hex").slice(0, 12)}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/experiments/codex-queue-hook.test.mjs:140
const url = `http://127.0.0.1:${http.address().port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/experiments/codex-stdio-relay.test.mjs:93
const baseUrl = `http://127.0.0.1:${http.address().port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/codex-parent-hooks-official.test.mjs:113
const url = `http://127.0.0.1:${http.address().port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/codex-relay-official.test.mjs:104
const baseUrl = `http://127.0.0.1:${http.address().port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/core-agent.test.mjs:3749
[{ message: "unexpected status 401 Unauthorized: fixture: token expired, url: http://127.0.0.1:43221/v1/responses",
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
rag/sources/safety/cyberark-dont-trust-this-title.md:260
* [Email](/cdn-cgi/l/email-protection#300f4345525a5553440d735f5e44555e441056425f5d105d49107845521116515d400b525f54490d735855535b105f4544104758514416130003090b431058514040555e595e5710514410734952554271
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
rag/sources/safety/cyberark-dont-trust-this-title.md:271
* [Email](/cdn-cgi/l/email-protection#3e014d4b5c545b5d4a037d51504a5b504a1b0c0e584c51531b0c0e53471b0c0e764b5c1b0c0f185f534e055c515a47037d565b5d551b0c0e514b4a1b0c0e49565f4a1b0c094d1b0c0e565f4e4e5b505750
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
rag/sources/safety/cyberark-dont-trust-this-title.md:1000
* [Email](/cdn-cgi/l/email-protection#f5ca8680979f909681c8b09b92999c869dd0c7c5d0b0c7d0cdc5d0ccc6d0c7c5b68c979087b4879ed0c7c5a69a938182948790d0c7c5bc9b96d0c7c286d0c7c5bd8097d0c7c59d9486d0c7c59790909bd0
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
test/process-runtime.test.mjs:66
assert.equal(aitermProcessProbe('"C:\\Program Files\\PowerShell\\7\\pwsh.exe" -NoLogo -NoProfile -NonInteractive -EncodedCommand JABFAHIAcgBvAHIAQQBjAHQAaQBvAG4AUAByAGUAZgBlAHIAZQBuAGMAZQA9ACcAUwB0AG8
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
test/pty-observation.test.mjs:101
const probe = row(30, 11, 30, '"C:\\Program Files\\PowerShell\\7\\pwsh.exe" -NoLogo -NoProfile -NonInteractive -EncodedCommand JABFAHIAcgBvAHIAQQBjAHQAaQBvAG4AUAByAGUAZgBlAHIAZQBuAGMAZQA9ACcAUwB0AG8Ac
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
test/agent-models.test.mjs:59
["grok-4.7-low-fast", "Grok 4.7 Low Fast"],

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 6ed15160cac7full audit observations/trust-audit/mcp-server/kitepon__aiterm-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-126ed15160cac7BLOCKF57first audit
06

Questions

What is the aiterm-mcp MCP server?

One persistent MCP terminal your AI drives — and launches other coding agents (Codex/Grok/Composer) into. SSH, containers, and REPLs nest as text you send in. tmux-backed, token-reduced reads, headless over MCP.

What tools does aiterm-mcp expose?

9 in total: 8 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is aiterm-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (57/100) and found 7 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does aiterm-mcp need?

It reads AITERM_AUTH_TEST_MARKER, GROK_AUTH_PATH and XAI_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does aiterm-mcp run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as aiterm-codex-relay-experiment at 0.58.4.

How current is this page?

The grade is for one exact copy of the source (6ed15160cac7), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement