Skip to main content
Glama
quinho981

gnome-screencast-mcp

by quinho981

gnome-screencast-mcp

Screen recording on GNOME, controlled from the command line or by an AI agent via MCP.

Uses the native GNOME Shell recorder (the org.gnome.Shell.Screencast D-Bus interface, the same one behind the Ctrl+Alt+Shift+R shortcut). Does not depend on ffmpeg, wf-recorder, or any external capture binary.

What it's for

Automate screen recordings without touching the graphical interface: demonstrations, bug evidence, flow documentation, and logging of test sessions. Since every command returns JSON, it works for scripts as much as for an agent that needs to record what it is doing.

The problem it solves: calling GNOME's D-Bus directly does not work for recording. The Shell ends the recording as soon as the D-Bus client that started it leaves the bus, so a standalone gdbus call produces a file with a single frame and a 0:00 duration. The solution here is a helper process that keeps the connection open for the entire recording and closes it cleanly on stop — only then does the WebM come out with the correct duration and index.

Related MCP server: video-capture-mcp

Installation

Nothing to clone or compile. Four steps, from scratch to your first recorded video.

It's not on PyPI yet. For now uv installs directly from this GitHub repository — it works the same, only the command is a little longer. When we publish it to PyPI, gnome-screencast-mcp by itself is enough; the two become interchangeable.

Step 1 — check the requirements

Requirement

Why

How to check

GNOME Shell, active graphical session (Wayland or X11)

GNOME itself does the recording; tested on GNOME Shell 42

gnome-shell --version

PyGObject (python3-gi)

Keeps the D-Bus connection alive during the recording; not installable via pip

python3 -c "import gi" — if you get an error: sudo apt install python3-gi

uv

Installs and runs the package, no manual venv

uv --version — if missing: curl -LsSf https://astral.sh/uv/install.sh | sh

If all three pass without error, move to step 2.

Step 2 — install

uv tool install --from git+https://github.com/quinho981/gnome-screencast-mcp gnome-screencast-mcp

That puts three executables in your PATH:

Executable

Role

gnome-screencast-start

Starts recording from the command line.

gnome-screencast-stop

Stops recording from the command line.

gnome-screencast-mcp

MCP server (stdio transport) — this is what an AI agent calls.

If the terminal warns that the installation directory isn't on your PATH, run the command it suggests (usually uv tool update-shell) and open a new terminal.

Step 3 — test

gnome-screencast-start && sleep 3 && gnome-screencast-stop

You should get a JSON with "status": "recording", a 3-second pause, and another JSON with "status": "stopped" and duration_seconds close to 3. If that's what came out, everything is working — the .webm file is in your videos directory.

Something went wrong? Go straight to Common issues.

Step 4 — choose how to use it

  • From the command line: it's ready — see Command-line usage for the -o, -f, and -a options.

  • Through an AI agent (Claude Code, Cursor, opencode, etc.): you need to register the MCP server in your client — see MCP, which gives the step-by-step for each.

No steps: you just want MCP working in an agent

If the only use is MCP, you don't need to install anything by hand — the client itself downloads the package when it runs. Check the requirements in step 1, skip steps 2 and 3, and go straight to MCP use.

Developing the project

Only for those who will change this repository:

git clone https://github.com/quinho981/gnome-screencast-mcp
cd gnome-screencast-mcp
uv run gnome-screencast-mcp        # servidor MCP a partir do código local
bash bin/start-recording.sh        # scripts de gravação, sem instalar nada
bash bin/stop-recording.sh

Structure

File

Purpose

bin/start-recording.sh

Starts recording. Prints JSON and returns immediately.

bin/stop-recording.sh

Stops and waits for the file to be finalized.

bin/recorder-daemon.py

Helper process that holds the D-Bus connection. Don't call it directly.

gnome_screencast_mcp/server.py

MCP server; converts tool calls into script executions.

gnome_screencast_mcp/cli.py

Executables gnome-screencast-start and -stop from an installation.

.mcp.json

MCP server registration for anyone who opens this project in Claude Code.

The scripts live in bin/ so they remain usable directly from a clone; the wheel build copies them into the package, and the server finds them in both places.

Command line use

