Key difference
The agent chooses the sound. Instead of automatically playing a fixed sound on every event, the agent callsplay_sound with exactly what it wants:
duke_nukem/SonOfABitchwhen a build failssc_kerrigan/IReadYouwhen reading filesglados/YourEntireTeamIsDeadwhen tests fail
Requirements
- Node.js 18+
- PeonPing installed (macOS, Linux, or WSL2)
Setup
Install MCP dependencies
If installed via Homebrew, the MCP server is at
$(brew --prefix peon-ping)/libexec/mcp/.MCP features
Tool: play_sound
Play one or more sound effects. Parameters:sound(string, optional) — Single sound key like"peon/PeonReady1"sounds(array, optional) — Multiple sound keys like["peon/WorkWork", "peon/JobsDone"]
Resource: peon-ping://catalog
Full pack catalog — all packs and sounds. The client reads this once, giving the model full context without repeated tool calls. Example output:Resource: peon-ping://pack/
Sounds in a specific pack, grouped by category. Example: peon-ping://pack/peonEnvironment variables
| Variable | Default | Description |
|---|---|---|
PEON_PACKS_DIR | ~/.openpeon/packs | Sound packs directory |
PEON_VOLUME | 0.5 | Playback volume (0-1) |
Platform support
| Platform | Audio Backend |
|---|---|
| macOS | afplay or peon-play (Sound Effects device) |
| Linux | pw-play, paplay, ffplay, mpv, play, aplay (first available) |
| WSL2 | PowerShell SoundPlayer |
How it works
- Client starts → MCP server loads pack catalog from
~/.openpeon/packs/ - Client reads resources → Model gets full sound catalog via
peon-ping://catalog - Agent wants audio → Calls
play_soundwith sound keys - Server plays audio → Resolves pack/sound keys to file paths, queues playback
- Audio plays → Native audio backend plays the file asynchronously
Example agent prompt
Debugging
Check if the server is loaded
In Claude Desktop, check the MCP status icon. In Cursor, check.cursor/logs/.
Test manually
Run the MCP server directly:Verify packs are found
Check Node.js version
Architecture
The MCP server (peon-mcp.js) is a standalone Node.js script that:
- Loads config — Reads
~/.claude/hooks/peon-ping/config.jsonfor volume - Scans packs — Reads
openpeon.jsonmanifests from~/.openpeon/packs/ - Exposes resources — Serves catalog and pack details via MCP Resources
- Handles tool calls — Resolves sound keys to file paths, validates, and queues playback
- Plays audio — Spawns native audio players (afplay, pw-play, etc.) asynchronously
Limitations
- No desktop notifications — Only audio playback
- No mobile notifications — MCP server is client-side only
- No relay support — SSH/devcontainer routing not implemented
- Max 5 sounds per call — Prevents abuse
Contributing
The MCP server was contributed by @tag-assistant. To add features:- Fork PeonPing/peon-ping
- Edit
mcp/peon-mcp.js - Test with
node mcp/peon-mcp.js - Submit a PR