mcp-osascript

Permite que Claude controle tu Mac: 12 herramientas escritas para ventanas, menús, teclado, portapapeles y pestañas del navegador.

Documentación

mcp-osascript

Deja que Claude controle tu Mac. Mueve ventanas, haz clic en menús, escribe texto, lee el portapapeles, gestiona pestañas del navegador, toma capturas de pantalla, ejecuta Atajos — 18 herramientas tipadas con validación de entrada y salvaguardas de seguridad.

npm version macOS 13+ Node 18+ License: MIT Tests: 84 passed Tests m0rvayne/mcp-osascript MCP server

Listado en el Registro oficial de MCP como io.github.m0rvayne/mcp-osascript


Demo

Inicio rápido

Claude Desktop — un clic. Descarga mcp-osascript-1.1.3.mcpb desde la última versión y haz doble clic. Claude Desktop instala la extensión por sí mismo.

O agrégalo a la configuración manualmente:

{
  "mcpServers": {
    "osascript": {
      "command": "npx",
      "args": ["-y", "mcp-osascript"]
    }
  }
}

Añade esto a tu configuración de Claude Desktop (Settings → Developer → Edit Config), reinicia Claude y estarás listo.

Configuración para otros clientes (Cursor, VS Code, Claude Code)

Cursor / VS Code (Copilot)

{
  "mcpServers": {
    "osascript": {
      "command": "npx",
      "args": ["-y", "mcp-osascript"]
    }
  }
}

Claude Code

claude mcp add osascript -- npx -y mcp-osascript

Desde el código fuente (desarrollo)

git clone https://github.com/m0rvayne/mcp-osascript.git
cd mcp-osascript && npm install
# then use: "command": "node", "args": ["/path/to/mcp-osascript/server/index.js"]

Prueba estos comandos

Una vez instalado, pídele a Claude:

ComandoQué sucede
"Abre Safari y muéstrame qué pestañas tengo"Lanza Safari, lee todos los títulos y URLs de las pestañas
"Mueve la ventana del Finder a la mitad izquierda de mi pantalla"Redimensiona y posiciona la ventana
"Haz clic en Archivo → Exportar como PDF en Keynote"Navega por la barra de menús y hace clic en el elemento
"Copia la URL de mi pestaña activa de Chrome"Lee las pestañas del navegador y encuentra la activa
"Escribe 'Hola Mundo' en el campo de texto activo"Simula la entrada del teclado
"Muestra una notificación cuando termines"Muestra un banner nativo de macOS
"¿Qué aplicación estoy usando ahora mismo?"Devuelve el nombre y el ID del paquete de la aplicación en primer plano
"Pulsa Cmd+Shift+4"Activa el atajo de captura de pantalla
"Lista todos los elementos del menú Edición de VS Code"Inspecciona la barra de menús
"Cierra la segunda ventana de Terminal"Apunta a una ventana específica por índice
"Captura la ventana de Safari y guárdala en mi escritorio"Captura solo esa ventana, no toda la pantalla
"¿En qué monitor está mi ventana de Slack?"Lee la geometría de la pantalla y las posiciones de las ventanas
"Oculta todo excepto mi editor"Oculta aplicaciones sin cerrarlas
"Ejecuta mi atajo 'Daily Standup'"Invoca un Atajo de Apple por nombre

Herramientas

18 herramientas tipadas, cada una con validación de entrada, clasificación de errores y mensajes de error conscientes de permisos.

HerramientaQué hacePermiso
check_permissionsInforma qué permisos están concedidos y qué desbloquea cada unoNinguno
run_osascriptEjecuta cualquier script de AppleScript o JXANinguno
get_clipboardLee el portapapeles como textoNinguno
set_clipboardEscribe texto en el portapapelesNinguno
send_notificationMuestra un banner de notificación de macOSNinguno
open_urlAbre URL en el navegador (solo http/https/mailto)Ninguno
open_appLanza o trae una aplicación al frenteNinguno
get_frontmost_appObtiene el nombre de la aplicación activa + ID del paqueteAutomatización
get_browser_tabsLista pestañas en Safari, Chrome o ArcAutomatización
type_textEscribe texto en la aplicación activa (máx. 500 caracteres)Accesibilidad
press_keyPulsa teclas con modificadores (cmd+c, return, f5)Accesibilidad
manage_windowsLista / mueve / redimensiona / minimiza / pantalla completa / cierraAccesibilidad
get_displaysLista monitores — posición, tamaño, cuál es el principalNinguno
app_menuLista o hace clic en elementos de menú en cualquier aplicaciónAccesibilidad
screenshotCaptura pantalla completa, una región o una ventana de aplicaciónGrabación de pantalla
app_visibilityOculta, muestra o cierra una aplicaciónAccesibilidad
file_openAbre un archivo o carpeta, opcionalmente en una aplicación dadaNinguno
run_shortcutLista o ejecuta Atajos de AppleNinguno

Menús autocorrectivos

Cuando Claude intenta hacer clic en un elemento de menú que no existe, el servidor devuelve automáticamente la lista de elementos disponibles en ese nivel — para que Claude pueda reintentar con el nombre correcto. Ningún otro servidor MCP hace esto.

User:   "Click File → Export as PDF in Preview"
Claude: calls app_menu click ["File", "Export as PDF"]
Server: "Menu item 'Export as PDF' not found in 'File'.
         Available: ['New from Clipboard', 'Open...', 'Close', 'Save',
         'Duplicate', 'Rename...', 'Export...', 'Export as PDF...']"
