orca
Orca — MCP-сервер для ATK-доступности
Захватывает дерево виджетов ATK (Accessibility Toolkit) из запущенных на Linux GTK-приложений, нормализует его к ролям/типам ARIA, применяет настраиваемую декларативную политику безопасности и предоставляет результат в виде инструментов MCP любому стандартному MCP-клиенту (Claude, Cursor, Windsurf и т.п.).
Быстрый старт
cd orca
just shell # enter nix-shell with all dependencies
just server # start the MCP server on stdioИли вручную:
nix-shell
PYTHONPATH=src python3 -m srcRelated MCP server: claude-workman
Архитектура
orca/
├── shell.nix # nix-shell environment
├── pyproject.toml # package config
├── Justfile # task runner
├── docs/
│ ├── README.md # this file
│ ├── usage.md # client integration guide
│ ├── policy.md # policy engine reference
│ ├── atk.md # ATK capture internals
│ └── contribute.md # development guide
└── src/
├── __init__.py
├── __main__.py # entry point
├── atk.py # ATK tree capture
├── normalize.py # ATK→ARIA normalization
├── policy.py # declarative security policy
├── server.py # MCP server
└── default_policy.yaml # ship-default policyИнструменты MCP
Инструмент | Параметры | Описание |
| нет | Полное ARIA-нормализованное дерево, отфильтрованное политикой |
|
| Дерево конкретного приложения (glob-шаблон fnmatch) |
|
| Поиск одного узла по |
| нет | Объекты верхнего уровня приложений (name, pid, role) |
Конфигурация
Политика
Файлы политики загружаются в следующем порядке приоритета:
~/.config/atk-mcp/policy.yaml(переопределение пользователя)src/default_policy.yaml(встроенный вариант по умолчанию)
Если ни один из файлов не существует либо какой-то из них не удаётся разобрать, сервер запускается с default_action: allow и без пользовательских правил.
Политика загружается один раз при запуске — перезапустите сервер, чтобы изменения вступили в силу.
Полное описание схемы и примеры — в docs/policy.md.
Окружение Nix
Все зависимости управляются через shell.nix. Никаких uv и virtualenv.
Ключевые пакеты:
python314— среда выполненияpython314Packages.pyatspi— доступ к дереву ATKpython314Packages.pygobject3— интроспекция GIpython314Packages.mcp— MCP SDK v2python314Packages.pydantic-settings— конфигурация политикиpython314Packages.pyyaml— разбор политикиat-spi2-core,at-spi2-atk,atk,gtk3— рантайм-библиотеки
Использование
С Cursor
Добавьте в ~/.cursor/mcp.json:
{
"mcpServers": {
"atk-accessibility": {
"command": "nix-shell",
"args": ["--run", "python -m src"],
"cwd": "/path/to/orca"
}
}
}С Claude Desktop
Добавьте в ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"atk-accessibility": {
"command": "nix-shell",
"args": ["--run", "python -m src"],
"cwd": "/path/to/orca"
}
}
}С Windsurf
Добавьте в .mcp.json в вашем проекте:
{
"mcpServers": {
"atk-accessibility": {
"command": "nix-shell",
"args": ["--run", "python -m src"],
"cwd": "/path/to/orca"
}
}
}Из командной строки (интерактивный тест)
just shell
python -m src # runs indefinitely on stdioПередайте сырой MCP-запрос, чтобы проверить отдельные инструменты:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
| python -m srcМеханизм политик
Полный справочник: docs/policy.md.
Быстрый пример — запретить все узлы heading и скрыть имена textbox:
default_action: allow
built_in_deny:
aria_roles:
- "password"
state_keywords:
- "hidden"
- "invisible"
rules:
- id: deny-headings
conditions:
role: "heading"
action: deny
- id: redact-forms
conditions:
role: "textbox"
action: redact
redact_fields:
- "name"
- "description"Захват ATK
Внутреннее устройство — в docs/atk.md. Ключевые моменты:
Рекурсивно обходит корень рабочего стола
gi.repository.AtspiFail-closed: изоляция в подпроцессе предотвращает падение сервера из-за аварийного завершения GLib при отсутствии шины AT-SPI
Для каждого узла сохраняются:
obj_id,role(int),role_name,name,description,state_set,attributes,child_count,index_in_parent,app_name,pid
Нормализация
Карта ролей — в docs/normalize.md.
Целочисленные роли ATK (0–132) сопоставляются со строками ролей ARIA. Несопоставленные роли передаются как есть — строкой role_name. Имена состояний преобразуются (например, FOCUSED → focused, CHECKED → checked).
Разработка
Руководство по разработке — docs/contribute.md.
just shell # enter dev environment
just test # run verification suite
just compile # syntax check
just lint # import + smoke check
just server # start server for manual testingОграничения
Wayland-приложения без AT-SPI: Некоторые нативные Wayland GTK-приложения не раскрывают интерфейсы AT-SPI. Для таких приложений
get_tree_for_appвозвращает[]. Ожидаемое поведение, а не ошибка.Без горячей перезагрузки: Политика загружается один раз при запуске.
Требуется шина AT-SPI: без запущенной шины доступности (например,
at-spi-bus-launcher) модуль ATK корректно возвращает[].Python 3.14+: без зависимости
typing-extensions.
Лицензия
MIT
Related MCP Connectors
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
Managed MCP gateway with OAuth, per-agent permissions, shared accounts and activity logs.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables browser automation through the MCP protocol, allowing AI agents to control a real browser using accessibility snapshots and natural language commands.-
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to control a Linux/X11 desktop like a human: see the screen, move the mouse, click UI elements via the accessibility tree, type text, and manage windows.MIT
- -licenseNot gradedqualityCmaintenanceStandalone MCP server for desktop GUI automation on macOS and Windows, exposing a unified tool for accessibility-tree snapshots, input, app control, and browser CDP fast path, driven by any MCP host.-
- FlicenseNot gradedqualityBmaintenanceEnables MCP clients to discover and invoke WebMCP tools registered in pages open in Orca's embedded browser, without extensions or bridges.1-