| name | goodrp |
| description | Detect what media the user is playing on Windows (Spotify, VLC, Chrome, etc.) via SMTC, and optionally display it on Discord via Rich Presence. Query current song/video details, set activity type (watching/listening), override media info, and manage Discord presence. |
| metadata | {"author":"GoodRP","version":"1.3.0","category":"media","tools":["get_current_media","set_presence","clear_presence","set_auto_show","get_status","get_config"]} |
GoodRP — Media Detection & Discord Rich Presence
Detect what the user is playing on their PC (music, video, etc.) and optionally show it on Discord.
When to Use This Skill
Use this skill when the user asks to:
- Query media — "What am I listening to?", "What song is this?", "What video is playing?", "What's on right now?"
- Show on Discord — "Show my music on Discord", "Put this on my Discord status"
- Hide from Discord — "Hide my Discord status", "Remove my presence"
- Change display — "Show as watching instead of listening"
- Check status — "What's my Discord status?", "Is my music showing on Discord?"
- Auto/manual mode — "Auto-show my music on Discord"
- Override details — "Change the title to something else on Discord"
- Real-time events — "Notify me when the song changes", "Watch for media changes"
- Run scripts on media change — "Run a script when music starts", "Trigger a webhook on track change"
- Anything related to detecting the user's current media or Discord Rich Presence
How It Works
GoodRP detects media playback on Windows via SMTC (Spotify, VLC, Chrome, etc.)
and exposes it as an MCP server (stdio) or HTTP API.
MCP Tools
| Tool | Description |
|---|
get_current_media | Get full details of what's playing (title, artist, album, estimated type) |
set_presence | Show media on Discord (requires type: "watching" or "listening"; optional overrides) |
clear_presence | Hide media from Discord |
set_auto_show | Enable/disable auto-show when media plays |
get_status | Check Discord connection and presence state |
get_config | Read current GoodRP configuration |
Key Rules
- When calling
set_presence, the type parameter is REQUIRED.
You must explicitly choose "watching" or "listening" — GoodRP will not auto-detect for agents.
- Content overrides (
title, artist, album, app_name) are optional.
If omitted, the detected media is used as-is.
estimated_type in get_current_media is computed from the app name:
apps containing "video", "movie", "vlc", or "mpv" → "watching", otherwise → "listening".
WebSocket (Real-Time Events)
For real-time media change notifications (instead of polling), start GoodRP with the API:
GoodRP.exe --api
Connect to ws://127.0.0.1:9876/ws. GoodRP broadcasts JSON events:
| Event | Fields |
|---|
media.changed | title, clean_title, artist, album, app_name, state, position_seconds, duration_seconds, estimated_type |
media.stopped | (none) |
playback.state | state (playing / paused / stopped) |
discord.status | status, connected |
Example (Node.js):
const ws = new WebSocket("ws://127.0.0.1:9876/ws");
ws.onmessage = (e) => {
const data = JSON.parse(e.data);
if (data.type === "media.changed") console.log("Now playing:", data.title);
};
Use this when the user wants to react to media changes in real time rather than polling get_current_media.
Scripting / Hooks
GoodRP can run custom scripts on media events. This is useful for side-effects like sending webhooks, writing status files, or triggering notifications.
Configure in %AppData%\GoodRP\config.json:
{
"OnMediaChangedScript": "C:\\scripts\\on_media.bat",
"OnMediaStoppedScript": "C:\\scripts\\on_stop.ps1",
"OnPlaybackStateChangedScript": "C:\\scripts\\on_state.py",
"ScriptTimeoutMs": 10000
}
Scripts receive metadata via environment variables: GOODRP_TITLE, GOODRP_ARTIST, GOODRP_ALBUM, GOODRP_APP, GOODRP_STATE, GOODRP_POSITION, GOODRP_DURATION, and GOODRP_EVENT (stop only).
Scripts run fire-and-forget on a background thread and are killed after ScriptTimeoutMs.
See HOOKS.md for full details and examples.
Example Interactions
What am I listening to?
User: "What am I listening to?"
Agent:
1. get_current_media() → returns title, artist, album, progress, estimated_type
2. Reports: "You're listening to Bohemian Rhapsody by Queen — 3:15 of 5:54"
What video is playing?
User: "What video is playing right now?"
Agent:
1. get_current_media() → returns title, app_name="VLC", estimated_type="watching"
2. Reports: "You're watching Big Buck Bunny in VLC — 12:30 of 30:00"
Show music on Discord
User: "Show my music on Discord"
Agent:
1. get_current_media() → verify media is playing, check estimated_type
2. set_presence(type="listening") → show on Discord
3. Confirms: "Now showing Bohemian Rhapsody on Discord"
Show as watching
User: "Show as watching instead"
Agent:
1. set_presence(type="watching")
2. Confirms: "Now showing as Watching"
Override song title
User: "Show my music but call it 'Custom Title'"
Agent:
1. set_presence(type="listening", title="Custom Title")
2. Confirms: "Now showing as Listening to Custom Title"
Hide Discord status
User: "Hide my Discord status"
Agent:
1. clear_presence()
2. Confirms: "Discord presence hidden"
Auto-show music
User: "Auto-show my music when it plays"
Agent:
1. set_auto_show(true)
2. Confirms: "Auto-show enabled. Media will appear on Discord automatically."
Check status
User: "What's my Discord status?"
Agent:
1. get_status() → returns connection, presence, media state
2. Reports connection and what's showing
Setup Requirements
- GoodRP installed — Download from https://github.com/isam-ahmed0/GoodRP/releases
- Discord Application ID — Create at https://discord.com/developers/applications
- GoodRP running — Either:
- GUI mode with auto-show enabled, OR
- Headless mode with
--mcp flag (or --mcp --api for HTTP access)
Platform Setup
GoodRP ships with a bundled MCP skill. Install it from: https://github.com/isam-ahmed0/GoodRP/tree/main/skills/goodrp
Claude Code
claude mcp add-json goodrp '{"command":"C:\\path\\to\\GoodRP.exe","args":["--mcp"]}'
Or manually add to ~/.claude.json:
{
"mcpServers": {
"goodrp": {
"command": "C:\\path\\to\\GoodRP.exe",
"args": ["--mcp"]
}
}
}
Nanobot
Add to ~/.nanobot/config.json:
{
"mcpServers": {
"goodrp": {
"command": "C:\\path\\to\\GoodRP.exe",
"args": ["--mcp"]
}
}
}
Antigravity
Add to ~/.gemini/config/mcp_config.json:
{
"mcpServers": {
"goodrp": {
"command": "C:\\path\\to\\GoodRP.exe",
"args": ["--mcp"]
}
}
}
Hermes
hermes mcp add goodrp --command "C:\\path\\to\\GoodRP.exe" --args "--mcp"
Or add to ~/.hermes/config.yaml:
mcp_servers:
goodrp:
command: "C:\\path\\to\\GoodRP.exe"
args: ["--mcp"]
OpenClaw
Add to OpenClaw's MCP servers config:
{
"mcpServers": {
"goodrp": {
"command": "C:\\path\\to\\GoodRP.exe",
"args": ["--mcp"]
}
}
}
HTTP API (Alternative)
For HTTP API access, start GoodRP with both flags:
GoodRP.exe --mcp --api
The API (REST + WebSocket) will be available at http://127.0.0.1:9876.
WebSocket events stream from ws://127.0.0.1:9876/ws.
PowerShell note: Use the call operator & to pass arguments:
& "C:\path\to\GoodRP.exe" --mcp --api
See api-docs.md for the full REST reference and HOOKS.md for scripting.