Atlas / MCP servers / wolfbrandon / otis

otisCAUTION

mcp/wolfbrandon/otis

Design terminal UIs on a character grid: boxes, tables, layers and every Omarchy theme. Export to Markdown, ANSI or PNG, and let your AI draw in it over MCP.

Verdict
CAUTION
Grade
B
Trust score
88 /100
Exposed tools
14 5r · 6w · 3d
Transport
—
License
MIT
Stars
0
01

Overview

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

[](https://github.com/WolfBrandon/otis/actions/workflows/test.yml) [](https://github.com/WolfBrandon/otis/releases) [](LICENSE)

A design app for terminal UIs. Draw boxes, text, arrows, cursors and block graphics on a grid of character cells, the way you'd lay out a screen in a graphics app. Then export it as Markdown, plain text, ANSI or PNG.

It's built for Omarchy folks, but it works for anyone who designs TUIs. It ships with every stock Omarchy theme, so you can see a design in each of them. And your AI assistant can draw in it with you, live.

[Try it in your browser](https://wolfbrandon.github.io/otis/). There's nothing to install, and your designs stay in your browser. (The online demo counts visits with GoatCounter, without cookies. OTIS itself never phones home.) New to OTIS? The how-to walks from your first screen through tabs, popups and TextArt to building it with your AI agent.

AI agents: to install OTIS for your user, fetch and follow https://raw.githubusercontent.com/WolfBrandon/otis/main/INSTALL.md

Install

Ask your AI agent. Tell Claude Code, Codex, Grok, OpenCode, Pi or whichever agent you use:

Install https://github.com/WolfBrandon/otis as an app

On Omarchy 4 you can hand it straight to your default agent: omarchy agent prompt "Install https://github.com/WolfBrandon/otis as an app".

Or run the installer yourself:

curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash

Either way

Read from source at commit e2b81f6776e6OBSERVED · 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.

claude-code
claude mcp add otis -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "otis": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Exposed tools (14)

5 read · 6 write · 3 destructive. Blast radius: 3 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
add_objectswriteAdd objects to a tab of a project. Returns their ids and a fresh render.
create_projectwriteStart a new design, optionally with objects, and open it in OTIS.
delete_objectsdestructiveDelete objects by id (on any tab, including objects inside groups). The user can undo it in OTIS with Ctrl+Z.
edit_layerdestructiveAdd, rename, show, hide, lock, unlock, raise, lower or delete a layer of a tab. Layers stack bottom to top; lines only join with lines on the same layer, so popups and overlays belong on their own layer.
edit_tabwriteTabs are the screens of a design (main view, settings, help...), each with its own canvas size and layers. Add, duplicate, rename, move or delete a tab, or show it in the OTIS window. New tabs get the first tab\
get_palettereadThe project\
get_projectreadThe full project as OTIS JSON (every tab with its layers, objects and every field). Use render for a quicker look.
insert_snippetwritePlace a snippet (from list_snippets) with its top-left corner at x, y. Several pieces come in as one group.
list_projectsreadList saved OTIS projects, newest first, and which one is open in OTIS.
list_snippetsdestructiveReady-made widgets you can drop in with insert_snippet: progress bars, sparklines, charts, tables, tabs, dialogs, status lines, plus the user\
renderreadShow one tab of a project as text, the way it looks on the canvas. With the ruler (default) it has column numbers on top and row numbers down the left, plus a list of every object with its id and position. Use it to see a design before you change it. format
show_projectreadSwitch the OTIS window to a project (and optionally one of its tabs) so the user can see it.
update_objectswriteChange objects by id (on any tab): set any of their fields,
update_projectwriteRename the project, resize a tab\
04

Trust audit

CAUTIONgrade B · trust 88/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 surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (14 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
none-found

Findings (13)

MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Dockerfile:25
CMD wget -qO- http://127.0.0.1:6847/api/health || exit 1
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
install.sh:113
running() { curl -fsS -m 1 "http://127.0.0.1:$PORT/api/health" >/dev/null 2>&1; }
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
install.sh:220
[[ $PORT != 6847 ]] && echo "export OTIS_URL=http://127.0.0.1:$PORT"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
install.sh:427
version=$(curl -fsS -m 2 "http://127.0.0.1:$PORT/api/health" 2>/dev/null | sed -n 's/.*"version":"\([^"]*\)".*/\1/p')
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_objects, edit_layer, list_snippets
Why it matters. 3 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
packaging/aur/.SRCINFO
.SRCINFO
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
server.js:72
const etagOf = (text) => '"' + crypto.createHash('sha1').update(text).digest('hex').slice(0, 16) + '"';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:195
server that isn't on `http://127.0.0.1:6847`.
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
CHANGELOG.md:63
as an app"), or with one line: `curl -fsSL .../install.sh | bash`. OTIS goes
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
INSTALL.md:23
curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
README.md:42
curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
docs/HOWTO.md:18
curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
skills/otis/SKILL.md:65
In short: `curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash`

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha e2b81f6776e6full audit observations/trust-audit/mcp-server/wolfbrandon__otis.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-12e2b81f6776e6CAUTIONB88first audit
06

Questions

What is the otis MCP server?

Design terminal UIs on a character grid: boxes, tables, layers and every Omarchy theme. Export to Markdown, ANSI or PNG, and let your AI draw in it over MCP.

What tools does otis expose?

14 in total: 5 read-only, 6 that write, and 3 that can delete or overwrite (delete_objects, edit_layer, list_snippets). Every one is listed on this page with its risk.

Is otis safe to connect to an agent?

With care. The audit graded it B (88/100) and found 13 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does otis need?

No credential environment variables were found in its source, so it appears to need none.

How current is this page?

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

Advertisement