Skip to main content

Tool Reference

The QuikGIF MCP server exposes 21 tools organized into six categories.


Script Tools​

execute_script​

Execute a .qgif script to generate a GIF demo. Provide either inline script source or a file path.

Parameters:

NameTypeRequiredDefaultDescription
scriptstringOne of script/file—Inline .qgif script source code
filestringOne of script/file—Path to a .qgif script file
previewbooleanNofalseRender a quick low-res preview (10fps, 400px)

Returns:

{ "path": "demo.gif", "size_mb": 1.2 }

Example:

{
"method": "tools/call",
"params": {
"name": "execute_script",
"arguments": {
"script": "set output \"demo.gif\"\nopen \"Terminal\"\ncapture-window app \"Terminal\" as $t\nrecord $t duration 3 continue\ntype \"echo Hello\" enter\nremain\nrender"
}
}
}

validate_script​

Validate a .qgif script without executing it. Returns syntax errors and warnings.

Parameters:

NameTypeRequiredDefaultDescription
scriptstringOne of script/file—Inline .qgif script source code
filestringOne of script/file—Path to a .qgif script file

Returns (valid):

{ "valid": true, "instruction_count": 8, "warnings": [] }

Returns (invalid):

{ "valid": false, "error": "Line 3: Unknown command 'recrd'", "warnings": [] }

Example:

{
"method": "tools/call",
"params": {
"name": "validate_script",
"arguments": {
"script": "open \"Terminal\"\nrecord $t duration 3\nrender"
}
}
}

Window Management Tools​

list_windows​

List all capturable windows on screen. Optionally filter by application name.

Parameters:

NameTypeRequiredDefaultDescription
appstringNo—Filter by application name (case-insensitive substring match)

Returns:

{
"windows": [
{ "id": 12345, "app": "Terminal", "title": "zsh", "x": 100, "y": 200, "width": 800, "height": 600 },
{ "id": 12346, "app": "Terminal", "title": "bash", "x": 150, "y": 250, "width": 800, "height": 600 }
]
}

Example:

{
"method": "tools/call",
"params": {
"name": "list_windows",
"arguments": { "app": "Terminal" }
}
}

open_app​

Open an application and return the new window ID. Creates a new window even if the app is already running.

Parameters:

NameTypeRequiredDefaultDescription
appstringYes—Application name (e.g. "Terminal", "Finder", "Safari")

Returns:

{ "window_id": 12345, "app": "Terminal", "title": "zsh" }

Example:

{
"method": "tools/call",
"params": {
"name": "open_app",
"arguments": { "app": "Terminal" }
}
}

focus_app​

Bring an application to the front.

Parameters:

NameTypeRequiredDefaultDescription
appstringYes—Application name

Returns:

{ "success": true }

Example:

{
"method": "tools/call",
"params": {
"name": "focus_app",
"arguments": { "app": "Terminal" }
}
}

Recording Tools​

start_recording​

Start recording a window. Returns a session ID for use with stop_recording and render_gif.

Parameters:

NameTypeRequiredDefaultDescription
window_idintegerOne of window_id/app—Window ID from list_windows
appstringOne of window_id/app—Application name. Resolves to the first matching window; when several match, check target/other_matches in the response or pass window_id to disambiguate
cropobjectNo—Sub-region { x, y, w, h } relative to window content area
fpsintegerNo30Frame rate
show_cursorbooleanNotrueInclude cursor in recording
durationnumberNo—Auto-stop after N seconds

Returns:

{
"session_id": "rec-a1b2c3d4",
"recording": true,
"target": {
"window_id": 12345,
"title": "Animation - Wikipedia",
"app": "Google Chrome",
"frame": { "x": 0, "y": 25, "w": 1512, "h": 900 }
},
"other_matches": 3
}

target names the window that was actually selected, and other_matches is how many other windows matched an app request (0 for an unambiguous window_id). With a multi-window app, confirm target is the window you intended before rendering — a nonzero other_matches means the app name was ambiguous. title and app are omitted when the window reports none.

Example:

{
"method": "tools/call",
"params": {
"name": "start_recording",
"arguments": { "app": "Terminal", "fps": 30, "duration": 5 }
}
}
info

The crop object specifies a sub-region relative to the window's content area (below the title bar). All four fields (x, y, w, h) are required when using crop.


record_region​

Record a screen region by absolute coordinates.

Parameters:

NameTypeRequiredDefaultDescription
xintegerYes—X coordinate of region origin
yintegerYes—Y coordinate of region origin
widthintegerYes—Region width in points
heightintegerYes—Region height in points
fpsintegerNo30Frame rate
show_cursorbooleanNotrueInclude cursor in recording
durationnumberNo—Auto-stop after N seconds

Returns:

{ "session_id": "rec-e5f6g7h8", "recording": true }

Example:

{
"method": "tools/call",
"params": {
"name": "record_region",
"arguments": { "x": 100, "y": 200, "width": 800, "height": 600, "duration": 5 }
}
}