# Tela inteira, 30 fps, arquivo com data e hora em ~/Vídeos
gnome-screencast-start

# ... faça o que precisa ser gravado ...

gnome-screencast-stop

In a clone, the equivalents are bash bin/start-recording.sh and bash bin/stop-recording.sh.

start returns the file path as soon as recording starts:

{
  "status": "recording",
  "file": "/home/user/Vídeos/screencast-20260824-152940.webm",
  "mode": "screen",
  "framerate": 30,
  "draw_cursor": true,
  "started_at": "2026-08-24T15:29:40-0300",
  "pid": 183615
}

And stop returns the summary of what was recorded:

{
  "status": "stopped",
  "file": "/home/user/Vídeos/screencast-20260824-152940.webm",
  "size_bytes": 361637,
  "duration_seconds": 4.488
}

start options

Option

Effect

-o, --output FILE

Path to the output .webm. Cannot contain %.

-f, --framerate N

Frames per second (default: 30).

-a, --area X Y L A

Records only the specified rectangular region, in pixels.

-c, --no-cursor

Does not draw the mouse pointer.

Example — top-left corner, 1280×720, 60 fps, no cursor:

gnome-screencast-start -a 0 0 1280 720 -f 60 --no-cursor -o /tmp/demo.webm

stop options

Option

Effect

-t, --timeout N

Seconds to wait until the file is finalized (default: 20).

-q, --quiet

Does not print the result JSON.

Exit codes

Both commands use 0 for success and 1 for a usage or environment error. Additionally:

  • start: 2 there is already a recording in progress · 3 GNOME Shell refused to start

  • stop: 2 there is no recording in progress · 3 the file was not finalized in time

MCP use

Registering the server makes recording a capability of the agent: it calls start_recording and stop_recording as typed tools, without needing shell access.

Exposed tools

Tool

What it does

start_recording(output?, framerate=30, draw_cursor=true, area?)

Starts and returns right away. area is [x, y, width, height].

stop_recording(timeout=20)

Stops and returns path, size, and duration.

recording_status()

idle, recording (with elapsed_seconds), or stale.

recording_status is the cheap way to check before acting — it avoids trying to start a recording that already exists, or stop one that doesn't exist.

The command, in any client

The server is a regular stdio process, and the command is the same everywhere:

comando:    uvx
argumentos: gnome-screencast-mcp

If you ran uv tool install, the command is just gnome-screencast-mcp, with no arguments.

While the package is not on PyPI, use this list of arguments instead of ["gnome-screencast-mcp"] in all the examples below:

["--from", "git+https://github.com/quinho981/gnome-screencast-mcp", "gnome-screencast-mcp"]

Once the package is published, switch back to the short form — the examples are already written with it.

Two things break configurations that look right:

  1. uvx may not be on the client's PATH. Clients launched by a graphical launcher (Cursor, VS Code, Zed, Claude Desktop) usually inherit a minimal PATH, without ~/.local/bin. If the server fails with uvx: command not found, replace uvx with the output of command -v uvx — usually /home/<your-user>/.local/bin/uvx.

  2. Recording needs the session bus. GNOME's D-Bus is reached through DBUS_SESSION_BUS_ADDRESS and XDG_RUNTIME_DIR. A client launched inside your graphical session already inherits them. A client in a container, snap, flatpak, or SSH session does not — in that case, declare the two in the env block of the server:

    "env": {
      "DBUS_SESSION_BUS_ADDRESS": "unix:path=/run/user/1000/bus",
      "XDG_RUNTIME_DIR": "/run/user/1000"
    }

    The correct values for your machine come from echo $DBUS_SESSION_BUS_ADDRESS $XDG_RUNTIME_DIR in a terminal in the graphical session.

Claude Code

claude mcp add screen-recorder --scope user \
  -- uvx --from git+https://github.com/quinho981/gnome-screencast-mcp gnome-screencast-mcp

Once published to PyPI, it simplifies to -- uvx gnome-screencast-mcp.

Restart the session and confirm with /mcp that screen-recorder appears connected.

Inside this repository you don't even need that: the versioned .mcp.json here already registers the server from the local code — just approve it when opening the directory.

Codex CLI

