Atlas / MCP servers / dwgx / SmartCLI

SmartCLICAUTION

mcp/dwgx/smartcli

Three Agent Skills over one pluggable PTY + pyte core: drive TUIs, design terminal effects, and render cell-accurate UIs. pip install smartcli-toolkit

Verdict
CAUTION
Grade
D
Trust score
69 /100
Exposed tools
—
Transport
stdio
License
MIT
Stars
5
01

Overview

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

Python · MIT · ★4

docs · PyPI

Read this in: English · 简体中文 · 繁體中文 · 日本語 · 한국어

A local Python toolkit for driving, perceiving, and rendering the terminal — three agent skills over one pluggable PTY + `pyte` core.

[](https://pypi.org/project/smartcli-toolkit/) [](https://pypi.org/project/smartcli-toolkit/) [](https://github.com/dwgx/SmartCLI/actions/workflows/ci.yml) [](https://codecov.io/gh/dwgx/SmartCLI) [](LICENSE) [](https://pypi.org/project/smartcli-toolkit/) [](#features) [](#install)

**Let an AI drive, per

Read from source at commit fb6b12ee6a78OBSERVED · 2026-10-11
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 (pypi)
claude mcp add smartcli-toolkit -- uvx smartcli-toolkit==0.3.5
03

Trust audit

CAUTIONgrade D · trust 69/100 Install with care. The audit found things worth knowing before you trust its output.

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

What the source does

Filesystem
none-observed
Network
declared (2 observation(s))
Shell
declared (7 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
skills/cmd-art/fx/registry.py:106
importlib.import_module(mod_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
skills/drive-tui/_vendor/smartcli_core/__main__.py:29
mod = importlib.import_module(mod_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
skills/drive-tui/patterns/registry.py:72
importlib.import_module(mod_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
skills/tui-ui/ui/registry.py:82
importlib.import_module(mod)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
smartcli_core/__main__.py:29
mod = importlib.import_module(mod_name)
LOWInventory / provenance · inv.binary · CWE-1104
docs/site/assets/drive-dialog.webm
drive-dialog.webm
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
docs/site/assets/drive-htop-macos.webm
drive-htop-macos.webm
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
docs/site/assets/drive-htop.webm
drive-htop.webm
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
docs/site/assets/drive-lazygit-macos.webm
drive-lazygit-macos.webm
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
docs/site/assets/drive-lazygit-windows.webm
drive-lazygit-windows.webm
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.hidden_file · CWE-1104
.coveragerc
.coveragerc
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.readthedocs.yaml
.readthedocs.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
skills/tui-ui/self_test.py:48
cases = [("é", 1), ("界", 2), ("♀️", 1), ("👩💻", 4),
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/_diff_fuzz_tmux.py:94
"\U0001F600", "♀️", "\U0001F469\U0001F4BB",  # emoji incl. joiners
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/_diff_fuzz_tmux.py:184
if "" in text:
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/_diff_tmux_pyte.py:230
("ZWJ emoji sequence", "x\U0001F469\U0001F4BBy\r\nabcdefg\r\n".encode(), 40, 8),
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/test_cell_span_regression.py:94
self.check_label("👨👩👧 \x1b[7mOK\x1b[0m tail", "OK")
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
docs/requirements.txt
mkdocs-material
Why it matters. 1 requirement(s) not pinned with ==
Fix. pin exact versions
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
requirements.txt
pyte, mcp
Why it matters. 2 requirement(s) not pinned with ==
Fix. pin exact versions
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/LAUNCH-COPY.md:106
`[SmartCLI](https://github.com/dwgx/SmartCLI) - Drive interactive terminal programs (vim, htop, lazygit) from any MCP client: start a session, send keys, wait on screen state, read the rendered cell g
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWInventory / provenance · mcp.no_tools_extracted · CWE-1104
server.json
Why it matters. the tool list is enumerated at runtime by tools/list, not declared in source
Fix. the page says so rather than showing an empty table
INFOInventory / provenance · inv.oversize · CWE-1104
docs/site/assets/fx-rain.mp4
docs/site/assets/fx-rain.mp4
Why it matters. 1843509 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
docs/site/assets/fx-rain.webm
docs/site/assets/fx-rain.webm
Why it matters. 2523991 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
docs/site/assets/fx-solarsystem.gif
docs/site/assets/fx-solarsystem.gif
Why it matters. 1111701 bytes not read
INFOInventory / provenance · inv.oversize · CWE-1104
showcase/fx-solarsystem.gif
showcase/fx-solarsystem.gif
Why it matters. 1111701 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha fb6b12ee6a78full audit observations/trust-audit/mcp-server/dwgx__smartcli.json · Report an issue / request a re-scan
04

Audit history

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

DateSourceVerdictGradeScoreChange
2026-10-11fb6b12ee6a78CAUTIOND69first audit
05

Questions

What is the SmartCLI MCP server?

Three Agent Skills over one pluggable PTY + pyte core: drive TUIs, design terminal effects, and render cell-accurate UIs. pip install smartcli-toolkit

Is SmartCLI safe to connect to an agent?

With care. The audit graded it D (69/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does SmartCLI need?

It reads SMARTCLI_TUI_TOKEN 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 SmartCLI run?

It speaks stdio, so it runs as a local process your client starts. It is published on PyPI as smartcli-toolkit.

How current is this page?

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

Advertisement