stop_recording​

Stop an active recording session. Frames are preserved for render_gif.

Parameters:

NameTypeRequiredDefaultDescription
session_idstringYes—Session ID from start_recording or record_region

Returns:

{ "session_id": "rec-a1b2c3d4", "frames": 150, "elapsed": 5.0 }

Example:

{
"method": "tools/call",
"params": {
"name": "stop_recording",
"arguments": { "session_id": "rec-a1b2c3d4" }
}
}

pause_recording​

Cancel the auto-stop timer on an active recording.

Parameters:

NameTypeRequiredDefaultDescription
session_idstringYes—Session ID

Returns:

{ "paused": true, "frames": 90, "note": "Capture stream continues running. For true pause, use stop_recording + start_recording." }
warning

SCStream does not support native pause/resume. The capture stream continues running during "pause" — frames captured during the paused period will be included when stop_recording is called. For a true pause, use stop_recording followed by start_recording to create separate segments.

Example:

{
"method": "tools/call",
"params": {
"name": "pause_recording",
"arguments": { "session_id": "rec-a1b2c3d4" }
}
}

resume_recording​

Acknowledge resume after pause. Since pause does not stop capture, this is informational only.

Parameters:

NameTypeRequiredDefaultDescription
session_idstringYes—Session ID

Returns:

{ "resumed": true, "note": "Recording continues. Use stop_recording when done." }

Example:

{
"method": "tools/call",
"params": {
"name": "resume_recording",
"arguments": { "session_id": "rec-a1b2c3d4" }
}
}

record_device​

Record the screen of an iPhone or iPad connected to the Mac by cable. Blocks for duration, then stores the frames under a session ID for render_gif. Free.

macOS treats a device screen as a camera, so the app running QuikGIF (your MCP host or terminal) needs Camera access in System Settings > Privacy & Security. Unlock the device and tap Trust if it asks. No sound is recorded.

Parameters:

NameTypeRequiredDefaultDescription
devicestringNothe only connected deviceDevice name or ID (see quikgif list-devices)
durationnumberNo5Seconds to record
fpsintegerNo10Frames per second to keep, 1-60
sizestringNo-Exact output size as WxH, e.g. 1170x2532
fitstringNocontaincontain (pad), cover (crop), or stretch

Returns:

{ "session_id": "rec-9a8b7c6d", "device": "iPhone", "frames": 48, "width": 800, "height": 1734 }

Example:

{
"method": "tools/call",
"params": {
"name": "record_device",
"arguments": { "duration": 5 }
}
}

Input Simulation Tools​

type_text​

Simulate typing text with human-like pacing.

Parameters:

NameTypeRequiredDefaultDescription
textstringYes—Text to type
enterbooleanNofalsePress Enter after typing
delaynumberNo0.05Per-character delay in seconds

Returns:

{ "success": true }

Example:

{
"method": "tools/call",
"params": {
"name": "type_text",
"arguments": { "text": "git status", "enter": true }
}
}

click​

Click at screen coordinates. If x/y are omitted, clicks at the current cursor position.

Parameters:

NameTypeRequiredDefaultDescription
xnumberNoCurrent positionX screen coordinate
ynumberNoCurrent positionY screen coordinate
rightbooleanNofalseRight-click instead of left-click

Returns:

{ "success": true }

Example:

{
"method": "tools/call",
"params": {
"name": "click",
"arguments": { "x": 400, "y": 300 }
}
}

move_cursor​

Move the cursor to a screen position, optionally with smooth animation.

Parameters:

NameTypeRequiredDefaultDescription
xnumberYes—Target X coordinate
ynumberYes—Target Y coordinate
durationnumberNo0 (instant)Smooth animation duration in seconds

Returns:

{ "success": true }

Example:

{
"method": "tools/call",
"params": {
"name": "move_cursor",
"arguments": { "x": 500, "y": 350, "duration": 0.5 }
}
}

key_press​

Press a key with optional modifiers. Use + to combine modifiers with the key.

Parameters:

NameTypeRequiredDefaultDescription
keystringYes—Key spec (e.g. enter, cmd+c, shift+tab, ctrl+alt+delete, f5)

Returns:

{ "success": true }

Supported keys: enter/return, tab, space, delete/backspace, escape/esc, up, down, left, right, home, end, pageup, pagedown, f1-f12, a-z

Supported modifiers: cmd/command, shift, alt/option, ctrl/control

Example:

{
"method": "tools/call",
"params": {
"name": "key_press",
"arguments": { "key": "cmd+c" }
}
}

scroll​

Scroll at the current cursor position.

Parameters:

NameTypeRequiredDefaultDescription
directionstringYes—up, down, left, or right
ticksintegerNo3Number of scroll ticks

Returns:

{ "success": true }

Example:

{
"method": "tools/call",
"params": {
"name": "scroll",
"arguments": { "direction": "down", "ticks": 5 }
}
}