codex mcp add screen-recorder \
  -- uvx --from git+https://github.com/quinho981/gnome-screencast-mcp gnome-screencast-mcp

Once published to PyPI, it simplifies to -- uvx gnome-screencast-mcp.

Or manually, in ~/.codex/config.toml:

[mcp_servers.screen-recorder]
command = "uvx"
args = ["gnome-screencast-mcp"]

opencode

In opencode.json at the root of your project, or in ~/.config/opencode/opencode.json to apply to everything:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "screen-recorder": {
      "type": "local",
      "enabled": true,
      "command": ["gnome-screencast-mcp"]
    }
  }
}

This assumes the uv tool install from step 2 of the install — the command is just the executable name, already resolved by PATH. opencode marks the server as failed (and flips enabled back to false on its own) if the command doesn't come up on the first try, and uvx gnome-screencast-mcp falls into that case until the package is on PyPI: every call would try to resolve it there and fail. If you prefer not to install it permanently, the form that works without installing is the same git+ note from the other clients in the cross-client command section:

"command": ["uvx", "--from", "git+https://github.com/quinho981/gnome-screencast-mcp", "gnome-screencast-mcp"]

opencode is the one case where the command is a single list, rather than a separate command and args.

Cursor

In ~/.cursor/mcp.json (global) or .cursor/mcp.json (project only):

{
  "mcpServers": {
    "screen-recorder": {
      "command": "uvx",
      "args": ["gnome-screencast-mcp"]
    }
  }
}

Cursor is launched by the graphical environment: if it does not connect, the most likely reason is a PATH without uvx. See item 1 of the any-client command section.

Gemini CLI

gemini mcp add screen-recorder \
  uvx --from git+https://github.com/quinho981/gnome-screencast-mcp gnome-screencast-mcp

Once published to PyPI, it simplifies to uvx gnome-screencast-mcp.

Or manually, in ~/.gemini/settings.json (global) or .gemini/settings.json (per project), in the same mcpServers format shown for Cursor.

VS Code (GitHub Copilot)

In .vscode/mcp.json in the project. Note that the key is servers, not mcpServers, and that the type is explicit:

{
  "servers": {
    "screen-recorder": {
      "type": "stdio",
      "command": "uvx",
      "args": ["gnome-screencast-mcp"]
    }
  }
}

Windsurf

In ~/.codeium/windsurf/mcp_config.json, in the same mcpServers format as Cursor.

Zed

In Zed's settings.json, under context_servers:

{
  "context_servers": {
    "screen-recorder": {
      "source": "custom",
      "command": "uvx",
      "args": ["gnome-screencast-mcp"],
      "env": {}
    }
  }
}

Claude Desktop

On Linux, in ~/.config/Claude/claude_desktop_config.json, in the same mcpServers format as Cursor. The app needs to be fully restarted after the edit.

Other clients

If your client is not listed, look in its documentation for where "MCP servers" live and provide the uvx command with the argument gnome-screencast-mcp. In practice, the ecosystem has only two format variations: the separate command + args pair (most) and the command as a single list (opencode).

Without uv

The package is a regular Python project and pip handles it:

pip install --user git+https://github.com/quinho981/gnome-screencast-mcp

(After it has been published to PyPI: pip install --user gnome-screencast-mcp.)

The client command becomes gnome-screencast-mcp, with no arguments. A dedicated virtual environment also works — in that case, point to the executable inside of it; the server removes its own venv from the PATH it passes to the scripts, so they still find the system's PyGObject.

Testing the server without a client

Before wrestling with an agent's configuration, it's worth confirming that the server comes up:

printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
  | uvx --from git+https://github.com/quinho981/gnome-screencast-mcp gnome-screencast-mcp

(After it has been published to PyPI, uvx gnome-screencast-mcp by itself is enough.)

The initialize response should appear, followed by the three tools. On the first run, uvx also prints an installation line to stderr.

How it works

start-recording.sh
  └─ setsid recorder-daemon.py        (sobrevive ao script que o criou)
       ├─ D-Bus: Screencast(...)      → o GNOME Shell começa a gravar
       ├─ escreve o estado em $XDG_RUNTIME_DIR/screen-recorder/current.json
       └─ fica vivo, segurando a conexão, até receber SIGTERM

