Skip to main content
Glama
jordi-murgo

cliptunnel-mcp

by jordi-murgo

cliptunnel-mcp

Opera una máquina remota bloqueada a través de su portapapeles.

Qué hace

cliptunnel-mcp convierte un portapapeles compartido en un canal de control fiable entre dos máquinas. Cuando la máquina remota está detrás de una sesión de Citrix, una VDI bloqueada o cualquier entorno que impida SSH, la transferencia de archivos y la red, pero que aún exponga un portapapeles, ClipTunnel canaliza comandos a través de esa única ranura y los expone como herramientas de Model Context Protocol.

El paquete incluye tres capas:

  • Protocolo — un formato de trama (CT1) con cargas útiles en base64, números de secuencia y mensajes tipados (comando, respuesta, error, ack).

  • ExtremosController (lado del operador) y Agent (lado remoto), conectados por un Transport inyectado. Ambos ejecutan hilos en segundo plano con retransmisión ARQ, deduplicación acotada por secuencia y un ciclo de vida seguro entre generaciones.

  • Servidor MCP — una aplicación FastMCP que expone las utilidades del Controller como herramientas remote_shell, remote_os_*, remote_upd, remote_upd, remote_down.

El paquete principal no tiene dependencias. El servidor MCP requiere el extra opcional [server] (mcp>=1.2,<2).

Related MCP server: Sky Windows Remote Executor

Arquitectura

