trayfeel
TrayFeel
Plug-and-Play-Emotionsaktor für CD/DVD-Laufwerke für KI-Agenten.
TrayFeel verwandelt ein optisches Linux-Laufwerk in einen physischen Körpersprache-Kanal: open, close, pulse, wiggle und einen Katalog benannter Emotionen – verfügbar als Python-Bibliothek, CLI, MCP-Server und optionaler HTTP-Daemon.
Linux-first. MIT-lizenziert. Reiner Python-ioctl-Pfad (kein eject-Binary erforderlich).
Voraussetzungen
Python 3.10+
Linux mit optischem Laufwerk
/dev/sr*, dasOPEN_TRAY/CLOSE_TRAYunterstütztBenutzermitgliedschaft in der Gruppe
cdrom(typisch unter Ubuntu/Debian)
sudo usermod -aG cdrom "$USER"
# log out and back in, then:
groups # should list cdromInstallation
pip install trayfeel
# or from a checkout:
pip install -e ".[dev]"Optionale Umgebungsvariablen (siehe .env.example):
Variable | Zweck |
| Erzwingt Gerätepfad (Standard: erstes |
| Bearer-Token für den HTTP-Daemon |
| Optional |
| Daemon-Bind (Standard |
Schnellstart
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")Sicherheit
TrayFeel verweigert standardmäßig riskante Bewegungen:
Exklusives flock pro Gerät (
~/.cache/trayfeel/…)Ratenlimit (Standard: 30 Aktionen/Minute)
Mindestintervall zwischen Bewegungen (Standard: 200 ms)
Disc-Schutz — Slam-Muster (
pulse,wiggle,nod, …) werden bei eingelegter Disc verweigert, außer beiforce=TrueAbklingzeit nach vielen open/close-Zyklen
Mit --force / force=True überschreiben, wenn du das Risiko bewusst akzeptierst.
Emotionen
Benannte Choreografien in trayfeel/emotions/catalog.yaml:
laugh, giggle, gasp, surprise, shrug, think, ponder, nod_yes, shake_no, applause, sulk, pout, excited, bored, angry, curious, wave, heartbeat, sigh, celebrate, confused, acknowledge, reject, greet, farewell, error, success, idle_breath
trayfeel emote celebrate
trayfeel emote think --dry-runPrimitive
open, close, toggle, lock, unlock, status, pulse, wiggle, hold_open, nod, double_tap, spin_up, spin_down, sleep, wait
MCP-Server
trayfeel mcp
# or: python -m trayfeel mcpTools: tray_status, tray_list_drives, tray_primitive, tray_emote, tray_catalog, tray_doctor.
Claude Desktop
Füge Folgendes zu claude_desktop_config.json hinzu:
{
"mcpServers": {
"trayfeel": {
"command": "trayfeel",
"args": ["mcp"]
}
}
}Cursor
Füge einen MCP-Server-Eintrag hinzu, der auf denselben Befehl zeigt (trayfeel mcp oder python -m trayfeel mcp). Stelle sicher, dass die Umgebung über Berechtigungen der Gruppe cdrom verfügt.
Tool-Schemas für OpenAI-/Claude-Funktionsaufrufe befinden sich in examples/openai_tools.json und examples/claude_tools.json. Agent-Skill-Notizen: examples/agent_skill.md.
HTTP-Daemon
Für LAN-Agenten, die kein stdio-MCP anhängen können:
export TRAYFEEL_TOKEN="$(openssl rand -hex 16)"
trayfeel daemon --host 0.0.0.0 --port 8765Methode | Pfad | Body |
GET |
| — |
GET |
| — |
GET |
| — |
POST |
|
|
POST |
|
|
Sende Authorization: Bearer $TRAYFEEL_TOKEN, wenn ein Token konfiguriert ist.
Vision (optional)
Wenn TRAYFEEL_CAMERA=/dev/video0 gesetzt und ffmpeg installiert ist, erfasst trayfeel vision ein Einzelbild über V4L2 und liefert eine Best-Effort-Heuristik für Helligkeit/Kanten. Fehlt Kamera oder ffmpeg, wird ok: false mit einem Grund zurückgegeben – der Prozess stürzt dadurch nie ab.
Bibliotheksstruktur
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.pyLizenz
MIT — Copyright (c) 2026 TrayFeel-Mitwirkende
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.