stop-recording.sh
  └─ SIGTERM no pid do estado
       └─ daemon: D-Bus StopScreencast pela mesma conexão
            └─ espera o GStreamer fechar o WebM e escreve o resumo final

The state file guarantees that only one recording exists at a time — a limitation of GNOME Shell itself, which supports a single simultaneous screencast session.

If the daemon dies without cleaning up (for example, on a logout), the state file is left orphaned: recording_status reports stale and the next start_recording removes it on its own.

Implementation details

Three pitfalls the package needs to work around:

  • Output capture. The server runs the scripts with output redirected to temporary files, not to pipes. The daemon inherits the output descriptors, so a pipe would only see EOF at the end of the recording — and the start_recording call would block until then.

  • Python environment. Once installed, the server runs inside a virtual environment that sits at the start of the PATH. The scripts would then resolve python3 to that environment, where the system's PyGObject doesn't exist. The server removes the venv from the environment the scripts inherit.

  • Executable bit. The scripts are invoked as bash script.sh and the daemon as python3 daemon.py, never directly: the executable permission doesn't reliably survive packaging into a wheel.

Common problems

PyGObject não encontrado — install with sudo apt install python3-gi. If it only shows up when using the MCP and not on the command line, the venv is leaking into the scripts' PATH.

The agent doesn't list the tools — the server never even started. Run the test from Testing the server without a client; if it passes, the problem is in the client's configuration, almost always uvx outside the PATH (item 1 of The command, in any client).

o GNOME Shell recusou iniciar a gravação — there is normally no accessible GNOME session. The MCP server inherits the environment of whoever started it, and D-Bus needs DBUS_SESSION_BUS_ADDRESS and XDG_RUNTIME_DIR. If the MCP client runs in a confined environment (container, snap, flatpak, service, SSH), declare both variables in the server's env block — see item 2 of The command, in any client.

gravação já em andamento — call stop_recording, or gnome-screencast-stop. To inspect the state manually: cat $XDG_RUNTIME_DIR/screen-recorder/current.json.

Video with duration 0:00 — a sign that the recording was started outside these commands, with a D-Bus client that didn't survive. Use gnome-screencast-start.

Helper process log: $XDG_RUNTIME_DIR/screen-recorder/daemon.log.

License

MIT — see LICENSE.

Publishing a version

uv build          # gera dist/*.whl e dist/*.tar.gz
uv publish        # envia ao PyPI

The version lives in pyproject.toml.

Available Tools

3 tools
recording_statusA

Informa se há uma gravação em andamento.

Returns: Um dos três estados: "idle" (nenhuma gravação), "recording" (com o estado da gravação e há quantos segundos ela corre) ou "stale" (restou um arquivo de estado de um processo que morreu; a próxima chamada a start_recording o remove sozinha).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and covers the key ground: all three possible states, what 'stale' means, and how the stale file will be removed on the next start_recording. It does not explicitly promise that the call is side-effect-free, but the verb 'Informa' implies a read-only status check.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-line purpose and then gives a compact Returns block covering every possible outcome. There is no filler or redundancy, and every sentence adds meaningful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter tool with no annotations and no output schema, this description is complete: it defines each return state, the meaning of 'stale', and the recovery behavior. An agent can confidently invoke it and interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema already documents this completely with 0 properties. The description correctly avoids inventing parameter-level detail, which matches the baseline for a 0-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states the tool's purpose and domain ('Informa se há uma gravação em andamento'), and the Returns section enumerates exactly what it reports. It is clear enough to distinguish from the start/stop siblings, but it never explicitly names the sibling alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: this is clearly the state-checking tool alongside start_recording and stop_recording, and it mentions that start_recording handles stale state. However, it gives no explicit 'use this when...' or 'do not use this to start/stop' guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_recordingA

Inicia uma gravação de tela e devolve imediatamente.

A gravação continua em segundo plano até stop_recording ser chamado. Só uma gravação pode existir por vez.

