Skip to main content
Glama
00011110

trayfeel

by 00011110

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*, das OPEN_TRAY / CLOSE_TRAY unterstützt

  • Benutzermitgliedschaft in der Gruppe cdrom (typisch unter Ubuntu/Debian)

sudo usermod -aG cdrom "$USER"
# log out and back in, then:
groups   # should list cdrom

Installation

pip install trayfeel
# or from a checkout:
pip install -e ".[dev]"

Optionale Umgebungsvariablen (siehe .env.example):

Variable

Zweck

TRAYFEEL_DEVICE

Erzwingt Gerätepfad (Standard: erstes /dev/sr*)

TRAYFEEL_TOKEN

Bearer-Token für den HTTP-Daemon

TRAYFEEL_CAMERA

Optional /dev/videoN für visuelles Feedback

TRAYFEEL_HOST / TRAYFEEL_PORT

Daemon-Bind (Standard 127.0.0.1:8765)

Schnellstart

trayfeel list-drives
trayfeel doctor
trayfeel status
trayfeel pulse
trayfeel emote laugh
trayfeel emote nod_yes --dry-run
trayfeel catalog

Python:

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 bei force=True

  • Abklingzeit 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-run

Primitive

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 mcp

Tools: 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 8765

Methode

Pfad

Body

GET

/health

—

GET

/status

—

GET

/catalog

—

POST

/primitive

{"name":"pulse","open_ms":300}

POST

/emote

{"name":"wave"}

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.py

Lizenz

MIT — Copyright (c) 2026 TrayFeel-Mitwirkende

Related MCP Connectors