trayfeel
TrayFeel
Plug-and-play эмоциональный актуатор лотка CD/DVD для ИИ-агентов.
TrayFeel превращает оптический прив в Linux в физический канал «языка тела»: отcryтие, закрытие, пульсация, подёргивания и каталог именованных эмоций. Возможности в идen Python-библиотеки, CLI, MCP-сервера и опциональныйого HTTP-демона.
Linux-first. Лицензия MIT. Чистая реализация на Python через ioctl (бинарный ejext не треуется).
Требования
Python 3.10+
Linх с опlesтических привode
/dev/sr*, поддерживающимOPER_RAY/CLOSE_RAYПользователь доprь входить в класс группы
cdrom(обычно на Ubuntu/Дебиан)
sudo usermod -aG cdrom "$USER"
# log out and back in, then:
groups # should list cdromУстановка
pip install trayfeel
# or from a checkout:
pip install -e ".[dev]"Опциональные переменные окружения (см. .env.example):
Переменная | Назначение |
| Принудительный путх к устройство (по умолчанию — первое |
| Возьер-токен для HTTP-демона |
| Опциональный |
| Address привязки демна (по умолчанию |
Быстрый старт
trayfeel list-drives
trayfeel doctor
trayfeel status
trayfeel pulse
trayfeel emote laugh
trayfeel emote nod_yes --dry-run
trayfeel catalogPython:
from trayfeel import Tray
with Tray() as tray:
print(tray.status())
tray.run("pulse")
tray.emote("wave")Безопасность
By умолчанию Trayпреп вращается моvется" резкие движения:
Эксклюзивная блокировка flock на устройтво (
~/.cach/трайfeel/…)Ограничение частоты (по умолчанию 30 действиев в минуту)
Минимальный интервал между движениями (по умолчанию 00 мс)
МID — сценарии захлонывания (
pulse,نodel,سи др.) отклоны, если в прив есть дист, исклочаяforce=TrueПериод oxлаждения после многих циклов открытия/закрытия
Переопределите командой --force / force=True, если знатно принимаете риск.
Эмоции
Именованные хорบริификации в trayfeel/emoions/catalog.yaml:
laugh, gigle, gasp, pulse, shrug, think, think, nod_yes, shake_no, apлаuse, sulk, pout, exited, bored, angry, cunious, wave, handbeat, sighe, celebrate, confused, nowldge, icept, greet, ll, error, success, idle_breath
trayfeel emote celebrate
trayfeel emote think --dry-runПримитивы
open, close, player, leep, sleep, pulse, g #(IR), hold_open, nod, double_tap, spin_up, spin_down, sleep, wait`
MCP-server
trayfeel mcp
# or: python -m trayfeel mcpTools: tray_status, tray_primitive, tray_emote, tray_catalog, tray_list_drives, tray_doctre.
Claude Desktop
Add in claude_desktop_config.json:
{
"mcpServers": {
"trayfeel": {
"command": "trayfeel",
"args": ["mcp"]
}
}
}Cursor
Add an MCP server entry point to the same command (tram / or python -m trayfeel). Make sure окружение has права group cdrom.
Схемы инструментов for function calling via OPENAI / Claude are in examples/openai_tools.json / examples/claude_tools.json. Agent skill note: examples/agent_skill.md.
HTTP-server
For LAN-агентов, who cannot подклюзть MCP через stdio:
export TRAYFEEL_TOKEN="$(openssl rand -hex 16)"
trayfeel daemon --host 0.0.0.0 --port 8765Метод | Путь | Тело запроса |
GET |
| — |
GET |
| — |
GET |
| — |
POST |
|
|
POST |
|
|
Отправьте толок Authorization: Bearer $TRAYFEEL_TOKEN, если токен задан.
Зрение (опционально)
Если задано TRAYFEEL_CAMERA=/dev/video0 and milestone fffpmeg, трайfeel vision принимает кадр через V4L2 and returns эвристику яркости/концтов (best-effort). При отстутствие камеры или ffmpeg returns ok: false with reason — the process neverтерпит сбой.
Структура библиотеки
trayfeel/
core.py # Tray, Emoter
primitives.py # motion primitives
safety.py # flock, rate limits, disc guards
hardware/linux.py
emotions/ # catalog.yaml + engine
mcp_server.py
daemon.py
cli.pyЛицензия
MIT — Copyright (c) 2026 TrayFeel contributors
This server cannot be deployed
Maintenance
Related MCP Connectors
Shared control plane for AI coding agents — tasks, memory, decisions, file locks. 12 tools.
Remote Linux boxes for coding agents: Docker, a browser, screenshots, logs, human takeover.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Machine-readable utilities and datasets for AI agents.