Rendering Tools​

render_gif​

Render a completed recording session to a GIF file with optional frame transforms.

Parameters:

NameTypeRequiredDefaultDescription
session_idstringYes—Session ID from stop_recording
outputstringNorecording-{id}.gifOutput file path
max_widthintegerNo800Maximum GIF width in pixels
loop_countintegerNo0Loop count (0 = infinite)
palette_strategystringNoautoColor palette: auto, global, or perFrame
frame_diffingbooleanNofalseSkip encoding unchanged pixels between frames to reduce file size
formatstringNogifOutput format: gif, webp, apng, or mp4
releasebooleanNofalseFree the capture's frames after this render instead of retaining it for re-rendering
transformsobjectNo—Frame transforms to apply (see below)

Transforms object:

KeyTypeDefaultDescription
cursor_smoothingbooleanfalseSmooth cursor movement paths
click_indicatorsbooleanfalseShow click overlay effects
keystroke_badgesbooleanfalseShow key combo badges
type_smoothingbooleanfalseNormalize typing speed
include_title_barbooleantrueKeep the real window title bar (set false to crop it)
idle_strategystring—Idle handling: cut, ramp, or fade
idle_thresholdnumber2.0Seconds before idle handling kicks in
info

The cursor_smoothing, click_indicators, keystroke_badges, and type_smoothing transforms require Accessibility permission. Without it, they silently have no effect.

Re-rendering the same capture

A capture is retained after rendering, so you can call render_gif again on the same session_id to compare settings - a different max_width, palette_strategy, frame_diffing, format, or set of transforms - without re-recording. Frames are held in memory (decoded, so a 10 s clip is large), and only the most recent few captures are kept; older ones are evicted automatically. Free a capture yourself with release: true on the render call or the discard_recording tool when you are done.

Returns:

{ "path": "demo.gif", "size_mb": 1.2, "dimensions": "800x450", "frames": 150, "retained": true }

Example:

{
"method": "tools/call",
"params": {
"name": "render_gif",
"arguments": {
"session_id": "rec-a1b2c3d4",
"output": "demo.gif",
"max_width": 800,
"transforms": {
"cursor_smoothing": true,
"keystroke_badges": true
}
}
}
}

discard_recording​

Release a completed recording's frames to free memory when you are done rendering it. Captures are also evicted automatically once newer ones exceed the retention cap, so this is only needed to reclaim memory sooner.

Parameters:

NameTypeRequiredDefaultDescription
session_idstringYes—Session ID of the completed recording to discard

Returns:

{ "session_id": "rec-a1b2c3d4", "discarded": true }

Discarding an already-released capture is not an error - it returns "discarded": false with a note. A still-recording session must be stopped with stop_recording first.


process_gif​

Post-process an existing GIF file. Supports resizing, speed adjustment, and idle handling.

Parameters:

NameTypeRequiredDefaultDescription
inputstringYes—Input GIF file path
outputstringNoOverwrite inputOutput file path
max_widthintegerNo—Resize to max width
speednumberNo—Speed multiplier (1.5 = 50% faster, 0.5 = 50% slower)
idle_strategystringNo—Idle handling: cut, ramp, or fade
idle_thresholdnumberNo2.0Idle threshold in seconds
palette_strategystringNoautoColor palette: auto, global, or perFrame

Returns:

{ "path": "optimized.gif", "size_mb": 0.8, "dimensions": "600x338", "frames": 120 }

Example:

{
"method": "tools/call",
"params": {
"name": "process_gif",
"arguments": {
"input": "recording.gif",
"output": "optimized.gif",
"max_width": 600,
"speed": 1.5
}
}
}

Utility Tools​

list_settings​

List all available .qgif script settings with their types, defaults, and descriptions.

Parameters: None

Returns:

{
"settings": [
{ "name": "fps", "type": "int", "default": "30", "description": "Frame rate (12, 24, 30, 60)" },
{ "name": "output", "type": "string", "default": "output.gif", "description": "Output file path" },
...
]
}

Example:

{
"method": "tools/call",
"params": {
"name": "list_settings",
"arguments": {}
}
}

list_commands​

List all available .qgif script commands with syntax descriptions.

Parameters: None

Returns:

{
"commands": [
{ "command": "open", "description": "Launch application and create a new window" },
{ "command": "record", "description": "Start recording a window" },
...
]
}

Example:

{
"method": "tools/call",
"params": {
"name": "list_commands",
"arguments": {}
}
}

check_permissions​

Check current Screen Recording and Accessibility permission status.

Parameters: None

Returns:

{
"screen_recording": true,
"accessibility": true,
"note": "All required permissions granted."
}

When Screen Recording is not granted:

{
"screen_recording": false,
"accessibility": false,
"note": "Screen Recording permission is required. Grant in System Settings > Privacy & Security > Screen Recording."
}

Example:

{
"method": "tools/call",
"params": {
"name": "check_permissions",
"arguments": {}
}
}