Claude: calls app_menu click ["File", "Export as PDF..."]
Server: "Clicked: File > Export as PDF..."

¿Por qué mcp-osascript?

mcp-osascriptsteipete (880★)peakmojo (464★)
Herramientas tipadas con validación182 (genéricas)1 (genérica)
Lista blanca de esquemas de URLhttp/https/mailtoNoNo
Aislamiento de entorno (proceso hijo)Solo PATH+HOME+LANGprocess.env completoprocess.env completo
Terminación de grupo de procesos (sin huérfanos)SIGTERM→SIGKILLNoNo
Saneamiento de errores (rutas, tokens)SíNoNo
Protección contra contaminación de prototiposObject.create(null)NoNo
Clic de menú autocorrectivoSíNoNo
Pruebas de integración8400
Ejecuta pruebas en CISíNoNo
Auditorías de equipo rojo aprobadas400
Aislamiento de salida no confiableSíNoNo
Tubería de stdin (sin archivos temporales)SíArchivos temporalesArchivos temporales

Los conteos de estrellas son una medida de popularidad, no de calidad — ambas alternativas preceden a este proyecto por meses. Las filas anteriores son las cosas que difieren en la práctica.

Auditorías de seguridad

Cuatro pases de auditoría de equipo rojo (agentes adversariales ejecutados contra el código fuente, encargados por el autor — no una certificación de terceros), la más reciente contra v1.1.2 con tres agentes paralelos que cubren la superficie de shell, el escape de AppleScript y la divulgación de información. Encontró seis defectos reales, incluida una herramienta que anulaba silenciosamente la lista blanca de esquemas de otra herramienta y una ranura de concurrencia que podía filtrarse hasta que el servidor se bloqueaba. Cada hallazgo está corregido y lleva una prueba de regresión. escapeAS fue verificado contra 13 candidatos de ruptura de cadenas a través de osascript real — ninguno escapa.

Permisos

Las herramientas funcionan en tres niveles:

  • Sin permiso necesario — portapapeles, notificaciones, URLs, aplicaciones, archivos, pantallas, Atajos. Funciona de inmediato.
  • Automatización — pestañas del navegador, aplicación en primer plano. macOS solicita una vez por navegador.
  • Accesibilidad — teclado, ventanas, menús, ocultar/mostrar. Concede una vez en Configuración del Sistema → Privacidad y Seguridad → Accesibilidad.
  • Grabación de pantalla — solo capturas de pantalla. Concede en Configuración del Sistema → Privacidad y Seguridad → Grabación de pantalla.

Pídele a Claude que ejecute check_permissions y te dirá cuáles de estos ya están concedidos, qué herramientas desbloquea cada uno y exactamente qué panel de configuración abrir para el resto. Las sondas son de solo lectura y nunca activan una solicitud de permiso.

Cuando falta un permiso, el servidor te dice exactamente qué hacer:

"Accessibility permission required. Grant access to 'osascript'
in System Settings > Privacy & Security > Accessibility."

Pruebas

npm test

84 pruebas de integración que cubren las 18 herramientas — validación de entrada, límites de seguridad (bloqueo de esquemas de URL, contaminación de prototipos, límites de tamaño de script), aplicación de tiempos de espera, manejo de errores de permisos y regresiones para cada hallazgo de la auditoría de seguridad.

Seguridad y Arquitectura

Seguridad

  • run_osascript ejecuta código arbitrario — esto es por diseño. El cliente MCP (Claude) es el límite de confianza.
  • Scripts canalizados vía stdin a /usr/bin/osascript — sin archivos temporales, sin condiciones de carrera TOCTOU.
  • Tamaño del script: máx. 50 KB. Salida: máx. 50K caracteres, truncada en un límite de carácter UTF-8 (sin mojibake en salida no latina).
  • Mensajes de error saneados — se eliminan rutas de archivos, tokens y contraseñas.
  • Los procesos hijos obtienen un entorno mínimo: solo PATH, HOME, LANG — sin fugas de claves API o secretos.
  • Lista blanca de esquemas de URL — file://, smb://, vnc://, javascript: todos bloqueados.
  • El despacho de manejadores usa Object.create(null) — sin contaminación de prototipos.
  • El texto de fuentes externas (títulos de pestañas del navegador, títulos de ventanas, elementos de menú, portapapeles) se devuelve dentro de un sobre explícito <untrusted-data>, para que una página web que se renombre a sí misma no pueda introducir instrucciones en el contexto del modelo.
  • file_open rechaza cualquier cosa que se analice como URL — open(1) resuelve URLs además de rutas, por lo que sin esa verificación anularía silenciosamente la lista blanca de esquemas de open_url.
  • screenshot nunca sobrescribe un archivo existente a menos que overwrite: true, y la extensión debe coincidir con el formato.
  • Cada herramienta de construcción de listas elimina |, CR y LF de los nombres proporcionados por la aplicación, para que un título de ventana o pestaña manipulado no pueda falsificar un registro.

Fiabilidad

  • Terminación de grupo de procesos en tiempo de espera — SIGTERM → 2s de gracia → SIGKILL. Sin procesos huérfanos.
  • Semáforo de concurrencia — máx. 5 procesos osascript simultáneos.
  • Apagado elegante — server.close() con red de seguridad de salida forzada de 10s.
  • Clasificación de errores — analiza códigos de error de macOS (-1728, -1743, -25211) en mensajes accionables. Soporta locales en inglés y ruso.

Requisitos

  • macOS 13+ (Ventura o posterior)
  • Node.js 18+

Licencia

MIT