Can See

io.github.HurleySkPublished by GitHub account HurleySkv0.4.0Updated Oct 24, 2026

Let AI agents see and interact with terminal/CLI apps via PNG screenshots

VerifiedSTDIODesktop onlyBrowser AutomationDeveloper Tools

Overview

AI-generated overview

A local MCP server that launches terminal/CLI apps in virtual terminals so an assistant can screenshot them as PNGs, read their output, and send keys to drive T

What you can do
Launch CLI apps in virtual terminal sessions and list, close or close all sessions, with process status and exit codes available. Capture the terminal as PNG screenshots, including a region, a text-matched region, or a diff against a saved baseline. Read the visible buffer or scrollback as plain text and query cell characters, colors and attributes. Wait for text, idle output, a color at a position, or process exit. Send keystrokes and typed text to interact with the app. Record frames into an animated GIF.
When to use it
Useful when debugging TUI apps, interactive CLI wizards or anything whose visual terminal output (colors, layout, cursor position) matters more than plain text. Lets an agent see what a user sees and step through interactive prompts.
Requirements
Runs locally over stdio as the npm package can-see (npx -y can-see or a global install). Needs Node.js and native compilation of node-canvas and node-pty, so build tools are required: Visual Studio Build Tools on Windows, Xcode Command Line Tools on macOS, and Cairo/Pango development libraries on Linux. Optional environment variables DEFAULT_COLS, DEFAULT_ROWS and IDLE_TIMEOUT_MS tune terminal size and idle auto-close.
Before you install
The launch tool can start arbitrary CLI programs and accepts an env option to set environment variables for them, and send_keys/send_text drive those programs, so the assistant can run commands and change state on your machine. Sessions stay open until closed or until IDLE_TIMEOUT_MS elapses; close them when done. Screenshots and recordings may capture sensitive terminal content.

Installation

In SourceWeft

  1. Open Can See in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

can-see

[npm version] [npm downloads] [license] [node]

MCP server that lets AI agents see and interact with terminal/CLI applications through virtual terminals and PNG screenshots.

Built for Claude Code and any MCP-compatible agent.

Why?

Some things are easier to show than describe. When debugging a TUI app, an interactive CLI wizard, or anything with visual terminal output, can-see lets the agent see exactly what you see — colors, layout, cursor position, and all.

How it works

  1. Launch a CLI app in a virtual terminal (node-pty + @xterm/headless)
  2. Screenshot the terminal as a PNG image (rendered via node-canvas)
  3. Send keys/text to interact with the app
  4. Screenshot again to see the result
  5. Close the session when done

Installation

bash
npm install -g can-see

Prerequisites

can-see depends on node-canvas (Cairo) and node-pty, which require native compilation. Most systems will need:

  • Windows: Visual Studio Build Tools (C++ workload) — npm install --global windows-build-tools or install from Visual Studio Installer
  • macOS: Xcode Command Line Tools — xcode-select --install
  • Linux: sudo apt install build-essential libcairo2-dev libjpeg-dev libpango1.0-dev libgif-dev librsvg2-dev

Configuration

Claude Code

Add to your project's .mcp.json:

json
{  "mcpServers": {    "can-see": {      "command": "npx",      "args": ["-y", "can-see"]    }  }}

Or if installed globally:

json
{  "mcpServers": {    "can-see": {      "command": "can-see"    }  }}

Other MCP clients

can-see uses stdio transport. Point your MCP client at the can-see binary or npx -y can-see.

Tools

ToolDescription
launchStart a CLI app in a virtual terminal. Returns a sessionId. Accepts optional env to set environment variables.
screenshotCapture the terminal as a PNG image.
screenshot_regionCapture a specific rectangular area of the terminal.
screenshot_text_regionFind text in the viewport and capture the surrounding area as a PNG.
capture_baselineSnapshot terminal state for later diff comparison.
diff_screenshotCompare current state against baseline with highlighted changes.
get_cell_infoQuery character, colors, and attributes at specific cell(s). Supports compact mode for reduced output.
read_textRead the terminal buffer as plain text.
read_scrollbackRead text that scrolled above the visible viewport.
wait_for_textWait until specific text appears in the terminal buffer.
wait_for_idleWait until terminal output has been stable for a given duration. Supports stableMs for content-comparison mode (for apps with timers/spinners), excludeRows to ignore specific rows, and excludePattern (regex) for dynamic row exclusion.
wait_for_colorWait until a specific color appears at a position.
wait_for_exitWait until the process exits and return its exit code and signal.
start_recordingBegin capturing frames for an animated GIF.
stop_recordingStop recording and return the animated GIF with metadata (frameCount, durationMs). Auto-trims frames or saves to file if GIF exceeds inline size limit.
send_keysSend keystrokes (e.g., Enter, Ctrl+C, ['Down', 'Down', 'Enter']).
send_textType a string of text into the app.
get_process_statusGet process status — distinguish "app is idle" from "app has exited". Returns PID, running state, exit code.
list_sessionsList all active terminal sessions.
closeKill the app and clean up. Always close when done.
close_allKill all active sessions at once. Useful for cleanup between test runs.

Supported keys

Enter, Tab, Escape, Backspace, Space, Up, Down, Left, Right, Home, End, Delete, PageUp, PageDown, Ctrl+A through Ctrl+Z.

Environment variables

VariableDefaultDescription
DEFAULT_COLS120Terminal width in columns
DEFAULT_ROWS30Terminal height in rows
IDLE_TIMEOUT_MS300000Auto-close idle sessions after this many ms (5 min)

Example usage

From an MCP-connected agent:

Agent: I'll launch your app to see what's happening.→ launch("node", ["app.js"])  → sessionId: "abc-123"
Agent: Let me wait for the app to start.→ wait_for_text("abc-123", "Ready")  → Found "Ready" after 1200ms
Agent: Let me read the current output.→ read_text("abc-123")  → "Welcome to MyApp\nReady\n> "
Agent: I can see the prompt. Let me select option 2.→ send_keys("abc-123", ["Down", "Enter"])
Agent: Waiting for the screen to settle.→ wait_for_idle("abc-123")  → Terminal idle for 520ms
Agent: Let me check the result.→ screenshot("abc-123")  → [PNG image showing result]
Agent: Done, closing the session.→ close("abc-123")

Changelog

0.5.0

New tools:

  • wait_for_exit — wait for process exit, get exit code and signal
  • close_all — kill all active sessions at once
  • get_process_status — distinguish "app is idle" from "app has exited"
  • screenshot_text_region — find text in viewport, capture surrounding area as PNG

Enhancements:

  • launch accepts env parameter for custom environment variables
  • wait_for_idle supports excludePattern (regex) for dynamic row exclusion in stableMs mode
  • stop_recording returns frameCount and durationMs metadata alongside GIF
  • get_cell_info supports compact option for reduced output ({char, fg, bold} only)

Bug fixes:

  • Fixed wait_for_text and wait_for_color race condition where text/color present in the final buffer was missed when the process exited simultaneously
  • Added mutual exclusion validation when both stableMs and idleMs are passed to wait_for_idle

License

MIT

Source: README.md at commit 98dd50b

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.4.0LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts