MCPretentious API Reference
August 28, 2025 · View on GitHub
This document contains technical API details for developers who want to understand the tool internals.
Backend Support
MCPretentious supports multiple terminal backends:
- iTerm2 (macOS only): Uses iTerm2's WebSocket API with Protocol Buffers for high-performance control
- tmux (cross-platform): Works with tmux sessions on Linux, macOS, and other Unix-like systems
- Auto mode: Automatically selects the best available backend
Backend Selection
Set the backend using the MCP_TERMINAL_BACKEND environment variable:
auto(default): Automatically detect and use the best available backenditerm: Force iTerm2 backend (macOS only)tmux: Force tmux backend
Terminal ID Format
Terminal IDs vary by backend:
- iTerm2:
iterm-{windowId}-{tabIndex}(e.g.,iterm-12345-1) - tmux:
tmux:{sessionName}(e.g.,tmux:mcp-session-123)
Available Tools
mcpretentious-open
Opens a new terminal session with optional size specification. The backend used depends on availability and configuration (iTerm2 on macOS, tmux on any platform).
Parameters:
columns(number, optional): Initial width in columns (20-500, default: 80)rows(number, optional): Initial height in rows (5-200, default: 24)
Returns: Terminal ID for subsequent operations
Example Response:
{
"terminalId": "iterm-12345-1" // iTerm2 backend
// or
"terminalId": "tmux:session-name" // tmux backend
}
mcpretentious-type
Send text and keystrokes to a terminal.
Parameters:
terminalId(string, required): ID of the terminalinput(string | number | object | array): Input to send, can be:- String: Normal text to type (e.g.,
"ls -la") - Number: ASCII/extended ASCII code 0-255 (e.g.,
32for space,169for ©) - Object: Special key as
{key: 'name'}(e.g.,{key: "enter"}) - Array: Mix of the above for complex sequences
- String: Normal text to type (e.g.,
Supported Special Keys:
- Navigation:
tab,shift-tab,enter,return,escape,esc,backspace,delete - Arrows:
up,down,left,right - Movement:
home,end,pageup,pagedown - Control:
ctrl-athroughctrl-z - Function:
f1throughf12
mcpretentious-read
Reads the current screen contents from a terminal session. Always returns what's visible on screen (viewport), not scrollback history.
Parameters:
terminalId(string, required): ID of the terminallines(number, optional): Number of lines to read from the bottom of the screen
Returns: Plain text of the terminal screen content
mcpretentious-close
Closes the terminal session associated with the terminal ID.
Parameters:
terminalId(string, required): ID of the terminal
mcpretentious-list
Lists all currently open terminal sessions across all available backends (iTerm2, tmux, etc.).
Returns: JSON array of session objects with terminal IDs, backend names, and session metadata
mcpretentious-info
Gets terminal metadata including dimensions and session information.
Parameters:
terminalId(string, required): ID of the terminal
Returns: JSON with terminal metadata:
- Terminal ID
- Session ID
- Window ID (if available)
- Dimensions (columns × rows)
mcpretentious-resize
Resizes a terminal to specified dimensions.
Parameters:
terminalId(string, required): ID of the terminalcolumns(number, required): Width in columns (20-500)rows(number, required): Height in rows (5-200)
Returns: Success message with new dimensions
mcpretentious-mouse
Send mouse events to a terminal using SGR mouse protocol. Provides direct control over mouse button presses, releases, and drag events.
Parameters:
terminalId(string, required): ID of the terminal to send mouse events toevent(string, required): Mouse event type:"press": Mouse button down"release": Mouse button up"drag": Mouse movement with button held down
x(number, required): X coordinate (column position, 0-based)y(number, required): Y coordinate (row position, 0-based)button(string, required): Mouse button, can be:- Named buttons:
"left","middle","right","scrollUp","scrollDown" - Direct button codes:
"button-0"through"button-127"for SGR protocol codes
- Named buttons:
shift(boolean, optional): Shift key modifier (default: false)alt(boolean, optional): Alt/Option key modifier (default: false)ctrl(boolean, optional): Control key modifier (default: false)
Returns: Success message with event details
Examples:
// Simple left click at position (10, 5)
await use_mcp_tool("mcpretentious", "mcpretentious-mouse", {
terminalId: "iterm-12345-1",
event: "press",
x: 10,
y: 5,
button: "left"
});
await use_mcp_tool("mcpretentious", "mcpretentious-mouse", {
terminalId: "iterm-12345-1",
event: "release",
x: 10,
y: 5,
button: "left"
});
// Drag from (5, 5) to (15, 10)
await use_mcp_tool("mcpretentious", "mcpretentious-mouse", {
terminalId: "iterm-12345-1",
event: "press",
x: 5,
y: 5,
button: "left"
});
await use_mcp_tool("mcpretentious", "mcpretentious-mouse", {
terminalId: "iterm-12345-1",
event: "drag",
x: 15,
y: 10,
button: "left"
});
await use_mcp_tool("mcpretentious", "mcpretentious-mouse", {
terminalId: "iterm-12345-1",
event: "release",
x: 15,
y: 10,
button: "left"
});
// Right-click with Ctrl held
await use_mcp_tool("mcpretentious", "mcpretentious-mouse", {
terminalId: "iterm-12345-1",
event: "press",
x: 20,
y: 15,
button: "right",
ctrl: true
});
await use_mcp_tool("mcpretentious", "mcpretentious-mouse", {
terminalId: "iterm-12345-1",
event: "release",
x: 20,
y: 15,
button: "right",
ctrl: true
});
// Scroll up
await use_mcp_tool("mcpretentious", "mcpretentious-mouse", {
terminalId: "iterm-12345-1",
event: "press",
x: 40,
y: 12,
button: "scrollUp"
});
mcpretentious-screenshot
Takes a layered screenshot of the terminal screen with configurable data layers to minimize output size.
Parameters:
terminalId(string, required): ID of the terminallayers(array, optional): Data layers to include. Default:["text", "cursor"]. Options:"text": Terminal text content"cursor": Cursor position (absolute and relative)"fgColors": Foreground color map with palette"bgColors": Background color map with palette"styles": Combined style encoding (all attributes in one layer)"bold": Bold text markers only"italic": Italic text markers only"underline": Underline text markers only
region(object, optional): Specific viewport rectangle:left: Starting column from left (0-based)top: Starting row from top (0-based)width: Width in columnsheight: Height in rows
aroundCursor(number, optional): Number of lines to show around cursor (e.g., 5 shows 11 lines total)compact(boolean, optional): Skip empty lines and trim trailing spaces. Default: false
Returns: JSON with layered screen data:
{
"terminal": {
"width": 80,
"height": 24
},
"viewport": {
"mode": "aroundCursor", // "region", "aroundCursor", or "full"
"left": 0,
"top": 10,
"width": 80,
"height": 11
},
"cursor": {
"left": 35, // Column position from left
"top": 15, // Row position from top
"relLeft": 35, // Relative to viewport left
"relTop": 5 // Relative to viewport top
},
"text": ["line1", "line2", ...], // If "text" layer requested
"styles": ["..b..i..u..", ...], // If "styles" layer requested
"styleLegend": { // Included with style layers
".": null,
"b": "bold",
"i": "italic",
"u": "underline",
"I": "bold+italic",
"U": "bold+underline",
"J": "italic+underline",
"X": "bold+italic+underline"
},
"bold": [" X X ", ...], // If "bold" layer requested
"italic": [" X X ", ...], // If "italic" layer requested
"underline": [" XX", ...], // If "underline" layer requested
"fgColors": ["aaabbcccc", ...], // If "fgColors" layer requested
"bgColors": ["000000000", ...], // If "bgColors" layer requested
"colorPalette": { // Included with color layers
"0": null, // default
"a": "#ff0000",
"b": "#00ff00"
}
}
Style Encoding:
- Combined styles use single lowercase for single attributes, uppercase for combinations
- Individual style layers use 'X' for active, space for inactive
- Color layers use single characters mapped to palette entries
- Empty/default values can use '.' or '0' for clarity
Usage Examples for LLM Interaction
Basic Terminal Interaction
// Open a new terminal with custom size
const terminal = await use_mcp_tool("mcpretentious", "mcpretentious-open", {
columns: 120,
rows: 40
});
// Returns terminalId like "iterm-12345-1" or "tmux:mcp-session-123"
// Get terminal info
const info = await use_mcp_tool("mcpretentious", "mcpretentious-info", {
terminalId: terminal.terminalId
});
// Resize terminal
await use_mcp_tool("mcpretentious", "mcpretentious-resize", {
terminalId: terminal.terminalId,
columns: 80,
rows: 24
});
// Execute a command
await use_mcp_tool("mcpretentious", "mcpretentious-type", {
terminalId: terminal.terminalId,
input: ["ls -la", {key: "enter"}]
});
// Read the output
const output = await use_mcp_tool("mcpretentious", "mcpretentious-read", {
terminalId: terminal.terminalId
});
TUI Application Testing
Example 1: Minimal Screenshot (text and cursor only)
const minimalScreen = await use_mcp_tool("mcpretentious", "mcpretentious-screenshot", {
terminalId: terminal.terminalId,
layers: ["text", "cursor"]
});
Sample Response:
{
"terminal": {
"width": 80,
"height": 24
},
"viewport": {
"mode": "full",
"left": 0,
"top": 0,
"width": 80,
"height": 24
},
"cursor": {
"left": 15,
"top": 10,
"relLeft": 15,
"relTop": 10
},
"text": [
"$ ls -la",
"total 64",
"drwxr-xr-x 12 user staff 384 Jan 15 10:30 .",
"drwxr-xr-x 8 user staff 256 Jan 14 09:15 ..",
"-rw-r--r-- 1 user staff 2048 Jan 15 10:30 README.md",
"-rw-r--r-- 1 user staff 1024 Jan 15 09:45 package.json",
"$ ",
"",
"",
"..."
]
}
Example 2: Screenshot Around Cursor with Styles
const aroundCursor = await use_mcp_tool("mcpretentious", "mcpretentious-screenshot", {
terminalId: terminal.terminalId,
layers: ["text", "cursor", "styles"],
aroundCursor: 3
});
Sample Response:
{
"terminal": {
"width": 80,
"height": 24
},
"viewport": {
"mode": "aroundCursor",
"left": 0,
"top": 7,
"width": 80,
"height": 7
},
"cursor": {
"left": 2,
"top": 10,
"relLeft": 2,
"relTop": 3
},
"text": [
"drwxr-xr-x 8 user staff 256 Jan 14 09:15 ..",
"-rw-r--r-- 1 user staff 2048 Jan 15 10:30 README.md",
"-rw-r--r-- 1 user staff 1024 Jan 15 09:45 package.json",
"$ vim README.md",
"~",
"~",
"-- INSERT --"
],
"styles": [
"bbbbbbbbbbb...................................",
"..............................................",
"..............................................",
"..bbb.........................................",
"I.............................................",
"I.............................................",
"bbbbbbbbbbbb.................................."
],
"styleLegend": {
".": null,
"b": "bold",
"I": "bold+italic"
}
}
Example 3: Region with Colors
const region = await use_mcp_tool("mcpretentious", "mcpretentious-screenshot", {
terminalId: terminal.terminalId,
layers: ["text", "fgColors", "bgColors"],
region: { left: 0, top: 0, width: 40, height: 5 }
});
Sample Response:
{
"terminal": {
"width": 80,
"height": 24
},
"viewport": {
"mode": "region",
"left": 0,
"top": 0,
"width": 40,
"height": 5
},
"cursor": {
"left": 15,
"top": 10,
"relLeft": -1, // Cursor is outside viewport
"relTop": -1 // Cursor is outside viewport
},
"text": [
"$ git status",
"On branch main",
"Changes not staged for commit:",
" modified: README.md",
" modified: package.json"
],
"fgColors": [
"0000000000000",
"aaaaaaaaaaaaa",
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"00cccccccccc00ddddddddd",
"00cccccccccc00eeeeeeeeeeeee"
],
"bgColors": [
"0000000000000",
"0000000000000",
"0000000000000",
"0000000000000",
"0000000000000"
],
"colorPalette": {
"0": null,
"a": "#00ff00",
"b": "#ffff00",
"c": "#ff0000",
"d": "#ffffff",
"e": "#cccccc"
}
}
Example 4: Combined Styles with Colors
const combined = await use_mcp_tool("mcpretentious", "mcpretentious-screenshot", {
terminalId: terminal.terminalId,
layers: ["text", "cursor", "styles", "fgColors", "bgColors"],
region: { left: 0, top: 5, width: 50, height: 8 }
});
Sample Response:
{
"terminal": {
"width": 80,
"height": 24
},
"viewport": {
"mode": "region",
"left": 0,
"top": 5,
"width": 50,
"height": 8
},
"cursor": {
"left": 25,
"top": 8,
"relLeft": 25,
"relTop": 3
},
"text": [
"┌────────────────────────────────────────────────┐",
"│ File Edit View Help │",
"├────────────────────────────────────────────────┤",
"│ README.md │",
"│ ============ │",
"│ │",
"│ This is **bold** and _italic_ and __underline__│",
"│ Combined: ***bold italic*** text │"
],
"styles": [
"...................................................",
"..bbbb..bbbb..bbbb..bbbb.........................",
"...................................................",
"..bbbbbbbbb.......................................",
"..UUUUUUUUUUUU....................................",
"...................................................",
"..........bbbbbbbb.....iiiiiiiii....uuuuuuuuuuuu.",
"...........XXXXXXXXXXXXXXb........................"
],
"styleLegend": {
".": null,
"b": "bold",
"i": "italic",
"u": "underline",
"U": "bold+underline",
"X": "bold+italic+underline"
},
"fgColors": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"a0bbbb00bbbb00bbbb00bbbb00000000000000000000000a",
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"a0cccccccccc0000000000000000000000000000000000a",
"a0dddddddddddddd0000000000000000000000000000000a",
"a00000000000000000000000000000000000000000000000a",
"a0000000000eeeeeee00000fffffff00000ggggggggggg0a",
"a00000000000hhhhhhhhhhhhhhhh00000000000000000000a"
],
"bgColors": [
"11111111111111111111111111111111111111111111111111",
"10222222222222222222222222222222222222222222221",
"11111111111111111111111111111111111111111111111111",
"10000000000000000000000000000000000000000000001",
"10000000000000000000000000000000000000000000001",
"10000000000000000000000000000000000000000000001",
"10000000000000000000000000000000000000000000001",
"10000000003333333333333300000000000000000000001"
],
"colorPalette": {
"0": null,
"1": "#1e1e1e",
"2": "#2d2d30",
"3": "#ffff00",
"a": "#808080",
"b": "#ffffff",
"c": "#569cd6",
"d": "#4ec9b0",
"e": "#ce9178",
"f": "#d7ba7d",
"g": "#b5cea8",
"h": "#c586c0"
}
}
Example 5: Individual Style Layers with Compact Mode
const fullStyles = await use_mcp_tool("mcpretentious", "mcpretentious-screenshot", {
terminalId: terminal.terminalId,
layers: ["text", "bold", "italic", "underline"],
compact: true,
aroundCursor: 2
});
Sample Response:
{
"terminal": {
"width": 80,
"height": 24
},
"viewport": {
"mode": "aroundCursor",
"left": 0,
"top": 8,
"width": 80,
"height": 5
},
"cursor": {
"left": 10,
"top": 10,
"relLeft": 10,
"relTop": 2
},
"text": [
"Welcome to Vim",
"Press i for insert mode",
"Hello World",
"Type :q to quit",
"~"
],
"bold": [
"XXXXXXXXXXXXXXX ",
" X ",
"XXXXX XXXXX ",
" ",
"X "
],
"italic": [
" ",
" XXXXXXXXXXXXXXXXXXXX ",
" ",
" XX ",
" "
],
"underline": [
" ",
" ",
" XXXXX ",
"XXXX ",
" "
]
}