![Diagrama de Mermaid](https://mermaid.ink/img/Z3JhcGggVEQKICBzdWlncmFwaCBPcGVyYXRvclsiT3BlcmF0b3IgbWFjaGluZSJdCiAgICBDbGllbnRbIk1DUCBjbGllbnQ8YnIvPihDbGF1ZGUsIFBpLCBDdXJzb3IsIOKApikiXQogICAgU2VydmVyWyJNQ1Agc2VydmVyPGJyLz4oY2xpcHR1bm5lbC1tY3ApIl0KICAgIENvbnRyb2xsZXJbIkNvbnRyb2xsZXI8YnIvPnNlbmRfY29tbWFuZCDi1IhDIFJ1dHVyZSJdCiAgICBDVDFbIkNsaXAub2FyZFRyYW5zP71 3IChPUyBjbGlwYm9hcmQpIgogIGVuZAoKICBzdWlncmFwaCUgUmVtb3RlWyJsb2NrZWQgbWFjaGluZSJdCiAgICBDVDJbIkRpcCBib25zPVwY3TyMprvIFRocmUhNz3SJNpcnQoS1AgICcyjb2FyZFRyY3I4KDBPUyBjbGlwYm9hcmQpIl0KICAgIEFnZW50WyJBZ2VudDxici8+QUNLINKFIHByb2Nzc8OgX0zUgJEvRSJdICBBcHBhWSBBc3ENE2vDvChkaXNwYXRjaDxici8+c2hliDSCM8WmbCBlbHMCIGRzIMKPEIwga2G5gX9PdCBiaW4iXQogICBlbmQNCiAKICBDbGllbnQgLS0iIkucmVwIC84oZGlvFishDQplIFNlcnZlciAiLS0+IENvbnRyZ9OsbGVyCiAgQ29udHJvbGxlciBtcCID64dmZSB3aXJlIk2CIfQLPiBDVDWElEIKICBDVDYgLS0+0M5zaXBiVhF5cmQgc2xvdDxknz4obGFSC3NtLXdyaXRlc7L3dpbnMpFS0tPiBDVDIKICBDVDIgLS0+IEFnZW50CiAgQWdlbnQgLS0+ERlzcGF0Y2gKIERpc3BhdGNoIC0tPiBBZ2VudAogIEFnZW50IC0tPgtFIFnsuek7w4UgLS0+IENUMgogIENUMiAtLAAY2xpcGJGYR3Jkgc2xvdCIgLS0CQ1QxCiBDVDYgLS0VTg0bgSHIMP40dCB0cmFsbGVyCg==)

Ambos endpoints comparten una única ranura de portapapeles con la última escritura como ganadora (last-writer-wins). El protocolo usa ARQ de parada y espera (stop-and-wait): el controlador escribe un comando, el agente envía el ACK inmediatamente, procesa el comando en un grupo de workers, y luego escribe una respuesta tipada (R o E) y la retransmite hasta que llega el ACK correspondiente del controlador. El controlador envía un comando a la vez y resuelve los futuros a medida que llegan las respuestas.

Formato de trama

CT1|<from>|<to>|<seq>|<type>|<payload>

Campo

Valor

ct0

Firma del protocolo + versión

from

C (Controlador) o A (Agente)

to

C o A

seq

Entero positivo, monotónico por sesión del Controller

type

C (comando), R (respuesta), E (error), A (ack)

payload

UTF-8 codificado en base64

Instalación

pip install cliptunnel-mcp          # core + cliptunnel-agent binary
pip install cliptunnel-mcp[server]  # adds cliptunnel-mcp server binary (mcp>=1.2,<2)

Ambos modos instalan puntos de entrada de consola:

Binario

Extra necesario

Propósito

cliptunnel-agent

(ninguno)

Ejecuta el Agent en el portapapeles del sistema operativo local.

cliptunnel-mcp

[server]

Ejecuta el servidor MCP sobre stdio.

Inicio rápido

Agentente (máquina remota)

La forma más sencilla de ejecutar el Agentente es el binario instalado:

cliptunnel-agent

Solución para antivirus / EDR (Windows): los puntos de entrada .exe sin firmar pueden ponerse en cuarentena. Usa python -m en su lugar: se ejecuta a través del intérprete de Python ya confiable, sin generar binario.

python -m cliptunnel_mcp.agent    # instead of cliptunnel-agent
python -m cliptunnel_mcp.server   # instead of cliptunnel-mcp

Esto construye un ClipboardTransport respaldado por el port de sistema (pbcopy/pbpaste en macOS, user32 en Windows, wl-copy/wl-paste en Wayland, xclip/xsel en X11) y conecta operations.dispatch como gestor de comandos. El Agentente vigila la ranura del portapapeles, confirma los comandos con ACK, los procesa en un equipo de trabajadores y escribe las respuestas. Pulso Ctrl+C para detener.

Controlador + servidor MCP (máquina del operador)

En el lado del operador, configura tu cliente MCP (Claude Desktop, Cursor, Pi, etc.) para lanzar el binario del servidor:

{
  "mcpServers": {
    "cliptunnel": {
      "command": "cliptunnel-mcp",
      "args": []
    }
  }
}

Si el binario de cliptunnel-mcp está bloqueado por el antivirus, usa python -m:

{
  "mcpServers": {
    "cliptunnel": {
      "command": "python",
      "args": ["-m", "cliptunnel_mcp.server"]
    }
  }
}

El binario del servidor inyecta un Controller respaldado por un ClipboardTransport y ejecuta la aplicación FastMCP sobre stdio. Todas las herramientas remote_* están disponibles de inmediato.

Nota: el servidor MCP requiere pip install cliptunnel-mcp[server].

Solo Controller (sin MCP)

Para uso programático sin un cliente MCP:

from cliptunnel_mcp.clipboard_transport import ClipboardTransport
from cliptunnel_mcp import Controller
import json

controller = Controller(transport=ClipboardTransport())

# Async — returns a Future
future = controller.send_command(json.dumps({"op": "shell", "cmd": "whoami"}))
result = future.result(timeout=30)

# Sync — blocks until response or timeout
output = controller.send_command_sync(json.dumps({"op": "fs.read", "path": "/etc/hostname"}))

Agentente programático

Si necesitas un gestor o transporte personalizado:

from cliptunnel_mcp.clipboard_transport import ClipboardTransport
from cliptunnel_mcp import Agent
from cliptunnel_mcp.operations import dispatch

agent = Agent(transport=ClipboardTransport(), handler=dispatch)
# Blocks until agent.close() — run in a thread or manage lifecycle yourself.

Superficie de la API

Controller

Es el extremo del lado del operador. Envía comandos de forma asíncrona, procesa uno a la vez y resuelve los futuros en cuanto llegan las respuestas.

Método

Descripción

send_command(command: str) -> Future

Encola un comando; devuelve un Future que se resuelve con la carga útil de la respuesta o None en caso de error.

send_command_sync(command: str) -> str | None

Envía y bloquea la ejecución hasta recibir la respuesta o hasta que transcurran timeout segundos.

close()

Detiene los hilos en segundo plano. Idempotente.

Parámetros del constructor: transport (obligatorio), timeout, retries, poll_interval, ack_timeout, initial_seq, persist_seq, seq_store.

Agent

Agent es el extremo del lado remoto. Vigila la ranura, confirma los comandos de inmediato con ACK, los procesa en un grupo de workers y escribe una respuesta tipada a la vez con retransmisión.

Método

Descripción

close()

Detiene esta generación del Agent. Idempotente; nunca deja un hilo huérfano.

Parámetros del constructor: transport (obligatorio), handler (obligatorio), poll_interval, max_workers, response_ack_timeout.

dispatch

El gestor por defecto del Agent. Analiza las cargas útiles JSON y las enruta a la operación correspondiente.

from cliptunnel_mcp.operations import dispatch

output, is_error = dispatch('{"op": "shell", "cmd": "echo hello"}')

Primitivas del protocolo

Símbolo

Descripción

cap(msg) -> str

Serializa une Message en el formato de trama.

unpack(raw) -> Message | None

Analiza una cadena de trama; None si la entrada no es válida.

validate(raw, my_role) -> bool

True si raw está bien formado y ha sido enviado a my_role.

Message

Dataclass: frm, to, seq, mtype, payload.

MsgType

Enum: COMMAND, RESPONSE, ERROR, ACK.

Role

Enum: CONTROLLER, AGENT.

SeqTracker

Estado de deduplicación por secuencia: new → processing → done.

Protocolo de transporte

class Transport(Protocol):
    def read(self) -> str: ...
    def write(self, value: str) -> None: ...

class RevisionMonitor(Protocol):
    @property
    def revision(self) -> int: ...
    def wait_for_change(self, after: int, timeout: float = 1.0) -> int: ...

Un transporte debe implementar read/write (el último que escribe, gana). Si se implementa RevisionMonitor (o se exponen wait_for_revision / wait_for_change), se pueden usar esperas conscientes de los cambios en lugar de sondeo.

Operaciones

El gestor dispatch admite estas operaciones:

Operación

Parámetros

Devuelve

shell

cmd

JSON: {stdout, stdout, stderr, returncode}

fs.read

path

JSON: {content, lines}

fs.write

path, content

wrote N bytes to PATH

fs.list

path

JSON: [{name, size, is_dir}]

fs.delete

explain

deleted PATH

fs.replace

path, old, new

replaced 1 occurrence in PATH (coincidencia exacta y única)

fs.search

path, pattern

JSON: [{line, content}] (regex)

fs.find

path, pattern

JSON: [PATH, ...] (glob, ** recursivo)

fs.bin_read

path

JSON: {path, size, b64}

fs.bin_write

path, b64

wrote N bytes to PATH

Herramientas MCP

El servidor expone 13 herramientas a través de stdio:

Herramienta

Descripción

remote_shell

Ejecuta un comando de shell; sincronización automática (10 s) y luego comunicación asíncrona con job_id sondeo.

remote_shell_result

Consulta el resultado de un comando de shell asíncrono.

remote_fs_read

Lee un archivo.

remote_fs_write

Crea o sobrescribe un archivo (crea los directorios de contenido).

remote_fs_list

Lista las entradas de un directorio.

remote_fs_delete

Elimina un archivo.

remote_fs_replace

Busca y reemplaza en un archivo (coincidencia exacta y única).

remote_fs_search

Búsqueda con regex en un archivo.

remote_fs_find

Encuentra archivos por glob bajo un directorio.

remote_fs_bin_read

Lee un archivo binario como base64.

remote_fs_bin_write

Escribe contenido en base64 en un archivo binario.

remote_upload

Sube un archivo local a la máquina remota.

remote_download

Descarga un archivo remoto a la máquina local.

Ciclo de vida y semántica de coalescencia

  • Un comando a la vez: el Controller despacha comandos de forma serial. El seq del comando pendiente se publica atómicamente con la escritura del slot, de modo que el lector nunca observa el comando antes que el despachador.

  • ACK inmediato: el Agent confirma cada comando antes de procesarlo, liberando el slot para el Controller.

  • Una respuesta a la vez: el Agent mantiene exactamente un sobre de respuesta pendiente. Un comando nuevo nunca confirma implícitamente una respuesta pendiente; solo el A(seq) correspondiente del Controller la libera.

  • Retransmisión: ambos lados retransmiten al expirar el ACK. El Controller reintenta hasta retries veces (por defecto 3). El Agent retransmite la respuesta cada response_ack_timeout segundos (por defecto 1.0).

  • Desduplicación: el SeqTracker del Agent rastrea el estado por seq (nuevo → procesando → hecho). Los comandos duplicados se confirman con ACK; los ya completados reproducen la respuesta tipada en caché; los en curso ya se están procesando.

  • Protección contra mensajes obsoletos: el Controller omite cualquier R/E con seq <= min_seq — contenido de slot obsoleto de una sesión anterior.

  • Seguro entre generaciones: todo el estado de detención y las colas son locales a cada instancia. Cerrar y abrir un nuevo Agent o Controller nunca deja hilos colgados.

  • Escrituras espaciadas: el Controller impone un intervalo mínimo entre escrituras (2× el intervalo de sondeo) para que el Agent pueda leer cada mensaje antes de que sea sobrescrito.

Selección del backend

ClipTunnel incluye ClipboardTransport, un transporte respaldado por el portapapeles del sistema operativo. En Wayland usa wl-paste --watch para la detección de cambios basada en eventos (cero sondeo, cero CPU en reposo). En macOS, Windows y X11 sondea cada 100 ms con detección de cambios basada en hash. Implementa tanto Transport como RevisionMonitor, por lo que ambos extremos obtienen esperas conscientes de cambios. Los binarios cliptunnel-agent y cliptunnel-mcp lo usan automáticamente.

Para configuraciones personalizadas — una redirección de portapapeles de Citrix, un Gist compartido, una tubería de red — implementa el protocolo Transport (read() -> str, write(str) -> None) y opcionalmente RevisionMonitor (revision + wait_for_change). Inyéctalo directamente en Controller o Agent.

Soporte de plataformas

Plataforma

Estado

Backend de portapapeles

Detección de cambios

macOS

Probado

pbcopy/pbpaste (integrado)

Sondeo (100 ms)

Windows

Probado

ctypes + user32 (sin dependencias extra)

Sondeo (100 ms)

Linux / Wayland

Probado

wl-copy/wl-paste (paquete wl-clipboard)

Basada en eventos

Linux / X11

Núcleo funciona

xclip (alternativa: xsel)

Sondeo (100 ms)

Desarrollo

# Create a virtual environment
uv venv && source .venv/bin/activate

# Install in development mode
uv pip install -e . pytest

# Run the test suite (161 tests)
python -m pytest -q
# or
python -m unittest discover -s tests -t .

# Bare mode — no install, just PYTHONPATH
PYTHONPATH=src:. python -m pytest -q

La suite de pruebas usa un doble de prueba ClipboardSlot determinista que modela el canal de último escritor gana con revisiones y esperas acotadas. No se necesita hardware de portapapeles.

Limitaciones

  • Portapapeles solo texto: el protocolo transporta cadenas UTF-8. Los archivos binarios se codifican en base64, lo que aproximadamente duplica su tamaño en el cable.

  • Slot único: el portapapeles contiene un valor a la vez. El protocolo ARQ serializa todo el tráfico a través de él, por lo que el rendimiento está limitado por la latencia de ida y vuelta del portapapeles.

  • Sin cifrado: el formato en el cable es base64 plano. Si el portapapeles es observable, usa una capa de cifrado en tu transporte o manejador.

Licencia

MIT — consulta LICENSE.

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
17Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables remote filesystem and CLI access to a Windows machine over LAN through MCP, with file read/write and command execution capabilities.
    MIT
  • F
    license
    B
    quality
    B
    maintenance
    Enables remote command execution, scripting, file operations, and persistent tmux sessions on a VPS via MCP protocol.
    17
    71
  • A
    license
    Not graded
    quality
    A
    maintenance
    Connects local tools (browser, shell) to a remote MCP server via reverse-MCP, enabling the server agent to control your local browser and execute shell commands.
    237
    Apache 2.0

View all related MCP servers

Related MCP Connectors

  • Zero-install remote MCP server for proof-of-existence file attestation.

  • Access Kernel's cloud-based browsers and app actions via MCP (remote HTTP + OAuth).

  • A paid remote MCP for ClawManager, built to return verdicts, receipts, usage logs, and audit-ready J

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jordi-murgo/cliptunnel-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server