mcp-osascript
Permite que Claude controle tu Mac: 12 herramientas escritas para ventanas, menús, teclado, portapapeles y pestañas del navegador.
Documentación
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.
Listado en el Registro oficial de MCP como io.github.m0rvayne/mcp-osascript

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:
| Comando | Qué 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.
| Herramienta | Qué hace | Permiso |
|---|---|---|
check_permissions | Informa qué permisos están concedidos y qué desbloquea cada uno | Ninguno |
run_osascript | Ejecuta cualquier script de AppleScript o JXA | Ninguno |
get_clipboard | Lee el portapapeles como texto | Ninguno |
set_clipboard | Escribe texto en el portapapeles | Ninguno |
send_notification | Muestra un banner de notificación de macOS | Ninguno |
open_url | Abre URL en el navegador (solo http/https/mailto) | Ninguno |
open_app | Lanza o trae una aplicación al frente | Ninguno |
get_frontmost_app | Obtiene el nombre de la aplicación activa + ID del paquete | Automatización |
get_browser_tabs | Lista pestañas en Safari, Chrome o Arc | Automatización |
type_text | Escribe texto en la aplicación activa (máx. 500 caracteres) | Accesibilidad |
press_key | Pulsa teclas con modificadores (cmd+c, return, f5) | Accesibilidad |
manage_windows | Lista / mueve / redimensiona / minimiza / pantalla completa / cierra | Accesibilidad |
get_displays | Lista monitores — posición, tamaño, cuál es el principal | Ninguno |
app_menu | Lista o hace clic en elementos de menú en cualquier aplicación | Accesibilidad |
screenshot | Captura pantalla completa, una región o una ventana de aplicación | Grabación de pantalla |
app_visibility | Oculta, muestra o cierra una aplicación | Accesibilidad |
file_open | Abre un archivo o carpeta, opcionalmente en una aplicación dada | Ninguno |
run_shortcut | Lista o ejecuta Atajos de Apple | Ninguno |
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-osascript | steipete (880★) | peakmojo (464★) | |
|---|---|---|---|
| Herramientas tipadas con validación | 18 | 2 (genéricas) | 1 (genérica) |
| Lista blanca de esquemas de URL | http/https/mailto | No | No |
| Aislamiento de entorno (proceso hijo) | Solo PATH+HOME+LANG | process.env completo | process.env completo |
| Terminación de grupo de procesos (sin huérfanos) | SIGTERM→SIGKILL | No | No |
| Saneamiento de errores (rutas, tokens) | Sí | No | No |
| Protección contra contaminación de prototipos | Object.create(null) | No | No |
| Clic de menú autocorrectivo | Sí | No | No |
| Pruebas de integración | 84 | 0 | 0 |
| Ejecuta pruebas en CI | Sí | No | No |
| Auditorías de equipo rojo aprobadas | 4 | 0 | 0 |
| Aislamiento de salida no confiable | Sí | No | No |
| Tubería de stdin (sin archivos temporales) | Sí | Archivos temporales | Archivos 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_osascriptejecuta 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_openrechaza 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 deopen_url.screenshotnunca sobrescribe un archivo existente a menos queoverwrite: 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