Args: output: caminho do arquivo .webm de saída. Por padrão, um arquivo com data e hora no diretório de vídeos do usuário. Não pode conter '%'. framerate: quadros por segundo. draw_cursor: se False, o ponteiro do mouse não aparece na gravação. area: região retangular a gravar, como [x, y, largura, altura] em pixels. Por padrão, grava a tela inteira.

Returns: Estado da gravação, incluindo o caminho do arquivo e o pid do processo auxiliar que a mantém viva.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNo
outputNo
framerateNo
draw_cursorNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full behavioral disclosure burden. It does so thoroughly by saying the call returns immediately, recording continues in the background, only one recording can exist, and the return includes the file path and the PID of the helper process keeping it alive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured and front-loaded: it opens with the core behavior, then provides a compact Args section and a Returns note. Every sentence contributes meaningful information with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an asynchronous operation with no annotations or output schema, the description is highly complete. It explains when to call it, how it runs, when it stops, what parameters matter, and what the return value contains. The only omitted detail is error behavior when a recording already exists, but the single-recording constraint makes that outcome interpretable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates completely: output is explained with .webm, default timestamped location, and the '%' restriction; framerate is given units; draw_cursor behavior is described; and area is defined as [x, y, width, height] pixels with a full-screen default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence clearly states the operation: it starts a screen recording and returns immediately. It also frames the recording's lifecycle relative to stop_recording, making it distinct from the sibling tools stop_recording and recording_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong lifecycle guidance: the recording continues in the background until stop_recording is called, and only one recording can exist at a time. It does not explicitly mention when to prefer recording_status over start_recording, so it falls just short of full alternative-routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

stop_recordingA

Encerra a gravação em andamento e espera o arquivo ser finalizado.

Só retorna depois que o WebM está completo — com duração e índice escritos.

Args: timeout: segundos de espera até o processo auxiliar fechar o arquivo.

Returns: Resumo da gravação: caminho, tamanho em bytes e duração em segundos.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clearly states that the method blocks until the WebM file is finalized, including duration and index metadata, and that the timeout parameter controls waiting. It also discloses the return value with path, size, and duration. With no annotations provided, this is strong behavioral disclosure, though timeout failure behavior is not described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, structured, and front-loaded with the main behavior before diving into parameter and return details. Every sentence adds relevant information with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple: one optional parameter and no output or input schema beyond the timeout. The description explains what the tool does, how it behaves, what the timeout means, and what the return value contains. The only missing detail is what happens when the timeout expires—whether it raises an error, returns partial data, or still returns a summary. This is a meaningful but minor gap in an otherwise complete description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only provides the parameter name and default value, and schema description coverage is 0%. The description compensates by explaining that timeout is the number of seconds to wait for the auxiliary process to close the file. This is enough for an agent to know how to set it appropriately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (end current recording), a specific resource (the recording in progress), and key behavioral constraints (waits for the WebM to be complete). The function is clearly distinct from its siblings start_recording and recording_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies this is the operation to stop a recording after start_recording has begun, but it does not explicitly mention alternatives or conditions for when recording_status might be preferable. An agent can infer the correct use case, though the guidance is not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.0
    • First observedrecording_status
    • First observedstart_recording
    • First observedstop_recording

TDQS

A4.4/5.0

Scored across 3 tools

Disambiguation5/5

Start, stop, and status are three clearly distinct lifecycle operations with no overlap. An agent can easily tell them apart based on name and description.

Naming Consistency4/5

start_recording and stop_recording follow the verb_noun pattern consistently, while recording_status is slightly inconsistent as a noun phrase rather than get_recording_status. Overall the naming is still predictable and readable.

Tool Count5/5

Three tools is the right size for the server's single-purpose scope: start, stop, and query status. Each tool fills an essential role without redundancy.

Completeness5/5

The screen-recording lifecycle is fully covered: start, stop, and monitor status. The stale-state handling also addresses the natural failure case, making the surface complete for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables LLMs to capture screenshots and screen recordings through MCP with chunked session-based transfers for reliable image consumption. Supports multi-monitor selection, timeline capture, and compatibility with both vision and non-vision language models.
    11
    1
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Free, open-source screen recording MCP server for AI agents. Enables screen capture, screenshots, and frame extraction locally without cloud dependencies.
    4 npm
    1
    Apache 2.0