hyprland-mcp
hyprland-mcp
MCP-сервер, позволяющий Claude управлять Hyprland через hyprctl.
Общается с Hyprland через его IPC-сокет с помощью hyprctl/hyprctl -j, и вызывает внешние утилиты grim/slurp/notify-send для скриншотов и уведомлений. Работает через stdio, поэтому работает только при запуске внутри вашего сеанса Hyprland (или с переданным HYPRLAND_INSTANCE_SIGNATURE).
Инструменты
Окна:
list_windows,get_active_window,focus_window,close_window,kill_active_window,kill_window,send_window_signal,move_window_to_workspace,move_active_window,resize_active_window,toggle_floating,toggle_pseudo_tiled,toggle_fullscreen,set_fullscreen_state,pin_window,bring_window_to_top,center_window,cycle_next_window,swap_window,alter_z_order,toggle_swallowРабочие пространства:
list_workspaces,get_active_workspace,switch_workspace,move_workspace_to_monitor,rename_workspace,toggle_special_workspace,change_workspace_id,swap_monitor_workspacesМониторы:
list_monitors,focus_monitor,set_monitor_configКонфигурация:
get_config_option,set_config_option,reload_hyprland_config,get_hyprland_versionГорячие клавиши:
list_keybindsУведомления:
send_notification,dismiss_notificationsСкриншоты:
take_screenshot,take_region_screenshot(интерактивно, через slurp),screenshot_active_windowЗапуск приложений:
toggle_launcher,prewarm_launcher_daemon(управляет hyprlauncher, штатным средством запуска приложений Hyprland — самоотключающимся демоном, а не диспетчером hyprctl)Теги:
tag_window,clear_window_tagsГруппы (вкладки):
toggle_group,group_cycle,toggle_group_lock,deny_window_from_group,group_active_window,move_window_in_groupКурсор:
move_cursor,move_cursor_to_corner,focus_directionСистема:
set_submap,exec_raw,exec_cmd,toggle_dpms,layout_message,list_instances,exit_hyprlandhyprsunset (фильтр синего света):
set_sunset_temperature,disable_sunset_filter,set_sunset_gamma,reset_sunset,get_sunset_profilehyprpaper (обои):
set_wallpaper,list_active_wallpapershypridle (управление бездействием):
start_hypridle,stop_hypridle,get_hypridle_statushyprlock (блокировка экрана):
lock_screen,unlock_screen,refresh_lockscreen,get_lock_status,clear_crashed_lockscreenhyprpicker (выбор цвета):
pick_colorЗапасные выходы:
hyprland_dispatch(любойhyprctl dispatch <dispatcher>),hyprctl_raw(любая сырая подкомандаhyprctl)
Related MCP server: device-controller-mcp
Требования
Node.js 18+
Hyprland (очевидно) с
hyprctlвPATHОпционально:
grim+slurpдля скриншотов,notify-send(mako/dunst/аналоги) для уведомлений,hyprlauncherдля инструментов запуска приложений,hyprsunsetдля инструментов фильтра синего света,hyprpaper(сipc = true, по умолчанию, вhyprpaper.conf) для инструментов обоев,hypridle/hyprlockдля инструментов бездействия/блокировки,hyprpicker(+wl-clipboardдля его опции автокопирования) для инструмента выбора цвета,pgrep/pkill(procps/procps-ng, практически всегда предустановлены) для инструментов hypridle/hyprlock и hyprlauncher — все они корректно деградируют или выдают понятную ошибку при отсутствии.
Сборка
npm install
npm run buildЭто создаёт build/index.js.
Подключение
Claude Code
claude mcp add hyprland -- node /absolute/path/to/hyprland-mcp/build/index.jsClaude Desktop
Добавьте в claude_desktop_config.json:
{
"mcpServers": {
"hyprland": {
"command": "node",
"args": ["/absolute/path/to/hyprland-mcp/build/index.js"]
}
}
}Claude Desktop в Linux запускается вашим сеансом, поэтому HYPRLAND_INSTANCE_SIGNATURE
уже должен быть в его окружении. Если вы когда-либо запускаете это из контекста, где его
нет (например, systemd-юнит, SSH-сессия или этот же инструмент, запускающий Claude Code
внутри песочницы), сначала экспортируйте его, например:
export HYPRLAND_INSTANCE_SIGNATURE=$(ls /tmp/hypr | head -n1)Тестирование
src/dispatch-expressions.ts содержит чистые, не имеющие побочных эффектов построители для каждого Lua-выражения, которое этот проект отправляет в hyprctl dispatch — без вызовов hyprctl/child_process, поэтому их можно модульно тестировать без реального сеанса Hyprland:
npm testЭто запускает tsc, а затем встроенный тестовый раннер Node над
src/__tests__/dispatch-expressions.test.ts, проверяя точную строку, которую выдаёт каждый
построитель — включая два дословных примера из вики (window.tag с целью,
workspace.toggle_special с аргументом в виде голой строки). Именно это на самом деле
отлавливает дрейф синтаксиса: когда будущий релиз Hyprland изменит форму hl.dsp.*,
обновите построитель и его тест вместе, а не трогайте только место вызова, спрятанное
внутри обработчика инструмента.
Он уже поймал одну реальную ошибку во время разработки: denyWindowFromGroupExpr()
без цели выдавал hl.dsp.window.deny_from_group({ }) (пустую таблицу) вместо чистого
(), потому что построитель всегда передавал объект аргументов, даже когда каждый ключ
в нём был undefined. Стоит знать, если вы добавляете новый построитель, где
цель/селектор является единственным возможным ключом — luaCall() в src/hyprctl.ts
теперь автоматически обнаруживает объекты со всеми undefined и сворачивает их в
простой вызов path(), но всё равно хорошей практикой будет строить весь объект
аргументов условно для неочевидных случаев. Аналогичное улучшение luaCall
(автосворачивание пустых таблиц в голое ()) также исправило тот же краевой случай
для clearWindowTagsExpr, bringWindowToTopExpr, centerWindowExpr,
cycleNextWindowExpr и moveGroupWindowExpr при вызове без целей.
Примечание по безопасности: unlock_screen
hyprlock не имеет IPC, учитывающего пароль — его единственный документированный
механизм разблокировки — SIGUSR1 (pkill -USR1 hyprlock), который инструмент
unlock_screen этого проекта использует напрямую. Это означает, что он полностью
обходит аутентификацию PAM/пароль: всё, что может вызвать этот MCP-инструмент,
может разблокировать заблокированный сеанс, не зная пароля. Это не ошибка и не
упущение, это единственный механизм разблокировки, который предоставляет hyprlock —
но это означает, что доступ к этому MCP-серверу следует рассматривать как
эквивалентный по чувствительности собственной границе безопасности вашей блокировки
экрана. Не подключайте этот сервер там, где блокировка экрана должна быть реальным
барьером (например, на общем/недоверенном компьютере), не учитывая это.
Заметки по дизайну
hyprsunsetиhyprpaperуправляются через собственные семейства подкомандhyprctl <name> <args>(hyprctl hyprsunset ...,hyprctl hyprpaper ...) — какkeyword/getoption, они не затронуты переписыванием Lua-диспетчера в версии 0.55, поэтомуsrc/tools/hyprsunset.tsиhyprpaper.tsвызываютrunHyprctl()напрямую без использования Lua-выражений.Все вызовы
hyprctlпроходят черезexecFile(никогда через оболочку), поэтому аргументы никогда не могут быть использованы для внедрения команд оболочки.Команды чтения (
list_*,get_*) всегда проходят черезhyprctl -jи парсятся как JSON, чтобы Claude получал структурированные данные, а не текст для просмотра глазами.Каждый выделенный инструмент — это тонкая обёртка вокруг конкретного диспетчера/подкоманды.
hyprland_dispatchиhyprctl_rawсуществуют как запасные выходы для всего, что ещё не обёрнуто (Hyprland добавляет диспетчеры между релизами) — проверьтеhyprctl dispatch --helpили вики Hyprland для полного списка.Инструменты скриншотов записывают во временную директорию, кодируют в base64 и очищают за собой.
Инструменты перемещения/изменения размера используют соглашения о аргументах диспетчера
exact/relative Hyprland (moveactive,resizeactive), а не перереализуют геометрические вычисления.
Расширение
Добавьте новый файл в src/tools/, экспортируйте функцию register*Tools(server) и
вызовите её из src/index.ts. Держите одну область ответственности hyprctl
(например, слои, устройства, закреплённые/специальные рабочие пространства) в одном
файле, чтобы проектом было легко ориентироваться.
Maintenance
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
- AlicenseAqualityDmaintenanceAn MCP server for Hyprland desktop automation that allows AI assistants to see the screen, control mouse and keyboard, and manage windows using native Wayland tools. It integrates OCR for text-based interaction and supports complex multi-monitor setups with pixel-accurate coordinate mapping.275MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that lets Claude Desktop and Claude Code control your PC — take screenshots, click, type, manage windows, and more.MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that lets Claude operate your real computer by moving the actual mouse, clicking, typing, and reading the actual screen, working with your own logged-in sessions in any application.MIT
- AlicenseAqualityAmaintenanceAn MCP server for Hyprland that enables AI agents to control workspaces, windows, mouse, keyboard, and take screenshots on a Wayland desktop.147MIT
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Markdown-first MCP server for Notion API with 8 composite tools and 39 actions.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/keanehatescoding/hyprland-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server